| /* |
| * Copyright (C) 2021 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.settings.homepage; |
| |
| import android.content.DialogInterface; |
| import android.os.Bundle; |
| import android.os.Parcel; |
| import android.os.Parcelable; |
| import android.text.TextUtils; |
| import android.util.Log; |
| |
| import androidx.annotation.VisibleForTesting; |
| import androidx.preference.PreferenceScreen; |
| import androidx.recyclerview.widget.RecyclerView; |
| |
| import com.android.settings.SettingsActivity; |
| import com.android.settings.widget.HighlightableTopLevelPreferenceAdapter; |
| |
| /** A highlight mixin for the top level settings fragment. */ |
| public class TopLevelHighlightMixin implements Parcelable, DialogInterface.OnShowListener, |
| DialogInterface.OnCancelListener, DialogInterface.OnDismissListener { |
| |
| private static final String TAG = "TopLevelHighlightMixin"; |
| |
| private String mCurrentKey; |
| // Stores the previous key for the profile select dialog cancel event |
| private String mPreviousKey; |
| // Stores the key hidden for the search page presence |
| private String mHiddenKey; |
| private DialogInterface mDialog; |
| private HighlightableTopLevelPreferenceAdapter mTopLevelAdapter; |
| private boolean mActivityEmbedded; |
| |
| public TopLevelHighlightMixin(boolean activityEmbedded) { |
| mActivityEmbedded = activityEmbedded; |
| } |
| |
| public TopLevelHighlightMixin(Parcel source) { |
| mCurrentKey = source.readString(); |
| mPreviousKey = source.readString(); |
| mHiddenKey = source.readString(); |
| mActivityEmbedded = source.readBoolean(); |
| } |
| |
| @Override |
| public void writeToParcel(Parcel dest, int flags) { |
| dest.writeString(mCurrentKey); |
| dest.writeString(mPreviousKey); |
| dest.writeString(mHiddenKey); |
| dest.writeBoolean(mActivityEmbedded); |
| } |
| |
| @Override |
| public int describeContents() { |
| return 0; |
| } |
| |
| public static final Creator<TopLevelHighlightMixin> CREATOR = |
| new Creator<TopLevelHighlightMixin>() { |
| @Override |
| public TopLevelHighlightMixin createFromParcel(Parcel source) { |
| return new TopLevelHighlightMixin(source); |
| } |
| |
| @Override |
| public TopLevelHighlightMixin[] newArray(int size) { |
| return new TopLevelHighlightMixin[size]; |
| } |
| }; |
| |
| @Override |
| public void onShow(DialogInterface dialog) { |
| mDialog = dialog; |
| } |
| |
| @Override |
| public void onDismiss(DialogInterface dialog) { |
| mDialog = null; |
| } |
| |
| @Override |
| public void onCancel(DialogInterface dialog) { |
| if (mTopLevelAdapter != null) { |
| mCurrentKey = mPreviousKey; |
| mPreviousKey = null; |
| mTopLevelAdapter.highlightPreference(mCurrentKey, /* scrollNeeded= */ false); |
| } |
| } |
| |
| void setActivityEmbedded(boolean activityEmbedded) { |
| mActivityEmbedded = activityEmbedded; |
| } |
| |
| boolean isActivityEmbedded() { |
| return mActivityEmbedded; |
| } |
| |
| RecyclerView.Adapter onCreateAdapter(TopLevelSettings topLevelSettings, |
| PreferenceScreen preferenceScreen, boolean scrollNeeded) { |
| if (TextUtils.isEmpty(mCurrentKey)) { |
| mCurrentKey = getHighlightPrefKeyFromArguments(topLevelSettings.getArguments()); |
| } |
| |
| Log.d(TAG, "onCreateAdapter, pref key: " + mCurrentKey); |
| |
| // Remove the animator to avoid a RecyclerView crash. |
| RecyclerView recyclerView = topLevelSettings.getListView(); |
| recyclerView.setItemAnimator(null); |
| |
| mTopLevelAdapter = new HighlightableTopLevelPreferenceAdapter( |
| (SettingsHomepageActivity) topLevelSettings.getActivity(), preferenceScreen, |
| recyclerView, mCurrentKey, scrollNeeded); |
| return mTopLevelAdapter; |
| } |
| |
| void reloadHighlightMenuKey(Bundle arguments) { |
| if (mTopLevelAdapter == null) { |
| return; |
| } |
| ensureDialogDismissed(); |
| |
| mCurrentKey = getHighlightPrefKeyFromArguments(arguments); |
| Log.d(TAG, "reloadHighlightMenuKey, pref key: " + mCurrentKey); |
| mTopLevelAdapter.highlightPreference(mCurrentKey, /* scrollNeeded= */ true); |
| } |
| |
| void setHighlightPreferenceKey(String prefKey) { |
| if (mTopLevelAdapter != null) { |
| ensureDialogDismissed(); |
| mPreviousKey = mCurrentKey; |
| mCurrentKey = prefKey; |
| mTopLevelAdapter.highlightPreference(prefKey, /* scrollNeeded= */ false); |
| } |
| } |
| |
| @VisibleForTesting(otherwise = VisibleForTesting.PACKAGE_PRIVATE) |
| public String getHighlightPreferenceKey() { |
| return mCurrentKey; |
| } |
| |
| void highlightPreferenceIfNeeded() { |
| if (mTopLevelAdapter != null) { |
| mTopLevelAdapter.requestHighlight(); |
| } |
| } |
| |
| void setMenuHighlightShowed(boolean show) { |
| if (mTopLevelAdapter == null) { |
| return; |
| } |
| ensureDialogDismissed(); |
| |
| if (show) { |
| mCurrentKey = mHiddenKey; |
| mHiddenKey = null; |
| } else { |
| if (mHiddenKey == null) { |
| mHiddenKey = mCurrentKey; |
| } |
| mCurrentKey = null; |
| } |
| mTopLevelAdapter.highlightPreference(mCurrentKey, /* scrollNeeded= */ show); |
| } |
| |
| void setHighlightMenuKey(String menuKey, boolean scrollNeeded) { |
| if (mTopLevelAdapter == null) { |
| return; |
| } |
| ensureDialogDismissed(); |
| |
| final String prefKey = HighlightableMenu.lookupPreferenceKey(menuKey); |
| if (TextUtils.isEmpty(prefKey)) { |
| Log.e(TAG, "Invalid highlight menu key: " + menuKey); |
| } else { |
| Log.d(TAG, "Menu key: " + menuKey); |
| mCurrentKey = prefKey; |
| mTopLevelAdapter.highlightPreference(prefKey, scrollNeeded); |
| } |
| } |
| |
| private static String getHighlightPrefKeyFromArguments(Bundle arguments) { |
| final String menuKey = arguments.getString(SettingsActivity.EXTRA_FRAGMENT_ARG_KEY); |
| final String prefKey = HighlightableMenu.lookupPreferenceKey(menuKey); |
| if (TextUtils.isEmpty(prefKey)) { |
| Log.e(TAG, "Invalid highlight menu key: " + menuKey); |
| } else { |
| Log.d(TAG, "Menu key: " + menuKey); |
| } |
| return prefKey; |
| } |
| |
| private void ensureDialogDismissed() { |
| if (mDialog != null) { |
| onCancel(mDialog); |
| mDialog.dismiss(); |
| } |
| } |
| } |