Merge "Fix failing test"
diff --git a/proguard.flags b/proguard.flags
index d509dba..b66a786 100644
--- a/proguard.flags
+++ b/proguard.flags
@@ -9,7 +9,7 @@
-keep public class com.android.settings.** extends androidx.fragment.app.Fragment
# Keep all preference controllers needed by slice and DashboardFragment.
--keep class !com.google.android.settings.aware.*, * extends com.android.settings.core.BasePreferenceController {
+-keep class * extends com.android.settings.core.BasePreferenceController {
*;
}
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 08c46d5..c891432 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -4431,7 +4431,7 @@
<!-- Title of Languages & input settings screen -->
<string name="language_keyboard_settings_title">Languages & input</string>
<!-- Title of preference category that lists all settings about helping user text input such as spell checker [CHAR LIMIT=60]-->
- <string name="input_assistance">Input assistance</string>
+ <string name="input_assistance">Tools</string>
<!-- On Languages & input settings screen, heading. Inside the "Languages & input settings" screen, this is the header for settings that relate to keyboard (enable/disable each keyboard, settings for each keyboard). -->
<string name="keyboard_settings_category">Keyboard & input methods</string>
<!-- On Text & language settings screen, setting option name. title of the setting to take the user to a screen to select the locale. -->
@@ -4468,7 +4468,7 @@
<!-- Image button description for spell checker language. -->
<string name="spellchecker_language">Language</string>
<!-- Title for the 'keyboard and input methods' preference category. [CHAR LIMIT=45] -->
- <string name="keyboard_and_input_methods_category">Keyboard & inputs</string>
+ <string name="keyboard_and_input_methods_category">Keyboards</string>
<!-- Title for the 'virtual keyboard' preference sub-screen. [CHAR LIMIT=35] -->
<string name="virtual_keyboard_category">Virtual keyboard</string>
<!-- Title for the 'available virtual keyboard' preference sub-screen. [CHAR LIMIT=35] -->
diff --git a/src/com/android/settings/datausage/AppDataUsage.java b/src/com/android/settings/datausage/AppDataUsage.java
index 4f38843..998234b 100644
--- a/src/com/android/settings/datausage/AppDataUsage.java
+++ b/src/com/android/settings/datausage/AppDataUsage.java
@@ -26,6 +26,7 @@
import android.net.NetworkTemplate;
import android.os.Bundle;
import android.os.UserHandle;
+import android.telephony.SubscriptionManager;
import android.util.ArraySet;
import android.util.IconDrawableFactory;
import android.util.Log;
@@ -88,7 +89,8 @@
private CycleAdapter mCycleAdapter;
private List<NetworkCycleDataForUid> mUsageData;
- private NetworkTemplate mTemplate;
+ @VisibleForTesting
+ NetworkTemplate mTemplate;
private AppItem mAppItem;
private Intent mAppSettingsIntent;
private SpinnerPreference mCycle;
@@ -108,7 +110,7 @@
: null;
if (mTemplate == null) {
mTemplate = DataUsageUtils.getDefaultTemplate(mContext,
- DataUsageUtils.getDefaultSubscriptionId(mContext));
+ SubscriptionManager.getDefaultDataSubscriptionId());
}
if (mAppItem == null) {
int uid = (args != null) ? args.getInt(AppInfoBase.ARG_PACKAGE_UID, -1)
diff --git a/src/com/android/settings/display/NightDisplayPreference.java b/src/com/android/settings/display/NightDisplayPreference.java
index 82e2596..7020c49 100644
--- a/src/com/android/settings/display/NightDisplayPreference.java
+++ b/src/com/android/settings/display/NightDisplayPreference.java
@@ -16,26 +16,25 @@
import android.content.Context;
import android.hardware.display.ColorDisplayManager;
+import android.hardware.display.NightDisplayListener;
import android.util.AttributeSet;
import androidx.preference.SwitchPreference;
-import com.android.internal.app.ColorDisplayController;
-
import java.time.LocalTime;
public class NightDisplayPreference extends SwitchPreference
- implements ColorDisplayController.Callback {
+ implements NightDisplayListener.Callback {
private ColorDisplayManager mColorDisplayManager;
- private ColorDisplayController mController;
+ private NightDisplayListener mNightDisplayListener;
private NightDisplayTimeFormatter mTimeFormatter;
public NightDisplayPreference(Context context, AttributeSet attrs) {
super(context, attrs);
mColorDisplayManager = context.getSystemService(ColorDisplayManager.class);
- mController = new ColorDisplayController(context);
+ mNightDisplayListener = new NightDisplayListener(context);
mTimeFormatter = new NightDisplayTimeFormatter(context);
}
@@ -44,7 +43,7 @@
super.onAttached();
// Listen for changes only while attached.
- mController.setListener(this);
+ mNightDisplayListener.setCallback(this);
// Update the summary since the state may have changed while not attached.
updateSummary();
@@ -55,7 +54,7 @@
super.onDetached();
// Stop listening for state changes.
- mController.setListener(null);
+ mNightDisplayListener.setCallback(null);
}
@Override
diff --git a/src/com/android/settings/display/NightDisplaySettings.java b/src/com/android/settings/display/NightDisplaySettings.java
index 4896b53..6441d71 100644
--- a/src/com/android/settings/display/NightDisplaySettings.java
+++ b/src/com/android/settings/display/NightDisplaySettings.java
@@ -21,12 +21,12 @@
import android.app.settings.SettingsEnums;
import android.content.Context;
import android.hardware.display.ColorDisplayManager;
+import android.hardware.display.NightDisplayListener;
import android.os.Bundle;
import android.provider.SearchIndexableResource;
import androidx.preference.Preference;
-import com.android.internal.app.ColorDisplayController;
import com.android.settings.R;
import com.android.settings.dashboard.DashboardFragment;
import com.android.settings.search.BaseSearchIndexProvider;
@@ -43,7 +43,7 @@
*/
@SearchIndexable(forTarget = SearchIndexable.ALL & ~SearchIndexable.ARC)
public class NightDisplaySettings extends DashboardFragment
- implements ColorDisplayController.Callback {
+ implements NightDisplayListener.Callback {
private static final String TAG = "NightDisplaySettings";
@@ -51,7 +51,7 @@
private static final int DIALOG_END_TIME = 1;
private ColorDisplayManager mColorDisplayManager;
- private ColorDisplayController mController;
+ private NightDisplayListener mNightDisplayListener;
@Override
public void onCreate(Bundle savedInstanceState) {
@@ -59,7 +59,7 @@
final Context context = getContext();
mColorDisplayManager = context.getSystemService(ColorDisplayManager.class);
- mController = new ColorDisplayController(context);
+ mNightDisplayListener = new NightDisplayListener(context);
}
@Override
@@ -67,7 +67,7 @@
super.onStart();
// Listen for changes only while visible.
- mController.setListener(this);
+ mNightDisplayListener.setCallback(this);
}
@Override
@@ -75,7 +75,7 @@
super.onStop();
// Stop listening for state changes.
- mController.setListener(null);
+ mNightDisplayListener.setCallback(null);
}
@Override
diff --git a/src/com/android/settings/homepage/contextualcards/conditional/NightDisplayConditionController.java b/src/com/android/settings/homepage/contextualcards/conditional/NightDisplayConditionController.java
index a673e46..347d4eb 100644
--- a/src/com/android/settings/homepage/contextualcards/conditional/NightDisplayConditionController.java
+++ b/src/com/android/settings/homepage/contextualcards/conditional/NightDisplayConditionController.java
@@ -19,7 +19,8 @@
import android.app.settings.SettingsEnums;
import android.content.Context;
-import com.android.internal.app.ColorDisplayController;
+import android.hardware.display.ColorDisplayManager;
+import android.hardware.display.NightDisplayListener;
import com.android.settings.R;
import com.android.settings.core.SubSettingLauncher;
import com.android.settings.display.NightDisplaySettings;
@@ -28,17 +29,20 @@
import java.util.Objects;
public class NightDisplayConditionController implements ConditionalCardController,
- ColorDisplayController.Callback {
+ NightDisplayListener.Callback {
+
static final int ID = Objects.hash("NightDisplayConditionController");
private final Context mAppContext;
private final ConditionManager mConditionManager;
- private final ColorDisplayController mController;
+ private final ColorDisplayManager mColorDisplayManager;
+ private final NightDisplayListener mNightDisplayListener;
public NightDisplayConditionController(Context appContext, ConditionManager manager) {
- mController = new ColorDisplayController(appContext);
mAppContext = appContext;
mConditionManager = manager;
+ mColorDisplayManager = appContext.getSystemService(ColorDisplayManager.class);
+ mNightDisplayListener = new NightDisplayListener(appContext);
}
@Override
@@ -48,7 +52,7 @@
@Override
public boolean isDisplayable() {
- return mController.isActivated();
+ return mColorDisplayManager.isNightDisplayActivated();
}
@Override
@@ -62,7 +66,7 @@
@Override
public void onActionClick() {
- mController.setActivated(false);
+ mColorDisplayManager.setNightDisplayActivated(false);
}
@Override
@@ -84,12 +88,12 @@
@Override
public void startMonitoringStateChange() {
- mController.setListener(this);
+ mNightDisplayListener.setCallback(this);
}
@Override
public void stopMonitoringStateChange() {
- mController.setListener(null);
+ mNightDisplayListener.setCallback(null);
}
@Override
diff --git a/src/com/android/settings/network/telephony/MobileDataPreferenceController.java b/src/com/android/settings/network/telephony/MobileDataPreferenceController.java
index 9ebeda0..47822b6 100644
--- a/src/com/android/settings/network/telephony/MobileDataPreferenceController.java
+++ b/src/com/android/settings/network/telephony/MobileDataPreferenceController.java
@@ -118,7 +118,8 @@
@Override
public boolean isChecked() {
- return mTelephonyManager.isDataEnabled();
+ return mTelephonyManager.isDataEnabled()
+ && mSubId == SubscriptionManager.getDefaultDataSubscriptionId();
}
public void init(FragmentManager fragmentManager, int subId) {
@@ -129,7 +130,7 @@
@VisibleForTesting
boolean isDialogNeeded() {
- final boolean enableData = !mTelephonyManager.isDataEnabled();
+ final boolean enableData = !isChecked();
final boolean isMultiSim = (mTelephonyManager.getSimCount() > 1);
final int defaultSubId = mSubscriptionManager.getDefaultDataSubscriptionId();
final boolean needToDisableOthers = mSubscriptionManager
diff --git a/src/com/android/settings/password/PasswordUtils.java b/src/com/android/settings/password/PasswordUtils.java
index 2300b98..1ead492 100644
--- a/src/com/android/settings/password/PasswordUtils.java
+++ b/src/com/android/settings/password/PasswordUtils.java
@@ -68,7 +68,7 @@
* Returns the package name which the activity with {@code activityToken} is launched from.
*/
@Nullable
- private static String getCallingAppPackageName(IBinder activityToken) {
+ public static String getCallingAppPackageName(IBinder activityToken) {
String pkg = null;
try {
pkg = ActivityManager.getService().getLaunchedFromPackage(activityToken);
diff --git a/src/com/android/settings/password/SetNewPasswordActivity.java b/src/com/android/settings/password/SetNewPasswordActivity.java
index 8ea8514..8e8e7bc 100644
--- a/src/com/android/settings/password/SetNewPasswordActivity.java
+++ b/src/com/android/settings/password/SetNewPasswordActivity.java
@@ -29,12 +29,15 @@
import android.app.admin.DevicePolicyManager;
import android.app.admin.DevicePolicyManager.PasswordComplexity;
import android.app.admin.PasswordMetrics;
+import android.app.settings.SettingsEnums;
import android.content.Intent;
import android.os.Bundle;
import android.os.IBinder;
import android.util.Log;
import com.android.settings.Utils;
+import com.android.settings.overlay.FeatureFactory;
+import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
/**
* Trampolines {@link DevicePolicyManager#ACTION_SET_NEW_PASSWORD} and
@@ -73,19 +76,23 @@
return;
}
- IBinder activityToken = getActivityToken();
+ logSetNewPasswordIntent();
+
+ final IBinder activityToken = getActivityToken();
mCallerAppName = (String) PasswordUtils.getCallingAppLabel(this, activityToken);
if (ACTION_SET_NEW_PASSWORD.equals(mNewPasswordAction)
&& getIntent().hasExtra(EXTRA_PASSWORD_COMPLEXITY)) {
- boolean hasPermission = PasswordUtils.isCallingAppPermitted(
+ final boolean hasPermission = PasswordUtils.isCallingAppPermitted(
this, activityToken, GET_AND_REQUEST_SCREEN_LOCK_COMPLEXITY);
if (hasPermission) {
- mRequestedMinComplexity = PasswordMetrics.sanitizeComplexityLevel(getIntent()
- .getIntExtra(EXTRA_PASSWORD_COMPLEXITY, PASSWORD_COMPLEXITY_NONE));
+ mRequestedMinComplexity =
+ PasswordMetrics.sanitizeComplexityLevel(getIntent()
+ .getIntExtra(EXTRA_PASSWORD_COMPLEXITY, PASSWORD_COMPLEXITY_NONE));
} else {
PasswordUtils.crashCallingApplication(activityToken,
- "Must have permission " + GET_AND_REQUEST_SCREEN_LOCK_COMPLEXITY
- + " to use extra " + EXTRA_PASSWORD_COMPLEXITY);
+ "Must have permission "
+ + GET_AND_REQUEST_SCREEN_LOCK_COMPLEXITY + " to use extra "
+ + EXTRA_PASSWORD_COMPLEXITY);
finish();
return;
}
@@ -112,4 +119,29 @@
startActivity(intent);
finish();
}
+
+ private void logSetNewPasswordIntent() {
+ final String callingAppPackageName =
+ PasswordUtils.getCallingAppPackageName(getActivityToken());
+
+ // use int min value to denote absence of EXTRA_PASSWORD_COMPLEXITY
+ final int extraPasswordComplexity = getIntent().hasExtra(EXTRA_PASSWORD_COMPLEXITY)
+ ? getIntent().getIntExtra(EXTRA_PASSWORD_COMPLEXITY, PASSWORD_COMPLEXITY_NONE)
+ : Integer.MIN_VALUE;
+
+ // this activity is launched by either ACTION_SET_NEW_PASSWORD or
+ // ACTION_SET_NEW_PARENT_PROFILE_PASSWORD
+ final int action = ACTION_SET_NEW_PASSWORD.equals(mNewPasswordAction)
+ ? SettingsEnums.ACTION_SET_NEW_PASSWORD
+ : SettingsEnums.ACTION_SET_NEW_PARENT_PROFILE_PASSWORD;
+
+ final MetricsFeatureProvider metricsProvider =
+ FeatureFactory.getFactory(this).getMetricsFeatureProvider();
+ metricsProvider.action(
+ metricsProvider.getAttribution(this),
+ action,
+ SettingsEnums.SET_NEW_PASSWORD_ACTIVITY,
+ callingAppPackageName,
+ extraPasswordComplexity);
+ }
}
diff --git a/tests/robotests/src/com/android/settings/datausage/AppDataUsageTest.java b/tests/robotests/src/com/android/settings/datausage/AppDataUsageTest.java
index 12559f4..2855554 100644
--- a/tests/robotests/src/com/android/settings/datausage/AppDataUsageTest.java
+++ b/tests/robotests/src/com/android/settings/datausage/AppDataUsageTest.java
@@ -35,15 +35,19 @@
import android.net.NetworkPolicyManager;
import android.net.NetworkTemplate;
import android.os.Bundle;
+import android.telephony.SubscriptionManager;
import android.text.format.DateUtils;
import android.util.ArraySet;
import android.view.View;
+import androidx.fragment.app.FragmentActivity;
import androidx.preference.Preference;
import androidx.preference.PreferenceManager;
import androidx.preference.PreferenceScreen;
+import com.android.settings.applications.AppInfoBase;
import com.android.settings.testutils.FakeFeatureFactory;
+import com.android.settings.testutils.shadow.ShadowDataUsageUtils;
import com.android.settings.testutils.shadow.ShadowEntityHeaderController;
import com.android.settings.testutils.shadow.ShadowRestrictedLockUtilsInternal;
import com.android.settings.widget.EntityHeaderController;
@@ -60,9 +64,11 @@
import org.mockito.Answers;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
+import org.robolectric.Robolectric;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Config;
+import org.robolectric.shadows.ShadowSubscriptionManager;
import org.robolectric.util.ReflectionHelpers;
import java.util.ArrayList;
@@ -82,7 +88,6 @@
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
- FakeFeatureFactory.setupForTest();
}
@After
@@ -277,4 +282,26 @@
assertThat(uids.get(1)).isEqualTo(456);
assertThat(uids.get(2)).isEqualTo(789);
}
+
+ @Config(shadows = {ShadowDataUsageUtils.class, ShadowSubscriptionManager.class})
+ public void onCreate_noNetworkTemplateAndInvalidDataSubscription_shouldUseWifiTemplate() {
+ ShadowDataUsageUtils.IS_MOBILE_DATA_SUPPORTED = true;
+ ShadowDataUsageUtils.IS_WIFI_SUPPORTED = true;
+ ShadowDataUsageUtils.HAS_SIM = false;
+ ShadowSubscriptionManager.setDefaultDataSubscriptionId(
+ SubscriptionManager.INVALID_SUBSCRIPTION_ID);
+ mFragment = spy(new AppDataUsage());
+ doReturn(Robolectric.setupActivity(FragmentActivity.class)).when(mFragment).getActivity();
+ doReturn(RuntimeEnvironment.application).when(mFragment).getContext();
+ ReflectionHelpers.setField(mFragment, "mDashboardFeatureProvider",
+ FakeFeatureFactory.setupForTest().dashboardFeatureProvider);
+ final Bundle args = new Bundle();
+ args.putInt(AppInfoBase.ARG_PACKAGE_UID, 123123);
+ mFragment.setArguments(args);
+
+ mFragment.onCreate(Bundle.EMPTY);
+
+ assertThat(mFragment.mTemplate.getMatchRule())
+ .isEqualTo(NetworkTemplate.MATCH_WIFI_WILDCARD);
+ }
}
diff --git a/tests/robotests/src/com/android/settings/network/telephony/MobileDataPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/network/telephony/MobileDataPreferenceControllerTest.java
index e0bfce4..4c242c1 100644
--- a/tests/robotests/src/com/android/settings/network/telephony/MobileDataPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/network/telephony/MobileDataPreferenceControllerTest.java
@@ -20,7 +20,6 @@
import static com.google.common.truth.Truth.assertThat;
-import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy;
@@ -31,10 +30,6 @@
import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager;
-import androidx.fragment.app.FragmentManager;
-import androidx.fragment.app.FragmentTransaction;
-import androidx.preference.SwitchPreference;
-
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -42,10 +37,18 @@
import org.mockito.MockitoAnnotations;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+import org.robolectric.shadows.ShadowSubscriptionManager;
+
+import androidx.fragment.app.FragmentManager;
+import androidx.fragment.app.FragmentTransaction;
+import androidx.preference.SwitchPreference;
@RunWith(RobolectricTestRunner.class)
+@Config(shadows = ShadowSubscriptionManager.class)
public class MobileDataPreferenceControllerTest {
private static final int SUB_ID = 2;
+ private static final int SUB_ID_OTHER = 3;
@Mock
private FragmentManager mFragmentManager;
@@ -78,6 +81,7 @@
mPreference = new SwitchPreference(mContext);
mController = new MobileDataPreferenceController(mContext, "mobile_data");
+ ShadowSubscriptionManager.setDefaultDataSubscriptionId(SUB_ID);
mController.init(mFragmentManager, SUB_ID);
mPreference.setKey(mController.getPreferenceKey());
}
@@ -104,7 +108,8 @@
public void isDialogNeeded_enableNonDefaultSimInMultiSimMode_returnTrue() {
doReturn(false).when(mTelephonyManager).isDataEnabled();
doReturn(mSubscriptionInfo).when(mSubscriptionManager).getActiveSubscriptionInfo(SUB_ID);
- doReturn(true).when(mSubscriptionManager).isActiveSubscriptionId(anyInt());
+ doReturn(true).when(mSubscriptionManager).isActiveSubscriptionId(SUB_ID_OTHER);
+ ShadowSubscriptionManager.setDefaultDataSubscriptionId(SUB_ID_OTHER);
doReturn(2).when(mTelephonyManager).getSimCount();
assertThat(mController.isDialogNeeded()).isTrue();
diff --git a/tests/robotests/src/com/android/settings/notification/VibrateWhenRingPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/VibrateWhenRingPreferenceControllerTest.java
index 3f53ce9..a1b65c5 100644
--- a/tests/robotests/src/com/android/settings/notification/VibrateWhenRingPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/notification/VibrateWhenRingPreferenceControllerTest.java
@@ -81,7 +81,7 @@
@Test
public void display_shouldDisplay() {
when(mTelephonyManager.isVoiceCapable()).thenReturn(true);
- DeviceConfig.setProperty("namespace", "key", "false", false);
+ DeviceConfig.setProperty("telephony", "ramping_ringer_enabled", "false", false);
mController.displayPreference(mScreen);
assertThat(mPreference.isVisible()).isTrue();
}
@@ -89,7 +89,7 @@
@Test
public void display_shouldNotDisplay_notVoiceCapable() {
when(mTelephonyManager.isVoiceCapable()).thenReturn(false);
- DeviceConfig.setProperty("namespace", "key", "false", false);
+ DeviceConfig.setProperty("telephony", "ramping_ringer_enabled", "false", false);
mController.displayPreference(mScreen);
assertThat(mPreference.isVisible()).isFalse();
}
@@ -97,7 +97,7 @@
@Test
public void display_shouldNotDisplay_RampingRingerEnabled() {
when(mTelephonyManager.isVoiceCapable()).thenReturn(true);
- DeviceConfig.setProperty("namespace", "key", "true", false);
+ DeviceConfig.setProperty("telephony", "ramping_ringer_enabled", "true", false);
mController.displayPreference(mScreen);
assertThat(mPreference.isVisible()).isFalse();
}
@@ -105,7 +105,7 @@
@Test
public void display_shouldNotDisplay_VoiceEnabled_RampingRingerEnabled() {
when(mTelephonyManager.isVoiceCapable()).thenReturn(true);
- DeviceConfig.setProperty("namespace", "key", "true", false);
+ DeviceConfig.setProperty("telephony", "ramping_ringer_enabled", "true", false);
mController.displayPreference(mScreen);
assertThat(mPreference.isVisible()).isFalse();
}
@@ -113,7 +113,7 @@
@Test
public void display_shouldNotDisplay_VoiceDisabled_RampingRingerEnabled() {
when(mTelephonyManager.isVoiceCapable()).thenReturn(false);
- DeviceConfig.setProperty("namespace", "key", "true", false);
+ DeviceConfig.setProperty("telephony", "ramping_ringer_enabled", "true", false);
mController.displayPreference(mScreen);
assertThat(mPreference.isVisible()).isFalse();
}
@@ -139,14 +139,14 @@
@Test
public void voiceCapable_availabled() {
when(mTelephonyManager.isVoiceCapable()).thenReturn(true);
- DeviceConfig.setProperty("namespace", "key", "false", false);
+ DeviceConfig.setProperty("telephony", "ramping_ringer_enabled", "false", false);
assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
}
@Test
public void voiceCapable_notAvailabled() {
when(mTelephonyManager.isVoiceCapable()).thenReturn(false);
- DeviceConfig.setProperty("namespace", "key", "false", false);
+ DeviceConfig.setProperty("telephony", "ramping_ringer_enabled", "false", false);
assertThat(mController.getAvailabilityStatus()).isEqualTo(UNSUPPORTED_ON_DEVICE);
}
diff --git a/tests/robotests/src/com/android/settings/password/PasswordUtilsTest.java b/tests/robotests/src/com/android/settings/password/PasswordUtilsTest.java
index 845d346..dc473b2 100644
--- a/tests/robotests/src/com/android/settings/password/PasswordUtilsTest.java
+++ b/tests/robotests/src/com/android/settings/password/PasswordUtilsTest.java
@@ -20,6 +20,7 @@
import static android.content.pm.PackageManager.PERMISSION_GRANTED;
import static com.android.settings.password.PasswordUtils.getCallingAppLabel;
+import static com.android.settings.password.PasswordUtils.getCallingAppPackageName;
import static com.android.settings.password.PasswordUtils.isCallingAppPermitted;
import static com.google.common.truth.Truth.assertThat;
@@ -77,7 +78,7 @@
}
@Test
- public void getCallingAppLabel_activityServiceThrowsRemoteException_returnsNull()
+ public void getCallingAppLabel_getCallingAppPackageNameReturnsNull_returnsNull()
throws Exception {
when(mActivityService.getLaunchedFromPackage(mActivityToken))
.thenThrow(new RemoteException());
@@ -86,7 +87,7 @@
}
@Test
- public void getCallingAppLabel_activityServiceReturnsSettingsApp_returnsNull()
+ public void getCallingAppLabel_getCallingAppPackageNameReturnsSettingsApp_returnsNull()
throws Exception {
when(mActivityService.getLaunchedFromPackage(mActivityToken))
.thenReturn("com.android.settings");
@@ -116,6 +117,23 @@
}
@Test
+ public void getCallingAppPackageName_activityServiceThrowsRemoteException_returnsNull()
+ throws Exception {
+ when(mActivityService.getLaunchedFromPackage(mActivityToken))
+ .thenThrow(new RemoteException());
+
+ assertThat(getCallingAppPackageName(mActivityToken)).isNull();
+ }
+
+ @Test
+ public void getCallingAppPackageName_returnsPackageName() throws Exception {
+ when(mActivityService.getLaunchedFromPackage(mActivityToken))
+ .thenReturn(PACKAGE_NAME);
+
+ assertThat(getCallingAppPackageName(mActivityToken)).isEqualTo(PACKAGE_NAME);
+ }
+
+ @Test
public void isCallingAppPermitted_permissionGranted_returnsTrue() throws Exception {
when(mActivityService.getLaunchedFromUid(mActivityToken)).thenReturn(UID);
when(mContext.checkPermission(PERMISSION, -1, UID)).thenReturn(PERMISSION_GRANTED);
diff --git a/tests/robotests/src/com/android/settings/password/SetNewPasswordActivityTest.java b/tests/robotests/src/com/android/settings/password/SetNewPasswordActivityTest.java
index d1b2b74..4232016 100644
--- a/tests/robotests/src/com/android/settings/password/SetNewPasswordActivityTest.java
+++ b/tests/robotests/src/com/android/settings/password/SetNewPasswordActivityTest.java
@@ -28,17 +28,26 @@
import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.app.settings.SettingsEnums;
import android.content.ComponentName;
import android.content.Intent;
import android.os.Bundle;
import android.provider.Settings;
+import com.android.settings.testutils.FakeFeatureFactory;
import com.android.settings.testutils.shadow.ShadowPasswordUtils;
+import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
import org.robolectric.Robolectric;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment;
@@ -50,11 +59,19 @@
public class SetNewPasswordActivityTest {
private static final String APP_LABEL = "label";
+ private static final String PKG_NAME = "packageName";
+ @Mock
+ private MetricsFeatureProvider mockMetricsProvider;
private int mProvisioned;
@Before
public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ FakeFeatureFactory fakeFeatureFactory = FakeFeatureFactory.setupForTest();
+ mockMetricsProvider = fakeFeatureFactory.getMetricsFeatureProvider();
+ when(mockMetricsProvider.getAttribution(any())).thenReturn(SettingsEnums.PAGE_UNKNOWN);
+
mProvisioned = Settings.Global.getInt(RuntimeEnvironment.application.getContentResolver(),
Settings.Global.DEVICE_PROVISIONED, 0);
}
@@ -98,6 +115,7 @@
@Config(shadows = {ShadowPasswordUtils.class})
public void testLaunchChooseLock_setNewPasswordExtraWithoutPermission() {
ShadowPasswordUtils.setCallingAppLabel(APP_LABEL);
+ ShadowPasswordUtils.setCallingAppPackageName(PKG_NAME);
Settings.Global.putInt(RuntimeEnvironment.application.getContentResolver(),
Settings.Global.DEVICE_PROVISIONED, 1);
@@ -108,12 +126,19 @@
ShadowActivity shadowActivity = Shadows.shadowOf(activity);
assertThat(shadowActivity.getNextStartedActivityForResult()).isNull();
+ verify(mockMetricsProvider).action(
+ SettingsEnums.PAGE_UNKNOWN,
+ SettingsEnums.ACTION_SET_NEW_PASSWORD,
+ SettingsEnums.SET_NEW_PASSWORD_ACTIVITY,
+ PKG_NAME,
+ PASSWORD_COMPLEXITY_HIGH);
}
@Test
@Config(shadows = {ShadowPasswordUtils.class})
public void testLaunchChooseLock_setNewPasswordExtraWithPermission() {
ShadowPasswordUtils.setCallingAppLabel(APP_LABEL);
+ ShadowPasswordUtils.setCallingAppPackageName(PKG_NAME);
ShadowPasswordUtils.addGrantedPermission(GET_AND_REQUEST_SCREEN_LOCK_COMPLEXITY);
Settings.Global.putInt(RuntimeEnvironment.application.getContentResolver(),
Settings.Global.DEVICE_PROVISIONED, 1);
@@ -131,12 +156,19 @@
.isEqualTo(PASSWORD_COMPLEXITY_HIGH);
assertThat(actualIntent.hasExtra(EXTRA_KEY_CALLER_APP_NAME)).isTrue();
assertThat(actualIntent.getStringExtra(EXTRA_KEY_CALLER_APP_NAME)).isEqualTo(APP_LABEL);
+ verify(mockMetricsProvider).action(
+ SettingsEnums.PAGE_UNKNOWN,
+ SettingsEnums.ACTION_SET_NEW_PASSWORD,
+ SettingsEnums.SET_NEW_PASSWORD_ACTIVITY,
+ PKG_NAME,
+ PASSWORD_COMPLEXITY_HIGH);
}
@Test
@Config(shadows = {ShadowPasswordUtils.class})
public void testLaunchChooseLock_setNewPasswordExtraInvalidValue() {
ShadowPasswordUtils.setCallingAppLabel(APP_LABEL);
+ ShadowPasswordUtils.setCallingAppPackageName(PKG_NAME);
ShadowPasswordUtils.addGrantedPermission(GET_AND_REQUEST_SCREEN_LOCK_COMPLEXITY);
Settings.Global.putInt(RuntimeEnvironment.application.getContentResolver(),
Settings.Global.DEVICE_PROVISIONED, 1);
@@ -152,12 +184,19 @@
assertThat(actualIntent.hasExtra(EXTRA_KEY_REQUESTED_MIN_COMPLEXITY)).isFalse();
assertThat(actualIntent.hasExtra(EXTRA_KEY_CALLER_APP_NAME)).isTrue();
assertThat(actualIntent.getStringExtra(EXTRA_KEY_CALLER_APP_NAME)).isEqualTo(APP_LABEL);
+ verify(mockMetricsProvider).action(
+ SettingsEnums.PAGE_UNKNOWN,
+ SettingsEnums.ACTION_SET_NEW_PASSWORD,
+ SettingsEnums.SET_NEW_PASSWORD_ACTIVITY,
+ PKG_NAME,
+ -1);
}
@Test
@Config(shadows = {ShadowPasswordUtils.class})
public void testLaunchChooseLock_setNewPasswordExtraNoneComplexity() {
ShadowPasswordUtils.setCallingAppLabel(APP_LABEL);
+ ShadowPasswordUtils.setCallingAppPackageName(PKG_NAME);
ShadowPasswordUtils.addGrantedPermission(GET_AND_REQUEST_SCREEN_LOCK_COMPLEXITY);
Settings.Global.putInt(RuntimeEnvironment.application.getContentResolver(),
Settings.Global.DEVICE_PROVISIONED, 1);
@@ -173,12 +212,46 @@
assertThat(actualIntent.hasExtra(EXTRA_KEY_REQUESTED_MIN_COMPLEXITY)).isFalse();
assertThat(actualIntent.hasExtra(EXTRA_KEY_CALLER_APP_NAME)).isTrue();
assertThat(actualIntent.getStringExtra(EXTRA_KEY_CALLER_APP_NAME)).isEqualTo(APP_LABEL);
+ verify(mockMetricsProvider).action(
+ SettingsEnums.PAGE_UNKNOWN,
+ SettingsEnums.ACTION_SET_NEW_PASSWORD,
+ SettingsEnums.SET_NEW_PASSWORD_ACTIVITY,
+ PKG_NAME,
+ PASSWORD_COMPLEXITY_NONE);
+ }
+
+ @Test
+ @Config(shadows = {ShadowPasswordUtils.class})
+ public void testLaunchChooseLock_setNewPasswordWithoutExtra() {
+ ShadowPasswordUtils.setCallingAppLabel(APP_LABEL);
+ ShadowPasswordUtils.setCallingAppPackageName(PKG_NAME);
+ ShadowPasswordUtils.addGrantedPermission(GET_AND_REQUEST_SCREEN_LOCK_COMPLEXITY);
+ Settings.Global.putInt(RuntimeEnvironment.application.getContentResolver(),
+ Settings.Global.DEVICE_PROVISIONED, 1);
+
+ Intent intent = new Intent(ACTION_SET_NEW_PASSWORD);
+ SetNewPasswordActivity activity =
+ Robolectric.buildActivity(SetNewPasswordActivity.class, intent).create().get();
+
+ ShadowActivity shadowActivity = Shadows.shadowOf(activity);
+ Intent actualIntent = shadowActivity.getNextStartedActivityForResult().intent;
+ 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();
+ assertThat(actualIntent.getStringExtra(EXTRA_KEY_CALLER_APP_NAME)).isEqualTo(APP_LABEL);
+ verify(mockMetricsProvider).action(
+ SettingsEnums.PAGE_UNKNOWN,
+ SettingsEnums.ACTION_SET_NEW_PASSWORD,
+ SettingsEnums.SET_NEW_PASSWORD_ACTIVITY,
+ PKG_NAME,
+ Integer.MIN_VALUE);
}
@Test
@Config(shadows = {ShadowPasswordUtils.class})
public void testLaunchChooseLock_setNewParentProfilePasswordExtraWithPermission() {
ShadowPasswordUtils.setCallingAppLabel(APP_LABEL);
+ ShadowPasswordUtils.setCallingAppPackageName(PKG_NAME);
ShadowPasswordUtils.addGrantedPermission(GET_AND_REQUEST_SCREEN_LOCK_COMPLEXITY);
Settings.Global.putInt(RuntimeEnvironment.application.getContentResolver(),
Settings.Global.DEVICE_PROVISIONED, 1);
@@ -194,5 +267,38 @@
assertThat(actualIntent.hasExtra(EXTRA_KEY_REQUESTED_MIN_COMPLEXITY)).isFalse();
assertThat(actualIntent.hasExtra(EXTRA_KEY_CALLER_APP_NAME)).isTrue();
assertThat(actualIntent.getStringExtra(EXTRA_KEY_CALLER_APP_NAME)).isEqualTo(APP_LABEL);
+ verify(mockMetricsProvider).action(
+ SettingsEnums.PAGE_UNKNOWN,
+ SettingsEnums.ACTION_SET_NEW_PARENT_PROFILE_PASSWORD,
+ SettingsEnums.SET_NEW_PASSWORD_ACTIVITY,
+ PKG_NAME,
+ PASSWORD_COMPLEXITY_HIGH);
+ }
+
+ @Test
+ @Config(shadows = {ShadowPasswordUtils.class})
+ public void testLaunchChooseLock_setNewParentProfilePasswordWithoutExtra() {
+ ShadowPasswordUtils.setCallingAppLabel(APP_LABEL);
+ ShadowPasswordUtils.setCallingAppPackageName(PKG_NAME);
+ ShadowPasswordUtils.addGrantedPermission(GET_AND_REQUEST_SCREEN_LOCK_COMPLEXITY);
+ Settings.Global.putInt(RuntimeEnvironment.application.getContentResolver(),
+ Settings.Global.DEVICE_PROVISIONED, 1);
+
+ Intent intent = new Intent(ACTION_SET_NEW_PARENT_PROFILE_PASSWORD);
+ SetNewPasswordActivity activity =
+ Robolectric.buildActivity(SetNewPasswordActivity.class, intent).create().get();
+
+ ShadowActivity shadowActivity = Shadows.shadowOf(activity);
+ Intent actualIntent = shadowActivity.getNextStartedActivityForResult().intent;
+ 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();
+ assertThat(actualIntent.getStringExtra(EXTRA_KEY_CALLER_APP_NAME)).isEqualTo(APP_LABEL);
+ verify(mockMetricsProvider).action(
+ SettingsEnums.PAGE_UNKNOWN,
+ SettingsEnums.ACTION_SET_NEW_PARENT_PROFILE_PASSWORD,
+ SettingsEnums.SET_NEW_PASSWORD_ACTIVITY,
+ PKG_NAME,
+ Integer.MIN_VALUE);
}
}
diff --git a/tests/robotests/src/com/android/settings/testutils/shadow/ShadowPasswordUtils.java b/tests/robotests/src/com/android/settings/testutils/shadow/ShadowPasswordUtils.java
index 6a5c4ae..ee5fb21 100644
--- a/tests/robotests/src/com/android/settings/testutils/shadow/ShadowPasswordUtils.java
+++ b/tests/robotests/src/com/android/settings/testutils/shadow/ShadowPasswordUtils.java
@@ -32,11 +32,13 @@
public class ShadowPasswordUtils {
private static String sCallingAppLabel;
+ private static String sCallingAppPackageName;
private static Set<String> sGrantedPermissions;
public static void reset() {
sCallingAppLabel = null;
sGrantedPermissions = null;
+ sCallingAppPackageName = null;
}
@Implementation
@@ -63,4 +65,13 @@
public static void setCallingAppLabel(String label) {
sCallingAppLabel = label;
}
+
+ @Implementation
+ protected static String getCallingAppPackageName(IBinder activityToken) {
+ return sCallingAppPackageName;
+ }
+
+ public static void setCallingAppPackageName(String packageName) {
+ sCallingAppPackageName = packageName;
+ }
}