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}