From 5cc2488220367e1656c0d86d605a6f85d520566b Mon Sep 17 00:00:00 2001 From: Daniel Chapin Date: Tue, 14 Apr 2020 15:47:48 +0000 Subject: [PATCH 01/21] Revert "Don't write user_switcher_enabled value when enter this Settings" This reverts commit 898d6b4d73f40b08a91f69dbdf3b67550f1df198. Reason for revert: Causing a regression Bug: 153944718 Change-Id: If96441618d32a65b0bae4c5c26fb3b278556cc8c (cherry picked from commit 77c41c1a5ab0f9ea1a4f55f41ade1e3193bc6532) --- .../android/settings/users/MultiUserSwitchBarController.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/com/android/settings/users/MultiUserSwitchBarController.java b/src/com/android/settings/users/MultiUserSwitchBarController.java index 58de14963fa..a5fdf9b3279 100644 --- a/src/com/android/settings/users/MultiUserSwitchBarController.java +++ b/src/com/android/settings/users/MultiUserSwitchBarController.java @@ -52,6 +52,8 @@ public class MultiUserSwitchBarController implements SwitchWidgetController.OnSw mListener = listener; mUserCapabilities = UserCapabilities.create(context); mSwitchBar.setChecked(mUserCapabilities.mUserSwitcherEnabled); + Settings.Global.putInt(mContext.getContentResolver(), + Settings.Global.USER_SWITCHER_ENABLED, mSwitchBar.isChecked() ? 1 : 0); if (mUserCapabilities.mDisallowSwitchUser) { mSwitchBar.setDisabledByAdmin(RestrictedLockUtilsInternal From ade5a2a8ae6dd0938272a0a7645caf1495d9f374 Mon Sep 17 00:00:00 2001 From: Hugh Chen Date: Wed, 2 Sep 2020 17:00:13 +0800 Subject: [PATCH 02/21] Fix settings crash - This CL before, "Previously connected device" didn't handle dock device. If user have disconnected dock device will cause Settings crash. This CL add condition to handle dock device to avoid crash. - Update test case. Bug: 167054620 Test: make -j42 RunSettingsRoboTests Change-Id: I769cee3f589e14a993b00a0ae6ec3ddfba8ef281 (cherry picked from commit a6aae425bc95d5fda5ec57147d5062f973dd73f0) --- .../bluetooth/BluetoothDevicePreference.java | 14 +++- ...lyConnectedDevicePreferenceController.java | 70 ++++++++++++------- ...nnectedDevicePreferenceControllerTest.java | 18 +++++ 3 files changed, 75 insertions(+), 27 deletions(-) diff --git a/src/com/android/settings/bluetooth/BluetoothDevicePreference.java b/src/com/android/settings/bluetooth/BluetoothDevicePreference.java index 86b72ec3f94..2e4654c3994 100644 --- a/src/com/android/settings/bluetooth/BluetoothDevicePreference.java +++ b/src/com/android/settings/bluetooth/BluetoothDevicePreference.java @@ -96,7 +96,6 @@ public final class BluetoothDevicePreference extends GearPreference implements } mCachedDevice = cachedDevice; - mCachedDevice.registerCallback(this); mCurrentTime = System.currentTimeMillis(); mType = type; @@ -127,13 +126,24 @@ public final class BluetoothDevicePreference extends GearPreference implements @Override protected void onPrepareForRemoval() { super.onPrepareForRemoval(); - mCachedDevice.unregisterCallback(this); if (mDisconnectDialog != null) { mDisconnectDialog.dismiss(); mDisconnectDialog = null; } } + @Override + public void onAttached() { + super.onAttached(); + mCachedDevice.registerCallback(this); + } + + @Override + public void onDetached() { + super.onDetached(); + mCachedDevice.unregisterCallback(this); + } + public CachedBluetoothDevice getBluetoothDevice() { return mCachedDevice; } diff --git a/src/com/android/settings/connecteddevice/PreviouslyConnectedDevicePreferenceController.java b/src/com/android/settings/connecteddevice/PreviouslyConnectedDevicePreferenceController.java index 78791d4ebff..438a3815f9a 100644 --- a/src/com/android/settings/connecteddevice/PreviouslyConnectedDevicePreferenceController.java +++ b/src/com/android/settings/connecteddevice/PreviouslyConnectedDevicePreferenceController.java @@ -51,14 +51,15 @@ public class PreviouslyConnectedDevicePreferenceController extends BasePreferenc private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG); private static final int MAX_DEVICE_NUM = 3; + private static final int DOCK_DEVICE_INDEX = 9; private static final String KEY_SEE_ALL = "previously_connected_devices_see_all"; private final List mDevicesList = new ArrayList<>(); + private final List mDockDevicesList = new ArrayList<>(); private PreferenceGroup mPreferenceGroup; private BluetoothDeviceUpdater mBluetoothDeviceUpdater; private DockUpdater mSavedDockUpdater; - private int mPreferenceSize; private BluetoothAdapter mBluetoothAdapter; @VisibleForTesting @@ -126,33 +127,38 @@ public class PreviouslyConnectedDevicePreferenceController extends BasePreferenc @Override public void onDeviceAdded(Preference preference) { - mPreferenceSize++; final List bluetoothDevices = mBluetoothAdapter.getMostRecentlyConnectedDevices(); - final int index = bluetoothDevices.indexOf(((BluetoothDevicePreference) preference) - .getBluetoothDevice().getDevice()); + final int index = preference instanceof BluetoothDevicePreference + ? bluetoothDevices.indexOf(((BluetoothDevicePreference) preference) + .getBluetoothDevice().getDevice()) : DOCK_DEVICE_INDEX; if (DEBUG) { Log.d(TAG, "onDeviceAdded() " + preference.getTitle() + ", index of : " + index); for (BluetoothDevice device : bluetoothDevices) { Log.d(TAG, "onDeviceAdded() most recently device : " + device.getName()); } } - if (mPreferenceSize <= MAX_DEVICE_NUM) { - addPreference(mPreferenceSize, index, preference); - } else { - addPreference(MAX_DEVICE_NUM, index, preference); - } + addPreference(index, preference); updatePreferenceVisibility(); } - private void addPreference(int size, int index, Preference preference) { - if (mDevicesList.size() >= index) { - mDevicesList.add(index, preference); + private void addPreference(int index, Preference preference) { + if (preference instanceof BluetoothDevicePreference) { + if (mDevicesList.size() >= index) { + mDevicesList.add(index, preference); + } else { + mDevicesList.add(preference); + } } else { - mDevicesList.add(preference); + mDockDevicesList.add(preference); } + addPreference(); + } + + private void addPreference() { mPreferenceGroup.removeAll(); mPreferenceGroup.addPreference(mSeeAllPreference); + final int size = getDeviceListSize(); for (int i = 0; i < size; i++) { if (DEBUG) { Log.d(TAG, "addPreference() add device : " + mDevicesList.get(i).getTitle()); @@ -160,23 +166,37 @@ public class PreviouslyConnectedDevicePreferenceController extends BasePreferenc mDevicesList.get(i).setOrder(i); mPreferenceGroup.addPreference(mDevicesList.get(i)); } + if (mDockDevicesList.size() > 0) { + for (int i = 0; i < getDockDeviceListSize(MAX_DEVICE_NUM - size); i++) { + if (DEBUG) { + Log.d(TAG, "addPreference() add dock device : " + + mDockDevicesList.get(i).getTitle()); + } + mDockDevicesList.get(i).setOrder(DOCK_DEVICE_INDEX); + mPreferenceGroup.addPreference(mDockDevicesList.get(i)); + } + } + } + + private int getDeviceListSize() { + return mDevicesList.size() >= MAX_DEVICE_NUM + ? MAX_DEVICE_NUM : mDevicesList.size(); + } + + private int getDockDeviceListSize(int availableSize) { + return mDockDevicesList.size() >= availableSize + ? availableSize : mDockDevicesList.size(); } @Override public void onDeviceRemoved(Preference preference) { - mPreferenceSize--; - mDevicesList.remove(preference); - mPreferenceGroup.removeAll(); - mPreferenceGroup.addPreference(mSeeAllPreference); - final int size = mDevicesList.size() >= MAX_DEVICE_NUM - ? MAX_DEVICE_NUM : mDevicesList.size(); - for (int i = 0; i < size; i++) { - if (DEBUG) { - Log.d(TAG, "onDeviceRemoved() add device : " + mDevicesList.get(i).getTitle()); - } - mDevicesList.get(i).setOrder(i); - mPreferenceGroup.addPreference(mDevicesList.get(i)); + if (preference instanceof BluetoothDevicePreference) { + mDevicesList.remove(preference); + } else { + mDockDevicesList.remove(preference); } + + addPreference(); updatePreferenceVisibility(); } diff --git a/tests/robotests/src/com/android/settings/connecteddevice/PreviouslyConnectedDevicePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/connecteddevice/PreviouslyConnectedDevicePreferenceControllerTest.java index 3363ff5346c..d73471f94ed 100644 --- a/tests/robotests/src/com/android/settings/connecteddevice/PreviouslyConnectedDevicePreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/connecteddevice/PreviouslyConnectedDevicePreferenceControllerTest.java @@ -41,6 +41,7 @@ import com.android.settings.bluetooth.BluetoothDeviceUpdater; import com.android.settings.connecteddevice.dock.DockUpdater; import com.android.settings.dashboard.DashboardFragment; import com.android.settings.testutils.shadow.ShadowBluetoothAdapter; +import com.android.settings.widget.SingleTargetGearPreference; import com.android.settingslib.bluetooth.CachedBluetoothDevice; import org.junit.Before; @@ -187,6 +188,16 @@ public class PreviouslyConnectedDevicePreferenceControllerTest { assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(2); } + @Test + public void onDeviceAdded_addDockDevicePreference_displayIt() { + final SingleTargetGearPreference dockPreference = new SingleTargetGearPreference( + mContext, null /* AttributeSet */); + + mPreConnectedDeviceController.onDeviceAdded(dockPreference); + + assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(2); + } + @Test public void onDeviceAdded_addFourDevicePreference_onlyDisplayThree() { final BluetoothDevicePreference preference1 = new BluetoothDevicePreference( @@ -197,11 +208,14 @@ public class PreviouslyConnectedDevicePreferenceControllerTest { mContext, mCachedDevice3, true, BluetoothDevicePreference.SortType.TYPE_NO_SORT); final BluetoothDevicePreference preference4 = new BluetoothDevicePreference( mContext, mCachedDevice4, true, BluetoothDevicePreference.SortType.TYPE_NO_SORT); + final SingleTargetGearPreference dockPreference = new SingleTargetGearPreference( + mContext, null /* AttributeSet */); mPreConnectedDeviceController.onDeviceAdded(preference1); mPreConnectedDeviceController.onDeviceAdded(preference2); mPreConnectedDeviceController.onDeviceAdded(preference3); mPreConnectedDeviceController.onDeviceAdded(preference4); + mPreConnectedDeviceController.onDeviceAdded(dockPreference); // 3 BluetoothDevicePreference and 1 see all preference assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(4); @@ -211,9 +225,13 @@ public class PreviouslyConnectedDevicePreferenceControllerTest { public void onDeviceRemoved_removeLastDevice_showSeeAllPreference() { final BluetoothDevicePreference preference1 = new BluetoothDevicePreference( mContext, mCachedDevice1, true, BluetoothDevicePreference.SortType.TYPE_NO_SORT); + final SingleTargetGearPreference dockPreference = new SingleTargetGearPreference( + mContext, null /* AttributeSet */); mPreferenceGroup.addPreference(preference1); + mPreferenceGroup.addPreference(dockPreference); mPreConnectedDeviceController.onDeviceRemoved(preference1); + mPreConnectedDeviceController.onDeviceRemoved(dockPreference); assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(1); } From 25439c0e8e43b09aa0ec1e96050bdda7be13de1f Mon Sep 17 00:00:00 2001 From: Daniel Chapin Date: Wed, 7 Oct 2020 17:47:36 +0000 Subject: [PATCH 03/21] Revert "Add the FLAG_IMMUTABLE flag for creating a PendingIntent" This reverts commit 334968c113aca1e0c968223bd75a3b2ad643d135. Reason for revert: Bug: 170280415 Change-Id: Idaa269406d6c1609c75f0dfba1f7fa9daf979101 (cherry picked from commit ee1360f13c37a6d86e7806250e3b2489e7dbd8de) --- src/com/android/settings/accounts/AddAccountSettings.java | 3 +-- .../android/settings/bluetooth/BluetoothSliceBuilder.java | 4 ++-- .../homepage/contextualcards/slices/BatteryFixSlice.java | 3 +-- .../homepage/contextualcards/slices/LowStorageSlice.java | 4 ++-- src/com/android/settings/location/LocationSlice.java | 2 +- .../settings/notification/zen/ZenModeSliceBuilder.java | 5 ++--- src/com/android/settings/slices/CustomSliceable.java | 2 +- src/com/android/settings/slices/SliceBuilderUtils.java | 5 ++--- 8 files changed, 12 insertions(+), 16 deletions(-) diff --git a/src/com/android/settings/accounts/AddAccountSettings.java b/src/com/android/settings/accounts/AddAccountSettings.java index 81db4df3290..64bb201e97b 100644 --- a/src/com/android/settings/accounts/AddAccountSettings.java +++ b/src/com/android/settings/accounts/AddAccountSettings.java @@ -247,8 +247,7 @@ public class AddAccountSettings extends Activity { identityIntent.setAction(SHOULD_NOT_RESOLVE); identityIntent.addCategory(SHOULD_NOT_RESOLVE); - mPendingIntent = PendingIntent.getBroadcast(this, 0, identityIntent, - PendingIntent.FLAG_IMMUTABLE); + mPendingIntent = PendingIntent.getBroadcast(this, 0, identityIntent, 0); addAccountOptions.putParcelable(KEY_CALLER_IDENTITY, mPendingIntent); addAccountOptions.putBoolean(EXTRA_HAS_MULTIPLE_USERS, Utils.hasMultipleUsers(this)); AccountManager.get(this).addAccountAsUser( diff --git a/src/com/android/settings/bluetooth/BluetoothSliceBuilder.java b/src/com/android/settings/bluetooth/BluetoothSliceBuilder.java index 67c365007f3..5a4ee1fe029 100644 --- a/src/com/android/settings/bluetooth/BluetoothSliceBuilder.java +++ b/src/com/android/settings/bluetooth/BluetoothSliceBuilder.java @@ -129,13 +129,13 @@ public class BluetoothSliceBuilder { private static PendingIntent getPrimaryAction(Context context) { final Intent intent = getIntent(context); return PendingIntent.getActivity(context, 0 /* requestCode */, - intent, PendingIntent.FLAG_IMMUTABLE); + intent, 0 /* flags */); } private static PendingIntent getBroadcastIntent(Context context) { final Intent intent = new Intent(ACTION_BLUETOOTH_SLICE_CHANGED) .setClass(context, SliceBroadcastReceiver.class); return PendingIntent.getBroadcast(context, 0 /* requestCode */, intent, - PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE); + PendingIntent.FLAG_UPDATE_CURRENT); } } diff --git a/src/com/android/settings/homepage/contextualcards/slices/BatteryFixSlice.java b/src/com/android/settings/homepage/contextualcards/slices/BatteryFixSlice.java index 6a5b3000bc8..d99d01ed780 100644 --- a/src/com/android/settings/homepage/contextualcards/slices/BatteryFixSlice.java +++ b/src/com/android/settings/homepage/contextualcards/slices/BatteryFixSlice.java @@ -163,8 +163,7 @@ public class BatteryFixSlice implements CustomSliceable { private PendingIntent getPrimaryAction() { final Intent intent = getIntent(); - return PendingIntent.getActivity(mContext, 0 /* requestCode */, intent, - PendingIntent.FLAG_IMMUTABLE); + return PendingIntent.getActivity(mContext, 0 /* requestCode */, intent, 0 /* flags */); } private Slice buildBatteryGoodSlice(ListBuilder sliceBuilder, boolean isError) { diff --git a/src/com/android/settings/homepage/contextualcards/slices/LowStorageSlice.java b/src/com/android/settings/homepage/contextualcards/slices/LowStorageSlice.java index 576b4355ea0..2bc09e9f72d 100644 --- a/src/com/android/settings/homepage/contextualcards/slices/LowStorageSlice.java +++ b/src/com/android/settings/homepage/contextualcards/slices/LowStorageSlice.java @@ -116,8 +116,8 @@ public class LowStorageSlice implements CustomSliceable { private RowBuilder buildRowBuilder(CharSequence title, String summary, IconCompat icon) { final SliceAction primarySliceAction = SliceAction.createDeeplink( - PendingIntent.getActivity(mContext, 0, getIntent(), PendingIntent.FLAG_IMMUTABLE), - icon, ListBuilder.ICON_IMAGE, title); + PendingIntent.getActivity(mContext, 0, getIntent(), 0), icon, + ListBuilder.ICON_IMAGE, title); return new RowBuilder() .setTitleItem(icon, ListBuilder.ICON_IMAGE) diff --git a/src/com/android/settings/location/LocationSlice.java b/src/com/android/settings/location/LocationSlice.java index f8add128e1e..275969046ad 100644 --- a/src/com/android/settings/location/LocationSlice.java +++ b/src/com/android/settings/location/LocationSlice.java @@ -96,6 +96,6 @@ public class LocationSlice implements CustomSliceable { private PendingIntent getPrimaryAction() { final Intent intent = getIntent(); return PendingIntent.getActivity(mContext, 0 /* requestCode */, - intent, PendingIntent.FLAG_IMMUTABLE); + intent, 0 /* flags */); } } diff --git a/src/com/android/settings/notification/zen/ZenModeSliceBuilder.java b/src/com/android/settings/notification/zen/ZenModeSliceBuilder.java index 14c91177de7..c9a203e2f4c 100644 --- a/src/com/android/settings/notification/zen/ZenModeSliceBuilder.java +++ b/src/com/android/settings/notification/zen/ZenModeSliceBuilder.java @@ -142,14 +142,13 @@ public class ZenModeSliceBuilder { private static PendingIntent getPrimaryAction(Context context) { final Intent intent = getIntent(context); - return PendingIntent.getActivity(context, 0 /* requestCode */, intent, - PendingIntent.FLAG_IMMUTABLE); + return PendingIntent.getActivity(context, 0 /* requestCode */, intent, 0 /* flags */); } private static PendingIntent getBroadcastIntent(Context context) { final Intent intent = new Intent(ACTION_ZEN_MODE_SLICE_CHANGED) .setClass(context, SliceBroadcastReceiver.class); return PendingIntent.getBroadcast(context, 0 /* requestCode */, intent, - PendingIntent.FLAG_CANCEL_CURRENT | PendingIntent.FLAG_IMMUTABLE); + PendingIntent.FLAG_CANCEL_CURRENT); } } diff --git a/src/com/android/settings/slices/CustomSliceable.java b/src/com/android/settings/slices/CustomSliceable.java index 57475a9aa90..92c604e189a 100644 --- a/src/com/android/settings/slices/CustomSliceable.java +++ b/src/com/android/settings/slices/CustomSliceable.java @@ -95,7 +95,7 @@ public interface CustomSliceable extends Sliceable { .setData(getUri()) .setClass(context, SliceBroadcastReceiver.class); return PendingIntent.getBroadcast(context, 0 /* requestCode */, intent, - PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE); + PendingIntent.FLAG_UPDATE_CURRENT); } @Override diff --git a/src/com/android/settings/slices/SliceBuilderUtils.java b/src/com/android/settings/slices/SliceBuilderUtils.java index 6e14a3f6e8d..552927e1da2 100644 --- a/src/com/android/settings/slices/SliceBuilderUtils.java +++ b/src/com/android/settings/slices/SliceBuilderUtils.java @@ -159,7 +159,7 @@ public class SliceBuilderUtils { .setClass(context, SliceBroadcastReceiver.class) .putExtra(EXTRA_SLICE_KEY, data.getKey()); return PendingIntent.getBroadcast(context, 0 /* requestCode */, intent, - PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE); + PendingIntent.FLAG_UPDATE_CURRENT); } /** @@ -167,8 +167,7 @@ public class SliceBuilderUtils { */ public static PendingIntent getContentPendingIntent(Context context, SliceData sliceData) { final Intent intent = getContentIntent(context, sliceData); - return PendingIntent.getActivity(context, 0 /* requestCode */, intent, - PendingIntent.FLAG_IMMUTABLE); + return PendingIntent.getActivity(context, 0 /* requestCode */, intent, 0 /* flags */); } /** From 2e550d71fa2d6f476f43d14ba170daff858c6226 Mon Sep 17 00:00:00 2001 From: Daniel Chapin Date: Wed, 7 Oct 2020 17:47:36 +0000 Subject: [PATCH 04/21] Revert "Add the FLAG_IMMUTABLE flag for creating a PendingIntent" This reverts commit 334968c113aca1e0c968223bd75a3b2ad643d135. Reason for revert: Bug: 170280415 Change-Id: Idaa269406d6c1609c75f0dfba1f7fa9daf979101 (cherry picked from commit ee1360f13c37a6d86e7806250e3b2489e7dbd8de) --- src/com/android/settings/accounts/AddAccountSettings.java | 3 +-- .../android/settings/bluetooth/BluetoothSliceBuilder.java | 4 ++-- .../homepage/contextualcards/slices/BatteryFixSlice.java | 3 +-- .../homepage/contextualcards/slices/LowStorageSlice.java | 4 ++-- src/com/android/settings/location/LocationSlice.java | 2 +- .../settings/notification/zen/ZenModeSliceBuilder.java | 5 ++--- src/com/android/settings/slices/CustomSliceable.java | 2 +- src/com/android/settings/slices/SliceBuilderUtils.java | 5 ++--- 8 files changed, 12 insertions(+), 16 deletions(-) diff --git a/src/com/android/settings/accounts/AddAccountSettings.java b/src/com/android/settings/accounts/AddAccountSettings.java index 81db4df3290..64bb201e97b 100644 --- a/src/com/android/settings/accounts/AddAccountSettings.java +++ b/src/com/android/settings/accounts/AddAccountSettings.java @@ -247,8 +247,7 @@ public class AddAccountSettings extends Activity { identityIntent.setAction(SHOULD_NOT_RESOLVE); identityIntent.addCategory(SHOULD_NOT_RESOLVE); - mPendingIntent = PendingIntent.getBroadcast(this, 0, identityIntent, - PendingIntent.FLAG_IMMUTABLE); + mPendingIntent = PendingIntent.getBroadcast(this, 0, identityIntent, 0); addAccountOptions.putParcelable(KEY_CALLER_IDENTITY, mPendingIntent); addAccountOptions.putBoolean(EXTRA_HAS_MULTIPLE_USERS, Utils.hasMultipleUsers(this)); AccountManager.get(this).addAccountAsUser( diff --git a/src/com/android/settings/bluetooth/BluetoothSliceBuilder.java b/src/com/android/settings/bluetooth/BluetoothSliceBuilder.java index 67c365007f3..5a4ee1fe029 100644 --- a/src/com/android/settings/bluetooth/BluetoothSliceBuilder.java +++ b/src/com/android/settings/bluetooth/BluetoothSliceBuilder.java @@ -129,13 +129,13 @@ public class BluetoothSliceBuilder { private static PendingIntent getPrimaryAction(Context context) { final Intent intent = getIntent(context); return PendingIntent.getActivity(context, 0 /* requestCode */, - intent, PendingIntent.FLAG_IMMUTABLE); + intent, 0 /* flags */); } private static PendingIntent getBroadcastIntent(Context context) { final Intent intent = new Intent(ACTION_BLUETOOTH_SLICE_CHANGED) .setClass(context, SliceBroadcastReceiver.class); return PendingIntent.getBroadcast(context, 0 /* requestCode */, intent, - PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE); + PendingIntent.FLAG_UPDATE_CURRENT); } } diff --git a/src/com/android/settings/homepage/contextualcards/slices/BatteryFixSlice.java b/src/com/android/settings/homepage/contextualcards/slices/BatteryFixSlice.java index 6a5b3000bc8..d99d01ed780 100644 --- a/src/com/android/settings/homepage/contextualcards/slices/BatteryFixSlice.java +++ b/src/com/android/settings/homepage/contextualcards/slices/BatteryFixSlice.java @@ -163,8 +163,7 @@ public class BatteryFixSlice implements CustomSliceable { private PendingIntent getPrimaryAction() { final Intent intent = getIntent(); - return PendingIntent.getActivity(mContext, 0 /* requestCode */, intent, - PendingIntent.FLAG_IMMUTABLE); + return PendingIntent.getActivity(mContext, 0 /* requestCode */, intent, 0 /* flags */); } private Slice buildBatteryGoodSlice(ListBuilder sliceBuilder, boolean isError) { diff --git a/src/com/android/settings/homepage/contextualcards/slices/LowStorageSlice.java b/src/com/android/settings/homepage/contextualcards/slices/LowStorageSlice.java index 576b4355ea0..2bc09e9f72d 100644 --- a/src/com/android/settings/homepage/contextualcards/slices/LowStorageSlice.java +++ b/src/com/android/settings/homepage/contextualcards/slices/LowStorageSlice.java @@ -116,8 +116,8 @@ public class LowStorageSlice implements CustomSliceable { private RowBuilder buildRowBuilder(CharSequence title, String summary, IconCompat icon) { final SliceAction primarySliceAction = SliceAction.createDeeplink( - PendingIntent.getActivity(mContext, 0, getIntent(), PendingIntent.FLAG_IMMUTABLE), - icon, ListBuilder.ICON_IMAGE, title); + PendingIntent.getActivity(mContext, 0, getIntent(), 0), icon, + ListBuilder.ICON_IMAGE, title); return new RowBuilder() .setTitleItem(icon, ListBuilder.ICON_IMAGE) diff --git a/src/com/android/settings/location/LocationSlice.java b/src/com/android/settings/location/LocationSlice.java index f8add128e1e..275969046ad 100644 --- a/src/com/android/settings/location/LocationSlice.java +++ b/src/com/android/settings/location/LocationSlice.java @@ -96,6 +96,6 @@ public class LocationSlice implements CustomSliceable { private PendingIntent getPrimaryAction() { final Intent intent = getIntent(); return PendingIntent.getActivity(mContext, 0 /* requestCode */, - intent, PendingIntent.FLAG_IMMUTABLE); + intent, 0 /* flags */); } } diff --git a/src/com/android/settings/notification/zen/ZenModeSliceBuilder.java b/src/com/android/settings/notification/zen/ZenModeSliceBuilder.java index 14c91177de7..c9a203e2f4c 100644 --- a/src/com/android/settings/notification/zen/ZenModeSliceBuilder.java +++ b/src/com/android/settings/notification/zen/ZenModeSliceBuilder.java @@ -142,14 +142,13 @@ public class ZenModeSliceBuilder { private static PendingIntent getPrimaryAction(Context context) { final Intent intent = getIntent(context); - return PendingIntent.getActivity(context, 0 /* requestCode */, intent, - PendingIntent.FLAG_IMMUTABLE); + return PendingIntent.getActivity(context, 0 /* requestCode */, intent, 0 /* flags */); } private static PendingIntent getBroadcastIntent(Context context) { final Intent intent = new Intent(ACTION_ZEN_MODE_SLICE_CHANGED) .setClass(context, SliceBroadcastReceiver.class); return PendingIntent.getBroadcast(context, 0 /* requestCode */, intent, - PendingIntent.FLAG_CANCEL_CURRENT | PendingIntent.FLAG_IMMUTABLE); + PendingIntent.FLAG_CANCEL_CURRENT); } } diff --git a/src/com/android/settings/slices/CustomSliceable.java b/src/com/android/settings/slices/CustomSliceable.java index 57475a9aa90..92c604e189a 100644 --- a/src/com/android/settings/slices/CustomSliceable.java +++ b/src/com/android/settings/slices/CustomSliceable.java @@ -95,7 +95,7 @@ public interface CustomSliceable extends Sliceable { .setData(getUri()) .setClass(context, SliceBroadcastReceiver.class); return PendingIntent.getBroadcast(context, 0 /* requestCode */, intent, - PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE); + PendingIntent.FLAG_UPDATE_CURRENT); } @Override diff --git a/src/com/android/settings/slices/SliceBuilderUtils.java b/src/com/android/settings/slices/SliceBuilderUtils.java index 6e14a3f6e8d..552927e1da2 100644 --- a/src/com/android/settings/slices/SliceBuilderUtils.java +++ b/src/com/android/settings/slices/SliceBuilderUtils.java @@ -159,7 +159,7 @@ public class SliceBuilderUtils { .setClass(context, SliceBroadcastReceiver.class) .putExtra(EXTRA_SLICE_KEY, data.getKey()); return PendingIntent.getBroadcast(context, 0 /* requestCode */, intent, - PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE); + PendingIntent.FLAG_UPDATE_CURRENT); } /** @@ -167,8 +167,7 @@ public class SliceBuilderUtils { */ public static PendingIntent getContentPendingIntent(Context context, SliceData sliceData) { final Intent intent = getContentIntent(context, sliceData); - return PendingIntent.getActivity(context, 0 /* requestCode */, intent, - PendingIntent.FLAG_IMMUTABLE); + return PendingIntent.getActivity(context, 0 /* requestCode */, intent, 0 /* flags */); } /** From f51b88b6066917b144bbc411d5643e4f1d01e44a Mon Sep 17 00:00:00 2001 From: Stanley Wang Date: Wed, 18 Nov 2020 16:20:21 +0800 Subject: [PATCH 05/21] Fix NPE in AnomalyDetectionReceiver. Fixes: 172894032 Test: Settings robotests Change-Id: I13c1419a43dabc106bc3de9fb5d774ff88b19db5 (cherry picked from commit ee23508b1adc09a9560bc5e34075646e761f5102) --- .../fuelgauge/batterytip/AnomalyDetectionReceiver.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/com/android/settings/fuelgauge/batterytip/AnomalyDetectionReceiver.java b/src/com/android/settings/fuelgauge/batterytip/AnomalyDetectionReceiver.java index 4f21e115c8a..b1bb73accec 100644 --- a/src/com/android/settings/fuelgauge/batterytip/AnomalyDetectionReceiver.java +++ b/src/com/android/settings/fuelgauge/batterytip/AnomalyDetectionReceiver.java @@ -41,6 +41,9 @@ public class AnomalyDetectionReceiver extends BroadcastReceiver { + configKey + " subscriptionId = " + subscriptionId); final Bundle bundle = intent.getExtras(); + if (bundle == null) { + return; + } bundle.putLong(KEY_ANOMALY_TIMESTAMP, System.currentTimeMillis()); AnomalyDetectionJobService.scheduleAnomalyDetection(context, intent); From 5dfed3d7429ebff59c19f76716870f34f5ac4818 Mon Sep 17 00:00:00 2001 From: Daniel Chapin Date: Tue, 29 Dec 2020 17:55:13 +0000 Subject: [PATCH 06/21] Revert "Add adaptive charging to the top level settings menu" Revert submission 12989357-fix_ac_menu Reason for revert: Bug: 176473169 Reverted Changes: I6fc50a5ae:Add adaptive charging to the top level settings me... I8f600287c:Add adaptive charging to the top level settings me... Change-Id: I2928a96112bb8d2beeb071f231af6595edead4fa (cherry picked from commit 2f51836ca16a9510732f23b10f39090b7d19f76d) --- .../BatteryHeaderPreferenceController.java | 25 +++++------ .../BatteryPreferenceController.java | 30 ------------- .../BatteryStatusFeatureProvider.java | 2 +- .../BatteryStatusFeatureProviderImpl.java | 2 +- .../TopLevelBatteryPreferenceController.java | 42 ++++--------------- ...pLevelBatteryPreferenceControllerTest.java | 9 ++-- 6 files changed, 23 insertions(+), 87 deletions(-) delete mode 100644 src/com/android/settings/fuelgauge/BatteryPreferenceController.java diff --git a/src/com/android/settings/fuelgauge/BatteryHeaderPreferenceController.java b/src/com/android/settings/fuelgauge/BatteryHeaderPreferenceController.java index 11d756470dd..906644482c6 100644 --- a/src/com/android/settings/fuelgauge/BatteryHeaderPreferenceController.java +++ b/src/com/android/settings/fuelgauge/BatteryHeaderPreferenceController.java @@ -52,8 +52,7 @@ import com.android.settingslib.widget.LayoutPreference; * Controller that update the battery header view */ public class BatteryHeaderPreferenceController extends BasePreferenceController - implements PreferenceControllerMixin, LifecycleObserver, OnStart, - BatteryPreferenceController { + implements PreferenceControllerMixin, LifecycleObserver, OnStart { @VisibleForTesting static final String KEY_BATTERY_HEADER = "battery_header"; private static final String ANNOTATION_URL = "url"; @@ -122,20 +121,16 @@ public class BatteryHeaderPreferenceController extends BasePreferenceController .styleActionBar(mActivity); } - private CharSequence generateLabel(BatteryInfo info) { - if (BatteryUtils.isBatteryDefenderOn(info)) { - return null; - } else if (info.remainingLabel == null) { - return info.statusLabel; - } else { - return info.remainingLabel; - } - } - public void updateHeaderPreference(BatteryInfo info) { mBatteryPercentText.setText(formatBatteryPercentageText(info.batteryLevel)); if (!mBatteryStatusFeatureProvider.triggerBatteryStatusUpdate(this, info)) { - mSummary1.setText(generateLabel(info)); + if (BatteryUtils.isBatteryDefenderOn(info)) { + mSummary1.setText(null); + } else if (info.remainingLabel == null) { + mSummary1.setText(info.statusLabel); + } else { + mSummary1.setText(info.remainingLabel); + } } mBatteryMeterView.setBatteryLevel(info.batteryLevel); @@ -146,8 +141,8 @@ public class BatteryHeaderPreferenceController extends BasePreferenceController /** * Callback which receives text for the summary line. */ - public void updateBatteryStatus(String label, BatteryInfo info) { - mSummary1.setText(label != null ? label : generateLabel(info)); + public void updateBatteryStatus(String statusLabel) { + mSummary1.setText(statusLabel); } public void quickUpdateHeaderPreference() { diff --git a/src/com/android/settings/fuelgauge/BatteryPreferenceController.java b/src/com/android/settings/fuelgauge/BatteryPreferenceController.java deleted file mode 100644 index badf5c8c517..00000000000 --- a/src/com/android/settings/fuelgauge/BatteryPreferenceController.java +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright (C) 2020 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.settings.fuelgauge; - -/** - * Common interface for a preference controller that updates battery status - */ -public interface BatteryPreferenceController { - - /** - * Updates the label for the preference controller. If the label is null, the - * implementation should revert back to the original label based on the - * battery info. - */ - void updateBatteryStatus(String label, BatteryInfo info); -} diff --git a/src/com/android/settings/fuelgauge/BatteryStatusFeatureProvider.java b/src/com/android/settings/fuelgauge/BatteryStatusFeatureProvider.java index 46f00c79f4f..c3fc24756fe 100644 --- a/src/com/android/settings/fuelgauge/BatteryStatusFeatureProvider.java +++ b/src/com/android/settings/fuelgauge/BatteryStatusFeatureProvider.java @@ -25,5 +25,5 @@ public interface BatteryStatusFeatureProvider { * Trigger a battery status update; return false if built-in status should be used. */ boolean triggerBatteryStatusUpdate( - BatteryPreferenceController controller, BatteryInfo info); + BatteryHeaderPreferenceController batteryHeaderPreferenceController, BatteryInfo info); } diff --git a/src/com/android/settings/fuelgauge/BatteryStatusFeatureProviderImpl.java b/src/com/android/settings/fuelgauge/BatteryStatusFeatureProviderImpl.java index dc4b5db467c..47d376dd9d7 100644 --- a/src/com/android/settings/fuelgauge/BatteryStatusFeatureProviderImpl.java +++ b/src/com/android/settings/fuelgauge/BatteryStatusFeatureProviderImpl.java @@ -31,7 +31,7 @@ public class BatteryStatusFeatureProviderImpl implements BatteryStatusFeaturePro @Override public boolean triggerBatteryStatusUpdate( - BatteryPreferenceController controller, BatteryInfo info) { + BatteryHeaderPreferenceController batteryHeaderPreferenceController, BatteryInfo info) { return false; } } diff --git a/src/com/android/settings/fuelgauge/TopLevelBatteryPreferenceController.java b/src/com/android/settings/fuelgauge/TopLevelBatteryPreferenceController.java index 666a7490e90..c2e6a6f075a 100644 --- a/src/com/android/settings/fuelgauge/TopLevelBatteryPreferenceController.java +++ b/src/com/android/settings/fuelgauge/TopLevelBatteryPreferenceController.java @@ -26,21 +26,18 @@ import androidx.preference.PreferenceScreen; import com.android.settings.R; import com.android.settings.core.BasePreferenceController; import com.android.settings.core.FeatureFlags; -import com.android.settings.overlay.FeatureFactory; import com.android.settingslib.core.lifecycle.LifecycleObserver; import com.android.settingslib.core.lifecycle.events.OnStart; import com.android.settingslib.core.lifecycle.events.OnStop; public class TopLevelBatteryPreferenceController extends BasePreferenceController implements - LifecycleObserver, OnStart, OnStop, BatteryPreferenceController { + LifecycleObserver, OnStart, OnStop { @VisibleForTesting - protected boolean mIsBatteryPresent = true; + boolean mIsBatteryPresent = true; private final BatteryBroadcastReceiver mBatteryBroadcastReceiver; private Preference mPreference; private BatteryInfo mBatteryInfo; - private BatteryStatusFeatureProvider mBatteryStatusFeatureProvider; - private String mBatteryStatusLabel; public TopLevelBatteryPreferenceController(Context context, String preferenceKey) { super(context, preferenceKey); @@ -54,9 +51,6 @@ public class TopLevelBatteryPreferenceController extends BasePreferenceControlle updateState(mPreference); }, true /* shortString */); }); - - mBatteryStatusFeatureProvider = FeatureFactory.getFactory(context) - .getBatteryStatusFeatureProvider(context); } @Override @@ -94,42 +88,20 @@ public class TopLevelBatteryPreferenceController extends BasePreferenceControlle return getDashboardLabel(mContext, mBatteryInfo); } - protected CharSequence getDashboardLabel(Context context, BatteryInfo info) { + static CharSequence getDashboardLabel(Context context, BatteryInfo info) { if (info == null || context == null) { return null; } - CharSequence label; - if (!mBatteryStatusFeatureProvider.triggerBatteryStatusUpdate(this, info) - || mBatteryStatusLabel == null) { - label = generateLabel(info); - } else { - label = mBatteryStatusLabel; - } - - return label; - } - - private CharSequence generateLabel(BatteryInfo info) { if (!info.discharging && info.chargeLabel != null) { - return info.chargeLabel; + label = info.chargeLabel; } else if (info.remainingLabel == null) { - return info.batteryPercentString; + label = info.batteryPercentString; } else { - return mContext.getString(R.string.power_remaining_settings_home_page, + label = context.getString(R.string.power_remaining_settings_home_page, info.batteryPercentString, info.remainingLabel); } - } - - /** - * Callback which receives text for the label. - */ - public void updateBatteryStatus(String label, BatteryInfo info) { - mBatteryStatusLabel = (label != null) ? label : generateLabel(info).toString(); - - if (mPreference != null) { - updateState(mPreference); - } + return label; } } diff --git a/tests/robotests/src/com/android/settings/fuelgauge/TopLevelBatteryPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/TopLevelBatteryPreferenceControllerTest.java index 667e24eb73d..18155d84c0d 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/TopLevelBatteryPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/TopLevelBatteryPreferenceControllerTest.java @@ -18,6 +18,7 @@ package com.android.settings.fuelgauge; import static com.android.settings.core.BasePreferenceController.AVAILABLE; import static com.android.settings.core.BasePreferenceController.UNSUPPORTED_ON_DEVICE; +import static com.android.settings.fuelgauge.TopLevelBatteryPreferenceController.getDashboardLabel; import static com.google.common.truth.Truth.assertThat; @@ -68,16 +69,14 @@ public class TopLevelBatteryPreferenceControllerTest { public void getDashboardLabel_returnsCorrectLabel() { BatteryInfo info = new BatteryInfo(); info.batteryPercentString = "3%"; - assertThat(mController.getDashboardLabel(mContext, info)) - .isEqualTo(info.batteryPercentString); + assertThat(getDashboardLabel(mContext, info)).isEqualTo(info.batteryPercentString); info.remainingLabel = "Phone will shut down soon"; - assertThat(mController.getDashboardLabel(mContext, info)) - .isEqualTo("3% - Phone will shut down soon"); + assertThat(getDashboardLabel(mContext, info)).isEqualTo("3% - Phone will shut down soon"); info.discharging = false; info.chargeLabel = "5% - charging"; - assertThat(mController.getDashboardLabel(mContext, info)).isEqualTo("5% - charging"); + assertThat(getDashboardLabel(mContext, info)).isEqualTo("5% - charging"); } @Test From 686e23637bb828af23ae236eebc634f71cdb7b59 Mon Sep 17 00:00:00 2001 From: Yi-Ling Chuang Date: Wed, 13 Jan 2021 23:11:26 +0800 Subject: [PATCH 07/21] Add toggle for Prevent Ringing setting in Gesture page. - Replace Preference with PrimarySwitchPreference. Fixes: 177408128 Test: open gesture page Change-Id: I25079632459b3457995792347f4904c25374d47d (cherry picked from commit 6735292dab6ab32869632047933764325fbf1b6e) --- res/xml/gestures.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/res/xml/gestures.xml b/res/xml/gestures.xml index 970ad217bfd..f18d8a55a0b 100644 --- a/res/xml/gestures.xml +++ b/res/xml/gestures.xml @@ -88,7 +88,7 @@ settings:searchable="false" settings:controller="com.android.settings.gestures.PickupGesturePreferenceController" /> - Date: Tue, 19 Jan 2021 05:23:08 +0000 Subject: [PATCH 08/21] Revert "Build Settings-robo-testutils for use by SettingsGoogleR..." Revert submission 13183140-SettingsGoogle-bp Reason for revert: b/177766209 Reverted Changes: I73bef76ec:Add ArcSettings and SettingsGoogle to the legacy a... I385629c5c:Build Settings-robo-testutils for use by SettingsG... I863e1d658:Convert ArcSettings to Android.bp If095bc39d:Convert SettingsGoogleRoboTests to Android.bp I8d3f32cd4:Convert SettingsGoogle tests to Android.bp I7ddeb985c:Convert SettingsGoogle to Android.bp I3b8223e64:Export elmyra and columbus aidl files for Settings... I3d2f042a9:Export proguard.flags, manifest and sources for us... Change-Id: I2efd60ab1e64370dbd0e277b7e92c177374ceb36 (cherry picked from commit 17e5233cdb93b7bfa7498e94ad7c9cc35c8b2177) --- tests/robotests/Android.bp | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/tests/robotests/Android.bp b/tests/robotests/Android.bp index a0fc3c2f313..c8c6c3840d1 100644 --- a/tests/robotests/Android.bp +++ b/tests/robotests/Android.bp @@ -88,15 +88,3 @@ android_robolectric_test { "SettingsLib-search", ], } - -java_library { - name: "Settings-robo-testutils", - srcs: ["src/com/android/settings/testutils/**/*.java"], - - libs: [ - "Settings-core", - "Robolectric_all-target", - "mockito-robolectric-prebuilt", - "truth-prebuilt", - ], -} From 62f910d967fca0c1026eb2e843ef902ac5c19a9b Mon Sep 17 00:00:00 2001 From: Colin Cross Date: Tue, 19 Jan 2021 05:23:08 +0000 Subject: [PATCH 09/21] Revert "Export proguard.flags, manifest and sources for use by S..." Revert submission 13183140-SettingsGoogle-bp Reason for revert: b/177766209 Reverted Changes: I73bef76ec:Add ArcSettings and SettingsGoogle to the legacy a... I385629c5c:Build Settings-robo-testutils for use by SettingsG... I863e1d658:Convert ArcSettings to Android.bp If095bc39d:Convert SettingsGoogleRoboTests to Android.bp I8d3f32cd4:Convert SettingsGoogle tests to Android.bp I7ddeb985c:Convert SettingsGoogle to Android.bp I3b8223e64:Export elmyra and columbus aidl files for Settings... I3d2f042a9:Export proguard.flags, manifest and sources for us... Change-Id: I9da85caeb3a53cf7ac3216c4b34985423b997fd2 (cherry picked from commit 3e2426ca799a5b297ce78e03cb709c78a8de2944) --- Android.bp | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/Android.bp b/Android.bp index 7ac1a5dbcf0..5470e708143 100644 --- a/Android.bp +++ b/Android.bp @@ -93,21 +93,3 @@ android_library_import { name: "contextualcards", aars: ["libs/contextualcards.aar"], } - -filegroup { - name: "Settings_proguard_flags", - srcs: ["proguard.flags"], -} - -// The sources for Settings need to be exposed to SettingsGoogle, etc. -// so they can run the com.android.settingslib.search.IndexableProcessor -// over all the sources together. -filegroup { - name: "Settings_srcs", - srcs: ["src/**/*.java"], -} - -filegroup { - name: "Settings_manifest", - srcs: ["AndroidManifest.xml"], -} From 125aa7d29be2d0ef0dce9863cf69e9d982c869ad Mon Sep 17 00:00:00 2001 From: Yi-Ling Chuang Date: Fri, 29 Jan 2021 17:19:40 +0800 Subject: [PATCH 10/21] Fix the background color of the homepage. - Remove the windowBackground override. Fixes: 177715172 Test: open the homepage and see its color. Change-Id: If8f6f789eef49caabf6d0f04eee33850e1c98e19 (cherry picked from commit a386cb27fc1000f2fec08ef8120eb0bc2e7abaa1) --- res/values/themes.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/res/values/themes.xml b/res/values/themes.xml index fc692463dfa..69fa93e854f 100644 --- a/res/values/themes.xml +++ b/res/values/themes.xml @@ -222,7 +222,6 @@ true @*android:color/ripple_material_light @android:color/transparent - @android:color/white - diff --git a/res/values/themes.xml b/res/values/themes.xml index 4df4a78f31e..444ec72e9f1 100644 --- a/res/values/themes.xml +++ b/res/values/themes.xml @@ -26,6 +26,7 @@ diff --git a/tests/robotests/res/values/themes.xml b/tests/robotests/res/values/themes.xml index 92edb17b503..0fe63284510 100644 --- a/tests/robotests/res/values/themes.xml +++ b/tests/robotests/res/values/themes.xml @@ -13,7 +13,7 @@ #ffffff #ffffff #ffffff - @style/PreferenceTheme + @style/SettingsPreferenceTheme true @android:color/white diff --git a/tests/robotests/src/com/android/settings/display/ScreenTimeoutSettingsTest.java b/tests/robotests/src/com/android/settings/display/ScreenTimeoutSettingsTest.java index 771a86359ff..c4f55808870 100644 --- a/tests/robotests/src/com/android/settings/display/ScreenTimeoutSettingsTest.java +++ b/tests/robotests/src/com/android/settings/display/ScreenTimeoutSettingsTest.java @@ -73,6 +73,9 @@ public class ScreenTimeoutSettingsTest { @Mock AdaptiveSleepPreferenceController mAdaptiveSleepPreferenceController; + @Mock + AdaptiveSleepCameraStatePreferenceController mAdaptiveSleepCameraStatePreferenceController; + @Mock Preference mDisableOptionsPreference; @@ -98,6 +101,8 @@ public class ScreenTimeoutSettingsTest { mSettings.mAdaptiveSleepController = mAdaptiveSleepPreferenceController; mSettings.mAdaptiveSleepPermissionController = mPermissionPreferenceController; + mSettings.mAdaptiveSleepCameraStatePreferenceController = + mAdaptiveSleepCameraStatePreferenceController; } @Test diff --git a/tests/robotests/src/com/android/settings/widget/CardPreferenceTest.java b/tests/robotests/src/com/android/settings/widget/CardPreferenceTest.java index 730489795fe..6d4a6bbd4d8 100644 --- a/tests/robotests/src/com/android/settings/widget/CardPreferenceTest.java +++ b/tests/robotests/src/com/android/settings/widget/CardPreferenceTest.java @@ -37,7 +37,7 @@ public class CardPreferenceTest { @Before public void setUp() { mContext = RuntimeEnvironment.application; - mContext.setTheme(R.style.PreferenceTheme); + mContext.setTheme(R.style.SettingsPreferenceTheme); mCardPreference = new CardPreference(mContext); } From 6fab5f8f52510fe48b9fe5228d541863e60036e9 Mon Sep 17 00:00:00 2001 From: Edgar Wang Date: Wed, 14 Apr 2021 09:54:04 +0800 Subject: [PATCH 15/21] Apply SettingsPreferenceTheme in Settings - Set all of preference style inherit from SettingsPreferenceTheme - Apply to Theme.Settings and Theme.Settings.Home - Fix robotest failed in ScreenTimeoutSettingsTest Bug: 185206291 Test: manual & robotest Change-Id: I855d003b10348569903855fcbf235bc00265658b (cherry picked from commit 817a167416eecfa6f6455e94f31ffc9ff59ea0a4) --- res/values/styles_preference.xml | 4 ++-- res/values/themes.xml | 3 ++- res/values/themes_suw.xml | 2 +- tests/robotests/res/values/themes.xml | 2 +- .../android/settings/display/ScreenTimeoutSettingsTest.java | 5 +++++ .../src/com/android/settings/widget/CardPreferenceTest.java | 2 +- 6 files changed, 12 insertions(+), 6 deletions(-) diff --git a/res/values/styles_preference.xml b/res/values/styles_preference.xml index 6453458e9b4..c162fc46b5b 100644 --- a/res/values/styles_preference.xml +++ b/res/values/styles_preference.xml @@ -19,7 +19,7 @@ - - diff --git a/res/values/themes.xml b/res/values/themes.xml index 4df4a78f31e..444ec72e9f1 100644 --- a/res/values/themes.xml +++ b/res/values/themes.xml @@ -26,6 +26,7 @@ diff --git a/tests/robotests/res/values/themes.xml b/tests/robotests/res/values/themes.xml index 92edb17b503..0fe63284510 100644 --- a/tests/robotests/res/values/themes.xml +++ b/tests/robotests/res/values/themes.xml @@ -13,7 +13,7 @@ #ffffff #ffffff #ffffff - @style/PreferenceTheme + @style/SettingsPreferenceTheme true @android:color/white diff --git a/tests/robotests/src/com/android/settings/display/ScreenTimeoutSettingsTest.java b/tests/robotests/src/com/android/settings/display/ScreenTimeoutSettingsTest.java index 771a86359ff..c4f55808870 100644 --- a/tests/robotests/src/com/android/settings/display/ScreenTimeoutSettingsTest.java +++ b/tests/robotests/src/com/android/settings/display/ScreenTimeoutSettingsTest.java @@ -73,6 +73,9 @@ public class ScreenTimeoutSettingsTest { @Mock AdaptiveSleepPreferenceController mAdaptiveSleepPreferenceController; + @Mock + AdaptiveSleepCameraStatePreferenceController mAdaptiveSleepCameraStatePreferenceController; + @Mock Preference mDisableOptionsPreference; @@ -98,6 +101,8 @@ public class ScreenTimeoutSettingsTest { mSettings.mAdaptiveSleepController = mAdaptiveSleepPreferenceController; mSettings.mAdaptiveSleepPermissionController = mPermissionPreferenceController; + mSettings.mAdaptiveSleepCameraStatePreferenceController = + mAdaptiveSleepCameraStatePreferenceController; } @Test diff --git a/tests/robotests/src/com/android/settings/widget/CardPreferenceTest.java b/tests/robotests/src/com/android/settings/widget/CardPreferenceTest.java index 730489795fe..6d4a6bbd4d8 100644 --- a/tests/robotests/src/com/android/settings/widget/CardPreferenceTest.java +++ b/tests/robotests/src/com/android/settings/widget/CardPreferenceTest.java @@ -37,7 +37,7 @@ public class CardPreferenceTest { @Before public void setUp() { mContext = RuntimeEnvironment.application; - mContext.setTheme(R.style.PreferenceTheme); + mContext.setTheme(R.style.SettingsPreferenceTheme); mCardPreference = new CardPreference(mContext); } From 5307941cd46e28324535646268274e4c3c01db1d Mon Sep 17 00:00:00 2001 From: bsears Date: Mon, 3 May 2021 17:59:11 +0000 Subject: [PATCH 16/21] Revert "Fixes 'no ripple effect' issue for screen attention setting" This reverts commit 20d1da2b6298ade2a2390a66f98a1d12381e5e8f. Reason for revert: Based on bisection, this is the likely root cause of b/186904496 Bug: 186904496 Change-Id: I0eaa026b52610d7ef4543c32791531971e68f8e6 (cherry picked from commit 30e9ba1e52f072dd73e18cbee10bb6e3adc5b1e0) --- ...veSleepPermissionPreferenceController.java | 29 ++++++-------- .../AdaptiveSleepPreferenceController.java | 39 ++++++++----------- .../display/ScreenTimeoutSettings.java | 18 +++------ ...AdaptiveSleepPreferenceControllerTest.java | 1 - .../display/ScreenTimeoutSettingsTest.java | 4 +- 5 files changed, 36 insertions(+), 55 deletions(-) diff --git a/src/com/android/settings/display/AdaptiveSleepPermissionPreferenceController.java b/src/com/android/settings/display/AdaptiveSleepPermissionPreferenceController.java index 8e4db0d26ad..0d21e9caf80 100644 --- a/src/com/android/settings/display/AdaptiveSleepPermissionPreferenceController.java +++ b/src/com/android/settings/display/AdaptiveSleepPermissionPreferenceController.java @@ -37,18 +37,26 @@ public class AdaptiveSleepPermissionPreferenceController { @VisibleForTesting BannerMessagePreference mPreference; private final PackageManager mPackageManager; - private final Context mContext; public AdaptiveSleepPermissionPreferenceController(Context context) { + final String packageName = context.getPackageManager().getAttentionServicePackageName(); mPackageManager = context.getPackageManager(); - mContext = context; + final Intent intent = new Intent( + android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS); + intent.setData(Uri.parse("package:" + packageName)); + mPreference = new BannerMessagePreference(context); + mPreference.setTitle(R.string.adaptive_sleep_title_no_permission); + mPreference.setSummary(R.string.adaptive_sleep_summary_no_permission); + mPreference.setPositiveButtonText(R.string.adaptive_sleep_manage_permission_button); + mPreference.setPositiveButtonOnClickListener(p -> { + context.startActivity(intent); + }); } /** * Adds the controlled preference to the provided preference screen. */ public void addToScreen(PreferenceScreen screen) { - initializePreference(); if (!hasSufficientPermission(mPackageManager)) { screen.addPreference(mPreference); } @@ -60,19 +68,4 @@ public class AdaptiveSleepPermissionPreferenceController { public void updateVisibility() { mPreference.setVisible(!hasSufficientPermission(mPackageManager)); } - - private void initializePreference() { - final String packageName = mContext.getPackageManager().getAttentionServicePackageName(); - final Intent intent = new Intent( - android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS); - intent.setData(Uri.parse("package:" + packageName)); - mPreference = new BannerMessagePreference(mContext); - mPreference.setTitle(R.string.adaptive_sleep_title_no_permission); - mPreference.setSummary(R.string.adaptive_sleep_summary_no_permission); - mPreference.setPositiveButtonText(R.string.adaptive_sleep_manage_permission_button); - mPreference.setPositiveButtonOnClickListener(p -> { - mContext.startActivity(intent); - }); - } - } diff --git a/src/com/android/settings/display/AdaptiveSleepPreferenceController.java b/src/com/android/settings/display/AdaptiveSleepPreferenceController.java index aa02ce51c81..70d8a79f390 100644 --- a/src/com/android/settings/display/AdaptiveSleepPreferenceController.java +++ b/src/com/android/settings/display/AdaptiveSleepPreferenceController.java @@ -49,10 +49,10 @@ public class AdaptiveSleepPreferenceController { public static final String PREFERENCE_KEY = "adaptive_sleep"; private static final int DEFAULT_VALUE = 0; private final SensorPrivacyManager mPrivacyManager; - private final RestrictionUtils mRestrictionUtils; - private final PackageManager mPackageManager; - private final Context mContext; - private final MetricsFeatureProvider mMetricsFeatureProvider; + private RestrictionUtils mRestrictionUtils; + private PackageManager mPackageManager; + private Context mContext; + private MetricsFeatureProvider mMetricsFeatureProvider; @VisibleForTesting RestrictedSwitchPreference mPreference; @@ -62,6 +62,19 @@ public class AdaptiveSleepPreferenceController { mRestrictionUtils = restrictionUtils; mMetricsFeatureProvider = FeatureFactory.getFactory(context).getMetricsFeatureProvider(); mPrivacyManager = SensorPrivacyManager.getInstance(context); + mPreference = new RestrictedSwitchPreference(context); + mPreference.setTitle(R.string.adaptive_sleep_title); + mPreference.setSummary(R.string.adaptive_sleep_description); + mPreference.setChecked(isChecked()); + mPreference.setKey(PREFERENCE_KEY); + mPreference.setOnPreferenceClickListener(preference -> { + final boolean isChecked = ((RestrictedSwitchPreference) preference).isChecked(); + mMetricsFeatureProvider.action(context, SettingsEnums.ACTION_SCREEN_ATTENTION_CHANGED, + isChecked); + Settings.Secure.putInt(context.getContentResolver(), + Settings.Secure.ADAPTIVE_SLEEP, isChecked ? 1 : DEFAULT_VALUE); + return true; + }); mPackageManager = context.getPackageManager(); } @@ -73,7 +86,6 @@ public class AdaptiveSleepPreferenceController { * Adds the controlled preference to the provided preference screen. */ public void addToScreen(PreferenceScreen screen) { - initializePreference(); updatePreference(); screen.addPreference(mPreference); } @@ -91,23 +103,6 @@ public class AdaptiveSleepPreferenceController { } } - @VisibleForTesting - void initializePreference() { - mPreference = new RestrictedSwitchPreference(mContext); - mPreference.setTitle(R.string.adaptive_sleep_title); - mPreference.setSummary(R.string.adaptive_sleep_description); - mPreference.setChecked(isChecked()); - mPreference.setKey(PREFERENCE_KEY); - mPreference.setOnPreferenceChangeListener((preference, value) -> { - final boolean isChecked = (Boolean) value; - mMetricsFeatureProvider.action(mContext, SettingsEnums.ACTION_SCREEN_ATTENTION_CHANGED, - isChecked); - Settings.Secure.putInt(mContext.getContentResolver(), - Settings.Secure.ADAPTIVE_SLEEP, isChecked ? 1 : DEFAULT_VALUE); - return true; - }); - } - @VisibleForTesting boolean isChecked() { return hasSufficientPermission(mContext.getPackageManager()) && !isCameraLocked() diff --git a/src/com/android/settings/display/ScreenTimeoutSettings.java b/src/com/android/settings/display/ScreenTimeoutSettings.java index 6dfb22529fe..27e1e1bfc45 100644 --- a/src/com/android/settings/display/ScreenTimeoutSettings.java +++ b/src/com/android/settings/display/ScreenTimeoutSettings.java @@ -71,15 +71,11 @@ public class ScreenTimeoutSettings extends RadioButtonPickerFragment implements private CharSequence[] mInitialEntries; private CharSequence[] mInitialValues; private FooterPreference mPrivacyPreference; - private final MetricsFeatureProvider mMetricsFeatureProvider; + private MetricsFeatureProvider mMetricsFeatureProvider; private SensorPrivacyManager mPrivacyManager; - @VisibleForTesting - Context mContext; - @VisibleForTesting RestrictedLockUtils.EnforcedAdmin mAdmin; - @VisibleForTesting Preference mDisableOptionsPreference; @@ -101,7 +97,6 @@ public class ScreenTimeoutSettings extends RadioButtonPickerFragment implements @Override public void onAttach(Context context) { super.onAttach(context); - mContext = context; mInitialEntries = getResources().getStringArray(R.array.screen_timeout_entries); mInitialValues = getResources().getStringArray(R.array.screen_timeout_values); mAdaptiveSleepController = new AdaptiveSleepPreferenceController(context); @@ -109,6 +104,11 @@ public class ScreenTimeoutSettings extends RadioButtonPickerFragment implements context); mAdaptiveSleepCameraStatePreferenceController = new AdaptiveSleepCameraStatePreferenceController(context); + mPrivacyPreference = new FooterPreference(context); + mPrivacyPreference.setIcon(R.drawable.ic_privacy_shield_24dp); + mPrivacyPreference.setTitle(R.string.adaptive_sleep_privacy); + mPrivacyPreference.setSelectable(false); + mPrivacyPreference.setLayoutResource(R.layout.preference_footer); mPrivacyManager = SensorPrivacyManager.getInstance(context); mPrivacyManager.addSensorPrivacyListener(CAMERA, (sensor, enabled) -> mAdaptiveSleepController.updatePreference()); @@ -167,12 +167,6 @@ public class ScreenTimeoutSettings extends RadioButtonPickerFragment implements preferenceWithLargestTimeout.setChecked(true); } - mPrivacyPreference = new FooterPreference(mContext); - mPrivacyPreference.setIcon(R.drawable.ic_privacy_shield_24dp); - mPrivacyPreference.setTitle(R.string.adaptive_sleep_privacy); - mPrivacyPreference.setSelectable(false); - mPrivacyPreference.setLayoutResource(R.layout.preference_footer); - if (isScreenAttentionAvailable(getContext())) { mAdaptiveSleepPermissionController.addToScreen(screen); mAdaptiveSleepCameraStatePreferenceController.addToScreen(screen); diff --git a/tests/robotests/src/com/android/settings/display/AdaptiveSleepPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/display/AdaptiveSleepPreferenceControllerTest.java index 880f9ccdcaf..843870d0a9e 100644 --- a/tests/robotests/src/com/android/settings/display/AdaptiveSleepPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/display/AdaptiveSleepPreferenceControllerTest.java @@ -84,7 +84,6 @@ public class AdaptiveSleepPreferenceControllerTest { eq(UserManager.DISALLOW_CONFIG_SCREEN_TIMEOUT))).thenReturn(null); mController = new AdaptiveSleepPreferenceController(mContext, mRestrictionUtils); - mController.initializePreference(); when(mController.isCameraLocked()).thenReturn(false); } diff --git a/tests/robotests/src/com/android/settings/display/ScreenTimeoutSettingsTest.java b/tests/robotests/src/com/android/settings/display/ScreenTimeoutSettingsTest.java index 24bcde871e4..c4f55808870 100644 --- a/tests/robotests/src/com/android/settings/display/ScreenTimeoutSettingsTest.java +++ b/tests/robotests/src/com/android/settings/display/ScreenTimeoutSettingsTest.java @@ -60,6 +60,8 @@ public class ScreenTimeoutSettingsTest { private ScreenTimeoutSettings mSettings; private Context mContext; private ContentResolver mContentResolver; + + @Mock private Resources mResources; @Mock @@ -83,9 +85,7 @@ public class ScreenTimeoutSettingsTest { FakeFeatureFactory.setupForTest(); mContext = spy(getApplicationContext()); mSettings = spy(new ScreenTimeoutSettings()); - mSettings.mContext = mContext; mContentResolver = mContext.getContentResolver(); - mResources = spy(mContext.getResources()); doReturn(TIMEOUT_ENTRIES).when(mResources).getStringArray(R.array.screen_timeout_entries); doReturn(TIMEOUT_VALUES).when(mResources).getStringArray(R.array.screen_timeout_entries); From 7e753ccf4368141401d01525d6f6e5ab101322e9 Mon Sep 17 00:00:00 2001 From: Yi Jiang Date: Wed, 5 May 2021 12:06:42 -0700 Subject: [PATCH 17/21] Fixes NPE in Screen attention setting Bug: 186904496 Test: make RunSettingsRoboTests ROBOTEST_FILTER=com.android.settings.display Change-Id: I9bd1e6824e19cf8ea281f7af482d13ef47f36256 (cherry picked from commit f54a2be819a11d4204b537c393a203f4b05edee0) --- .../AdaptiveSleepPreferenceController.java | 31 ++++++++++--------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/src/com/android/settings/display/AdaptiveSleepPreferenceController.java b/src/com/android/settings/display/AdaptiveSleepPreferenceController.java index 7fbb01ecd38..8f61683bb63 100644 --- a/src/com/android/settings/display/AdaptiveSleepPreferenceController.java +++ b/src/com/android/settings/display/AdaptiveSleepPreferenceController.java @@ -73,7 +73,6 @@ public class AdaptiveSleepPreferenceController { * Adds the controlled preference to the provided preference screen. */ public void addToScreen(PreferenceScreen screen) { - initializePreference(); updatePreference(); screen.addPreference(mPreference); } @@ -82,6 +81,7 @@ public class AdaptiveSleepPreferenceController { * Updates the appearance of the preference. */ public void updatePreference() { + initializePreference(); final EnforcedAdmin enforcedAdmin = mRestrictionUtils.checkIfRestrictionEnforced(mContext, UserManager.DISALLOW_CONFIG_SCREEN_TIMEOUT); if (enforcedAdmin != null) { @@ -93,19 +93,22 @@ public class AdaptiveSleepPreferenceController { @VisibleForTesting void initializePreference() { - mPreference = new RestrictedSwitchPreference(mContext); - mPreference.setTitle(R.string.adaptive_sleep_title); - mPreference.setSummary(R.string.adaptive_sleep_description); - mPreference.setChecked(isChecked()); - mPreference.setKey(PREFERENCE_KEY); - mPreference.setOnPreferenceChangeListener((preference, value) -> { - final boolean isChecked = (Boolean) value; - mMetricsFeatureProvider.action(mContext, SettingsEnums.ACTION_SCREEN_ATTENTION_CHANGED, - isChecked); - Settings.Secure.putInt(mContext.getContentResolver(), - Settings.Secure.ADAPTIVE_SLEEP, isChecked ? 1 : DEFAULT_VALUE); - return true; - }); + if (mPreference == null) { + mPreference = new RestrictedSwitchPreference(mContext); + mPreference.setTitle(R.string.adaptive_sleep_title); + mPreference.setSummary(R.string.adaptive_sleep_description); + mPreference.setChecked(isChecked()); + mPreference.setKey(PREFERENCE_KEY); + mPreference.setOnPreferenceChangeListener((preference, value) -> { + final boolean isChecked = (Boolean) value; + mMetricsFeatureProvider.action(mContext, + SettingsEnums.ACTION_SCREEN_ATTENTION_CHANGED, + isChecked); + Settings.Secure.putInt(mContext.getContentResolver(), + Settings.Secure.ADAPTIVE_SLEEP, isChecked ? 1 : DEFAULT_VALUE); + return true; + }); + } } @VisibleForTesting From 1ed87faa2aef3ac167f1fe2d7ffdcebd415e6d90 Mon Sep 17 00:00:00 2001 From: Curtis Belmonte Date: Wed, 26 May 2021 15:45:38 -0700 Subject: [PATCH 18/21] Fix crash due to traffic light face Lottie animation Load the animation asset only if enabled in the resource config, to avoid crashing on unsupported device configurations. Test: Manual Fixes: 189290180 Change-Id: Iae46c735277777705c1d6f4595b557e4b0b1aef7 (cherry picked from commit adf0cabe0a1ac3efecb2f46dffd0ca5fa22ba5fb) --- res/layout/face_enroll_education.xml | 4 ++-- .../android/settings/biometrics/face/FaceEnrollEducation.java | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/res/layout/face_enroll_education.xml b/res/layout/face_enroll_education.xml index 646856fcfdd..01494790c97 100644 --- a/res/layout/face_enroll_education.xml +++ b/res/layout/face_enroll_education.xml @@ -47,6 +47,7 @@ android:layout_height="wrap_content" app:sudVideo="@raw/face_education"/> + + app:lottie_loop="true" /> Date: Wed, 26 May 2021 15:45:38 -0700 Subject: [PATCH 19/21] Fix crash due to traffic light face Lottie animation Load the animation asset only if enabled in the resource config, to avoid crashing on unsupported device configurations. Test: Manual Fixes: 189290180 Change-Id: Iae46c735277777705c1d6f4595b557e4b0b1aef7 (cherry picked from commit adf0cabe0a1ac3efecb2f46dffd0ca5fa22ba5fb) --- res/layout/face_enroll_education.xml | 4 ++-- .../android/settings/biometrics/face/FaceEnrollEducation.java | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/res/layout/face_enroll_education.xml b/res/layout/face_enroll_education.xml index 646856fcfdd..01494790c97 100644 --- a/res/layout/face_enroll_education.xml +++ b/res/layout/face_enroll_education.xml @@ -47,6 +47,7 @@ android:layout_height="wrap_content" app:sudVideo="@raw/face_education"/> + + app:lottie_loop="true" /> Date: Wed, 16 Jun 2021 17:26:12 +0800 Subject: [PATCH 20/21] Fix the issue of permanent loading when Wi-Fi is disabled Bug: 173207801 Test: manual test make RunSettingsRoboTests ROBOTEST_FILTER=NetworkProviderSettingsTest Change-Id: Ib46c620f10987ba52787aae8b5beddb5c68e0e17 (cherry picked from commit 58ff170086ef1205bebc76871c1cf5e3994ced51) --- .../network/NetworkProviderSettings.java | 43 +++++++++++-------- 1 file changed, 25 insertions(+), 18 deletions(-) diff --git a/src/com/android/settings/network/NetworkProviderSettings.java b/src/com/android/settings/network/NetworkProviderSettings.java index 9942ca3c60f..b34d9cd7a63 100644 --- a/src/com/android/settings/network/NetworkProviderSettings.java +++ b/src/com/android/settings/network/NetworkProviderSettings.java @@ -169,14 +169,18 @@ public class NetworkProviderSettings extends RestrictedSettingsFragment return WifiPickerTracker.isVerboseLoggingEnabled(); } - private boolean mIsWifiEntriesLoading; + private boolean mIsViewLoading; + private final Runnable mRemoveLoadingRunnable = () -> { + if (mIsViewLoading) { + setLoading(false, false); + mIsViewLoading = false; + } + }; + private boolean mIsWifiEntryListStale = true; private final Runnable mUpdateWifiEntryPreferencesRunnable = () -> { updateWifiEntryPreferences(); - if (mIsWifiEntriesLoading) { - setLoading(false, false); - mIsWifiEntriesLoading = false; - } + getView().postDelayed(mRemoveLoadingRunnable, 10); }; private final Runnable mHideProgressBarRunnable = () -> { setProgressBarVisible(false); @@ -250,14 +254,23 @@ public class NetworkProviderSettings extends RestrictedSettingsFragment @Override public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); - final Activity activity = getActivity(); - if (activity != null) { - mProgressHeader = setPinnedHeaderView(R.layout.progress_header) - .findViewById(R.id.progress_bar_animation); - setProgressBarVisible(false); + Activity activity = getActivity(); + if (activity == null) { + return; + } + + mProgressHeader = setPinnedHeaderView(R.layout.progress_header) + .findViewById(R.id.progress_bar_animation); + setProgressBarVisible(false); + + mWifiManager = activity.getSystemService(WifiManager.class); + if (mWifiManager != null) { + setLoading(true, false); + mIsViewLoading = true; + if (!mWifiManager.isWifiEnabled()) { + getView().postDelayed(mRemoveLoadingRunnable, 100); + } } - setLoading(true, false); - mIsWifiEntriesLoading = true; } @Override @@ -339,12 +352,6 @@ public class NetworkProviderSettings extends RestrictedSettingsFragment mWifiPickerTracker = mWifiPickerTrackerHelper.getWifiPickerTracker(); mInternetUpdater = new InternetUpdater(getContext(), getSettingsLifecycle(), this); - final Activity activity = getActivity(); - - if (activity != null) { - mWifiManager = getActivity().getSystemService(WifiManager.class); - } - mConnectListener = new WifiConnectListener(getActivity()); mSaveListener = new WifiManager.ActionListener() { From 57735f20cba56af50619a29954eb1b5d1a60a490 Mon Sep 17 00:00:00 2001 From: bsears Date: Wed, 30 Jun 2021 14:53:13 +0000 Subject: [PATCH 21/21] Revert "Return enrollment consent status to caller." This reverts commit eb1dac69f091e728171f5b8b91a6c31881edbef9. Reason for revert: Based on bisection, this CL is the root cause for bug 192420564, which breaks Setup Wizard. Bug: 192420564 Change-Id: I8d9aee7fe2415e134fcc981b0548bd9ce300db55 (cherry picked from commit c358adad5680d3a8416969e7c739195d995ee5da) --- .../biometrics/BiometricEnrollActivity.java | 128 ++++++++---------- .../MultiBiometricEnrollHelper.java | 8 ++ .../biometrics/ParentalConsentHelper.java | 2 - 3 files changed, 63 insertions(+), 75 deletions(-) diff --git a/src/com/android/settings/biometrics/BiometricEnrollActivity.java b/src/com/android/settings/biometrics/BiometricEnrollActivity.java index 3b8f25507e9..db5e003456a 100644 --- a/src/com/android/settings/biometrics/BiometricEnrollActivity.java +++ b/src/com/android/settings/biometrics/BiometricEnrollActivity.java @@ -71,7 +71,6 @@ public class BiometricEnrollActivity extends InstrumentedActivity { private static final int REQUEST_CHOOSE_OPTIONS = 3; // prompt hand phone back to parent after enrollment private static final int REQUEST_HANDOFF_PARENT = 4; - private static final int REQUEST_SINGLE_ENROLL = 5; public static final int RESULT_SKIP = BiometricEnrollBase.RESULT_SKIP; @@ -79,13 +78,8 @@ public class BiometricEnrollActivity extends InstrumentedActivity { // this only applies to fingerprint. public static final String EXTRA_SKIP_INTRO = "skip_intro"; - // Intent extra. If true, parental consent will be requested before user enrollment. - public static final String EXTRA_REQUIRE_PARENTAL_CONSENT = "require_consent"; - - // If EXTRA_REQUIRE_PARENTAL_CONSENT was used to start the activity then the result - // intent will include this extra containing a bundle of the form: - // "modality" -> consented (boolean). - public static final String EXTRA_PARENTAL_CONSENT_STATUS = "consent_status"; + // TODO: temporary while waiting for team to add real flag + public static final String EXTRA_TEMP_REQUIRE_PARENTAL_CONSENT = "require_consent"; private static final String SAVED_STATE_CONFIRMING_CREDENTIALS = "confirming_credentials"; private static final String SAVED_STATE_ENROLL_ACTION_LOGGED = "enroll_action_logged"; @@ -195,7 +189,7 @@ public class BiometricEnrollActivity extends InstrumentedActivity { // TODO(b/188847063): replace with real flag when ready mParentalOptionsRequired = intent.getBooleanExtra( - BiometricEnrollActivity.EXTRA_REQUIRE_PARENTAL_CONSENT, false); + BiometricEnrollActivity.EXTRA_TEMP_REQUIRE_PARENTAL_CONSENT, false); if (mParentalOptionsRequired && mParentalOptions == null) { mParentalConsentHelper = new ParentalConsentHelper( @@ -207,6 +201,19 @@ public class BiometricEnrollActivity extends InstrumentedActivity { } private void startEnroll() { + // TODO(b/188847063): This can be deleted, but log it now until it's wired up for real. + if (mParentalOptionsRequired) { + if (mParentalOptions == null) { + throw new IllegalStateException("consent options required, but not set"); + } + Log.d(TAG, "consent for face: " + + ParentalConsentHelper.hasFaceConsent(mParentalOptions)); + Log.d(TAG, "consent for fingerprint: " + + ParentalConsentHelper.hasFingerprintConsent(mParentalOptions)); + } else { + Log.d(TAG, "startEnroll without requiring consent"); + } + // Default behavior is to enroll BIOMETRIC_WEAK or above. See ACTION_BIOMETRIC_ENROLL. final int authenticators = getIntent().getIntExtra( EXTRA_BIOMETRIC_AUTHENTICATORS_ALLOWED, Authenticators.BIOMETRIC_WEAK); @@ -227,38 +234,21 @@ public class BiometricEnrollActivity extends InstrumentedActivity { } } - boolean canUseFace = mHasFeatureFace; - boolean canUseFingerprint = mHasFeatureFingerprint; - if (mParentalOptionsRequired) { - if (mParentalOptions == null) { - throw new IllegalStateException("consent options required, but not set"); - } - canUseFace = canUseFace - && ParentalConsentHelper.hasFaceConsent(mParentalOptions); - canUseFingerprint = canUseFingerprint - && ParentalConsentHelper.hasFingerprintConsent(mParentalOptions); - } - // This will need to be updated if the device has sensors other than BIOMETRIC_STRONG if (!setupWizard && authenticators == BiometricManager.Authenticators.DEVICE_CREDENTIAL) { launchCredentialOnlyEnroll(); - } else if (canUseFace && canUseFingerprint) { + } else if (mHasFeatureFace && mHasFeatureFingerprint) { if (mParentalOptionsRequired && mGkPwHandle != null) { launchFaceAndFingerprintEnroll(); } else { setOrConfirmCredentialsNow(); } - } else if (canUseFingerprint) { + } else if (mHasFeatureFingerprint) { launchFingerprintOnlyEnroll(); - } else if (canUseFace) { + } else if (mHasFeatureFace) { launchFaceOnlyEnroll(); - } else { // no modalities available - if (mParentalOptionsRequired) { - Log.d(TAG, "No consent for any modality: skipping enrollment"); - setResult(RESULT_OK, newResultIntent()); - } else { - Log.e(TAG, "Unknown state, finishing (was SUW: " + setupWizard + ")"); - } + } else { + Log.e(TAG, "Unknown state, finishing (was SUW: " + setupWizard + ")"); finish(); } } @@ -285,7 +275,7 @@ public class BiometricEnrollActivity extends InstrumentedActivity { if (mParentalConsentHelper != null) { handleOnActivityResultWhileConsenting(requestCode, resultCode, data); } else { - handleOnActivityResultWhileEnrolling(requestCode, resultCode, data); + handleOnActivityResultWhileEnrollingMultiple(requestCode, resultCode, data); } } @@ -315,10 +305,8 @@ public class BiometricEnrollActivity extends InstrumentedActivity { final boolean isStillPrompting = mParentalConsentHelper.launchNext( this, REQUEST_CHOOSE_OPTIONS, resultCode, data); if (!isStillPrompting) { - Log.d(TAG, "Enrollment consent options set, starting enrollment"); - mParentalOptions = mParentalConsentHelper.getConsentResult(); - mParentalConsentHelper = null; - startEnroll(); + Log.d(TAG, "Enrollment options set, requesting handoff"); + launchHandoffToParent(); } } else { Log.d(TAG, "Unknown or cancelled parental consent"); @@ -326,6 +314,18 @@ public class BiometricEnrollActivity extends InstrumentedActivity { finish(); } break; + case REQUEST_HANDOFF_PARENT: + if (resultCode == RESULT_OK) { + Log.d(TAG, "Enrollment options set, starting enrollment"); + mParentalOptions = mParentalConsentHelper.getConsentResult(); + mParentalConsentHelper = null; + startEnroll(); + } else { + Log.d(TAG, "Unknown or cancelled handoff"); + setResult(RESULT_CANCELED); + finish(); + } + break; default: Log.w(TAG, "Unknown consenting requestCode: " + requestCode + ", finishing"); finish(); @@ -333,13 +333,9 @@ public class BiometricEnrollActivity extends InstrumentedActivity { } // handles responses while multi biometric enrollment is pending - private void handleOnActivityResultWhileEnrolling( + private void handleOnActivityResultWhileEnrollingMultiple( int requestCode, int resultCode, Intent data) { - if (requestCode == REQUEST_HANDOFF_PARENT) { - Log.d(TAG, "Enrollment complete, requesting handoff, result: " + resultCode); - setResult(RESULT_OK, newResultIntent()); - finish(); - } else if (mMultiBiometricEnrollHelper == null) { + if (mMultiBiometricEnrollHelper == null) { overridePendingTransition(R.anim.sud_slide_next_in, R.anim.sud_slide_next_out); switch (requestCode) { @@ -359,37 +355,15 @@ public class BiometricEnrollActivity extends InstrumentedActivity { finish(); } break; - case REQUEST_SINGLE_ENROLL: - finishOrLaunchHandToParent(resultCode); - break; default: Log.w(TAG, "Unknown enrolling requestCode: " + requestCode + ", finishing"); finish(); } } else { - Log.d(TAG, "RequestCode: " + requestCode + " resultCode: " + resultCode); - BiometricUtils.removeGatekeeperPasswordHandle(this, mGkPwHandle); - finishOrLaunchHandToParent(resultCode); + mMultiBiometricEnrollHelper.onActivityResult(requestCode, resultCode, data); } } - private void finishOrLaunchHandToParent(int resultCode) { - if (mParentalOptionsRequired) { - launchHandoffToParent(); - } else { - setResult(resultCode); - finish(); - } - } - - private Intent newResultIntent() { - final Intent intent = new Intent(); - final Bundle consentStatus = mParentalOptions.deepCopy(); - intent.putExtra(EXTRA_PARENTAL_CONSENT_STATUS, consentStatus); - Log.v(TAG, "Result consent status: " + consentStatus); - return intent; - } - private static boolean isSuccessfulConfirmOrChooseCredential(int requestCode, int resultCode) { final boolean okChoose = requestCode == REQUEST_CHOOSE_LOCK && resultCode == ChooseLockPattern.RESULT_FINISHED; @@ -410,8 +384,8 @@ public class BiometricEnrollActivity extends InstrumentedActivity { super.onStop(); if (mConfirmingCredentials - || mParentalOptionsRequired - || mMultiBiometricEnrollHelper != null) { + || mMultiBiometricEnrollHelper != null + || mParentalConsentHelper != null) { return; } @@ -421,6 +395,7 @@ public class BiometricEnrollActivity extends InstrumentedActivity { } } + private void setOrConfirmCredentialsNow() { if (!mConfirmingCredentials) { mConfirmingCredentials = true; @@ -479,14 +454,21 @@ public class BiometricEnrollActivity extends InstrumentedActivity { } } - // This should only be used to launch enrollment for single-sensor devices. - private void launchSingleSensorEnrollActivity(@NonNull Intent intent, int requestCode) { + /** + * This should only be used to launch enrollment for single-sensor devices, which use + * FLAG_ACTIVITY_FORWARD_RESULT path. + * + * @param intent Enrollment activity that should be started (e.g. FaceEnrollIntroduction.class, + * etc). + */ + private void launchSingleSensorEnrollActivity(@NonNull Intent intent) { + intent.setFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT); byte[] hardwareAuthToken = null; if (this instanceof InternalActivity) { hardwareAuthToken = getIntent().getByteArrayExtra( ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE_TOKEN); } - BiometricUtils.launchEnrollForResult(this, intent, requestCode, hardwareAuthToken, + BiometricUtils.launchEnrollForResult(this, intent, 0 /* requestCode */, hardwareAuthToken, mGkPwHandle, mUserId); } @@ -495,7 +477,7 @@ public class BiometricEnrollActivity extends InstrumentedActivity { // If only device credential was specified, ask the user to only set that up. intent = new Intent(this, ChooseLockGeneric.class); intent.putExtra(ChooseLockGeneric.ChooseLockGenericFragment.HIDE_INSECURE_OPTIONS, true); - launchSingleSensorEnrollActivity(intent, 0 /* requestCode */); + launchSingleSensorEnrollActivity(intent); } private void launchFingerprintOnlyEnroll() { @@ -507,12 +489,12 @@ public class BiometricEnrollActivity extends InstrumentedActivity { } else { intent = BiometricUtils.getFingerprintIntroIntent(this, getIntent()); } - launchSingleSensorEnrollActivity(intent, REQUEST_SINGLE_ENROLL); + launchSingleSensorEnrollActivity(intent); } private void launchFaceOnlyEnroll() { final Intent intent = BiometricUtils.getFaceIntroIntent(this, getIntent()); - launchSingleSensorEnrollActivity(intent, REQUEST_SINGLE_ENROLL); + launchSingleSensorEnrollActivity(intent); } private void launchFaceAndFingerprintEnroll() { diff --git a/src/com/android/settings/biometrics/MultiBiometricEnrollHelper.java b/src/com/android/settings/biometrics/MultiBiometricEnrollHelper.java index 44d75c5808d..74d7c535e05 100644 --- a/src/com/android/settings/biometrics/MultiBiometricEnrollHelper.java +++ b/src/com/android/settings/biometrics/MultiBiometricEnrollHelper.java @@ -20,6 +20,7 @@ import android.app.PendingIntent; import android.content.Intent; import android.hardware.face.FaceManager; import android.hardware.fingerprint.FingerprintManager; +import android.util.Log; import androidx.annotation.NonNull; import androidx.fragment.app.FragmentActivity; @@ -106,4 +107,11 @@ public class MultiBiometricEnrollHelper { hardwareAuthToken, mGkPwHandle, mUserId); })); } + + void onActivityResult(int requestCode, int resultCode, Intent data) { + Log.d(TAG, "RequestCode: " + requestCode + " resultCode: " + resultCode); + BiometricUtils.removeGatekeeperPasswordHandle(mActivity, mGkPwHandle); + mActivity.setResult(resultCode); + mActivity.finish(); + } } diff --git a/src/com/android/settings/biometrics/ParentalConsentHelper.java b/src/com/android/settings/biometrics/ParentalConsentHelper.java index 6c4004e5c55..905a95527ef 100644 --- a/src/com/android/settings/biometrics/ParentalConsentHelper.java +++ b/src/com/android/settings/biometrics/ParentalConsentHelper.java @@ -46,7 +46,6 @@ public class ParentalConsentHelper { private static final String KEY_FACE_CONSENT = "face"; private static final String KEY_FINGERPRINT_CONSENT = "fingerprint"; - private static final String KEY_IRIS_CONSENT = "iris"; private final boolean mRequireFace; private final boolean mRequireFingerprint; @@ -154,7 +153,6 @@ public class ParentalConsentHelper { result.putBoolean(KEY_FACE_CONSENT, mConsentFace != null ? mConsentFace : false); result.putBoolean(KEY_FINGERPRINT_CONSENT, mConsentFingerprint != null ? mConsentFingerprint : false); - result.putBoolean(KEY_IRIS_CONSENT, false); return result; }