diff --git a/AndroidManifest.xml b/AndroidManifest.xml index cb63df92a3f..311840336dc 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -2403,16 +2403,6 @@ android:excludeFromRecents="true"> - - - - - - - + diff --git a/res/layout-land/wifi_dpp_qrcode_scanner_fragment.xml b/res/layout-land/wifi_dpp_qrcode_scanner_fragment.xml index 51c8c96a008..cfe6cc039ed 100644 --- a/res/layout-land/wifi_dpp_qrcode_scanner_fragment.xml +++ b/res/layout-land/wifi_dpp_qrcode_scanner_fragment.xml @@ -45,7 +45,8 @@ + android:layout_height="@dimen/qrcode_preview_size" + android:clipChildren="true"> Screen lock - + Face added - - Tap to set up face authentication + + Tap to set up face unlock - Face authentication + Face unlock - How to set up Face unlock + How to set up face unlock - Set up Face unlock - + Set up face unlock + Use your face to authenticate @@ -910,7 +910,7 @@ Cancel Unlock with your face - + Use your face to authenticate Use your face to unlock your phone, authorize purchases, or sign in to apps. @@ -952,13 +952,13 @@ Use face unlock for Unlocking your phone - + App sign-in \u0026 payments Require for face unlock - + Open eyes looking at screen - + To unlock the phone, always require looking at the screen with your eyes open Confirm button @@ -969,7 +969,7 @@ Set up new face unlock - Use Face unlock to unlock your device, sign in to apps, and confirm payments.\n\nKeep in mind:\nLooking at the phone can unlock it when you don\u2019t intend to.\n\nYour phone can be unlocked by someone else if it\u2019s held up to your face while your eyes are open.\n\nYour phone can be unlocked by someone who looks a lot like you, say, an identical sibling. + Use face unlock to unlock your device, sign in to apps, and confirm payments.\n\nKeep in mind:\nLooking at the phone can unlock it when you don\u2019t intend to.\n\nYour phone can be unlocked by someone else if it\u2019s held up to your face while your eyes are open.\n\nYour phone can be unlocked by someone who looks a lot like you, say, an identical sibling. Delete face data? @@ -1074,12 +1074,12 @@ Protect your device with a screen lock option so no one will be able to use it if it is lost or stolen. You also need a screen lock option to set up fingerprint. Tap Cancel, then set a PIN, pattern, or password. Protect your phone with a screen lock option so no one will be able to use it if it is lost or stolen. You also need a screen lock option to set up fingerprint. Tap Cancel, then set a PIN, pattern, or password. - - Protect your tablet with a screen lock option so no one will be able to use it if it is lost or stolen. You also need a screen lock option to set up face authentication. Tap Cancel, then set a PIN, pattern, or password. - - Protect your device with a screen lock option so no one will be able to use it if it is lost or stolen. You also need a screen lock option to set up face authentication. Tap Cancel, then set a PIN, pattern, or password. - - Protect your phone with a screen lock option so no one will be able to use it if it is lost or stolen. You also need a screen lock option to set up face authentication. Tap Cancel, then set a PIN, pattern, or password. + + Protect your tablet with a screen lock option so no one will be able to use it if it is lost or stolen. You also need a screen lock option to set up face unlock. Tap Cancel, then set a PIN, pattern, or password. + + Protect your device with a screen lock option so no one will be able to use it if it is lost or stolen. You also need a screen lock option to set up face unlock. Tap Cancel, then set a PIN, pattern, or password. + + Protect your phone with a screen lock option so no one will be able to use it if it is lost or stolen. You also need a screen lock option to set up face unlock. Tap Cancel, then set a PIN, pattern, or password. Skip PIN setup? @@ -1323,7 +1323,7 @@ Choose your backup screen lock method - + Choose your backup screen lock method @@ -1401,19 +1401,19 @@ You can unlock your phone using your fingerprint. For security, this option requires a backup screen lock. - - Face authentication + Pattern + + Face unlock + Pattern - - Face authentication + PIN + + Face unlock + PIN - - Face authentication + Password + + Face unlock + Password - - Continue without face authentication + + Continue without face unlock - + You can unlock your phone using your face. For security, this option requires a backup screen lock. @@ -4049,12 +4049,12 @@ PIN has been set Pattern has been set - - To use face authentication, set password - - To use face authentication, set pattern - - To use face authentication, set PIN + + To use face unlock, set password + + To use face unlock, set pattern + + To use face unlock, set PIN @@ -10545,6 +10545,9 @@ + + + diff --git a/src/com/android/settings/SmsDefaultDialog.java b/src/com/android/settings/SmsDefaultDialog.java deleted file mode 100644 index e8568976782..00000000000 --- a/src/com/android/settings/SmsDefaultDialog.java +++ /dev/null @@ -1,289 +0,0 @@ -/* - * Copyright (C) 2013 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; - -import static android.view.WindowManager.LayoutParams.SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS; - -import android.content.ComponentName; -import android.content.Context; -import android.content.DialogInterface; -import android.content.Intent; -import android.content.pm.ApplicationInfo; -import android.content.pm.PackageManager; -import android.graphics.drawable.Drawable; -import android.os.Bundle; -import android.provider.Telephony.Sms.Intents; -import android.telephony.TelephonyManager; -import android.text.TextUtils; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.view.Window; -import android.view.WindowManager; -import android.widget.BaseAdapter; -import android.widget.ImageView; -import android.widget.TextView; - -import com.android.internal.app.AlertActivity; -import com.android.internal.app.AlertController; -import com.android.internal.telephony.SmsApplication; -import com.android.internal.telephony.SmsApplication.SmsApplicationData; - -import java.util.ArrayList; -import java.util.List; - -public final class SmsDefaultDialog extends AlertActivity implements - DialogInterface.OnClickListener { - private SmsApplicationData mNewSmsApplicationData; - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - Intent intent = getIntent(); - String packageName = intent.getStringExtra(Intents.EXTRA_PACKAGE_NAME); - - setResult(RESULT_CANCELED); - if (!buildDialog(packageName)) { - finish(); - } - } - - @Override - protected void onStart() { - super.onStart(); - getWindow().addSystemFlags(SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS); - android.util.EventLog.writeEvent(0x534e4554, "120484087", -1, ""); - } - - @Override - protected void onStop() { - super.onStop(); - final Window window = getWindow(); - final WindowManager.LayoutParams attrs = window.getAttributes(); - attrs.privateFlags &= ~SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS; - window.setAttributes(attrs); - } - - @Override - public void onClick(DialogInterface dialog, int which) { - switch (which) { - case BUTTON_POSITIVE: - SmsApplication.setDefaultApplication(mNewSmsApplicationData.mPackageName, this); - setResult(RESULT_OK); - break; - case BUTTON_NEGATIVE: - break; - default: - if (which >= 0) { - AppListAdapter adapter = (AppListAdapter) mAlertParams.mAdapter; - if (!adapter.isSelected(which)) { - String packageName = adapter.getPackageName(which); - if (!TextUtils.isEmpty(packageName)) { - SmsApplication.setDefaultApplication(packageName, this); - setResult(RESULT_OK); - } - } - } - break; - } - } - - private boolean buildDialog(String packageName) { - TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); - if (!tm.isSmsCapable()) { - // No phone, no SMS - return false; - } - final AlertController.AlertParams p = mAlertParams; - p.mTitle = getString(R.string.sms_change_default_dialog_title); - mNewSmsApplicationData = SmsApplication.getSmsApplicationData(packageName, this); - if (mNewSmsApplicationData != null) { - // New default SMS app specified, change to that directly after the confirmation - // dialog. - SmsApplicationData oldSmsApplicationData = null; - ComponentName oldSmsComponent = SmsApplication.getDefaultSmsApplication(this, true); - if (oldSmsComponent != null) { - oldSmsApplicationData = SmsApplication.getSmsApplicationData( - oldSmsComponent.getPackageName(), this); - if (oldSmsApplicationData.mPackageName.equals( - mNewSmsApplicationData.mPackageName)) { - return false; - } - } - - // Compose dialog; get - if (oldSmsApplicationData != null) { - p.mMessage = getString(R.string.sms_change_default_dialog_text, - mNewSmsApplicationData.getApplicationName(this), - oldSmsApplicationData.getApplicationName(this)); - } else { - p.mMessage = getString(R.string.sms_change_default_no_previous_dialog_text, - mNewSmsApplicationData.getApplicationName(this)); - } - p.mPositiveButtonText = getString(R.string.yes); - p.mNegativeButtonText = getString(R.string.no); - p.mPositiveButtonListener = this; - p.mNegativeButtonListener = this; - } else { - // No new default SMS app specified, show a list of all SMS apps and let user to pick - p.mAdapter = new AppListAdapter(); - p.mOnClickListener = this; - p.mNegativeButtonText = getString(R.string.cancel); - p.mNegativeButtonListener = this; - if (p.mAdapter.isEmpty()) { - // If there is nothing to choose from, don't build the dialog. - return false; - } - } - setupAlert(); - - return true; - } - - /** - * The list of SMS apps with label, icon. Current default SMS app is marked as "default". - */ - private class AppListAdapter extends BaseAdapter { - /** - * SMS app item in the list - */ - private class Item { - final String label; // app label - final Drawable icon; // app icon - final String packgeName; // full app package name - - public Item(String label, Drawable icon, String packageName) { - this.label = label; - this.icon = icon; - this.packgeName = packageName; - } - } - - // The list - private final List mItems; - // The index of selected - private final int mSelectedIndex; - - public AppListAdapter() { - mItems = getItems(); - int selected = getSelectedIndex(); - // Move selected up to the top so it is easy to find - if (selected > 0) { - Item item = mItems.remove(selected); - mItems.add(0, item); - selected = 0; - } - mSelectedIndex = selected; - } - - @Override - public int getCount() { - return mItems != null ? mItems.size() : 0; - } - - @Override - public Object getItem(int position) { - return mItems != null && position < mItems.size() ? mItems.get(position) : null; - } - - @Override - public long getItemId(int position) { - return position; - } - - @Override - public View getView(int position, View convertView, ViewGroup parent) { - Item item = ((Item) getItem(position)); - LayoutInflater inflater = getLayoutInflater(); - View view = inflater.inflate(R.layout.app_preference_item, parent, false); - TextView textView = (TextView) view.findViewById(android.R.id.title); - textView.setText(item.label); - if (position == mSelectedIndex) { - view.findViewById(R.id.default_label).setVisibility(View.VISIBLE); - } else { - view.findViewById(R.id.default_label).setVisibility(View.GONE); - } - ImageView imageView = (ImageView) view.findViewById(android.R.id.icon); - imageView.setImageDrawable(item.icon); - return view; - } - - /** - * Get the selected package name by - * - * @param position the index of the item in the list - * @return the package name of selected item - */ - public String getPackageName(int position) { - Item item = (Item) getItem(position); - if (item != null) { - return item.packgeName; - } - return null; - } - - /** - * Check if an item at a position is already selected - * - * @param position the index of the item in the list - * @return true if the item at the position is already selected, false otherwise - */ - public boolean isSelected(int position) { - return position == mSelectedIndex; - } - - // Get the list items by looking for SMS apps - private List getItems() { - PackageManager pm = getPackageManager(); - List items = new ArrayList<>(); - for (SmsApplication.SmsApplicationData app : - SmsApplication.getApplicationCollection(SmsDefaultDialog.this)) { - try { - String packageName = app.mPackageName; - ApplicationInfo appInfo = pm.getApplicationInfo(packageName, 0/*flags*/); - if (appInfo != null) { - items.add(new Item( - appInfo.loadLabel(pm).toString(), - appInfo.loadIcon(pm), - packageName)); - } - } catch (PackageManager.NameNotFoundException e) { - // Ignore package can't be found - } - } - return items; - } - - // Get the selected item index by looking for the current default SMS app - private int getSelectedIndex() { - ComponentName appName = SmsApplication.getDefaultSmsApplication( - SmsDefaultDialog.this, true); - if (appName != null) { - String defaultSmsAppPackageName = appName.getPackageName(); - if (!TextUtils.isEmpty(defaultSmsAppPackageName)) { - for (int i = 0; i < mItems.size(); i++) { - if (TextUtils.equals(mItems.get(i).packgeName, defaultSmsAppPackageName)) { - return i; - } - } - } - } - return -1; - } - } -} diff --git a/src/com/android/settings/development/OverlayCategoryPreferenceController.java b/src/com/android/settings/development/OverlayCategoryPreferenceController.java index 7a2ee08020f..6e0b2d00f6b 100644 --- a/src/com/android/settings/development/OverlayCategoryPreferenceController.java +++ b/src/com/android/settings/development/OverlayCategoryPreferenceController.java @@ -198,8 +198,8 @@ public class OverlayCategoryPreferenceController extends DeveloperOptionsPrefere @Override protected void onDeveloperOptionsSwitchDisabled() { super.onDeveloperOptionsSwitchDisabled(); - // STOPSHIP b/122308197: reset the overlays to the set in - // Settings.Secure.THEME_CUSTOMIZATION_OVERLAY_PACKAGES + // TODO b/133222035: remove these developer settings when the + // Settings.Secure.THEME_CUSTOMIZATION_OVERLAY_PACKAGES setting is used setOverlay(PACKAGE_DEVICE_DEFAULT); updateState(mPreference); } diff --git a/src/com/android/settings/deviceinfo/simstatus/SimStatusDialogController.java b/src/com/android/settings/deviceinfo/simstatus/SimStatusDialogController.java index c18ec787b91..3fafd14f625 100644 --- a/src/com/android/settings/deviceinfo/simstatus/SimStatusDialogController.java +++ b/src/com/android/settings/deviceinfo/simstatus/SimStatusDialogController.java @@ -297,6 +297,9 @@ public class SimStatusDialogController implements LifecycleObserver, OnResume, O } private void updateSignalStrength(SignalStrength signalStrength) { + if (signalStrength == null) { + return; + } final int subscriptionId = mSubscriptionInfo.getSubscriptionId(); final PersistableBundle carrierConfig = mCarrierConfigManager.getConfigForSubId(subscriptionId); @@ -430,13 +433,11 @@ public class SimStatusDialogController implements LifecycleObserver, OnResume, O mSubscriptionInfo.getSubscriptionId()); } - @VisibleForTesting - int getDbm(SignalStrength signalStrength) { + private int getDbm(SignalStrength signalStrength) { return signalStrength.getDbm(); } - @VisibleForTesting - int getAsuLevel(SignalStrength signalStrength) { + private int getAsuLevel(SignalStrength signalStrength) { return signalStrength.getAsuLevel(); } diff --git a/src/com/android/settings/network/telephony/NetworkOperatorPreference.java b/src/com/android/settings/network/telephony/NetworkOperatorPreference.java index a334aeb72fb..2359399478e 100644 --- a/src/com/android/settings/network/telephony/NetworkOperatorPreference.java +++ b/src/com/android/settings/network/telephony/NetworkOperatorPreference.java @@ -30,6 +30,7 @@ import android.view.Gravity; import androidx.preference.Preference; import com.android.settings.R; +import com.android.settings.Utils; import com.android.settingslib.graph.SignalDrawable; import java.util.List; @@ -144,6 +145,7 @@ public class NetworkOperatorPreference extends Preference { // Set the signal strength icon at the bottom right icons.setLayerGravity(1 /* index of SignalDrawable */, Gravity.BOTTOM | Gravity.RIGHT); icons.setLayerSize(1 /* index of SignalDrawable */, iconSize, iconSize); + icons.setTintList(Utils.getColorAttr(context, android.R.attr.colorControlNormal)); setIcon(icons); } } diff --git a/src/com/android/settings/notification/NotificationPreferenceController.java b/src/com/android/settings/notification/NotificationPreferenceController.java index d09ea4dc3dc..2ae7019ea3c 100644 --- a/src/com/android/settings/notification/NotificationPreferenceController.java +++ b/src/com/android/settings/notification/NotificationPreferenceController.java @@ -74,7 +74,9 @@ public abstract class NotificationPreferenceController extends AbstractPreferenc return false; } if (mChannelGroup != null) { - return !mChannelGroup.isBlocked(); + if (mChannelGroup.isBlocked()) { + return false; + } } if (mChannel != null) { return mChannel.getImportance() != IMPORTANCE_NONE; diff --git a/src/com/android/settings/password/ChooseLockGeneric.java b/src/com/android/settings/password/ChooseLockGeneric.java index 7eb8dc23818..2a7de057193 100644 --- a/src/com/android/settings/password/ChooseLockGeneric.java +++ b/src/com/android/settings/password/ChooseLockGeneric.java @@ -25,6 +25,7 @@ import static android.app.admin.DevicePolicyManager.PASSWORD_COMPLEXITY_NONE; import static com.android.settings.password.ChooseLockPassword.ChooseLockPasswordFragment.RESULT_FINISHED; import static com.android.settings.password.ChooseLockSettingsHelper.EXTRA_KEY_CALLER_APP_NAME; +import static com.android.settings.password.ChooseLockSettingsHelper.EXTRA_KEY_IS_CALLING_APP_ADMIN; import static com.android.settings.password.ChooseLockSettingsHelper.EXTRA_KEY_REQUESTED_MIN_COMPLEXITY; import android.accessibilityservice.AccessibilityServiceInfo; @@ -169,6 +170,12 @@ public class ChooseLockGeneric extends SettingsActivity { /** From intent extra {@link ChooseLockSettingsHelper#EXTRA_KEY_CALLER_APP_NAME}. */ private String mCallerAppName = null; + /** + * The value from the intent extra {@link + * ChooseLockSettingsHelper#EXTRA_KEY_IS_CALLING_APP_ADMIN}. + */ + private boolean mIsCallingAppAdmin; + protected boolean mForFingerprint = false; protected boolean mForFace = false; @@ -217,6 +224,8 @@ public class ChooseLockGeneric extends SettingsActivity { .getIntExtra(EXTRA_KEY_REQUESTED_MIN_COMPLEXITY, PASSWORD_COMPLEXITY_NONE); mCallerAppName = getActivity().getIntent().getStringExtra(EXTRA_KEY_CALLER_APP_NAME); + mIsCallingAppAdmin = getActivity().getIntent() + .getBooleanExtra(EXTRA_KEY_IS_CALLING_APP_ADMIN, /* defValue= */ false); mForChangeCredRequiredForBoot = getArguments() != null && getArguments().getBoolean( ChooseLockSettingsHelper.EXTRA_KEY_FOR_CHANGE_CRED_REQUIRED_FOR_BOOT); mUserManager = UserManager.get(getActivity()); @@ -490,7 +499,7 @@ public class ChooseLockGeneric extends SettingsActivity { protected void addPreferences() { addPreferencesFromResource(R.xml.security_settings_picker); - if (!TextUtils.isEmpty(mCallerAppName)) { + if (!TextUtils.isEmpty(mCallerAppName) && !mIsCallingAppAdmin) { FooterPreferenceMixinCompat footerMixin = new FooterPreferenceMixinCompat(this, getSettingsLifecycle()); FooterPreference footer = footerMixin.createFooterPreference(); diff --git a/src/com/android/settings/password/ChooseLockSettingsHelper.java b/src/com/android/settings/password/ChooseLockSettingsHelper.java index db125986c95..28ded2d8bf9 100644 --- a/src/com/android/settings/password/ChooseLockSettingsHelper.java +++ b/src/com/android/settings/password/ChooseLockSettingsHelper.java @@ -60,6 +60,12 @@ public final class ChooseLockSettingsHelper { */ public static final String EXTRA_KEY_CALLER_APP_NAME = "caller_app_name"; + /** + * Intent extra indicating that the calling app is an admin, such as a Device Adimn, Device + * Owner, or Profile Owner. + */ + public static final String EXTRA_KEY_IS_CALLING_APP_ADMIN = "is_calling_app_admin"; + /** * When invoked via {@link ConfirmLockPassword.InternalActivity}, this flag * controls if we relax the enforcement of diff --git a/src/com/android/settings/password/SetNewPasswordActivity.java b/src/com/android/settings/password/SetNewPasswordActivity.java index 4722c56c537..055e5bedf8d 100644 --- a/src/com/android/settings/password/SetNewPasswordActivity.java +++ b/src/com/android/settings/password/SetNewPasswordActivity.java @@ -23,6 +23,7 @@ import static android.app.admin.DevicePolicyManager.EXTRA_PASSWORD_COMPLEXITY; import static android.app.admin.DevicePolicyManager.PASSWORD_COMPLEXITY_NONE; import static com.android.settings.password.ChooseLockSettingsHelper.EXTRA_KEY_CALLER_APP_NAME; +import static com.android.settings.password.ChooseLockSettingsHelper.EXTRA_KEY_IS_CALLING_APP_ADMIN; import static com.android.settings.password.ChooseLockSettingsHelper.EXTRA_KEY_REQUESTED_MIN_COMPLEXITY; import android.app.Activity; @@ -30,6 +31,8 @@ import android.app.admin.DevicePolicyManager; import android.app.admin.DevicePolicyManager.PasswordComplexity; import android.app.admin.PasswordMetrics; import android.app.settings.SettingsEnums; +import android.content.ComponentName; +import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.os.IBinder; @@ -39,6 +42,8 @@ import com.android.settings.Utils; import com.android.settings.overlay.FeatureFactory; import com.android.settingslib.core.instrumentation.MetricsFeatureProvider; +import java.util.List; + /** * Trampolines {@link DevicePolicyManager#ACTION_SET_NEW_PASSWORD} and * {@link DevicePolicyManager#ACTION_SET_NEW_PARENT_PROFILE_PASSWORD} intent to the appropriate UI @@ -116,10 +121,28 @@ public class SetNewPasswordActivity extends Activity implements SetNewPasswordCo if (mRequestedMinComplexity != PASSWORD_COMPLEXITY_NONE) { intent.putExtra(EXTRA_KEY_REQUESTED_MIN_COMPLEXITY, mRequestedMinComplexity); } + if (isCallingAppAdmin()) { + intent.putExtra(EXTRA_KEY_IS_CALLING_APP_ADMIN, true); + } startActivity(intent); finish(); } + private boolean isCallingAppAdmin() { + DevicePolicyManager devicePolicyManager = getSystemService(DevicePolicyManager.class); + String callingAppPackageName = PasswordUtils.getCallingAppPackageName(getActivityToken()); + List admins = devicePolicyManager.getActiveAdmins(); + if (admins == null) { + return false; + } + for (ComponentName componentName : admins) { + if (componentName.getPackageName().equals(callingAppPackageName)) { + return true; + } + } + return false; + } + private void logSetNewPasswordIntent() { final String callingAppPackageName = PasswordUtils.getCallingAppPackageName(getActivityToken()); diff --git a/src/com/android/settings/widget/SeekBarPreference.java b/src/com/android/settings/widget/SeekBarPreference.java index 44def119ea2..bdd1ba94474 100644 --- a/src/com/android/settings/widget/SeekBarPreference.java +++ b/src/com/android/settings/widget/SeekBarPreference.java @@ -69,6 +69,13 @@ public class SeekBarPreference extends RestrictedPreference com.android.internal.R.layout.preference_widget_seekbar); a.recycle(); + a = context.obtainStyledAttributes( + attrs, com.android.internal.R.styleable.Preference, defStyleAttr, defStyleRes); + final boolean isSelectable = a.getBoolean( + com.android.settings.R.styleable.Preference_android_selectable, false); + setSelectable(isSelectable); + a.recycle(); + setLayoutResource(layoutResId); } @@ -93,7 +100,11 @@ public class SeekBarPreference extends RestrictedPreference @Override public boolean isSelectable() { - return isDisabledByAdmin(); + if(isDisabledByAdmin()) { + return true; + } else { + return super.isSelectable(); + } } @Override diff --git a/tests/robotests/res/xml-mcc998/seekbar_preference.xml b/tests/robotests/res/xml-mcc998/seekbar_preference.xml new file mode 100644 index 00000000000..e474c1e06bb --- /dev/null +++ b/tests/robotests/res/xml-mcc998/seekbar_preference.xml @@ -0,0 +1,23 @@ + + + + + + diff --git a/tests/robotests/res/xml-mcc999/seekbar_preference.xml b/tests/robotests/res/xml-mcc999/seekbar_preference.xml new file mode 100644 index 00000000000..77435e8d198 --- /dev/null +++ b/tests/robotests/res/xml-mcc999/seekbar_preference.xml @@ -0,0 +1,24 @@ + + + + + + diff --git a/tests/robotests/src/com/android/settings/deviceinfo/simstatus/SimStatusDialogControllerTest.java b/tests/robotests/src/com/android/settings/deviceinfo/simstatus/SimStatusDialogControllerTest.java index 76c444e2c1a..0f39fc9a520 100644 --- a/tests/robotests/src/com/android/settings/deviceinfo/simstatus/SimStatusDialogControllerTest.java +++ b/tests/robotests/src/com/android/settings/deviceinfo/simstatus/SimStatusDialogControllerTest.java @@ -121,8 +121,8 @@ public class SimStatusDialogControllerTest { mLifecycle = new Lifecycle(mLifecycleOwner); mController = spy(new SimStatusDialogController(mDialog, mLifecycle, 0 /* phone id */)); doReturn(mServiceState).when(mController).getCurrentServiceState(); - doReturn(0).when(mController).getDbm(any()); - doReturn(0).when(mController).getAsuLevel(any()); + doReturn(0).when(mSignalStrength).getDbm(); + doReturn(0).when(mSignalStrength).getAsuLevel(); doReturn(mPhoneStateListener).when(mController).getPhoneStateListener(); doReturn("").when(mController).getPhoneNumber(); doReturn(mSignalStrength).when(mController).getSignalStrength(); @@ -136,6 +136,9 @@ public class SimStatusDialogControllerTest { ReflectionHelpers.setField(mController, "mEuiccManager", mEuiccManager); ReflectionHelpers.setField(mController, "mSubscriptionManager", mSubscriptionManager); when(mCarrierConfigManager.getConfigForSubId(anyInt())).thenReturn(mPersistableBundle); + when(mPersistableBundle.getBoolean( + CarrierConfigManager.KEY_SHOW_SIGNAL_STRENGTH_IN_SIM_STATUS_BOOL)) + .thenReturn(true); final ShadowPackageManager shadowPackageManager = Shadows.shadowOf(RuntimeEnvironment.application.getPackageManager()); @@ -228,8 +231,8 @@ public class SimStatusDialogControllerTest { public void initialize_updateSignalStrengthWith50_shouldUpdateSignalStrengthTo50() { final int signalDbm = 50; final int signalAsu = 50; - doReturn(signalDbm).when(mController).getDbm(mSignalStrength); - doReturn(signalAsu).when(mController).getAsuLevel(mSignalStrength); + doReturn(signalDbm).when(mSignalStrength).getDbm(); + doReturn(signalAsu).when(mSignalStrength).getAsuLevel(); when(mPersistableBundle.getBoolean( CarrierConfigManager.KEY_SHOW_SIGNAL_STRENGTH_IN_SIM_STATUS_BOOL)).thenReturn(true); @@ -249,8 +252,8 @@ public class SimStatusDialogControllerTest { final int signalDbm = 50; final int signalAsu = 50; - doReturn(signalDbm).when(mController).getDbm(mSignalStrength); - doReturn(signalAsu).when(mController).getAsuLevel(mSignalStrength); + doReturn(signalDbm).when(mSignalStrength).getDbm(); + doReturn(signalAsu).when(mSignalStrength).getAsuLevel(); when(mPersistableBundle.getBoolean( CarrierConfigManager.KEY_SHOW_SIGNAL_STRENGTH_IN_SIM_STATUS_BOOL)).thenReturn(true); @@ -415,4 +418,11 @@ public class SimStatusDialogControllerTest { verify(mDialog).removeSettingFromScreen(IMS_REGISTRATION_STATE_LABEL_ID); verify(mDialog).removeSettingFromScreen(IMS_REGISTRATION_STATE_VALUE_ID); } + + @Test + public void initialize_nullSignalStrength_noCrash() { + doReturn(null).when(mController).getSignalStrength(); + // we should not crash when running the following line + mController.initialize(); + } } diff --git a/tests/robotests/src/com/android/settings/notification/NotificationPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/NotificationPreferenceControllerTest.java index cde5b900cf1..b024cee3632 100644 --- a/tests/robotests/src/com/android/settings/notification/NotificationPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/notification/NotificationPreferenceControllerTest.java @@ -105,10 +105,12 @@ public class NotificationPreferenceControllerTest { @Test public void isAvailable_notIfChannelBlocked() { NotificationBackend.AppRow appRow = new NotificationBackend.AppRow(); + NotificationChannelGroup group = mock(NotificationChannelGroup.class); + when(group.isBlocked()).thenReturn(false); NotificationChannel channel = mock(NotificationChannel.class); when(channel.getImportance()).thenReturn(IMPORTANCE_NONE); - mController.onResume(appRow, channel, null, null); + mController.onResume(appRow, channel, group, null); assertFalse(mController.isAvailable()); } diff --git a/tests/robotests/src/com/android/settings/password/ChooseLockGenericTest.java b/tests/robotests/src/com/android/settings/password/ChooseLockGenericTest.java index c692f55390d..673c33415cf 100644 --- a/tests/robotests/src/com/android/settings/password/ChooseLockGenericTest.java +++ b/tests/robotests/src/com/android/settings/password/ChooseLockGenericTest.java @@ -23,6 +23,7 @@ import static android.app.admin.DevicePolicyManager.PASSWORD_COMPLEXITY_MEDIUM; import static android.app.admin.DevicePolicyManager.PASSWORD_COMPLEXITY_NONE; import static com.android.settings.password.ChooseLockSettingsHelper.EXTRA_KEY_CALLER_APP_NAME; +import static com.android.settings.password.ChooseLockSettingsHelper.EXTRA_KEY_IS_CALLING_APP_ADMIN; import static com.android.settings.password.ChooseLockSettingsHelper.EXTRA_KEY_REQUESTED_MIN_COMPLEXITY; import static com.google.common.truth.Truth.assertThat; @@ -182,12 +183,22 @@ public class ChooseLockGenericTest { CharSequence expectedTitle = mActivity.getString(R.string.unlock_footer_none_complexity_requested, "app name"); - mFragment.updatePreferencesOrFinish(false /* isRecreatingActivity */); + mFragment.updatePreferencesOrFinish(/* isRecreatingActivity= */ false); FooterPreference footer = mFragment.findPreference(FooterPreference.KEY_FOOTER); assertThat(footer.getTitle()).isEqualTo(expectedTitle); } + @Test + public void updatePreferencesOrFinish_callingAppIsAdmin_noFooter() { + initActivity(new Intent().putExtra(EXTRA_KEY_IS_CALLING_APP_ADMIN, true)); + + mFragment.updatePreferencesOrFinish(/* isRecreatingActivity= */ false); + + FooterPreference footer = mFragment.findPreference(FooterPreference.KEY_FOOTER); + assertThat(footer).isNull(); + } + @Test public void onActivityResult_requestcode0_shouldNotFinish() { initActivity(null); diff --git a/tests/robotests/src/com/android/settings/password/SetNewPasswordActivityTest.java b/tests/robotests/src/com/android/settings/password/SetNewPasswordActivityTest.java index bed09cb5d37..04a2157aeee 100644 --- a/tests/robotests/src/com/android/settings/password/SetNewPasswordActivityTest.java +++ b/tests/robotests/src/com/android/settings/password/SetNewPasswordActivityTest.java @@ -24,6 +24,7 @@ import static android.app.admin.DevicePolicyManager.PASSWORD_COMPLEXITY_HIGH; import static android.app.admin.DevicePolicyManager.PASSWORD_COMPLEXITY_NONE; import static com.android.settings.password.ChooseLockSettingsHelper.EXTRA_KEY_CALLER_APP_NAME; +import static com.android.settings.password.ChooseLockSettingsHelper.EXTRA_KEY_IS_CALLING_APP_ADMIN; import static com.android.settings.password.ChooseLockSettingsHelper.EXTRA_KEY_REQUESTED_MIN_COMPLEXITY; import static com.google.common.truth.Truth.assertThat; @@ -32,8 +33,10 @@ import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import android.app.admin.DevicePolicyManager; import android.app.settings.SettingsEnums; import android.content.ComponentName; +import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.provider.Settings; @@ -54,6 +57,8 @@ import org.robolectric.RuntimeEnvironment; import org.robolectric.Shadows; import org.robolectric.annotation.Config; import org.robolectric.shadows.ShadowActivity; +import org.robolectric.shadows.ShadowDevicePolicyManager; +import org.robolectric.shadows.ShadowLog; @RunWith(RobolectricTestRunner.class) public class SetNewPasswordActivityTest { @@ -91,7 +96,7 @@ public class SetNewPasswordActivityTest { Robolectric.buildActivity(SetNewPasswordActivity.class).get(); activity.launchChooseLock(new Bundle()); ShadowActivity shadowActivity = Shadows.shadowOf(activity); - Intent intent = shadowActivity.getNextStartedActivityForResult().intent; + Intent intent = getLaunchChooseLockIntent(shadowActivity); assertThat(intent.getComponent()) .isEqualTo(new ComponentName(activity, ChooseLockGeneric.class)); @@ -105,7 +110,7 @@ public class SetNewPasswordActivityTest { Robolectric.buildActivity(SetNewPasswordActivity.class).get(); activity.launchChooseLock(new Bundle()); ShadowActivity shadowActivity = Shadows.shadowOf(activity); - Intent intent = shadowActivity.getNextStartedActivityForResult().intent; + Intent intent = getLaunchChooseLockIntent(shadowActivity); assertThat(intent.getComponent()) .isEqualTo(new ComponentName(activity, SetupChooseLockGeneric.class)); @@ -149,7 +154,7 @@ public class SetNewPasswordActivityTest { Robolectric.buildActivity(SetNewPasswordActivity.class, intent).create().get(); ShadowActivity shadowActivity = Shadows.shadowOf(activity); - Intent actualIntent = shadowActivity.getNextStartedActivityForResult().intent; + Intent actualIntent = getLaunchChooseLockIntent(shadowActivity); assertThat(actualIntent.getAction()).isEqualTo(ACTION_SET_NEW_PASSWORD); assertThat(actualIntent.hasExtra(EXTRA_KEY_REQUESTED_MIN_COMPLEXITY)).isTrue(); assertThat(actualIntent.getIntExtra(EXTRA_KEY_REQUESTED_MIN_COMPLEXITY, PASSWORD_COMPLEXITY_NONE)) @@ -179,7 +184,7 @@ public class SetNewPasswordActivityTest { Robolectric.buildActivity(SetNewPasswordActivity.class, intent).create().get(); ShadowActivity shadowActivity = Shadows.shadowOf(activity); - Intent actualIntent = shadowActivity.getNextStartedActivityForResult().intent; + Intent actualIntent = getLaunchChooseLockIntent(shadowActivity); assertThat(actualIntent.getAction()).isEqualTo(ACTION_SET_NEW_PASSWORD); assertThat(actualIntent.hasExtra(EXTRA_KEY_REQUESTED_MIN_COMPLEXITY)).isFalse(); assertThat(actualIntent.hasExtra(EXTRA_KEY_CALLER_APP_NAME)).isTrue(); @@ -207,7 +212,7 @@ public class SetNewPasswordActivityTest { Robolectric.buildActivity(SetNewPasswordActivity.class, intent).create().get(); ShadowActivity shadowActivity = Shadows.shadowOf(activity); - Intent actualIntent = shadowActivity.getNextStartedActivityForResult().intent; + Intent actualIntent = getLaunchChooseLockIntent(shadowActivity); assertThat(actualIntent.getAction()).isEqualTo(ACTION_SET_NEW_PASSWORD); assertThat(actualIntent.hasExtra(EXTRA_KEY_REQUESTED_MIN_COMPLEXITY)).isFalse(); assertThat(actualIntent.hasExtra(EXTRA_KEY_CALLER_APP_NAME)).isTrue(); @@ -234,7 +239,7 @@ public class SetNewPasswordActivityTest { Robolectric.buildActivity(SetNewPasswordActivity.class, intent).create().get(); ShadowActivity shadowActivity = Shadows.shadowOf(activity); - Intent actualIntent = shadowActivity.getNextStartedActivityForResult().intent; + Intent actualIntent = getLaunchChooseLockIntent(shadowActivity); assertThat(actualIntent.getAction()).isEqualTo(ACTION_SET_NEW_PASSWORD); assertThat(actualIntent.hasExtra(EXTRA_KEY_REQUESTED_MIN_COMPLEXITY)).isFalse(); assertThat(actualIntent.hasExtra(EXTRA_KEY_CALLER_APP_NAME)).isTrue(); @@ -262,7 +267,7 @@ public class SetNewPasswordActivityTest { Robolectric.buildActivity(SetNewPasswordActivity.class, intent).create().get(); ShadowActivity shadowActivity = Shadows.shadowOf(activity); - Intent actualIntent = shadowActivity.getNextStartedActivityForResult().intent; + Intent actualIntent = getLaunchChooseLockIntent(shadowActivity); assertThat(actualIntent.getAction()).isEqualTo(ACTION_SET_NEW_PARENT_PROFILE_PASSWORD); assertThat(actualIntent.hasExtra(EXTRA_KEY_REQUESTED_MIN_COMPLEXITY)).isFalse(); assertThat(actualIntent.hasExtra(EXTRA_KEY_CALLER_APP_NAME)).isTrue(); @@ -289,7 +294,7 @@ public class SetNewPasswordActivityTest { Robolectric.buildActivity(SetNewPasswordActivity.class, intent).create().get(); ShadowActivity shadowActivity = Shadows.shadowOf(activity); - Intent actualIntent = shadowActivity.getNextStartedActivityForResult().intent; + Intent actualIntent = getLaunchChooseLockIntent(shadowActivity); assertThat(actualIntent.getAction()).isEqualTo(ACTION_SET_NEW_PARENT_PROFILE_PASSWORD); assertThat(actualIntent.hasExtra(EXTRA_KEY_REQUESTED_MIN_COMPLEXITY)).isFalse(); assertThat(actualIntent.hasExtra(EXTRA_KEY_CALLER_APP_NAME)).isTrue(); @@ -301,4 +306,45 @@ public class SetNewPasswordActivityTest { PKG_NAME, Integer.MIN_VALUE); } + + @Test + @Config(shadows = {ShadowPasswordUtils.class}) + public void launchChooseLock_callingAppIsAdmin_setsAdminExtra() { + SetNewPasswordActivity activity = + Robolectric.buildActivity(SetNewPasswordActivity.class).get(); + DevicePolicyManager devicePolicyManager = + (DevicePolicyManager) activity.getSystemService(Context.DEVICE_POLICY_SERVICE); + Shadows.shadowOf(devicePolicyManager).setActiveAdmin(buildTestComponentName(PKG_NAME)); + ShadowPasswordUtils.setCallingAppPackageName(PKG_NAME); + + activity.launchChooseLock(new Bundle()); + + Intent intent = getLaunchChooseLockIntent(Shadows.shadowOf(activity)); + assertThat(intent.hasExtra(EXTRA_KEY_IS_CALLING_APP_ADMIN)).isTrue(); + } + + @Test + @Config(shadows = {ShadowPasswordUtils.class}) + public void launchChooseLock_callingAppIsNotAdmin_doesNotSetAdminExtra() { + SetNewPasswordActivity activity = + Robolectric.buildActivity(SetNewPasswordActivity.class).get(); + DevicePolicyManager devicePolicyManager = + (DevicePolicyManager) activity.getSystemService(Context.DEVICE_POLICY_SERVICE); + Shadows.shadowOf(devicePolicyManager) + .setActiveAdmin(buildTestComponentName("other_pkg_name")); + ShadowPasswordUtils.setCallingAppPackageName(PKG_NAME); + + activity.launchChooseLock(new Bundle()); + + Intent intent = getLaunchChooseLockIntent(Shadows.shadowOf(activity)); + assertThat(intent.hasExtra(EXTRA_KEY_IS_CALLING_APP_ADMIN)).isFalse(); + } + + private ComponentName buildTestComponentName(String packageName) { + return new ComponentName(packageName, "clazz"); + } + + private Intent getLaunchChooseLockIntent(ShadowActivity shadowActivity) { + return shadowActivity.getNextStartedActivityForResult().intent; + } } diff --git a/tests/robotests/src/com/android/settings/widget/SeekBarPreferenceTest.java b/tests/robotests/src/com/android/settings/widget/SeekBarPreferenceTest.java index 0a1d5d80de5..f7dea225236 100644 --- a/tests/robotests/src/com/android/settings/widget/SeekBarPreferenceTest.java +++ b/tests/robotests/src/com/android/settings/widget/SeekBarPreferenceTest.java @@ -22,16 +22,24 @@ import static org.mockito.Mockito.spy; import static org.mockito.Mockito.when; import android.content.Context; +import android.os.Bundle; import android.os.Parcelable; +import androidx.preference.PreferenceFragmentCompat; + +import com.android.settings.testutils.shadow.ShadowRestrictedLockUtilsInternal; + import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.MockitoAnnotations; import org.robolectric.RobolectricTestRunner; import org.robolectric.RuntimeEnvironment; +import org.robolectric.annotation.Config; +import org.robolectric.shadows.androidx.fragment.FragmentController; @RunWith(RobolectricTestRunner.class) +@Config(shadows = ShadowRestrictedLockUtilsInternal.class) public class SeekBarPreferenceTest { private static final int MAX = 75; @@ -73,9 +81,39 @@ public class SeekBarPreferenceTest { } @Test - public void isSelectable_notDisabledByAdmin_returnFalse() { - when(mSeekBarPreference.isDisabledByAdmin()).thenReturn(false); + @Config(qualifiers = "mcc998") + public void isSelectable_default_returnFalse() { + final PreferenceFragmentCompat fragment = FragmentController.of(new TestFragment(), + new Bundle()) + .create() + .start() + .resume() + .get(); - assertThat(mSeekBarPreference.isSelectable()).isFalse(); + final SeekBarPreference seekBarPreference = fragment.findPreference("seek_bar"); + + assertThat(seekBarPreference.isSelectable()).isFalse(); + } + + @Test + @Config(qualifiers = "mcc999") + public void isSelectable_selectableInXml_returnTrue() { + final PreferenceFragmentCompat fragment = FragmentController.of(new TestFragment(), + new Bundle()) + .create() + .start() + .resume() + .get(); + + final SeekBarPreference seekBarPreference = fragment.findPreference("seek_bar"); + + assertThat(seekBarPreference.isSelectable()).isTrue(); + } + + public static class TestFragment extends PreferenceFragmentCompat { + @Override + public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { + addPreferencesFromResource(com.android.settings.R.xml.seekbar_preference); + } } }