diff options
| author | Tony Mantler <nicoya@google.com> | 2015-06-29 14:15:35 -0700 |
|---|---|---|
| committer | Tony Mantler <nicoya@google.com> | 2015-06-29 15:34:07 -0700 |
| commit | 41e6b178ef361cdadcf27b8074e71b624df8fe3f (patch) | |
| tree | 0c85d74fa212e3be8b0f786771a12fb147d68264 /v17 | |
| parent | a30ee841b517b44825308f1ec24aeb308a8be240 (diff) | |
| download | android_frameworks_support-41e6b178ef361cdadcf27b8074e71b624df8fe3f.tar.gz android_frameworks_support-41e6b178ef361cdadcf27b8074e71b624df8fe3f.tar.bz2 android_frameworks_support-41e6b178ef361cdadcf27b8074e71b624df8fe3f.zip | |
Remove card stack
Obsoletes a bunch of convoluted and probably brittle fragment management
code.
b/22179367
Change-Id: I3aa17c3d7e682c6a54710561bb877f3d7a8550df
Diffstat (limited to 'v17')
6 files changed, 51 insertions, 197 deletions
diff --git a/v17/preference-leanback/api/current.txt b/v17/preference-leanback/api/current.txt index b31306ca7a..675a18ecee 100644 --- a/v17/preference-leanback/api/current.txt +++ b/v17/preference-leanback/api/current.txt @@ -60,8 +60,8 @@ package android.support.v17.preference { ctor public LeanbackSettingsFragment(); method public boolean onPreferenceDisplayDialog(android.support.v14.preference.PreferenceFragment, android.support.v7.preference.Preference); method public abstract void onPreferenceStartInitialScreen(); - method public void startImmersiveFragment(android.app.Fragment, java.lang.String); - method public void startPreferenceFragment(android.app.Fragment, java.lang.String); + method public void startImmersiveFragment(android.app.Fragment); + method public void startPreferenceFragment(android.app.Fragment); } } diff --git a/v17/preference-leanback/res/layout/leanback_settings_fragment.xml b/v17/preference-leanback/res/layout/leanback_settings_fragment.xml index 5cf3e51813..e9c421ea26 100644 --- a/v17/preference-leanback/res/layout/leanback_settings_fragment.xml +++ b/v17/preference-leanback/res/layout/leanback_settings_fragment.xml @@ -15,6 +15,12 @@ ~ limitations under the License --> <android.support.v17.preference.LeanbackSettingsRootView xmlns:android="http://schemas.android.com/apk/res/android" - android:id="@+id/settings_fragment_container" + android:id="@+id/settings_dialog_container" android:layout_width="match_parent" - android:layout_height="match_parent"/> + android:layout_height="match_parent"> + <FrameLayout + android:id="@+id/settings_preference_fragment_container" + android:layout_width="@dimen/lb_settings_pane_width" + android:layout_height="match_parent" + android:layout_gravity="end"/> +</android.support.v17.preference.LeanbackSettingsRootView> diff --git a/v17/preference-leanback/res/layout/leanback_settings_fragment_stack.xml b/v17/preference-leanback/res/layout/leanback_settings_fragment_stack.xml deleted file mode 100644 index 568c41e353..0000000000 --- a/v17/preference-leanback/res/layout/leanback_settings_fragment_stack.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - ~ Copyright (C) 2015 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 - --> -<android.support.v17.leanback.view.StackedLayout - xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto" - android:id="@+id/settings_preference_stack" - android:layout_width="match_parent" - android:layout_height="match_parent" - app:cardWidth="@dimen/lb_settings_card_width" - app:stackShift="@dimen/lb_settings_card_shift" - app:elevationIncrement="@dimen/lb_settings_card_elevation" - /> diff --git a/v17/preference-leanback/res/values/dimens.xml b/v17/preference-leanback/res/values/dimens.xml index c3e519fb63..49763fe4fa 100644 --- a/v17/preference-leanback/res/values/dimens.xml +++ b/v17/preference-leanback/res/values/dimens.xml @@ -21,7 +21,5 @@ <dimen name="lb_preference_decor_title_padding_end">56dp</dimen> <dimen name="lb_preference_decor_title_text_size">20sp</dimen> - <dimen name="lb_settings_card_width">360dp</dimen> - <dimen name="lb_settings_card_shift">72dp</dimen> - <dimen name="lb_settings_card_elevation">12dp</dimen> + <dimen name="lb_settings_pane_width">360dp</dimen> </resources> diff --git a/v17/preference-leanback/src/android/support/v17/preference/BaseLeanbackPreferenceFragment.java b/v17/preference-leanback/src/android/support/v17/preference/BaseLeanbackPreferenceFragment.java index 40d9607239..6fc1fa6f16 100644 --- a/v17/preference-leanback/src/android/support/v17/preference/BaseLeanbackPreferenceFragment.java +++ b/v17/preference-leanback/src/android/support/v17/preference/BaseLeanbackPreferenceFragment.java @@ -16,6 +16,7 @@ package android.support.v17.preference; +import android.app.Fragment; import android.os.Bundle; import android.support.v14.preference.PreferenceFragment; import android.support.v17.leanback.widget.VerticalGridView; @@ -38,4 +39,12 @@ public abstract class BaseLeanbackPreferenceFragment extends PreferenceFragment verticalGridView.setFocusScrollStrategy(VerticalGridView.FOCUS_SCROLL_ALIGNED); return verticalGridView; } + + /** + * @hide + */ + @Override + public Fragment getCallbackFragment() { + return getParentFragment(); + } } diff --git a/v17/preference-leanback/src/android/support/v17/preference/LeanbackSettingsFragment.java b/v17/preference-leanback/src/android/support/v17/preference/LeanbackSettingsFragment.java index 38ef3d9b80..c6a7e94683 100644 --- a/v17/preference-leanback/src/android/support/v17/preference/LeanbackSettingsFragment.java +++ b/v17/preference-leanback/src/android/support/v17/preference/LeanbackSettingsFragment.java @@ -20,12 +20,10 @@ import android.app.Fragment; import android.app.FragmentTransaction; import android.os.Bundle; import android.support.annotation.NonNull; -import android.support.annotation.Nullable; import android.support.v14.preference.MultiSelectListPreference; import android.support.v14.preference.PreferenceFragment; import android.support.v7.preference.ListPreference; import android.support.v7.preference.Preference; -import android.support.v7.preference.PreferenceScreen; import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.View; @@ -36,10 +34,8 @@ public abstract class LeanbackSettingsFragment extends Fragment PreferenceFragment.OnPreferenceStartScreenCallback, PreferenceFragment.OnPreferenceDisplayDialogCallback { - private static final String SETTINGS_FRAGMENT_INNER_TAG = - "android.support.v17.preference.LeanbackSettingsFragment.INNER_FRAGMENT"; - - private boolean mInitialScreen; + private static final String PREFERENCE_FRAGMENT_TAG = + "android.support.v17.preference.LeanbackSettingsFragment.PREFERENCE_FRAGMENT"; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, @@ -56,14 +52,7 @@ public abstract class LeanbackSettingsFragment extends Fragment public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); if (savedInstanceState == null) { - final Fragment f = new LeanbackSettingsFragmentInner(); - getChildFragmentManager().beginTransaction() - .add(R.id.settings_fragment_container, f, SETTINGS_FRAGMENT_INNER_TAG) - .commit(); - getChildFragmentManager().executePendingTransactions(); - mInitialScreen = true; onPreferenceStartInitialScreen(); - mInitialScreen = false; } } @@ -73,11 +62,11 @@ public abstract class LeanbackSettingsFragment extends Fragment if (pref instanceof ListPreference) { final ListPreference listPreference = (ListPreference) pref; f = LeanbackListPreferenceDialogFragment.newInstanceSingle(listPreference.getKey()); - getInnerFragment().startDialogFragment(f, caller, null); + startImmersiveFragment(f); } else if (pref instanceof MultiSelectListPreference) { MultiSelectListPreference listPreference = (MultiSelectListPreference) pref; f = LeanbackListPreferenceDialogFragment.newInstanceMulti(listPreference.getKey()); - getInnerFragment().startDialogFragment(f, caller, null); + startImmersiveFragment(f); } // TODO // else if (pref instanceof EditTextPreference) { @@ -92,7 +81,7 @@ public abstract class LeanbackSettingsFragment extends Fragment /** * Called to instantiate the initial {@link android.support.v14.preference.PreferenceFragment} * to be shown in this fragment. Implementations are expected to call - * {@link #startPreferenceFragment(android.app.Fragment, java.lang.String)}. + * {@link #startPreferenceFragment(android.app.Fragment)}. */ public abstract void onPreferenceStartInitialScreen(); @@ -101,171 +90,49 @@ public abstract class LeanbackSettingsFragment extends Fragment * list-style fragments on top of the stack of preference fragments. * * @param fragment Fragment instance to be added. - * @param tag Fragment tag */ - public void startPreferenceFragment(@NonNull Fragment fragment, @Nullable String tag) { - getInnerFragment().startStackedFragment(fragment, tag, !mInitialScreen); + public void startPreferenceFragment(@NonNull Fragment fragment) { + fragment.setTargetFragment(this, 0); + final FragmentTransaction transaction = getChildFragmentManager().beginTransaction(); + final Fragment prevFragment = + getChildFragmentManager().findFragmentByTag(PREFERENCE_FRAGMENT_TAG); + if (prevFragment != null) { + transaction + .addToBackStack(null) + .replace(R.id.settings_preference_fragment_container, fragment, + PREFERENCE_FRAGMENT_TAG); + } else { + transaction + .add(R.id.settings_preference_fragment_container, fragment, + PREFERENCE_FRAGMENT_TAG); + } + transaction.commit(); } /** * Displays a fragment to the user, temporarily replacing the contents of this fragment. * * @param fragment Fragment instance to be added. - * @param tag Fragment tag */ - public void startImmersiveFragment(@NonNull Fragment fragment, @Nullable String tag) { - getChildFragmentManager().beginTransaction() - .replace(R.id.settings_fragment_container, fragment, tag) + public void startImmersiveFragment(@NonNull Fragment fragment) { + final FragmentTransaction transaction = getChildFragmentManager().beginTransaction(); + final Fragment preferenceFragment = + getChildFragmentManager().findFragmentByTag(PREFERENCE_FRAGMENT_TAG); + if (preferenceFragment != null) { + transaction.hide(preferenceFragment); + } + transaction + .add(R.id.settings_dialog_container, fragment) .addToBackStack(null) .commit(); } - private LeanbackSettingsFragmentInner getInnerFragment() { - return (LeanbackSettingsFragmentInner) - getChildFragmentManager().findFragmentByTag(SETTINGS_FRAGMENT_INNER_TAG); - } - - private boolean handleBackPress() { - final LeanbackSettingsFragmentInner inner = getInnerFragment(); - boolean handled = false; - if (inner != null && inner.isVisible()) { - handled = inner.handleBackPress(); - } - return handled || getChildFragmentManager().popBackStackImmediate(); - } - - /** - * @hide - */ - public static class LeanbackSettingsFragmentInner extends Fragment - implements LeanbackPreferenceDialogFragment.TargetFragment { - - private static final String SAVESTATE_TARGET_PREF_FRAG = - "android.support.v17.preference.LeanbackSettingsFragment.TARGET_PREF_FRAG"; - - private static final String TARGET_FRAGMENT_TAG = - "android.support.v17.preference.LeanbackSettingsFragment.TARGET"; - - // Preference fragment which last launched a dialog - private PreferenceFragment mTargetPreferenceFragment; - - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - if (savedInstanceState != null && - savedInstanceState.containsKey(SAVESTATE_TARGET_PREF_FRAG)) { - mTargetPreferenceFragment = (PreferenceFragment) getChildFragmentManager() - .getFragment(savedInstanceState, SAVESTATE_TARGET_PREF_FRAG); - } - } - - @Override - public @Nullable View onCreateView(LayoutInflater inflater, ViewGroup container, - Bundle savedInstanceState) { - return inflater.inflate(R.layout.leanback_settings_fragment_stack, - container, false); - } - - @Override - public void onSaveInstanceState(Bundle outState) { - super.onSaveInstanceState(outState); - if (mTargetPreferenceFragment != null) { - getChildFragmentManager().putFragment(outState, SAVESTATE_TARGET_PREF_FRAG, - mTargetPreferenceFragment); - } - } - - public void startDialogFragment(@NonNull Fragment dialogFragment, - @NonNull PreferenceFragment requestingFragment, @Nullable String tag) { - mTargetPreferenceFragment = requestingFragment; - startFragment(dialogFragment, tag, true); - } - - public void startStackedFragment(@NonNull Fragment fragment, @Nullable String tag, - boolean addToBackstack) { - fragment.setTargetFragment(findTarget(), 0); - startFragment(fragment, tag, addToBackstack); - } - - private void startFragment(@NonNull Fragment fragment, @Nullable String tag, - boolean addToBackstack) { - final FragmentTransaction transaction = getChildFragmentManager().beginTransaction() - .add(R.id.settings_preference_stack, fragment, tag); - if (addToBackstack) { - transaction.addToBackStack(null); - } - transaction.commit(); - } - - private Fragment findTarget() { - Fragment target = - getChildFragmentManager().findFragmentByTag(TARGET_FRAGMENT_TAG); - if (target == null) { - target = new Target(); - getChildFragmentManager().beginTransaction() - .add(target, TARGET_FRAGMENT_TAG) - .commit(); - getChildFragmentManager().executePendingTransactions(); - } - return target; - } - - public boolean handleBackPress() { - return getChildFragmentManager().popBackStackImmediate(); - } - - public Preference findPreference(CharSequence key) { - return mTargetPreferenceFragment.findPreference(key); - } - - public PreferenceFragment getPreferenceFragment() { - return mTargetPreferenceFragment; - } - - @Override - public LeanbackSettingsFragment getSettingsFragment() { - return (LeanbackSettingsFragment) getParentFragment(); - } - - // This looks terrible, and it is. We need this because the target fragment needs to be - // in the same FragmentManager as the fragment targeting it. - /** - * @hide - */ - public static class Target extends Fragment - implements PreferenceFragment.OnPreferenceStartFragmentCallback, - PreferenceFragment.OnPreferenceStartScreenCallback, - PreferenceFragment.OnPreferenceDisplayDialogCallback { - - private LeanbackSettingsFragment getOuterParent() { - return (LeanbackSettingsFragment) getParentFragment().getParentFragment(); - } - - @Override - public boolean onPreferenceStartFragment(PreferenceFragment caller, Preference pref) { - return getOuterParent().onPreferenceStartFragment(caller, pref); - } - - @Override - public boolean onPreferenceStartScreen(PreferenceFragment caller, - PreferenceScreen pref) { - return getOuterParent().onPreferenceStartScreen(caller, pref); - } - - @Override - public boolean onPreferenceDisplayDialog(PreferenceFragment caller, Preference pref) { - return getOuterParent().onPreferenceDisplayDialog(caller, pref); - } - } - } - private class RootViewOnKeyListener implements View.OnKeyListener { @Override public boolean onKey(View v, int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK) { - return handleBackPress(); + return getChildFragmentManager().popBackStackImmediate(); } else { return false; } |
