From fa9d529b425fc7efff80b94bdd9de9b141fc8836 Mon Sep 17 00:00:00 2001 From: Yomna Nasser Date: Wed, 9 Mar 2022 22:01:29 +0000 Subject: [PATCH 01/15] Check KEY_PREFER_2G_BOOL before showing 2G options. Bug: b/181838883 Test: manual & atest -c EnabledNetworkModePreferenceControllerTest Change-Id: I164b62fd5a766966b793f798305447b9e2009643 --- ...nabledNetworkModePreferenceController.java | 28 +++++++++++++++---- 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/src/com/android/settings/network/telephony/EnabledNetworkModePreferenceController.java b/src/com/android/settings/network/telephony/EnabledNetworkModePreferenceController.java index 8e3f21a3a9d..6246b9178fe 100644 --- a/src/com/android/settings/network/telephony/EnabledNetworkModePreferenceController.java +++ b/src/com/android/settings/network/telephony/EnabledNetworkModePreferenceController.java @@ -251,6 +251,10 @@ public class EnabledNetworkModePreferenceController extends } void setPreferenceEntries() { + mTelephonyManager = mTelephonyManager.createForSubscriptionId(mSubId); + final PersistableBundle carrierConfig = mCarrierConfigCache.getConfigForSubId(mSubId); + final boolean display2gOptions = carrierConfig + .getBoolean(CarrierConfigManager.KEY_PREFER_2G_BOOL); clearAllEntries(); String[] entryValues; int[] entryValuesInt; @@ -266,7 +270,9 @@ public class EnabledNetworkModePreferenceController extends add5gEntry(addNrToLteNetworkType(entryValuesInt[0])); addLteEntry(entryValuesInt[0]); add3gEntry(entryValuesInt[1]); - add1xEntry(entryValuesInt[2]); + if (display2gOptions) { + add1xEntry(entryValuesInt[2]); + } addGlobalEntry(entryValuesInt[3]); break; case ENABLED_NETWORKS_CDMA_NO_LTE_CHOICES: @@ -278,7 +284,9 @@ public class EnabledNetworkModePreferenceController extends "ENABLED_NETWORKS_CDMA_NO_LTE_CHOICES index error."); } add3gEntry(entryValuesInt[0]); - add1xEntry(entryValuesInt[1]); + if (display2gOptions) { + add1xEntry(entryValuesInt[1]); + } break; case ENABLED_NETWORKS_CDMA_ONLY_LTE_CHOICES: entryValues = getResourcesForSubId().getStringArray( @@ -302,7 +310,9 @@ public class EnabledNetworkModePreferenceController extends add5gEntry(addNrToLteNetworkType(entryValuesInt[0])); addLteEntry(entryValuesInt[0]); add3gEntry(entryValuesInt[1]); - add2gEntry(entryValuesInt[2]); + if (display2gOptions) { + add2gEntry(entryValuesInt[2]); + } break; case ENABLED_NETWORKS_EXCEPT_GSM_LTE_CHOICES: entryValues = getResourcesForSubId().getStringArray( @@ -347,7 +357,9 @@ public class EnabledNetworkModePreferenceController extends "ENABLED_NETWORKS_EXCEPT_LTE_CHOICES index error."); } add3gEntry(entryValuesInt[0]); - add2gEntry(entryValuesInt[1]); + if (carrierConfig.getBoolean(CarrierConfigManager.KEY_PREFER_2G_BOOL)) { + add2gEntry(entryValuesInt[1]); + } break; case ENABLED_NETWORKS_4G_CHOICES: entryValues = getResourcesForSubId().getStringArray( @@ -361,7 +373,9 @@ public class EnabledNetworkModePreferenceController extends entryValuesInt[0])); add4gEntry(entryValuesInt[0]); add3gEntry(entryValuesInt[1]); - add2gEntry(entryValuesInt[2]); + if (display2gOptions) { + add2gEntry(entryValuesInt[2]); + } break; case ENABLED_NETWORKS_CHOICES: entryValues = getResourcesForSubId().getStringArray( @@ -373,7 +387,9 @@ public class EnabledNetworkModePreferenceController extends add5gEntry(addNrToLteNetworkType(entryValuesInt[0])); addLteEntry(entryValuesInt[0]); add3gEntry(entryValuesInt[1]); - add2gEntry(entryValuesInt[2]); + if (display2gOptions) { + add2gEntry(entryValuesInt[2]); + } break; case PREFERRED_NETWORK_MODE_CHOICES_WORLD_MODE: entryValues = getResourcesForSubId().getStringArray( From f6cbd7ce7a2b42a3a5d402d1774d6ec0c368985b Mon Sep 17 00:00:00 2001 From: Stanley Wang Date: Mon, 14 Mar 2022 14:28:13 +0800 Subject: [PATCH 02/15] Fix the problem that the "Remove account" keyword has no search result. Add "remove" and "delete" keywords to the search keyword. Fix: 223315958 Test: manual test and see the search result. Change-Id: Ibb27d8b3d29755ff8e31eb96923f0a024a8ba55b --- res/values/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/res/values/strings.xml b/res/values/strings.xml index 63f4a347219..ffc224d633a 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -8292,7 +8292,7 @@ dont don\u2019t disturb, interrupt, interruption, break RAM nearby, location, history, reporting, GPS - account, add an account, work profile, add account + account, add an account, work profile, add account, remove, delete restriction, restrict, restricted text correction, correct, sound, vibrate, auto, language, gesture, suggest, suggestion, theme, offensive, word, type, emoji, international reset, preferences, default From 764e7fbc445441b1386c95f2a5c71cd77670f6e3 Mon Sep 17 00:00:00 2001 From: Jason Chiu Date: Wed, 9 Mar 2022 14:46:51 +0800 Subject: [PATCH 03/15] Prevent scrolling after the homepage recreating - Only apply the layout transition when contextual home is enabled - Do not scroll for highlighting when the homepage is recreated and never scrolled Fix: 222238012 Bug: 222473415 Test: robotest, manual Change-Id: I490c3f8dbca63a5250bae01555592b7795c90af2 --- .../homepage/SettingsHomepageActivity.java | 5 ++--- .../homepage/TopLevelHighlightMixin.java | 21 ++++++++++++++----- .../settings/homepage/TopLevelSettings.java | 10 ++++++--- ...ighlightableTopLevelPreferenceAdapter.java | 4 +++- 4 files changed, 28 insertions(+), 12 deletions(-) diff --git a/src/com/android/settings/homepage/SettingsHomepageActivity.java b/src/com/android/settings/homepage/SettingsHomepageActivity.java index 73c473a27ff..3ed305eff23 100644 --- a/src/com/android/settings/homepage/SettingsHomepageActivity.java +++ b/src/com/android/settings/homepage/SettingsHomepageActivity.java @@ -182,6 +182,8 @@ public class SettingsHomepageActivity extends FragmentActivity implements showSuggestionFragment(scrollNeeded); if (FeatureFlagUtils.isEnabled(this, FeatureFlags.CONTEXTUAL_HOME)) { showFragment(() -> new ContextualCardsFragment(), R.id.contextual_cards_content); + ((FrameLayout) findViewById(R.id.main_content)) + .getLayoutTransition().enableTransitionType(LayoutTransition.CHANGING); } } mMainFragment = showFragment(() -> { @@ -191,9 +193,6 @@ public class SettingsHomepageActivity extends FragmentActivity implements return fragment; }, R.id.main_content); - ((FrameLayout) findViewById(R.id.main_content)) - .getLayoutTransition().enableTransitionType(LayoutTransition.CHANGING); - // Launch the intent from deep link for large screen devices. launchDeepLinkIntentToRight(); } diff --git a/src/com/android/settings/homepage/TopLevelHighlightMixin.java b/src/com/android/settings/homepage/TopLevelHighlightMixin.java index ebfe7f204a6..c473e87eeca 100644 --- a/src/com/android/settings/homepage/TopLevelHighlightMixin.java +++ b/src/com/android/settings/homepage/TopLevelHighlightMixin.java @@ -23,7 +23,6 @@ import android.os.Parcelable; import android.text.TextUtils; import android.util.Log; -import androidx.fragment.app.FragmentActivity; import androidx.preference.PreferenceScreen; import androidx.recyclerview.widget.RecyclerView; @@ -43,14 +42,17 @@ public class TopLevelHighlightMixin implements Parcelable, DialogInterface.OnSho private String mHiddenKey; private DialogInterface mDialog; private HighlightableTopLevelPreferenceAdapter mTopLevelAdapter; + private boolean mActivityEmbedded; - public TopLevelHighlightMixin() { + public TopLevelHighlightMixin(boolean activityEmbedded) { + mActivityEmbedded = activityEmbedded; } public TopLevelHighlightMixin(Parcel source) { mCurrentKey = source.readString(); mPreviousKey = source.readString(); mHiddenKey = source.readString(); + mActivityEmbedded = source.readBoolean(); } @Override @@ -58,6 +60,7 @@ public class TopLevelHighlightMixin implements Parcelable, DialogInterface.OnSho dest.writeString(mCurrentKey); dest.writeString(mPreviousKey); dest.writeString(mHiddenKey); + dest.writeBoolean(mActivityEmbedded); } @Override @@ -96,8 +99,16 @@ public class TopLevelHighlightMixin implements Parcelable, DialogInterface.OnSho } } + void setActivityEmbedded(boolean activityEmbedded) { + mActivityEmbedded = activityEmbedded; + } + + boolean isActivityEmbedded() { + return mActivityEmbedded; + } + RecyclerView.Adapter onCreateAdapter(TopLevelSettings topLevelSettings, - PreferenceScreen preferenceScreen) { + PreferenceScreen preferenceScreen, boolean scrollNeeded) { if (TextUtils.isEmpty(mCurrentKey)) { mCurrentKey = getHighlightPrefKeyFromArguments(topLevelSettings.getArguments()); } @@ -105,7 +116,7 @@ public class TopLevelHighlightMixin implements Parcelable, DialogInterface.OnSho Log.d(TAG, "onCreateAdapter, pref key: " + mCurrentKey); mTopLevelAdapter = new HighlightableTopLevelPreferenceAdapter( (SettingsHomepageActivity) topLevelSettings.getActivity(), preferenceScreen, - topLevelSettings.getListView(), mCurrentKey); + topLevelSettings.getListView(), mCurrentKey, scrollNeeded); return mTopLevelAdapter; } @@ -129,7 +140,7 @@ public class TopLevelHighlightMixin implements Parcelable, DialogInterface.OnSho } } - void highlightPreferenceIfNeeded(FragmentActivity activity) { + void highlightPreferenceIfNeeded() { if (mTopLevelAdapter != null) { mTopLevelAdapter.requestHighlight(); } diff --git a/src/com/android/settings/homepage/TopLevelSettings.java b/src/com/android/settings/homepage/TopLevelSettings.java index 734e079537d..26fa4ed298a 100644 --- a/src/com/android/settings/homepage/TopLevelSettings.java +++ b/src/com/android/settings/homepage/TopLevelSettings.java @@ -58,6 +58,7 @@ public class TopLevelSettings extends DashboardFragment implements private boolean mIsEmbeddingActivityEnabled; private TopLevelHighlightMixin mHighlightMixin; + private boolean mScrollNeeded = true; private boolean mFirstStarted = true; public TopLevelSettings() { @@ -133,11 +134,14 @@ public class TopLevelSettings extends DashboardFragment implements return; } + boolean activityEmbedded = SplitController.getInstance().isActivityEmbedded(getActivity()); if (icicle != null) { mHighlightMixin = icicle.getParcelable(SAVED_HIGHLIGHT_MIXIN); + mScrollNeeded = !mHighlightMixin.isActivityEmbedded() && activityEmbedded; + mHighlightMixin.setActivityEmbedded(activityEmbedded); } if (mHighlightMixin == null) { - mHighlightMixin = new TopLevelHighlightMixin(); + mHighlightMixin = new TopLevelHighlightMixin(activityEmbedded); } } @@ -201,7 +205,7 @@ public class TopLevelSettings extends DashboardFragment implements @Override public void highlightPreferenceIfNeeded() { if (mHighlightMixin != null) { - mHighlightMixin.highlightPreferenceIfNeeded(getActivity()); + mHighlightMixin.highlightPreferenceIfNeeded(); } } @@ -243,7 +247,7 @@ public class TopLevelSettings extends DashboardFragment implements if (!mIsEmbeddingActivityEnabled || !(getActivity() instanceof SettingsHomepageActivity)) { return super.onCreateAdapter(preferenceScreen); } - return mHighlightMixin.onCreateAdapter(this, preferenceScreen); + return mHighlightMixin.onCreateAdapter(this, preferenceScreen, mScrollNeeded); } @Override diff --git a/src/com/android/settings/widget/HighlightableTopLevelPreferenceAdapter.java b/src/com/android/settings/widget/HighlightableTopLevelPreferenceAdapter.java index ddd57f3a76d..911aabb13b8 100644 --- a/src/com/android/settings/widget/HighlightableTopLevelPreferenceAdapter.java +++ b/src/com/android/settings/widget/HighlightableTopLevelPreferenceAdapter.java @@ -67,10 +67,12 @@ public class HighlightableTopLevelPreferenceAdapter extends PreferenceGroupAdapt private SparseArray mViewHolders; public HighlightableTopLevelPreferenceAdapter(SettingsHomepageActivity homepageActivity, - PreferenceGroup preferenceGroup, RecyclerView recyclerView, String key) { + PreferenceGroup preferenceGroup, RecyclerView recyclerView, String key, + boolean scrollNeeded) { super(preferenceGroup); mRecyclerView = recyclerView; mHighlightKey = key; + mScrolled = !scrollNeeded; mViewHolders = new SparseArray<>(); mContext = preferenceGroup.getContext(); mHomepageActivity = homepageActivity; From d45b5275d1c352bd24432877fbec95872f6a6dc0 Mon Sep 17 00:00:00 2001 From: Mill Chen Date: Sat, 5 Mar 2022 22:45:50 +0800 Subject: [PATCH 04/15] Update animation on storage item To prevent the flicker happening, the animation is being applied to both progress bar and storage size info in the storage item. Bug: 222421324 Test: manual test 1) Install memory fill 2) Increase storage size using memory fill 3) Navigate to Settings > Storage 3) Check the progress bar and size info has animation when updating Change-Id: I4583358697afd416bc20cafac3ff89361397b6b9 --- .../deviceinfo/StorageItemPreference.java | 44 +++++++++++++++---- .../StorageItemPreferenceController.java | 22 ++++++---- 2 files changed, 49 insertions(+), 17 deletions(-) diff --git a/src/com/android/settings/deviceinfo/StorageItemPreference.java b/src/com/android/settings/deviceinfo/StorageItemPreference.java index d3549d45061..91102a031eb 100644 --- a/src/com/android/settings/deviceinfo/StorageItemPreference.java +++ b/src/com/android/settings/deviceinfo/StorageItemPreference.java @@ -16,6 +16,8 @@ package com.android.settings.deviceinfo; +import android.animation.TypeEvaluator; +import android.animation.ValueAnimator; import android.content.Context; import android.util.AttributeSet; import android.widget.ProgressBar; @@ -30,6 +32,7 @@ public class StorageItemPreference extends Preference { public int userHandle; private static final int UNINITIALIZED = -1; + private static final int ANIMATE_DURATION_IN_MILLIS = 1000; private ProgressBar mProgressBar; private static final int PROGRESS_MAX = 100; @@ -46,15 +49,33 @@ public class StorageItemPreference extends Preference { } public void setStorageSize(long size, long total) { - mStorageSize = size; - setSummary(StorageUtils.getStorageSizeLabel(getContext(), size)); + setStorageSize(size, total, false /* animate */); + } - if (total == 0) { - mProgressPercent = 0; + /** + * Set the storage size info with/without animation + */ + public void setStorageSize(long size, long total, boolean animate) { + if (animate) { + TypeEvaluator longEvaluator = + (fraction, startValue, endValue) -> { + // Directly returns end value if fraction is 1.0 and the end value is 0. + if (fraction >= 1.0f && endValue == 0) { + return endValue; + } + return startValue + (long) (fraction * (endValue - startValue)); + }; + ValueAnimator valueAnimator = ValueAnimator.ofObject(longEvaluator, mStorageSize, size); + valueAnimator.setDuration(ANIMATE_DURATION_IN_MILLIS); + valueAnimator.addUpdateListener( + animation -> { + updateProgressBarAndSizeInfo((long) animation.getAnimatedValue(), total); + }); + valueAnimator.start(); } else { - mProgressPercent = (int)(size * PROGRESS_MAX / total); + updateProgressBarAndSizeInfo(size, total); } - updateProgressBar(); + mStorageSize = size; } public long getStorageSize() { @@ -62,11 +83,18 @@ public class StorageItemPreference extends Preference { } protected void updateProgressBar() { - if (mProgressBar == null || mProgressPercent == UNINITIALIZED) + if (mProgressBar == null || mProgressPercent == UNINITIALIZED) { return; + } mProgressBar.setMax(PROGRESS_MAX); - mProgressBar.setProgress(mProgressPercent, true /* animate */); + mProgressBar.setProgress(mProgressPercent); + } + + private void updateProgressBarAndSizeInfo(long size, long total) { + setSummary(StorageUtils.getStorageSizeLabel(getContext(), size)); + mProgressPercent = total == 0 ? 0 : (int) (size * PROGRESS_MAX / total); + updateProgressBar(); } @Override diff --git a/src/com/android/settings/deviceinfo/storage/StorageItemPreferenceController.java b/src/com/android/settings/deviceinfo/storage/StorageItemPreferenceController.java index 9813439b235..7e27414ec2d 100644 --- a/src/com/android/settings/deviceinfo/storage/StorageItemPreferenceController.java +++ b/src/com/android/settings/deviceinfo/storage/StorageItemPreferenceController.java @@ -378,18 +378,22 @@ public class StorageItemPreferenceController extends AbstractPreferenceControlle */ public void onLoadFinished(@Nullable SparseArray result, int userId) { + // Enable animation when the storage size info is from StorageAsyncLoader whereas disable + // animation when the cached storage size info is used instead. + boolean animate = result != null && mIsPreferenceOrderedBySize; // Calculate the size info for each category StorageCacheHelper.StorageCache storageCache = getSizeInfo(result, userId); // Set size info to each preference - mImagesPreference.setStorageSize(storageCache.imagesSize, mTotalSize); - mVideosPreference.setStorageSize(storageCache.videosSize, mTotalSize); - mAudioPreference.setStorageSize(storageCache.audioSize, mTotalSize); - mAppsPreference.setStorageSize(storageCache.allAppsExceptGamesSize, mTotalSize); - mGamesPreference.setStorageSize(storageCache.gamesSize, mTotalSize); - mDocumentsAndOtherPreference.setStorageSize(storageCache.documentsAndOtherSize, mTotalSize); - mTrashPreference.setStorageSize(storageCache.trashSize, mTotalSize); + mImagesPreference.setStorageSize(storageCache.imagesSize, mTotalSize, animate); + mVideosPreference.setStorageSize(storageCache.videosSize, mTotalSize, animate); + mAudioPreference.setStorageSize(storageCache.audioSize, mTotalSize, animate); + mAppsPreference.setStorageSize(storageCache.allAppsExceptGamesSize, mTotalSize, animate); + mGamesPreference.setStorageSize(storageCache.gamesSize, mTotalSize, animate); + mDocumentsAndOtherPreference.setStorageSize(storageCache.documentsAndOtherSize, mTotalSize, + animate); + mTrashPreference.setStorageSize(storageCache.trashSize, mTotalSize, animate); if (mSystemPreference != null) { - mSystemPreference.setStorageSize(storageCache.systemSize, mTotalSize); + mSystemPreference.setStorageSize(storageCache.systemSize, mTotalSize, animate); } // Cache the size info if (result != null) { @@ -519,7 +523,7 @@ public class StorageItemPreferenceController extends AbstractPreferenceControlle if (mTrashPreference == null) { return; } - mTrashPreference.setStorageSize(0, mTotalSize); + mTrashPreference.setStorageSize(0, mTotalSize, true /* animate */); updatePrivateStorageCategoryPreferencesOrder(); } From 9a845de9145bd7a3823aa82a9d7a7b9979b8dfb1 Mon Sep 17 00:00:00 2001 From: Peter_Liang Date: Mon, 14 Mar 2022 18:55:22 +0800 Subject: [PATCH 05/15] Fix that the toggle of High contrast text doesn't change to turn off after tapping the Reset button. Solution: Triggered the updateState() after setChecked() to ensure the UI with the correct state. Fix: 220081053 Test: atest HighTextContrastPreferenceControllerTest Change-Id: I33c61d4e5602dfd67ec93a0826613304a1af7c2d --- .../HighTextContrastPreferenceController.java | 11 +++++++++++ ...ighTextContrastPreferenceControllerTest.java | 17 ++++++++++++++++- 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/src/com/android/settings/accessibility/HighTextContrastPreferenceController.java b/src/com/android/settings/accessibility/HighTextContrastPreferenceController.java index aad69b99344..8c9d2340f54 100644 --- a/src/com/android/settings/accessibility/HighTextContrastPreferenceController.java +++ b/src/com/android/settings/accessibility/HighTextContrastPreferenceController.java @@ -19,6 +19,9 @@ package com.android.settings.accessibility; import android.content.Context; import android.provider.Settings; +import androidx.preference.PreferenceScreen; +import androidx.preference.SwitchPreference; + import com.android.settings.R; import com.android.settings.core.TogglePreferenceController; @@ -27,6 +30,7 @@ import com.android.settings.core.TogglePreferenceController; */ public class HighTextContrastPreferenceController extends TogglePreferenceController implements TextReadingResetController.ResetStateListener { + private SwitchPreference mSwitchPreference; public HighTextContrastPreferenceController(Context context, String preferenceKey) { super(context, preferenceKey); @@ -54,8 +58,15 @@ public class HighTextContrastPreferenceController extends TogglePreferenceContro return R.string.menu_key_accessibility; } + @Override + public void displayPreference(PreferenceScreen screen) { + super.displayPreference(screen); + mSwitchPreference = screen.findPreference(getPreferenceKey()); + } + @Override public void resetState() { setChecked(false); + updateState(mSwitchPreference); } } diff --git a/tests/unit/src/com/android/settings/accessibility/HighTextContrastPreferenceControllerTest.java b/tests/unit/src/com/android/settings/accessibility/HighTextContrastPreferenceControllerTest.java index 1ada051f073..9c4df36cc2f 100644 --- a/tests/unit/src/com/android/settings/accessibility/HighTextContrastPreferenceControllerTest.java +++ b/tests/unit/src/com/android/settings/accessibility/HighTextContrastPreferenceControllerTest.java @@ -19,8 +19,11 @@ package com.android.settings.accessibility; import static com.google.common.truth.Truth.assertThat; import android.content.Context; +import android.os.Looper; import android.provider.Settings; +import androidx.preference.PreferenceManager; +import androidx.preference.PreferenceScreen; import androidx.preference.SwitchPreference; import androidx.test.core.app.ApplicationProvider; import androidx.test.ext.junit.runners.AndroidJUnit4; @@ -37,6 +40,7 @@ import org.junit.runner.RunWith; @RunWith(AndroidJUnit4.class) public class HighTextContrastPreferenceControllerTest { + private static final String PREF_KEY = "text_contrast"; private static final int ON = 1; private static final int OFF = 0; private static final int UNKNOWN = -1; @@ -44,12 +48,20 @@ public class HighTextContrastPreferenceControllerTest { private Context mContext; private SwitchPreference mPreference; private HighTextContrastPreferenceController mController; + private PreferenceScreen mScreen; @Before public void setUp() { mContext = ApplicationProvider.getApplicationContext(); + if (Looper.myLooper() == null) { + Looper.prepare(); + } + final PreferenceManager preferenceManager = new PreferenceManager(mContext); + mScreen = preferenceManager.createPreferenceScreen(mContext); mPreference = new SwitchPreference(mContext); - mController = new HighTextContrastPreferenceController(mContext, "text_contrast"); + mPreference.setKey(PREF_KEY); + mScreen.addPreference(mPreference); + mController = new HighTextContrastPreferenceController(mContext, PREF_KEY); } @Test @@ -99,10 +111,13 @@ public class HighTextContrastPreferenceControllerTest { @Test public void resetState_shouldDisableTextContrast() { + mController.displayPreference(mScreen); mController.setChecked(true); + mPreference.setChecked(true); mController.resetState(); + assertThat(mPreference.isChecked()).isFalse(); assertThat(Settings.Secure.getInt(mContext.getContentResolver(), Settings.Secure.ACCESSIBILITY_HIGH_TEXT_CONTRAST_ENABLED, UNKNOWN)).isEqualTo(OFF); } From 54b7d84212b27bfa4246edbdf44c37ffba6c7fe4 Mon Sep 17 00:00:00 2001 From: Joshua Mccloskey Date: Mon, 14 Mar 2022 23:36:43 +0000 Subject: [PATCH 06/15] Updated fp enrollment to have 5 enroll stages. Test: Verified with multiple devices that there are now 5 stages for UDFPS enrollment. Fixes: 222587017 Change-Id: I60780553894880f8e5301303f9be6b0cbb84651f --- ....json => udfps_left_edge_hint_lottie.json} | 0 res/raw/udfps_right_edge_hint_lottie.json | 0 .../FingerprintEnrollEnrolling.java | 40 +++++++++++++++---- 3 files changed, 32 insertions(+), 8 deletions(-) rename res/raw/{udfps_edge_hint_lottie.json => udfps_left_edge_hint_lottie.json} (100%) create mode 100644 res/raw/udfps_right_edge_hint_lottie.json diff --git a/res/raw/udfps_edge_hint_lottie.json b/res/raw/udfps_left_edge_hint_lottie.json similarity index 100% rename from res/raw/udfps_edge_hint_lottie.json rename to res/raw/udfps_left_edge_hint_lottie.json diff --git a/res/raw/udfps_right_edge_hint_lottie.json b/res/raw/udfps_right_edge_hint_lottie.json new file mode 100644 index 00000000000..e69de29bb2d diff --git a/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrolling.java b/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrolling.java index d42e8f1c3aa..70140c42c8c 100644 --- a/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrolling.java +++ b/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrolling.java @@ -81,9 +81,11 @@ public class FingerprintEnrollEnrolling extends BiometricsEnrollEnrolling { private static final int STAGE_CENTER = 0; private static final int STAGE_GUIDED = 1; private static final int STAGE_FINGERTIP = 2; - private static final int STAGE_EDGES = 3; + private static final int STAGE_LEFT_EDGE = 3; + private static final int STAGE_RIGHT_EDGE = 4; - @IntDef({STAGE_UNKNOWN, STAGE_CENTER, STAGE_GUIDED, STAGE_FINGERTIP, STAGE_EDGES}) + @IntDef({STAGE_UNKNOWN, STAGE_CENTER, STAGE_GUIDED, STAGE_FINGERTIP, STAGE_LEFT_EDGE, + STAGE_RIGHT_EDGE}) @Retention(RetentionPolicy.SOURCE) private @interface EnrollStage {} @@ -132,7 +134,8 @@ public class FingerprintEnrollEnrolling extends BiometricsEnrollEnrolling { private boolean mIsAccessibilityEnabled; private LottieAnimationView mIllustrationLottie; private boolean mHaveShownUdfpsTipLottie; - private boolean mHaveShownUdfpsSideLottie; + private boolean mHaveShownUdfpsLeftEdgeLottie; + private boolean mHaveShownUdfpsRightEdgeLottie; private boolean mShouldShowLottie; private OrientationEventListener mOrientationEventListener; @@ -372,12 +375,31 @@ public class FingerprintEnrollEnrolling extends BiometricsEnrollEnrolling { } break; - case STAGE_EDGES: + case STAGE_LEFT_EDGE: setHeaderText(R.string.security_settings_udfps_enroll_edge_title); - if (!mHaveShownUdfpsSideLottie && mIllustrationLottie != null) { - mHaveShownUdfpsSideLottie = true; + if (!mHaveShownUdfpsLeftEdgeLottie && mIllustrationLottie != null) { + mHaveShownUdfpsLeftEdgeLottie = true; setDescriptionText(""); - mIllustrationLottie.setAnimation(R.raw.udfps_edge_hint_lottie); + mIllustrationLottie.setAnimation(R.raw.udfps_left_edge_hint_lottie); + mIllustrationLottie.setVisibility(View.VISIBLE); + mIllustrationLottie.playAnimation(); + mIllustrationLottie.setContentDescription( + getString(R.string.security_settings_udfps_side_fingerprint_help)); + } else if (mIllustrationLottie == null) { + if (isStageHalfCompleted()) { + setDescriptionText( + R.string.security_settings_fingerprint_enroll_repeat_message); + } else { + setDescriptionText(R.string.security_settings_udfps_enroll_edge_message); + } + } + break; + case STAGE_RIGHT_EDGE: + setHeaderText(R.string.security_settings_udfps_enroll_edge_title); + if (!mHaveShownUdfpsRightEdgeLottie && mIllustrationLottie != null) { + mHaveShownUdfpsRightEdgeLottie = true; + setDescriptionText(""); + mIllustrationLottie.setAnimation(R.raw.udfps_right_edge_hint_lottie); mIllustrationLottie.setVisibility(View.VISIBLE); mIllustrationLottie.playAnimation(); mIllustrationLottie.setContentDescription( @@ -422,8 +444,10 @@ public class FingerprintEnrollEnrolling extends BiometricsEnrollEnrolling { return STAGE_GUIDED; } else if (progressSteps < getStageThresholdSteps(2)) { return STAGE_FINGERTIP; + } else if (progressSteps < getStageThresholdSteps(3)) { + return STAGE_LEFT_EDGE; } else { - return STAGE_EDGES; + return STAGE_RIGHT_EDGE; } } From 4e255cb40724e0f00f70d2535da7db95d5f5ce10 Mon Sep 17 00:00:00 2001 From: Yuri Ufimtsev Date: Tue, 15 Mar 2022 15:23:07 +0000 Subject: [PATCH 07/15] Set the Refresh Broadcast ID for Safety Event if available Test: atest SettingsUnitTests Bug: 222679576 Change-Id: I52ba3aff3045a8211fc936240f1310da6fad9fb0 --- .../SafetySourceBroadcastReceiver.java | 10 +++++--- .../SafetySourceBroadcastReceiverTest.java | 24 +++++++++++++++++++ 2 files changed, 31 insertions(+), 3 deletions(-) diff --git a/src/com/android/settings/safetycenter/SafetySourceBroadcastReceiver.java b/src/com/android/settings/safetycenter/SafetySourceBroadcastReceiver.java index 38458d92571..dec06b02e79 100644 --- a/src/com/android/settings/safetycenter/SafetySourceBroadcastReceiver.java +++ b/src/com/android/settings/safetycenter/SafetySourceBroadcastReceiver.java @@ -26,6 +26,7 @@ import android.app.settings.SettingsEnums; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; +import android.safetycenter.SafetyCenterManager; import android.safetycenter.SafetyEvent; import com.android.settings.security.ScreenLockPreferenceDetailsUtils; @@ -37,8 +38,6 @@ import java.util.List; /** Broadcast receiver for handling requests from Safety Center for fresh data. */ public class SafetySourceBroadcastReceiver extends BroadcastReceiver { - private static final SafetyEvent EVENT_REFRESH_REQUESTED = - new SafetyEvent.Builder(SAFETY_EVENT_TYPE_REFRESH_REQUESTED).build(); private static final SafetyEvent EVENT_DEVICE_REBOOTED = new SafetyEvent.Builder(SAFETY_EVENT_TYPE_DEVICE_REBOOTED).build(); @@ -52,10 +51,15 @@ public class SafetySourceBroadcastReceiver extends BroadcastReceiver { String[] sourceIdsExtra = intent.getStringArrayExtra(EXTRA_REFRESH_SAFETY_SOURCE_IDS); if (sourceIdsExtra != null && sourceIdsExtra.length > 0) { + final String refreshBroadcastId = intent.getStringExtra( + SafetyCenterManager.EXTRA_REFRESH_SAFETY_SOURCES_BROADCAST_ID); + final SafetyEvent safetyEvent = new SafetyEvent.Builder( + SAFETY_EVENT_TYPE_REFRESH_REQUESTED) + .setRefreshBroadcastId(refreshBroadcastId).build(); refreshSafetySources( context, ImmutableList.copyOf(sourceIdsExtra), - EVENT_REFRESH_REQUESTED); + safetyEvent); } return; } diff --git a/tests/unit/src/com/android/settings/safetycenter/SafetySourceBroadcastReceiverTest.java b/tests/unit/src/com/android/settings/safetycenter/SafetySourceBroadcastReceiverTest.java index 8a4214ced2e..8004d600e9e 100644 --- a/tests/unit/src/com/android/settings/safetycenter/SafetySourceBroadcastReceiverTest.java +++ b/tests/unit/src/com/android/settings/safetycenter/SafetySourceBroadcastReceiverTest.java @@ -17,6 +17,7 @@ package com.android.settings.safetycenter; import static android.safetycenter.SafetyCenterManager.ACTION_REFRESH_SAFETY_SOURCES; +import static android.safetycenter.SafetyCenterManager.EXTRA_REFRESH_SAFETY_SOURCES_BROADCAST_ID; import static android.safetycenter.SafetyCenterManager.EXTRA_REFRESH_SAFETY_SOURCE_IDS; import static android.safetycenter.SafetyEvent.SAFETY_EVENT_TYPE_DEVICE_REBOOTED; import static android.safetycenter.SafetyEvent.SAFETY_EVENT_TYPE_REFRESH_REQUESTED; @@ -147,6 +148,29 @@ public class SafetySourceBroadcastReceiverTest { new SafetyEvent.Builder(SAFETY_EVENT_TYPE_REFRESH_REQUESTED).build()); } + @Test + public void onReceive_onRefreshWithBroadcastId_setsRefreshEventWithBroadcastId() { + final String refreshBroadcastId = "REFRESH_BROADCAST_ID"; + when(mSafetyCenterManagerWrapper.isEnabled(mApplicationContext)).thenReturn(true); + Intent intent = + new Intent() + .setAction(ACTION_REFRESH_SAFETY_SOURCES) + .putExtra( + EXTRA_REFRESH_SAFETY_SOURCE_IDS, + new String[]{ LockScreenSafetySource.SAFETY_SOURCE_ID }) + .putExtra(EXTRA_REFRESH_SAFETY_SOURCES_BROADCAST_ID, refreshBroadcastId); + + new SafetySourceBroadcastReceiver().onReceive(mApplicationContext, intent); + ArgumentCaptor captor = ArgumentCaptor.forClass(SafetyEvent.class); + verify(mSafetyCenterManagerWrapper, times(1)) + .setSafetySourceData(any(), any(), any(), captor.capture()); + + assertThat(captor.getValue().getRefreshBroadcastId()).isEqualTo(refreshBroadcastId); + assertThat(captor.getValue()).isEqualTo( + new SafetyEvent.Builder(SAFETY_EVENT_TYPE_REFRESH_REQUESTED) + .setRefreshBroadcastId(refreshBroadcastId).build()); + } + @Test public void onReceive_onRefresh_withLockscreenSourceId_setsLockscreenData() { when(mSafetyCenterManagerWrapper.isEnabled(mApplicationContext)).thenReturn(true); From 8339724c21ca2648eba6dea97120bc3c479ca397 Mon Sep 17 00:00:00 2001 From: SongFerngWang Date: Thu, 10 Mar 2022 23:43:20 +0800 Subject: [PATCH 08/15] [LE]Gray out the a2dp and hfp when LeAudio is enabled 1.Gray out the a2dp and hfp when le audio is enabled 2.When the user disables le audio, then the settings turn on the a2dp and hfp 3.When the user enables le audio, then the settings turn off the a2dp and hfp Bug: 218626162 Test: build pass. Change-Id: Ic728749112b0047cac291600b3279b9dedbf0b5a --- .../BluetoothDetailsProfilesController.java | 215 +++++++++++++++++- 1 file changed, 207 insertions(+), 8 deletions(-) diff --git a/src/com/android/settings/bluetooth/BluetoothDetailsProfilesController.java b/src/com/android/settings/bluetooth/BluetoothDetailsProfilesController.java index aacf41fbbc9..b57ea928d99 100644 --- a/src/com/android/settings/bluetooth/BluetoothDetailsProfilesController.java +++ b/src/com/android/settings/bluetooth/BluetoothDetailsProfilesController.java @@ -16,10 +16,12 @@ package com.android.settings.bluetooth; +import android.bluetooth.BluetoothCsipSetCoordinator; import android.bluetooth.BluetoothDevice; import android.bluetooth.BluetoothProfile; import android.content.Context; import android.text.TextUtils; +import android.util.Log; import androidx.annotation.VisibleForTesting; import androidx.preference.Preference; @@ -31,6 +33,7 @@ import androidx.preference.SwitchPreference; import com.android.settings.R; import com.android.settingslib.bluetooth.A2dpProfile; import com.android.settingslib.bluetooth.CachedBluetoothDevice; +import com.android.settingslib.bluetooth.LeAudioProfile; import com.android.settingslib.bluetooth.LocalBluetoothManager; import com.android.settingslib.bluetooth.LocalBluetoothProfile; import com.android.settingslib.bluetooth.LocalBluetoothProfileManager; @@ -39,7 +42,10 @@ import com.android.settingslib.bluetooth.PanProfile; import com.android.settingslib.bluetooth.PbapServerProfile; import com.android.settingslib.core.lifecycle.Lifecycle; +import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; /** * This class adds switches for toggling the individual profiles that a Bluetooth device @@ -48,8 +54,11 @@ import java.util.List; public class BluetoothDetailsProfilesController extends BluetoothDetailsController implements Preference.OnPreferenceClickListener, LocalBluetoothProfileManager.ServiceListener { + private static final String TAG = "BtDetailsProfilesCtrl"; + private static final String KEY_PROFILES_GROUP = "bluetooth_profiles"; private static final String KEY_BOTTOM_PREFERENCE = "bottom_preference"; + private static final String HEADSET_CLIENT = "HEADSET_CLIENT"; private static final int ORDINAL = 99; @VisibleForTesting @@ -58,6 +67,9 @@ public class BluetoothDetailsProfilesController extends BluetoothDetailsControll private LocalBluetoothManager mManager; private LocalBluetoothProfileManager mProfileManager; private CachedBluetoothDevice mCachedDevice; + private List mAllOfCachedDevices; + private Map> mProfileDeviceMap = + new HashMap>(); @VisibleForTesting PreferenceCategory mProfilesContainer; @@ -68,6 +80,7 @@ public class BluetoothDetailsProfilesController extends BluetoothDetailsControll mManager = manager; mProfileManager = mManager.getProfileManager(); mCachedDevice = device; + mAllOfCachedDevices = getAllOfCachedBluetoothDevices(); lifecycle.addObserver(this); } @@ -100,11 +113,66 @@ public class BluetoothDetailsProfilesController extends BluetoothDetailsControll /** * Refreshes the state for an existing SwitchPreference for a profile. + * If the LeAudio profile is enabled on the LeAudio devices, then the SwitchPreferences of + * A2dp profile and Hfp profile are graied out. */ private void refreshProfilePreference(SwitchPreference profilePref, LocalBluetoothProfile profile) { BluetoothDevice device = mCachedDevice.getDevice(); - profilePref.setEnabled(!mCachedDevice.isBusy()); + boolean isLeAudioEnabled = false; + if (profile instanceof A2dpProfile || HEADSET_CLIENT.equals(profile.toString())) { + LocalBluetoothProfile leAudio = mProfileManager.getLeAudioProfile(); + if (leAudio != null) { + List leAudioDeviceList = mProfileDeviceMap.get( + leAudio.toString()); + if (leAudioDeviceList != null + && leAudioDeviceList.stream() + .anyMatch(item -> leAudio.isEnabled(item.getDevice()))) { + isLeAudioEnabled = true; + } + } + if (isLeAudioEnabled) { + // If the LeAudio profile is enabled on the LeAudio devices, then the + // SwitchPreferences of A2dp profile and Hfp profile are graied out. + profilePref.setEnabled(false); + } else { + List deviceList = mProfileDeviceMap.get( + profile.toString()); + boolean isBusy = deviceList != null + && deviceList.stream().anyMatch(item -> item.isBusy()); + profilePref.setEnabled(!isBusy); + } + } else if (profile instanceof LeAudioProfile) { + List leAudioDeviceList = mProfileDeviceMap.get( + profile.toString()); + boolean isLeAudioProfileEnable = + leAudioDeviceList != null && leAudioDeviceList.stream().anyMatch( + item -> profile.isEnabled(item.getDevice())); + boolean isBusy = leAudioDeviceList != null + && leAudioDeviceList.stream().anyMatch(item -> item.isBusy()); + if (isLeAudioProfileEnable && !isBusy) { + LocalBluetoothProfile a2dp = mProfileManager.getA2dpProfile(); + LocalBluetoothProfile hfp = mProfileManager.getHfpClientProfile(); + // If the LeAudio profile is enabled on the LeAudio devices, then the + // SwitchPreferences of A2dp profile and Hfp profile are graied out. + if (a2dp != null) { + SwitchPreference pref = mProfilesContainer.findPreference(a2dp.toString()); + if (pref != null) { + pref.setEnabled(false); + } + } + if (hfp != null) { + SwitchPreference pref = mProfilesContainer.findPreference(hfp.toString()); + if (pref != null) { + pref.setEnabled(false); + } + } + } + profilePref.setEnabled(!isBusy); + } else { + profilePref.setEnabled(!mCachedDevice.isBusy()); + } + if (profile instanceof MapProfile) { profilePref.setChecked(device.getMessageAccessPermission() == BluetoothDevice.ACCESS_ALLOWED); @@ -127,7 +195,7 @@ public class BluetoothDetailsProfilesController extends BluetoothDetailsControll highQualityPref.setVisible(true); highQualityPref.setTitle(a2dp.getHighQualityAudioOptionLabel(device)); highQualityPref.setChecked(a2dp.isHighQualityAudioEnabled(device)); - highQualityPref.setEnabled(!mCachedDevice.isBusy()); + highQualityPref.setEnabled(!mCachedDevice.isBusy() && !isLeAudioEnabled); } else { highQualityPref.setVisible(false); } @@ -148,6 +216,12 @@ public class BluetoothDetailsProfilesController extends BluetoothDetailsControll if (profile instanceof MapProfile) { bluetoothDevice.setMessageAccessPermission(BluetoothDevice.ACCESS_ALLOWED); } + + if (profile instanceof LeAudioProfile) { + enableLeAudioProfile(profile); + return; + } + profile.setEnabled(bluetoothDevice, true); } @@ -155,8 +229,14 @@ public class BluetoothDetailsProfilesController extends BluetoothDetailsControll * Helper method to disable a profile for a device */ private void disableProfile(LocalBluetoothProfile profile) { + if (profile instanceof LeAudioProfile) { + disableLeAudioProfile(profile); + return; + } + final BluetoothDevice bluetoothDevice = mCachedDevice.getDevice(); profile.setEnabled(bluetoothDevice, false); + if (profile instanceof MapProfile) { bluetoothDevice.setMessageAccessPermission(BluetoothDevice.ACCESS_REJECTED); } else if (profile instanceof PbapServerProfile) { @@ -190,14 +270,33 @@ public class BluetoothDetailsProfilesController extends BluetoothDetailsControll return true; } - /** * Helper to get the list of connectable and special profiles. */ private List getProfiles() { - List result = mCachedDevice.getConnectableProfiles(); - final BluetoothDevice device = mCachedDevice.getDevice(); + List result = new ArrayList(); + mProfileDeviceMap.clear(); + if (mAllOfCachedDevices == null || mAllOfCachedDevices.isEmpty()) { + return result; + } + for (CachedBluetoothDevice cachedItem : mAllOfCachedDevices) { + List tmpResult = cachedItem.getConnectableProfiles(); + for (LocalBluetoothProfile profile : tmpResult) { + if (mProfileDeviceMap.containsKey(profile.toString())) { + mProfileDeviceMap.get(profile.toString()).add(cachedItem); + Log.d(TAG, "getProfiles: " + profile.toString() + " add device " + + cachedItem.getDevice().getAnonymizedAddress()); + } else { + List tmpCachedDeviceList = + new ArrayList(); + tmpCachedDeviceList.add(cachedItem); + mProfileDeviceMap.put(profile.toString(), tmpCachedDeviceList); + result.add(profile); + } + } + } + final BluetoothDevice device = mCachedDevice.getDevice(); final int pbapPermission = device.getPhonebookAccessPermission(); // Only provide PBAP cabability if the client device has requested PBAP. if (pbapPermission != BluetoothDevice.ACCESS_UNKNOWN) { @@ -210,10 +309,93 @@ public class BluetoothDetailsProfilesController extends BluetoothDetailsControll if (mapPermission != BluetoothDevice.ACCESS_UNKNOWN) { result.add(mapProfile); } - + Log.d(TAG, "getProfiles:result:" + result); return result; } + private List getAllOfCachedBluetoothDevices() { + List cachedBluetoothDevices = new ArrayList<>(); + if (mCachedDevice == null) { + return cachedBluetoothDevices; + } + cachedBluetoothDevices.add(mCachedDevice); + if (mCachedDevice.getGroupId() != BluetoothCsipSetCoordinator.GROUP_ID_INVALID) { + for (CachedBluetoothDevice member : mCachedDevice.getMemberDevice()) { + cachedBluetoothDevices.add(member); + } + } + return cachedBluetoothDevices; + } + + /** + * When user disable the Le Audio profile, the system needs to do two things. + * 1) Disable the Le Audio profile for each of the Le Audio devices. + * 2) Enable the A2dp profile and Hfp profile for the associated device. The system can't + * enable the A2dp profile and Hfp profile if the Le Audio profile is enabled. + * + * @param profile the LeAudio profile + */ + private void disableLeAudioProfile(LocalBluetoothProfile profile) { + if (profile == null || mProfileDeviceMap.get(profile.toString()) == null) { + Log.e(TAG, "There is no the LE profile or no device in mProfileDeviceMap. Do nothing."); + return; + } + for (CachedBluetoothDevice leAudioDevice : mProfileDeviceMap.get(profile.toString())) { + profile.setEnabled(leAudioDevice.getDevice(), false); + } + + LocalBluetoothProfile a2dp = mProfileManager.getA2dpProfile(); + LocalBluetoothProfile hfp = mProfileManager.getHfpClientProfile(); + if (a2dp != null && mProfileDeviceMap.get(a2dp.toString()) != null) { + for (CachedBluetoothDevice a2dpDevice : mProfileDeviceMap.get(a2dp.toString())) { + if (!a2dp.isEnabled(a2dpDevice.getDevice())) { + a2dp.setEnabled(a2dpDevice.getDevice(), true); + } + } + } + if (hfp != null && mProfileDeviceMap.get(hfp.toString()) != null) { + for (CachedBluetoothDevice hfpDevice : mProfileDeviceMap.get(hfp.toString())) { + if (!hfp.isEnabled(hfpDevice.getDevice())) { + hfp.setEnabled(hfpDevice.getDevice(), true); + } + } + } + } + + /** + * When user enable the Le Audio profile, the system needs to do two things. + * 1) Disable the A2dp profile and Hfp profile for the associated device. The system can't + * enable the Le Audio if the A2dp profile and Hfp profile are enabled. + * 2) Enable the Le Audio profile for each of the Le Audio devices. + * + * @param profile the LeAudio profile + */ + private void enableLeAudioProfile(LocalBluetoothProfile profile) { + if (profile == null || mProfileDeviceMap.get(profile.toString()) == null) { + Log.e(TAG, "There is no the LE profile or no device in mProfileDeviceMap. Do nothing."); + return; + } + LocalBluetoothProfile a2dp = mProfileManager.getA2dpProfile(); + LocalBluetoothProfile hfp = mProfileManager.getHfpClientProfile(); + if (a2dp != null && mProfileDeviceMap.get(a2dp.toString()) != null) { + for (CachedBluetoothDevice a2dpDevice : mProfileDeviceMap.get(a2dp.toString())) { + if (a2dp.isEnabled(a2dpDevice.getDevice())) { + a2dp.setEnabled(a2dpDevice.getDevice(), false); + } + } + } + if (hfp != null && mProfileDeviceMap.get(hfp.toString()) != null) { + for (CachedBluetoothDevice hfpDevice : mProfileDeviceMap.get(hfp.toString())) { + if (hfp.isEnabled(hfpDevice.getDevice())) { + hfp.setEnabled(hfpDevice.getDevice(), false); + } + } + } + for (CachedBluetoothDevice leAudioDevice : mProfileDeviceMap.get(profile.toString())) { + profile.setEnabled(leAudioDevice.getDevice(), true); + } + } + /** * This is a helper method to be called after adding a Preference for a profile. If that * profile happened to be A2dp and the device supports high quality audio, it will add a @@ -243,16 +425,33 @@ public class BluetoothDetailsProfilesController extends BluetoothDetailsControll @Override public void onPause() { - super.onPause(); + for (CachedBluetoothDevice item : mAllOfCachedDevices) { + item.unregisterCallback(this); + } mProfileManager.removeServiceListener(this); } @Override public void onResume() { - super.onResume(); + for (CachedBluetoothDevice item : mAllOfCachedDevices) { + item.registerCallback(this); + } mProfileManager.addServiceListener(this); } + @Override + public void onDeviceAttributesChanged() { + for (CachedBluetoothDevice item : mAllOfCachedDevices) { + item.unregisterCallback(this); + } + mAllOfCachedDevices = getAllOfCachedBluetoothDevices(); + for (CachedBluetoothDevice item : mAllOfCachedDevices) { + item.registerCallback(this); + } + + super.onDeviceAttributesChanged(); + } + @Override public void onServiceConnected() { refresh(); From b21d2216ac3c9184b982f3ce246381ecccd2fcc3 Mon Sep 17 00:00:00 2001 From: Eric Biggers Date: Thu, 10 Mar 2022 21:50:30 +0000 Subject: [PATCH 09/15] Remove support for converting from FDE to FBE Devices that launched with Android 10 or later require FBE (File Based Encryption) from the beginning, so there's no need to support converting to FBE after the fact anymore. This was only ever a developer option, so it probably wasn't used much. And in any case, it's not used anymore, as isConvertibleToFBE() is hard-coded to return false. Besides the fact that FBE has been required for several releases now, this functionality was only ever available on devices that use FDE (Full Disk Encryption), but FDE support has been removed from Android. Therefore, remove this unused code. Bug: 208476087 Change-Id: Ia765d6827e6144153c4e2a253b146ef2c75ca6fe --- res/layout/confirm_convert_fbe.xml | 46 ------- res/layout/convert_fbe.xml | 46 ------- res/values/strings.xml | 5 - res/xml/development_settings.xml | 6 - .../applications/ConfirmConvertToFbe.java | 55 --------- .../settings/applications/ConvertToFbe.java | 97 --------------- .../DevelopmentSettingsDashboardFragment.java | 1 - .../FileEncryptionPreferenceController.java | 85 ------------- .../exempt_not_implementing_index_provider | 1 - ...ileEncryptionPreferenceControllerTest.java | 116 ------------------ 10 files changed, 458 deletions(-) delete mode 100644 res/layout/confirm_convert_fbe.xml delete mode 100644 res/layout/convert_fbe.xml delete mode 100644 src/com/android/settings/applications/ConfirmConvertToFbe.java delete mode 100644 src/com/android/settings/applications/ConvertToFbe.java delete mode 100644 src/com/android/settings/development/FileEncryptionPreferenceController.java delete mode 100644 tests/robotests/src/com/android/settings/development/FileEncryptionPreferenceControllerTest.java diff --git a/res/layout/confirm_convert_fbe.xml b/res/layout/confirm_convert_fbe.xml deleted file mode 100644 index 537c3680ba6..00000000000 --- a/res/layout/confirm_convert_fbe.xml +++ /dev/null @@ -1,46 +0,0 @@ - - - - - - - - -