diff options
author | lado <herrlado@gmail.com> | 2017-11-03 00:25:44 +0100 |
---|---|---|
committer | lado <herrlado@gmail.com> | 2017-11-03 00:25:44 +0100 |
commit | 2692564bfe18978ceb2b5fa4e9237113ae300176 (patch) | |
tree | 77e010a23721481ee51143a7bf7393dd74d4a7d6 /vdrmanager/de.bjusystems.vdrmanager/src/main/java/com | |
parent | e044aed11d8982398fa556eacde9af1003af1c5a (diff) | |
download | vdr-manager-2692564bfe18978ceb2b5fa4e9237113ae300176.tar.gz vdr-manager-2692564bfe18978ceb2b5fa4e9237113ae300176.tar.bz2 |
curretnlado
Diffstat (limited to 'vdrmanager/de.bjusystems.vdrmanager/src/main/java/com')
4 files changed, 574 insertions, 0 deletions
diff --git a/vdrmanager/de.bjusystems.vdrmanager/src/main/java/com/rajasharan/widget/BitmapDecorator.java b/vdrmanager/de.bjusystems.vdrmanager/src/main/java/com/rajasharan/widget/BitmapDecorator.java new file mode 100644 index 0000000..4dedc32 --- /dev/null +++ b/vdrmanager/de.bjusystems.vdrmanager/src/main/java/com/rajasharan/widget/BitmapDecorator.java @@ -0,0 +1,90 @@ +package com.rajasharan.widget; + +import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.Paint; +import android.graphics.Rect; +import android.graphics.drawable.GradientDrawable; +import android.support.v7.widget.RecyclerView; +import android.view.View; + +/** + * Created by rajasharan on 9/13/15. + */ +class BitmapDecorator extends RecyclerView.ItemDecoration { + private Paint mWhitePaint; + private GradientDrawable mD; + + public BitmapDecorator(Context context) { + mWhitePaint = new Paint(Paint.ANTI_ALIAS_FLAG); + mWhitePaint.setStyle(Paint.Style.FILL); + mWhitePaint.setColor(Color.WHITE); + mD = new GradientDrawable(GradientDrawable.Orientation.BOTTOM_TOP, null); + mD.setColor(Color.argb(128, 128, 128, 128)); + mD.setGradientType(GradientDrawable.SWEEP_GRADIENT); + } + + @Override + public void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) { + transformChildren(c, parent); + } + + private void transformChildren(Canvas canvas, RecyclerView parent) { + int childCount = parent.getChildCount(); + int middlePos = (childCount - 1) / 2; + + canvas.drawARGB(255, 255, 255, 255); + + for (int i = 0; i < childCount; i++) { + if (i == middlePos) { + continue; + } + View child = parent.getChildAt(i); + if (child != null) { + Bitmap b = child.getDrawingCache(); + if (b != null) { + canvas.drawBitmap(b, child.getLeft(), child.getTop(), null); + } + } + } + + View child = parent.getChildAt(middlePos); + if (child != null) { + Rect r = new Rect(); + child.getHitRect(r); + Bitmap b = child.getDrawingCache(); + if (b != null) { + canvas.save(); + mD.setColor(Color.argb(32, 128, 128, 128)); + mD.setBounds(child.getLeft(), child.getTop() - 6, child.getRight(), child.getTop() - 4); + mD.draw(canvas); + + mD.setColor(Color.argb(64, 128, 128, 128)); + mD.setBounds(child.getLeft(), child.getTop() - 4, child.getRight(), child.getTop() - 2); + mD.draw(canvas); + + mD.setColor(Color.argb(128, 128, 128, 128)); + mD.setBounds(child.getLeft(), child.getTop() - 2, child.getRight(), child.getTop()); + mD.draw(canvas); + + canvas.scale(2.0f, 2.0f, r.centerX(), r.centerY()); + canvas.drawBitmap(b, child.getLeft(), child.getTop(), null); + + mD.setColor(Color.argb(128, 128, 128, 128)); + mD.setBounds(child.getLeft(), child.getBottom(), child.getRight(), child.getBottom() + 2); + mD.draw(canvas); + + mD.setColor(Color.argb(64, 128, 128, 128)); + mD.setBounds(child.getLeft(), child.getBottom() + 2, child.getRight(), child.getBottom() + 4); + mD.draw(canvas); + + mD.setColor(Color.argb(32, 128, 128, 128)); + mD.setBounds(child.getLeft(), child.getBottom() + 4, child.getRight(), child.getBottom() + 6); + mD.draw(canvas); + canvas.restore(); + } + } + } +} diff --git a/vdrmanager/de.bjusystems.vdrmanager/src/main/java/com/rajasharan/widget/RecyclerDropdown.java b/vdrmanager/de.bjusystems.vdrmanager/src/main/java/com/rajasharan/widget/RecyclerDropdown.java new file mode 100644 index 0000000..d515809 --- /dev/null +++ b/vdrmanager/de.bjusystems.vdrmanager/src/main/java/com/rajasharan/widget/RecyclerDropdown.java @@ -0,0 +1,172 @@ +package com.rajasharan.widget; + +import android.content.Context; +import android.support.v7.widget.LinearLayoutManager; +import android.support.v7.widget.RecyclerView; +import android.util.AttributeSet; +import android.view.Gravity; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; +import de.bjusystems.vdrmanager.R; + +import java.util.ArrayList; +import java.util.List; + +/** + * Created by rajasharan on 8/28/15. + */ +public class RecyclerDropdown extends RecyclerView { + private static final String TAG = "RecyclerDropdown"; + private static final CharSequence [] EMPTY_LIST = new CharSequence[] {Adapter.EMPTY_TEXT}; + + private CharSequence [] mList; + private CharSequence [] mOriginalList; + private Adapter mAdapter; + private OnClickListener mListener; + + public RecyclerDropdown(Context context) { + this(context, null); + } + + public RecyclerDropdown(Context context, AttributeSet attrs) { + this(context, attrs, 0); + } + + public RecyclerDropdown(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + mAdapter = new Adapter(); + } + + @Override + protected void onFinishInflate() { + super.onFinishInflate(); + setDropdownList(null); + setAdapter(mAdapter); + setLayoutManager(new LinearLayoutManager(getContext(), LinearLayoutManager.VERTICAL, false)); + //addItemDecoration(new BitmapDecorator(getContext())); + addItemDecoration(new ShadowDecorator(getContext())); + } + + public void setDropdownList(CharSequence [] list) { + if (list == null) { + mList = EMPTY_LIST; + } else { + mList = list; + } + mAdapter.init(mList); + mAdapter.notifyDataSetChanged(); + //scrollToPosition(mList.length / 2); + } + + public void filter(String str) { + if (mOriginalList == null) { + mOriginalList = mList.clone(); + } + if (str != null && str.trim().length() != 0) { + List<CharSequence> list = new ArrayList<>(); + for (CharSequence cs : mOriginalList) { + if (cs.toString().toUpperCase().contains(str.toUpperCase())) { + list.add(cs); + } + } + if (list.size() == 0) { + mList = EMPTY_LIST; + } else { + mList = list.toArray(new CharSequence[list.size()]); + } + } + else { + mList = mOriginalList; + } + setDropdownList(mList); + } + + private static class Adapter extends RecyclerView.Adapter<Holder> { + private static final int NORMAL_TYPE = 1; + private static final int EMPTY_TYPE = 2; + private static final int BUFFER_TYPE = 3; + + private static final String EMPTY_TEXT = "NO ITEMS"; + private static final String BUFFER_ITEM = "BUFFER ITEM"; + + private CharSequence [] mList; + + public void init(CharSequence [] list) { + mList = new CharSequence[list.length+4]; + mList[0] = BUFFER_ITEM; + mList[1] = BUFFER_ITEM; + System.arraycopy(list, 0, mList, 2, list.length); + mList[mList.length-1] = BUFFER_ITEM; + mList[mList.length-2] = BUFFER_ITEM; + } + @Override + public Holder onCreateViewHolder(ViewGroup viewGroup, int type) { + LayoutInflater inflater = (LayoutInflater) viewGroup.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); + View view; + switch (type) { + case NORMAL_TYPE: { + view = inflater.inflate(R.layout.recycler_itemviews, viewGroup, false); + break; + } + case EMPTY_TYPE: { + view = inflater.inflate(R.layout.recycler_itemviews, viewGroup, false); + Holder holder = new Holder(view); + holder.mTextView.setGravity(Gravity.CENTER); + view.setTag(R.id.text, EMPTY_TEXT); + return holder; + } + default /*BUFFER_TYPE*/ : { + view = inflater.inflate(R.layout.recycler_buffer_item, viewGroup, false); + Holder holder = new Holder(view); + return holder; + } + } + Holder holder = new Holder(view); + holder.mTextView.setGravity(Gravity.CENTER); + return holder; + } + @Override + public void onBindViewHolder(Holder holder, int pos) { + if (mList[pos % mList.length].toString().equals(BUFFER_ITEM)) { + return; + } + holder.mTextView.setText(mList[pos % mList.length]); + } + @Override + public int getItemCount() { + return mList.length; + } + + @Override + public int getItemViewType(int position) { + if (mList[position % mList.length].toString().equals(EMPTY_TEXT)) { + return EMPTY_TYPE; + } + if (mList[position % mList.length].toString().equals(BUFFER_ITEM)) { + return BUFFER_TYPE; + } + return NORMAL_TYPE; + } + } + + private static class Holder extends ViewHolder { + private TextView mTextView; + public Holder(View itemView) { + super(itemView); + if (itemView instanceof TextView) { + mTextView = (TextView) itemView; + } + } + } + + public void setOnClickListener(OnClickListener listener) { + mListener = listener; + } + + public OnClickListener getOnClickListener() { + return mListener; + } + +} diff --git a/vdrmanager/de.bjusystems.vdrmanager/src/main/java/com/rajasharan/widget/SearchableSpinner.java b/vdrmanager/de.bjusystems.vdrmanager/src/main/java/com/rajasharan/widget/SearchableSpinner.java new file mode 100644 index 0000000..6ce336a --- /dev/null +++ b/vdrmanager/de.bjusystems.vdrmanager/src/main/java/com/rajasharan/widget/SearchableSpinner.java @@ -0,0 +1,209 @@ +package com.rajasharan.widget; + +import android.app.AlertDialog; +import android.content.Context; +import android.content.res.TypedArray; +import android.graphics.Canvas; +import android.graphics.Color; +import android.text.Editable; +import android.text.TextWatcher; +import android.util.AttributeSet; +import android.view.LayoutInflater; +import android.view.MotionEvent; +import android.view.View; +import android.view.ViewGroup; +import android.widget.EditText; +import android.widget.TextView; +import de.bjusystems.vdrmanager.R; + +/** + * Created by rajasharan on 8/28/15. + */ +public class SearchableSpinner extends ViewGroup implements TextWatcher, View.OnClickListener { + private static final String TAG = "Searchable_Spinner"; + + private CharSequence [] mList; + private TextView mText; + private TextView mDropdownArrow; + private AlertDialog mDialog; + private RecyclerDropdown mRecycler; + private OnSelectionChangeListener mListener; + + public SearchableSpinner(Context context) { + this(context, null); + } + + public SearchableSpinner(Context context, AttributeSet attrs) { + this(context, attrs, 0); + } + + public SearchableSpinner(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + init(context, attrs); + } + + private void init(Context context, AttributeSet attrs) { + mText = new TextView(context); + mText.setTextColor(Color.BLACK); + mText.setLayoutParams(generateDefaultLayoutParams()); + + mDropdownArrow = new TextView(context); + mDropdownArrow.setText("\u25BC"); + mDropdownArrow.setLayoutParams(generateDefaultLayoutParams()); + + TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.SearchableSpinner); + setList(a.getTextArray(R.styleable.SearchableSpinner_list)); + a.recycle(); + + int [] paddingAttrs = new int[] { + android.R.attr.padding, + android.R.attr.paddingLeft, android.R.attr.paddingTop, + android.R.attr.paddingRight, android.R.attr.paddingBottom}; + + a = context.obtainStyledAttributes(attrs, paddingAttrs); + for (int i=0; i<paddingAttrs.length; i++) { + int temp = a.hasValue(i) ? setPadding(a.getDimensionPixelSize(i, -1), i) : -1; + } + } + + public void setList(CharSequence [] list) { + mList = list; + if (mList != null && mList.length > 0) { + mText.setText(mList[0]); + mDialog = createDialog(getContext()); + } + } + + private int setPadding(int p, int sideIndex) { + if (p != -1) { + switch (sideIndex) { + case 0: + mText.setPadding(p, p, p, p); + mDropdownArrow.setPadding(p, p, p, p); + break; + case 1: + mText.setPadding(p, getPaddingTop(), getPaddingRight(), getPaddingBottom()); + mDropdownArrow.setPadding(p, getPaddingTop(), getPaddingRight(), getPaddingBottom()); + break; + case 2: + mText.setPadding(getPaddingLeft(), p, getPaddingRight(), getPaddingBottom()); + mDropdownArrow.setPadding(getPaddingLeft(), p, getPaddingRight(), getPaddingBottom()); + break; + case 3: + mText.setPadding(getPaddingLeft(), getPaddingTop(), p, getPaddingBottom()); + mDropdownArrow.setPadding(getPaddingLeft(), getPaddingTop(), p, getPaddingBottom()); + break; + case 4: + mText.setPadding(getPaddingLeft(), getPaddingTop(), getPaddingRight(), p); + mDropdownArrow.setPadding(getPaddingLeft(), getPaddingTop(), getPaddingRight(), p); + break; + } + } + return -1; + } + + private AlertDialog createDialog(Context context) { + AlertDialog.Builder builder = new AlertDialog.Builder(context); + LayoutInflater inflater = LayoutInflater.from(context); + View view = inflater.inflate(R.layout.dialog_dropdown, null); + + EditText filter = (EditText) view.findViewById(R.id.filter); + filter.setHint("\uD83D\uDD0D search"); + filter.addTextChangedListener(this); + + mRecycler = (RecyclerDropdown) view.findViewById(R.id.list); + mRecycler.setOnClickListener(this); + mRecycler.setDropdownList(mList); + mRecycler.scrollToPosition(mList.length/2); + + builder.setView(view); + return builder.create(); + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + mText.measure(0, 0); + mDropdownArrow.measure(0, 0); + + int w = MeasureSpec.getSize(widthMeasureSpec); + int h = MeasureSpec.getSize(heightMeasureSpec); + + int desiredWidth = Math.min(mText.getMeasuredWidth() + mDropdownArrow.getMeasuredWidth(), w); + int desiredHeight = Math.min(mText.getMeasuredHeight(), h); + + //Log.d(TAG, String.format("onMeasure: (%s, %s)", desiredWidth, desiredHeight)); + + widthMeasureSpec = MeasureSpec.makeMeasureSpec(desiredWidth, MeasureSpec.EXACTLY); + heightMeasureSpec = MeasureSpec.makeMeasureSpec(desiredHeight, MeasureSpec.EXACTLY); + setMeasuredDimension(widthMeasureSpec, heightMeasureSpec); + } + + @Override + protected void onLayout(boolean changed, int l, int t, int r, int b) { + mText.layout(l, t, l + mText.getMeasuredWidth(), b); + mDropdownArrow.layout(l + mText.getMeasuredWidth(), t, r, b); + } + + @Override + protected void dispatchDraw(Canvas canvas) { + mText.draw(canvas); + int save = canvas.save(); + canvas.translate(mText.getWidth(), 0); + mDropdownArrow.draw(canvas); + canvas.restoreToCount(save); + } + + @Override + public boolean onTouchEvent(MotionEvent event) { + switch (event.getActionMasked()) { + case MotionEvent.ACTION_UP: + if (mDialog != null && !mDialog.isShowing()) { + mDialog.show(); + } + } + return true; + } + + private void updateSelection(CharSequence str) { + mText.setText(str); + requestLayout(); + invalidate(); + if (mListener != null) { + mListener.onSelectionChanged(str.toString()); + } + } + + public String getSelectedItem() { + if (mText != null) { + return mText.getText().toString(); + } + return null; + } + + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + mRecycler.filter(s.toString()); + } + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + } + @Override + public void afterTextChanged(Editable s) { + } + + @Override + public void onClick(View v) { + if (mDialog.isShowing()) { + mDialog.dismiss(); + } + updateSelection(((TextView)v).getText()); + } + + public void setOnSelectionChangeListener(OnSelectionChangeListener listener) { + mListener = listener; + } + + public interface OnSelectionChangeListener { + public void onSelectionChanged(String selection); + } +} diff --git a/vdrmanager/de.bjusystems.vdrmanager/src/main/java/com/rajasharan/widget/ShadowDecorator.java b/vdrmanager/de.bjusystems.vdrmanager/src/main/java/com/rajasharan/widget/ShadowDecorator.java new file mode 100644 index 0000000..11abedc --- /dev/null +++ b/vdrmanager/de.bjusystems.vdrmanager/src/main/java/com/rajasharan/widget/ShadowDecorator.java @@ -0,0 +1,103 @@ +package com.rajasharan.widget; + +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.Paint; +import android.support.v7.widget.RecyclerView; +import android.view.View; +import de.bjusystems.vdrmanager.R; + +/** + * Created by rajasharan on 9/13/15. + */ +public class ShadowDecorator extends RecyclerView.ItemDecoration { + private static final String TAG = "ShadowDecorator"; + private static final int SHADOW_INSET = 2; + + private Context mContext; + private Paint mCoreShadow; + private Paint mOvertone; + private Paint mHighlight; + private int mHeight; + private int mInset; + + public ShadowDecorator(Context context) { + mContext = context; + + mCoreShadow = new Paint(Paint.ANTI_ALIAS_FLAG); + mCoreShadow.setColor(Color.argb(128, 128, 128, 128)); + mCoreShadow.setStyle(Paint.Style.FILL); + + mOvertone = new Paint(Paint.ANTI_ALIAS_FLAG); + mOvertone.setColor(Color.argb(64, 128, 128, 128)); + mOvertone.setStyle(Paint.Style.FILL); + + mHighlight = new Paint(Paint.ANTI_ALIAS_FLAG); + mHighlight.setColor(Color.argb(32, 128, 128, 128)); + mHighlight.setStyle(Paint.Style.FILL); + + mHeight = (int) (mContext.getResources().getDimension(R.dimen.item_height)); + mInset = (int) mContext.getResources().getDimension(R.dimen.item_inset); + } + + @Override + public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) { + int count = parent.getChildCount(); + int middlePos = (count - 1)/2; + + int t = 2 * mHeight - mInset; + int b = 3 * mHeight + mInset; + + /* TOP SHADOW */ + c.drawRect(parent.getLeft(), t, parent.getRight(), t + SHADOW_INSET, mHighlight); + c.drawRect(parent.getLeft(), t + SHADOW_INSET, parent.getRight(), t + 2 * SHADOW_INSET, mOvertone); + c.drawRect(parent.getLeft(), t + 2 * SHADOW_INSET, parent.getRight(), t + 3 * SHADOW_INSET, mCoreShadow); + + /* BOTTOM SHADOW */ + c.drawRect(parent.getLeft(), b - 3 * SHADOW_INSET, parent.getRight(), b - 2 * SHADOW_INSET, mCoreShadow); + c.drawRect(parent.getLeft(), b - 2 * SHADOW_INSET, parent.getRight(), b - SHADOW_INSET, mOvertone); + c.drawRect(parent.getLeft(), b - SHADOW_INSET, parent.getRight(), b, mHighlight); + + for (int i=0; i<count; i++) { + View child = parent.getChildAt(i); + child.setScaleX(1.0f); + child.setScaleY(1.0f); + child.setRotationX(0); + child.setAlpha(1.0f); + child.setOnClickListener(null); + } + + for (int i=middlePos-1, j=1; i>=0; i--,j++) { + View child = parent.getChildAt(i); + if (child != null) { + child.setRotationX(25 * j); + child.setAlpha(1.0f/(count - i)); + } + } + + { + View child = parent.getChildAt(middlePos); + if (child != null) { + child.setAlpha(0.5f); + int childMidPoint = (child.getTop() + child.getBottom())/2; + if (childMidPoint >= t && childMidPoint <= b) { + if (child.getTag(R.id.text) == null) { + child.setScaleX(2.2f); + child.setScaleY(2.2f); + child.setOnClickListener(((RecyclerDropdown) parent).getOnClickListener()); + child.setAlpha(1.0f); + } + } + } + } + + for (int i=middlePos+1, j=1; i<count; i++,j++) { + View child = parent.getChildAt(i); + if (child != null) { + child.setRotationX(-25 * j); + child.setAlpha(1.0f / i); + } + } + } +} |