From dd97d9cc7189d8e60196885151517d5ff3155786 Mon Sep 17 00:00:00 2001 From: Arc Wang Date: Mon, 9 Jan 2023 10:26:07 +0800 Subject: [PATCH 01/12] Enable the android.window.PROPERTY_ACTIVITY_EMBEDDING_SPLITS_ENABLED property Future WM Jetpack library updates will ask for the property to enable ActivityEmbedding feature. Bug: 264733035 Test: build pass Change-Id: I0f5e5a10250049fb9425eac7c113b803b6701cc7 Merged-In: I0f5e5a10250049fb9425eac7c113b803b6701cc7 --- AndroidManifest.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/AndroidManifest.xml b/AndroidManifest.xml index f51719b4dd3..e3dce71608e 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -136,6 +136,10 @@ + + Date: Sat, 19 Nov 2022 00:38:12 +0000 Subject: [PATCH 02/12] Update ActivityEmbedding usage. Update ActivityEmbedding usage. Bug: 259592300 Test: build. Change-Id: I8e4aa8daf51cb9c669d06b152cc5a2fc69a06571 Merged-In: I8e4aa8daf51cb9c669d06b152cc5a2fc69a06571 (cherry picked from commit a9394d1796c3f752d77f63417ab283ac2028c5be) --- .../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 ad0d4eab03f..59b5c63a799 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; @@ -46,6 +46,7 @@ import com.android.settings.homepage.SettingsHomepageActivity; import com.android.settings.overlay.FeatureFactory; import com.android.settingslib.users.AvatarPickerActivity; +import java.util.Collection; import java.util.HashSet; import java.util.Set; @@ -60,7 +61,7 @@ public class ActivityEmbeddingRulesController { public ActivityEmbeddingRulesController(Context context) { mContext = context; - mSplitController = SplitController.getInstance(); + mSplitController = SplitController.getInstance(context); } /** @@ -85,8 +86,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; @@ -95,14 +96,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); } /** @@ -123,8 +130,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( @@ -132,8 +141,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 @@ -143,8 +154,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( @@ -152,8 +165,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); } @@ -204,17 +219,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, - true /* 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(true) + .setFinishPrimaryWithPlaceholder(SplitRule.FinishBehavior.ADJACENT) + .setDefaultSplitAttributes(attributes) + .build(); - mSplitController.registerRule(placeholderRule); + mSplitController.addRule(placeholderRule); } private void registerAlwaysExpandRule() { @@ -229,14 +247,16 @@ public class ActivityEmbeddingRulesController { addActivityFilter(activityFilters, FingerprintEnrollIntroductionInternal.class); addActivityFilter(activityFilters, FingerprintEnrollEnrolling.class); addActivityFilter(activityFilters, AvatarPickerActivity.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 8e14c5a44ea..41e71f3ac67 100644 --- a/src/com/android/settings/homepage/SettingsHomepageActivity.java +++ b/src/com/android/settings/homepage/SettingsHomepageActivity.java @@ -183,7 +183,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(); @@ -453,15 +453,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 70530fc8cd3..779e0cf7e2b 100644 --- a/src/com/android/settings/homepage/TopLevelSettings.java +++ b/src/com/android/settings/homepage/TopLevelSettings.java @@ -64,6 +64,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(); @@ -142,7 +143,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; @@ -153,12 +154,20 @@ 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) { mFirstStarted = false; } 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"); @@ -283,7 +292,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 b9f82bed98c43ee46c0cb19f212db943280cc0ee Mon Sep 17 00:00:00 2001 From: Jiaming Liu Date: Thu, 2 Feb 2023 03:49:48 +0000 Subject: [PATCH 03/12] 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) --- .../ActivityEmbeddingRulesController.java | 14 +++++++------- .../homepage/SettingsHomepageActivity.java | 10 +++++----- .../settings/homepage/TopLevelSettings.java | 12 ++++++------ .../HighlightableTopLevelPreferenceAdapter.java | 5 +++-- 4 files changed, 21 insertions(+), 20 deletions(-) diff --git a/src/com/android/settings/activityembedding/ActivityEmbeddingRulesController.java b/src/com/android/settings/activityembedding/ActivityEmbeddingRulesController.java index 59b5c63a799..ba778e90a3e 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; @@ -57,11 +57,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); } /** @@ -73,7 +73,7 @@ public class ActivityEmbeddingRulesController { return; } - mSplitController.clearRegisteredRules(); + mRuleController.clearRules(); // Set a placeholder for home page. registerHomepagePlaceholderRule(); @@ -109,7 +109,7 @@ public class ActivityEmbeddingRulesController { .setMinSmallestWidthDp(ActivityEmbeddingUtils.getMinSmallestScreenSplitWidthDp()) .setDefaultSplitAttributes(attributes) .build(); - SplitController.getInstance(context).addRule(splitPairRule); + RuleController.getInstance(context).addRule(splitPairRule); } /** @@ -232,7 +232,7 @@ public class ActivityEmbeddingRulesController { .setDefaultSplitAttributes(attributes) .build(); - mSplitController.addRule(placeholderRule); + mRuleController.addRule(placeholderRule); } private void registerAlwaysExpandRule() { @@ -249,7 +249,7 @@ public class ActivityEmbeddingRulesController { addActivityFilter(activityFilters, AvatarPickerActivity.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 41e71f3ac67..a4a7609db61 100644 --- a/src/com/android/settings/homepage/SettingsHomepageActivity.java +++ b/src/com/android/settings/homepage/SettingsHomepageActivity.java @@ -51,7 +51,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.SplitController; +import androidx.window.embedding.ActivityEmbeddingController; import androidx.window.embedding.SplitRule; import com.android.settings.R; @@ -95,7 +95,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. @@ -183,8 +183,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(); @@ -248,7 +248,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 779e0cf7e2b..02619a7e353 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; @@ -64,7 +64,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(); @@ -154,12 +154,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 c0a7e8f8f05189b16d4924988d985dbf1c0cbf7b Mon Sep 17 00:00:00 2001 From: Jakub Rotkiewicz Date: Mon, 20 Feb 2023 12:59:03 +0000 Subject: [PATCH 04/12] Snoop Logger: fix descriptions Test: refactoring CL. Existing unit tests still pass Merged-In: Ie6a6b27247896e2a9a410197135e44a22ab1428c Change-Id: Ie6a6b27247896e2a9a410197135e44a22ab1428c --- res/values/strings.xml | 26 ++++++++++++----------- res/xml/development_settings.xml | 2 +- res/xml/snoop_logger_filters_settings.xml | 8 ++++++- 3 files changed, 22 insertions(+), 14 deletions(-) diff --git a/res/values/strings.xml b/res/values/strings.xml index d91ff5f1f29..fe582acb36e 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -5399,18 +5399,20 @@ Experimental Feature flags - - Snoop Logger Filters - - Set filters (Toggle Bluetooth after changing this setting) - - Snoop Logger Filter PBAP - - Snoop Logger Filter MAP - - Set filtering mode. (Toggle Bluetooth after changing this setting) - - Enable Snoop Log Mode Filtered to change this option. + + Bluetooth HCI snoop log filtering + + Set filters + + Disable and enable Bluetooth for the changes to take effect + + Bluetooth HCI snoop log filtering PBAP + + Bluetooth HCI snoop log filtering MAP + + Set filtering mode. (Disable and enable Bluetooth for the changes to take effect) + + Set Bluetooth HCI snoop log mode to Enabled Filtered to change this option Talkback diff --git a/res/xml/development_settings.xml b/res/xml/development_settings.xml index 08f502053a3..bc1840562ef 100644 --- a/res/xml/development_settings.xml +++ b/res/xml/development_settings.xml @@ -82,7 +82,7 @@ diff --git a/res/xml/snoop_logger_filters_settings.xml b/res/xml/snoop_logger_filters_settings.xml index c804ec67855..abc2546591e 100644 --- a/res/xml/snoop_logger_filters_settings.xml +++ b/res/xml/snoop_logger_filters_settings.xml @@ -18,7 +18,7 @@ + android:title="@string/bt_hci_snoop_log_filters_dashboard_title" > + + From e39c0bbe8b090e3a7498b85049d9cc2e7294f968 Mon Sep 17 00:00:00 2001 From: Julia Reynolds Date: Wed, 22 Feb 2023 15:47:14 -0500 Subject: [PATCH 05/12] Clarify string for translation Test: view string in UI Fixes: 243971120 Change-Id: I7f21df52b831e87447a7001acd16b3e1e5325372 --- res/values/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/res/values/strings.xml b/res/values/strings.xml index 3efb2184f94..ac84339272e 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -7784,12 +7784,12 @@ - %1$s will be able to read all notifications, + The %1$s app will be able to read all notifications, including personal information such as contact names, photos, and the text of messages you receive. This app will also be able to snooze or dismiss notifications or take action on buttons in notifications, including answering phone calls. \n\nThis will also give the app the ability to turn Do Not Disturb on or off and change related settings. - %1$s will be able to: + The %1$s app will be able to: Read your notifications It can read your notifications, including personal information such as contacts, messages, and photos. Reply to messages From e644d26b9540cef6e16ab7d22b2de1a8fc63a2f1 Mon Sep 17 00:00:00 2001 From: Avinash Vadlamudi Date: Wed, 22 Feb 2023 10:56:15 +0000 Subject: [PATCH 06/12] [Auto Pin Confirm]: Fix the usage of LockPatternUtils#isAutoPinConfirmFeatureAvailable method - The method isAutoPinConfirmFeatureAvailable is changed to static, so refactoring the code to use it properly. Bug: 270315296 Test: Manual Test Test: atest AutoPinConfirmPreferenceControllerTest Test: atest ChooseLockPasswordTest Change-Id: Idecaeca296b9ae9acdd0c094dcbb736db31b74b3 --- .../settings/password/ChooseLockPassword.java | 4 +-- .../AutoPinConfirmPreferenceController.java | 2 +- ...utoPinConfirmPreferenceControllerTest.java | 29 ++++++++++++++----- 3 files changed, 25 insertions(+), 10 deletions(-) diff --git a/src/com/android/settings/password/ChooseLockPassword.java b/src/com/android/settings/password/ChooseLockPassword.java index 55e01b0a0c0..00ba2921a18 100644 --- a/src/com/android/settings/password/ChooseLockPassword.java +++ b/src/com/android/settings/password/ChooseLockPassword.java @@ -831,7 +831,7 @@ public class ChooseLockPassword extends SettingsActivity { mIsAlphaMode ? R.string.lockpassword_password_too_short : R.string.lockpassword_pin_too_short); - if (mLockPatternUtils.isAutoPinConfirmFeatureAvailable() + if (LockPatternUtils.isAutoPinConfirmFeatureAvailable() && !mIsAlphaMode && error.requirement < MIN_AUTO_PIN_REQUIREMENT_LENGTH) { Map arguments = new HashMap<>(); @@ -929,7 +929,7 @@ public class ChooseLockPassword extends SettingsActivity { } private void setAutoPinConfirmOption(boolean enabled, int length) { - if (!mLockPatternUtils.isAutoPinConfirmFeatureAvailable() + if (!LockPatternUtils.isAutoPinConfirmFeatureAvailable() || mAutoPinConfirmOption == null) { return; } diff --git a/src/com/android/settings/security/screenlock/AutoPinConfirmPreferenceController.java b/src/com/android/settings/security/screenlock/AutoPinConfirmPreferenceController.java index 75af1faf2c9..ff4a8b7924c 100644 --- a/src/com/android/settings/security/screenlock/AutoPinConfirmPreferenceController.java +++ b/src/com/android/settings/security/screenlock/AutoPinConfirmPreferenceController.java @@ -57,7 +57,7 @@ public class AutoPinConfirmPreferenceController extends AbstractPreferenceContro @Override public boolean isAvailable() { - return mLockPatternUtils.isAutoPinConfirmFeatureAvailable() && isPinLock() + return LockPatternUtils.isAutoPinConfirmFeatureAvailable() && isPinLock() && isPinLengthEligibleForAutoConfirmation(); } diff --git a/tests/robotests/src/com/android/settings/security/screenlock/AutoPinConfirmPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/security/screenlock/AutoPinConfirmPreferenceControllerTest.java index 370b214eb5e..55e1f1a23c7 100644 --- a/tests/robotests/src/com/android/settings/security/screenlock/AutoPinConfirmPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/security/screenlock/AutoPinConfirmPreferenceControllerTest.java @@ -16,17 +16,23 @@ package com.android.settings.security.screenlock; +import static android.provider.DeviceConfig.NAMESPACE_AUTO_PIN_CONFIRMATION; + +import static com.android.internal.widget.LockPatternUtils.FLAG_ENABLE_AUTO_PIN_CONFIRMATION; + import static com.google.common.truth.Truth.assertThat; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.content.Context; +import android.provider.DeviceConfig; import androidx.preference.SwitchPreference; import androidx.test.core.app.ApplicationProvider; import com.android.internal.widget.LockPatternUtils; +import com.android.settings.testutils.shadow.ShadowDeviceConfig; import org.junit.Before; import org.junit.Test; @@ -34,8 +40,10 @@ import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.robolectric.RobolectricTestRunner; +import org.robolectric.annotation.Config; @RunWith(RobolectricTestRunner.class) +@Config(shadows = {ShadowDeviceConfig.class}) public class AutoPinConfirmPreferenceControllerTest { private static final Integer TEST_USER_ID = 1; @Mock @@ -54,16 +62,18 @@ public class AutoPinConfirmPreferenceControllerTest { @Test public void isAvailable_featureEnabledAndLockSetToNone_shouldReturnFalse() { + DeviceConfig.setProperty(NAMESPACE_AUTO_PIN_CONFIRMATION, FLAG_ENABLE_AUTO_PIN_CONFIRMATION, + "true", /* makeDefault */ false); when(mLockPatternUtils.isSecure(TEST_USER_ID)).thenReturn(true); - when(mLockPatternUtils.isAutoPinConfirmFeatureAvailable()).thenReturn(true); assertThat(mController.isAvailable()).isFalse(); } @Test public void isAvailable_featureEnabledAndLockSetToPassword_shouldReturnFalse() { + DeviceConfig.setProperty(NAMESPACE_AUTO_PIN_CONFIRMATION, FLAG_ENABLE_AUTO_PIN_CONFIRMATION, + "true", /* makeDefault */ false); when(mLockPatternUtils.isSecure(TEST_USER_ID)).thenReturn(true); - when(mLockPatternUtils.isAutoPinConfirmFeatureAvailable()).thenReturn(true); when(mLockPatternUtils.getCredentialTypeForUser(TEST_USER_ID)) .thenReturn(LockPatternUtils.CREDENTIAL_TYPE_PASSWORD); @@ -72,7 +82,8 @@ public class AutoPinConfirmPreferenceControllerTest { @Test public void isAvailable_featureEnabledAndLockSetToPIN_lengthLessThanSix_shouldReturnFalse() { - when(mLockPatternUtils.isAutoPinConfirmFeatureAvailable()).thenReturn(true); + DeviceConfig.setProperty(NAMESPACE_AUTO_PIN_CONFIRMATION, FLAG_ENABLE_AUTO_PIN_CONFIRMATION, + "true", /* makeDefault */ false); when(mLockPatternUtils.getCredentialTypeForUser(TEST_USER_ID)) .thenReturn(LockPatternUtils.CREDENTIAL_TYPE_PIN); when(mLockPatternUtils.getPinLength(TEST_USER_ID)).thenReturn(5L); @@ -82,8 +93,9 @@ public class AutoPinConfirmPreferenceControllerTest { @Test public void isAvailable_featureEnabledAndLockSetToPIN_lengthMoreThanEqSix_shouldReturnTrue() { + DeviceConfig.setProperty(NAMESPACE_AUTO_PIN_CONFIRMATION, FLAG_ENABLE_AUTO_PIN_CONFIRMATION, + "true", /* makeDefault */ false); when(mLockPatternUtils.isSecure(TEST_USER_ID)).thenReturn(true); - when(mLockPatternUtils.isAutoPinConfirmFeatureAvailable()).thenReturn(true); when(mLockPatternUtils.getCredentialTypeForUser(TEST_USER_ID)) .thenReturn(LockPatternUtils.CREDENTIAL_TYPE_PIN); when(mLockPatternUtils.getPinLength(TEST_USER_ID)).thenReturn(6L); @@ -93,7 +105,8 @@ public class AutoPinConfirmPreferenceControllerTest { @Test public void isAvailable_featureDisabledAndLockSetToPIN_shouldReturnFalse() { - when(mLockPatternUtils.isAutoPinConfirmFeatureAvailable()).thenReturn(false); + DeviceConfig.setProperty(NAMESPACE_AUTO_PIN_CONFIRMATION, FLAG_ENABLE_AUTO_PIN_CONFIRMATION, + "false", /* makeDefault */ false); when(mLockPatternUtils.isSecure(TEST_USER_ID)).thenReturn(true); when(mLockPatternUtils.getCredentialTypeForUser(TEST_USER_ID)) .thenReturn(LockPatternUtils.CREDENTIAL_TYPE_PIN); @@ -103,7 +116,8 @@ public class AutoPinConfirmPreferenceControllerTest { @Test public void updateState_ChangingSettingState_shouldSetPreferenceToAppropriateCheckedState() { - when(mLockPatternUtils.isAutoPinConfirmFeatureAvailable()).thenReturn(true); + DeviceConfig.setProperty(NAMESPACE_AUTO_PIN_CONFIRMATION, FLAG_ENABLE_AUTO_PIN_CONFIRMATION, + "true", /* makeDefault */ false); // When auto_pin_confirm setting is disabled, switchPreference is unchecked when(mLockPatternUtils.isAutoPinConfirmEnabled(TEST_USER_ID)).thenReturn(false); mController.updateState(mPreference); @@ -117,7 +131,8 @@ public class AutoPinConfirmPreferenceControllerTest { @Test public void onPreferenceChange_shouldUpdatePinAutoConfirmSetting() { - when(mLockPatternUtils.isAutoPinConfirmFeatureAvailable()).thenReturn(true); + DeviceConfig.setProperty(NAMESPACE_AUTO_PIN_CONFIRMATION, FLAG_ENABLE_AUTO_PIN_CONFIRMATION, + "true", /* makeDefault */ false); mController.onPreferenceChange(mPreference, /* newValue= */ true); verify(mLockPatternUtils).setAutoPinConfirm(true, TEST_USER_ID); } From cbd5223bc73d34d376279e696f17d7088668e61f Mon Sep 17 00:00:00 2001 From: Zaiyue Xue Date: Thu, 23 Feb 2023 15:59:15 +0800 Subject: [PATCH 07/12] Fix b/265364507: Merge GPU and TPU into Others in battery usage system components list Bug: 265364507 Fix: 265364507 Test: manual Change-Id: Ia428a0854c42dacff130c2492ae11642643043b0 --- .../settings/fuelgauge/PowerUsageFeatureProvider.java | 5 +++++ .../fuelgauge/PowerUsageFeatureProviderImpl.java | 5 +++++ .../settings/fuelgauge/batteryusage/BatteryDiffData.java | 9 ++++++++- 3 files changed, 18 insertions(+), 1 deletion(-) diff --git a/src/com/android/settings/fuelgauge/PowerUsageFeatureProvider.java b/src/com/android/settings/fuelgauge/PowerUsageFeatureProvider.java index 339cabe52d1..5b40e93bf8f 100644 --- a/src/com/android/settings/fuelgauge/PowerUsageFeatureProvider.java +++ b/src/com/android/settings/fuelgauge/PowerUsageFeatureProvider.java @@ -152,6 +152,11 @@ public interface PowerUsageFeatureProvider { */ Set getOthersSystemComponentSet(); + /** + * Returns {@link Set} for the custom system component names which are combined into others + */ + Set getOthersCustomComponentNameSet(); + /** * Returns {@link Set} for hiding system component ids in the usage screen */ diff --git a/src/com/android/settings/fuelgauge/PowerUsageFeatureProviderImpl.java b/src/com/android/settings/fuelgauge/PowerUsageFeatureProviderImpl.java index 5d1e2e56bab..b6858fc6977 100644 --- a/src/com/android/settings/fuelgauge/PowerUsageFeatureProviderImpl.java +++ b/src/com/android/settings/fuelgauge/PowerUsageFeatureProviderImpl.java @@ -172,6 +172,11 @@ public class PowerUsageFeatureProviderImpl implements PowerUsageFeatureProvider return new ArraySet<>(); } + @Override + public Set getOthersCustomComponentNameSet() { + return new ArraySet<>(); + } + @Override public Set getHideSystemComponentSet() { return new ArraySet<>(); diff --git a/src/com/android/settings/fuelgauge/batteryusage/BatteryDiffData.java b/src/com/android/settings/fuelgauge/batteryusage/BatteryDiffData.java index a07cfdde856..67613ff406c 100644 --- a/src/com/android/settings/fuelgauge/batteryusage/BatteryDiffData.java +++ b/src/com/android/settings/fuelgauge/batteryusage/BatteryDiffData.java @@ -17,6 +17,7 @@ package com.android.settings.fuelgauge.batteryusage; import android.content.Context; +import android.os.BatteryConsumer; import androidx.annotation.NonNull; @@ -151,11 +152,17 @@ public class BatteryDiffData { final PowerUsageFeatureProvider featureProvider, final List systemEntries) { final Set othersSystemComponentSet = featureProvider.getOthersSystemComponentSet(); + final Set othersCustomComponentNameSet = + featureProvider.getOthersCustomComponentNameSet(); BatteryDiffEntry.OthersBatteryDiffEntry othersDiffEntry = null; final Iterator systemListIterator = systemEntries.iterator(); while (systemListIterator.hasNext()) { final BatteryDiffEntry batteryDiffEntry = systemListIterator.next(); - if (othersSystemComponentSet.contains(batteryDiffEntry.mBatteryHistEntry.mDrainType)) { + final int componentId = batteryDiffEntry.mBatteryHistEntry.mDrainType; + if (othersSystemComponentSet.contains(componentId) || ( + componentId >= BatteryConsumer.FIRST_CUSTOM_POWER_COMPONENT_ID + && othersCustomComponentNameSet.contains( + batteryDiffEntry.getAppLabel()))) { if (othersDiffEntry == null) { othersDiffEntry = new BatteryDiffEntry.OthersBatteryDiffEntry(context); } From 159b42a247f477b6c3820658164a0fca00aff05f Mon Sep 17 00:00:00 2001 From: Charles Chen Date: Wed, 8 Feb 2023 18:40:57 +0800 Subject: [PATCH 08/12] Make Settings show in two-pane on portrait tablet Test: manual - Change Display size and observe Bug: 211562623 Change-Id: I0c26a7443882cc28edb5500f8d135c5f00dee515 Merged-In: I0c26a7443882cc28edb5500f8d135c5f00dee515 --- .../activityembedding/ActivityEmbeddingRulesController.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/com/android/settings/activityembedding/ActivityEmbeddingRulesController.java b/src/com/android/settings/activityembedding/ActivityEmbeddingRulesController.java index edb30e0a65a..e1a052edb10 100644 --- a/src/com/android/settings/activityembedding/ActivityEmbeddingRulesController.java +++ b/src/com/android/settings/activityembedding/ActivityEmbeddingRulesController.java @@ -26,6 +26,7 @@ import android.util.Log; import androidx.window.embedding.ActivityFilter; import androidx.window.embedding.ActivityRule; +import androidx.window.embedding.EmbeddingAspectRatio; import androidx.window.embedding.RuleController; import androidx.window.embedding.SplitAttributes; import androidx.window.embedding.SplitPairFilter; @@ -107,6 +108,7 @@ public class ActivityEmbeddingRulesController { .setClearTop(clearTop) .setMinWidthDp(ActivityEmbeddingUtils.getMinCurrentScreenSplitWidthDp()) .setMinSmallestWidthDp(ActivityEmbeddingUtils.getMinSmallestScreenSplitWidthDp()) + .setMaxAspectRatioInPortrait(EmbeddingAspectRatio.alwaysAllow()) .setDefaultSplitAttributes(attributes) .build(); RuleController.getInstance(context).addRule(splitPairRule); @@ -227,6 +229,7 @@ public class ActivityEmbeddingRulesController { activityFilters, intent) .setMinWidthDp(ActivityEmbeddingUtils.getMinCurrentScreenSplitWidthDp()) .setMinSmallestWidthDp(ActivityEmbeddingUtils.getMinSmallestScreenSplitWidthDp()) + .setMaxAspectRatioInPortrait(EmbeddingAspectRatio.alwaysAllow()) .setSticky(false) .setFinishPrimaryWithPlaceholder(SplitRule.FinishBehavior.ADJACENT) .setDefaultSplitAttributes(attributes) From ad209be4aff86d84683c3e70e9efbf8a464b3791 Mon Sep 17 00:00:00 2001 From: Bonian Chen Date: Thu, 23 Feb 2023 08:39:38 +0000 Subject: [PATCH 09/12] [Settings] EID should be read out as phone number EID need to support TTS. Bug: 270517566 Test: local Change-Id: I630e94cca8d240595546897ac17ae6c59366c84a --- .../deviceinfo/simstatus/SimEidPreferenceController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/com/android/settings/deviceinfo/simstatus/SimEidPreferenceController.java b/src/com/android/settings/deviceinfo/simstatus/SimEidPreferenceController.java index 8f2083ff8a0..59c3f60c8f6 100644 --- a/src/com/android/settings/deviceinfo/simstatus/SimEidPreferenceController.java +++ b/src/com/android/settings/deviceinfo/simstatus/SimEidPreferenceController.java @@ -162,7 +162,7 @@ public class SimEidPreferenceController extends BasePreferenceController mShowEidOnSummary = true; dialogShwon.setOnDismissListener(dlg -> { - mPreference.setSummary(getSummary()); + mPreference.setSummary(PhoneNumberUtil.expandByTts(getSummary())); }); } From a9717482a7e77e766fbb7079fc53ac51c6661335 Mon Sep 17 00:00:00 2001 From: Bonian Chen Date: Thu, 23 Feb 2023 04:53:05 +0000 Subject: [PATCH 10/12] [Settings] Customizable resource for hiding 3G preferred network type Add a customiazble resource for specifying the carriers that avoiding from showing 3G option within the preferred network type. Bug: 261615630 Bug: 247995343 Bug: 268564499 Bug: 265147144 Bug: 267433657 Bug: 240176276 Bug: 266724047 Bug: 265147263 Bug: 242017692 Bug: 220998105 Bug: 209835551 Bug: 237837196 Bug: 239318933 Bug: 247996564 Test: local Change-Id: I8092372372cb334b5ac1956b869d194b9fcd0523 --- res/values/arrays.xml | 5 +++++ ...nabledNetworkModePreferenceController.java | 19 +++++++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/res/values/arrays.xml b/res/values/arrays.xml index 54dea11b08d..71e16f0a183 100644 --- a/res/values/arrays.xml +++ b/res/values/arrays.xml @@ -1418,4 +1418,9 @@ @color/screen_flash_preset_opacity_color_11 @color/screen_flash_preset_opacity_color_12 + + + + + diff --git a/src/com/android/settings/network/telephony/EnabledNetworkModePreferenceController.java b/src/com/android/settings/network/telephony/EnabledNetworkModePreferenceController.java index 7f94f73a068..9fb80a5d412 100644 --- a/src/com/android/settings/network/telephony/EnabledNetworkModePreferenceController.java +++ b/src/com/android/settings/network/telephony/EnabledNetworkModePreferenceController.java @@ -22,6 +22,7 @@ import static androidx.lifecycle.Lifecycle.Event.ON_STOP; import android.content.Context; import android.os.PersistableBundle; import android.telephony.CarrierConfigManager; +import android.telephony.SubscriptionInfo; import android.telephony.SubscriptionManager; import android.telephony.TelephonyCallback; import android.telephony.TelephonyManager; @@ -244,6 +245,24 @@ public class EnabledNetworkModePreferenceController extends // TODO: Using the carrier config. mDisplay3gOptions = getResourcesForSubId().getBoolean( R.bool.config_display_network_mode_3g_option); + + int[] carriersWithout3gMenu = getResourcesForSubId().getIntArray( + R.array.network_mode_3g_deprecated_carrier_id); + if ((carriersWithout3gMenu != null) && (carriersWithout3gMenu.length > 0)) { + SubscriptionManager sm = mContext.getSystemService(SubscriptionManager.class); + SubscriptionInfo subInfo = sm.getActiveSubscriptionInfo(mSubId); + if (subInfo != null) { + int carrierId = subInfo.getCarrierId(); + + for (int idx = 0; idx < carriersWithout3gMenu.length; idx++) { + if (carrierId == carriersWithout3gMenu[idx]) { + mDisplay3gOptions = false; + break; + } + } + } + } + mLteEnabled = carrierConfig.getBoolean(CarrierConfigManager.KEY_LTE_ENABLED_BOOL); } Log.d(LOG_TAG, "PreferenceEntriesBuilder: subId" + mSubId From b8e1799527046a5fc69e1c94c1bd6ebcc59e63c1 Mon Sep 17 00:00:00 2001 From: danielwbhuang Date: Thu, 23 Feb 2023 17:58:29 +0800 Subject: [PATCH 11/12] Change key name "Meta" to "Action key" 1. In the modifier key remapping page, the string "Meta" should be changed to "Action" 2. We should add the default focus effect when users go into this page first time. Demo: https://screencast.googleplex.com/cast/NTA2NjA2MzEyMjI2ODE2MHw2YjRjOTljMi0xMQ Bug: 269981968 Test: manual Change-Id: I481be0370166a8831bedc721751e23cee3b39703 --- res/values/strings.xml | 4 ++-- .../ModifierKeysPickerDialogFragment.java | 24 +++++++++++++------ 2 files changed, 19 insertions(+), 9 deletions(-) diff --git a/res/values/strings.xml b/res/values/strings.xml index bd0218608e6..da2c89f7574 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -3916,8 +3916,8 @@ Caps lock Ctrl - - Meta + + Action key Alt diff --git a/src/com/android/settings/inputmethod/ModifierKeysPickerDialogFragment.java b/src/com/android/settings/inputmethod/ModifierKeysPickerDialogFragment.java index b016f221392..291ce455a97 100644 --- a/src/com/android/settings/inputmethod/ModifierKeysPickerDialogFragment.java +++ b/src/com/android/settings/inputmethod/ModifierKeysPickerDialogFragment.java @@ -54,6 +54,7 @@ public class ModifierKeysPickerDialogFragment extends DialogFragment { private Preference mPreference; private String mKeyDefaultName; + private String mKeyFocus; private Context mContext; private InputManager mIm; @@ -72,6 +73,7 @@ public class ModifierKeysPickerDialogFragment extends DialogFragment { public ModifierKeysPickerDialogFragment(Preference preference, InputManager inputManager) { mPreference = preference; mKeyDefaultName = preference.getTitle().toString(); + mKeyFocus = preference.getSummary().toString(); mIm = inputManager; } @@ -101,11 +103,11 @@ public class ModifierKeysPickerDialogFragment extends DialogFragment { ModifierKeyAdapter adapter = new ModifierKeyAdapter(modifierKeys); ListView listView = dialoglayout.findViewById(R.id.modifier_key_picker); listView.setAdapter(adapter); + setInitialFocusItem(modifierKeys, adapter); listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView adapterView, View view, int i, long l) { adapter.setCurrentItem(i); - adapter.setClick(true); adapter.notifyDataSetChanged(); } }); @@ -165,13 +167,22 @@ public class ModifierKeysPickerDialogFragment extends DialogFragment { return modifierKeyDialog; } + private void setInitialFocusItem( + List modifierKeys, ModifierKeyAdapter adapter) { + if (modifierKeys.indexOf(mKeyFocus) == -1) { + adapter.setCurrentItem(modifierKeys.indexOf(mKeyDefaultName)); + } else { + adapter.setCurrentItem(modifierKeys.indexOf(mKeyFocus)); + } + adapter.notifyDataSetChanged(); + } + private static boolean isKeyCapsLock(Context context, String key) { return key.equals(context.getString(R.string.modifier_keys_caps_lock)); } class ModifierKeyAdapter extends BaseAdapter { private int mCurrentItem = 0; - private boolean mIsClick = false; private List mList; ModifierKeyAdapter(List list) { @@ -201,12 +212,15 @@ public class ModifierKeysPickerDialogFragment extends DialogFragment { TextView textView = view.findViewById(R.id.modifier_key_text); ImageView checkIcon = view.findViewById(R.id.modifier_key_check_icon); textView.setText(mList.get(i)); - if (mCurrentItem == i && mIsClick) { + if (mCurrentItem == i) { textView.setTextColor(getColorOfColorAccentPrimaryVariant()); checkIcon.setImageAlpha(255); + view.setBackground( + mContext.getDrawable(R.drawable.modifier_key_lisetview_background)); } else { textView.setTextColor(getColorOfTextColorPrimary()); checkIcon.setImageAlpha(0); + view.setBackground(null); } return view; } @@ -218,10 +232,6 @@ public class ModifierKeysPickerDialogFragment extends DialogFragment { public int getCurrentItem() { return this.mCurrentItem; } - - public void setClick(boolean click) { - this.mIsClick = click; - } } private int getColorOfTextColorPrimary() { From ea5b49f799ef3ba58f3340e9027e9c1d185dfcfb Mon Sep 17 00:00:00 2001 From: Zaiyue Xue Date: Tue, 21 Feb 2023 14:39:17 +0800 Subject: [PATCH 12/12] Fix b/265364351: Light theme icons opacity is too light https://screenshot.googleplex.com/Avqsw3gb2tjKqrK.png https://screenshot.googleplex.com/46AZuJMjp2HMyqd.png https://screenshot.googleplex.com/9mE3XutRUNaGckg.png https://screenshot.googleplex.com/5rNUKMJjhNBNShZ.png Bug: 265364351 Fix: 265364351 Test: manual Change-Id: I7521030f1a5d84cd88027fb84a465623610707fb --- .../BatteryChartPreferenceController.java | 11 --------- .../BatteryUsageBreakdownController.java | 24 +++++++++++++++---- .../batteryusage/PowerGaugePreference.java | 22 +++++++++++++++++ .../BatteryUsageBreakdownControllerTest.java | 2 +- 4 files changed, 42 insertions(+), 17 deletions(-) diff --git a/src/com/android/settings/fuelgauge/batteryusage/BatteryChartPreferenceController.java b/src/com/android/settings/fuelgauge/batteryusage/BatteryChartPreferenceController.java index f13a4ef6d7d..d192e1ab924 100644 --- a/src/com/android/settings/fuelgauge/batteryusage/BatteryChartPreferenceController.java +++ b/src/com/android/settings/fuelgauge/batteryusage/BatteryChartPreferenceController.java @@ -20,7 +20,6 @@ import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.app.settings.SettingsEnums; import android.content.Context; -import android.content.res.Configuration; import android.os.Bundle; import android.os.Handler; import android.os.Looper; @@ -68,8 +67,6 @@ public class BatteryChartPreferenceController extends AbstractPreferenceControll private static final String KEY_DAILY_CHART_INDEX = "daily_chart_index"; private static final String KEY_HOURLY_CHART_INDEX = "hourly_chart_index"; - private static int sUiMode = Configuration.UI_MODE_NIGHT_UNDEFINED; - /** * A callback listener for battery usage is updated. * This happens when battery usage data is ready or the selected index is changed. @@ -167,14 +164,6 @@ public class BatteryChartPreferenceController extends AbstractPreferenceControll @Override public void onResume() { - final int currentUiMode = - mContext.getResources().getConfiguration().uiMode - & Configuration.UI_MODE_NIGHT_MASK; - if (sUiMode != currentUiMode) { - sUiMode = currentUiMode; - BatteryDiffEntry.clearCache(); - Log.d(TAG, "clear icon and label cache since uiMode is changed"); - } mIs24HourFormat = DateFormat.is24HourFormat(mContext); mMetricsFeatureProvider.action(mPrefContext, SettingsEnums.OPEN_BATTERY_USAGE); } diff --git a/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageBreakdownController.java b/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageBreakdownController.java index d44f2669c1d..004fdd53227 100644 --- a/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageBreakdownController.java +++ b/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageBreakdownController.java @@ -18,6 +18,7 @@ package com.android.settings.fuelgauge.batteryusage; import android.app.settings.SettingsEnums; import android.content.Context; +import android.content.res.Configuration; import android.graphics.drawable.Drawable; import android.os.Handler; import android.os.Looper; @@ -43,6 +44,7 @@ import com.android.settingslib.core.instrumentation.MetricsFeatureProvider; import com.android.settingslib.core.lifecycle.Lifecycle; import com.android.settingslib.core.lifecycle.LifecycleObserver; import com.android.settingslib.core.lifecycle.events.OnDestroy; +import com.android.settingslib.core.lifecycle.events.OnResume; import com.android.settingslib.widget.FooterPreference; import java.util.HashMap; @@ -51,15 +53,15 @@ import java.util.Map; /** Controller for battery usage breakdown preference group. */ public class BatteryUsageBreakdownController extends BasePreferenceController - implements LifecycleObserver, OnDestroy { + implements LifecycleObserver, OnResume, OnDestroy { private static final String TAG = "BatteryUsageBreakdownController"; private static final String ROOT_PREFERENCE_KEY = "battery_usage_breakdown"; private static final String FOOTER_PREFERENCE_KEY = "battery_usage_footer"; private static final String SPINNER_PREFERENCE_KEY = "battery_usage_spinner"; private static final String APP_LIST_PREFERENCE_KEY = "app_list"; private static final String PACKAGE_NAME_NONE = "none"; - private static final int ENABLED_ICON_ALPHA = 255; - private static final int DISABLED_ICON_ALPHA = 255 / 3; + + private static int sUiMode = Configuration.UI_MODE_NIGHT_UNDEFINED; private final SettingsActivity mActivity; private final InstrumentedPreferenceFragment mFragment; @@ -98,6 +100,19 @@ public class BatteryUsageBreakdownController extends BasePreferenceController } } + @Override + public void onResume() { + final int currentUiMode = + mContext.getResources().getConfiguration().uiMode + & Configuration.UI_MODE_NIGHT_MASK; + if (sUiMode != currentUiMode) { + sUiMode = currentUiMode; + BatteryDiffEntry.clearCache(); + mPreferenceCache.clear(); + Log.d(TAG, "clear icon and label cache since uiMode is changed"); + } + } + @Override public void onDestroy() { mHandler.removeCallbacksAndMessages(/*token=*/ null); @@ -273,12 +288,11 @@ public class BatteryUsageBreakdownController extends BasePreferenceController pref.setSingleLineTitle(true); // Sets the BatteryDiffEntry to preference for launching detailed page. pref.setBatteryDiffEntry(entry); - pref.setEnabled(entry.validForRestriction()); + pref.setSelectable(entry.validForRestriction()); setPreferenceSummary(pref, entry); if (!isAdded) { mAppListPreferenceGroup.addPreference(pref); } - appIcon.setAlpha(pref.isEnabled() ? ENABLED_ICON_ALPHA : DISABLED_ICON_ALPHA); prefIndex++; } Log.d(TAG, String.format("addAllPreferences() is finished in %d/ms", diff --git a/src/com/android/settings/fuelgauge/batteryusage/PowerGaugePreference.java b/src/com/android/settings/fuelgauge/batteryusage/PowerGaugePreference.java index 4ab1f42ef06..0aee8a57671 100644 --- a/src/com/android/settings/fuelgauge/batteryusage/PowerGaugePreference.java +++ b/src/com/android/settings/fuelgauge/batteryusage/PowerGaugePreference.java @@ -19,6 +19,8 @@ package com.android.settings.fuelgauge.batteryusage; import android.content.Context; import android.graphics.drawable.Drawable; import android.util.AttributeSet; +import android.view.View; +import android.view.ViewGroup; import android.widget.TextView; import androidx.preference.PreferenceViewHolder; @@ -37,6 +39,10 @@ import com.android.settingslib.widget.AppPreference; public class PowerGaugePreference extends AppPreference { private static final double PERCENTAGE_TO_SHOW_THRESHOLD = 1f; + // Please see go/battery-usage-app-list-alpha + private static final float SELECTABLE_ALPHA = 1f; + private static final float UNSELECTABLE_ALPHA_LIGHT_MODE = 0.65f; + private static final float UNSELECTABLE_ALPHA_DARK_MODE = 0.5f; private BatteryEntry mInfo; private BatteryDiffEntry mBatteryDiffEntry; @@ -125,6 +131,11 @@ public class PowerGaugePreference extends AppPreference { public void onBindViewHolder(PreferenceViewHolder view) { super.onBindViewHolder(view); + final boolean isNightMode = Utils.isNightMode(getContext()); + final float alpha = isSelectable() ? SELECTABLE_ALPHA + : (isNightMode ? UNSELECTABLE_ALPHA_DARK_MODE : UNSELECTABLE_ALPHA_LIGHT_MODE); + setViewAlpha(view.itemView, alpha); + final TextView subtitle = (TextView) view.findViewById(R.id.widget_summary); subtitle.setText(mProgress); if (mShowAnomalyIcon) { @@ -138,4 +149,15 @@ public class PowerGaugePreference extends AppPreference { titleView.setContentDescription(mContentDescription); } } + + private static void setViewAlpha(View view, float alpha) { + if (view instanceof ViewGroup) { + final ViewGroup viewGroup = (ViewGroup) view; + for (int i = viewGroup.getChildCount() - 1; i >= 0; i--) { + setViewAlpha(viewGroup.getChildAt(i), alpha); + } + } else { + view.setAlpha(alpha); + } + } } diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageBreakdownControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageBreakdownControllerTest.java index 840ab3431cf..f312936db7b 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageBreakdownControllerTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageBreakdownControllerTest.java @@ -157,7 +157,7 @@ public final class BatteryUsageBreakdownControllerTest { assertThat(pref.getOrder()).isEqualTo(1); assertThat(pref.getBatteryDiffEntry()).isSameInstanceAs(mBatteryDiffEntry); assertThat(pref.isSingleLineTitle()).isTrue(); - assertThat(pref.isEnabled()).isFalse(); + assertThat(pref.isSelectable()).isFalse(); } @Test