Merge "Adding switch for Forced App Standby"
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 7702257..46c6490 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -1934,6 +1934,32 @@
android:value="true" />
</activity>
+ <activity android:name="Settings$DevelopmentSettingsDashboardActivity"
+ android:label="@string/development_settings_title"
+ android:icon="@drawable/ic_settings_development"
+ android:taskAffinity="com.android.settings"
+ android:parentActivityName="Settings">
+
+ <!-- Enable when deleting DevelopmentSettingsActivity
+ <intent-filter android:priority="1">
+ <action android:name="android.settings.APPLICATION_DEVELOPMENT_SETTINGS" />
+ <action android:name="com.android.settings.APPLICATION_DEVELOPMENT_SETTINGS" />
+ <category android:name="android.intent.category.DEFAULT" />
+ </intent-filter>
+ -->
+ <intent-filter android:priority="50">
+ <action android:name="com.android.settings.action.SETTINGS" />
+ </intent-filter>
+ <meta-data android:name="com.android.settings.category"
+ android:value="com.android.settings.category.ia.system" />
+ <meta-data android:name="com.android.settings.summary"
+ android:resource="@string/summary_empty"/>
+ <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
+ android:value="com.android.settings.development.DevelopmentSettingsDashboardFragment" />
+ <meta-data android:name="com.android.settings.PRIMARY_PROFILE_CONTROLLED"
+ android:value="true" />
+ </activity>
+
<!-- The opposite of DevelopmentSettingsActivity, it's no-op and only enabled when the real
activity is disabled to be CTS compliant. -->
<activity
diff --git a/res/layout-land/choose_lock_pattern.xml b/res/layout-land/choose_lock_pattern.xml
index 0743577..8e78b05 100644
--- a/res/layout-land/choose_lock_pattern.xml
+++ b/res/layout-land/choose_lock_pattern.xml
@@ -138,10 +138,12 @@
</LinearLayout>
<!-- right side: lock pattern -->
- <FrameLayout
+ <com.android.setupwizardlib.view.FillContentLayout
+ style="@style/LockPatternContainerStyle"
android:layout_width="0dp"
android:layout_height="match_parent"
- android:layout_weight="1.0">
+ android:layout_weight="1.0"
+ android:paddingStart="0dp">
<com.android.internal.widget.LockPatternView android:id="@+id/lockPattern"
android:layout_width="match_parent"
@@ -149,7 +151,7 @@
android:layout_gravity="center"
android:background="@color/lock_pattern_background" />
- </FrameLayout>
+ </com.android.setupwizardlib.view.FillContentLayout>
</com.android.internal.widget.LinearLayoutWithDefaultTouchRecepient>
diff --git a/res/layout-land/confirm_lock_pattern_internal.xml b/res/layout-land/confirm_lock_pattern_internal.xml
index 4e58f32..952ab49 100644
--- a/res/layout-land/confirm_lock_pattern_internal.xml
+++ b/res/layout-land/confirm_lock_pattern_internal.xml
@@ -96,10 +96,12 @@
</ScrollView>
- <FrameLayout
+ <com.android.setupwizardlib.view.FillContentLayout
+ style="@style/LockPatternContainerStyle"
android:layout_width="0dp"
android:layout_height="match_parent"
- android:layout_weight="1">
+ android:layout_weight="1"
+ android:paddingStart="0dp">
<com.android.internal.widget.LockPatternView android:id="@+id/lockPattern"
android:layout_width="match_parent"
@@ -107,7 +109,7 @@
android:layout_gravity="center"
android:background="@color/lock_pattern_background" />
- </FrameLayout>
+ </com.android.setupwizardlib.view.FillContentLayout>
</com.android.internal.widget.LinearLayoutWithDefaultTouchRecepient>
</com.android.setupwizardlib.GlifLayout>
diff --git a/res/layout/choose_lock_pattern_common.xml b/res/layout/choose_lock_pattern_common.xml
index 3ea960d..7dca27d 100644
--- a/res/layout/choose_lock_pattern_common.xml
+++ b/res/layout/choose_lock_pattern_common.xml
@@ -64,19 +64,31 @@
android:gravity="center"
android:clipChildren="false"
android:clipToPadding="false"
- android:orientation="vertical">
+ android:orientation="vertical"
+ android:paddingLeft="0dp"
+ android:paddingRight="0dp">
<TextView android:id="@+id/headerText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minLines="2"
android:gravity="center"
+ android:paddingHorizontal="?attr/suwMarginSides"
android:textSize="18sp" />
- <com.android.internal.widget.LockPatternView android:id="@+id/lockPattern"
- android:layout_width="match_parent"
- android:layout_height="0dip"
- android:layout_weight="1" />
+ <com.android.setupwizardlib.view.FillContentLayout
+ style="@style/LockPatternContainerStyle"
+ android:layout_width="wrap_content"
+ android:layout_height="0dp"
+ android:layout_weight="1">
+
+ <com.android.internal.widget.LockPatternView
+ android:id="@+id/lockPattern"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:layout_gravity="center" />
+
+ </com.android.setupwizardlib.view.FillContentLayout>
</LinearLayout>
diff --git a/res/layout/confirm_lock_pattern_internal_base.xml b/res/layout/confirm_lock_pattern_internal_base.xml
index 5109632..d0ce769 100644
--- a/res/layout/confirm_lock_pattern_internal_base.xml
+++ b/res/layout/confirm_lock_pattern_internal_base.xml
@@ -61,14 +61,23 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
- android:gravity="center">
+ android:gravity="center"
+ android:paddingLeft="0dp"
+ android:paddingRight="0dp">
- <com.android.internal.widget.LockPatternView
- android:id="@+id/lockPattern"
- android:layout_width="match_parent"
+ <com.android.setupwizardlib.view.FillContentLayout
+ style="@style/LockPatternContainerStyle"
+ android:layout_width="wrap_content"
android:layout_height="0dp"
- android:layout_weight="4"
- android:layout_gravity="center_horizontal"/>
+ android:layout_weight="1">
+
+ <com.android.internal.widget.LockPatternView
+ android:id="@+id/lockPattern"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:layout_gravity="center" />
+
+ </com.android.setupwizardlib.view.FillContentLayout>
<TextView
style="@style/TextAppearance.ConfirmDeviceCredentialsErrorText"
@@ -77,9 +86,8 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
+ android:layout_marginHorizontal="?attr/suwMarginSides"
android:layout_marginTop="12dp"
- android:layout_marginStart="12dp"
- android:layout_marginEnd="12dp"
android:gravity="center_vertical"/>
<ImageView
@@ -87,6 +95,7 @@
android:layout_gravity="center_horizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
+ android:layout_marginHorizontal="?attr/suwMarginSides"
android:layout_marginBottom="24dp"
android:contentDescription="@string/confirm_fingerprint_icon_content_description"
android:visibility="gone"/>
diff --git a/res/values/styles.xml b/res/values/styles.xml
index a3bfcdf..fe92e6d 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -427,6 +427,16 @@
<style name="DreamStartButton" parent="android:Widget.Material.Button" />
+ <style name="LockPatternContainerStyle">
+ <item name="android:maxHeight">400dp</item>
+ <item name="android:maxWidth">420dp</item>
+ <item name="android:minHeight">0dp</item>
+ <item name="android:minWidth">0dp</item>
+ <item name="android:paddingBottom">0dp</item>
+ <item name="android:paddingHorizontal">44dp</item>
+ <item name="android:paddingTop">0dp</item>
+ </style>
+
<style name="LockPatternStyle">
<item name="*android:regularColor">@color/lock_pattern_view_regular_color</item>
<item name="*android:successColor">@color/lock_pattern_view_success_color</item>
diff --git a/src/com/android/settings/Settings.java b/src/com/android/settings/Settings.java
index 1ec4284..cd479a5 100644
--- a/src/com/android/settings/Settings.java
+++ b/src/com/android/settings/Settings.java
@@ -17,6 +17,7 @@
package com.android.settings;
import android.os.Bundle;
+import android.util.FeatureFlagUtils;
import com.android.settings.applications.AppOpsSummary;
import com.android.settings.enterprise.EnterprisePrivacySettings;
@@ -70,7 +71,17 @@
}
public static class BackgroundCheckSummaryActivity extends SettingsActivity { /* empty */ }
public static class StorageUseActivity extends SettingsActivity { /* empty */ }
+
+ /**
+ * @deprecated in favor of {@link DevelopmentSettingsDashboardActivity}.
+ */
+ @Deprecated
public static class DevelopmentSettingsActivity extends SettingsActivity { /* empty */ }
+ public static class DevelopmentSettingsDashboardActivity extends SettingsActivity {
+ public static final boolean isEnabled() {
+ return FeatureFlagUtils.isEnabled("dev_option_v2");
+ }
+ }
public static class AccessibilitySettingsActivity extends SettingsActivity { /* empty */ }
public static class CaptioningSettingsActivity extends SettingsActivity { /* empty */ }
public static class AccessibilityInversionSettingsActivity extends SettingsActivity { /* empty */ }
diff --git a/src/com/android/settings/SettingsActivity.java b/src/com/android/settings/SettingsActivity.java
index f9b849e..c927889 100644
--- a/src/com/android/settings/SettingsActivity.java
+++ b/src/com/android/settings/SettingsActivity.java
@@ -50,6 +50,7 @@
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.Toolbar;
+
import com.android.internal.util.ArrayUtils;
import com.android.settings.Settings.WifiSettingsActivity;
import com.android.settings.backup.BackupSettingsActivity;
@@ -58,7 +59,6 @@
import com.android.settings.core.instrumentation.SharedPreferencesLogger;
import com.android.settings.dashboard.DashboardFeatureProvider;
import com.android.settings.dashboard.DashboardSummary;
-import com.android.settings.development.DevelopmentSettings;
import com.android.settings.overlay.FeatureFactory;
import com.android.settings.search.SearchActivity;
import com.android.settings.wfd.WifiDisplaySettings;
@@ -66,6 +66,7 @@
import com.android.settingslib.development.DevelopmentSettingsEnabler;
import com.android.settingslib.drawer.DashboardCategory;
import com.android.settingslib.drawer.SettingsDrawerActivity;
+
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
@@ -831,9 +832,16 @@
final boolean showDev = DevelopmentSettingsEnabler.isDevelopmentSettingsEnabled(this)
&& !um.hasUserRestriction(UserManager.DISALLOW_DEBUGGING_FEATURES);
+ final boolean useDevOptionV2 = Settings.DevelopmentSettingsDashboardActivity.isEnabled();
+ // Enable old Dev option if v2 is disabled
somethingChanged = setTileEnabled(new ComponentName(packageName,
Settings.DevelopmentSettingsActivity.class.getName()),
- showDev, isAdmin)
+ showDev && !useDevOptionV2, isAdmin)
+ || somethingChanged;
+ // Enable new Dev option if v2 is enable
+ somethingChanged = setTileEnabled(new ComponentName(packageName,
+ Settings.DevelopmentSettingsDashboardActivity.class.getName()),
+ showDev && useDevOptionV2, isAdmin)
|| somethingChanged;
// Enable/disable backup settings depending on whether the user is admin.
diff --git a/src/com/android/settings/core/gateway/SettingsGateway.java b/src/com/android/settings/core/gateway/SettingsGateway.java
index a03314c..884696c 100644
--- a/src/com/android/settings/core/gateway/SettingsGateway.java
+++ b/src/com/android/settings/core/gateway/SettingsGateway.java
@@ -66,6 +66,7 @@
import com.android.settings.datausage.DataUsageSummary;
import com.android.settings.deletionhelper.AutomaticStorageManagerSettings;
import com.android.settings.development.DevelopmentSettings;
+import com.android.settings.development.DevelopmentSettingsDashboardFragment;
import com.android.settings.deviceinfo.ImeiInformation;
import com.android.settings.deviceinfo.PrivateVolumeForget;
import com.android.settings.deviceinfo.PrivateVolumeSettings;
@@ -177,6 +178,7 @@
PrivateVolumeSettings.class.getName(),
PublicVolumeSettings.class.getName(),
DevelopmentSettings.class.getName(),
+ DevelopmentSettingsDashboardFragment.class.getName(),
AndroidBeam.class.getName(),
WifiDisplaySettings.class.getName(),
PowerUsageSummary.class.getName(),
diff --git a/src/com/android/settings/dashboard/DashboardFragmentRegistry.java b/src/com/android/settings/dashboard/DashboardFragmentRegistry.java
index fddd522..17e556e 100644
--- a/src/com/android/settings/dashboard/DashboardFragmentRegistry.java
+++ b/src/com/android/settings/dashboard/DashboardFragmentRegistry.java
@@ -20,12 +20,14 @@
import com.android.settings.DisplaySettings;
import com.android.settings.SecuritySettings;
+import com.android.settings.Settings;
import com.android.settings.accounts.AccountDetailDashboardFragment;
import com.android.settings.accounts.UserAndAccountDashboardFragment;
import com.android.settings.applications.AppAndNotificationDashboardFragment;
import com.android.settings.applications.DefaultAppSettings;
import com.android.settings.connecteddevice.ConnectedDeviceDashboardFragment;
import com.android.settings.development.DevelopmentSettings;
+import com.android.settings.development.DevelopmentSettingsDashboardFragment;
import com.android.settings.deviceinfo.StorageDashboardFragment;
import com.android.settings.fuelgauge.PowerUsageSummary;
import com.android.settings.language.LanguageAndInputSettings;
@@ -83,8 +85,13 @@
SystemDashboardFragment.class.getName(), CategoryKey.CATEGORY_SYSTEM);
PARENT_TO_CATEGORY_KEY_MAP.put(LanguageAndInputSettings.class.getName(),
CategoryKey.CATEGORY_SYSTEM_LANGUAGE);
- PARENT_TO_CATEGORY_KEY_MAP.put(DevelopmentSettings.class.getName(),
- CategoryKey.CATEGORY_SYSTEM_DEVELOPMENT);
+ if (Settings.DevelopmentSettingsDashboardActivity.isEnabled()) {
+ PARENT_TO_CATEGORY_KEY_MAP.put(DevelopmentSettingsDashboardFragment.class.getName(),
+ CategoryKey.CATEGORY_SYSTEM_DEVELOPMENT);
+ } else {
+ PARENT_TO_CATEGORY_KEY_MAP.put(DevelopmentSettings.class.getName(),
+ CategoryKey.CATEGORY_SYSTEM_DEVELOPMENT);
+ }
PARENT_TO_CATEGORY_KEY_MAP.put(ConfigureNotificationSettings.class.getName(),
CategoryKey.CATEGORY_NOTIFICATIONS);
PARENT_TO_CATEGORY_KEY_MAP.put(LockscreenDashboardFragment.class.getName(),
diff --git a/src/com/android/settings/development/DevelopmentSettings.java b/src/com/android/settings/development/DevelopmentSettings.java
index 3759ea1..3115dc4 100644
--- a/src/com/android/settings/development/DevelopmentSettings.java
+++ b/src/com/android/settings/development/DevelopmentSettings.java
@@ -110,7 +110,9 @@
/*
* Displays preferences for application developers.
+ * @deprecated in favor of {@link DevelopmentSettingsDashboardFragment}
*/
+@Deprecated
public class DevelopmentSettings extends RestrictedSettingsFragment
implements DialogInterface.OnClickListener, DialogInterface.OnDismissListener,
OnPreferenceChangeListener, SwitchBar.OnSwitchChangeListener, Indexable {
diff --git a/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java b/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java
new file mode 100644
index 0000000..30be654
--- /dev/null
+++ b/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java
@@ -0,0 +1,102 @@
+/*
+ * Copyright (C) 2017 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.development;
+
+import android.content.Context;
+import android.os.UserManager;
+import android.provider.SearchIndexableResource;
+import android.util.Log;
+
+import com.android.internal.logging.nano.MetricsProto;
+import com.android.settings.R;
+import com.android.settings.dashboard.RestrictedDashboardFragment;
+import com.android.settings.search.BaseSearchIndexProvider;
+import com.android.settings.search.Indexable;
+import com.android.settings.widget.SwitchBar;
+import com.android.settingslib.core.AbstractPreferenceController;
+import com.android.settingslib.development.DevelopmentSettingsEnabler;
+
+import java.util.Arrays;
+import java.util.List;
+
+public class DevelopmentSettingsDashboardFragment extends RestrictedDashboardFragment {
+
+ private static final String TAG = "DevSettingsDashboard";
+
+ private SwitchBar mSwitchBar;
+
+ public DevelopmentSettingsDashboardFragment() {
+ super(UserManager.DISALLOW_DEBUGGING_FEATURES);
+ }
+
+ @Override
+ public int getMetricsCategory() {
+ return MetricsProto.MetricsEvent.DEVELOPMENT;
+ }
+
+ @Override
+ protected String getLogTag() {
+ return TAG;
+ }
+
+ @Override
+ protected int getHelpResource() {
+ return 0;
+ }
+
+ @Override
+ protected int getPreferenceScreenResId() {
+ Log.d(TAG, "Creating pref screen");
+ return R.xml.development_prefs;
+ }
+
+ @Override
+ protected List<AbstractPreferenceController> getPreferenceControllers(Context context) {
+ return buildPreferenceControllers(context);
+ }
+
+ private static List<AbstractPreferenceController> buildPreferenceControllers(Context context) {
+ return null;
+ }
+
+ /**
+ * For Search.
+ */
+ public static final Indexable.SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
+ new BaseSearchIndexProvider() {
+
+ @Override
+ protected boolean isPageSearchEnabled(Context context) {
+ return DevelopmentSettingsEnabler.isDevelopmentSettingsEnabled(context);
+ }
+
+ @Override
+ public List<SearchIndexableResource> getXmlResourcesToIndex(
+ Context context, boolean enabled) {
+
+ final SearchIndexableResource sir = new SearchIndexableResource(context);
+ sir.xmlResId = R.xml.development_prefs;
+ return Arrays.asList(sir);
+ }
+
+ @Override
+ public List<AbstractPreferenceController> getPreferenceControllers(Context
+ context) {
+ return buildPreferenceControllers(context);
+ }
+ };
+}
diff --git a/src/com/android/settings/fingerprint/SetupFingerprintEnrollIntroduction.java b/src/com/android/settings/fingerprint/SetupFingerprintEnrollIntroduction.java
index 59907cf..5656a27 100644
--- a/src/com/android/settings/fingerprint/SetupFingerprintEnrollIntroduction.java
+++ b/src/com/android/settings/fingerprint/SetupFingerprintEnrollIntroduction.java
@@ -32,6 +32,7 @@
import com.android.settings.password.ChooseLockGeneric.ChooseLockGenericFragment;
import com.android.settings.password.SetupChooseLockGeneric;
import com.android.settings.password.SetupSkipDialog;
+import com.android.settings.password.StorageManagerWrapper;
public class SetupFingerprintEnrollIntroduction extends FingerprintEnrollIntroduction {
private static final String KEY_LOCK_SCREEN_PRESENT = "wasLockScreenPresent";
@@ -56,11 +57,14 @@
@Override
protected Intent getChooseLockIntent() {
- Intent intent = new Intent(this, SetupChooseLockGeneric.class)
- .putExtra(
- LockPatternUtils.PASSWORD_TYPE_KEY,
- DevicePolicyManager.PASSWORD_QUALITY_NUMERIC);
- intent.putExtra(ChooseLockGenericFragment.EXTRA_SHOW_OPTIONS_BUTTON, true);
+ Intent intent = new Intent(this, SetupChooseLockGeneric.class);
+
+ if (StorageManagerWrapper.isFileEncryptedNativeOrEmulated()) {
+ intent.putExtra(
+ LockPatternUtils.PASSWORD_TYPE_KEY,
+ DevicePolicyManager.PASSWORD_QUALITY_NUMERIC);
+ intent.putExtra(ChooseLockGenericFragment.EXTRA_SHOW_OPTIONS_BUTTON, true);
+ }
SetupWizardUtils.copySetupExtras(getIntent(), intent);
return intent;
}
diff --git a/src/com/android/settings/fuelgauge/BatteryEntry.java b/src/com/android/settings/fuelgauge/BatteryEntry.java
index aa71252..7a18cd0 100644
--- a/src/com/android/settings/fuelgauge/BatteryEntry.java
+++ b/src/com/android/settings/fuelgauge/BatteryEntry.java
@@ -26,6 +26,7 @@
import android.content.pm.UserInfo;
import android.graphics.drawable.Drawable;
import android.os.Handler;
+import android.os.Process;
import android.os.RemoteException;
import android.os.UserHandle;
import android.os.UserManager;
@@ -47,6 +48,7 @@
public static final int MSG_REPORT_FULLY_DRAWN = 2;
private static final String TAG = "BatteryEntry";
+ private static final String PACKAGE_SYSTEM = "android";
static final HashMap<String,UidToDetail> sUidCache = new HashMap<String,UidToDetail>();
@@ -268,9 +270,11 @@
if (sipper.mPackages == null) {
sipper.mPackages = pm.getPackagesForUid(uid);
}
- if (sipper.mPackages != null) {
- String[] packageLabels = new String[sipper.mPackages.length];
- System.arraycopy(sipper.mPackages, 0, packageLabels, 0, sipper.mPackages.length);
+
+ final String[] packages = extractPackagesFromSipper(sipper);
+ if (packages != null) {
+ String[] packageLabels = new String[packages.length];
+ System.arraycopy(packages, 0, packageLabels, 0, packages.length);
// Convert package names to user-facing labels where possible
IPackageManager ipm = AppGlobals.getPackageManager();
@@ -289,7 +293,7 @@
packageLabels[i] = label.toString();
}
if (ai.icon != 0) {
- defaultPackageName = sipper.mPackages[i];
+ defaultPackageName = packages[i];
icon = ai.loadIcon(pm);
break;
}
@@ -303,7 +307,7 @@
name = packageLabels[0];
} else {
// Look for an official name for this UID.
- for (String pkgName : sipper.mPackages) {
+ for (String pkgName : packages) {
try {
final PackageInfo pi = ipm.getPackageInfo(pkgName, 0 /* no flags */, userId);
if (pi == null) {
@@ -349,4 +353,11 @@
sHandler.sendMessage(sHandler.obtainMessage(MSG_UPDATE_NAME_ICON, this));
}
}
+
+ String[] extractPackagesFromSipper(BatterySipper sipper) {
+ // Only use system package if uid is system uid, so it could find a consistent name and icon
+ return sipper.getUid() == Process.SYSTEM_UID
+ ? new String[]{PACKAGE_SYSTEM}
+ : sipper.mPackages;
+ }
}
diff --git a/src/com/android/settings/password/StorageManagerWrapper.java b/src/com/android/settings/password/StorageManagerWrapper.java
new file mode 100644
index 0000000..5adfaf2
--- /dev/null
+++ b/src/com/android/settings/password/StorageManagerWrapper.java
@@ -0,0 +1,29 @@
+/*
+ * Copyright (C) 2017 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.password;
+
+import android.os.storage.StorageManager;
+
+/**
+ * Wrapper class to allow Robolectric to shadow methods introduced in newer API
+ */
+public class StorageManagerWrapper {
+
+ public static boolean isFileEncryptedNativeOrEmulated() {
+ return StorageManager.isFileEncryptedNativeOrEmulated();
+ }
+}
diff --git a/src/com/android/settings/widget/ValidatedEditTextPreference.java b/src/com/android/settings/widget/ValidatedEditTextPreference.java
index 76331d4..58c62eb 100644
--- a/src/com/android/settings/widget/ValidatedEditTextPreference.java
+++ b/src/com/android/settings/widget/ValidatedEditTextPreference.java
@@ -21,8 +21,10 @@
import android.support.annotation.VisibleForTesting;
import android.text.Editable;
import android.text.InputType;
+import android.text.TextUtils;
import android.text.TextWatcher;
import android.util.AttributeSet;
+import android.util.Log;
import android.view.View;
import android.widget.EditText;
@@ -61,17 +63,18 @@
@Override
protected void onBindDialogView(View view) {
super.onBindDialogView(view);
- if (mValidator != null) {
- final EditText editText = view.findViewById(android.R.id.edit);
- if (editText != null) {
- editText.removeTextChangedListener(mTextWatcher);
- if (mIsPassword) {
- editText.setInputType(
- InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
- editText.setMaxLines(1);
- }
- editText.addTextChangedListener(mTextWatcher);
+ final EditText editText = view.findViewById(android.R.id.edit);
+ if (editText != null && !TextUtils.isEmpty(editText.getText())) {
+ editText.setSelection(editText.getText().length());
+ }
+ if (mValidator != null && editText != null) {
+ editText.removeTextChangedListener(mTextWatcher);
+ if (mIsPassword) {
+ editText.setInputType(
+ InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
+ editText.setMaxLines(1);
}
+ editText.addTextChangedListener(mTextWatcher);
}
}
diff --git a/src/com/android/settings/wifi/details/WifiDetailPreferenceController.java b/src/com/android/settings/wifi/details/WifiDetailPreferenceController.java
index aa23419..0996416 100644
--- a/src/com/android/settings/wifi/details/WifiDetailPreferenceController.java
+++ b/src/com/android/settings/wifi/details/WifiDetailPreferenceController.java
@@ -446,9 +446,8 @@
}
}
- // Find IPv4 DNS addresses.
+ // Find all (IPv4 and IPv6) DNS addresses.
String dnsServers = mLinkProperties.getDnsServers().stream()
- .filter(Inet4Address.class::isInstance)
.map(InetAddress::getHostAddress)
.collect(Collectors.joining("\n"));
diff --git a/tests/robotests/assets/grandfather_not_in_search_index_provider_registry b/tests/robotests/assets/grandfather_not_in_search_index_provider_registry
index 948b14a..a2a772b 100644
--- a/tests/robotests/assets/grandfather_not_in_search_index_provider_registry
+++ b/tests/robotests/assets/grandfather_not_in_search_index_provider_registry
@@ -1 +1,2 @@
+com.android.settings.development.DevelopmentSettingsDashboardFragment
com.android.settings.display.ScreenZoomPreferenceFragmentForSetupWizard
diff --git a/tests/robotests/src/android/util/FeatureFlagUtils.java b/tests/robotests/src/android/util/FeatureFlagUtils.java
new file mode 100644
index 0000000..6bc0557
--- /dev/null
+++ b/tests/robotests/src/android/util/FeatureFlagUtils.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2017 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 android.util;
+
+import android.os.SystemProperties;
+import android.text.TextUtils;
+
+/**
+ * This class is only needed to get around Robolectric issue.
+ */
+public class FeatureFlagUtils {
+ public static final String FFLAG_PREFIX = "sys.fflag.";
+ public static final String FFLAG_OVERRIDE_PREFIX = FFLAG_PREFIX + "override.";
+
+ /**
+ * Whether or not a flag is enabled.
+ *
+ * @param feature the flag name
+ * @return true if the flag is enabled (either by default in system, or override by user)
+ */
+ public static boolean isEnabled(String feature) {
+ // Tries to get feature flag from system property.
+ // Step 1: check if feature flag has any override. Flag name: sys.fflag.override.<feature>
+ String value = SystemProperties.get(FFLAG_OVERRIDE_PREFIX + feature);
+ if (!TextUtils.isEmpty(value)) {
+ return Boolean.parseBoolean(value);
+ }
+ // Step 2: check if feature flag has any default value. Flag name: sys.fflag.<feature>
+ value = SystemProperties.get(FFLAG_PREFIX + feature);
+ return Boolean.parseBoolean(value);
+ }
+}
diff --git a/tests/robotests/src/com/android/settings/development/DevelopmentSettingsDashboardFragmentTest.java b/tests/robotests/src/com/android/settings/development/DevelopmentSettingsDashboardFragmentTest.java
new file mode 100644
index 0000000..04ff721
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/development/DevelopmentSettingsDashboardFragmentTest.java
@@ -0,0 +1,98 @@
+/*
+ * Copyright (C) 2017 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.development;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.content.Context;
+import android.provider.SearchIndexableResource;
+
+import com.android.internal.logging.nano.MetricsProto;
+import com.android.settings.R;
+import com.android.settings.TestConfig;
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
+import com.android.settings.testutils.shadow.SettingsShadowResources;
+import com.android.settingslib.development.DevelopmentSettingsEnabler;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+
+import java.util.List;
+
+@RunWith(SettingsRobolectricTestRunner.class)
+@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION,
+ shadows = {
+ SettingsShadowResources.class,
+ SettingsShadowResources.SettingsShadowTheme.class
+ })
+public class DevelopmentSettingsDashboardFragmentTest {
+
+ private DevelopmentSettingsDashboardFragment mDashboard;
+
+ @Before
+ public void setUp() {
+ mDashboard = new DevelopmentSettingsDashboardFragment();
+ }
+
+ @Test
+ public void shouldNotHaveHelpResource() {
+ assertThat(mDashboard.getHelpResource()).isEqualTo(0);
+ }
+
+ @Test
+ public void shouldLogAsFeatureFlagPage() {
+ assertThat(mDashboard.getMetricsCategory())
+ .isEqualTo(MetricsProto.MetricsEvent.DEVELOPMENT);
+ }
+
+ @Test
+ public void searchIndex_shouldIndexFromPrefXml() {
+ final List<SearchIndexableResource> index =
+ DevelopmentSettingsDashboardFragment.SEARCH_INDEX_DATA_PROVIDER
+ .getXmlResourcesToIndex(RuntimeEnvironment.application, true);
+
+ assertThat(index.size()).isEqualTo(1);
+ assertThat(index.get(0).xmlResId).isEqualTo(R.xml.development_prefs);
+ }
+
+ @Test
+ public void searchIndex_pageDisabled_shouldAddAllKeysToNonIndexable() {
+ final Context appContext = RuntimeEnvironment.application;
+ DevelopmentSettingsEnabler.setDevelopmentSettingsEnabled(appContext, false);
+
+ final List<String> nonIndexableKeys =
+ DevelopmentSettingsDashboardFragment.SEARCH_INDEX_DATA_PROVIDER
+ .getNonIndexableKeys(appContext);
+
+ assertThat(nonIndexableKeys).contains("development_prefs_screen");
+ }
+
+ @Test
+ public void searchIndex_pageEnabled_shouldNotAddKeysToNonIndexable() {
+ final Context appContext = RuntimeEnvironment.application;
+ DevelopmentSettingsEnabler.setDevelopmentSettingsEnabled(appContext, true);
+
+ final List<String> nonIndexableKeys =
+ DevelopmentSettingsDashboardFragment.SEARCH_INDEX_DATA_PROVIDER
+ .getNonIndexableKeys(appContext);
+
+ assertThat(nonIndexableKeys).doesNotContain("development_prefs_screen");
+ }
+}
diff --git a/tests/robotests/src/com/android/settings/fingerprint/SetupFingerprintEnrollIntroductionTest.java b/tests/robotests/src/com/android/settings/fingerprint/SetupFingerprintEnrollIntroductionTest.java
index 801ee5d..f5859ac 100644
--- a/tests/robotests/src/com/android/settings/fingerprint/SetupFingerprintEnrollIntroductionTest.java
+++ b/tests/robotests/src/com/android/settings/fingerprint/SetupFingerprintEnrollIntroductionTest.java
@@ -23,28 +23,38 @@
import android.app.KeyguardManager;
import android.content.Intent;
+import android.content.pm.PackageManager;
import android.content.pm.UserInfo;
import android.view.View;
import android.widget.Button;
import com.android.settings.R;
import com.android.settings.TestConfig;
+import com.android.settings.fingerprint.SetupFingerprintEnrollIntroductionTest
+ .ShadowStorageManagerWrapper;
import com.android.settings.password.SetupChooseLockGeneric.SetupChooseLockGenericFragment;
import com.android.settings.password.SetupSkipDialog;
+import com.android.settings.password.StorageManagerWrapper;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
import com.android.settings.testutils.shadow.ShadowEventLogWriter;
+import com.android.settings.testutils.shadow.ShadowFingerprintManager;
import com.android.settings.testutils.shadow.ShadowLockPatternUtils;
import com.android.settings.testutils.shadow.ShadowUserManager;
+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.RuntimeEnvironment;
import org.robolectric.Shadows;
import org.robolectric.annotation.Config;
+import org.robolectric.annotation.Implementation;
+import org.robolectric.annotation.Implements;
import org.robolectric.shadows.ShadowActivity;
+import org.robolectric.shadows.ShadowActivity.IntentForResult;
import org.robolectric.shadows.ShadowKeyguardManager;
import org.robolectric.util.ActivityController;
@@ -54,7 +64,9 @@
sdk = TestConfig.SDK_VERSION,
shadows = {
ShadowEventLogWriter.class,
+ ShadowFingerprintManager.class,
ShadowLockPatternUtils.class,
+ ShadowStorageManagerWrapper.class,
ShadowUserManager.class
})
public class SetupFingerprintEnrollIntroductionTest {
@@ -68,12 +80,22 @@
public void setUp() {
MockitoAnnotations.initMocks(this);
+ RuntimeEnvironment.getRobolectricPackageManager()
+ .setSystemFeature(PackageManager.FEATURE_FINGERPRINT, true);
+ ShadowFingerprintManager.addToServiceMap();
+
final Intent intent = new Intent();
mController = Robolectric.buildActivity(SetupFingerprintEnrollIntroduction.class, intent);
ShadowUserManager.getShadow().setUserInfo(0, mUserInfo);
}
+ @After
+ public void tearDown() {
+ ShadowStorageManagerWrapper.reset();
+ ShadowFingerprintManager.reset();
+ }
+
@Test
public void testKeyguardNotSecure_shouldFinishWithSetupSkipDialogResultSkip() {
getShadowKeyguardManager().setIsKeyguardSecure(false);
@@ -188,8 +210,41 @@
assertThat(Shadows.shadowOf(activity).getResultIntent()).isNull();
}
+ @Test
+ public void testLockPattern() {
+ ShadowStorageManagerWrapper.sIsFileEncrypted = false;
+
+ mController.create().postCreate(null).resume();
+
+ SetupFingerprintEnrollIntroduction activity = mController.get();
+
+ final Button nextButton = activity.findViewById(R.id.fingerprint_next_button);
+ nextButton.performClick();
+
+ ShadowActivity shadowActivity = Shadows.shadowOf(activity);
+ IntentForResult startedActivity = shadowActivity.getNextStartedActivityForResult();
+ assertThat(startedActivity).isNotNull();
+ assertThat(startedActivity.intent.hasExtra(
+ SetupChooseLockGenericFragment.EXTRA_PASSWORD_QUALITY)).isFalse();
+ }
+
private ShadowKeyguardManager getShadowKeyguardManager() {
return Shadows.shadowOf(application.getSystemService(KeyguardManager.class));
}
+
+ @Implements(StorageManagerWrapper.class)
+ public static class ShadowStorageManagerWrapper {
+
+ private static boolean sIsFileEncrypted = true;
+
+ public static void reset() {
+ sIsFileEncrypted = true;
+ }
+
+ @Implementation
+ public static boolean isFileEncryptedNativeOrEmulated() {
+ return sIsFileEncrypted;
+ }
+ }
}
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatteryEntryTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatteryEntryTest.java
index 632d549..a461f46 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/BatteryEntryTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/BatteryEntryTest.java
@@ -21,6 +21,7 @@
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.os.Handler;
+import android.os.Process;
import android.os.UserManager;
import com.android.internal.os.BatterySipper;
@@ -46,9 +47,12 @@
public class BatteryEntryTest {
private static final int APP_UID = 123;
+ private static final int SYSTEM_UID = Process.SYSTEM_UID;
private static final String APP_DEFAULT_PACKAGE_NAME = "com.android.test";
private static final String APP_LABEL = "Test App Name";
private static final String HIGH_DRAIN_PACKAGE = "com.android.test.screen";
+ private static final String ANDROID_PACKAGE = "android";
+ private static final String[] SYSTEM_PACKAGES = {HIGH_DRAIN_PACKAGE, ANDROID_PACKAGE};
@Rule public MockitoRule mocks = MockitoJUnit.rule();
@@ -84,6 +88,18 @@
return sipper;
}
+ private BatteryEntry createBatteryEntryForSystem() {
+ return new BatteryEntry(mockContext, mockHandler, mockUserManager, createSipperForSystem());
+ }
+
+ private BatterySipper createSipperForSystem() {
+ BatterySipper sipper =
+ new BatterySipper(DrainType.APP, new FakeUid(SYSTEM_UID), 0 /* power use */);
+ sipper.packageWithHighestDrain = HIGH_DRAIN_PACKAGE;
+ sipper.mPackages = SYSTEM_PACKAGES;
+ return sipper;
+ }
+
@Test
public void batteryEntryForApp_shouldSetDefaultPackageNameAndLabel() throws Exception {
BatteryEntry entry = createBatteryEntryForApp();
@@ -118,7 +134,22 @@
new String[]{APP_DEFAULT_PACKAGE_NAME, "package2", "package3"});
BatteryEntry entry = createBatteryEntryForApp();
-
+
assertThat(entry.getLabel()).isEqualTo(HIGH_DRAIN_PACKAGE);
}
+
+ @Test
+ public void extractPackageFromSipper_systemSipper_returnSystemPackage() {
+ BatteryEntry entry = createBatteryEntryForSystem();
+
+ assertThat(entry.extractPackagesFromSipper(entry.sipper)).isEqualTo(
+ new String[]{ANDROID_PACKAGE});
+ }
+
+ @Test
+ public void extractPackageFromSipper_normalSipper_returnDefaultPakcage() {
+ BatteryEntry entry = createBatteryEntryForApp();
+
+ assertThat(entry.extractPackagesFromSipper(entry.sipper)).isEqualTo(entry.sipper.mPackages);
+ }
}
diff --git a/tests/robotests/src/com/android/settings/testutils/shadow/ShadowFingerprintManager.java b/tests/robotests/src/com/android/settings/testutils/shadow/ShadowFingerprintManager.java
new file mode 100644
index 0000000..b84cf42
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/testutils/shadow/ShadowFingerprintManager.java
@@ -0,0 +1,102 @@
+/*
+ * Copyright (C) 2017 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.testutils.shadow;
+
+import android.content.Context;
+import android.hardware.fingerprint.Fingerprint;
+import android.hardware.fingerprint.FingerprintManager;
+import android.support.annotation.NonNull;
+
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Implementation;
+import org.robolectric.annotation.Implements;
+import org.robolectric.annotation.Resetter;
+import org.robolectric.internal.ShadowExtractor;
+import org.robolectric.shadows.ShadowContextImpl;
+import org.robolectric.util.ReflectionHelpers;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.IntStream;
+
+@Implements(FingerprintManager.class)
+public class ShadowFingerprintManager {
+
+ private static Map<String, String> getSystemServiceMap() {
+ return ReflectionHelpers.getStaticField(ShadowContextImpl.class, "SYSTEM_SERVICE_MAP");
+ }
+
+ /**
+ * Call this in @Before of a test to add FingerprintManager to Robolectric's system service
+ * map. Otherwise getSystemService(FINGERPRINT_SERVICE) will return null.
+ */
+ public static void addToServiceMap() {
+ getSystemServiceMap().put(Context.FINGERPRINT_SERVICE, FingerprintManager.class.getName());
+ }
+
+ @Resetter
+ public static void reset() {
+ getSystemServiceMap().remove(Context.FINGERPRINT_SERVICE);
+ }
+
+ public boolean hardwareDetected = true;
+
+ @NonNull
+ private List<Fingerprint> mFingerprints = Collections.emptyList();
+
+ @Implementation
+ public boolean isHardwareDetected() {
+ return hardwareDetected;
+ }
+
+ @Implementation
+ public boolean hasEnrolledFingerprints() {
+ return !mFingerprints.isEmpty();
+ }
+
+ @Implementation
+ public List<Fingerprint> getEnrolledFingerprints() {
+ return mFingerprints;
+ }
+
+ @Implementation
+ public List<Fingerprint> getEnrolledFingerprints(int userId) {
+ return mFingerprints;
+ }
+
+ public void setEnrolledFingerprints(Fingerprint... fingerprints) {
+ mFingerprints = Arrays.asList(fingerprints);
+ }
+
+ public void setDefaultFingerprints(int num) {
+ setEnrolledFingerprints(
+ IntStream.range(0, num)
+ .mapToObj(i -> new Fingerprint(
+ "Fingerprint " + i,
+ 0, /* groupId */
+ i, /* fingerId */
+ 0 /* deviceId */))
+ .toArray(Fingerprint[]::new));
+ }
+
+ public static ShadowFingerprintManager get() {
+ return (ShadowFingerprintManager) ShadowExtractor.extract(
+ RuntimeEnvironment.application.getSystemService(FingerprintManager.class));
+ }
+}
diff --git a/tests/robotests/src/com/android/settings/widget/ValidatedEditTextPreferenceTest.java b/tests/robotests/src/com/android/settings/widget/ValidatedEditTextPreferenceTest.java
index 88a5147..e061787 100644
--- a/tests/robotests/src/com/android/settings/widget/ValidatedEditTextPreferenceTest.java
+++ b/tests/robotests/src/com/android/settings/widget/ValidatedEditTextPreferenceTest.java
@@ -35,9 +35,10 @@
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.anyInt;
+import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.verifyZeroInteractions;
import static org.mockito.Mockito.when;
@RunWith(SettingsRobolectricTestRunner.class)
@@ -58,10 +59,36 @@
}
@Test
- public void bindDialogView_noTextWatcher_shouldDoNothing() {
+ public void bindDialogView_nullEditText_shouldNotCrash() {
+ when(mView.findViewById(android.R.id.edit)).thenReturn(null);
+ // should not crash trying to get the EditText text
+ mPreference.onBindDialogView(mView);
+ }
+
+ @Test
+ public void bindDialogView_emptyEditText_shouldNotSetSelection() {
+ final String testText = "";
+ final EditText editText = spy(new EditText(RuntimeEnvironment.application));
+ editText.setText(testText);
+ when(mView.findViewById(android.R.id.edit)).thenReturn(editText);
+
mPreference.onBindDialogView(mView);
- verifyZeroInteractions(mView);
+ // no need to setSelection if text was empty
+ verify(editText, never()).setSelection(anyInt());
+ }
+
+ @Test
+ public void bindDialogView_nonemptyEditText_shouldSetSelection() {
+ final String testText = "whatever";
+ final EditText editText = spy(new EditText(RuntimeEnvironment.application));
+ editText.setText(testText);
+ when(mView.findViewById(android.R.id.edit)).thenReturn(editText);
+
+ mPreference.onBindDialogView(mView);
+
+ // selection should be set to end of string
+ verify(editText).setSelection(testText.length());
}
@Test
diff --git a/tests/robotests/src/com/android/settings/wifi/details/WifiDetailPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/wifi/details/WifiDetailPreferenceControllerTest.java
index 275f9a2..1c2ddb4 100644
--- a/tests/robotests/src/com/android/settings/wifi/details/WifiDetailPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/wifi/details/WifiDetailPreferenceControllerTest.java
@@ -436,10 +436,14 @@
public void dnsServersPref_shouldHaveDetailTextSet() throws UnknownHostException {
mLinkProperties.addDnsServer(InetAddress.getByAddress(new byte[]{8,8,4,4}));
mLinkProperties.addDnsServer(InetAddress.getByAddress(new byte[]{8,8,8,8}));
+ mLinkProperties.addDnsServer(Constants.IPV6_DNS);
displayAndResume();
- verify(mockDnsPref).setDetailText("8.8.4.4\n8.8.8.8");
+ verify(mockDnsPref).setDetailText(
+ "8.8.4.4\n" +
+ "8.8.8.8\n" +
+ Constants.IPV6_DNS.getHostAddress());
}
@Test
@@ -545,12 +549,14 @@
lp.addDnsServer(Constants.IPV6_DNS);
updateLinkProperties(lp);
- inOrder.verify(mockDnsPref, never()).setVisible(true);
+ inOrder.verify(mockDnsPref).setDetailText(Constants.IPV6_DNS.getHostAddress());
+ inOrder.verify(mockDnsPref).setVisible(true);
lp.addDnsServer(Constants.IPV4_DNS1);
lp.addDnsServer(Constants.IPV4_DNS2);
updateLinkProperties(lp);
inOrder.verify(mockDnsPref).setDetailText(
+ Constants.IPV6_DNS.getHostAddress() + "\n" +
Constants.IPV4_DNS1.getHostAddress() + "\n" +
Constants.IPV4_DNS2.getHostAddress());
inOrder.verify(mockDnsPref).setVisible(true);