From fce8565e5e08ca3e2e7fd27d09dfa6b0c2dae88a Mon Sep 17 00:00:00 2001 From: Tsung-Mao Fang Date: Wed, 20 Oct 2021 18:40:44 +0800 Subject: [PATCH 1/2] Update logic to check two pane resolution Prior to this cl, we checked the app bounds for deciding app in two pane or not. However, this might be broken in some certain sceanrios. Currently, api will check the entire task bounds. If the width of task bounds is larger than two pane criteria, then we treat it as in two pane mode. Test: Highlighted behavior works correct. Fix: 203763572 Change-Id: Ib14851b1e3e097328874c7956bb653f50820f877 --- .../activityembedding/ActivityEmbeddingUtils.java | 14 +++++++++----- .../settings/homepage/TopLevelSettings.java | 4 ++-- .../HighlightableTopLevelPreferenceAdapter.java | 9 ++++++--- 3 files changed, 17 insertions(+), 10 deletions(-) diff --git a/src/com/android/settings/activityembedding/ActivityEmbeddingUtils.java b/src/com/android/settings/activityembedding/ActivityEmbeddingUtils.java index 7ecacded7be..ac3a01df8cf 100644 --- a/src/com/android/settings/activityembedding/ActivityEmbeddingUtils.java +++ b/src/com/android/settings/activityembedding/ActivityEmbeddingUtils.java @@ -16,7 +16,10 @@ package com.android.settings.activityembedding; +import android.app.Activity; +import android.app.ActivityTaskManager; import android.content.Context; +import android.graphics.Rect; import android.util.DisplayMetrics; import android.util.FeatureFlagUtils; import android.util.Log; @@ -64,10 +67,11 @@ public class ActivityEmbeddingUtils { } /** Whether the screen meets two-pane resolution. */ - public static boolean isTwoPaneResolution(Context context) { - final Context appContext = context.getApplicationContext(); - final DisplayMetrics dm = appContext.getResources().getDisplayMetrics(); - return dm.widthPixels >= getMinCurrentScreenSplitWidthPx(appContext) - && dm.heightPixels >= getMinSmallestScreenSplitWidthPx(appContext); + public static boolean isTwoPaneResolution(Activity activity) { + final Rect currentTaskBounds = + ActivityTaskManager.getInstance().getTaskBounds(activity.getTaskId()); + + return currentTaskBounds.width() >= getMinCurrentScreenSplitWidthPx(activity) + && currentTaskBounds.height() >= getMinSmallestScreenSplitWidthPx(activity); } } diff --git a/src/com/android/settings/homepage/TopLevelSettings.java b/src/com/android/settings/homepage/TopLevelSettings.java index a819b870540..38b2baa1694 100644 --- a/src/com/android/settings/homepage/TopLevelSettings.java +++ b/src/com/android/settings/homepage/TopLevelSettings.java @@ -196,8 +196,8 @@ public class TopLevelSettings extends DashboardFragment implements } Log.d(TAG, "onCreateAdapter, pref key: " + mHighlightedPreferenceKey); - mTopLevelAdapter = new HighlightableTopLevelPreferenceAdapter(preferenceScreen, - getListView(), mHighlightedPreferenceKey); + mTopLevelAdapter = new HighlightableTopLevelPreferenceAdapter( + getActivity(), preferenceScreen, getListView(), mHighlightedPreferenceKey); return mTopLevelAdapter; } diff --git a/src/com/android/settings/widget/HighlightableTopLevelPreferenceAdapter.java b/src/com/android/settings/widget/HighlightableTopLevelPreferenceAdapter.java index eeaad214a21..19a91f65d16 100644 --- a/src/com/android/settings/widget/HighlightableTopLevelPreferenceAdapter.java +++ b/src/com/android/settings/widget/HighlightableTopLevelPreferenceAdapter.java @@ -16,6 +16,7 @@ package com.android.settings.widget; +import android.app.Activity; import android.content.Context; import android.graphics.drawable.Drawable; import android.text.TextUtils; @@ -53,6 +54,7 @@ public class HighlightableTopLevelPreferenceAdapter extends PreferenceGroupAdapt final int mIconColorHighlight; private final Context mContext; + private final Activity mActivity; private final RecyclerView mRecyclerView; private final int mNormalBackgroundRes; private String mHighlightKey; @@ -61,12 +63,13 @@ public class HighlightableTopLevelPreferenceAdapter extends PreferenceGroupAdapt private boolean mHighlightNeeded; private boolean mScrolled; - public HighlightableTopLevelPreferenceAdapter(PreferenceGroup preferenceGroup, - RecyclerView recyclerView, String key) { + public HighlightableTopLevelPreferenceAdapter(Activity activity, + PreferenceGroup preferenceGroup, RecyclerView recyclerView, String key) { super(preferenceGroup); mRecyclerView = recyclerView; mHighlightKey = key; mContext = preferenceGroup.getContext(); + mActivity = activity; final TypedValue outValue = new TypedValue(); mContext.getTheme().resolveAttribute(android.R.attr.selectableItemBackground, outValue, true /* resolveRefs */); @@ -233,6 +236,6 @@ public class HighlightableTopLevelPreferenceAdapter extends PreferenceGroupAdapt } private boolean isHighlightNeeded() { - return ActivityEmbeddingUtils.isTwoPaneResolution(mContext); + return ActivityEmbeddingUtils.isTwoPaneResolution(mActivity); } } From 54b9d607838d484a16aba77d3d2762c4484c8ecf Mon Sep 17 00:00:00 2001 From: Tsung-Mao Fang Date: Thu, 21 Oct 2021 21:24:49 +0800 Subject: [PATCH 2/2] Create an interface to access the two pane state Create an new interface in the embedding provider, this interface tells if settings app is in two pane or not. To access the activity in the content provider, we need to store the activity reference in the app application layer. Test: See if two pane state is correct. Bug: 203763572 Change-Id: Iae2245b84af2683d932f1900df9959dad98370d7 --- src/com/android/settings/SettingsApplication.java | 13 +++++++++++++ .../ActivityEmbeddingProvider.java | 13 +++++++++++++ .../settings/homepage/SettingsHomepageActivity.java | 2 ++ 3 files changed, 28 insertions(+) diff --git a/src/com/android/settings/SettingsApplication.java b/src/com/android/settings/SettingsApplication.java index 7aa5af8b84c..a2f723e39ce 100644 --- a/src/com/android/settings/SettingsApplication.java +++ b/src/com/android/settings/SettingsApplication.java @@ -16,13 +16,18 @@ package com.android.settings; +import android.app.Activity; import android.app.Application; import com.android.settings.activityembedding.ActivityEmbeddingRulesController; +import java.lang.ref.WeakReference; + /** Settings application which sets up activity embedding rules for the large screen device. */ public class SettingsApplication extends Application { + private WeakReference mHomeActivity = new WeakReference<>(null); + @Override public void onCreate() { super.onCreate(); @@ -31,4 +36,12 @@ public class SettingsApplication extends Application { new ActivityEmbeddingRulesController(this); controller.initRules(); } + + public void setHomeActivity(Activity homeActivity) { + mHomeActivity = new WeakReference<>(homeActivity); + } + + public Activity getHomeActivity() { + return mHomeActivity.get(); + } } diff --git a/src/com/android/settings/activityembedding/ActivityEmbeddingProvider.java b/src/com/android/settings/activityembedding/ActivityEmbeddingProvider.java index 7585dce5b5f..764564351e1 100644 --- a/src/com/android/settings/activityembedding/ActivityEmbeddingProvider.java +++ b/src/com/android/settings/activityembedding/ActivityEmbeddingProvider.java @@ -16,6 +16,7 @@ package com.android.settings.activityembedding; +import android.app.Activity; import android.content.ContentProvider; import android.content.ContentValues; import android.database.Cursor; @@ -23,13 +24,17 @@ import android.net.Uri; import android.os.Bundle; import android.text.TextUtils; +import com.android.settings.SettingsApplication; + /** * A content provider for querying the state of activity embedding feature */ public class ActivityEmbeddingProvider extends ContentProvider { private static final String METHOD_IS_EMBEDDING_ACTIVITY_ENABLED = "isEmbeddingActivityEnabled"; + private static final String METHOD_IS_IN_SETTINGS_TWO_PANE = "isInSettingsTwoPane"; private static final String EXTRA_ENABLED_STATE = "enabled_state"; + private static final String EXTRA_TWO_PANE_STATE = "two_pane_state"; @Override public boolean onCreate() { @@ -43,6 +48,14 @@ public class ActivityEmbeddingProvider extends ContentProvider { bundle.putBoolean(EXTRA_ENABLED_STATE, ActivityEmbeddingUtils.isEmbeddingActivityEnabled(getContext())); return bundle; + } else if (TextUtils.equals(method, METHOD_IS_IN_SETTINGS_TWO_PANE)) { + final Activity homeActivity = + ((SettingsApplication) getContext().getApplicationContext()).getHomeActivity(); + final Bundle bundle = new Bundle(); + bundle.putBoolean(EXTRA_TWO_PANE_STATE, + homeActivity == null ? false + : ActivityEmbeddingUtils.isTwoPaneResolution(homeActivity)); + return bundle; } return null; } diff --git a/src/com/android/settings/homepage/SettingsHomepageActivity.java b/src/com/android/settings/homepage/SettingsHomepageActivity.java index ec3589c77c3..a2a6d3cb1ec 100644 --- a/src/com/android/settings/homepage/SettingsHomepageActivity.java +++ b/src/com/android/settings/homepage/SettingsHomepageActivity.java @@ -42,6 +42,7 @@ import androidx.fragment.app.FragmentTransaction; import com.android.settings.R; import com.android.settings.Settings; import com.android.settings.SettingsActivity; +import com.android.settings.SettingsApplication; import com.android.settings.Utils; import com.android.settings.accounts.AvatarViewMixin; import com.android.settings.activityembedding.ActivityEmbeddingRulesController; @@ -95,6 +96,7 @@ public class SettingsHomepageActivity extends FragmentActivity implements @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + ((SettingsApplication) getApplication()).setHomeActivity(this); setContentView(R.layout.settings_homepage_container); final View appBar = findViewById(R.id.app_bar_container);