Search in sources :

Example 66 with InputFilter

use of android.text.InputFilter in project samourai-wallet-android by Samourai-Wallet.

the class SendActivity method doCustomFee.

private void doCustomFee() {
    double sanitySat = FeeUtil.getInstance().getHighFee().getDefaultPerKB().doubleValue() / 1000.0;
    final double sanityValue = sanitySat * 1.5;
    final EditText etCustomFee = new EditText(SendActivity.this);
    // String val  = null;
    double d = FeeUtil.getInstance().getSuggestedFee().getDefaultPerKB().doubleValue() / 1000.0;
    NumberFormat decFormat = NumberFormat.getInstance(Locale.US);
    decFormat.setMaximumFractionDigits(3);
    decFormat.setMinimumFractionDigits(0);
    /*
        if((d - (int)d) != 0.0)    {
            val = Double.toString(d);
        }
        else    {
            val = Integer.toString((int)d);
        }
        */
    etCustomFee.setText(decFormat.format(d));
    InputFilter filter = new InputFilter() {

        String strCharset = "0123456789nollNOLL.";

        public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
            for (int i = start; i < end; i++) {
                if (strCharset.indexOf(source.charAt(i)) == -1) {
                    return "";
                }
            }
            return null;
        }
    };
    etCustomFee.setFilters(new InputFilter[] { filter });
    AlertDialog.Builder dlg = new AlertDialog.Builder(SendActivity.this).setTitle(R.string.app_name).setMessage(R.string.set_sat).setView(etCustomFee).setCancelable(false).setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {

        public void onClick(DialogInterface dialog, int whichButton) {
            String strCustomFee = etCustomFee.getText().toString();
            double customValue = 0.0;
            if (strCustomFee.equalsIgnoreCase("noll") && PrefsUtil.getInstance(SendActivity.this).getValue(PrefsUtil.USE_TRUSTED_NODE, false) == true) {
                customValue = 0.0;
            } else {
                try {
                    customValue = Double.valueOf(strCustomFee);
                } catch (Exception e) {
                    Toast.makeText(SendActivity.this, R.string.custom_fee_too_low, Toast.LENGTH_SHORT).show();
                    return;
                }
            }
            if (customValue < 1.0 && !strCustomFee.equalsIgnoreCase("noll")) {
                Toast.makeText(SendActivity.this, R.string.custom_fee_too_low, Toast.LENGTH_SHORT).show();
            } else if (customValue > sanityValue) {
                Toast.makeText(SendActivity.this, R.string.custom_fee_too_high, Toast.LENGTH_SHORT).show();
            } else {
                SuggestedFee suggestedFee = new SuggestedFee();
                suggestedFee.setStressed(false);
                suggestedFee.setOK(true);
                suggestedFee.setDefaultPerKB(BigInteger.valueOf((long) (customValue * 1000.0)));
                Log.d("SendActivity", "custom fee:" + BigInteger.valueOf((long) (customValue * 1000.0)));
                FeeUtil.getInstance().setSuggestedFee(suggestedFee);
                btLowFee.setBackgroundColor(SendActivity.this.getResources().getColor(R.color.darkgrey));
                btAutoFee.setBackgroundColor(SendActivity.this.getResources().getColor(R.color.darkgrey));
                btPriorityFee.setBackgroundColor(SendActivity.this.getResources().getColor(R.color.darkgrey));
                btCustomFee.setBackgroundColor(SendActivity.this.getResources().getColor(R.color.blue));
                btCustomFee.setText((FeeUtil.getInstance().getSuggestedFee().getDefaultPerKB().doubleValue() / 1000.0) + "\n" + getString(R.string.sat_b));
                btCustomFee.setTypeface(null, Typeface.BOLD);
                btLowFee.setTypeface(null, Typeface.NORMAL);
                btAutoFee.setTypeface(null, Typeface.NORMAL);
                btPriorityFee.setTypeface(null, Typeface.NORMAL);
                long lowFee = FeeUtil.getInstance().getLowFee().getDefaultPerKB().longValue() / 1000L;
                long normalFee = FeeUtil.getInstance().getNormalFee().getDefaultPerKB().longValue() / 1000L;
                long highFee = FeeUtil.getInstance().getHighFee().getDefaultPerKB().longValue() / 1000L;
                double pct = 0.0;
                int nbBlocks = 6;
                if (customValue == 0.0) {
                    customValue = 1.0;
                }
                if (customValue <= (double) lowFee) {
                    pct = ((double) lowFee / customValue);
                    nbBlocks = ((Double) Math.ceil(pct * 24.0)).intValue();
                } else if (customValue >= (double) highFee) {
                    pct = ((double) highFee / customValue);
                    nbBlocks = ((Double) Math.ceil(pct * 2.0)).intValue();
                    if (nbBlocks < 1) {
                        nbBlocks = 1;
                    }
                } else {
                    pct = ((double) normalFee / customValue);
                    nbBlocks = ((Double) Math.ceil(pct * 6.0)).intValue();
                }
                tvFeePrompt.setText(getText(R.string.fee_custom_priority) + " " + nbBlocks + " " + getText(R.string.blocks_to_cf));
            }
            dialog.dismiss();
        }
    }).setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {

        public void onClick(DialogInterface dialog, int whichButton) {
            dialog.dismiss();
        }
    });
    if (!isFinishing()) {
        dlg.show();
    }
}
Also used : EditText(android.widget.EditText) AlertDialog(android.app.AlertDialog) InputFilter(android.text.InputFilter) DialogInterface(android.content.DialogInterface) SuggestedFee(com.samourai.wallet.send.SuggestedFee) Spanned(android.text.Spanned) MyTransactionOutPoint(com.samourai.wallet.send.MyTransactionOutPoint) Point(android.graphics.Point) JSONException(org.json.JSONException) IOException(java.io.IOException) WriterException(com.google.zxing.WriterException) ParseException(java.text.ParseException) DecoderException(org.bouncycastle.util.encoders.DecoderException) FileNotFoundException(java.io.FileNotFoundException) MnemonicException(org.bitcoinj.crypto.MnemonicException) NumberFormat(java.text.NumberFormat)

Example 67 with InputFilter

use of android.text.InputFilter in project android_packages_apps_Settings by LineageOS.

the class BluetoothPairingDialog method createView.

private View createView() {
    View view = getLayoutInflater().inflate(R.layout.bluetooth_pin_entry, null);
    String name = mLocalManager.getCachedDeviceManager().getName(mDevice);
    TextView messageView = (TextView) view.findViewById(R.id.message);
    mPairingView = (EditText) view.findViewById(R.id.text);
    mPairingView.addTextChangedListener(this);
    if (mType == BluetoothDevice.PAIRING_VARIANT_PIN) {
        messageView.setText(getString(R.string.bluetooth_enter_pin_msg, name));
        // Maximum of 16 characters in a PIN adb sync
        mPairingView.setFilters(new InputFilter[] { new LengthFilter(BLUETOOTH_PIN_MAX_LENGTH) });
    } else if (mType == BluetoothDevice.PAIRING_VARIANT_PASSKEY) {
        messageView.setText(getString(R.string.bluetooth_enter_passkey_msg, name));
        // Maximum of 6 digits for passkey
        mPairingView.setInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_SIGNED);
        mPairingView.setFilters(new InputFilter[] { new LengthFilter(BLUETOOTH_PASSKEY_MAX_LENGTH) });
    } else if (mType == BluetoothDevice.PAIRING_VARIANT_PASSKEY_CONFIRMATION) {
        mPairingView.setVisibility(View.GONE);
        messageView.setText(getString(R.string.bluetooth_confirm_passkey_msg, name, mPasskey));
    } else if (mType == BluetoothDevice.PAIRING_VARIANT_CONSENT) {
        mPairingView.setVisibility(View.GONE);
        messageView.setText(getString(R.string.bluetooth_incoming_pairing_msg, name));
    } else if (mType == BluetoothDevice.PAIRING_VARIANT_DISPLAY_PASSKEY) {
        mPairingView.setVisibility(View.GONE);
        messageView.setText(getString(R.string.bluetooth_display_passkey_msg, name, mPasskey));
    } else {
        Log.e(TAG, "Incorrect pairing type received, not creating view");
    }
    return view;
}
Also used : InputFilter(android.text.InputFilter) LengthFilter(android.text.InputFilter.LengthFilter) TextView(android.widget.TextView) TextView(android.widget.TextView) View(android.view.View)

Example 68 with InputFilter

use of android.text.InputFilter in project Signal-Android by WhisperSystems.

the class SearchView method appendEmojiFilter.

private InputFilter[] appendEmojiFilter(@NonNull TextView view) {
    InputFilter[] originalFilters = view.getFilters();
    InputFilter[] result;
    if (originalFilters != null) {
        result = new InputFilter[originalFilters.length + 1];
        System.arraycopy(originalFilters, 0, result, 1, originalFilters.length);
    } else {
        result = new InputFilter[1];
    }
    result[0] = new EmojiFilter(view, false);
    return result;
}
Also used : EmojiFilter(org.thoughtcrime.securesms.components.emoji.EmojiFilter) InputFilter(android.text.InputFilter)

Example 69 with InputFilter

use of android.text.InputFilter in project Reader by TheKeeperOfPie.

the class FragmentThreadList method onCreateView.

@SuppressWarnings("ResourceType")
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    initialize();
    view = bind(inflater.inflate(R.layout.fragment_thread_list, container, false));
    setUpToolbar();
    buttonExpandActions.setOnClickListener(v -> toggleLayoutActions());
    behaviorButtonExpandActions = new ScrollAwareFloatingActionButtonBehavior(getActivity(), null, new ScrollAwareFloatingActionButtonBehavior.OnVisibilityChangeListener() {

        @Override
        public void onStartHideFromScroll() {
            hideLayoutActions(0);
        }

        @Override
        public void onEndHideFromScroll() {
            buttonExpandActions.setImageResource(R.drawable.ic_unfold_more_white_24dp);
            buttonExpandActions.setColorFilter(themer.getColorFilterAccent());
        }
    });
    ((CoordinatorLayout.LayoutParams) buttonExpandActions.getLayoutParams()).setBehavior(behaviorButtonExpandActions);
    buttonJumpTop.setOnClickListener(v -> scrollToPositionWithOffset(0, 0));
    buttonJumpTop.setOnLongClickListener(v -> {
        Toast.makeText(getActivity(), getString(R.string.content_description_button_jump_top), Toast.LENGTH_SHORT).show();
        return false;
    });
    buttonClearViewed.setOnClickListener(v -> controllerLinks.clearViewed(historian));
    buttonClearViewed.setOnLongClickListener(v -> {
        Toast.makeText(getActivity(), getString(R.string.content_description_button_clear_viewed), Toast.LENGTH_SHORT).show();
        return false;
    });
    // Margin is included within shadow margin on pre-Lollipop, so remove all regular margin
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
        ((CoordinatorLayout.LayoutParams) buttonExpandActions.getLayoutParams()).setMargins(0, 0, 0, 0);
        int margin = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 8, getResources().getDisplayMetrics());
        LinearLayout.LayoutParams layoutParamsJumpTop = (LinearLayout.LayoutParams) buttonJumpTop.getLayoutParams();
        layoutParamsJumpTop.setMargins(0, 0, 0, 0);
        buttonJumpTop.setLayoutParams(layoutParamsJumpTop);
        LinearLayout.LayoutParams layoutParamsClearViewed = (LinearLayout.LayoutParams) buttonClearViewed.getLayoutParams();
        layoutParamsClearViewed.setMargins(0, 0, 0, 0);
        buttonClearViewed.setLayoutParams(layoutParamsClearViewed);
        RelativeLayout.LayoutParams layoutParamsActions = (RelativeLayout.LayoutParams) layoutActions.getLayoutParams();
        layoutParamsActions.setMarginStart(margin);
        layoutParamsActions.setMarginEnd(margin);
        layoutActions.setLayoutParams(layoutParamsActions);
    }
    buttonExpandActions.setColorFilter(themer.getColorFilterAccent());
    buttonJumpTop.setColorFilter(themer.getColorFilterAccent());
    buttonClearViewed.setColorFilter(themer.getColorFilterAccent());
    swipeRefreshThreadList.setOnRefreshListener(() -> {
        controllerLinks.reload();
    });
    AdapterListener adapterListener = new AdapterListener() {

        @Override
        public void requestMore() {
            controllerLinks.loadMore();
        }

        @Override
        public void scrollAndCenter(int position, int height) {
            UtilsAnimation.scrollToPositionWithCentering(position, recyclerThreadList, height, 0, 0, false);
        }

        @Override
        public void hideToolbar() {
            AppBarLayout.Behavior behaviorAppBar = (AppBarLayout.Behavior) ((CoordinatorLayout.LayoutParams) layoutAppBar.getLayoutParams()).getBehavior();
            behaviorAppBar.onNestedFling(layoutCoordinator, layoutAppBar, null, 0, 1000, true);
        }

        @Override
        public void clearDecoration() {
            behaviorButtonExpandActions.animateOut(buttonExpandActions);
            AppBarLayout.Behavior behaviorAppBar = (AppBarLayout.Behavior) ((CoordinatorLayout.LayoutParams) layoutAppBar.getLayoutParams()).getBehavior();
            behaviorAppBar.onNestedFling(layoutCoordinator, layoutAppBar, null, 0, 1000, true);
        }

        @Override
        public void requestDisallowInterceptTouchEventVertical(boolean disallow) {
            recyclerThreadList.requestDisallowInterceptTouchEvent(disallow);
            swipeRefreshThreadList.requestDisallowInterceptTouchEvent(disallow);
            itemTouchHelper.select(null, CustomItemTouchHelper.ACTION_STATE_IDLE);
        }

        @Override
        public void requestDisallowInterceptTouchEventHorizontal(boolean disallow) {
            itemTouchHelper.setDisallow(disallow);
        }
    };
    AdapterLink.ViewHolderLink.Listener listener = new LinksListenerBase(mListener.getEventListenerBase()) {

        @Override
        public void onVote(Link link, AdapterLink.ViewHolderLink viewHolderLink, Likes vote) {
            mListener.getEventListenerBase().onVote(link, vote).subscribe(new ObserverEmpty<Link>() {

                @Override
                public void onError(Throwable e) {
                    controllerLinks.getEventHolder().getErrors().call(LinksError.VOTE);
                }

                @Override
                public void onNext(Link link) {
                    controllerLinks.update(link);
                }
            });
        }

        @Override
        public void onDelete(Link link) {
            new AlertDialog.Builder(getContext()).setTitle(R.string.delete_post).setMessage(link.getTitle()).setPositiveButton(R.string.yes, (dialog, which) -> {
                mListener.getEventListenerBase().onDelete(link).subscribe(new ObserverEmpty<Link>() {

                    @Override
                    public void onError(Throwable e) {
                        controllerLinks.getEventHolder().getErrors().call(LinksError.DELETE);
                    }

                    @Override
                    public void onNext(Link link) {
                        controllerLinks.remove(link);
                    }
                });
            }).setNegativeButton(R.string.no, null).show();
        }

        @Override
        public void onReport(Link link) {
            // TODO: Add link title
            new AlertDialog.Builder(getContext()).setTitle(R.string.report_title).setSingleChoiceItems(Report.getDisplayReasons(getResources()), -1, (dialog, which) -> {
                reportSelected = Report.values()[which];
            }).setPositiveButton(R.string.ok, (dialog, which) -> {
                if (reportSelected == Report.OTHER) {
                    View viewDialog = LayoutInflater.from(getContext()).inflate(R.layout.dialog_text_input, null, false);
                    final EditText editText = (EditText) viewDialog.findViewById(R.id.edit_text);
                    editText.setFilters(new InputFilter[] { new InputFilter.LengthFilter(100) });
                    new AlertDialog.Builder(getContext()).setView(viewDialog).setTitle(R.string.item_report).setPositiveButton(R.string.ok, (dialog1, which1) -> {
                        mListener.getEventListenerBase().onReport(link, editText.getText().toString()).subscribe(new ObserverError<String>() {

                            @Override
                            public void onError(Throwable e) {
                                controllerLinks.getEventHolder().getErrors().call(LinksError.REPORT);
                            }
                        });
                    }).setNegativeButton(R.string.cancel, (dialog1, which1) -> {
                        dialog1.dismiss();
                    }).show();
                } else if (reportSelected != null) {
                    mListener.getEventListenerBase().onReport(link, reportSelected.getReason()).subscribe(new ObserverError<String>() {

                        @Override
                        public void onError(Throwable e) {
                            controllerLinks.getEventHolder().getErrors().call(LinksError.REPORT);
                        }
                    });
                }
            }).setNegativeButton(R.string.cancel, null).show();
        }

        @Override
        public void onSave(Link link) {
            if (link.isSaved()) {
                mListener.getEventListenerBase().onUnsave(link).subscribe(new ObserverEmpty<Link>() {

                    @Override
                    public void onError(Throwable e) {
                        controllerLinks.getEventHolder().getErrors().call(LinksError.UNSAVE);
                    }

                    @Override
                    public void onNext(Link link) {
                        controllerLinks.update(link);
                    }
                });
            } else {
                mListener.getEventListenerBase().onSave(link).subscribe(new ObserverEmpty<Link>() {

                    @Override
                    public void onError(Throwable e) {
                        controllerLinks.getEventHolder().getErrors().call(LinksError.SAVE);
                    }

                    @Override
                    public void onNext(Link link) {
                        controllerLinks.update(link);
                    }
                });
            }
        }

        @Override
        public void onMarkNsfw(Link link) {
            if (link.isOver18()) {
                mListener.getEventListenerBase().onUnmarkNsfw(link).subscribe(new ObserverEmpty<Link>() {

                    @Override
                    public void onError(Throwable e) {
                        controllerLinks.getEventHolder().getErrors().call(LinksError.UNMARK_NSFW);
                    }

                    @Override
                    public void onNext(Link link) {
                        controllerLinks.update(link);
                    }
                });
            } else {
                mListener.getEventListenerBase().onMarkNsfw(link).subscribe(new ObserverEmpty<Link>() {

                    @Override
                    public void onError(Throwable e) {
                        controllerLinks.getEventHolder().getErrors().call(LinksError.MARK_NSFW);
                    }

                    @Override
                    public void onNext(Link link) {
                        controllerLinks.update(link);
                    }
                });
            }
        }
    };
    adapterLinkList = new AdapterLinkList(getActivity(), adapterListener, eventListenerHeader, listener);
    adapterLinkGrid = new AdapterLinkGrid(getActivity(), adapterListener, eventListenerHeader, listener);
    adapterLink = AppSettings.MODE_GRID.equals(preferences.getString(AppSettings.INTERFACE_MODE, AppSettings.MODE_GRID)) ? adapterLinkGrid : adapterLinkList;
    itemDecorationDivider = new ItemDecorationDivider(getActivity(), ItemDecorationDivider.VERTICAL_LIST);
    // recyclerThreadList.setItemAnimator(null);
    resetAdapter(adapterLink);
    recyclerThreadList.addOnScrollListener(new RecyclerView.OnScrollListener() {

        @Override
        public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
            super.onScrollStateChanged(recyclerView, newState);
            switch(newState) {
                case RecyclerView.SCROLL_STATE_IDLE:
                case RecyclerView.SCROLL_STATE_DRAGGING:
                    picasso.resumeTag(AdapterLink.TAG_PICASSO);
                    break;
                case RecyclerView.SCROLL_STATE_SETTLING:
                    picasso.pauseTag(AdapterLink.TAG_PICASSO);
                    break;
            }
        }
    });
    itemTouchHelper = new CustomItemTouchHelper(new CustomItemTouchHelper.SimpleCallback(getActivity(), R.drawable.ic_visibility_off_white_24dp, ItemTouchHelper.START | ItemTouchHelper.END, ItemTouchHelper.START | ItemTouchHelper.END) {

        @Override
        public float getSwipeThreshold(RecyclerView.ViewHolder viewHolder) {
            if (layoutManager instanceof StaggeredGridLayoutManager) {
                return 1f / ((StaggeredGridLayoutManager) layoutManager).getSpanCount();
            }
            return 0.5f;
        }

        @Override
        public int getSwipeDirs(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
            if (viewHolder.getAdapterPosition() == 0) {
                return 0;
            }
            ViewGroup.LayoutParams layoutParams = viewHolder.itemView.getLayoutParams();
            if (layoutParams instanceof StaggeredGridLayoutManager.LayoutParams && !((StaggeredGridLayoutManager.LayoutParams) layoutParams).isFullSpan()) {
                int spanCount = layoutManager instanceof StaggeredGridLayoutManager ? ((StaggeredGridLayoutManager) layoutManager).getSpanCount() : 2;
                int spanIndex = ((StaggeredGridLayoutManager.LayoutParams) layoutParams).getSpanIndex() % spanCount;
                if (spanIndex == 0) {
                    return ItemTouchHelper.END;
                } else if (spanIndex == spanCount - 1) {
                    return ItemTouchHelper.START;
                }
            }
            return super.getSwipeDirs(recyclerView, viewHolder);
        }

        @Override
        public boolean isLongPressDragEnabled() {
            return false;
        }

        @Override
        public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
            return false;
        }

        @Override
        public void onSwiped(final RecyclerView.ViewHolder viewHolder, int direction) {
            // Offset by 1 due to subreddit header
            Link link = controllerLinks.hideLink(viewHolder.getAdapterPosition());
            mListener.getEventListenerBase().hide(link);
            if (snackbar != null) {
                snackbar.dismiss();
            }
            SpannableString text = new SpannableString(link.isHidden() ? getString(R.string.link_hidden) : getString(R.string.link_shown));
            text.setSpan(new ForegroundColorSpan(themer.getColorFilterPrimary().getColor()), 0, text.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
            // noinspection ResourceType
            snackbar = Snackbar.make(recyclerThreadList, text, UtilsAnimation.SNACKBAR_DURATION).setActionTextColor(themer.getColorFilterPrimary().getColor()).setAction(R.string.undo, v -> {
                mListener.getEventListenerBase().hide(link);
                controllerLinks.reshowLastHiddenLink();
            });
            snackbar.getView().setBackgroundColor(themer.getColorPrimary());
            snackbar.show();
        }
    });
    itemTouchHelper.attachToRecyclerView(recyclerThreadList);
    recyclerThreadList.addOnItemTouchListener(new RecyclerView.OnItemTouchListener() {

        @Override
        public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
            // rv.getChildViewHolder(rv.findChildViewUnder(e.getX(), e.getY()));
            return false;
        }

        @Override
        public void onTouchEvent(RecyclerView rv, MotionEvent e) {
        }

        @Override
        public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {
        }
    });
    if (layoutManager instanceof LinearLayoutManager) {
        recyclerThreadList.setPadding(0, 0, 0, 0);
    } else {
        int padding = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 2, getResources().getDisplayMetrics());
        recyclerThreadList.setPadding(padding, 0, padding, 0);
    }
    textSidebar.setMovementMethod(LinkMovementMethod.getInstance());
    buttonSubscribe.setOnClickListener(v -> controllerLinks.subscribe());
    return view;
}
Also used : AlertDialog(android.support.v7.app.AlertDialog) LinearLayout(android.widget.LinearLayout) Bundle(android.os.Bundle) ObserverEmpty(com.winsonchiu.reader.rx.ObserverEmpty) Historian(com.winsonchiu.reader.history.Historian) ViewPropertyAnimatorListener(android.support.v4.view.ViewPropertyAnimatorListener) AndroidSchedulers(rx.android.schedulers.AndroidSchedulers) LinkMovementMethod(android.text.method.LinkMovementMethod) UtilsAnimation(com.winsonchiu.reader.utils.UtilsAnimation) BindView(butterknife.BindView) Picasso(com.squareup.picasso.Picasso) Reddit(com.winsonchiu.reader.data.reddit.Reddit) Likes(com.winsonchiu.reader.data.reddit.Likes) ItemTouchHelper(android.support.v7.widget.helper.ItemTouchHelper) View(android.view.View) Button(android.widget.Button) ViewCompat(android.support.v4.view.ViewCompat) ForegroundColorSpan(android.text.style.ForegroundColorSpan) Log(android.util.Log) StaggeredGridLayoutManager(android.support.v7.widget.StaggeredGridLayoutManager) ActionLog(com.winsonchiu.reader.rx.ActionLog) FloatingActionButton(android.support.design.widget.FloatingActionButton) CustomItemTouchHelper(com.winsonchiu.reader.utils.CustomItemTouchHelper) UtilsReddit(com.winsonchiu.reader.utils.UtilsReddit) ViewGroup(android.view.ViewGroup) R(com.winsonchiu.reader.R) UtilsColor(com.winsonchiu.reader.utils.UtilsColor) FragmentBase(com.winsonchiu.reader.FragmentBase) FragmentNewPost(com.winsonchiu.reader.FragmentNewPost) TextView(android.widget.TextView) RelativeLayout(android.widget.RelativeLayout) Time(com.winsonchiu.reader.data.reddit.Time) Nullable(android.support.annotation.Nullable) Snackbar(android.support.design.widget.Snackbar) InputFilter(android.text.InputFilter) User(com.winsonchiu.reader.data.reddit.User) Subscription(rx.Subscription) ObserverError(com.winsonchiu.reader.rx.ObserverError) Report(com.winsonchiu.reader.data.reddit.Report) AppBarLayout(android.support.design.widget.AppBarLayout) CoordinatorLayout(android.support.design.widget.CoordinatorLayout) Spanned(android.text.Spanned) FastOutSlowInInterpolator(android.support.v4.view.animation.FastOutSlowInInterpolator) Subreddit(com.winsonchiu.reader.data.reddit.Subreddit) UtilsRx(com.winsonchiu.reader.utils.UtilsRx) AdapterListener(com.winsonchiu.reader.adapter.AdapterListener) AppSettings(com.winsonchiu.reader.AppSettings) MenuItem(android.view.MenuItem) GravityCompat(android.support.v4.view.GravityCompat) Inject(javax.inject.Inject) MotionEvent(android.view.MotionEvent) Toast(android.widget.Toast) Menu(android.view.Menu) Link(com.winsonchiu.reader.data.reddit.Link) ScrollAwareFloatingActionButtonBehavior(com.winsonchiu.reader.utils.ScrollAwareFloatingActionButtonBehavior) Build(android.os.Build) DrawerLayout(android.support.v4.widget.DrawerLayout) SwipeRefreshLayout(android.support.v4.widget.SwipeRefreshLayout) SpannableString(android.text.SpannableString) LayoutInflater(android.view.LayoutInflater) ControllerUser(com.winsonchiu.reader.ControllerUser) Sort(com.winsonchiu.reader.data.reddit.Sort) ItemDecorationDivider(com.winsonchiu.reader.utils.ItemDecorationDivider) LinearLayoutManager(android.support.v7.widget.LinearLayoutManager) TextUtils(android.text.TextUtils) Thing(com.winsonchiu.reader.data.reddit.Thing) FragmentSearch(com.winsonchiu.reader.search.FragmentSearch) RecyclerView(android.support.v7.widget.RecyclerView) AlertDialog(android.support.v7.app.AlertDialog) SharedPreferences(android.content.SharedPreferences) TypedValue(android.util.TypedValue) Toolbar(android.support.v7.widget.Toolbar) ActivityMain(com.winsonchiu.reader.ActivityMain) FragmentListenerBase(com.winsonchiu.reader.FragmentListenerBase) Activity(android.app.Activity) UtilsTheme(com.winsonchiu.reader.utils.UtilsTheme) EditText(android.widget.EditText) ItemDecorationDivider(com.winsonchiu.reader.utils.ItemDecorationDivider) StaggeredGridLayoutManager(android.support.v7.widget.StaggeredGridLayoutManager) SpannableString(android.text.SpannableString) LinearLayoutManager(android.support.v7.widget.LinearLayoutManager) ScrollAwareFloatingActionButtonBehavior(com.winsonchiu.reader.utils.ScrollAwareFloatingActionButtonBehavior) AppBarLayout(android.support.design.widget.AppBarLayout) ScrollAwareFloatingActionButtonBehavior(com.winsonchiu.reader.utils.ScrollAwareFloatingActionButtonBehavior) EditText(android.widget.EditText) InputFilter(android.text.InputFilter) ForegroundColorSpan(android.text.style.ForegroundColorSpan) SpannableString(android.text.SpannableString) RelativeLayout(android.widget.RelativeLayout) Link(com.winsonchiu.reader.data.reddit.Link) CustomItemTouchHelper(com.winsonchiu.reader.utils.CustomItemTouchHelper) AdapterListener(com.winsonchiu.reader.adapter.AdapterListener) ViewGroup(android.view.ViewGroup) BindView(butterknife.BindView) View(android.view.View) TextView(android.widget.TextView) RecyclerView(android.support.v7.widget.RecyclerView) MotionEvent(android.view.MotionEvent) CoordinatorLayout(android.support.design.widget.CoordinatorLayout) ObserverError(com.winsonchiu.reader.rx.ObserverError) RecyclerView(android.support.v7.widget.RecyclerView) Likes(com.winsonchiu.reader.data.reddit.Likes) LinearLayout(android.widget.LinearLayout)

Example 70 with InputFilter

use of android.text.InputFilter in project Reader by TheKeeperOfPie.

the class FragmentCommentsInner method onCreateView.

@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    scrollToPaddingTop = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 8, getResources().getDisplayMetrics());
    scrollToPaddingBottom = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 56, getResources().getDisplayMetrics());
    layoutRoot = (CustomFrameLayout) inflater.inflate(R.layout.fragment_comments_inner, container, false);
    CallbackYouTubeDestruction callbackYouTubeDestruction = () -> {
        adapterCommentList.destroyYouTubePlayerFragments();
        adapterLink.destroyYouTubePlayerFragments();
    };
    swipeRefreshCommentList = (SwipeRefreshLayout) layoutRoot.findViewById(R.id.swipe_refresh_comment_list);
    swipeRefreshCommentList.setOnRefreshListener(() -> controllerComments.reloadAllComments());
    linearLayoutManager = new LinearLayoutManager(getActivity());
    recyclerCommentList = (RecyclerView) layoutRoot.findViewById(R.id.recycler_comment_list);
    recyclerCommentList.setLayoutManager(linearLayoutManager);
    recyclerCommentList.setHasFixedSize(true);
    recyclerCommentList.setItemAnimator(null);
    AdapterListener adapterListenerComment = new AdapterListener() {

        @Override
        public void scrollAndCenter(int position, int height) {
            linearLayoutManager.scrollToPositionWithOffset(position, 0);
        }

        @Override
        public void hideToolbar() {
            callback.hideToolbar();
        }

        @Override
        public void clearDecoration() {
            callback.clearDecoration();
        }

        @Override
        public void requestMore() {
            controllerComments.loadMoreComments();
        }

        @Override
        public void requestDisallowInterceptTouchEventVertical(boolean disallow) {
            recyclerCommentList.requestDisallowInterceptTouchEvent(disallow);
            swipeRefreshCommentList.requestDisallowInterceptTouchEvent(disallow);
        }

        @Override
        public void requestDisallowInterceptTouchEventHorizontal(boolean disallow) {
        }
    };
    AdapterLink.ViewHolderLink.Listener listenerLink = new LinksListenerBase(mListener.getEventListenerBase()) {

        @Override
        public void onVote(Link link, AdapterLink.ViewHolderLink viewHolderLink, Likes vote) {
        }

        @Override
        public void onDelete(Link link) {
        }

        @Override
        public void onReport(Link link) {
        }

        @Override
        public void onSave(Link link) {
        }

        @Override
        public void onMarkNsfw(Link link) {
        }
    };
    AdapterCommentList.ViewHolderComment.Listener listenerComment = new AdapterCommentList.ViewHolderComment.Listener() {

        @Override
        public void onToggleComment(Comment comment) {
            controllerComments.toggleComment(comment);
        }

        @Override
        public void onShowReplyEditor(Comment comment) {
        }

        @Override
        public void onEditComment(Comment comment, String text) {
        }

        @Override
        public void onSendComment(Comment comment, String text) {
        }

        @Override
        public void onMarkRead(Comment comment) {
        }

        @Override
        public void onLoadNestedComments(Comment comment) {
            controllerComments.loadNestedComments(comment);
        }

        @Override
        public void onJumpToParent(Comment comment) {
            controllerComments.jumpToParent(comment);
        }

        @Override
        public void onViewProfile(Comment comment) {
        }

        @Override
        public void onCopyText(Comment comment) {
        }

        @Override
        public void onDeleteComment(Comment comment) {
        }

        @Override
        public void onReport(Comment comment) {
            // TODO: Add comment text
            new AlertDialog.Builder(getContext()).setTitle(R.string.report_title).setSingleChoiceItems(Report.getDisplayReasons(getResources()), -1, (dialog, which) -> {
                reportSelected = Report.values()[which];
            }).setPositiveButton(R.string.ok, (dialog, which) -> {
                if (reportSelected == Report.OTHER) {
                    View viewDialog = LayoutInflater.from(getContext()).inflate(R.layout.dialog_text_input, null, false);
                    final EditText editText = (EditText) viewDialog.findViewById(R.id.edit_text);
                    editText.setFilters(new InputFilter[] { new InputFilter.LengthFilter(100) });
                    new AlertDialog.Builder(getContext()).setView(viewDialog).setTitle(R.string.item_report).setPositiveButton(R.string.ok, (dialog1, which1) -> {
                        mListener.getEventListenerBase().onReport(link, editText.getText().toString()).subscribe(new ObserverError<String>() {

                            @Override
                            public void onError(Throwable e) {
                                controllerComments.getEventHolder().getErrors().call(CommentsError.REPORT);
                            }
                        });
                    }).setNegativeButton(R.string.cancel, (dialog1, which1) -> {
                        dialog1.dismiss();
                    }).show();
                } else if (reportSelected != null) {
                    mListener.getEventListenerBase().onReport(link, reportSelected.getReason()).subscribe(new ObserverError<String>() {

                        @Override
                        public void onError(Throwable e) {
                            controllerComments.getEventHolder().getErrors().call(CommentsError.REPORT);
                        }
                    });
                }
            }).setNegativeButton(R.string.cancel, null).show();
        }

        @Override
        public void onVoteComment(Comment comment, AdapterCommentList.ViewHolderComment viewHolderComment, Likes vote) {
        }

        @Override
        public void onSave(Comment comment) {
        }
    };
    adapterCommentList = new AdapterCommentList(getActivity(), adapterListenerComment, listenerComment, listenerLink, youTubeListener, callbackYouTubeDestruction, getArguments().getBoolean(ARG_IS_GRID, false), getArguments().getString(ARG_FIRST_LINK_NAME), getArguments().getInt(ARG_COLOR_LINK, 0), getArguments().getBoolean(ARG_ACTIONS_EXPANDED, false));
    observer = new RecyclerView.AdapterDataObserver() {

        @Override
        public void onItemRangeChanged(int positionStart, int itemCount) {
            super.onItemRangeChanged(positionStart, itemCount);
            if (positionStart == 0) {
                callback.releaseYouTube();
            }
        }
    };
    adapterCommentList.registerAdapterDataObserver(observer);
    recyclerCommentList.setAdapter(adapterCommentList);
    layoutManagerLink = new LinearLayoutManagerWrapHeight(getActivity(), LinearLayoutManager.VERTICAL, false);
    layoutManagerLink.setOnSizeChangedListener((width, height, oldWidth, oldHeight) -> {
        if (postExpanded && targetExpandPostHeight == 0) {
            targetExpandPostHeight = height + heightExpandHandle;
            postExpanded = false;
            expandPost(true);
        }
    });
    AdapterListener adapterListenerLink = new AdapterListener() {

        @Override
        public void scrollAndCenter(int position, int height) {
            layoutManagerLink.scrollToPositionWithOffset(position, 0);
        }

        @Override
        public void hideToolbar() {
            callback.hideToolbar();
        }

        @Override
        public void clearDecoration() {
            callback.clearDecoration();
        }

        @Override
        public void requestMore() {
        }

        @Override
        public void requestDisallowInterceptTouchEventVertical(boolean disallow) {
            recyclerLink.requestDisallowInterceptTouchEvent(disallow);
        }

        @Override
        public void requestDisallowInterceptTouchEventHorizontal(boolean disallow) {
        }
    };
    adapterLink = new AdapterLinkHeader(getActivity(), controllerComments, adapterListenerLink, listenerLink, youTubeListener, callbackYouTubeDestruction, getArguments().getBoolean(ARG_IS_GRID, false), getArguments().getString(ARG_FIRST_LINK_NAME), getArguments().getInt(ARG_COLOR_LINK, 0), getArguments().getBoolean(ARG_ACTIONS_EXPANDED, false));
    final GestureDetectorCompat gestureDetectorExpand = new GestureDetectorCompat(getActivity(), new GestureDetector.SimpleOnGestureListener() {

        private float startY;

        private int startHeight;

        @Override
        public boolean onDown(MotionEvent e) {
            if (targetExpandPostHeight == 0) {
                targetExpandPostHeight = layoutManagerLink.getFirstChildHeight() + heightExpandHandle;
            }
            if (e.getY() > imageExpandIndicator.getY() && e.getY() < imageExpandIndicator.getY() + heightExpandHandle) {
                startY = e.getY();
                startHeight = targetExpandPostHeight;
            } else {
                startY = 0;
            }
            return super.onDown(e);
        }

        @Override
        public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
            if (startY == 0) {
                return super.onScroll(e1, e2, distanceX, distanceY);
            }
            float distance = e2.getY() - startY;
            targetExpandPostHeight = (int) Math.min(startHeight + distance, layoutRoot.getHeight());
            layoutExpandPostInner.getLayoutParams().height = targetExpandPostHeight;
            layoutExpandPostInner.requestLayout();
            return super.onScroll(e1, e2, distanceX, distanceY);
        }

        @Override
        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
            if (startY == 0) {
                return super.onFling(e1, e2, velocityX, velocityY);
            }
            if (velocityY < -expandFlingThreshold) {
                startY = 0;
                expandPost(false);
                return true;
            } else if (velocityY > expandFlingThreshold) {
                startY = 0;
                targetExpandPostHeight = layoutRoot.getHeight() - heightExpandHandle;
                postExpanded = false;
                expandPost(true);
                return true;
            }
            return super.onFling(e1, e2, velocityX, velocityY);
        }
    });
    heightExpandHandle = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 33, getResources().getDisplayMetrics());
    expandFlingThreshold = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, EXPAND_FLING_THRESHOLD, getResources().getDisplayMetrics());
    layoutExpandPostInner = (ViewGroup) layoutRoot.findViewById(R.id.layout_expand_post_inner);
    imageExpandIndicator = (ImageView) layoutRoot.findViewById(R.id.image_expand_indicator);
    imageExpandIndicator.setColorFilter(themer.getColorFilterIcon());
    layoutRoot.setDispatchTouchListener((v, event) -> gestureDetectorExpand.onTouchEvent(event));
    recyclerLink = (RecyclerView) layoutRoot.findViewById(R.id.recycler_link);
    recyclerLink.setLayoutManager(layoutManagerLink);
    recyclerLink.setItemAnimator(null);
    if (savedInstanceState != null) {
        String youtubeId = savedInstanceState.getString(ARG_YOUTUBE_ID, null);
        if (!TextUtils.isEmpty(youtubeId)) {
            callback.loadYouTubeVideo(youtubeId, savedInstanceState.getInt(ARG_YOUTUBE_TIME, 0));
        }
    }
    if (savedInstanceState != null && savedInstanceState.containsKey("Link")) {
        adapterLink.setAnimationFinished(true);
        adapterCommentList.setAnimationFinished(true);
        controllerComments.setLinkFromCache((Link) savedInstanceState.get("Link"));
    } else if (link != null) {
        controllerComments.setLink(link);
        link = null;
    }
    adapterCommentList.setData(controllerComments.getData());
    if (animationFinished) {
        setAnimationFinished(true);
    }
    return layoutRoot;
}
Also used : AlertDialog(android.support.v7.app.AlertDialog) Context(android.content.Context) GestureDetector(android.view.GestureDetector) CallbackYouTubeDestruction(com.winsonchiu.reader.utils.CallbackYouTubeDestruction) Bundle(android.os.Bundle) LinksListenerBase(com.winsonchiu.reader.links.LinksListenerBase) CustomApplication(com.winsonchiu.reader.CustomApplication) AdapterLink(com.winsonchiu.reader.links.AdapterLink) UtilsRx(com.winsonchiu.reader.utils.UtilsRx) ImageView(android.widget.ImageView) AdapterListener(com.winsonchiu.reader.adapter.AdapterListener) UtilsList(com.winsonchiu.reader.utils.UtilsList) AndroidSchedulers(rx.android.schedulers.AndroidSchedulers) Animator(android.animation.Animator) CustomFrameLayout(com.winsonchiu.reader.views.CustomFrameLayout) UtilsAnimation(com.winsonchiu.reader.utils.UtilsAnimation) Likes(com.winsonchiu.reader.data.reddit.Likes) MotionEvent(android.view.MotionEvent) Link(com.winsonchiu.reader.data.reddit.Link) View(android.view.View) Comment(com.winsonchiu.reader.data.reddit.Comment) SwipeRefreshLayout(android.support.v4.widget.SwipeRefreshLayout) RectF(android.graphics.RectF) LinearLayoutManagerWrapHeight(com.winsonchiu.reader.utils.LinearLayoutManagerWrapHeight) LayoutInflater(android.view.LayoutInflater) YouTubeListener(com.winsonchiu.reader.utils.YouTubeListener) Sort(com.winsonchiu.reader.data.reddit.Sort) LinearLayoutManager(android.support.v7.widget.LinearLayoutManager) TextUtils(android.text.TextUtils) AnimatorListenerAdapter(android.animation.AnimatorListenerAdapter) ComponentActivity(com.winsonchiu.reader.dagger.components.ComponentActivity) ViewGroup(android.view.ViewGroup) R(com.winsonchiu.reader.R) RecyclerView(android.support.v7.widget.RecyclerView) FragmentBase(com.winsonchiu.reader.FragmentBase) AlertDialog(android.support.v7.app.AlertDialog) TypedValue(android.util.TypedValue) ActivityMain(com.winsonchiu.reader.ActivityMain) GestureDetectorCompat(android.support.v4.view.GestureDetectorCompat) FragmentListenerBase(com.winsonchiu.reader.FragmentListenerBase) RxAdapterEvent(com.winsonchiu.reader.adapter.RxAdapterEvent) Nullable(android.support.annotation.Nullable) InputFilter(android.text.InputFilter) Activity(android.app.Activity) Subscription(rx.Subscription) EditText(android.widget.EditText) ObserverError(com.winsonchiu.reader.rx.ObserverError) ValueAnimator(android.animation.ValueAnimator) Report(com.winsonchiu.reader.data.reddit.Report) AdapterListener(com.winsonchiu.reader.adapter.AdapterListener) YouTubeListener(com.winsonchiu.reader.utils.YouTubeListener) CallbackYouTubeDestruction(com.winsonchiu.reader.utils.CallbackYouTubeDestruction) LinearLayoutManagerWrapHeight(com.winsonchiu.reader.utils.LinearLayoutManagerWrapHeight) GestureDetector(android.view.GestureDetector) LinearLayoutManager(android.support.v7.widget.LinearLayoutManager) EditText(android.widget.EditText) Comment(com.winsonchiu.reader.data.reddit.Comment) AdapterListener(com.winsonchiu.reader.adapter.AdapterListener) InputFilter(android.text.InputFilter) ImageView(android.widget.ImageView) View(android.view.View) RecyclerView(android.support.v7.widget.RecyclerView) GestureDetectorCompat(android.support.v4.view.GestureDetectorCompat) MotionEvent(android.view.MotionEvent) LinksListenerBase(com.winsonchiu.reader.links.LinksListenerBase) ObserverError(com.winsonchiu.reader.rx.ObserverError) RecyclerView(android.support.v7.widget.RecyclerView) Likes(com.winsonchiu.reader.data.reddit.Likes) AdapterLink(com.winsonchiu.reader.links.AdapterLink) Link(com.winsonchiu.reader.data.reddit.Link)

Aggregations

InputFilter (android.text.InputFilter)93 EditText (android.widget.EditText)33 View (android.view.View)31 TextView (android.widget.TextView)31 DialogInterface (android.content.DialogInterface)19 AlertDialog (android.app.AlertDialog)17 Editable (android.text.Editable)14 Paint (android.graphics.Paint)12 Bundle (android.os.Bundle)11 TextWatcher (android.text.TextWatcher)11 LinearLayout (android.widget.LinearLayout)11 Spanned (android.text.Spanned)10 TextPaint (android.text.TextPaint)10 ImageView (android.widget.ImageView)9 SpannableStringBuilder (android.text.SpannableStringBuilder)8 Intent (android.content.Intent)7 Nullable (android.support.annotation.Nullable)7 SmallTest (android.test.suitebuilder.annotation.SmallTest)7 Button (android.widget.Button)7 Context (android.content.Context)6