| /* |
| * Copyright (C) 2017 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| package com.android.tv.tuner.setup; |
| |
| import android.os.Bundle; |
| import android.support.annotation.NonNull; |
| import androidx.leanback.widget.GuidanceStylist.Guidance; |
| import androidx.leanback.widget.GuidedAction; |
| import androidx.leanback.widget.GuidedActionsStylist; |
| import android.text.InputFilter; |
| import android.text.InputFilter.AllCaps; |
| import android.view.View; |
| import android.widget.TextView; |
| import com.android.tv.common.ui.setup.SetupGuidedStepFragment; |
| import com.android.tv.common.ui.setup.SetupMultiPaneFragment; |
| import com.android.tv.common.util.LocationUtils; |
| import com.android.tv.common.util.PostalCodeUtils; |
| import com.android.tv.tuner.R; |
| import java.util.List; |
| |
| /** A fragment for users to enter postal code. */ |
| public class PostalCodeFragment extends SetupMultiPaneFragment { |
| public static final String ACTION_CATEGORY = "com.android.tv.tuner.setup.PostalCodeFragment"; |
| public static final String KEY_POSTAL_CODE = "postal_code"; |
| public static final String KEY_GET_LOCATION_FAILED = "get_location_failed"; |
| private static final int VIEW_TYPE_EDITABLE = 1; |
| |
| @Override |
| protected SetupGuidedStepFragment onCreateContentFragment() { |
| ContentFragment fragment = new ContentFragment(); |
| Bundle arguments = new Bundle(); |
| arguments.putBoolean(SetupGuidedStepFragment.KEY_THREE_PANE, true); |
| if (getArguments() != null) { |
| arguments.putBoolean( |
| KEY_GET_LOCATION_FAILED, |
| getArguments().getBoolean(KEY_GET_LOCATION_FAILED, false)); |
| } |
| fragment.setArguments(arguments); |
| return fragment; |
| } |
| |
| @Override |
| protected String getActionCategory() { |
| return ACTION_CATEGORY; |
| } |
| |
| @Override |
| protected boolean needsDoneButton() { |
| return true; |
| } |
| |
| @Override |
| protected boolean needsSkipButton() { |
| return true; |
| } |
| |
| @Override |
| protected void setOnClickAction(View view, final String category, final int actionId) { |
| if (actionId == ACTION_DONE) { |
| view.setOnClickListener( |
| new View.OnClickListener() { |
| @Override |
| public void onClick(View view) { |
| CharSequence postalCode = |
| ((ContentFragment) getContentFragment()) |
| .mEditedActionTitleView.getText(); |
| String region = LocationUtils.getCurrentCountry(getContext()); |
| if (postalCode != null && PostalCodeUtils.matches(postalCode, region)) { |
| String postalCodeString = postalCode.toString(); |
| PostalCodeUtils.setLastPostalCode(getContext(), postalCodeString); |
| Bundle params = new Bundle(); |
| params.putString(KEY_POSTAL_CODE, postalCodeString); |
| onActionClick(category, actionId, params); |
| } else { |
| ContentFragment contentFragment = |
| (ContentFragment) getContentFragment(); |
| contentFragment.mEditAction.setDescription( |
| getString(R.string.postal_code_invalid_warning)); |
| contentFragment.notifyActionChanged(0); |
| contentFragment.mEditedActionView.performClick(); |
| } |
| } |
| }); |
| } else if (actionId == ACTION_SKIP) { |
| super.setOnClickAction(view, category, ACTION_SKIP); |
| } |
| } |
| |
| /** The content fragment of {@link PostalCodeFragment}. */ |
| public static class ContentFragment extends SetupGuidedStepFragment { |
| private GuidedAction mEditAction; |
| private View mEditedActionView; |
| private TextView mEditedActionTitleView; |
| private View mDoneActionView; |
| private boolean mProceed; |
| |
| @Override |
| public void onGuidedActionFocused(GuidedAction action) { |
| if (action.equals(mEditAction)) { |
| if (mProceed) { |
| // "NEXT" in IME was just clicked, moves focus to Done button. |
| if (mDoneActionView == null) { |
| mDoneActionView = getDoneButton(); |
| } |
| mDoneActionView.requestFocus(); |
| mProceed = false; |
| } else { |
| // Directly opens IME to input postal/zip code. |
| if (mEditedActionView == null) { |
| int maxLength = PostalCodeUtils.getRegionMaxLength(getContext()); |
| mEditedActionView = getView().findViewById(R.id.guidedactions_editable); |
| mEditedActionTitleView = |
| mEditedActionView.findViewById(R.id.guidedactions_item_title); |
| mEditedActionTitleView.setFilters( |
| new InputFilter[] { |
| new InputFilter.LengthFilter(maxLength), new AllCaps() |
| }); |
| } |
| mEditedActionView.performClick(); |
| } |
| } |
| } |
| |
| @Override |
| public long onGuidedActionEditedAndProceed(GuidedAction action) { |
| mProceed = true; |
| return 0; |
| } |
| |
| @NonNull |
| @Override |
| public Guidance onCreateGuidance(Bundle savedInstanceState) { |
| String title = getString(R.string.postal_code_guidance_title); |
| StringBuilder description = new StringBuilder(); |
| if (getArguments().getBoolean(KEY_GET_LOCATION_FAILED, false)) { |
| description |
| .append(getString(R.string |
| .postal_code_guidance_description_get_location_failed)) |
| .append(" "); |
| } |
| description.append(getString(R.string.postal_code_guidance_description)); |
| String breadcrumb = getString(R.string.ut_setup_breadcrumb); |
| return new Guidance(title, description.toString(), breadcrumb, null); |
| } |
| |
| @Override |
| public void onCreateActions( |
| @NonNull List<GuidedAction> actions, Bundle savedInstanceState) { |
| String description = getString(R.string.postal_code_action_description); |
| mEditAction = |
| new GuidedAction.Builder(getActivity()) |
| .id(0) |
| .editable(true) |
| .description(description) |
| .build(); |
| actions.add(mEditAction); |
| } |
| |
| @Override |
| protected String getActionCategory() { |
| return ACTION_CATEGORY; |
| } |
| |
| @Override |
| public GuidedActionsStylist onCreateActionsStylist() { |
| return new GuidedActionsStylist() { |
| @Override |
| public int getItemViewType(GuidedAction action) { |
| if (action.isEditable()) { |
| return VIEW_TYPE_EDITABLE; |
| } |
| return super.getItemViewType(action); |
| } |
| |
| @Override |
| public int onProvideItemLayoutId(int viewType) { |
| if (viewType == VIEW_TYPE_EDITABLE) { |
| return R.layout.guided_action_editable; |
| } |
| return super.onProvideItemLayoutId(viewType); |
| } |
| }; |
| } |
| } |
| } |