From 7491e86e2b262247254cf53e4d094dce5515d79f Mon Sep 17 00:00:00 2001 From: Kiyoung Kim Date: Fri, 22 Feb 2019 13:35:46 +0900 Subject: [PATCH 01/11] Schematize Crypto state system property Properties accessed across partitions are now schematized and will become APIs to make explicit interfaces among partitions. Bug: 117924132 Test: m -j Change-Id: I5df6145a436c38dd9fed4325b02ac37a801c2f5e Merged-In: I957a8e37a88f7bb6d5007a36c02952d3539580fe --- .../development/FileEncryptionPreferenceController.java | 3 ++- .../development/FileEncryptionPreferenceControllerTest.java | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/com/android/settings/development/FileEncryptionPreferenceController.java b/src/com/android/settings/development/FileEncryptionPreferenceController.java index 731f4872471..a988fdd9042 100644 --- a/src/com/android/settings/development/FileEncryptionPreferenceController.java +++ b/src/com/android/settings/development/FileEncryptionPreferenceController.java @@ -63,7 +63,8 @@ public class FileEncryptionPreferenceController extends DeveloperOptionsPreferen @Override public void updateState(Preference preference) { - if (!TextUtils.equals("file", CryptoProperties.type().orElse("none"))) { + if (CryptoProperties.type().orElse(CryptoProperties.type_values.NONE) != + CryptoProperties.type_values.FILE) { return; } diff --git a/tests/robotests/src/com/android/settings/development/FileEncryptionPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/development/FileEncryptionPreferenceControllerTest.java index afd465aafa3..fb5eaab8f97 100644 --- a/tests/robotests/src/com/android/settings/development/FileEncryptionPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/development/FileEncryptionPreferenceControllerTest.java @@ -91,7 +91,7 @@ public class FileEncryptionPreferenceControllerTest { ReflectionHelpers.setField(mController, "mStorageManager", mStorageManager); when(mStorageManager.isConvertibleToFBE()).thenReturn(true); mController.displayPreference(mPreferenceScreen); - CryptoProperties.type("foobar"); + CryptoProperties.type(CryptoProperties.type_values.NONE); mController.updateState(mPreference); @@ -105,7 +105,7 @@ public class FileEncryptionPreferenceControllerTest { ReflectionHelpers.setField(mController, "mStorageManager", mStorageManager); when(mStorageManager.isConvertibleToFBE()).thenReturn(true); mController.displayPreference(mPreferenceScreen); - CryptoProperties.type("file"); + CryptoProperties.type(CryptoProperties.type_values.FILE); mController.updateState(mPreference); From 411ca28940d4bf1a8e7121b39b504a3de4c40cb4 Mon Sep 17 00:00:00 2001 From: "Chris.CC Lee" Date: Wed, 6 Mar 2019 19:49:15 +0800 Subject: [PATCH 02/11] Align layouts between single and two target preferences. Change the layout to align view components with TwoTargetPreference. Fixes: 124084391 Test: Visual Change-Id: I417a8e442bd80c51be04e3f33514a6605c9b45f8 --- res/layout/preference_single_target.xml | 96 +++++++++++++++++++ .../widget/SingleTargetGearPreference.java | 36 +++++-- 2 files changed, 122 insertions(+), 10 deletions(-) create mode 100644 res/layout/preference_single_target.xml diff --git a/res/layout/preference_single_target.xml b/res/layout/preference_single_target.xml new file mode 100644 index 00000000000..b4a9de01636 --- /dev/null +++ b/res/layout/preference_single_target.xml @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/com/android/settings/widget/SingleTargetGearPreference.java b/src/com/android/settings/widget/SingleTargetGearPreference.java index 48876fa81d9..f6496ed4d88 100644 --- a/src/com/android/settings/widget/SingleTargetGearPreference.java +++ b/src/com/android/settings/widget/SingleTargetGearPreference.java @@ -18,9 +18,10 @@ package com.android.settings.widget; import android.content.Context; import android.util.AttributeSet; +import android.view.View; -import androidx.core.content.res.TypedArrayUtils; import androidx.preference.Preference; +import androidx.preference.PreferenceViewHolder; import com.android.settings.R; @@ -28,23 +29,38 @@ import com.android.settings.R; * A preference with single target and a gear icon on the side. */ public class SingleTargetGearPreference extends Preference { - - public SingleTargetGearPreference(Context context, AttributeSet attrs, - int defStyleAttr, int defStyleRes) { + public SingleTargetGearPreference(Context context, AttributeSet attrs, int defStyleAttr, + int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); - setWidgetLayoutResource(R.layout.preference_widget_gear_no_bg); + init(); } public SingleTargetGearPreference(Context context, AttributeSet attrs, int defStyleAttr) { - this(context, attrs, defStyleAttr, 0 /* defStyleRes */); + super(context, attrs, defStyleAttr); + init(); } public SingleTargetGearPreference(Context context, AttributeSet attrs) { - this(context, attrs, TypedArrayUtils.getAttr(context, R.attr.preferenceStyle, - android.R.attr.preferenceStyle)); + super(context, attrs); + init(); } public SingleTargetGearPreference(Context context) { - this(context, null /* attrs */); + super(context); + init(); } -} \ No newline at end of file + + private void init() { + setLayoutResource(R.layout.preference_single_target); + setWidgetLayoutResource(R.layout.preference_widget_gear_optional_background); + } + + @Override + public void onBindViewHolder(PreferenceViewHolder holder) { + super.onBindViewHolder(holder); + final View divider = holder.findViewById(com.android.settingslib.R.id.two_target_divider); + if (divider != null) { + divider.setVisibility(View.INVISIBLE); + } + } +} From 4d626f63ec09b03ad9f633cb9ddf0cdc9beeefcd Mon Sep 17 00:00:00 2001 From: Chandan Nath Date: Tue, 12 Mar 2019 10:52:53 +0000 Subject: [PATCH 03/11] [Multi-user] Show Backup only if Backup is activated This almost reverts the change to SettingsActivity#doUpdateTilesList in ag/6140694 except that instead of setting enabled to true, we set it to whether backup is activated for this user. Bug: 124114084 Test: 1a) Set up secondary user 1b) See that there is no Backup option in Settings Homepage - System 1c) adb shell bmgr --user 10 activate true 1d) Backup option is now present 1e) adb shell bmgr --user 10 activate false 1f) Backup option isnt there again Change-Id: I3f17aabee92bedc91386444c2f0aede696d0fd13 --- src/com/android/settings/SettingsActivity.java | 8 ++++++++ src/com/android/settings/backup/BackupSettingsHelper.java | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/com/android/settings/SettingsActivity.java b/src/com/android/settings/SettingsActivity.java index 541ca3a66ad..001e65be8be 100644 --- a/src/com/android/settings/SettingsActivity.java +++ b/src/com/android/settings/SettingsActivity.java @@ -50,6 +50,8 @@ import androidx.preference.PreferenceManager; import com.android.internal.util.ArrayUtils; import com.android.settings.Settings.WifiSettingsActivity; import com.android.settings.applications.manageapplications.ManageApplications; +import com.android.settings.backup.BackupSettingsHelper; +import com.android.settings.backup.UserBackupSettingsActivity; import com.android.settings.core.OnActivityResultListener; import com.android.settings.core.SettingsBaseActivity; import com.android.settings.core.SubSettingLauncher; @@ -630,6 +632,12 @@ public class SettingsActivity extends SettingsBaseActivity showDev, isAdmin) || somethingChanged; + // Enable/disable backup settings depending on whether backup is activated for the user. + boolean isBackupActive = new BackupSettingsHelper(this).isBackupServiceActive(); + somethingChanged = setTileEnabled(changedList, new ComponentName(packageName, + UserBackupSettingsActivity.class.getName()), isBackupActive, isAdmin) + || somethingChanged; + somethingChanged = setTileEnabled(changedList, new ComponentName(packageName, Settings.WifiDisplaySettingsActivity.class.getName()), WifiDisplaySettings.isAvailable(this), isAdmin) diff --git a/src/com/android/settings/backup/BackupSettingsHelper.java b/src/com/android/settings/backup/BackupSettingsHelper.java index fa77154081c..b836e55a9cf 100644 --- a/src/com/android/settings/backup/BackupSettingsHelper.java +++ b/src/com/android/settings/backup/BackupSettingsHelper.java @@ -209,7 +209,7 @@ public class BackupSettingsHelper { } /** Checks if backup service is enabled for this user. */ - private boolean isBackupServiceActive() { + public boolean isBackupServiceActive() { boolean backupOkay; try { backupOkay = mBackupManager.isBackupServiceActive(UserHandle.myUserId()); From 000c73cc9888ead046c511ffe825b4387b58c93c Mon Sep 17 00:00:00 2001 From: jackqdyulei Date: Tue, 12 Mar 2019 14:24:35 -0700 Subject: [PATCH 04/11] Update battery string Fixes: 128318092 Test: Build Change-Id: Ib38a3f84c6029e84b2a189fb5cffc0ea9cac33d6 --- res/values/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/res/values/strings.xml b/res/values/strings.xml index b912c9d87bf..257a759b929 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -5242,8 +5242,8 @@ Tablet used more than usual Device used more than usual - - Battery may run out soon + + Battery may run out earlier than usual Your phone has been used more than usual. Your battery may run out sooner than expected.\n\nTop %1$d apps you used since full charge: From e2eefcd16327d467e014c33ce3aad147f97972da Mon Sep 17 00:00:00 2001 From: Fan Zhang Date: Tue, 12 Mar 2019 12:50:20 -0700 Subject: [PATCH 05/11] Suppress search from one of the build number prefs. And make the search-enabled one copyable. Fixes: 127962713 Test: search Change-Id: I0867ea8a376e3aac5e94cd70245833b516bb154d --- res/xml/firmware_version.xml | 1 + res/xml/network_and_internet_v2.xml | 2 +- .../BuildNumberPreferenceController.java | 34 +---------- ...SimpleBuildNumberPreferenceController.java | 28 ++++++++++ .../BuildNumberPreferenceControllerTest.java | 20 ------- ...leBuildNumberPreferenceControllerTest.java | 56 +++++++++++++++++++ 6 files changed, 88 insertions(+), 53 deletions(-) create mode 100644 tests/robotests/src/com/android/settings/deviceinfo/firmwareversion/SimpleBuildNumberPreferenceControllerTest.java diff --git a/res/xml/firmware_version.xml b/res/xml/firmware_version.xml index 2914ef1acf3..75336ce86b0 100644 --- a/res/xml/firmware_version.xml +++ b/res/xml/firmware_version.xml @@ -68,6 +68,7 @@ android:title="@string/build_number" android:summary="@string/summary_placeholder" settings:enableCopying="true" + settings:allowDynamicSummaryInSlice="true" settings:controller="com.android.settings.deviceinfo.firmwareversion.SimpleBuildNumberPreferenceController"/> \ No newline at end of file diff --git a/res/xml/network_and_internet_v2.xml b/res/xml/network_and_internet_v2.xml index 6078e7a921d..2451c57410c 100644 --- a/res/xml/network_and_internet_v2.xml +++ b/res/xml/network_and_internet_v2.xml @@ -79,7 +79,7 @@ settings:useAdminDisabledSummary="true" /> Date: Tue, 12 Mar 2019 12:59:29 -0700 Subject: [PATCH 06/11] Remove unneeded airplane mode strings Wifi tether doesn't care about airplane more anymore so we don't need these. Test: robotests pass Bug: 111681176 Change-Id: Icf2cc8c944dc9e2c6f7bdf11478a2772292ea913 --- res/values/strings.xml | 2 -- 1 file changed, 2 deletions(-) diff --git a/res/values/strings.xml b/res/values/strings.xml index b912c9d87bf..6976601c7c3 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -2390,8 +2390,6 @@ AndroidAP WPA2 PSK hotspot AndroidHotspot - - Unavailable because airplane mode is turned on From 2fe7e9fc456f71f3f0229205fcb34a2b18881290 Mon Sep 17 00:00:00 2001 From: Fan Zhang Date: Tue, 12 Mar 2019 15:46:12 -0700 Subject: [PATCH 07/11] Refactor CustomSliceManager. - Make everything that can be static, static. - Also removed a unused slice for battery info. Next step - going to make CustomSliceManager into a regular class instead of getting it from FeatureProvider. This way it's no longer an application level singleton, then we can do things like attaching lifecycle to it. It will be easier to deal with "session" based use case after the refactor Bug: 123937830 Test: manual Change-Id: I384761a6894fa907f72a3610437835c4dd4d1944 --- .../deviceinfo/BatteryInfoSlice.java | 139 ------------------ .../settings/slices/CustomSliceManager.java | 66 +-------- .../settings/slices/CustomSliceRegistry.java | 76 ++++++++-- .../slices/SettingsSliceProvider.java | 4 +- .../slices/SliceBroadcastReceiver.java | 2 +- .../slices/SliceDeepLinkSpringBoard.java | 2 +- .../ContextualCardLoaderTest.java | 10 -- .../ContextualCardManagerTest.java | 2 +- .../deviceinfo/BatteryInfoSliceTest.java | 75 ---------- .../slices/SpecialCaseSliceManagerTest.java | 12 +- 10 files changed, 80 insertions(+), 308 deletions(-) delete mode 100644 src/com/android/settings/homepage/contextualcards/deviceinfo/BatteryInfoSlice.java delete mode 100644 tests/robotests/src/com/android/settings/homepage/contextualcards/deviceinfo/BatteryInfoSliceTest.java diff --git a/src/com/android/settings/homepage/contextualcards/deviceinfo/BatteryInfoSlice.java b/src/com/android/settings/homepage/contextualcards/deviceinfo/BatteryInfoSlice.java deleted file mode 100644 index 6c7f930a5e2..00000000000 --- a/src/com/android/settings/homepage/contextualcards/deviceinfo/BatteryInfoSlice.java +++ /dev/null @@ -1,139 +0,0 @@ -/* - * Copyright (C) 2018 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.homepage.contextualcards.deviceinfo; - -import android.app.PendingIntent; -import android.app.settings.SettingsEnums; -import android.content.Context; -import android.content.Intent; -import android.content.IntentFilter; -import android.net.Uri; -import android.os.PowerManager; - -import androidx.annotation.VisibleForTesting; -import androidx.core.graphics.drawable.IconCompat; -import androidx.slice.Slice; -import androidx.slice.builders.ListBuilder; -import androidx.slice.builders.SliceAction; - -import com.android.settings.R; -import com.android.settings.SubSettings; -import com.android.settings.Utils; -import com.android.settings.fuelgauge.BatteryInfo; -import com.android.settings.fuelgauge.PowerUsageSummary; -import com.android.settings.slices.CustomSliceRegistry; -import com.android.settings.slices.CustomSliceable; -import com.android.settings.slices.SliceBuilderUtils; - -/** - * Utility class to build a Battery Slice, and handle all associated actions. - */ -public class BatteryInfoSlice implements CustomSliceable { - private static final String TAG = "BatteryInfoSlice"; - - private final Context mContext; - - private BatteryInfo mBatteryInfo; - private boolean mIsBatteryInfoLoading; - - public BatteryInfoSlice(Context context) { - mContext = context; - } - - @Override - public Slice getSlice() { - if (mBatteryInfo == null) { - mIsBatteryInfoLoading = true; - loadBatteryInfo(); - } - final IconCompat icon = IconCompat.createWithResource(mContext, - R.drawable.ic_settings_battery); - final CharSequence title = mContext.getText(R.string.power_usage_summary_title); - final SliceAction primarySliceAction = SliceAction.createDeeplink(getPrimaryAction(), icon, - ListBuilder.ICON_IMAGE, title); - final Slice slice = new ListBuilder(mContext, CustomSliceRegistry.BATTERY_INFO_SLICE_URI, - ListBuilder.INFINITY) - .setAccentColor(Utils.getColorAccentDefaultColor(mContext)) - .setHeader(new ListBuilder.HeaderBuilder().setTitle(title)) - .addRow(new ListBuilder.RowBuilder() - .setTitle(getBatteryPercentString(), mIsBatteryInfoLoading) - .setSubtitle(getSummary(), mIsBatteryInfoLoading) - .setPrimaryAction(primarySliceAction)) - .build(); - mBatteryInfo = null; - mIsBatteryInfoLoading = false; - return slice; - } - - @Override - public Uri getUri() { - return CustomSliceRegistry.BATTERY_INFO_SLICE_URI; - } - - @Override - public void onNotifyChange(Intent intent) { - - } - - @Override - public Intent getIntent() { - final String screenTitle = mContext.getText(R.string.power_usage_summary_title).toString(); - return SliceBuilderUtils.buildSearchResultPageIntent(mContext, - PowerUsageSummary.class.getName(), "" /* key */, screenTitle, - SettingsEnums.SLICE) - .setClassName(mContext.getPackageName(), SubSettings.class.getName()) - .setData(CustomSliceRegistry.BATTERY_INFO_SLICE_URI); - } - - @Override - public IntentFilter getIntentFilter() { - final IntentFilter intentFilter = new IntentFilter(); - intentFilter.addAction(PowerManager.ACTION_POWER_SAVE_MODE_CHANGED); - intentFilter.addAction(Intent.ACTION_POWER_CONNECTED); - intentFilter.addAction(Intent.ACTION_POWER_DISCONNECTED); - intentFilter.addAction(Intent.ACTION_BATTERY_LEVEL_CHANGED); - return intentFilter; - } - - @VisibleForTesting - void loadBatteryInfo() { - BatteryInfo.getBatteryInfo(mContext, info -> { - mBatteryInfo = info; - mContext.getContentResolver().notifyChange(getUri(), null); - }, true); - } - - @VisibleForTesting - CharSequence getBatteryPercentString() { - return mBatteryInfo == null ? null : mBatteryInfo.batteryPercentString; - } - - @VisibleForTesting - CharSequence getSummary() { - if (mBatteryInfo == null) { - return null; - } - return mBatteryInfo.remainingLabel == null ? mBatteryInfo.statusLabel - : mBatteryInfo.remainingLabel; - } - - private PendingIntent getPrimaryAction() { - final Intent intent = getIntent(); - return PendingIntent.getActivity(mContext, 0 /* requestCode */, - intent, 0 /* flags */); - } -} \ No newline at end of file diff --git a/src/com/android/settings/slices/CustomSliceManager.java b/src/com/android/settings/slices/CustomSliceManager.java index c9e473a9c20..91f55ae9832 100644 --- a/src/com/android/settings/slices/CustomSliceManager.java +++ b/src/com/android/settings/slices/CustomSliceManager.java @@ -18,25 +18,6 @@ package com.android.settings.slices; import android.content.Context; import android.net.Uri; -import android.util.ArrayMap; - -import androidx.annotation.VisibleForTesting; - -import com.android.settings.flashlight.FlashlightSlice; -import com.android.settings.homepage.contextualcards.deviceinfo.BatteryInfoSlice; -import com.android.settings.homepage.contextualcards.deviceinfo.DataUsageSlice; -import com.android.settings.homepage.contextualcards.deviceinfo.DeviceInfoSlice; -import com.android.settings.homepage.contextualcards.deviceinfo.EmergencyInfoSlice; -import com.android.settings.homepage.contextualcards.deviceinfo.StorageSlice; -import com.android.settings.homepage.contextualcards.slices.BatteryFixSlice; -import com.android.settings.homepage.contextualcards.slices.BluetoothDevicesSlice; -import com.android.settings.homepage.contextualcards.slices.LowStorageSlice; -import com.android.settings.homepage.contextualcards.slices.NotificationChannelSlice; -import com.android.settings.location.LocationSlice; -import com.android.settings.media.MediaOutputSlice; -import com.android.settings.network.telephony.MobileDataSlice; -import com.android.settings.wifi.slice.ContextualWifiSlice; -import com.android.settings.wifi.slice.WifiSlice; import java.util.Map; import java.util.WeakHashMap; @@ -47,17 +28,12 @@ import java.util.WeakHashMap; */ public class CustomSliceManager { - @VisibleForTesting - final Map> mUriMap; - private final Context mContext; private final Map mSliceableCache; public CustomSliceManager(Context context) { mContext = context.getApplicationContext(); - mUriMap = new ArrayMap<>(); mSliceableCache = new WeakHashMap<>(); - addSlices(); } /** @@ -67,12 +43,12 @@ public class CustomSliceManager { * the only thing that should be needed to create the object. */ public CustomSliceable getSliceableFromUri(Uri uri) { - final Uri newUri = removeParameterFromUri(uri); + final Uri newUri = CustomSliceRegistry.removeParameterFromUri(uri); if (mSliceableCache.containsKey(newUri)) { return mSliceableCache.get(newUri); } - final Class clazz = mUriMap.get(newUri); + final Class clazz = CustomSliceRegistry.getSliceClassByUri(newUri); if (clazz == null) { throw new IllegalArgumentException("No Slice found for uri: " + uri); } @@ -82,9 +58,6 @@ public class CustomSliceManager { return sliceable; } - private Uri removeParameterFromUri(Uri uri) { - return uri != null ? uri.buildUpon().clearQuery().build() : null; - } /** * Return a {@link CustomSliceable} associated to the Action. @@ -95,39 +68,4 @@ public class CustomSliceManager { public CustomSliceable getSliceableFromIntentAction(String action) { return getSliceableFromUri(Uri.parse(action)); } - - /** - * Returns {@code true} if {@param uri} is a valid Slice Uri handled by - * {@link CustomSliceManager}. - */ - public boolean isValidUri(Uri uri) { - return mUriMap.containsKey(removeParameterFromUri(uri)); - } - - /** - * Returns {@code true} if {@param action} is a valid intent action handled by - * {@link CustomSliceManager}. - */ - public boolean isValidAction(String action) { - return isValidUri(Uri.parse(action)); - } - - private void addSlices() { - mUriMap.put(CustomSliceRegistry.BATTERY_FIX_SLICE_URI, BatteryFixSlice.class); - mUriMap.put(CustomSliceRegistry.BATTERY_INFO_SLICE_URI, BatteryInfoSlice.class); - mUriMap.put(CustomSliceRegistry.BLUETOOTH_DEVICES_SLICE_URI, BluetoothDevicesSlice.class); - mUriMap.put(CustomSliceRegistry.CONTEXTUAL_WIFI_SLICE_URI, ContextualWifiSlice.class); - mUriMap.put(CustomSliceRegistry.DATA_USAGE_SLICE_URI, DataUsageSlice.class); - mUriMap.put(CustomSliceRegistry.DEVICE_INFO_SLICE_URI, DeviceInfoSlice.class); - mUriMap.put(CustomSliceRegistry.EMERGENCY_INFO_SLICE_URI, EmergencyInfoSlice.class); - mUriMap.put(CustomSliceRegistry.FLASHLIGHT_SLICE_URI, FlashlightSlice.class); - mUriMap.put(CustomSliceRegistry.LOCATION_SLICE_URI, LocationSlice.class); - mUriMap.put(CustomSliceRegistry.LOW_STORAGE_SLICE_URI, LowStorageSlice.class); - mUriMap.put(CustomSliceRegistry.MOBILE_DATA_SLICE_URI, MobileDataSlice.class); - mUriMap.put(CustomSliceRegistry.NOTIFICATION_CHANNEL_SLICE_URI, - NotificationChannelSlice.class); - mUriMap.put(CustomSliceRegistry.STORAGE_SLICE_URI, StorageSlice.class); - mUriMap.put(CustomSliceRegistry.WIFI_SLICE_URI, WifiSlice.class); - mUriMap.put(CustomSliceRegistry.MEDIA_OUTPUT_SLICE_URI, MediaOutputSlice.class); - } } diff --git a/src/com/android/settings/slices/CustomSliceRegistry.java b/src/com/android/settings/slices/CustomSliceRegistry.java index 3a1db69c00a..12e7b48ffb2 100644 --- a/src/com/android/settings/slices/CustomSliceRegistry.java +++ b/src/com/android/settings/slices/CustomSliceRegistry.java @@ -24,11 +24,30 @@ import static com.android.settings.notification.ZenModePreferenceController.ZEN_ import android.content.ContentResolver; import android.net.Uri; import android.provider.SettingsSlicesContract; +import android.util.ArrayMap; +import androidx.annotation.VisibleForTesting; + +import com.android.settings.flashlight.FlashlightSlice; import com.android.settings.fuelgauge.batterytip.BatteryTipPreferenceController; +import com.android.settings.homepage.contextualcards.deviceinfo.DataUsageSlice; +import com.android.settings.homepage.contextualcards.deviceinfo.DeviceInfoSlice; +import com.android.settings.homepage.contextualcards.deviceinfo.EmergencyInfoSlice; +import com.android.settings.homepage.contextualcards.deviceinfo.StorageSlice; +import com.android.settings.homepage.contextualcards.slices.BatteryFixSlice; +import com.android.settings.homepage.contextualcards.slices.BluetoothDevicesSlice; +import com.android.settings.homepage.contextualcards.slices.LowStorageSlice; +import com.android.settings.homepage.contextualcards.slices.NotificationChannelSlice; +import com.android.settings.location.LocationSlice; +import com.android.settings.media.MediaOutputSlice; +import com.android.settings.network.telephony.MobileDataSlice; import com.android.settings.wifi.calling.WifiCallingSliceHelper; +import com.android.settings.wifi.slice.ContextualWifiSlice; +import com.android.settings.wifi.slice.WifiSlice; import com.android.settingslib.media.MediaOutputSliceConstants; +import java.util.Map; + /** * A registry of custom slice Uris. */ @@ -53,15 +72,7 @@ public class CustomSliceRegistry { .appendEncodedPath(SettingsSlicesContract.PATH_SETTING_INTENT) .appendPath(BatteryTipPreferenceController.PREF_NAME) .build(); - /** - * Backing Uri for the Battery info Slice. - */ - public static final Uri BATTERY_INFO_SLICE_URI = new Uri.Builder() - .scheme(ContentResolver.SCHEME_CONTENT) - .authority(SettingsSliceProvider.SLICE_AUTHORITY) - .appendEncodedPath(SettingsSlicesContract.PATH_SETTING_INTENT) - .appendPath("battery_card") - .build(); + /** * Backing Uri for the Bluetooth Slice. */ @@ -287,4 +298,51 @@ public class CustomSliceRegistry { .appendPath(SettingsSlicesContract.PATH_SETTING_ACTION) .appendPath(MediaOutputSliceConstants.KEY_MEDIA_OUTPUT) .build(); + + @VisibleForTesting + static final Map> sUriToSlice; + + static { + sUriToSlice = new ArrayMap<>(); + + sUriToSlice.put(BATTERY_FIX_SLICE_URI, BatteryFixSlice.class); + sUriToSlice.put(BLUETOOTH_DEVICES_SLICE_URI, BluetoothDevicesSlice.class); + sUriToSlice.put(CONTEXTUAL_WIFI_SLICE_URI, ContextualWifiSlice.class); + sUriToSlice.put(DATA_USAGE_SLICE_URI, DataUsageSlice.class); + sUriToSlice.put(DEVICE_INFO_SLICE_URI, DeviceInfoSlice.class); + sUriToSlice.put(EMERGENCY_INFO_SLICE_URI, EmergencyInfoSlice.class); + sUriToSlice.put(FLASHLIGHT_SLICE_URI, FlashlightSlice.class); + sUriToSlice.put(LOCATION_SLICE_URI, LocationSlice.class); + sUriToSlice.put(LOW_STORAGE_SLICE_URI, LowStorageSlice.class); + sUriToSlice.put(MOBILE_DATA_SLICE_URI, MobileDataSlice.class); + sUriToSlice.put(NOTIFICATION_CHANNEL_SLICE_URI, NotificationChannelSlice.class); + sUriToSlice.put(STORAGE_SLICE_URI, StorageSlice.class); + sUriToSlice.put(WIFI_SLICE_URI, WifiSlice.class); + sUriToSlice.put(MEDIA_OUTPUT_SLICE_URI, MediaOutputSlice.class); + } + + public static Class getSliceClassByUri(Uri uri) { + return sUriToSlice.get(uri); + } + + public static Uri removeParameterFromUri(Uri uri) { + return uri != null ? uri.buildUpon().clearQuery().build() : null; + } + + /** + * Returns {@code true} if {@param uri} is a valid Slice Uri handled by + * {@link CustomSliceManager}. + */ + public static boolean isValidUri(Uri uri) { + return sUriToSlice.containsKey(removeParameterFromUri(uri)); + } + + /** + * Returns {@code true} if {@param action} is a valid intent action handled by + * {@link CustomSliceManager}. + */ + public static boolean isValidAction(String action) { + return isValidUri(Uri.parse(action)); + } + } diff --git a/src/com/android/settings/slices/SettingsSliceProvider.java b/src/com/android/settings/slices/SettingsSliceProvider.java index 397b2fc631c..d019368fd62 100644 --- a/src/com/android/settings/slices/SettingsSliceProvider.java +++ b/src/com/android/settings/slices/SettingsSliceProvider.java @@ -147,7 +147,7 @@ public class SettingsSliceProvider extends SliceProvider { @Override public void onSlicePinned(Uri sliceUri) { - if (mCustomSliceManager.isValidUri(sliceUri)) { + if (CustomSliceRegistry.isValidUri(sliceUri)) { final CustomSliceable sliceable = mCustomSliceManager.getSliceableFromUri(sliceUri); final IntentFilter filter = sliceable.getIntentFilter(); if (filter != null) { @@ -194,7 +194,7 @@ public class SettingsSliceProvider extends SliceProvider { // Before adding a slice to {@link CustomSliceManager}, please get approval // from the Settings team. - if (mCustomSliceManager.isValidUri(sliceUri)) { + if (CustomSliceRegistry.isValidUri(sliceUri)) { final CustomSliceable sliceable = mCustomSliceManager.getSliceableFromUri( sliceUri); return sliceable.getSlice(); diff --git a/src/com/android/settings/slices/SliceBroadcastReceiver.java b/src/com/android/settings/slices/SliceBroadcastReceiver.java index b2ea5830fe2..8b6fc9801be 100644 --- a/src/com/android/settings/slices/SliceBroadcastReceiver.java +++ b/src/com/android/settings/slices/SliceBroadcastReceiver.java @@ -63,7 +63,7 @@ public class SliceBroadcastReceiver extends BroadcastReceiver { final CustomSliceManager mCustomSliceManager = FeatureFactory.getFactory( context).getSlicesFeatureProvider().getCustomSliceManager(context); - if (mCustomSliceManager.isValidAction(action)) { + if (CustomSliceRegistry.isValidAction(action)) { final CustomSliceable sliceable = mCustomSliceManager.getSliceableFromIntentAction(action); sliceable.onNotifyChange(intent); diff --git a/src/com/android/settings/slices/SliceDeepLinkSpringBoard.java b/src/com/android/settings/slices/SliceDeepLinkSpringBoard.java index f4afa16d7af..d2179d20ebc 100644 --- a/src/com/android/settings/slices/SliceDeepLinkSpringBoard.java +++ b/src/com/android/settings/slices/SliceDeepLinkSpringBoard.java @@ -47,7 +47,7 @@ public class SliceDeepLinkSpringBoard extends Activity { // TODO (b/80263568) Avoid duplicating this list of Slice Uris. final CustomSliceManager customSliceManager = FeatureFactory.getFactory(this) .getSlicesFeatureProvider().getCustomSliceManager(this); - if (customSliceManager.isValidUri(sliceUri)) { + if (CustomSliceRegistry.isValidUri(sliceUri)) { final CustomSliceable sliceable = customSliceManager.getSliceableFromUri(sliceUri); launchIntent = sliceable.getIntent(); diff --git a/tests/robotests/src/com/android/settings/homepage/contextualcards/ContextualCardLoaderTest.java b/tests/robotests/src/com/android/settings/homepage/contextualcards/ContextualCardLoaderTest.java index e66774eca74..40e69391b4d 100644 --- a/tests/robotests/src/com/android/settings/homepage/contextualcards/ContextualCardLoaderTest.java +++ b/tests/robotests/src/com/android/settings/homepage/contextualcards/ContextualCardLoaderTest.java @@ -229,11 +229,6 @@ public class ContextualCardLoaderTest { .setSliceUri(Uri.parse( "content://com.android.settings.test.slices/action/gesture_pick_up")) .build()); - cards.add(new ContextualCard.Builder() - .setName("test_battery") - .setCardType(ContextualCard.CardType.SLICE) - .setSliceUri(CustomSliceRegistry.BATTERY_INFO_SLICE_URI) - .build()); return cards; } @@ -262,11 +257,6 @@ public class ContextualCardLoaderTest { .setSliceUri(Uri.parse( "content://com.android.settings.test.slices/action/gesture_pick_up")) .build()); - cards.add(new ContextualCard.Builder() - .setName("test_battery") - .setCardType(ContextualCard.CardType.SLICE) - .setSliceUri(CustomSliceRegistry.BATTERY_INFO_SLICE_URI) - .build()); return cards; } } diff --git a/tests/robotests/src/com/android/settings/homepage/contextualcards/ContextualCardManagerTest.java b/tests/robotests/src/com/android/settings/homepage/contextualcards/ContextualCardManagerTest.java index eb9a4614c80..8087716c9e1 100644 --- a/tests/robotests/src/com/android/settings/homepage/contextualcards/ContextualCardManagerTest.java +++ b/tests/robotests/src/com/android/settings/homepage/contextualcards/ContextualCardManagerTest.java @@ -460,7 +460,7 @@ public class ContextualCardManagerTest { cards.add(new ContextualCard.Builder() .setName("test_battery") .setCardType(ContextualCard.CardType.SLICE) - .setSliceUri(CustomSliceRegistry.BATTERY_INFO_SLICE_URI) + .setSliceUri(CustomSliceRegistry.BATTERY_FIX_SLICE_URI) .setViewType(VIEW_TYPE_FULL_WIDTH) .build()); return cards; diff --git a/tests/robotests/src/com/android/settings/homepage/contextualcards/deviceinfo/BatteryInfoSliceTest.java b/tests/robotests/src/com/android/settings/homepage/contextualcards/deviceinfo/BatteryInfoSliceTest.java deleted file mode 100644 index ff276d64d54..00000000000 --- a/tests/robotests/src/com/android/settings/homepage/contextualcards/deviceinfo/BatteryInfoSliceTest.java +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Copyright (C) 2018 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.homepage.contextualcards.deviceinfo; - -import static com.google.common.truth.Truth.assertThat; - -import static org.mockito.Mockito.doNothing; -import static org.mockito.Mockito.doReturn; -import static org.mockito.Mockito.spy; - -import android.content.Context; - -import androidx.core.graphics.drawable.IconCompat; -import androidx.slice.Slice; -import androidx.slice.SliceMetadata; -import androidx.slice.SliceProvider; -import androidx.slice.core.SliceAction; -import androidx.slice.widget.SliceLiveData; - -import com.android.settings.R; - -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.robolectric.RobolectricTestRunner; -import org.robolectric.RuntimeEnvironment; - -@RunWith(RobolectricTestRunner.class) -public class BatteryInfoSliceTest { - - private Context mContext; - private BatteryInfoSlice mBatteryInfoSlice; - - @Before - public void setUp() { - mContext = RuntimeEnvironment.application; - - // Set-up specs for SliceMetadata. - SliceProvider.setSpecs(SliceLiveData.SUPPORTED_SPECS); - - mBatteryInfoSlice = spy(new BatteryInfoSlice(mContext)); - } - - @Test - public void getSlice_shouldBeCorrectSliceContent() { - doNothing().when(mBatteryInfoSlice).loadBatteryInfo(); - doReturn("10%").when(mBatteryInfoSlice).getBatteryPercentString(); - doReturn("test").when(mBatteryInfoSlice).getSummary(); - - final Slice slice = mBatteryInfoSlice.getSlice(); - - final SliceMetadata metadata = SliceMetadata.from(mContext, slice); - assertThat(metadata.getTitle()).isEqualTo( - mContext.getString(R.string.power_usage_summary_title)); - - final SliceAction primaryAction = metadata.getPrimaryAction(); - final IconCompat expectedIcon = IconCompat.createWithResource(mContext, - R.drawable.ic_settings_battery); - assertThat(primaryAction.getIcon().toString()).isEqualTo(expectedIcon.toString()); - } -} diff --git a/tests/robotests/src/com/android/settings/slices/SpecialCaseSliceManagerTest.java b/tests/robotests/src/com/android/settings/slices/SpecialCaseSliceManagerTest.java index 82726dff70d..53922844a0c 100644 --- a/tests/robotests/src/com/android/settings/slices/SpecialCaseSliceManagerTest.java +++ b/tests/robotests/src/com/android/settings/slices/SpecialCaseSliceManagerTest.java @@ -47,8 +47,8 @@ public class SpecialCaseSliceManagerTest { public void setUp() { mContext = RuntimeEnvironment.application; mCustomSliceManager = spy(new CustomSliceManager(mContext)); - mCustomSliceManager.mUriMap.clear(); - mCustomSliceManager.mUriMap.put(FakeSliceable.URI, FakeSliceable.class); + CustomSliceRegistry.sUriToSlice.clear(); + CustomSliceRegistry.sUriToSlice.put(FakeSliceable.URI, FakeSliceable.class); } @Test @@ -69,14 +69,14 @@ public class SpecialCaseSliceManagerTest { @Test public void isValidUri_validUri_returnsTrue() { - final boolean isValidUri = mCustomSliceManager.isValidUri(FakeSliceable.URI); + final boolean isValidUri = CustomSliceRegistry.isValidUri(FakeSliceable.URI); assertThat(isValidUri).isTrue(); } @Test public void isValidUri_invalidUri_returnsFalse() { - final boolean isValidUri = mCustomSliceManager.isValidUri(null); + final boolean isValidUri = CustomSliceRegistry.isValidUri(null); assertThat(isValidUri).isFalse(); } @@ -84,14 +84,14 @@ public class SpecialCaseSliceManagerTest { @Test public void isValidAction_validActions_returnsTrue() { final boolean isValidAction = - mCustomSliceManager.isValidAction(FakeSliceable.URI.toString()); + CustomSliceRegistry.isValidAction(FakeSliceable.URI.toString()); assertThat(isValidAction).isTrue(); } @Test public void isValidAction_invalidAction_returnsFalse() { - final boolean isValidAction = mCustomSliceManager.isValidAction("action"); + final boolean isValidAction = CustomSliceRegistry.isValidAction("action"); assertThat(isValidAction).isFalse(); } From cc50a4a540b6b45402f59754285a72d3797c3f23 Mon Sep 17 00:00:00 2001 From: Matthew Fritze Date: Thu, 28 Feb 2019 10:42:56 -0800 Subject: [PATCH 08/11] Disable Moblie Data Slice in AP mode When airplane mode is enabled, users should not be able to change the value of mobile data. Thus, when airplane mode is enabled, replace the Slice with a no-op slice explaining why it cannot be changed. Fixes: 119411534 Fixes: 126726036 Test: robotests Change-Id: I991fe05ad8f18004f77fbf1c87403de602d3a267 --- res/values/strings.xml | 3 +++ .../network/telephony/MobileDataSlice.java | 26 ++++++++++++++----- .../telephony/MobileDataSliceTest.java | 24 +++++++++++++++++ 3 files changed, 47 insertions(+), 6 deletions(-) diff --git a/res/values/strings.xml b/res/values/strings.xml index 3673af4fc9b..bd67b1c4c8e 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -10684,6 +10684,9 @@ Volume + + Unavailable during airplane mode + Force desktop mode diff --git a/src/com/android/settings/network/telephony/MobileDataSlice.java b/src/com/android/settings/network/telephony/MobileDataSlice.java index 6efd8c3aed6..5a5d6a2467b 100644 --- a/src/com/android/settings/network/telephony/MobileDataSlice.java +++ b/src/com/android/settings/network/telephony/MobileDataSlice.java @@ -74,8 +74,27 @@ public class MobileDataSlice implements CustomSliceable { final IconCompat icon = IconCompat.createWithResource(mContext, R.drawable.ic_network_cell); final String title = mContext.getText(R.string.mobile_data_settings_title).toString(); - final CharSequence summary = getSummary(); @ColorInt final int color = Utils.getColorAccentDefaultColor(mContext); + + // Return a Slice without the mobile data toggle when airplane mode is on. + if (isAirplaneModeEnabled()) { + final CharSequence summary = mContext.getText(R.string.mobile_data_ap_mode_disabled); + // Intent does nothing, but we have to pass an intent to the Row. + final PendingIntent intent = PendingIntent.getActivity(mContext, 0 /* requestCode */, + new Intent(), 0 /* flags */); + final SliceAction deadAction = + SliceAction.create(intent, icon, ListBuilder.ICON_IMAGE, title); + final ListBuilder listBuilder = new ListBuilder(mContext, getUri(), + ListBuilder.INFINITY) + .setAccentColor(color) + .addRow(new ListBuilder.RowBuilder() + .setTitle(title) + .setSubtitle(summary) + .setPrimaryAction(deadAction)); + return listBuilder.build(); + } + + final CharSequence summary = getSummary(); final PendingIntent toggleAction = getBroadcastIntent(mContext); final PendingIntent primaryAction = getPrimaryAction(); final SliceAction primarySliceAction = SliceAction.createDeeplink(primaryAction, icon, @@ -101,11 +120,6 @@ public class MobileDataSlice implements CustomSliceable { @Override public void onNotifyChange(Intent intent) { - // Don't make a change if we are in Airplane Mode. - if (isAirplaneModeEnabled()) { - return; - } - final boolean newState = intent.getBooleanExtra(EXTRA_TOGGLE_STATE, isMobileDataEnabled()); diff --git a/tests/robotests/src/com/android/settings/network/telephony/MobileDataSliceTest.java b/tests/robotests/src/com/android/settings/network/telephony/MobileDataSliceTest.java index c497cf82665..e488d0c7fb2 100644 --- a/tests/robotests/src/com/android/settings/network/telephony/MobileDataSliceTest.java +++ b/tests/robotests/src/com/android/settings/network/telephony/MobileDataSliceTest.java @@ -24,6 +24,7 @@ import static org.mockito.Mockito.spy; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; +import android.app.PendingIntent; import android.content.Context; import android.content.Intent; import android.provider.Settings; @@ -162,4 +163,27 @@ public class MobileDataSliceTest { assertThat(isMobileDataEnabled).isEqualTo(seed); } + + @Test + public void airplaneModeEnabled_slicePrimaryActionIsEmpty() { + doReturn(true).when(mMobileDataSlice).isAirplaneModeEnabled(); + doReturn(mSubscriptionInfo).when(mSubscriptionManager).getActiveSubscriptionInfo(SUB_ID); + final Slice mobileData = mMobileDataSlice.getSlice(); + + final SliceMetadata metadata = SliceMetadata.from(mContext, mobileData); + assertThat(metadata.getTitle()) + .isEqualTo(mContext.getString(R.string.mobile_data_settings_title)); + + assertThat(metadata.getSubtitle()) + .isEqualTo(mContext.getString(R.string.mobile_data_ap_mode_disabled)); + + final List toggles = metadata.getToggles(); + assertThat(toggles).hasSize(0); + + final SliceAction primaryAction = metadata.getPrimaryAction(); + final PendingIntent pendingIntent = primaryAction.getAction(); + final Intent actionIntent = pendingIntent.getIntent(); + + assertThat(actionIntent).isNull(); + } } From a8a92752f156fcf96af37335d17deb6d9e762000 Mon Sep 17 00:00:00 2001 From: Fan Zhang Date: Wed, 13 Mar 2019 12:21:20 -0700 Subject: [PATCH 09/11] Fix dynamic pref summary for IMEI. Fixes: 128468762 Test: reindex Change-Id: I8c7cb385a877b656515872507b2c64d14bae638d --- res/xml/my_device_info.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/res/xml/my_device_info.xml b/res/xml/my_device_info.xml index 83bf5c45d08..bc498d2205f 100644 --- a/res/xml/my_device_info.xml +++ b/res/xml/my_device_info.xml @@ -115,6 +115,7 @@ android:title="@string/status_imei" settings:keywords="@string/keywords_imei_info" android:summary="@string/summary_placeholder" + settings:allowDynamicSummaryInSlice="true" settings:controller="com.android.settings.deviceinfo.imei.ImeiInfoPreferenceController"/> From d4bd317e4af9e3c65e7aa741e520f8049802bede Mon Sep 17 00:00:00 2001 From: Joel Galenson Date: Wed, 13 Mar 2019 12:36:58 -0700 Subject: [PATCH 10/11] Rename accessibility services to apps. Fixes: 127657530 Test: View strings. Change-Id: I56ab9b5f12808e5af0d9fe2afa64629805c02f1c --- res/values/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/res/values/strings.xml b/res/values/strings.xml index 3673af4fc9b..5cc0caa96ab 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -10734,8 +10734,8 @@ - 1 service has full access to your device - %1$d services have full access to your device + 1 app has full access to your device + %1$d apps have full access to your device From 2014d16e46a369de56b45ddb12d696dc6a242c77 Mon Sep 17 00:00:00 2001 From: Fan Zhang Date: Wed, 13 Mar 2019 14:26:26 -0700 Subject: [PATCH 11/11] Fix robotests Fixes: 128536554 Test: rerun robotests Change-Id: Ife81f9d161fc416a63a9b2f04ce2ae4f9a1e74db --- .../calling/WifiCallingSettingsForSub.java | 31 +++++++------------ .../ListWithEntrySummaryPreferenceTest.java | 3 +- .../WifiCallingSettingsForSubTest.java | 14 ++++----- 3 files changed, 19 insertions(+), 29 deletions(-) diff --git a/src/com/android/settings/wifi/calling/WifiCallingSettingsForSub.java b/src/com/android/settings/wifi/calling/WifiCallingSettingsForSub.java index 4255f3c964c..625de38f082 100644 --- a/src/com/android/settings/wifi/calling/WifiCallingSettingsForSub.java +++ b/src/com/android/settings/wifi/calling/WifiCallingSettingsForSub.java @@ -40,7 +40,6 @@ import android.widget.Switch; import android.widget.TextView; import androidx.appcompat.app.AlertDialog; -import androidx.preference.ListPreference; import androidx.preference.Preference; import androidx.preference.Preference.OnPreferenceClickListener; import androidx.preference.PreferenceScreen; @@ -141,20 +140,17 @@ public class WifiCallingSettingsForSub extends SettingsPreferenceFragment } }; + /* + * Launch carrier emergency address managemnent activity + */ private final OnPreferenceClickListener mUpdateAddressListener = - new OnPreferenceClickListener() { - /* - * Launch carrier emergency address managemnent activity - */ - @Override - public boolean onPreferenceClick(Preference preference) { - Intent carrierAppIntent = getCarrierActivityIntent(); - if (carrierAppIntent != null) { - carrierAppIntent.putExtra(EXTRA_LAUNCH_CARRIER_APP, LAUCH_APP_UPDATE); - startActivity(carrierAppIntent); - } - return true; + preference -> { + Intent carrierAppIntent = getCarrierActivityIntent(); + if (carrierAppIntent != null) { + carrierAppIntent.putExtra(EXTRA_LAUNCH_CARRIER_APP, LAUCH_APP_UPDATE); + startActivity(carrierAppIntent); } + return true; }; private final ProvisioningManager.Callback mProvisioningCallback = @@ -174,8 +170,6 @@ public class WifiCallingSettingsForSub extends SettingsPreferenceFragment public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); - final SettingsActivity activity = (SettingsActivity) getActivity(); - mEmptyView = getView().findViewById(android.R.id.empty); setEmptyView(mEmptyView); final Resources res = SubscriptionManager.getResourcesForSubId(getContext(), mSubId); @@ -265,14 +259,13 @@ public class WifiCallingSettingsForSub extends SettingsPreferenceFragment mTelephonyManager = ((TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE)) .createForSubscriptionId(mSubId); - mButtonWfcMode = (ListWithEntrySummaryPreference) findPreference(BUTTON_WFC_MODE); + mButtonWfcMode = findPreference(BUTTON_WFC_MODE); mButtonWfcMode.setOnPreferenceChangeListener(this); - mButtonWfcRoamingMode = (ListWithEntrySummaryPreference) findPreference( - BUTTON_WFC_ROAMING_MODE); + mButtonWfcRoamingMode = findPreference(BUTTON_WFC_ROAMING_MODE); mButtonWfcRoamingMode.setOnPreferenceChangeListener(this); - mUpdateAddress = (Preference) findPreference(PREFERENCE_EMERGENCY_ADDRESS); + mUpdateAddress = findPreference(PREFERENCE_EMERGENCY_ADDRESS); mUpdateAddress.setOnPreferenceClickListener(mUpdateAddressListener); mIntentFilter = new IntentFilter(); diff --git a/tests/robotests/src/com/android/settings/wifi/calling/ListWithEntrySummaryPreferenceTest.java b/tests/robotests/src/com/android/settings/wifi/calling/ListWithEntrySummaryPreferenceTest.java index cc2622f4b35..307c0ac202d 100644 --- a/tests/robotests/src/com/android/settings/wifi/calling/ListWithEntrySummaryPreferenceTest.java +++ b/tests/robotests/src/com/android/settings/wifi/calling/ListWithEntrySummaryPreferenceTest.java @@ -33,8 +33,6 @@ import org.junit.runner.RunWith; import org.robolectric.RobolectricTestRunner; import org.robolectric.RuntimeEnvironment; -import java.io.IOException; - @RunWith(RobolectricTestRunner.class) public class ListWithEntrySummaryPreferenceTest { @@ -54,6 +52,7 @@ public class ListWithEntrySummaryPreferenceTest { @Before public void setUp() { mContext = RuntimeEnvironment.application; + mContext.setTheme(R.style.Theme_Settings_Home); mPreference = new ListWithEntrySummaryPreference(mContext, null); mPreference.setEntries(mDefaultEntries); mPreference.setEntryValues(mDefaultEntryValues); diff --git a/tests/robotests/src/com/android/settings/wifi/calling/WifiCallingSettingsForSubTest.java b/tests/robotests/src/com/android/settings/wifi/calling/WifiCallingSettingsForSubTest.java index 39de254b846..70f1916781e 100644 --- a/tests/robotests/src/com/android/settings/wifi/calling/WifiCallingSettingsForSubTest.java +++ b/tests/robotests/src/com/android/settings/wifi/calling/WifiCallingSettingsForSubTest.java @@ -41,11 +41,9 @@ import android.telephony.ims.ProvisioningManager; import android.view.View; import android.widget.TextView; -import androidx.preference.ListPreference; import androidx.preference.PreferenceScreen; import com.android.ims.ImsConfig; -import com.android.ims.ImsException; import com.android.ims.ImsManager; import com.android.settings.R; import com.android.settings.SettingsActivity; @@ -80,11 +78,11 @@ public class WifiCallingSettingsForSubTest { @Mock private ToggleSwitch mToggleSwitch; @Mock private View mView; @Mock private ImsConfig mImsConfig; - @Mock private ListPreference mButtonWfcMode; - @Mock private ListPreference mButtonWfcRoamingMode; + @Mock private ListWithEntrySummaryPreference mButtonWfcMode; + @Mock private ListWithEntrySummaryPreference mButtonWfcRoamingMode; @Before - public void setUp() throws NoSuchFieldException, ImsException { + public void setUp() throws Exception { MockitoAnnotations.initMocks(this); mContext = RuntimeEnvironment.application; @@ -100,7 +98,7 @@ public class WifiCallingSettingsForSubTest { final Bundle bundle = new Bundle(); when(mFragment.getArguments()).thenReturn(bundle); doNothing().when(mFragment).addPreferencesFromResource(anyInt()); - doReturn(mock(ListPreference.class)).when(mFragment).findPreference(any()); + doReturn(mock(ListWithEntrySummaryPreference.class)).when(mFragment).findPreference(any()); doReturn(mButtonWfcMode).when(mFragment).findPreference(BUTTON_WFC_MODE); doReturn(mButtonWfcRoamingMode).when(mFragment).findPreference(BUTTON_WFC_ROAMING_MODE); doNothing().when(mFragment).finish(); @@ -141,7 +139,7 @@ public class WifiCallingSettingsForSubTest { } @Test - public void onResume_provisioningAllowed_shouldNotFinish() throws ImsException { + public void onResume_provisioningAllowed_shouldNotFinish() { // Call onResume while provisioning is allowed. mFragment.onResume(); @@ -160,7 +158,7 @@ public class WifiCallingSettingsForSubTest { } @Test - public void onResumeOnPause_provisioningCallbackRegistration() throws ImsException { + public void onResumeOnPause_provisioningCallbackRegistration() throws Exception { // Verify that provisioning callback is registered after call to onResume(). mFragment.onResume(); verify(mImsConfig).addConfigCallback(any(ProvisioningManager.Callback.class));