summaryrefslogtreecommitdiff
path: root/vdrmanager/de.bjusystems.vdrmanager/src/main/java/com
diff options
context:
space:
mode:
authorlado <herrlado@gmail.com>2017-11-03 00:25:44 +0100
committerlado <herrlado@gmail.com>2017-11-03 00:25:44 +0100
commit2692564bfe18978ceb2b5fa4e9237113ae300176 (patch)
tree77e010a23721481ee51143a7bf7393dd74d4a7d6 /vdrmanager/de.bjusystems.vdrmanager/src/main/java/com
parente044aed11d8982398fa556eacde9af1003af1c5a (diff)
downloadvdr-manager-2692564bfe18978ceb2b5fa4e9237113ae300176.tar.gz
vdr-manager-2692564bfe18978ceb2b5fa4e9237113ae300176.tar.bz2
curretnlado
Diffstat (limited to 'vdrmanager/de.bjusystems.vdrmanager/src/main/java/com')
-rw-r--r--vdrmanager/de.bjusystems.vdrmanager/src/main/java/com/rajasharan/widget/BitmapDecorator.java90
-rw-r--r--vdrmanager/de.bjusystems.vdrmanager/src/main/java/com/rajasharan/widget/RecyclerDropdown.java172
-rw-r--r--vdrmanager/de.bjusystems.vdrmanager/src/main/java/com/rajasharan/widget/SearchableSpinner.java209
-rw-r--r--vdrmanager/de.bjusystems.vdrmanager/src/main/java/com/rajasharan/widget/ShadowDecorator.java103
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);
+ }
+ }
+ }
+}