diff --git a/res/drawable/ic_fingerprint_introduction_shield_24dp.xml b/res/drawable/ic_fingerprint_introduction_shield_24dp.xml
new file mode 100644
index 00000000000..28c998471e9
--- /dev/null
+++ b/res/drawable/ic_fingerprint_introduction_shield_24dp.xml
@@ -0,0 +1,45 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/res/drawable/ic_notification_silence.xml b/res/drawable/ic_notification_silence.xml
index 9da56dd0bbf..4b71d65dcc6 100644
--- a/res/drawable/ic_notification_silence.xml
+++ b/res/drawable/ic_notification_silence.xml
@@ -14,28 +14,13 @@ Copyright (C) 2019 The Android Open Source Project
See the License for the specific language governing permissions and
limitations under the License.
-->
-
- -
-
-
-
-
-
- -
-
-
-
-
-
+ android:viewportHeight="24"
+ android:tint="?android:attr/colorControlNormal">
+
+
diff --git a/res/drawable/ic_ongoing_notification.xml b/res/drawable/ic_ongoing_notification.xml
new file mode 100644
index 00000000000..238b5170a48
--- /dev/null
+++ b/res/drawable/ic_ongoing_notification.xml
@@ -0,0 +1,25 @@
+
+
+
+
diff --git a/res/layout/fingerprint_enroll_introduction.xml b/res/layout/fingerprint_enroll_introduction.xml
index 0aa18fbc89f..8555f1ab13a 100644
--- a/res/layout/fingerprint_enroll_introduction.xml
+++ b/res/layout/fingerprint_enroll_introduction.xml
@@ -30,23 +30,16 @@
android:clipToPadding="false"
android:orientation="vertical">
-
-
-
+ android:layout_marginVertical="12dp">
-
+
-
-
+ android:orientation="vertical">
+ android:textAlignment="viewStart"
+ android:paddingTop="12dp"
+ android:text="@string/security_settings_fingerprint_enroll_introduction_footer_title_1" />
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 75884fade5e..68030bf8d81 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -884,13 +884,21 @@
- Unlock with fingerprint
-
+ Set up your fingerprint
+
Use your fingerprint
Just touch the fingerprint sensor to unlock your phone, authorize purchases, or sign in to apps. Be careful whose fingerprints you add. Even one added print can do any of these things.
+
+ You\u2019re in control
+
+ Keep in mind
- Your fingerprint may be less secure than a strong pattern or PIN.
+ The data recorded by Fingerprint is stored securely and never leaves your phone. You can delete your data anytime in Settings.
+
+ Your fingerprint may be less secure than a strong pattern or PIN.
+
+ Your phone will occasionally use your recent fingerprint images to create improved fingerprint models.
Use your fingerprint to unlock your phone or approve purchases.\n\nNote: You can\u2019t use your fingerprint to unlock this device. For more information, contact your organization\u2019s admin.
@@ -899,8 +907,12 @@
Cancel
No thanks
+
+ Skip
Continue
+
+ Agree
Skip
@@ -4482,13 +4494,13 @@
Uninstall updates
- You\u2019ve chosen to launch this app by default for some actions.
+ Some activities you\u2019ve selected open in this app by default.
You\u2019ve chosen to allow this app to create widgets and access their data.
No defaults set.
- Clear defaults
+ Clear default preferences
This app may not be designed for your screen. You can control how it
adjusts to your screen here.
@@ -8773,8 +8785,10 @@
Never
-
- Notification access
+
+ Device & app notifications
+
+ Control which notifications show on your apps and devices
@@ -8833,26 +8847,19 @@
Turn off
Cancel
Allowed notification types
- Important ongoing notifications
- Conversation notifications
- Alerting notifications
- Silent notifications
-
-
- Apps that are not bridged to this listener
-
-
- All apps are bridged
-
-
-
- - %d app is not bridged
- - %d apps are not bridged
-
+ Real-time
+ Real-time communication from apps in use, navigation, phone calls, and more
+ Conversations
+ SMS and other communications
+ Default
+ Notifications that may ring or vibrate based on settings
+ Silent
+ Notifications that never make sound or vibrations
- Bridged apps
+ See all apps
+ Change notification settings for each app that can send notifications
+ Apps shown on device
VR helper services
@@ -9668,9 +9675,44 @@
Opening links
Open supported links
+
+ Supported links open in this app
+
+ Links to open in this app
+
Open without asking
Supported links
- Other defaults
+
+ Other default preferences
+
+ Add link
+
+ An app can verify links to automatically open in the app. Learn more
+
+
+
+ - %d verified link
+ - %d verified links
+
+
+ - This link is verified and automatically opens in this app.
+ - These links are verified and automatically open in this app.
+
+
+ OK
+
+
+ Checking for other supported links\u2026
+
+ Cancel
+
+
+
+ - %d supported link
+ - %d supported links
+
+
+ Add
%1$s used in %2$s
@@ -11481,8 +11523,10 @@
Autofill service
+
+ Passwords
- auto, fill, autofill
+ auto, fill, autofill, password
diff --git a/res/xml/configure_notification_settings_v2.xml b/res/xml/configure_notification_settings_v2.xml
index 902922087c6..b7cc2c86a0d 100644
--- a/res/xml/configure_notification_settings_v2.xml
+++ b/res/xml/configure_notification_settings_v2.xml
@@ -23,12 +23,14 @@
android:title="@string/conversation_notifs_category">
@@ -58,6 +61,7 @@
android:title="@string/lock_screen_notifications_title">
+
diff --git a/res/xml/default_autofill_picker_settings.xml b/res/xml/default_autofill_picker_settings.xml
index bfc285bf5ee..392f733ba56 100644
--- a/res/xml/default_autofill_picker_settings.xml
+++ b/res/xml/default_autofill_picker_settings.xml
@@ -22,14 +22,27 @@
android:title="@string/autofill_app"
settings:keywords="@string/autofill_keywords">
-
-
-
+
+
+
+
+
+
+
+
+
+
diff --git a/res/xml/notification_access_permission_details.xml b/res/xml/notification_access_permission_details.xml
index 55a47f5361a..c4bb7f069a5 100644
--- a/res/xml/notification_access_permission_details.xml
+++ b/res/xml/notification_access_permission_details.xml
@@ -34,23 +34,32 @@
/>
+ android:summary="@string/notif_type_ongoing_summary"
+ android:icon="@drawable/ic_ongoing_notification"
+ settings:controller="com.android.settings.applications.specialaccess.notificationaccess.OngoingTypeFilterPreferenceController"/>
/>
+ android:summary="@string/notif_type_conversation_summary"
+ android:icon="@drawable/ic_promote_conversation"
+ settings:controller="com.android.settings.applications.specialaccess.notificationaccess.ConversationTypeFilterPreferenceController"/>
/>
+ android:summary="@string/notif_type_alerting_summary"
+ android:icon="@drawable/ic_notification_alert"
+ settings:controller="com.android.settings.applications.specialaccess.notificationaccess.AlertingTypeFilterPreferenceController"/>
/>
+ android:summary="@string/notif_type_silent_summary"
+ android:icon="@drawable/ic_notification_silence"
+ settings:controller="com.android.settings.applications.specialaccess.notificationaccess.SilentTypeFilterPreferenceController"/>
diff --git a/res/xml/notification_access_settings.xml b/res/xml/notification_access_settings.xml
index 43f7c492b37..b523d7de691 100644
--- a/res/xml/notification_access_settings.xml
+++ b/res/xml/notification_access_settings.xml
@@ -21,4 +21,13 @@
android:key="notification_access_screen"
android:title="@string/manage_notification_access_title"
settings:searchable="false"
- settings:controller="com.android.settings.applications.specialaccess.notificationaccess.NotificationAccessScreenPreferenceController" />
+ settings:controller="com.android.settings.applications.specialaccess.notificationaccess.NotificationAccessScreenPreferenceController">
+
+
+
+
+
diff --git a/res/xml/power_usage_summary.xml b/res/xml/power_usage_summary.xml
index b5e414b487c..75bbca048e9 100644
--- a/res/xml/power_usage_summary.xml
+++ b/res/xml/power_usage_summary.xml
@@ -17,6 +17,7 @@
@@ -31,6 +32,7 @@
android:fragment="com.android.settings.fuelgauge.PowerUsageAdvanced"
android:key="battery_usage_summary"
android:title="@string/advanced_battery_preference_title"
+ app:iconSpaceReserved="false"
settings:searchable="false" />
-
+
+
+
-
+
+
-
+
+
mServices;
+
+ public PasswordsPreferenceController(Context context, String preferenceKey) {
+ super(context, preferenceKey);
+ mPm = context.getPackageManager();
+ mIconFactory = IconDrawableFactory.newInstance(mContext);
+ mServices = AutofillServiceInfo.getAvailableServices(mContext, UserHandle.myUserId());
+ for (int i = mServices.size() - 1; i >= 0; i--) {
+ final String passwordsActivity = mServices.get(i).getPasswordsActivity();
+ if (TextUtils.isEmpty(passwordsActivity)) {
+ mServices.remove(i);
+ }
+ }
+ }
+
+ @Override
+ public int getAvailabilityStatus() {
+ return mServices.isEmpty() ? CONDITIONALLY_UNAVAILABLE : AVAILABLE;
+ }
+
+ @Override
+ public void displayPreference(PreferenceScreen screen) {
+ super.displayPreference(screen);
+ final PreferenceGroup group = screen.findPreference(getPreferenceKey());
+ // TODO(b/169455298): Show work profile passwords too.
+ addPasswordPreferences(screen.getContext(), UserHandle.myUserId(), group);
+ }
+
+ private void addPasswordPreferences(
+ Context prefContext, @UserIdInt int user, PreferenceGroup group) {
+ for (int i = 0; i < mServices.size(); i++) {
+ final AutofillServiceInfo service = mServices.get(i);
+ final Preference pref = new Preference(prefContext);
+ final ServiceInfo serviceInfo = service.getServiceInfo();
+ pref.setTitle(serviceInfo.loadLabel(mPm));
+ final Drawable icon =
+ mIconFactory.getBadgedIcon(
+ serviceInfo,
+ serviceInfo.applicationInfo,
+ user);
+ Utils.setSafeIcon(pref, icon);
+ pref.setIntent(
+ new Intent(Intent.ACTION_MAIN)
+ .setClassName(serviceInfo.packageName, service.getPasswordsActivity()));
+ group.addPreference(pref);
+ }
+ }
+}
diff --git a/src/com/android/settings/applications/specialaccess/notificationaccess/HeaderPreferenceController.java b/src/com/android/settings/applications/specialaccess/notificationaccess/HeaderPreferenceController.java
index 94736e4c21f..1144f12132d 100644
--- a/src/com/android/settings/applications/specialaccess/notificationaccess/HeaderPreferenceController.java
+++ b/src/com/android/settings/applications/specialaccess/notificationaccess/HeaderPreferenceController.java
@@ -16,6 +16,8 @@
package com.android.settings.applications.specialaccess.notificationaccess;
+import android.companion.ICompanionDeviceManager;
+import android.content.ComponentName;
import android.content.Context;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
@@ -30,8 +32,10 @@ import com.android.settings.R;
import com.android.settings.core.BasePreferenceController;
import com.android.settings.core.PreferenceControllerMixin;
import com.android.settings.dashboard.DashboardFragment;
+import com.android.settings.notification.NotificationBackend;
import com.android.settings.widget.EntityHeaderController;
import com.android.settingslib.applications.AppUtils;
+import com.android.settingslib.bluetooth.LocalBluetoothManager;
import com.android.settingslib.core.lifecycle.Lifecycle;
import com.android.settingslib.widget.LayoutPreference;
@@ -43,6 +47,10 @@ public class HeaderPreferenceController extends BasePreferenceController
private PackageInfo mPackageInfo;
private PackageManager mPm;
private CharSequence mServiceName;
+ private ICompanionDeviceManager mCdm;
+ private LocalBluetoothManager mBm;
+ private ComponentName mCn;
+ private int mUserId;
public HeaderPreferenceController(Context context, String key) {
super(context, key);
@@ -68,6 +76,26 @@ public class HeaderPreferenceController extends BasePreferenceController
return this;
}
+ public HeaderPreferenceController setCdm(ICompanionDeviceManager cdm) {
+ mCdm = cdm;
+ return this;
+ }
+
+ public HeaderPreferenceController setBluetoothManager(LocalBluetoothManager bm) {
+ mBm = bm;
+ return this;
+ }
+
+ public HeaderPreferenceController setCn(ComponentName cn) {
+ mCn = cn;
+ return this;
+ }
+
+ public HeaderPreferenceController setUserId(int userId) {
+ mUserId = userId;
+ return this;
+ }
+
@Override
public int getAvailabilityStatus() {
return AVAILABLE;
@@ -88,6 +116,8 @@ public class HeaderPreferenceController extends BasePreferenceController
.getBadgedIcon(mPackageInfo.applicationInfo))
.setLabel(mPackageInfo.applicationInfo.loadLabel(mPm))
.setSummary(mServiceName)
+ .setSecondSummary(new NotificationBackend().getDeviceList(
+ mCdm, mBm, mCn.getPackageName(), mUserId))
.setIsInstantApp(AppUtils.isInstant(mPackageInfo.applicationInfo))
.setPackageName(mPackageInfo.packageName)
.setUid(mPackageInfo.applicationInfo.uid)
diff --git a/src/com/android/settings/applications/specialaccess/notificationaccess/NotificationAccessDetails.java b/src/com/android/settings/applications/specialaccess/notificationaccess/NotificationAccessDetails.java
index a205b57433b..1ac578d8e3c 100644
--- a/src/com/android/settings/applications/specialaccess/notificationaccess/NotificationAccessDetails.java
+++ b/src/com/android/settings/applications/specialaccess/notificationaccess/NotificationAccessDetails.java
@@ -21,7 +21,7 @@ import static com.android.settings.applications.AppInfoBase.ARG_PACKAGE_NAME;
import android.app.Activity;
import android.app.NotificationManager;
import android.app.settings.SettingsEnums;
-import android.bluetooth.BluetoothAdapter;
+import android.companion.ICompanionDeviceManager;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
@@ -30,6 +30,7 @@ import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.content.pm.ServiceInfo;
import android.os.Bundle;
+import android.os.ServiceManager;
import android.os.UserHandle;
import android.os.UserManager;
import android.provider.Settings;
@@ -45,14 +46,13 @@ import com.android.settings.R;
import com.android.settings.SettingsActivity;
import com.android.settings.applications.AppInfoBase;
import com.android.settings.applications.manageapplications.ManageApplications;
+import com.android.settings.bluetooth.Utils;
import com.android.settings.core.SubSettingLauncher;
import com.android.settings.dashboard.DashboardFragment;
import com.android.settings.notification.NotificationBackend;
import com.android.settingslib.RestrictedLockUtils;
import com.android.settingslib.RestrictedLockUtilsInternal;
-import com.android.settingslib.bluetooth.CachedBluetoothDevice;
-import java.util.Collection;
import java.util.List;
import java.util.Objects;
@@ -60,7 +60,6 @@ public class NotificationAccessDetails extends DashboardFragment {
private static final String TAG = "NotifAccessDetails";
private NotificationBackend mNm = new NotificationBackend();
- private NotificationListenerFilter mNlf;
private ComponentName mComponentName;
private CharSequence mServiceName;
protected ServiceInfo mServiceInfo;
@@ -99,7 +98,12 @@ public class NotificationAccessDetails extends DashboardFragment {
.setFragment(this)
.setPackageInfo(mPackageInfo)
.setPm(context.getPackageManager())
- .setServiceName(mServiceName);
+ .setServiceName(mServiceName)
+ .setBluetoothManager(Utils.getLocalBtManager(context))
+ .setCdm(ICompanionDeviceManager.Stub.asInterface(
+ ServiceManager.getService(Context.COMPANION_DEVICE_SERVICE)))
+ .setCn(mComponentName)
+ .setUserId(mUserId);
getPreferenceControllers().forEach(controllers -> {
controllers.forEach(controller -> {
if (controller instanceof TypeFilterPreferenceController) {
@@ -152,13 +156,6 @@ public class NotificationAccessDetails extends DashboardFragment {
Preference apps = getPreferenceScreen().findPreference(
use(BridgedAppsPreferenceController.class).getPreferenceKey());
if (apps != null) {
- mNlf = mNm.getListenerFilter(mComponentName, mUserId);
- int nonBridgedCount = mNlf.getDisallowedPackages().size();
- apps.setSummary(nonBridgedCount == 0 ?
- getString(R.string.notif_listener_excluded_summary_zero)
- : getResources().getQuantityString(
- R.plurals.notif_listener_excluded_summary_nonzero,
- nonBridgedCount, nonBridgedCount));
apps.setOnPreferenceClickListener(preference -> {
final Bundle args = new Bundle();
@@ -169,7 +166,7 @@ public class NotificationAccessDetails extends DashboardFragment {
new SubSettingLauncher(getContext())
.setDestination(BridgedAppsSettings.class.getName())
.setSourceMetricsCategory(getMetricsCategory())
- .setTitleRes(R.string.notif_listener_excluded_app_title)
+ .setTitleRes(R.string.notif_listener_excluded_app_screen_title)
.setArguments(args)
.setUserHandle(UserHandle.of(mUserId))
.launch();
diff --git a/src/com/android/settings/biometrics/BiometricEnrollBase.java b/src/com/android/settings/biometrics/BiometricEnrollBase.java
index 7936f66a726..3fb89411190 100644
--- a/src/com/android/settings/biometrics/BiometricEnrollBase.java
+++ b/src/com/android/settings/biometrics/BiometricEnrollBase.java
@@ -173,6 +173,10 @@ public abstract class BiometricEnrollBase extends InstrumentedActivity {
setHeaderText(resId, false /* force */);
}
+ protected void setDescriptionText(int resId) {
+ getLayout().setDescriptionText(resId);
+ }
+
protected FooterButton getNextButton() {
if (mFooterBarMixin != null) {
return mFooterBarMixin.getPrimaryButton();
diff --git a/src/com/android/settings/biometrics/BiometricEnrollIntroduction.java b/src/com/android/settings/biometrics/BiometricEnrollIntroduction.java
index 26df474aa55..09344b0d0dd 100644
--- a/src/com/android/settings/biometrics/BiometricEnrollIntroduction.java
+++ b/src/com/android/settings/biometrics/BiometricEnrollIntroduction.java
@@ -309,9 +309,8 @@ public abstract class BiometricEnrollIntroduction extends BiometricEnrollBase
protected void initViews() {
super.initViews();
- TextView description = (TextView) findViewById(R.id.sud_layout_description);
if (mBiometricUnlockDisabledByAdmin) {
- description.setText(getDescriptionResDisabledByAdmin());
+ setDescriptionText(getDescriptionResDisabledByAdmin());
}
}
}
diff --git a/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollIntroduction.java b/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollIntroduction.java
index 23a11339525..0996a582d44 100644
--- a/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollIntroduction.java
+++ b/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollIntroduction.java
@@ -57,6 +57,8 @@ public class FingerprintEnrollIntroduction extends BiometricEnrollIntroduction {
super.onCreate(savedInstanceState);
+ setDescriptionText(R.string.security_settings_fingerprint_enroll_introduction_message);
+
mFooterBarMixin = getLayout().getMixin(FooterBarMixin.class);
mFooterBarMixin.setSecondaryButton(
new FooterButton.Builder(this)
@@ -69,7 +71,7 @@ public class FingerprintEnrollIntroduction extends BiometricEnrollIntroduction {
mFooterBarMixin.setPrimaryButton(
new FooterButton.Builder(this)
- .setText(R.string.wizard_next)
+ .setText(R.string.security_settings_fingerprint_enroll_introduction_agree)
.setListener(this::onNextButtonClick)
.setButtonType(FooterButton.ButtonType.NEXT)
.setTheme(R.style.SudGlifButton_Primary)
@@ -78,7 +80,7 @@ public class FingerprintEnrollIntroduction extends BiometricEnrollIntroduction {
}
int getNegativeButtonTextId() {
- return R.string.security_settings_fingerprint_enroll_introduction_no_thanks;
+ return R.string.security_settings_fingerprint_enroll_introduction_skip;
}
@Override
diff --git a/src/com/android/settings/connecteddevice/usb/UsbDefaultFragment.java b/src/com/android/settings/connecteddevice/usb/UsbDefaultFragment.java
index 668ec3f2ce2..de08f38524f 100644
--- a/src/com/android/settings/connecteddevice/usb/UsbDefaultFragment.java
+++ b/src/com/android/settings/connecteddevice/usb/UsbDefaultFragment.java
@@ -64,14 +64,24 @@ public class UsbDefaultFragment extends RadioButtonPickerFragment {
private UsbConnectionBroadcastReceiver mUsbReceiver;
private Handler mHandler = new Handler();
+ private boolean mIsConnected = false;
@VisibleForTesting
UsbConnectionBroadcastReceiver.UsbConnectionListener mUsbConnectionListener =
(connected, functions, powerRole, dataRole) -> {
+ final long defaultFunctions = mUsbBackend.getDefaultUsbFunctions();
+ Log.d(TAG, "UsbConnectionListener() connected : " + connected + ", functions : "
+ + functions + ", defaultFunctions : " + defaultFunctions);
+ if (connected && !mIsConnected && defaultFunctions == UsbManager.FUNCTION_RNDIS) {
+ startTethering();
+ }
+
if (mIsStartTethering) {
mCurrentFunctions = functions;
refresh(functions);
+ mIsStartTethering = false;
}
+ mIsConnected = connected;
};
@Override
@@ -146,9 +156,7 @@ public class UsbDefaultFragment extends RadioButtonPickerFragment {
if (functions == UsbManager.FUNCTION_RNDIS) {
// We need to have entitlement check for usb tethering, so use API in
// TetheringManager.
- mIsStartTethering = true;
- mTetheringManager.startTethering(TETHERING_USB, new HandlerExecutor(mHandler),
- mOnStartTetheringCallback);
+ startTethering();
} else {
mIsStartTethering = false;
mCurrentFunctions = functions;
@@ -159,6 +167,13 @@ public class UsbDefaultFragment extends RadioButtonPickerFragment {
return true;
}
+ private void startTethering() {
+ Log.d(TAG, "startTethering()");
+ mIsStartTethering = true;
+ mTetheringManager.startTethering(TETHERING_USB, new HandlerExecutor(mHandler),
+ mOnStartTetheringCallback);
+ }
+
@Override
public void onPause() {
super.onPause();
@@ -171,6 +186,7 @@ public class UsbDefaultFragment extends RadioButtonPickerFragment {
@Override
public void onTetheringStarted() {
+ Log.d(TAG, "onTetheringStarted()");
// Set default usb functions again to make internal data persistent
mCurrentFunctions = UsbManager.FUNCTION_RNDIS;
mUsbBackend.setDefaultUsbFunctions(UsbManager.FUNCTION_RNDIS);
diff --git a/src/com/android/settings/display/AdaptiveSleepPreferenceController.java b/src/com/android/settings/display/AdaptiveSleepPreferenceController.java
index c0c5e63bfa4..e0527f9d32b 100644
--- a/src/com/android/settings/display/AdaptiveSleepPreferenceController.java
+++ b/src/com/android/settings/display/AdaptiveSleepPreferenceController.java
@@ -20,6 +20,7 @@ import static com.android.settings.core.BasePreferenceController.AVAILABLE_UNSEA
import static com.android.settings.core.BasePreferenceController.UNSUPPORTED_ON_DEVICE;
import android.Manifest;
+import android.app.settings.SettingsEnums;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
@@ -33,8 +34,10 @@ import androidx.preference.PreferenceScreen;
import com.android.settings.R;
import com.android.settings.bluetooth.RestrictionUtils;
+import com.android.settings.overlay.FeatureFactory;
import com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
import com.android.settingslib.RestrictedSwitchPreference;
+import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
import com.google.common.annotations.VisibleForTesting;
@@ -45,6 +48,7 @@ public class AdaptiveSleepPreferenceController {
private RestrictionUtils mRestrictionUtils;
private PackageManager mPackageManager;
private Context mContext;
+ private MetricsFeatureProvider mMetricsFeatureProvider;
@VisibleForTesting
RestrictedSwitchPreference mPreference;
@@ -52,6 +56,7 @@ public class AdaptiveSleepPreferenceController {
public AdaptiveSleepPreferenceController(Context context, RestrictionUtils restrictionUtils) {
mContext = context;
mRestrictionUtils = restrictionUtils;
+ mMetricsFeatureProvider = FeatureFactory.getFactory(context).getMetricsFeatureProvider();
mPreference = new RestrictedSwitchPreference(context);
mPreference.setTitle(R.string.adaptive_sleep_title);
mPreference.setSummary(R.string.adaptive_sleep_description);
@@ -60,6 +65,8 @@ public class AdaptiveSleepPreferenceController {
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;
diff --git a/src/com/android/settings/display/AutoRotateSwitchBarController.java b/src/com/android/settings/display/AutoRotateSwitchBarController.java
index 0931a10840c..e149ccb6c76 100644
--- a/src/com/android/settings/display/AutoRotateSwitchBarController.java
+++ b/src/com/android/settings/display/AutoRotateSwitchBarController.java
@@ -93,7 +93,8 @@ public class AutoRotateSwitchBarController implements OnMainSwitchChangeListener
private boolean setRotationLock(boolean isChecked) {
final boolean isLocked = !isChecked;
- mMetricsFeatureProvider.action(mContext, SettingsEnums.ACTION_ROTATION_LOCK, isLocked);
+ mMetricsFeatureProvider.action(mContext, SettingsEnums.ACTION_ROTATE_ROTATE_MASTER_TOGGLE,
+ isChecked);
RotationPolicy.setRotationLock(mContext, isLocked);
return true;
}
diff --git a/src/com/android/settings/display/ScreenTimeoutSettings.java b/src/com/android/settings/display/ScreenTimeoutSettings.java
index b187c876ac8..15b5466ff06 100644
--- a/src/com/android/settings/display/ScreenTimeoutSettings.java
+++ b/src/com/android/settings/display/ScreenTimeoutSettings.java
@@ -37,6 +37,7 @@ import androidx.preference.Preference;
import androidx.preference.PreferenceScreen;
import com.android.settings.R;
+import com.android.settings.overlay.FeatureFactory;
import com.android.settings.search.BaseSearchIndexProvider;
import com.android.settings.search.actionbar.SearchMenuController;
import com.android.settings.support.actionbar.HelpMenuController;
@@ -44,6 +45,7 @@ import com.android.settings.support.actionbar.HelpResourceProvider;
import com.android.settings.widget.RadioButtonPickerFragment;
import com.android.settingslib.RestrictedLockUtils;
import com.android.settingslib.RestrictedLockUtilsInternal;
+import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
import com.android.settingslib.search.SearchIndexable;
import com.android.settingslib.search.SearchIndexableRaw;
import com.android.settingslib.widget.CandidateInfo;
@@ -70,6 +72,7 @@ public class ScreenTimeoutSettings extends RadioButtonPickerFragment implements
private CharSequence[] mInitialEntries;
private CharSequence[] mInitialValues;
private FooterPreference mPrivacyPreference;
+ private MetricsFeatureProvider mMetricsFeatureProvider;
@VisibleForTesting
RestrictedLockUtils.EnforcedAdmin mAdmin;
@@ -102,6 +105,7 @@ public class ScreenTimeoutSettings extends RadioButtonPickerFragment implements
mPrivacyPreference.setTitle(R.string.adaptive_sleep_privacy);
mPrivacyPreference.setSelectable(false);
mPrivacyPreference.setLayoutResource(R.layout.preference_footer);
+ mMetricsFeatureProvider = FeatureFactory.getFactory(context).getMetricsFeatureProvider();
}
@Override
@@ -244,6 +248,8 @@ public class ScreenTimeoutSettings extends RadioButtonPickerFragment implements
try {
if (context != null) {
final long value = Long.parseLong(key);
+ mMetricsFeatureProvider.action(context, SettingsEnums.ACTION_SCREEN_TIMEOUT_CHANGED,
+ (int) value);
Settings.System.putLong(context.getContentResolver(), SCREEN_OFF_TIMEOUT, value);
}
} catch (NumberFormatException e) {
diff --git a/src/com/android/settings/fuelgauge/BatterySaverController.java b/src/com/android/settings/fuelgauge/BatterySaverController.java
index a91f85c4b52..fba163dd223 100644
--- a/src/com/android/settings/fuelgauge/BatterySaverController.java
+++ b/src/com/android/settings/fuelgauge/BatterySaverController.java
@@ -15,14 +15,21 @@
*/
package com.android.settings.fuelgauge;
+import android.content.ContentResolver;
import android.content.Context;
+import android.database.ContentObserver;
+import android.os.Handler;
+import android.os.Looper;
import android.os.PowerManager;
+import android.provider.Settings;
+import android.provider.Settings.Global;
-import androidx.annotation.VisibleForTesting;
+import androidx.preference.Preference;
import androidx.preference.PreferenceScreen;
-import com.android.settings.core.TogglePreferenceController;
-import com.android.settings.widget.PrimarySwitchPreference;
+import com.android.settings.R;
+import com.android.settings.Utils;
+import com.android.settings.core.BasePreferenceController;
import com.android.settingslib.core.lifecycle.LifecycleObserver;
import com.android.settingslib.core.lifecycle.events.OnStart;
import com.android.settingslib.core.lifecycle.events.OnStop;
@@ -31,14 +38,19 @@ import com.android.settingslib.fuelgauge.BatterySaverUtils;
/**
* Controller to update the battery saver entry preference.
*/
-public class BatterySaverController extends TogglePreferenceController
+public class BatterySaverController extends BasePreferenceController
implements LifecycleObserver, OnStart, OnStop, BatterySaverReceiver.BatterySaverListener {
private static final String KEY_BATTERY_SAVER = "battery_saver_summary";
private final BatterySaverReceiver mBatteryStateChangeReceiver;
private final PowerManager mPowerManager;
-
- @VisibleForTesting
- PrimarySwitchPreference mBatterySaverPref;
+ private Preference mBatterySaverPref;
+ private final ContentObserver mObserver = new ContentObserver(
+ new Handler(Looper.getMainLooper())) {
+ @Override
+ public void onChange(boolean selfChange) {
+ updateSummary();
+ }
+ };
public BatterySaverController(Context context) {
super(context, KEY_BATTERY_SAVER);
@@ -67,38 +79,54 @@ public class BatterySaverController extends TogglePreferenceController
@Override
public void onStart() {
+ mContext.getContentResolver().registerContentObserver(
+ Settings.Global.getUriFor(Settings.Global.LOW_POWER_MODE_TRIGGER_LEVEL),
+ true /* notifyForDescendants */, mObserver);
mBatteryStateChangeReceiver.setListening(true);
+ updateSummary();
}
@Override
public void onStop() {
+ mContext.getContentResolver().unregisterContentObserver(mObserver);
mBatteryStateChangeReceiver.setListening(false);
}
@Override
- public void onPowerSaveModeChanged() {
- final boolean isChecked = isChecked();
- if (mBatterySaverPref != null && mBatterySaverPref.isChecked() != isChecked) {
- mBatterySaverPref.setChecked(isChecked);
+ public CharSequence getSummary() {
+ final boolean isPowerSaveOn = mPowerManager.isPowerSaveMode();
+ if (isPowerSaveOn) {
+ return mContext.getString(R.string.battery_saver_on_summary);
}
+
+ final ContentResolver resolver = mContext.getContentResolver();
+ final int mode = Settings.Global.getInt(resolver,
+ Global.AUTOMATIC_POWER_SAVE_MODE, PowerManager.POWER_SAVE_MODE_TRIGGER_PERCENTAGE);
+ if (mode == PowerManager.POWER_SAVE_MODE_TRIGGER_PERCENTAGE) {
+ final int percent = Settings.Global.getInt(resolver,
+ Settings.Global.LOW_POWER_MODE_TRIGGER_LEVEL, 0);
+ return percent != 0 ?
+ mContext.getString(R.string.battery_saver_off_scheduled_summary,
+ Utils.formatPercentage(percent)) :
+ mContext.getString(R.string.battery_saver_off_summary);
+ } else {
+ return mContext.getString(R.string.battery_saver_auto_routine);
+ }
+ }
+
+ private void updateSummary() {
+ if (mBatterySaverPref != null) {
+ mBatterySaverPref.setSummary(getSummary());
+ }
+ }
+
+ @Override
+ public void onPowerSaveModeChanged() {
+ updateSummary();
}
@Override
public void onBatteryChanged(boolean pluggedIn) {
- if (mBatterySaverPref != null) {
- mBatterySaverPref.setSwitchEnabled(!pluggedIn);
- }
- }
-
- @Override
- public boolean isChecked() {
- return mPowerManager.isPowerSaveMode();
- }
-
- @Override
- public boolean setChecked(boolean stateOn) {
- return BatterySaverUtils.setPowerSaveMode(mContext, stateOn,
- false /* needFirstTimeWarning */);
}
}
diff --git a/src/com/android/settings/network/AllowedNetworkTypesListener.java b/src/com/android/settings/network/AllowedNetworkTypesListener.java
index a11f3b41301..a9ed8be7327 100644
--- a/src/com/android/settings/network/AllowedNetworkTypesListener.java
+++ b/src/com/android/settings/network/AllowedNetworkTypesListener.java
@@ -18,6 +18,7 @@ package com.android.settings.network;
import android.content.Context;
import android.telephony.PhoneStateListener;
+import android.telephony.TelephonyCallback;
import android.telephony.TelephonyManager;
import android.util.Log;
@@ -28,14 +29,14 @@ import java.util.concurrent.Executor;
/**
- * {@link PhoneStateListener} to listen to Allowed Network Types changed
+ * {@link TelephonyCallback} to listen to Allowed Network Types changed
*/
-public class AllowedNetworkTypesListener extends PhoneStateListener implements
- PhoneStateListener.AllowedNetworkTypesChangedListener {
+public class AllowedNetworkTypesListener extends TelephonyCallback implements
+ TelephonyCallback.AllowedNetworkTypesListener {
private static final String LOG_TAG = "NetworkModeListener";
@VisibleForTesting
- AllowedNetworkTypesListener.OnAllowedNetworkTypesChangedListener mListener;
+ OnAllowedNetworkTypesListener mListener;
private long mAllowedNetworkType = -1;
private Executor mExecutor;
@@ -44,7 +45,7 @@ public class AllowedNetworkTypesListener extends PhoneStateListener implements
mExecutor = executor;
}
- public void setAllowedNetworkTypesChangedListener(OnAllowedNetworkTypesChangedListener lsn) {
+ public void setAllowedNetworkTypesListener(OnAllowedNetworkTypesListener lsn) {
mListener = lsn;
}
@@ -56,7 +57,7 @@ public class AllowedNetworkTypesListener extends PhoneStateListener implements
public void register(Context context, int subId) {
TelephonyManager telephonyManager = context.getSystemService(
TelephonyManager.class).createForSubscriptionId(subId);
- telephonyManager.registerPhoneStateListener(mExecutor, this);
+ telephonyManager.registerTelephonyCallback(mExecutor, this);
}
/**
@@ -67,7 +68,7 @@ public class AllowedNetworkTypesListener extends PhoneStateListener implements
public void unregister(Context context, int subId) {
TelephonyManager telephonyManager = context.getSystemService(
TelephonyManager.class).createForSubscriptionId(subId);
- telephonyManager.unregisterPhoneStateListener(this);
+ telephonyManager.unregisterTelephonyCallback(this);
}
@Override
@@ -84,7 +85,7 @@ public class AllowedNetworkTypesListener extends PhoneStateListener implements
/**
* Listener for update of Preferred Network Mode change
*/
- public interface OnAllowedNetworkTypesChangedListener {
+ public interface OnAllowedNetworkTypesListener {
/**
* Notify the allowed network type changed.
*/
diff --git a/src/com/android/settings/network/ProviderModelSlice.java b/src/com/android/settings/network/ProviderModelSlice.java
index c020f06d4ec..a1fdb1cebf4 100644
--- a/src/com/android/settings/network/ProviderModelSlice.java
+++ b/src/com/android/settings/network/ProviderModelSlice.java
@@ -83,8 +83,9 @@ public class ProviderModelSlice extends WifiSlice {
// Second section: Add a carrier item.
// Third section: Add the Wi-Fi items which are not connected.
// Fourth section: If device has connection problem, this row show the message for user.
+ boolean hasEthernet = isEthernetConnected();
final ListBuilder listBuilder = mHelper.createListBuilder(getUri());
- if (mHelper.isAirplaneModeEnabled() && !mWifiManager.isWifiEnabled()) {
+ if (mHelper.isAirplaneModeEnabled() && !mWifiManager.isWifiEnabled() && !hasEthernet) {
log("Airplane mode is enabled.");
return listBuilder.build();
}
@@ -104,12 +105,12 @@ public class ProviderModelSlice extends WifiSlice {
log("hasCarrier: " + hasCarrier);
// First section: Add a Ethernet or Wi-Fi item which state is connected.
- if (isEthernetConnected()) {
+ final WifiSliceItem connectedWifiItem = mHelper.getConnectedWifiItem(wifiList);
+ if (hasEthernet) {
log("get Ethernet item which is connected");
listBuilder.addRow(createEthernetRow());
maxListSize--;
} else {
- final WifiSliceItem connectedWifiItem = mHelper.getConnectedWifiItem(wifiList);
if (connectedWifiItem != null) {
log("get Wi-Fi item which is connected");
listBuilder.addRow(getWifiSliceItemRow(connectedWifiItem));
@@ -126,7 +127,14 @@ public class ProviderModelSlice extends WifiSlice {
maxListSize--;
}
- // Third section: Add the Wi-Fi items which are not connected.
+ // Third section: Add the connected Wi-Fi item to Wi-Fi list if the Ethernet is connected.
+ if (connectedWifiItem != null && hasEthernet) {
+ log("get Wi-Fi item which is connected");
+ listBuilder.addRow(getWifiSliceItemRow(connectedWifiItem));
+ maxListSize--;
+ }
+
+ // Fourth section: Add the Wi-Fi items which are not connected.
if (wifiList != null && wifiList.size() > 0) {
log("get Wi-Fi items which are not connected. Wi-Fi items : " + wifiList.size());
@@ -140,7 +148,7 @@ public class ProviderModelSlice extends WifiSlice {
}
}
- // Fourth section: If device has connection problem, this row show the message for user.
+ // Fifth section: If device has connection problem, this row show the message for user.
// 1) show non_carrier_network_unavailable:
// - while no wifi item
// 2) show all_network_unavailable:
@@ -154,7 +162,7 @@ public class ProviderModelSlice extends WifiSlice {
resId = R.string.all_network_unavailable;
}
- if (!hasCarrier) {
+ if (!hasCarrier && !hasEthernet) {
// If there is no item in ProviderModelItem, slice needs a header.
listBuilder.setHeader(mHelper.createHeader(
NetworkProviderSettings.ACTION_NETWORK_PROVIDER_SETTINGS));
diff --git a/src/com/android/settings/network/SubscriptionsPreferenceController.java b/src/com/android/settings/network/SubscriptionsPreferenceController.java
index 392ccc6aba5..f89ccfdde80 100644
--- a/src/com/android/settings/network/SubscriptionsPreferenceController.java
+++ b/src/com/android/settings/network/SubscriptionsPreferenceController.java
@@ -257,9 +257,10 @@ public class SubscriptionsPreferenceController extends AbstractPreferenceControl
}
private CharSequence getMobilePreferenceSummary(int subId) {
+ TelephonyManager tm = mTelephonyManager.createForSubscriptionId(subId);
String result = mSubsPrefCtrlInjector.getNetworkType(
mContext, mConfig, mTelephonyDisplayInfo, subId);
- if (!mTelephonyManager.isDataEnabled()) {
+ if (!tm.isDataEnabled()) {
return mContext.getString(R.string.mobile_data_off_summary);
}
if (!result.isEmpty() && mSubsPrefCtrlInjector.isActiveCellularNetwork(mContext)) {
diff --git a/src/com/android/settings/network/telephony/Enable2gPreferenceController.java b/src/com/android/settings/network/telephony/Enable2gPreferenceController.java
index c7802341ce0..cf08d107528 100644
--- a/src/com/android/settings/network/telephony/Enable2gPreferenceController.java
+++ b/src/com/android/settings/network/telephony/Enable2gPreferenceController.java
@@ -15,6 +15,7 @@
*/
package com.android.settings.network.telephony;
+import android.app.settings.SettingsEnums;
import android.content.Context;
import android.os.PersistableBundle;
import android.telephony.CarrierConfigManager;
@@ -22,6 +23,9 @@ import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager;
import android.util.Log;
+import com.android.settings.overlay.FeatureFactory;
+import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
+
/**
* Preference controller for "Enable 2G"
*/
@@ -34,6 +38,8 @@ public class Enable2gPreferenceController extends TelephonyTogglePreferenceContr
| TelephonyManager.NETWORK_TYPE_BITMASK_CDMA
| TelephonyManager.NETWORK_TYPE_BITMASK_1xRTT;
+ private final MetricsFeatureProvider mMetricsFeatureProvider;
+
private CarrierConfigManager mCarrierConfigManager;
private TelephonyManager mTelephonyManager;
@@ -46,6 +52,7 @@ public class Enable2gPreferenceController extends TelephonyTogglePreferenceContr
public Enable2gPreferenceController(Context context, String key) {
super(context, key);
mCarrierConfigManager = context.getSystemService(CarrierConfigManager.class);
+ mMetricsFeatureProvider = FeatureFactory.getFactory(context).getMetricsFeatureProvider();
}
/**
@@ -98,6 +105,8 @@ public class Enable2gPreferenceController extends TelephonyTogglePreferenceContr
}
mTelephonyManager.setAllowedNetworkTypesForReason(
mTelephonyManager.ALLOWED_NETWORK_TYPES_REASON_ENABLE_2G, newAllowedNetworkTypes);
+ mMetricsFeatureProvider.action(
+ mContext, SettingsEnums.ACTION_2G_ENABLED, isChecked);
return true;
}
}
diff --git a/src/com/android/settings/network/telephony/EnabledNetworkModePreferenceController.java b/src/com/android/settings/network/telephony/EnabledNetworkModePreferenceController.java
index 5680bf60140..f0d4a431c0b 100644
--- a/src/com/android/settings/network/telephony/EnabledNetworkModePreferenceController.java
+++ b/src/com/android/settings/network/telephony/EnabledNetworkModePreferenceController.java
@@ -151,7 +151,7 @@ public class EnabledNetworkModePreferenceController extends
if (mAllowedNetworkTypesListener == null) {
mAllowedNetworkTypesListener = new AllowedNetworkTypesListener(
mContext.getMainExecutor());
- mAllowedNetworkTypesListener.setAllowedNetworkTypesChangedListener(
+ mAllowedNetworkTypesListener.setAllowedNetworkTypesListener(
() -> updatePreference());
}
diff --git a/src/com/android/settings/network/telephony/NetworkPreferenceCategoryController.java b/src/com/android/settings/network/telephony/NetworkPreferenceCategoryController.java
index 25651f5379e..4ebcb7a59d6 100644
--- a/src/com/android/settings/network/telephony/NetworkPreferenceCategoryController.java
+++ b/src/com/android/settings/network/telephony/NetworkPreferenceCategoryController.java
@@ -45,7 +45,7 @@ public class NetworkPreferenceCategoryController extends PreferenceCategoryContr
mSubId = SubscriptionManager.INVALID_SUBSCRIPTION_ID;
mAllowedNetworkTypesListener = new AllowedNetworkTypesListener(
context.getMainExecutor());
- mAllowedNetworkTypesListener.setAllowedNetworkTypesChangedListener(
+ mAllowedNetworkTypesListener.setAllowedNetworkTypesListener(
() -> updatePreference());
}
diff --git a/src/com/android/settings/network/telephony/NetworkProviderWorker.java b/src/com/android/settings/network/telephony/NetworkProviderWorker.java
index 9e23c7ce2dc..57f17b59560 100644
--- a/src/com/android/settings/network/telephony/NetworkProviderWorker.java
+++ b/src/com/android/settings/network/telephony/NetworkProviderWorker.java
@@ -25,9 +25,9 @@ import android.database.ContentObserver;
import android.net.Uri;
import android.os.Handler;
import android.os.Looper;
-import android.telephony.PhoneStateListener;
import android.telephony.ServiceState;
import android.telephony.SubscriptionManager;
+import android.telephony.TelephonyCallback;
import android.telephony.TelephonyDisplayInfo;
import android.telephony.TelephonyManager;
import android.util.Log;
@@ -62,7 +62,7 @@ public class NetworkProviderWorker extends WifiScanWorker implements
private final Context mContext;
final Handler mHandler;
@VisibleForTesting
- final PhoneStateListener mPhoneStateListener;
+ final NetworkProviderTelephonyCallback mTelephonyCallback;
private TelephonyManager mTelephonyManager;
private Config mConfig = null;
private TelephonyDisplayInfo mTelephonyDisplayInfo =
@@ -82,7 +82,7 @@ public class NetworkProviderWorker extends WifiScanWorker implements
mTelephonyManager = mContext.getSystemService(
TelephonyManager.class).createForSubscriptionId(mDefaultDataSubid);
- mPhoneStateListener = new NetworkProviderPhoneStateListener();
+ mTelephonyCallback = new NetworkProviderTelephonyCallback();
mSubscriptionsListener = new SubscriptionsChangeListener(context, this);
mDataEnabledListener = new MobileDataEnabledListener(context, this);
mConnectivityListener = new DataConnectivityListener(context, this);
@@ -100,7 +100,7 @@ public class NetworkProviderWorker extends WifiScanWorker implements
mDataEnabledListener.start(mDefaultDataSubid);
mConnectivityListener.start();
mSignalStrengthListener.resume();
- mTelephonyManager.registerPhoneStateListener(mHandler::post, mPhoneStateListener);
+ mTelephonyManager.registerTelephonyCallback(mHandler::post, mTelephonyCallback);
super.onSlicePinned();
}
@@ -111,7 +111,7 @@ public class NetworkProviderWorker extends WifiScanWorker implements
mDataEnabledListener.stop();
mConnectivityListener.stop();
mSignalStrengthListener.pause();
- mTelephonyManager.unregisterPhoneStateListener(mPhoneStateListener);
+ mTelephonyManager.unregisterTelephonyCallback(mTelephonyCallback);
super.onSliceUnpinned();
}
@@ -141,12 +141,12 @@ public class NetworkProviderWorker extends WifiScanWorker implements
return;
}
if (SubscriptionManager.isUsableSubscriptionId(defaultDataSubId)) {
- mTelephonyManager.unregisterPhoneStateListener(mPhoneStateListener);
+ mTelephonyManager.unregisterTelephonyCallback(mTelephonyCallback);
mMobileDataObserver.unregister(mContext);
mSignalStrengthListener.updateSubscriptionIds(Collections.singleton(defaultDataSubId));
mTelephonyManager = mTelephonyManager.createForSubscriptionId(defaultDataSubId);
- mTelephonyManager.registerPhoneStateListener(mHandler::post, mPhoneStateListener);
+ mTelephonyManager.registerTelephonyCallback(mHandler::post, mTelephonyCallback);
mMobileDataObserver.register(mContext, mDefaultDataSubid);
mConfig = getConfig(mContext);
} else {
@@ -216,10 +216,10 @@ public class NetworkProviderWorker extends WifiScanWorker implements
}
}
- class NetworkProviderPhoneStateListener extends PhoneStateListener implements
- PhoneStateListener.DataConnectionStateChangedListener,
- PhoneStateListener.DisplayInfoChangedListener,
- PhoneStateListener.ServiceStateChangedListener {
+ class NetworkProviderTelephonyCallback extends TelephonyCallback implements
+ TelephonyCallback.DataConnectionStateListener,
+ TelephonyCallback.DisplayInfoListener,
+ TelephonyCallback.ServiceStateListener {
@Override
public void onServiceStateChanged(ServiceState state) {
Log.d(TAG, "onServiceStateChanged voiceState=" + state.getState()
diff --git a/src/com/android/settings/network/telephony/cdma/CdmaBasePreferenceController.java b/src/com/android/settings/network/telephony/cdma/CdmaBasePreferenceController.java
index 06c3edb8478..4d1d319027c 100644
--- a/src/com/android/settings/network/telephony/cdma/CdmaBasePreferenceController.java
+++ b/src/com/android/settings/network/telephony/cdma/CdmaBasePreferenceController.java
@@ -77,7 +77,7 @@ public abstract class CdmaBasePreferenceController extends TelephonyBasePreferen
if (mAllowedNetworkTypesListener == null) {
mAllowedNetworkTypesListener = new AllowedNetworkTypesListener(
mContext.getMainExecutor());
- mAllowedNetworkTypesListener.setAllowedNetworkTypesChangedListener(
+ mAllowedNetworkTypesListener.setAllowedNetworkTypesListener(
() -> updatePreference());
}
}
diff --git a/src/com/android/settings/network/telephony/gsm/AutoSelectPreferenceController.java b/src/com/android/settings/network/telephony/gsm/AutoSelectPreferenceController.java
index 19302daec3e..997235c8a0c 100644
--- a/src/com/android/settings/network/telephony/gsm/AutoSelectPreferenceController.java
+++ b/src/com/android/settings/network/telephony/gsm/AutoSelectPreferenceController.java
@@ -81,7 +81,7 @@ public class AutoSelectPreferenceController extends TelephonyTogglePreferenceCon
mUiHandler = new Handler(Looper.getMainLooper());
mAllowedNetworkTypesListener = new AllowedNetworkTypesListener(
new HandlerExecutor(mUiHandler));
- mAllowedNetworkTypesListener.setAllowedNetworkTypesChangedListener(
+ mAllowedNetworkTypesListener.setAllowedNetworkTypesListener(
() -> updatePreference());
}
diff --git a/src/com/android/settings/network/telephony/gsm/OpenNetworkSelectPagePreferenceController.java b/src/com/android/settings/network/telephony/gsm/OpenNetworkSelectPagePreferenceController.java
index 1b77c6dd309..cdeb1e58fb9 100644
--- a/src/com/android/settings/network/telephony/gsm/OpenNetworkSelectPagePreferenceController.java
+++ b/src/com/android/settings/network/telephony/gsm/OpenNetworkSelectPagePreferenceController.java
@@ -60,7 +60,7 @@ public class OpenNetworkSelectPagePreferenceController extends
mSubId = SubscriptionManager.INVALID_SUBSCRIPTION_ID;
mAllowedNetworkTypesListener = new AllowedNetworkTypesListener(
context.getMainExecutor());
- mAllowedNetworkTypesListener.setAllowedNetworkTypesChangedListener(
+ mAllowedNetworkTypesListener.setAllowedNetworkTypesListener(
() -> updatePreference());
}
diff --git a/src/com/android/settings/notification/NotificationAccessSettings.java b/src/com/android/settings/notification/NotificationAccessSettings.java
index 12d6295ef90..a642d9c5b33 100644
--- a/src/com/android/settings/notification/NotificationAccessSettings.java
+++ b/src/com/android/settings/notification/NotificationAccessSettings.java
@@ -20,12 +20,14 @@ import android.annotation.Nullable;
import android.app.NotificationManager;
import android.app.admin.DevicePolicyManager;
import android.app.settings.SettingsEnums;
+import android.companion.ICompanionDeviceManager;
import android.content.ComponentName;
import android.content.Context;
import android.content.pm.PackageItemInfo;
import android.content.pm.PackageManager;
import android.content.pm.ServiceInfo;
import android.os.Bundle;
+import android.os.ServiceManager;
import android.os.UserHandle;
import android.os.UserManager;
import android.provider.Settings;
@@ -35,6 +37,7 @@ import android.util.Log;
import android.view.View;
import android.widget.Toast;
+import androidx.preference.PreferenceCategory;
import androidx.preference.PreferenceScreen;
import com.android.settings.R;
@@ -57,6 +60,9 @@ import java.util.List;
@SearchIndexable
public class NotificationAccessSettings extends EmptyTextSettings {
private static final String TAG = "NotifAccessSettings";
+ private static final String ALLOWED_KEY = "allowed";
+ private static final String NOT_ALLOWED_KEY = "not_allowed";
+
private static final ManagedServiceSettings.Config CONFIG =
new ManagedServiceSettings.Config.Builder()
.setTag(TAG)
@@ -76,6 +82,7 @@ public class NotificationAccessSettings extends EmptyTextSettings {
private DevicePolicyManager mDpm;
private ServiceListing mServiceListing;
private IconDrawableFactory mIconDrawableFactory;
+ private NotificationBackend mBackend = new NotificationBackend();
@Override
public void onCreate(Bundle icicle) {
@@ -93,7 +100,6 @@ public class NotificationAccessSettings extends EmptyTextSettings {
.setTag(CONFIG.tag)
.build();
mServiceListing.addCallback(this::updateList);
- setPreferenceScreen(getPreferenceManager().createPreferenceScreen(mContext));
if (UserManager.get(mContext).isManagedProfile()) {
// Apps in the work profile do not support notification listeners.
@@ -127,7 +133,11 @@ public class NotificationAccessSettings extends EmptyTextSettings {
final int managedProfileId = Utils.getManagedProfileId(um, UserHandle.myUserId());
final PreferenceScreen screen = getPreferenceScreen();
- screen.removeAll();
+ final PreferenceCategory allowedCategory = screen.findPreference(ALLOWED_KEY);
+ allowedCategory.removeAll();
+ final PreferenceCategory notAllowedCategory = screen.findPreference(NOT_ALLOWED_KEY);
+ notAllowedCategory.removeAll();
+
services.sort(new PackageItemInfo.DisplayNameComparator(mPm));
for (ServiceInfo service : services) {
final ComponentName cn = new ComponentName(service.packageName, service.name);
@@ -145,9 +155,11 @@ public class NotificationAccessSettings extends EmptyTextSettings {
pref.setIcon(mIconDrawableFactory.getBadgedIcon(service, service.applicationInfo,
UserHandle.getUserId(service.applicationInfo.uid)));
pref.setKey(cn.flattenToString());
- pref.setSummary(mNm.isNotificationListenerAccessGranted(cn)
- ? R.string.app_permission_summary_allowed
- : R.string.app_permission_summary_not_allowed);
+ pref.setSummary(mBackend.getDeviceList(ICompanionDeviceManager.Stub.asInterface(
+ ServiceManager.getService(Context.COMPANION_DEVICE_SERVICE)),
+ com.android.settings.bluetooth.Utils.getLocalBtManager(mContext),
+ service.packageName,
+ UserHandle.myUserId()));
if (managedProfileId != UserHandle.USER_NULL
&& !mDpm.isNotificationListenerServicePermitted(
service.packageName, managedProfileId)) {
@@ -173,7 +185,11 @@ public class NotificationAccessSettings extends EmptyTextSettings {
return true;
});
pref.setKey(cn.flattenToString());
- screen.addPreference(pref);
+ if (mNm.isNotificationListenerAccessGranted(cn)) {
+ allowedCategory.addPreference(pref);
+ } else {
+ notAllowedCategory.addPreference(pref);
+ }
}
highlightPreferenceIfNeeded();
}
diff --git a/src/com/android/settings/notification/NotificationBackend.java b/src/com/android/settings/notification/NotificationBackend.java
index 8a7e737dbb8..4347ca55104 100644
--- a/src/com/android/settings/notification/NotificationBackend.java
+++ b/src/com/android/settings/notification/NotificationBackend.java
@@ -30,6 +30,7 @@ import android.app.NotificationManager;
import android.app.role.RoleManager;
import android.app.usage.IUsageStatsManager;
import android.app.usage.UsageEvents;
+import android.companion.ICompanionDeviceManager;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
@@ -55,14 +56,18 @@ import androidx.annotation.VisibleForTesting;
import com.android.settingslib.R;
import com.android.settingslib.Utils;
+import com.android.settingslib.bluetooth.CachedBluetoothDevice;
+import com.android.settingslib.bluetooth.LocalBluetoothManager;
import com.android.settingslib.notification.ConversationIconFactory;
import com.android.settingslib.utils.StringUtil;
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import java.util.Objects;
public class NotificationBackend {
private static final String TAG = "NotificationBackend";
@@ -138,6 +143,35 @@ public class NotificationBackend {
}
}
+ static public CharSequence getDeviceList(ICompanionDeviceManager cdm, LocalBluetoothManager lbm,
+ String pkg, int userId) {
+ boolean multiple = false;
+ StringBuilder sb = new StringBuilder();
+
+ try {
+ List associatedMacAddrs = cdm.getAssociations(pkg, userId);
+ if (associatedMacAddrs != null) {
+ for (String assocMac : associatedMacAddrs) {
+ final Collection cachedDevices =
+ lbm.getCachedDeviceManager().getCachedDevicesCopy();
+ for (CachedBluetoothDevice cachedBluetoothDevice : cachedDevices) {
+ if (Objects.equals(assocMac, cachedBluetoothDevice.getAddress())) {
+ if (multiple) {
+ sb.append(", ");
+ } else {
+ multiple = true;
+ }
+ sb.append(cachedBluetoothDevice.getName());
+ }
+ }
+ }
+ }
+ } catch (RemoteException e) {
+ Log.w(TAG, "Error calling CDM", e);
+ }
+ return sb.toString();
+ }
+
public boolean isSystemApp(Context context, ApplicationInfo app) {
try {
PackageInfo info = context.getPackageManager().getPackageInfo(
diff --git a/src/com/android/settings/wifi/WifiConfigController.java b/src/com/android/settings/wifi/WifiConfigController.java
index b2eca781a8a..ee2abf83966 100644
--- a/src/com/android/settings/wifi/WifiConfigController.java
+++ b/src/com/android/settings/wifi/WifiConfigController.java
@@ -536,8 +536,9 @@ public class WifiConfigController implements TextWatcher,
} else {
enabled = ipAndProxyFieldsAreValid();
}
- if ((mAccessPointSecurity == AccessPoint.SECURITY_EAP ||
- mAccessPointSecurity == AccessPoint.SECURITY_EAP_SUITE_B)
+ if ((mAccessPointSecurity == AccessPoint.SECURITY_EAP
+ || mAccessPointSecurity == AccessPoint.SECURITY_EAP_WPA3_ENTERPRISE
+ || mAccessPointSecurity == AccessPoint.SECURITY_EAP_SUITE_B)
&& mEapCaCertSpinner != null
&& mView.findViewById(R.id.l_ca_cert).getVisibility() != View.GONE) {
String caCertSelection = (String) mEapCaCertSpinner.getSelectedItem();
@@ -553,8 +554,9 @@ public class WifiConfigController implements TextWatcher,
enabled = false;
}
}
- if ((mAccessPointSecurity == AccessPoint.SECURITY_EAP ||
- mAccessPointSecurity == AccessPoint.SECURITY_EAP_SUITE_B)
+ if ((mAccessPointSecurity == AccessPoint.SECURITY_EAP
+ || mAccessPointSecurity == AccessPoint.SECURITY_EAP_WPA3_ENTERPRISE
+ || mAccessPointSecurity == AccessPoint.SECURITY_EAP_SUITE_B)
&& mEapUserCertSpinner != null
&& mView.findViewById(R.id.l_user_cert).getVisibility() != View.GONE
&& mEapUserCertSpinner.getSelectedItem().equals(mUnspecifiedCertString)) {
@@ -651,10 +653,13 @@ public class WifiConfigController implements TextWatcher,
break;
case AccessPoint.SECURITY_EAP:
+ case AccessPoint.SECURITY_EAP_WPA3_ENTERPRISE:
case AccessPoint.SECURITY_EAP_SUITE_B:
if (mAccessPointSecurity == AccessPoint.SECURITY_EAP_SUITE_B) {
// allowedSuiteBCiphers will be set according to certificate type
config.setSecurityParams(WifiConfiguration.SECURITY_TYPE_EAP_SUITE_B);
+ } else if (mAccessPointSecurity == AccessPoint.SECURITY_EAP_WPA3_ENTERPRISE) {
+ config.setSecurityParams(WifiConfiguration.SECURITY_TYPE_EAP_WPA3_ENTERPRISE);
} else {
config.setSecurityParams(WifiConfiguration.SECURITY_TYPE_EAP);
}
@@ -1693,9 +1698,14 @@ public class WifiConfigController implements TextWatcher,
if (mWifiManager.isWpa3SaeSupported()) {
spinnerAdapter.add(mContext.getString(R.string.wifi_security_sae));
mSecurityInPosition[idx++] = AccessPoint.SECURITY_SAE;
+ spinnerAdapter.add(mContext.getString(R.string.wifi_security_eap_wpa_wpa2));
+ mSecurityInPosition[idx++] = AccessPoint.SECURITY_EAP;
+ spinnerAdapter.add(mContext.getString(R.string.wifi_security_eap_wpa3));
+ mSecurityInPosition[idx++] = AccessPoint.SECURITY_EAP_WPA3_ENTERPRISE;
+ } else {
+ spinnerAdapter.add(mContext.getString(R.string.wifi_security_eap));
+ mSecurityInPosition[idx++] = AccessPoint.SECURITY_EAP;
}
- spinnerAdapter.add(mContext.getString(R.string.wifi_security_eap));
- mSecurityInPosition[idx++] = AccessPoint.SECURITY_EAP;
if (mWifiManager.isWpa3SuiteBSupported()) {
spinnerAdapter.add(mContext.getString(R.string.wifi_security_eap_suiteb));
mSecurityInPosition[idx++] = AccessPoint.SECURITY_EAP_SUITE_B;
diff --git a/src/com/android/settings/wifi/WifiConfigController2.java b/src/com/android/settings/wifi/WifiConfigController2.java
index b4e26a6ab94..32152de70ab 100644
--- a/src/com/android/settings/wifi/WifiConfigController2.java
+++ b/src/com/android/settings/wifi/WifiConfigController2.java
@@ -500,6 +500,7 @@ public class WifiConfigController2 implements TextWatcher,
enabled = ipAndProxyFieldsAreValid();
}
if ((mWifiEntrySecurity == WifiEntry.SECURITY_EAP
+ || mWifiEntrySecurity == WifiEntry.SECURITY_EAP_WPA3_ENTERPRISE
|| mWifiEntrySecurity == WifiEntry.SECURITY_EAP_SUITE_B)
&& mEapCaCertSpinner != null
&& mView.findViewById(R.id.l_ca_cert).getVisibility() != View.GONE) {
@@ -517,6 +518,7 @@ public class WifiConfigController2 implements TextWatcher,
}
}
if ((mWifiEntrySecurity == WifiEntry.SECURITY_EAP
+ || mWifiEntrySecurity == WifiEntry.SECURITY_EAP_WPA3_ENTERPRISE
|| mWifiEntrySecurity == WifiEntry.SECURITY_EAP_SUITE_B)
&& mEapUserCertSpinner != null
&& mView.findViewById(R.id.l_user_cert).getVisibility() != View.GONE
@@ -615,10 +617,13 @@ public class WifiConfigController2 implements TextWatcher,
break;
case WifiEntry.SECURITY_EAP:
+ case WifiEntry.SECURITY_EAP_WPA3_ENTERPRISE:
case WifiEntry.SECURITY_EAP_SUITE_B:
if (mWifiEntrySecurity == WifiEntry.SECURITY_EAP_SUITE_B) {
// allowedSuiteBCiphers will be set according to certificate type
config.setSecurityParams(WifiConfiguration.SECURITY_TYPE_EAP_SUITE_B);
+ } else if (mWifiEntrySecurity == WifiEntry.SECURITY_EAP_WPA3_ENTERPRISE) {
+ config.setSecurityParams(WifiConfiguration.SECURITY_TYPE_EAP_WPA3_ENTERPRISE);
} else {
config.setSecurityParams(WifiConfiguration.SECURITY_TYPE_EAP);
}
@@ -942,6 +947,7 @@ public class WifiConfigController2 implements TextWatcher,
}
if (mWifiEntrySecurity != WifiEntry.SECURITY_EAP
+ && mWifiEntrySecurity != WifiEntry.SECURITY_EAP_WPA3_ENTERPRISE
&& mWifiEntrySecurity != WifiEntry.SECURITY_EAP_SUITE_B) {
mView.findViewById(R.id.eap).setVisibility(View.GONE);
return;
@@ -1660,9 +1666,14 @@ public class WifiConfigController2 implements TextWatcher,
if (mWifiManager.isWpa3SaeSupported()) {
spinnerAdapter.add(mContext.getString(R.string.wifi_security_sae));
mSecurityInPosition[idx++] = WifiEntry.SECURITY_SAE;
+ spinnerAdapter.add(mContext.getString(R.string.wifi_security_eap_wpa_wpa2));
+ mSecurityInPosition[idx++] = WifiEntry.SECURITY_EAP;
+ spinnerAdapter.add(mContext.getString(R.string.wifi_security_eap_wpa3));
+ mSecurityInPosition[idx++] = WifiEntry.SECURITY_EAP_WPA3_ENTERPRISE;
+ } else {
+ spinnerAdapter.add(mContext.getString(R.string.wifi_security_eap));
+ mSecurityInPosition[idx++] = WifiEntry.SECURITY_EAP;
}
- spinnerAdapter.add(mContext.getString(R.string.wifi_security_eap));
- mSecurityInPosition[idx++] = WifiEntry.SECURITY_EAP;
if (mWifiManager.isWpa3SuiteBSupported()) {
spinnerAdapter.add(mContext.getString(R.string.wifi_security_eap_suiteb));
mSecurityInPosition[idx++] = WifiEntry.SECURITY_EAP_SUITE_B;
diff --git a/tests/robotests/src/com/android/settings/connecteddevice/usb/UsbDefaultFragmentTest.java b/tests/robotests/src/com/android/settings/connecteddevice/usb/UsbDefaultFragmentTest.java
index c751e98d965..31081507bf9 100644
--- a/tests/robotests/src/com/android/settings/connecteddevice/usb/UsbDefaultFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/connecteddevice/usb/UsbDefaultFragmentTest.java
@@ -224,6 +224,32 @@ public class UsbDefaultFragmentTest {
assertThat(mFragment.mCurrentFunctions).isEqualTo(UsbManager.FUNCTION_MIDI);
}
+ @Test
+ public void usbIsPluginAndUsbTetheringIsOn_startTetheringIsInvoked() {
+ when(mUsbBackend.getDefaultUsbFunctions()).thenReturn(UsbManager.FUNCTION_RNDIS);
+
+ mFragment.mUsbConnectionListener.onUsbConnectionChanged(false /* connected */,
+ UsbManager.FUNCTION_RNDIS, POWER_ROLE_SINK, DATA_ROLE_DEVICE);
+ mFragment.mUsbConnectionListener.onUsbConnectionChanged(true /* connected */,
+ UsbManager.FUNCTION_RNDIS, POWER_ROLE_SINK, DATA_ROLE_DEVICE);
+
+ verify(mTetheringManager).startTethering(eq(TetheringManager.TETHERING_USB),
+ any(),
+ eq(mFragment.mOnStartTetheringCallback));
+ }
+
+ @Test
+ public void usbIsNotPluginAndUsbTetheringIsOn_startTetheringIsNotInvoked() {
+ when(mUsbBackend.getDefaultUsbFunctions()).thenReturn(UsbManager.FUNCTION_RNDIS);
+
+ mFragment.mUsbConnectionListener.onUsbConnectionChanged(false /* connected */,
+ UsbManager.FUNCTION_RNDIS, POWER_ROLE_SINK, DATA_ROLE_DEVICE);
+
+ verify(mTetheringManager, never()).startTethering(eq(TetheringManager.TETHERING_USB),
+ any(),
+ eq(mFragment.mOnStartTetheringCallback));
+ }
+
public static class TestFragment extends UsbDefaultFragment {
public final PreferenceScreen mScreen;
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatterySaverControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatterySaverControllerTest.java
index 4d2910e07b2..b3b81969b8b 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/BatterySaverControllerTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/BatterySaverControllerTest.java
@@ -17,20 +17,15 @@ package com.android.settings.fuelgauge;
import static com.google.common.truth.Truth.assertThat;
-import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import android.content.Context;
import android.os.PowerManager;
-import android.view.LayoutInflater;
-import android.widget.LinearLayout;
+import android.provider.Settings;
-import androidx.preference.PreferenceViewHolder;
-
-import com.android.settings.R;
-import com.android.settings.widget.PrimarySwitchPreference;
+import androidx.preference.Preference;
import org.junit.Before;
import org.junit.Test;
@@ -39,108 +34,84 @@ import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment;
+import org.robolectric.util.ReflectionHelpers;
@RunWith(RobolectricTestRunner.class)
public class BatterySaverControllerTest {
+ @Mock
+ private Preference mBatterySaverPref;
@Mock
private PowerManager mPowerManager;
private BatterySaverController mBatterySaverController;
- private PrimarySwitchPreference mBatterySaverPref;
+ private Context mContext;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
- final Context mContext = spy(RuntimeEnvironment.application);
- mBatterySaverPref = new PrimarySwitchPreference(mContext);
- final LayoutInflater inflater = LayoutInflater.from(mContext);
- final PreferenceViewHolder mHolder =
- PreferenceViewHolder.createInstanceForTests(inflater.inflate(
- com.android.settingslib.R.layout.preference_two_target, null));
- final LinearLayout mWidgetView = mHolder.itemView.findViewById(android.R.id.widget_frame);
- inflater.inflate(R.layout.restricted_preference_widget_primary_switch, mWidgetView, true);
- mBatterySaverPref.onBindViewHolder(mHolder);
+ mContext = RuntimeEnvironment.application;
+ mBatterySaverController = spy(new BatterySaverController(mContext));
+ ReflectionHelpers.setField(mBatterySaverController, "mPowerManager", mPowerManager);
+ ReflectionHelpers.setField(mBatterySaverController, "mBatterySaverPref", mBatterySaverPref);
- doReturn(mPowerManager).when(mContext).getSystemService(Context.POWER_SERVICE);
-
- mBatterySaverController = new BatterySaverController(mContext);
- mBatterySaverController.mBatterySaverPref = mBatterySaverPref;
+ Settings.Global.putInt(mContext.getContentResolver(),
+ Settings.Global.LOW_POWER_MODE_TRIGGER_LEVEL, 0);
}
@Test
- public void onBatteryChanged_true_switchEnabled() {
- mBatterySaverController.onBatteryChanged(true);
-
- assertThat(mBatterySaverPref.getSwitch().isEnabled()).isFalse();
+ public void onPreferenceChange_onStart() {
+ mBatterySaverController.onStart();
+ verify(mBatterySaverPref).setSummary("Off");
}
@Test
- public void onBatteryChanged_false_switchDisabled() {
- mBatterySaverController.onBatteryChanged(false);
-
- assertThat(mBatterySaverPref.getSwitch().isEnabled()).isTrue();
+ public void onPreferenceChange_onPowerSaveModeChanged() {
+ mBatterySaverController.onPowerSaveModeChanged();
+ verify(mBatterySaverPref).setSummary("Off");
}
@Test
- public void onPowerSaveModeChanged_differentState_updateToIsChecked() {
+ public void getSummary_batterySaverOn_showSummaryOn() {
when(mPowerManager.isPowerSaveMode()).thenReturn(true);
- assertThat(mBatterySaverPref.isChecked()).isFalse();
-
- mBatterySaverController.onPowerSaveModeChanged();
-
- assertThat(mBatterySaverPref.isChecked()).isTrue();
+ assertThat(mBatterySaverController.getSummary()).isEqualTo("On");
}
@Test
- public void onPowerSaveModeChanged_differentState_updateToUnChecked() {
- mBatterySaverPref.setChecked(true);
-
+ public void getSummary_batterySaverOffButScheduled_showSummaryScheduled() {
when(mPowerManager.isPowerSaveMode()).thenReturn(false);
- assertThat(mBatterySaverPref.isChecked()).isTrue();
+ Settings.Global.putInt(mContext.getContentResolver(),
+ Settings.Global.LOW_POWER_MODE_TRIGGER_LEVEL, 15);
- mBatterySaverController.onPowerSaveModeChanged();
-
- assertThat(mBatterySaverPref.isChecked()).isFalse();
+ assertThat(mBatterySaverController.getSummary()).isEqualTo("Will turn on at 15%");
}
@Test
- public void onPowerSaveModeChanged_sameState_noUpdate() {
+ public void getSummary_batterySaverOffButScheduledZeroPercent_showSummaryOff() {
when(mPowerManager.isPowerSaveMode()).thenReturn(false);
- assertThat(mBatterySaverPref.isChecked()).isFalse();
+ Settings.Global.putInt(mContext.getContentResolver(),
+ Settings.Global.LOW_POWER_MODE_TRIGGER_LEVEL, 0);
- mBatterySaverController.onPowerSaveModeChanged();
-
- assertThat(mBatterySaverPref.isChecked()).isFalse();
+ assertThat(mBatterySaverController.getSummary()).isEqualTo("Off");
}
@Test
- public void setChecked_on_setPowerSaveMode() {
- mBatterySaverController.setChecked(true);
+ public void getSummary_batterySaverOffButScheduledBasedOnRoutine_showSummaryBasedOnRoutine() {
+ when(mPowerManager.isPowerSaveMode()).thenReturn(false);
+ Settings.Global.putInt(
+ mContext.getContentResolver(),
+ Settings.Global.AUTOMATIC_POWER_SAVE_MODE,
+ PowerManager.POWER_SAVE_MODE_TRIGGER_DYNAMIC);
- verify(mPowerManager).setPowerSaveModeEnabled(true);
+ assertThat(mBatterySaverController.getSummary()).isEqualTo("Based on your routine");
}
@Test
- public void setChecked_off_unsetPowerSaveMode() {
- mBatterySaverController.setChecked(false);
-
- verify(mPowerManager).setPowerSaveModeEnabled(false);
- }
-
- @Test
- public void isChecked_on_powerSaveModeOn() {
- when(mPowerManager.isPowerSaveMode()).thenReturn(true);
-
- assertThat(mBatterySaverController.isChecked()).isTrue();
- }
-
- @Test
- public void isChecked_off_powerSaveModeOff() {
+ public void getSummary_batterySaverOff_showSummaryOff() {
when(mPowerManager.isPowerSaveMode()).thenReturn(false);
- assertThat(mBatterySaverController.isChecked()).isFalse();
+ assertThat(mBatterySaverController.getSummary()).isEqualTo("Off");
}
}
diff --git a/tests/robotests/src/com/android/settings/notification/NotificationBackendTest.java b/tests/robotests/src/com/android/settings/notification/NotificationBackendTest.java
index cb5060914b8..17471b5d90c 100644
--- a/tests/robotests/src/com/android/settings/notification/NotificationBackendTest.java
+++ b/tests/robotests/src/com/android/settings/notification/NotificationBackendTest.java
@@ -26,24 +26,50 @@ import static org.mockito.Mockito.when;
import android.app.role.RoleManager;
import android.app.usage.UsageEvents;
+import android.bluetooth.BluetoothAdapter;
+import android.companion.ICompanionDeviceManager;
+import android.content.ComponentName;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.os.Parcel;
import com.android.settings.notification.NotificationBackend.AppRow;
+import com.android.settingslib.bluetooth.CachedBluetoothDevice;
+import com.android.settingslib.bluetooth.CachedBluetoothDeviceManager;
+import com.android.settingslib.bluetooth.LocalBluetoothManager;
+import com.google.common.collect.ImmutableList;
+
+import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment;
import java.util.ArrayList;
+import java.util.Collection;
import java.util.List;
@RunWith(RobolectricTestRunner.class)
public class NotificationBackendTest {
+ @Mock
+ LocalBluetoothManager mBm;
+ @Mock
+ ICompanionDeviceManager mCdm;
+ @Mock
+ CachedBluetoothDeviceManager mCbm;
+ ComponentName mCn = new ComponentName("a", "b");
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ when(mBm.getCachedDeviceManager()).thenReturn(mCbm);
+ }
+
@Test
public void testMarkAppRow_unblockablePackage() {
AppRow appRow = new AppRow();
@@ -138,4 +164,69 @@ public class NotificationBackendTest {
parcel.setDataPosition(0);
return UsageEvents.CREATOR.createFromParcel(parcel);
}
+
+ @Test
+ public void getDeviceList_noAssociations() throws Exception {
+ when(mCdm.getAssociations(mCn.getPackageName(), 0)).thenReturn(null);
+
+ Collection cachedDevices = new ArrayList<>();
+ CachedBluetoothDevice cbd1 = mock(CachedBluetoothDevice.class);
+ when(cbd1.getAddress()).thenReturn("00:00:00:00:00:10");
+ when(cbd1.getName()).thenReturn("Device 1");
+ cachedDevices.add(cbd1);
+ when(mCbm.getCachedDevicesCopy()).thenReturn(cachedDevices);
+
+ BluetoothAdapter.getDefaultAdapter().enable();
+
+ assertThat(new NotificationBackend().getDeviceList(
+ mCdm, mBm, mCn.getPackageName(), 0).toString()).isEmpty();
+ }
+
+ @Test
+ public void getDeviceList_associationsButNoDevice() throws Exception {
+ List macs = ImmutableList.of("00:00:00:00:00:10", "00:00:00:00:00:20");
+ when(mCdm.getAssociations(mCn.getPackageName(), 0)).thenReturn(macs);
+
+ when(mCbm.getCachedDevicesCopy()).thenReturn(new ArrayList<>());
+
+ assertThat(new NotificationBackend().getDeviceList(
+ mCdm, mBm, mCn.getPackageName(), 0).toString()).isEmpty();
+ }
+
+ @Test
+ public void getDeviceList_singleDevice() throws Exception {
+ List macs = ImmutableList.of("00:00:00:00:00:10", "00:00:00:00:00:20");
+ when(mCdm.getAssociations(mCn.getPackageName(), 0)).thenReturn(macs);
+
+ Collection cachedDevices = new ArrayList<>();
+ CachedBluetoothDevice cbd1 = mock(CachedBluetoothDevice.class);
+ when(cbd1.getAddress()).thenReturn(macs.get(0));
+ when(cbd1.getName()).thenReturn("Device 1");
+ cachedDevices.add(cbd1);
+ when(mCbm.getCachedDevicesCopy()).thenReturn(cachedDevices);
+
+ assertThat(new NotificationBackend().getDeviceList(
+ mCdm, mBm, mCn.getPackageName(), 0).toString()).isEqualTo("Device 1");
+ }
+
+ @Test
+ public void getDeviceList_multipleDevices() throws Exception {
+ List macs = ImmutableList.of("00:00:00:00:00:10", "00:00:00:00:00:20");
+ when(mCdm.getAssociations(mCn.getPackageName(), 0)).thenReturn(macs);
+
+ Collection cachedDevices = new ArrayList<>();
+ CachedBluetoothDevice cbd1 = mock(CachedBluetoothDevice.class);
+ when(cbd1.getAddress()).thenReturn(macs.get(0));
+ when(cbd1.getName()).thenReturn("Device 1");
+ cachedDevices.add(cbd1);
+
+ CachedBluetoothDevice cbd2 = mock(CachedBluetoothDevice.class);
+ when(cbd2.getAddress()).thenReturn(macs.get(1));
+ when(cbd2.getName()).thenReturn("Device 2");
+ cachedDevices.add(cbd2);
+ when(mCbm.getCachedDevicesCopy()).thenReturn(cachedDevices);
+
+ assertThat(new NotificationBackend().getDeviceList(
+ mCdm, mBm, mCn.getPackageName(), 0).toString()).isEqualTo("Device 1, Device 2");
+ }
}
diff --git a/tests/unit/src/com/android/settings/network/AllowedNetworkTypesListenerTest.java b/tests/unit/src/com/android/settings/network/AllowedNetworkTypesListenerTest.java
index 3387368e64a..d8f3c783fe7 100644
--- a/tests/unit/src/com/android/settings/network/AllowedNetworkTypesListenerTest.java
+++ b/tests/unit/src/com/android/settings/network/AllowedNetworkTypesListenerTest.java
@@ -25,8 +25,8 @@ import static org.mockito.Mockito.when;
import android.content.Context;
import android.os.HandlerExecutor;
-import android.telephony.PhoneStateListener;
import android.telephony.RadioAccessFamily;
+import android.telephony.TelephonyCallback;
import android.telephony.TelephonyManager;
import android.test.mock.MockContentResolver;
@@ -53,7 +53,7 @@ public class AllowedNetworkTypesListenerTest {
private AllowedNetworkTypesListener mAllowedNetworkTypesListener;
@Mock
- private AllowedNetworkTypesListener.OnAllowedNetworkTypesChangedListener mListener;
+ private AllowedNetworkTypesListener.OnAllowedNetworkTypesListener mListener;
@Mock
private TelephonyManager mTelephonyManager;
@@ -87,15 +87,15 @@ public class AllowedNetworkTypesListenerTest {
public void register_shouldRegisterContentObserver() {
mAllowedNetworkTypesListener.register(mContext, SUB_ID);
- verify(mTelephonyManager, times(1)).registerPhoneStateListener(any(HandlerExecutor.class),
- any(PhoneStateListener.class));
+ verify(mTelephonyManager, times(1)).registerTelephonyCallback(any(HandlerExecutor.class),
+ any(TelephonyCallback.class));
}
@Test
public void unregister_shouldUnregisterContentObserver() {
mAllowedNetworkTypesListener.unregister(mContext, SUB_ID);
- verify(mTelephonyManager).unregisterPhoneStateListener(
+ verify(mTelephonyManager).unregisterTelephonyCallback(
mAllowedNetworkTypesListener);
}
}
diff --git a/tests/unit/src/com/android/settings/network/ProviderModelSliceTest.java b/tests/unit/src/com/android/settings/network/ProviderModelSliceTest.java
index 476d8547a71..705f60ec972 100644
--- a/tests/unit/src/com/android/settings/network/ProviderModelSliceTest.java
+++ b/tests/unit/src/com/android/settings/network/ProviderModelSliceTest.java
@@ -264,7 +264,7 @@ public class ProviderModelSliceTest {
@Test
@UiThreadTest
- public void getSlice_connectedEthernet_getOneEthernetAndOneCarrierAndTwoWiFi() {
+ public void getSlice_haveEthernetAndCarrierAndTwoDisconnectedWifi_getFourRow() {
mWifiList.clear();
mockWifiItemCondition(mMockWifiSliceItem1, "wifi1", "wifi1",
WifiEntry.CONNECTED_STATE_DISCONNECTED, "wifi1_key", true);
@@ -273,9 +273,29 @@ public class ProviderModelSliceTest {
WifiEntry.CONNECTED_STATE_DISCONNECTED, "wifi2_key", true);
mWifiList.add(mMockWifiSliceItem2);
mMockNetworkProviderWorker.updateSelfResults(mWifiList);
- when(mProviderModelSliceHelper.isAirplaneModeEnabled()).thenReturn(false);
- when(mProviderModelSliceHelper.hasCarrier()).thenReturn(true);
- when(mProviderModelSliceHelper.isDataSimActive()).thenReturn(true);
+ mockHelperCondition(false, true, true, null);
+ when(mMockNetworkProviderWorker.isEthernetConnected()).thenReturn(true);
+
+ final Slice slice = mMockProviderModelSlice.getSlice();
+
+ assertThat(slice).isNotNull();
+ assertThat(mMockProviderModelSlice.hasCreateEthernetRow()).isTrue();
+ verify(mListBuilder, times(1)).addRow(mMockCarrierRowBuild);
+ verify(mListBuilder, times(4)).addRow(any(ListBuilder.RowBuilder.class));
+ }
+
+ @Test
+ @UiThreadTest
+ public void getSlice_haveEthernetAndCarrierAndConnectedWifiAndDisconnectedWifi_getFourRow() {
+ mWifiList.clear();
+ mockWifiItemCondition(mMockWifiSliceItem1, "wifi1", "wifi1",
+ WifiEntry.CONNECTED_STATE_CONNECTED, "wifi1_key", true);
+ mWifiList.add(mMockWifiSliceItem1);
+ mockWifiItemCondition(mMockWifiSliceItem2, "wifi2", "wifi2",
+ WifiEntry.CONNECTED_STATE_DISCONNECTED, "wifi2_key", true);
+ mWifiList.add(mMockWifiSliceItem2);
+ mMockNetworkProviderWorker.updateSelfResults(mWifiList);
+ mockHelperCondition(false, true, true, mWifiList.get(0));
when(mMockNetworkProviderWorker.isEthernetConnected()).thenReturn(true);
final Slice slice = mMockProviderModelSlice.getSlice();
diff --git a/tests/unit/src/com/android/settings/network/SubscriptionsPreferenceControllerTest.java b/tests/unit/src/com/android/settings/network/SubscriptionsPreferenceControllerTest.java
index 6b31342d31e..699760741e8 100644
--- a/tests/unit/src/com/android/settings/network/SubscriptionsPreferenceControllerTest.java
+++ b/tests/unit/src/com/android/settings/network/SubscriptionsPreferenceControllerTest.java
@@ -97,6 +97,7 @@ public class SubscriptionsPreferenceControllerTest {
private LifecycleOwner mLifecycleOwner;
@Mock
private WifiPickerTrackerHelper mWifiPickerTrackerHelper;
+
private LifecycleRegistry mLifecycleRegistry;
private int mOnChildUpdatedCount;
private Context mContext;
@@ -428,7 +429,6 @@ public class SubscriptionsPreferenceControllerTest {
doReturn(mock(MobileMappings.Config.class)).when(sInjector).getConfig(mContext);
doReturn(networkType)
.when(sInjector).getNetworkType(any(), any(), any(), anyInt());
- when(mTelephonyManager.isDataEnabled()).thenReturn(true);
mController.onResume();
mController.displayPreference(mPreferenceScreen);
@@ -447,7 +447,7 @@ public class SubscriptionsPreferenceControllerTest {
final List sub = setupMockSubscriptions(2);
doReturn(true).when(sInjector).isProviderModelEnabled(mContext);
doReturn(sub.get(0)).when(mSubscriptionManager).getDefaultDataSubscriptionInfo();
- setupGetIconConditions(sub.get(0).getSubscriptionId(), false, true,
+ setupGetIconConditions(sub.get(0).getSubscriptionId(), false, false,
TelephonyManager.DATA_CONNECTED, ServiceState.STATE_IN_SERVICE);
doReturn(networkType)
.when(sInjector).getNetworkType(any(), any(), any(), anyInt());
@@ -534,7 +534,6 @@ public class SubscriptionsPreferenceControllerTest {
doReturn(mock(MobileMappings.Config.class)).when(sInjector).getConfig(mContext);
doReturn(networkType)
.when(sInjector).getNetworkType(any(), any(), any(), anyInt());
- when(mTelephonyManager.isDataEnabled()).thenReturn(true);
mController.onResume();
mController.displayPreference(mPreferenceScreen);
diff --git a/tests/unit/src/com/android/settings/network/telephony/NetworkProviderWorkerTest.java b/tests/unit/src/com/android/settings/network/telephony/NetworkProviderWorkerTest.java
index 2ce9a513daf..97f8e11f796 100644
--- a/tests/unit/src/com/android/settings/network/telephony/NetworkProviderWorkerTest.java
+++ b/tests/unit/src/com/android/settings/network/telephony/NetworkProviderWorkerTest.java
@@ -207,22 +207,22 @@ public class NetworkProviderWorkerTest {
@Test
@UiThreadTest
- public void onServiceStateChanged_notifyPhoneStateListener_callUpdateSlice() {
+ public void onServiceStateChanged_notifyTelephonyCallback_callUpdateSlice() {
mMockNetworkProviderWorker.onSlicePinned();
mMockNetworkProviderWorker.receiveNotification(false);
- mMockNetworkProviderWorker.mPhoneStateListener.onServiceStateChanged(new ServiceState());
+ mMockNetworkProviderWorker.mTelephonyCallback.onServiceStateChanged(new ServiceState());
assertThat(mMockNetworkProviderWorker.hasNotification()).isTrue();
}
@Test
@UiThreadTest
- public void onDisplayInfoChanged_notifyPhoneStateListener_callUpdateSlice() {
+ public void onDisplayInfoChanged_notifyTelephonyCallback_callUpdateSlice() {
mMockNetworkProviderWorker.onSlicePinned();
mMockNetworkProviderWorker.receiveNotification(false);
- mMockNetworkProviderWorker.mPhoneStateListener.onDisplayInfoChanged(
+ mMockNetworkProviderWorker.mTelephonyCallback.onDisplayInfoChanged(
new TelephonyDisplayInfo(14, 0));
assertThat(mMockNetworkProviderWorker.hasNotification()).isTrue();
@@ -230,11 +230,11 @@ public class NetworkProviderWorkerTest {
@Test
@UiThreadTest
- public void onDataConnectionStateChanged_notifyPhoneStateListener_callUpdateSlice() {
+ public void onDataConnectionStateChanged_notifyTelephonyCallback_callUpdateSlice() {
mMockNetworkProviderWorker.onSlicePinned();
mMockNetworkProviderWorker.receiveNotification(false);
- mMockNetworkProviderWorker.mPhoneStateListener.onDataConnectionStateChanged(
+ mMockNetworkProviderWorker.mTelephonyCallback.onDataConnectionStateChanged(
TelephonyManager.DATA_DISCONNECTED, TelephonyManager.NETWORK_TYPE_LTE);
assertThat(mMockNetworkProviderWorker.hasNotification()).isTrue();