16ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko/*
26ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko * Copyright (C) 2017 The Android Open Source Project
36ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko *
46ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko * Licensed under the Apache License, Version 2.0 (the "License");
56ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko * you may not use this file except in compliance with the License.
66ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko * You may obtain a copy of the License at
76ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko *
86ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko *      http://www.apache.org/licenses/LICENSE-2.0
96ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko *
106ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko * Unless required by applicable law or agreed to in writing, software
116ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko * distributed under the License is distributed on an "AS IS" BASIS,
126ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
136ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko * See the License for the specific language governing permissions and
146ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko * limitations under the License.
156ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko */
166ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko
176ebde20b03db4c0d57f67acaac11832b610b966bNick Chalkopackage com.android.tv.tuner.setup;
186ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko
196ebde20b03db4c0d57f67acaac11832b610b966bNick Chalkoimport android.os.Bundle;
206ebde20b03db4c0d57f67acaac11832b610b966bNick Chalkoimport android.support.annotation.NonNull;
216ebde20b03db4c0d57f67acaac11832b610b966bNick Chalkoimport android.support.v17.leanback.widget.GuidanceStylist.Guidance;
226ebde20b03db4c0d57f67acaac11832b610b966bNick Chalkoimport android.support.v17.leanback.widget.GuidedAction;
236ebde20b03db4c0d57f67acaac11832b610b966bNick Chalkoimport android.support.v17.leanback.widget.GuidedActionsStylist;
246ebde20b03db4c0d57f67acaac11832b610b966bNick Chalkoimport android.text.InputFilter;
256ebde20b03db4c0d57f67acaac11832b610b966bNick Chalkoimport android.text.InputFilter.AllCaps;
266ebde20b03db4c0d57f67acaac11832b610b966bNick Chalkoimport android.view.View;
276ebde20b03db4c0d57f67acaac11832b610b966bNick Chalkoimport android.widget.TextView;
286ebde20b03db4c0d57f67acaac11832b610b966bNick Chalkoimport com.android.tv.R;
296ebde20b03db4c0d57f67acaac11832b610b966bNick Chalkoimport com.android.tv.common.ui.setup.SetupGuidedStepFragment;
306ebde20b03db4c0d57f67acaac11832b610b966bNick Chalkoimport com.android.tv.common.ui.setup.SetupMultiPaneFragment;
316ebde20b03db4c0d57f67acaac11832b610b966bNick Chalkoimport com.android.tv.tuner.util.PostalCodeUtils;
326ebde20b03db4c0d57f67acaac11832b610b966bNick Chalkoimport com.android.tv.util.LocationUtils;
336ebde20b03db4c0d57f67acaac11832b610b966bNick Chalkoimport java.util.List;
346ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko
356ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko/**
366ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko * A fragment for initial screen.
376ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko */
386ebde20b03db4c0d57f67acaac11832b610b966bNick Chalkopublic class PostalCodeFragment extends SetupMultiPaneFragment {
396ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko    public static final String ACTION_CATEGORY =
406ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko            "com.android.tv.tuner.setup.PostalCodeFragment";
416ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko    private static final int VIEW_TYPE_EDITABLE = 1;
426ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko
436ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko    @Override
446ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko    protected SetupGuidedStepFragment onCreateContentFragment() {
456ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko        ContentFragment fragment = new ContentFragment();
466ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko        Bundle arguments = new Bundle();
476ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko        arguments.putBoolean(SetupGuidedStepFragment.KEY_THREE_PANE, true);
486ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko        fragment.setArguments(arguments);
496ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko        return fragment;
506ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko    }
516ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko
526ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko    @Override
536ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko    protected String getActionCategory() {
546ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko        return ACTION_CATEGORY;
556ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko    }
566ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko
576ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko    @Override
586ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko    protected boolean needsDoneButton() {
596ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko        return true;
606ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko    }
616ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko
626ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko    @Override
636ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko    protected boolean needsSkipButton() {
646ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko        return true;
656ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko    }
666ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko
676ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko    @Override
686ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko    protected void setOnClickAction(View view, final String category, final int actionId) {
696ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko        if (actionId == ACTION_DONE) {
706ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko            view.setOnClickListener(
716ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                    new View.OnClickListener() {
726ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                        @Override
736ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                        public void onClick(View view) {
746ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                            CharSequence postalCode =
756ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                                    ((ContentFragment) getContentFragment()).mEditAction.getTitle();
766ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                            String region = LocationUtils.getCurrentCountry(getContext());
776ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                            if (postalCode != null && PostalCodeUtils.matches(postalCode, region)) {
786ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                                PostalCodeUtils.setLastPostalCode(
796ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                                        getContext(), postalCode.toString());
806ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                                onActionClick(category, actionId);
816ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                            } else {
826ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                                ContentFragment contentFragment =
836ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                                        (ContentFragment) getContentFragment();
846ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                                contentFragment.mEditAction.setDescription(
856ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                                        getString(R.string.postal_code_invalid_warning));
866ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                                contentFragment.notifyActionChanged(0);
876ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                                contentFragment.mEditedActionView.performClick();
886ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                            }
896ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                        }
906ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                    });
916ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko        } else if (actionId == ACTION_SKIP) {
926ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko            super.setOnClickAction(view, category, ACTION_SKIP);
936ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko        }
946ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko    }
956ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko
966ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko    public static class ContentFragment extends SetupGuidedStepFragment {
976ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko        private GuidedAction mEditAction;
986ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko        private View mEditedActionView;
996ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko        private View mDoneActionView;
1006ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko        private boolean mProceed;
1016ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko
1026ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko        @Override
1036ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko        public void onGuidedActionFocused(GuidedAction action) {
1046ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko            if (action.equals(mEditAction)) {
1056ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                if (mProceed) {
1066ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                    // "NEXT" in IME was just clicked, moves focus to Done button.
1076ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                    if (mDoneActionView == null) {
1086ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                        mDoneActionView = getActivity().findViewById(R.id.button_done);
1096ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                    }
1106ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                    mDoneActionView.requestFocus();
1116ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                    mProceed = false;
1126ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                } else {
1136ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                    // Directly opens IME to input postal/zip code.
1146ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                    if (mEditedActionView == null) {
1156ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                        int maxLength = PostalCodeUtils.getRegionMaxLength(getContext());
1166ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                        mEditedActionView = getView().findViewById(R.id.guidedactions_editable);
1176ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                        ((TextView) mEditedActionView.findViewById(R.id.guidedactions_item_title))
1186ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                                .setFilters(
1196ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                                        new InputFilter[] {
1206ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                                            new InputFilter.LengthFilter(maxLength), new AllCaps()
1216ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                                        });
1226ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                    }
1236ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                    mEditedActionView.performClick();
1246ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                }
1256ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko            }
1266ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko        }
1276ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko
1286ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko        @Override
1296ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko        public long onGuidedActionEditedAndProceed(GuidedAction action) {
1306ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko            mProceed = true;
1316ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko            return 0;
1326ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko        }
1336ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko
1346ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko        @NonNull
1356ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko        @Override
1366ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko        public Guidance onCreateGuidance(Bundle savedInstanceState) {
1376ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko            String title = getString(R.string.postal_code_guidance_title);
1386ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko            String description = getString(R.string.postal_code_guidance_description);
1396ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko            String breadcrumb = getString(R.string.ut_setup_breadcrumb);
1406ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko            return new Guidance(title, description, breadcrumb, null);
1416ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko        }
1426ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko
1436ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko        @Override
1446ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko        public void onCreateActions(@NonNull List<GuidedAction> actions,
1456ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                Bundle savedInstanceState) {
1466ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko            String description = getString(R.string.postal_code_action_description);
1476ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko            mEditAction = new GuidedAction.Builder(getActivity()).id(0).editable(true)
1486ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                    .description(description).build();
1496ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko            actions.add(mEditAction);
1506ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko        }
1516ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko
1526ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko        @Override
1536ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko        protected String getActionCategory() {
1546ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko            return ACTION_CATEGORY;
1556ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko        }
1566ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko
1576ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko        @Override
1586ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko        public GuidedActionsStylist onCreateActionsStylist() {
1596ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko            return new GuidedActionsStylist() {
1606ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                @Override
1616ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                public int getItemViewType(GuidedAction action) {
1626ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                    if (action.isEditable()) {
1636ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                        return VIEW_TYPE_EDITABLE;
1646ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                    }
1656ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                    return super.getItemViewType(action);
1666ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                }
1676ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko
1686ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                @Override
1696ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                public int onProvideItemLayoutId(int viewType) {
1706ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                    if (viewType == VIEW_TYPE_EDITABLE) {
1716ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                        return R.layout.guided_action_editable;
1726ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                    }
1736ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                    return super.onProvideItemLayoutId(viewType);
1746ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                }
1756ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko            };
1766ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko        }
1776ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko    }
1786ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko}