From d2dfc4285e81276f219504989e3d58b9c8e7e0c5 Mon Sep 17 00:00:00 2001 From: Diego Vela Date: Sat, 19 Nov 2022 00:38:12 +0000 Subject: [PATCH 1/3] Update ActivityEmbedding usage. Bug: 259592300 Test: build. Change-Id: I8e4aa8daf51cb9c669d06b152cc5a2fc69a06571 Merged-In: I8e4aa8daf51cb9c669d06b152cc5a2fc69a06571 (cherry picked from commit a9394d1796c3f752d77f63417ab283ac2028c5be) (cherry picked from commit 65bb5a09f4c8ff8fb70133eb641fe7d7ff744d2c) --- .../android/settings/SettingsInitialize.java | 2 +- .../ActivityEmbeddingRulesController.java | 84 ++++++++++++------- .../ActivityEmbeddingUtils.java | 22 ++--- .../homepage/SettingsHomepageActivity.java | 10 +-- .../settings/homepage/TopLevelSettings.java | 15 +++- ...ighlightableTopLevelPreferenceAdapter.java | 2 +- 6 files changed, 80 insertions(+), 55 deletions(-) diff --git a/src/com/android/settings/SettingsInitialize.java b/src/com/android/settings/SettingsInitialize.java index ca136834e14..efbfd368de6 100644 --- a/src/com/android/settings/SettingsInitialize.java +++ b/src/com/android/settings/SettingsInitialize.java @@ -154,7 +154,7 @@ public class SettingsInitialize extends BroadcastReceiver { DeepLinkHomepageActivity.class); final ComponentName searchStateReceiver = new ComponentName(context, SearchStateReceiver.class); - final int enableState = SplitController.getInstance().isSplitSupported() + final int enableState = SplitController.getInstance(context).isSplitSupported() ? PackageManager.COMPONENT_ENABLED_STATE_ENABLED : PackageManager.COMPONENT_ENABLED_STATE_DISABLED; pm.setComponentEnabledSetting(deepLinkHome, enableState, PackageManager.DONT_KILL_APP); diff --git a/src/com/android/settings/activityembedding/ActivityEmbeddingRulesController.java b/src/com/android/settings/activityembedding/ActivityEmbeddingRulesController.java index dfe21829619..d789ce80623 100644 --- a/src/com/android/settings/activityembedding/ActivityEmbeddingRulesController.java +++ b/src/com/android/settings/activityembedding/ActivityEmbeddingRulesController.java @@ -22,11 +22,11 @@ import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.util.FeatureFlagUtils; -import android.util.LayoutDirection; import android.util.Log; import androidx.window.embedding.ActivityFilter; import androidx.window.embedding.ActivityRule; +import androidx.window.embedding.SplitAttributes; import androidx.window.embedding.SplitController; import androidx.window.embedding.SplitPairFilter; import androidx.window.embedding.SplitPairRule; @@ -49,6 +49,7 @@ import com.android.settings.overlay.FeatureFactory; import com.android.settings.password.ChooseLockPattern; import com.android.settingslib.users.AvatarPickerActivity; +import java.util.Collection; import java.util.HashSet; import java.util.Set; @@ -63,7 +64,7 @@ public class ActivityEmbeddingRulesController { public ActivityEmbeddingRulesController(Context context) { mContext = context; - mSplitController = SplitController.getInstance(); + mSplitController = SplitController.getInstance(context); } /** @@ -88,8 +89,8 @@ public class ActivityEmbeddingRulesController { ComponentName primaryComponent, ComponentName secondaryComponent, String secondaryIntentAction, - int finishPrimaryWithSecondary, - int finishSecondaryWithPrimary, + SplitRule.FinishBehavior finishPrimaryWithSecondary, + SplitRule.FinishBehavior finishSecondaryWithPrimary, boolean clearTop) { if (!ActivityEmbeddingUtils.isEmbeddingActivityEnabled(context)) { return; @@ -98,14 +99,20 @@ public class ActivityEmbeddingRulesController { filters.add(new SplitPairFilter(primaryComponent, secondaryComponent, secondaryIntentAction)); - SplitController.getInstance().registerRule(new SplitPairRule(filters, - finishPrimaryWithSecondary, - finishSecondaryWithPrimary, - clearTop, - ActivityEmbeddingUtils.getMinCurrentScreenSplitWidthPx(context), - ActivityEmbeddingUtils.getMinSmallestScreenSplitWidthPx(context), - ActivityEmbeddingUtils.getSplitRatio(context), - LayoutDirection.LOCALE)); + SplitAttributes attributes = new SplitAttributes.Builder() + .setSplitType(SplitAttributes.SplitType.ratio( + ActivityEmbeddingUtils.getSplitRatio(context))) + .setLayoutDirection(SplitAttributes.LayoutDirection.LOCALE) + .build(); + SplitPairRule splitPairRule = new SplitPairRule.Builder(filters) + .setFinishPrimaryWithSecondary(finishPrimaryWithSecondary) + .setFinishSecondaryWithPrimary(finishSecondaryWithPrimary) + .setClearTop(clearTop) + .setMinWidthDp(ActivityEmbeddingUtils.getMinCurrentScreenSplitWidthDp()) + .setMinSmallestWidthDp(ActivityEmbeddingUtils.getMinSmallestScreenSplitWidthDp()) + .setDefaultSplitAttributes(attributes) + .build(); + SplitController.getInstance(context).addRule(splitPairRule); } /** @@ -126,8 +133,10 @@ public class ActivityEmbeddingRulesController { new ComponentName(context, Settings.class), secondaryComponent, secondaryIntentAction, - finishPrimaryWithSecondary ? SplitRule.FINISH_ADJACENT : SplitRule.FINISH_NEVER, - finishSecondaryWithPrimary ? SplitRule.FINISH_ADJACENT : SplitRule.FINISH_NEVER, + finishPrimaryWithSecondary ? SplitRule.FinishBehavior.ADJACENT + : SplitRule.FinishBehavior.NEVER, + finishSecondaryWithPrimary ? SplitRule.FinishBehavior.ADJACENT + : SplitRule.FinishBehavior.NEVER, clearTop); registerTwoPanePairRule( @@ -135,8 +144,10 @@ public class ActivityEmbeddingRulesController { new ComponentName(context, SettingsHomepageActivity.class), secondaryComponent, secondaryIntentAction, - finishPrimaryWithSecondary ? SplitRule.FINISH_ADJACENT : SplitRule.FINISH_NEVER, - finishSecondaryWithPrimary ? SplitRule.FINISH_ADJACENT : SplitRule.FINISH_NEVER, + finishPrimaryWithSecondary ? SplitRule.FinishBehavior.ADJACENT + : SplitRule.FinishBehavior.NEVER, + finishSecondaryWithPrimary ? SplitRule.FinishBehavior.ADJACENT + : SplitRule.FinishBehavior.NEVER, clearTop); // We should finish HomePageActivity altogether even if it shows in single pane for all deep @@ -146,8 +157,10 @@ public class ActivityEmbeddingRulesController { new ComponentName(context, DeepLinkHomepageActivity.class), secondaryComponent, secondaryIntentAction, - finishPrimaryWithSecondary ? SplitRule.FINISH_ALWAYS : SplitRule.FINISH_NEVER, - finishSecondaryWithPrimary ? SplitRule.FINISH_ALWAYS : SplitRule.FINISH_NEVER, + finishPrimaryWithSecondary ? SplitRule.FinishBehavior.ALWAYS + : SplitRule.FinishBehavior.NEVER, + finishSecondaryWithPrimary ? SplitRule.FinishBehavior.ALWAYS + : SplitRule.FinishBehavior.NEVER, clearTop); registerTwoPanePairRule( @@ -155,8 +168,10 @@ public class ActivityEmbeddingRulesController { new ComponentName(context, DeepLinkHomepageActivityInternal.class), secondaryComponent, secondaryIntentAction, - finishPrimaryWithSecondary ? SplitRule.FINISH_ALWAYS : SplitRule.FINISH_NEVER, - finishSecondaryWithPrimary ? SplitRule.FINISH_ALWAYS : SplitRule.FINISH_NEVER, + finishPrimaryWithSecondary ? SplitRule.FinishBehavior.ALWAYS + : SplitRule.FinishBehavior.NEVER, + finishSecondaryWithPrimary ? SplitRule.FinishBehavior.ALWAYS + : SplitRule.FinishBehavior.NEVER, clearTop); } @@ -207,17 +222,20 @@ public class ActivityEmbeddingRulesController { final Intent intent = new Intent(mContext, Settings.NetworkDashboardActivity.class); intent.putExtra(SettingsActivity.EXTRA_IS_SECOND_LAYER_PAGE, true); - final SplitPlaceholderRule placeholderRule = new SplitPlaceholderRule( - activityFilters, - intent, - false /* stickyPlaceholder */, - SplitRule.FINISH_ADJACENT, - ActivityEmbeddingUtils.getMinCurrentScreenSplitWidthPx(mContext), - ActivityEmbeddingUtils.getMinSmallestScreenSplitWidthPx(mContext), - ActivityEmbeddingUtils.getSplitRatio(mContext), - LayoutDirection.LOCALE); + SplitAttributes attributes = new SplitAttributes.Builder() + .setSplitType(SplitAttributes.SplitType.ratio( + ActivityEmbeddingUtils.getSplitRatio(mContext))) + .build(); + final SplitPlaceholderRule placeholderRule = new SplitPlaceholderRule.Builder( + activityFilters, intent) + .setMinWidthDp(ActivityEmbeddingUtils.getMinCurrentScreenSplitWidthDp()) + .setMinSmallestWidthDp(ActivityEmbeddingUtils.getMinSmallestScreenSplitWidthDp()) + .setSticky(false) + .setFinishPrimaryWithPlaceholder(SplitRule.FinishBehavior.ADJACENT) + .setDefaultSplitAttributes(attributes) + .build(); - mSplitController.registerRule(placeholderRule); + mSplitController.addRule(placeholderRule); } private void registerAlwaysExpandRule() { @@ -235,14 +253,16 @@ public class ActivityEmbeddingRulesController { addActivityFilter(activityFilters, FaceEnrollIntroduction.class); addActivityFilter(activityFilters, AvatarPickerActivity.class); addActivityFilter(activityFilters, ChooseLockPattern.class); - mSplitController.registerRule(new ActivityRule(activityFilters, true /* alwaysExpand */)); + ActivityRule activityRule = new ActivityRule.Builder(activityFilters).setAlwaysExpand(true) + .build(); + mSplitController.addRule(activityRule); } private static void addActivityFilter(Set activityFilters, Intent intent) { activityFilters.add(new ActivityFilter(COMPONENT_NAME_WILDCARD, intent.getAction())); } - private void addActivityFilter(Set activityFilters, + private void addActivityFilter(Collection activityFilters, Class activityClass) { activityFilters.add(new ActivityFilter(new ComponentName(mContext, activityClass), null /* intentAction */)); diff --git a/src/com/android/settings/activityembedding/ActivityEmbeddingUtils.java b/src/com/android/settings/activityembedding/ActivityEmbeddingUtils.java index fdf13142cb8..63ea9cd519d 100644 --- a/src/com/android/settings/activityembedding/ActivityEmbeddingUtils.java +++ b/src/com/android/settings/activityembedding/ActivityEmbeddingUtils.java @@ -30,29 +30,25 @@ import com.android.settings.R; /** An util class collecting all common methods for the embedding activity features. */ public class ActivityEmbeddingUtils { // The smallest value of current width of the window when the split should be used. - private static final float MIN_CURRENT_SCREEN_SPLIT_WIDTH_DP = 720f; + private static final int MIN_CURRENT_SCREEN_SPLIT_WIDTH_DP = 720; // The smallest value of the smallest-width (sw) of the window in any rotation when // the split should be used. - private static final float MIN_SMALLEST_SCREEN_SPLIT_WIDTH_DP = 600f; + private static final int MIN_SMALLEST_SCREEN_SPLIT_WIDTH_DP = 600; // The minimum width of the activity to show the regular homepage layout. private static final float MIN_REGULAR_HOMEPAGE_LAYOUT_WIDTH_DP = 380f; private static final String TAG = "ActivityEmbeddingUtils"; - /** Get the smallest pixel value of width of the window when the split should be used. */ - public static int getMinCurrentScreenSplitWidthPx(Context context) { - final DisplayMetrics dm = context.getResources().getDisplayMetrics(); - return (int) TypedValue.applyDimension( - TypedValue.COMPLEX_UNIT_DIP, MIN_CURRENT_SCREEN_SPLIT_WIDTH_DP, dm); + /** Get the smallest width dp of the window when the split should be used. */ + public static int getMinCurrentScreenSplitWidthDp() { + return MIN_CURRENT_SCREEN_SPLIT_WIDTH_DP; } /** - * Get the smallest pixel value of the smallest-width (sw) of the window in any rotation when + * Get the smallest dp value of the smallest-width (sw) of the window in any rotation when * the split should be used. */ - public static int getMinSmallestScreenSplitWidthPx(Context context) { - final DisplayMetrics dm = context.getResources().getDisplayMetrics(); - return (int) TypedValue.applyDimension( - TypedValue.COMPLEX_UNIT_DIP, MIN_SMALLEST_SCREEN_SPLIT_WIDTH_DP, dm); + public static int getMinSmallestScreenSplitWidthDp() { + return MIN_SMALLEST_SCREEN_SPLIT_WIDTH_DP; } /** @@ -67,7 +63,7 @@ public class ActivityEmbeddingUtils { public static boolean isEmbeddingActivityEnabled(Context context) { final boolean isFlagEnabled = FeatureFlagUtils.isEnabled(context, FeatureFlagUtils.SETTINGS_SUPPORT_LARGE_SCREEN); - final boolean isSplitSupported = SplitController.getInstance().isSplitSupported(); + final boolean isSplitSupported = SplitController.getInstance(context).isSplitSupported(); Log.d(TAG, "isFlagEnabled = " + isFlagEnabled); Log.d(TAG, "isSplitSupported = " + isSplitSupported); diff --git a/src/com/android/settings/homepage/SettingsHomepageActivity.java b/src/com/android/settings/homepage/SettingsHomepageActivity.java index 2961abbd895..67bbcb83c0f 100644 --- a/src/com/android/settings/homepage/SettingsHomepageActivity.java +++ b/src/com/android/settings/homepage/SettingsHomepageActivity.java @@ -190,7 +190,7 @@ public class SettingsHomepageActivity extends FragmentActivity implements setupEdgeToEdge(); setContentView(R.layout.settings_homepage_container); - mSplitController = SplitController.getInstance(); + mSplitController = SplitController.getInstance(this); mIsTwoPane = mSplitController.isActivityEmbedded(this); updateAppBarMinHeight(); @@ -518,15 +518,15 @@ public class SettingsHomepageActivity extends FragmentActivity implements new ComponentName(getApplicationContext(), getClass()), targetComponentName, targetIntent.getAction(), - SplitRule.FINISH_ALWAYS, - SplitRule.FINISH_ALWAYS, + SplitRule.FinishBehavior.ALWAYS, + SplitRule.FinishBehavior.ALWAYS, true /* clearTop */); ActivityEmbeddingRulesController.registerTwoPanePairRule(this, new ComponentName(getApplicationContext(), Settings.class), targetComponentName, targetIntent.getAction(), - SplitRule.FINISH_ALWAYS, - SplitRule.FINISH_ALWAYS, + SplitRule.FinishBehavior.ALWAYS, + SplitRule.FinishBehavior.ALWAYS, true /* clearTop */); final UserHandle user = intent.getParcelableExtra(EXTRA_USER_HANDLE, UserHandle.class); diff --git a/src/com/android/settings/homepage/TopLevelSettings.java b/src/com/android/settings/homepage/TopLevelSettings.java index 8c122ef2ad6..ba1228add6d 100644 --- a/src/com/android/settings/homepage/TopLevelSettings.java +++ b/src/com/android/settings/homepage/TopLevelSettings.java @@ -65,6 +65,7 @@ public class TopLevelSettings extends DashboardFragment implements SplitLayoutLi private int mPaddingHorizontal; private boolean mScrollNeeded = true; private boolean mFirstStarted = true; + private SplitController mSplitController; public TopLevelSettings() { final Bundle args = new Bundle(); @@ -143,7 +144,7 @@ public class TopLevelSettings extends DashboardFragment implements SplitLayoutLi return; } - boolean activityEmbedded = SplitController.getInstance().isActivityEmbedded(getActivity()); + boolean activityEmbedded = isActivityEmbedded(); if (icicle != null) { mHighlightMixin = icicle.getParcelable(SAVED_HIGHLIGHT_MIXIN); mScrollNeeded = !mHighlightMixin.isActivityEmbedded() && activityEmbedded; @@ -154,6 +155,14 @@ public class TopLevelSettings extends DashboardFragment implements SplitLayoutLi } } + /** Wrap SplitController#isActivityEmbedded for testing. */ + public boolean isActivityEmbedded() { + if (mSplitController == null) { + mSplitController = SplitController.getInstance(getActivity()); + } + return mSplitController.isActivityEmbedded(getActivity()); + } + @Override public void onStart() { if (mFirstStarted) { @@ -161,7 +170,7 @@ public class TopLevelSettings extends DashboardFragment implements SplitLayoutLi FeatureFactory.getFactory(getContext()).getSearchFeatureProvider().sendPreIndexIntent( getContext()); } else if (mIsEmbeddingActivityEnabled && isOnlyOneActivityInTask() - && !SplitController.getInstance().isActivityEmbedded(getActivity())) { + && !isActivityEmbedded()) { // Set default highlight menu key for 1-pane homepage since it will show the placeholder // page once changing back to 2-pane. Log.i(TAG, "Set default menu key"); @@ -286,7 +295,7 @@ public class TopLevelSettings extends DashboardFragment implements SplitLayoutLi * 3. the current activity is embedded */ return mHighlightMixin != null && TextUtils.equals(pref.getKey(), mHighlightMixin.getHighlightPreferenceKey()) - && SplitController.getInstance().isActivityEmbedded(getActivity()); + && isActivityEmbedded(); } /** Show/hide the highlight on the menu entry for the search page presence */ diff --git a/src/com/android/settings/widget/HighlightableTopLevelPreferenceAdapter.java b/src/com/android/settings/widget/HighlightableTopLevelPreferenceAdapter.java index 3cc7ef27f7e..c08f79423c7 100644 --- a/src/com/android/settings/widget/HighlightableTopLevelPreferenceAdapter.java +++ b/src/com/android/settings/widget/HighlightableTopLevelPreferenceAdapter.java @@ -250,6 +250,6 @@ public class HighlightableTopLevelPreferenceAdapter extends PreferenceGroupAdapt } private boolean isHighlightNeeded() { - return SplitController.getInstance().isActivityEmbedded(mHomepageActivity); + return SplitController.getInstance(mHomepageActivity).isActivityEmbedded(mHomepageActivity); } } From 1c0af48f8c20369c005dde804ad9a2e686e2516a Mon Sep 17 00:00:00 2001 From: Jiaming Liu Date: Thu, 2 Feb 2023 03:49:48 +0000 Subject: [PATCH 2/3] Fix build for jetpack update Fix build for jetpack update Bug: 265818545 Test: build Change-Id: If48e7338ee560d995cb8bff7b5348ab36c457836 Merged-In: If48e7338ee560d995cb8bff7b5348ab36c457836 (cherry picked from commit e65283de6a2b2008b7c7202dbeb213b4e6289bb2) (cherry picked from commit 5a6444776a766e167b12eb824647ae0edb533ddf) --- .../ActivityEmbeddingRulesController.java | 14 +++++++------- .../homepage/SettingsHomepageActivity.java | 9 +++++---- .../settings/homepage/TopLevelSettings.java | 12 ++++++------ .../HighlightableTopLevelPreferenceAdapter.java | 5 +++-- 4 files changed, 21 insertions(+), 19 deletions(-) diff --git a/src/com/android/settings/activityembedding/ActivityEmbeddingRulesController.java b/src/com/android/settings/activityembedding/ActivityEmbeddingRulesController.java index d789ce80623..dafa16819d8 100644 --- a/src/com/android/settings/activityembedding/ActivityEmbeddingRulesController.java +++ b/src/com/android/settings/activityembedding/ActivityEmbeddingRulesController.java @@ -26,8 +26,8 @@ import android.util.Log; import androidx.window.embedding.ActivityFilter; import androidx.window.embedding.ActivityRule; +import androidx.window.embedding.RuleController; import androidx.window.embedding.SplitAttributes; -import androidx.window.embedding.SplitController; import androidx.window.embedding.SplitPairFilter; import androidx.window.embedding.SplitPairRule; import androidx.window.embedding.SplitPlaceholderRule; @@ -60,11 +60,11 @@ public class ActivityEmbeddingRulesController { private static final ComponentName COMPONENT_NAME_WILDCARD = new ComponentName( "*" /* pkg */, "*" /* cls */); private final Context mContext; - private final SplitController mSplitController; + private final RuleController mRuleController; public ActivityEmbeddingRulesController(Context context) { mContext = context; - mSplitController = SplitController.getInstance(context); + mRuleController = RuleController.getInstance(context); } /** @@ -76,7 +76,7 @@ public class ActivityEmbeddingRulesController { return; } - mSplitController.clearRegisteredRules(); + mRuleController.clearRules(); // Set a placeholder for home page. registerHomepagePlaceholderRule(); @@ -112,7 +112,7 @@ public class ActivityEmbeddingRulesController { .setMinSmallestWidthDp(ActivityEmbeddingUtils.getMinSmallestScreenSplitWidthDp()) .setDefaultSplitAttributes(attributes) .build(); - SplitController.getInstance(context).addRule(splitPairRule); + RuleController.getInstance(context).addRule(splitPairRule); } /** @@ -235,7 +235,7 @@ public class ActivityEmbeddingRulesController { .setDefaultSplitAttributes(attributes) .build(); - mSplitController.addRule(placeholderRule); + mRuleController.addRule(placeholderRule); } private void registerAlwaysExpandRule() { @@ -255,7 +255,7 @@ public class ActivityEmbeddingRulesController { addActivityFilter(activityFilters, ChooseLockPattern.class); ActivityRule activityRule = new ActivityRule.Builder(activityFilters).setAlwaysExpand(true) .build(); - mSplitController.addRule(activityRule); + mRuleController.addRule(activityRule); } private static void addActivityFilter(Set activityFilters, Intent intent) { diff --git a/src/com/android/settings/homepage/SettingsHomepageActivity.java b/src/com/android/settings/homepage/SettingsHomepageActivity.java index 67bbcb83c0f..b27f5cc8b66 100644 --- a/src/com/android/settings/homepage/SettingsHomepageActivity.java +++ b/src/com/android/settings/homepage/SettingsHomepageActivity.java @@ -56,6 +56,7 @@ import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentActivity; import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentTransaction; +import androidx.window.embedding.ActivityEmbeddingController; import androidx.window.embedding.SplitController; import androidx.window.embedding.SplitRule; @@ -102,7 +103,7 @@ public class SettingsHomepageActivity extends FragmentActivity implements private View mTwoPaneSuggestionView; private CategoryMixin mCategoryMixin; private Set mLoadedListeners; - private SplitController mSplitController; + private ActivityEmbeddingController mActivityEmbeddingController; private boolean mIsEmbeddingActivityEnabled; private boolean mIsTwoPane; // A regular layout shows icons on homepage, whereas a simplified layout doesn't. @@ -190,8 +191,8 @@ public class SettingsHomepageActivity extends FragmentActivity implements setupEdgeToEdge(); setContentView(R.layout.settings_homepage_container); - mSplitController = SplitController.getInstance(this); - mIsTwoPane = mSplitController.isActivityEmbedded(this); + mActivityEmbeddingController = ActivityEmbeddingController.getInstance(this); + mIsTwoPane = mActivityEmbeddingController.isActivityEmbedded(this); updateAppBarMinHeight(); initHomepageContainer(); @@ -266,7 +267,7 @@ public class SettingsHomepageActivity extends FragmentActivity implements @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); - final boolean newTwoPaneState = mSplitController.isActivityEmbedded(this); + final boolean newTwoPaneState = mActivityEmbeddingController.isActivityEmbedded(this); if (mIsTwoPane != newTwoPaneState) { mIsTwoPane = newTwoPaneState; updateHomepageAppBar(); diff --git a/src/com/android/settings/homepage/TopLevelSettings.java b/src/com/android/settings/homepage/TopLevelSettings.java index ba1228add6d..af553d6393c 100644 --- a/src/com/android/settings/homepage/TopLevelSettings.java +++ b/src/com/android/settings/homepage/TopLevelSettings.java @@ -35,7 +35,7 @@ import androidx.preference.Preference; import androidx.preference.PreferenceFragmentCompat; import androidx.preference.PreferenceScreen; import androidx.recyclerview.widget.RecyclerView; -import androidx.window.embedding.SplitController; +import androidx.window.embedding.ActivityEmbeddingController; import com.android.settings.R; import com.android.settings.Utils; @@ -65,7 +65,7 @@ public class TopLevelSettings extends DashboardFragment implements SplitLayoutLi private int mPaddingHorizontal; private boolean mScrollNeeded = true; private boolean mFirstStarted = true; - private SplitController mSplitController; + private ActivityEmbeddingController mActivityEmbeddingController; public TopLevelSettings() { final Bundle args = new Bundle(); @@ -155,12 +155,12 @@ public class TopLevelSettings extends DashboardFragment implements SplitLayoutLi } } - /** Wrap SplitController#isActivityEmbedded for testing. */ + /** Wrap ActivityEmbeddingController#isActivityEmbedded for testing. */ public boolean isActivityEmbedded() { - if (mSplitController == null) { - mSplitController = SplitController.getInstance(getActivity()); + if (mActivityEmbeddingController == null) { + mActivityEmbeddingController = ActivityEmbeddingController.getInstance(getActivity()); } - return mSplitController.isActivityEmbedded(getActivity()); + return mActivityEmbeddingController.isActivityEmbedded(getActivity()); } @Override diff --git a/src/com/android/settings/widget/HighlightableTopLevelPreferenceAdapter.java b/src/com/android/settings/widget/HighlightableTopLevelPreferenceAdapter.java index c08f79423c7..8084a4811d6 100644 --- a/src/com/android/settings/widget/HighlightableTopLevelPreferenceAdapter.java +++ b/src/com/android/settings/widget/HighlightableTopLevelPreferenceAdapter.java @@ -30,7 +30,7 @@ import androidx.preference.PreferenceGroup; import androidx.preference.PreferenceGroupAdapter; import androidx.preference.PreferenceViewHolder; import androidx.recyclerview.widget.RecyclerView; -import androidx.window.embedding.SplitController; +import androidx.window.embedding.ActivityEmbeddingController; import com.android.settings.R; import com.android.settings.Utils; @@ -250,6 +250,7 @@ public class HighlightableTopLevelPreferenceAdapter extends PreferenceGroupAdapt } private boolean isHighlightNeeded() { - return SplitController.getInstance(mHomepageActivity).isActivityEmbedded(mHomepageActivity); + return ActivityEmbeddingController.getInstance(mHomepageActivity) + .isActivityEmbedded(mHomepageActivity); } } From d9c3cf855f5dd830d2e90bef8c906b958bc74fa9 Mon Sep 17 00:00:00 2001 From: Behnam Heydarshahi Date: Tue, 31 Jan 2023 21:04:32 +0000 Subject: [PATCH 3/3] Muting ring volume slider disables notification With volume_separate_notification flag enbaled, muting ring volume slice will cause notification volume slice to gray out. There used to be a bug in which notification slice would not get updated in response to a change in ring volume mute/unmute broadcast. The resulting erroneous behavior was notification slider would get to zero but not get grayed out. To fix that bug, VolumeSliceHelper listens to ring stream mute/unmute broadcasts and forwards them to notification slice. Bug: b/266072907 Test: make DEBUG_ROBOLECTRIC=1 ROBOTEST_FILTER="NotificationVolumePreferenceControllerTest|VolumeSliceHelperTest" RunSettingsRoboTests -j40 Change-Id: I2ab51f1272bf99a0c3d9ca285354052d00910c90 --- res/values/strings.xml | 3 ++ res/xml/sound_settings.xml | 4 +- ...otificationVolumePreferenceController.java | 39 ++++++++++++------- ...odeAffectedVolumePreferenceController.java | 11 +++++- .../settings/slices/VolumeSliceHelper.java | 26 ++++++++++++- ...icationVolumePreferenceControllerTest.java | 23 +++++++++-- .../slices/VolumeSliceHelperTest.java | 39 ++++++++++++++++++- 7 files changed, 121 insertions(+), 24 deletions(-) diff --git a/res/values/strings.xml b/res/values/strings.xml index d2871ea3040..ecf378d5bd6 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -8828,6 +8828,9 @@ Notification volume + + Unavailable because ring is muted + Phone ringtone diff --git a/res/xml/sound_settings.xml b/res/xml/sound_settings.xml index a84b0aefcd2..7181e80b658 100644 --- a/res/xml/sound_settings.xml +++ b/res/xml/sound_settings.xml @@ -86,8 +86,8 @@ android:icon="@drawable/ic_notifications" android:title="@string/notification_volume_option_title" android:order="-150" - settings:controller= - "com.android.settings.notification.NotificationVolumePreferenceController"/> + settings:controller="com.android.settings.notification.NotificationVolumePreferenceController" + settings:unavailableSliceSubtitle="@string/notification_volume_disabled_summary"/> entry : sRegisteredUri.entrySet()) { if (entry.getValue() == inputType) { diff --git a/tests/robotests/src/com/android/settings/notification/NotificationVolumePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/NotificationVolumePreferenceControllerTest.java index 7e7ad10d8c1..594ef625ffb 100644 --- a/tests/robotests/src/com/android/settings/notification/NotificationVolumePreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/notification/NotificationVolumePreferenceControllerTest.java @@ -198,6 +198,7 @@ public class NotificationVolumePreferenceControllerTest { com.android.settings.R.bool.config_show_notification_volume)).thenReturn(true); // block the alternative condition to enable controller when(mTelephonyManager.isVoiceCapable()).thenReturn(true); + when(mAudioManager.getRingerModeInternal()).thenReturn(AudioManager.RINGER_MODE_NORMAL); DeviceConfig.setProperty(DeviceConfig.NAMESPACE_SYSTEMUI, SystemUiDeviceConfigFlags.VOLUME_SEPARATE_NOTIFICATION, "false", false); @@ -217,8 +218,8 @@ public class NotificationVolumePreferenceControllerTest { SystemUiDeviceConfigFlags.VOLUME_SEPARATE_NOTIFICATION, Boolean.toString(true), false); - assertThat(controller.getAvailabilityStatus() - == BasePreferenceController.AVAILABLE).isTrue(); + assertThat(controller.getAvailabilityStatus()).isEqualTo( + BasePreferenceController.AVAILABLE); } @Test @@ -233,9 +234,10 @@ public class NotificationVolumePreferenceControllerTest { // block the alternative condition to enable controller when(mTelephonyManager.isVoiceCapable()).thenReturn(true); + when(mAudioManager.getRingerModeInternal()).thenReturn(AudioManager.RINGER_MODE_NORMAL); + DeviceConfig.setProperty(DeviceConfig.NAMESPACE_SYSTEMUI, SystemUiDeviceConfigFlags.VOLUME_SEPARATE_NOTIFICATION, "true", false); - NotificationVolumePreferenceController controller = new NotificationVolumePreferenceController(mContext); @@ -254,4 +256,19 @@ public class NotificationVolumePreferenceControllerTest { == BasePreferenceController.UNSUPPORTED_ON_DEVICE).isTrue(); } + @Test + public void ringerModeSilent_unaliased_getAvailability_returnsDisabled() { + when(mResources.getBoolean( + com.android.settings.R.bool.config_show_notification_volume)).thenReturn(true); + when(mHelper.isSingleVolume()).thenReturn(false); + + when(mAudioManager.getRingerModeInternal()).thenReturn(AudioManager.RINGER_MODE_SILENT); + + DeviceConfig.setProperty(DeviceConfig.NAMESPACE_SYSTEMUI, + SystemUiDeviceConfigFlags.VOLUME_SEPARATE_NOTIFICATION, "true", false); + + assertThat(mController.getAvailabilityStatus()) + .isEqualTo(BasePreferenceController.DISABLED_DEPENDENT_SETTING); + } + } diff --git a/tests/robotests/src/com/android/settings/slices/VolumeSliceHelperTest.java b/tests/robotests/src/com/android/settings/slices/VolumeSliceHelperTest.java index 2ceeb253c9c..b4abd8c0a58 100644 --- a/tests/robotests/src/com/android/settings/slices/VolumeSliceHelperTest.java +++ b/tests/robotests/src/com/android/settings/slices/VolumeSliceHelperTest.java @@ -34,6 +34,7 @@ import android.media.AudioManager; import android.net.Uri; import com.android.settings.notification.MediaVolumePreferenceController; +import com.android.settings.notification.NotificationVolumePreferenceController; import com.android.settings.notification.RingVolumePreferenceController; import com.android.settings.notification.SeparateRingVolumePreferenceController; import com.android.settings.notification.VolumeSeekBarPreferenceController; @@ -64,6 +65,7 @@ public class VolumeSliceHelperTest { private VolumeSeekBarPreferenceController mMediaController; private VolumeSeekBarPreferenceController mRingController; private VolumeSeekBarPreferenceController mSeparateRingController; + private VolumeSeekBarPreferenceController mNotificationController; @Before public void setUp() { @@ -72,8 +74,9 @@ public class VolumeSliceHelperTest { when(mContext.getContentResolver()).thenReturn(mResolver); mMediaController = new MediaVolumePreferenceController(mContext); - mSeparateRingController = new SeparateRingVolumePreferenceController(mContext); mRingController = new RingVolumePreferenceController(mContext); + mSeparateRingController = new SeparateRingVolumePreferenceController(mContext); + mNotificationController = new NotificationVolumePreferenceController(mContext); mIntent = createIntent(AudioManager.VOLUME_CHANGED_ACTION) .putExtra(AudioManager.EXTRA_VOLUME_STREAM_VALUE, 1) @@ -238,6 +241,40 @@ public class VolumeSliceHelperTest { verify(mResolver).notifyChange(mMediaController.getSliceUri(), null); } + /** + * Without this test passing, when notification is separated from ring and its value is already + * zero, setting ringermode to silent would not disable notification slider. + * Note: the above scenario happens only in volume panel where controllers do not get to + * register for events such as RINGER_MODE_CHANGE. + */ + @Test + public void onReceive_ringVolumeMuted_shouldNotifyChangeNotificationSlice() { + final Intent intent = createIntent(AudioManager.STREAM_MUTE_CHANGED_ACTION) + .putExtra(AudioManager.EXTRA_VOLUME_STREAM_TYPE, mRingController.getAudioStream()); + registerIntentToUri(mRingController); + registerIntentToUri(mNotificationController); + + VolumeSliceHelper.onReceive(mContext, intent); + + verify(mResolver).notifyChange(mNotificationController.getSliceUri(), null); + } + + /** + * Notifying notification slice on ring mute does not mean it should not notify ring slice. + * Rather, it should notify both slices. + */ + @Test + public void onReceive_ringVolumeMuted_shouldNotifyChangeRingSlice() { + final Intent intent = createIntent(AudioManager.STREAM_MUTE_CHANGED_ACTION) + .putExtra(AudioManager.EXTRA_VOLUME_STREAM_TYPE, mRingController.getAudioStream()); + registerIntentToUri(mRingController); + registerIntentToUri(mNotificationController); + + VolumeSliceHelper.onReceive(mContext, intent); + + verify(mResolver).notifyChange(mRingController.getSliceUri(), null); + } + @Test public void onReceive_streamDevicesChanged_shouldNotifyChange() { final Intent intent = createIntent(AudioManager.STREAM_DEVICES_CHANGED_ACTION)