Merge "Import translations. DO NOT MERGE" into oc-dev
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 35a6f51..f6b36b4 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -750,8 +750,6 @@
<string name="encryption_and_credential_settings_summary">Phone encrypted</string>
<!-- Security Settings screen setting option title for the item to take you to the lock screen preference screen [CHAR LIMIT=60] -->
<string name="lockscreen_settings_title">Lock screen preferences</string>
- <!-- Security Settings screen setting option summary for the item to take you to the lock screen preference screen -->
- <string name="lockscreen_settings_summary">Show all notification content</string>
<!-- Main Settings screen setting option summary text for the item tot ake you to the security and location screen -->
<string name="security_settings_summary">Set My Location, screen unlock, SIM card lock, credential storage lock</string>
@@ -2289,7 +2287,7 @@
<!-- Adaptive brightness settings screen, setting option summary to enable adaptive brightness when user prefers very high brightness.
Meant to make it clear that preferring very high brightness uses more battery. [CHAR LIMIT=100] -->
<string name="auto_brightness_very_high_summary">Increased battery usage</string>
- <!-- Adaptive brightness settings screen, disclaimer that explains in more detail about how adaptive brightness works [CHAR LIMIT=100] -->
+ <!-- Adaptive brightness settings screen, disclaimer that explains in more detail about how adaptive brightness works [CHAR LIMIT=150] -->
<string name="auto_brightness_disclaimer">Optimize brightness level for available light. When this feature is on, you can still adjust brightness temporarily.</string>
<!-- Night display screen, setting option name to enable night display (renamed "Night Light" with title caps). [CHAR LIMIT=30] -->
@@ -4462,7 +4460,7 @@
<!-- Summary for the background activity when it is disabled [CHAR_LIMIT=120] -->
<string name="background_activity_summary_disabled">App not allowed to run in background</string>
- <!-- Title for the screen usage in power use UI [CHAR_LIMIT=40] -->
+ <!-- Title for the screen usage in power use UI [CHAR_LIMIT=60] -->
<string name="device_screen_usage">Screen usage since full charge</string>
<!-- Title for the screen consumption in power use UI(i.e. Screen consumption: 30% of battery usage) [CHAR_LIMIT=40] -->
<string name="device_screen_consumption">Screen consumption</string>
diff --git a/res/xml/automatic_storage_management_settings.xml b/res/xml/automatic_storage_management_settings.xml
index 73d708d..1428741 100644
--- a/res/xml/automatic_storage_management_settings.xml
+++ b/res/xml/automatic_storage_management_settings.xml
@@ -18,38 +18,18 @@
xmlns:settings="http://schemas.android.com/apk/res-auto"
android:title="@string/automatic_storage_manager_settings" >
- <PreferenceCategory
- android:key="automatic"
- android:title="@string/deletion_helper_automatic_title">
-
- <SwitchPreference
- android:key="storage_manager_active"
- android:title="@string/automatic_storage_manager_preference_title"
- android:summary="@string/automatic_storage_manager_text"/>
-
- <Preference
- android:key="freed_bytes"
- android:persistent="false"
- android:selectable="false" />
-
<DropDownPreference
android:key="days"
android:summary="%s"
android:title="@string/automatic_storage_manager_days_title"
android:entries="@array/automatic_storage_management_days"
android:entryValues="@array/automatic_storage_management_days_values"
- settings:allowDividerAbove="true" />
-
- </PreferenceCategory>
-
- <PreferenceCategory
- android:key="manual"
- android:title="@string/deletion_helper_manual_title">
+ settings:allowDividerBelow="true" />
<Preference
- android:key="deletion_helper"
- android:title="@string/deletion_helper_preference_title"/>
-
- </PreferenceCategory>
+ android:key="freed_bytes"
+ android:persistent="false"
+ android:selectable="false"
+ settings:allowDividerAbove="true" />
</PreferenceScreen>
\ No newline at end of file
diff --git a/res/xml/security_settings_chooser.xml b/res/xml/security_settings_chooser.xml
index dc6e727..067ebab 100644
--- a/res/xml/security_settings_chooser.xml
+++ b/res/xml/security_settings_chooser.xml
@@ -31,7 +31,6 @@
<Preference android:key="lockscreen_preferences"
android:title="@string/lockscreen_settings_title"
- android:summary="@string/lockscreen_settings_summary"
android:fragment="com.android.settings.security.LockscreenDashboardFragment"/>
</PreferenceCategory>
diff --git a/res/xml/security_settings_password.xml b/res/xml/security_settings_password.xml
index e3a5dfd..7de65f7 100644
--- a/res/xml/security_settings_password.xml
+++ b/res/xml/security_settings_password.xml
@@ -30,7 +30,6 @@
<Preference android:key="lockscreen_preferences"
android:title="@string/lockscreen_settings_title"
- android:summary="@string/lockscreen_settings_summary"
android:fragment="com.android.settings.security.LockscreenDashboardFragment"/>
</PreferenceCategory>
diff --git a/res/xml/security_settings_pattern.xml b/res/xml/security_settings_pattern.xml
index 295e896..1585f01 100644
--- a/res/xml/security_settings_pattern.xml
+++ b/res/xml/security_settings_pattern.xml
@@ -30,7 +30,6 @@
<Preference android:key="lockscreen_preferences"
android:title="@string/lockscreen_settings_title"
- android:summary="@string/lockscreen_settings_summary"
android:fragment="com.android.settings.security.LockscreenDashboardFragment"/>
</PreferenceCategory>
diff --git a/res/xml/security_settings_pin.xml b/res/xml/security_settings_pin.xml
index 5613177..f7705b7 100644
--- a/res/xml/security_settings_pin.xml
+++ b/res/xml/security_settings_pin.xml
@@ -30,7 +30,6 @@
<Preference android:key="lockscreen_preferences"
android:title="@string/lockscreen_settings_title"
- android:summary="@string/lockscreen_settings_summary"
android:fragment="com.android.settings.security.LockscreenDashboardFragment"/>
</PreferenceCategory>
diff --git a/src/com/android/settings/SecuritySettings.java b/src/com/android/settings/SecuritySettings.java
index a56889d..1e64b7f 100644
--- a/src/com/android/settings/SecuritySettings.java
+++ b/src/com/android/settings/SecuritySettings.java
@@ -60,6 +60,7 @@
import com.android.settings.enterprise.ManageDeviceAdminPreferenceController;
import com.android.settings.fingerprint.FingerprintSettings;
import com.android.settings.location.LocationPreferenceController;
+import com.android.settings.notification.LockScreenNotificationPreferenceController;
import com.android.settings.overlay.FeatureFactory;
import com.android.settings.search.BaseSearchIndexProvider;
import com.android.settings.search.Indexable;
@@ -103,6 +104,8 @@
@VisibleForTesting
static final String KEY_MANAGE_TRUST_AGENTS = "manage_trust_agents";
private static final String KEY_UNIFICATION = "unification";
+ @VisibleForTesting
+ static final String KEY_LOCKSCREEN_PREFERENCES = "lockscreen_preferences";
private static final int SET_OR_CHANGE_LOCK_METHOD_REQUEST = 123;
private static final int CHANGE_TRUST_AGENT_SETTINGS = 126;
@@ -169,6 +172,7 @@
private LocationPreferenceController mLocationcontroller;
private ManageDeviceAdminPreferenceController mManageDeviceAdminPreferenceController;
private EnterprisePrivacyPreferenceController mEnterprisePrivacyPreferenceController;
+ private LockScreenNotificationPreferenceController mLockScreenNotificationPreferenceController;
@Override
public int getMetricsCategory() {
@@ -210,6 +214,8 @@
= new ManageDeviceAdminPreferenceController(activity);
mEnterprisePrivacyPreferenceController
= new EnterprisePrivacyPreferenceController(activity, null /* lifecycle */);
+ mLockScreenNotificationPreferenceController
+ = new LockScreenNotificationPreferenceController(activity);
}
private static int getResIdForLockUnlockScreen(Context context,
@@ -317,6 +323,7 @@
if (securityCategory != null) {
maybeAddFingerprintPreference(securityCategory, UserHandle.myUserId());
numberOfTrustAgent = addTrustAgentSettings(securityCategory);
+ setLockscreenPreferencesSummary(securityCategory);
}
mVisiblePatternProfile =
@@ -423,6 +430,15 @@
}
}
+ @VisibleForTesting
+ void setLockscreenPreferencesSummary(PreferenceGroup group) {
+ final Preference lockscreenPreferences = group.findPreference(KEY_LOCKSCREEN_PREFERENCES);
+ if (lockscreenPreferences != null) {
+ lockscreenPreferences.setSummary(
+ mLockScreenNotificationPreferenceController.getSummaryResource());
+ }
+ }
+
/*
* Sets the preference as disabled by admin if PASSWORD_QUALITY_MANAGED is set.
* The preference must be a RestrictedPreference.
diff --git a/src/com/android/settings/deletionhelper/AutomaticStorageManagerSettings.java b/src/com/android/settings/deletionhelper/AutomaticStorageManagerSettings.java
index 4d4cfe8..adf2938 100644
--- a/src/com/android/settings/deletionhelper/AutomaticStorageManagerSettings.java
+++ b/src/com/android/settings/deletionhelper/AutomaticStorageManagerSettings.java
@@ -17,44 +17,39 @@
package com.android.settings.deletionhelper;
import android.app.Activity;
-import android.app.AlertDialog;
-import android.app.FragmentManager;
import android.content.ContentResolver;
-import android.content.Intent;
import android.os.Bundle;
-import android.os.SystemProperties;
-import android.os.storage.StorageManager;
import android.provider.Settings;
-import android.support.v14.preference.SwitchPreference;
import android.support.v7.preference.DropDownPreference;
import android.support.v7.preference.Preference;
import android.support.v7.preference.Preference.OnPreferenceChangeListener;
import android.text.format.DateUtils;
import android.text.format.Formatter;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.settings.R;
+import com.android.settings.SettingsActivity;
import com.android.settings.SettingsPreferenceFragment;
+import com.android.settings.widget.SwitchBar;
/**
* AutomaticStorageManagerSettings is the Settings screen for configuration and management of the
* automatic storage manager.
*/
-public class AutomaticStorageManagerSettings extends SettingsPreferenceFragment implements
- OnPreferenceChangeListener, Preference.OnPreferenceClickListener {
- public static final int DEFAULT_DAYS_TO_RETAIN = 90;
-
+public class AutomaticStorageManagerSettings extends SettingsPreferenceFragment
+ implements OnPreferenceChangeListener {
private static final String KEY_DAYS = "days";
- private static final String KEY_DELETION_HELPER = "deletion_helper";
private static final String KEY_FREED = "freed_bytes";
- private static final String KEY_STORAGE_MANAGER_SWITCH = "storage_manager_active";
private static final String STORAGE_MANAGER_ENABLED_BY_DEFAULT_PROPERTY =
"ro.storage_manager.enabled";
+ private AutomaticStorageManagerSwitchBarController mSwitchController;
private DropDownPreference mDaysToRetain;
private Preference mFreedBytes;
- private Preference mDeletionHelper;
- private SwitchPreference mStorageManagerSwitch;
+ private SwitchBar mSwitchBar;
@Override
public void onCreate(Bundle savedInstanceState) {
@@ -63,19 +58,21 @@
}
@Override
- public void onActivityCreated(Bundle savedInstanceState) {
- super.onActivityCreated(savedInstanceState);
+ public View onCreateView(
+ LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
+ View view = super.onCreateView(inflater, container, savedInstanceState);
+
+ initializeDaysToRetainPreference();
+ initializeFreedBytesPreference();
+ initializeSwitchBar();
+
+ return view;
+ }
+
+ private void initializeDaysToRetainPreference() {
mDaysToRetain = (DropDownPreference) findPreference(KEY_DAYS);
mDaysToRetain.setOnPreferenceChangeListener(this);
- mFreedBytes = findPreference(KEY_FREED);
-
- mDeletionHelper = findPreference(KEY_DELETION_HELPER);
- mDeletionHelper.setOnPreferenceClickListener(this);
-
- mStorageManagerSwitch = (SwitchPreference) findPreference(KEY_STORAGE_MANAGER_SWITCH);
- mStorageManagerSwitch.setOnPreferenceChangeListener(this);
-
ContentResolver cr = getContentResolver();
int photosDaysToRetain = Settings.Secure.getInt(cr,
Settings.Secure.AUTOMATIC_STORAGE_MANAGER_DAYS_TO_RETAIN,
@@ -83,7 +80,24 @@
String[] stringValues =
getResources().getStringArray(R.array.automatic_storage_management_days_values);
mDaysToRetain.setValue(stringValues[daysValueToIndex(photosDaysToRetain, stringValues)]);
+ }
+ private void initializeSwitchBar() {
+ final SettingsActivity activity = (SettingsActivity) getActivity();
+ mSwitchBar = activity.getSwitchBar();
+ mSwitchBar.show();
+ mSwitchController =
+ new AutomaticStorageManagerSwitchBarController(
+ getContext(),
+ mSwitchBar,
+ mMetricsFeatureProvider,
+ mDaysToRetain,
+ getFragmentManager());
+ }
+
+ private void initializeFreedBytesPreference() {
+ ContentResolver cr = getContentResolver();
+ mFreedBytes = findPreference(KEY_FREED);
long freedBytes = Settings.Secure.getLong(cr,
Settings.Secure.AUTOMATIC_STORAGE_MANAGER_BYTES_CLEARED,
0);
@@ -93,11 +107,13 @@
if (freedBytes == 0 || lastRunMillis == 0) {
mFreedBytes.setVisible(false);
} else {
- Activity activity = getActivity();
- mFreedBytes.setSummary(activity.getString(
- R.string.automatic_storage_manager_freed_bytes,
- Formatter.formatFileSize(activity, freedBytes),
- DateUtils.formatDateTime(activity, lastRunMillis, DateUtils.FORMAT_SHOW_DATE)));
+ final Activity activity = getActivity();
+ mFreedBytes.setSummary(
+ activity.getString(
+ R.string.automatic_storage_manager_freed_bytes,
+ Formatter.formatFileSize(activity, freedBytes),
+ DateUtils.formatDateTime(
+ activity, lastRunMillis, DateUtils.FORMAT_SHOW_DATE)));
}
}
@@ -107,31 +123,27 @@
boolean isStorageManagerChecked =
Settings.Secure.getInt(getContentResolver(),
Settings.Secure.AUTOMATIC_STORAGE_MANAGER_ENABLED, 0) != 0;
- mStorageManagerSwitch.setChecked(isStorageManagerChecked);
+ // Using the setCheckedInternal means the checked status won't propagate through the
+ // listeners -- this will prevent us from accidentally causing a metrics event on resume.
+ mSwitchBar.setCheckedInternal(isStorageManagerChecked);
mDaysToRetain.setEnabled(isStorageManagerChecked);
}
@Override
+ public void onDestroyView() {
+ super.onDestroyView();
+
+ mSwitchBar.hide();
+ mSwitchController.tearDown();
+ }
+
+ @Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
- switch (preference.getKey()) {
- case KEY_STORAGE_MANAGER_SWITCH:
- boolean storageManagerChecked = (boolean) newValue;
- mMetricsFeatureProvider.action(getContext(),
- MetricsEvent.ACTION_TOGGLE_STORAGE_MANAGER, storageManagerChecked);
- mDaysToRetain.setEnabled(storageManagerChecked);
- Settings.Secure.putInt(getContentResolver(),
- Settings.Secure.AUTOMATIC_STORAGE_MANAGER_ENABLED,
- storageManagerChecked ? 1 : 0);
- // Only show a warning if enabling.
- if (storageManagerChecked) {
- maybeShowWarning();
- }
- break;
- case KEY_DAYS:
- Settings.Secure.putInt(getContentResolver(),
- Settings.Secure.AUTOMATIC_STORAGE_MANAGER_DAYS_TO_RETAIN,
- Integer.parseInt((String) newValue));
- break;
+ if (KEY_DAYS.equals(preference.getKey())) {
+ Settings.Secure.putInt(
+ getContentResolver(),
+ Settings.Secure.AUTOMATIC_STORAGE_MANAGER_DAYS_TO_RETAIN,
+ Integer.parseInt((String) newValue));
}
return true;
}
@@ -142,15 +154,6 @@
}
@Override
- public boolean onPreferenceClick(Preference preference) {
- if (KEY_DELETION_HELPER.equals(preference.getKey())) {
- Intent intent = new Intent(StorageManager.ACTION_MANAGE_STORAGE);
- getContext().startActivity(intent);
- }
- return true;
- }
-
- @Override
protected int getHelpResource() {
return R.string.help_uri_storage;
}
@@ -164,15 +167,4 @@
}
return indices.length - 1;
}
-
- private void maybeShowWarning() {
- // If the storage manager is on by default, we can use the normal message.
- boolean warningUnneeded = SystemProperties.getBoolean(
- STORAGE_MANAGER_ENABLED_BY_DEFAULT_PROPERTY, false);
- if (warningUnneeded) {
- return;
- }
- ActivationWarningFragment fragment = ActivationWarningFragment.newInstance();
- fragment.show(getFragmentManager(), ActivationWarningFragment.TAG);
- }
}
diff --git a/src/com/android/settings/deletionhelper/AutomaticStorageManagerSwitchBarController.java b/src/com/android/settings/deletionhelper/AutomaticStorageManagerSwitchBarController.java
new file mode 100644
index 0000000..a648102
--- /dev/null
+++ b/src/com/android/settings/deletionhelper/AutomaticStorageManagerSwitchBarController.java
@@ -0,0 +1,85 @@
+/*
+ * 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.deletionhelper;
+
+import android.app.FragmentManager;
+import android.content.Context;
+import android.os.SystemProperties;
+import android.provider.Settings;
+import android.support.v7.preference.Preference;
+import android.widget.Switch;
+
+import com.android.internal.util.Preconditions;
+import com.android.settings.core.instrumentation.MetricsFeatureProvider;
+import com.android.settings.widget.SwitchBar;
+import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
+
+/** Handles the logic for flipping the storage management toggle on a {@link SwitchBar}. */
+public class AutomaticStorageManagerSwitchBarController
+ implements SwitchBar.OnSwitchChangeListener {
+ private static final String STORAGE_MANAGER_ENABLED_BY_DEFAULT_PROPERTY =
+ "ro.storage_manager.enabled";
+
+ private Context mContext;
+ private SwitchBar mSwitchBar;
+ private MetricsFeatureProvider mMetrics;
+ private Preference mDaysToRetainPreference;
+ private FragmentManager mFragmentManager;
+
+ public AutomaticStorageManagerSwitchBarController(
+ Context context,
+ SwitchBar switchBar,
+ MetricsFeatureProvider metrics,
+ Preference daysToRetainPreference,
+ FragmentManager fragmentManager) {
+ mContext = Preconditions.checkNotNull(context);
+ mSwitchBar = Preconditions.checkNotNull(switchBar);
+ mMetrics = Preconditions.checkNotNull(metrics);
+ mDaysToRetainPreference = Preconditions.checkNotNull(daysToRetainPreference);
+ mFragmentManager = Preconditions.checkNotNull(fragmentManager);
+
+ mSwitchBar.addOnSwitchChangeListener(this);
+ }
+
+ @Override
+ public void onSwitchChanged(Switch switchView, boolean isChecked) {
+ mMetrics.action(mContext, MetricsEvent.ACTION_TOGGLE_STORAGE_MANAGER, isChecked);
+ mDaysToRetainPreference.setEnabled(isChecked);
+ Settings.Secure.putInt(
+ mContext.getContentResolver(),
+ Settings.Secure.AUTOMATIC_STORAGE_MANAGER_ENABLED,
+ isChecked ? 1 : 0);
+ // Only show a warning if enabling.
+ if (isChecked) {
+ maybeShowWarning();
+ }
+ }
+
+ /** Unregisters the controller from listening to further events. */
+ public void tearDown() {
+ mSwitchBar.removeOnSwitchChangeListener(this);
+ }
+
+ private void maybeShowWarning() {
+ // If the storage manager is on by default, we don't need to show the additional dialog.
+ if (SystemProperties.getBoolean(STORAGE_MANAGER_ENABLED_BY_DEFAULT_PROPERTY, false)) {
+ return;
+ }
+ ActivationWarningFragment fragment = ActivationWarningFragment.newInstance();
+ fragment.show(mFragmentManager, ActivationWarningFragment.TAG);
+ }
+}
diff --git a/src/com/android/settings/fingerprint/FingerprintRemoveSidecar.java b/src/com/android/settings/fingerprint/FingerprintRemoveSidecar.java
new file mode 100644
index 0000000..eda4c82
--- /dev/null
+++ b/src/com/android/settings/fingerprint/FingerprintRemoveSidecar.java
@@ -0,0 +1,149 @@
+/*
+ * 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.fingerprint;
+
+import android.annotation.Nullable;
+import android.content.Context;
+import android.hardware.fingerprint.Fingerprint;
+import android.hardware.fingerprint.FingerprintManager;
+import android.os.Bundle;
+import com.android.settings.core.InstrumentedPreferenceFragment;
+import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
+import android.os.UserHandle;
+import java.util.Queue;
+import java.util.LinkedList;
+import android.util.Log;
+
+/**
+ * Sidecar fragment to handle the state around fingerprint removal.
+ */
+public class FingerprintRemoveSidecar extends InstrumentedPreferenceFragment {
+
+ private static final String TAG = "FingerprintRemoveSidecar";
+ private Listener mListener;
+ private Fingerprint mFingerprintRemoving;
+ private Queue<Object> mFingerprintsRemoved;
+ FingerprintManager mFingerprintManager;
+
+ private class RemovalError {
+ Fingerprint fingerprint;
+ int errMsgId;
+ CharSequence errString;
+ public RemovalError(Fingerprint fingerprint, int errMsgId, CharSequence errString) {
+ this.fingerprint = fingerprint;
+ this.errMsgId = errMsgId;
+ this.errString = errString;
+ }
+ }
+
+ private FingerprintManager.RemovalCallback
+ mRemoveCallback = new FingerprintManager.RemovalCallback() {
+ @Override
+ public void onRemovalSucceeded(Fingerprint fingerprint) {
+ if (mListener != null) {
+ mListener.onRemovalSucceeded(fingerprint);
+ } else {
+ mFingerprintsRemoved.add(fingerprint);
+ };
+ mFingerprintRemoving = null;
+ }
+
+ @Override
+ public void onRemovalError(Fingerprint fp, int errMsgId, CharSequence errString) {
+ if (mListener != null) {
+ mListener.onRemovalError(fp, errMsgId, errString);
+ } else {
+ mFingerprintsRemoved.add(new RemovalError(fp, errMsgId, errString));
+ }
+ mFingerprintRemoving = null;
+ }
+ };
+
+ public void startRemove(Fingerprint fingerprint, int userId) {
+ if (mFingerprintRemoving != null) {
+ Log.e(TAG, "Remove already in progress");
+ return;
+ }
+ if (userId != UserHandle.USER_NULL) {
+ mFingerprintManager.setActiveUser(userId);
+ }
+ mFingerprintRemoving = fingerprint;
+ mFingerprintManager.remove(fingerprint, userId, mRemoveCallback);;
+ }
+
+ public FingerprintRemoveSidecar() {
+ mFingerprintsRemoved = new LinkedList<>();
+ }
+
+ public void setFingerprintManager(FingerprintManager fingerprintManager) {
+ mFingerprintManager = fingerprintManager;
+ }
+
+ @Override
+ public void onCreate(@Nullable Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setRetainInstance(true);
+ }
+
+ @Override
+ public void onAttach(Context context) {
+ super.onAttach(context);
+ }
+
+ @Override
+ public void onResume() {
+ super.onResume();
+ }
+
+ @Override
+ public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
+ }
+
+ public void setListener(Listener listener) {
+ if (mListener == null && listener != null) {
+ while (!mFingerprintsRemoved.isEmpty()) {
+ Object o = mFingerprintsRemoved.poll();
+ if (o instanceof Fingerprint) {
+ listener.onRemovalSucceeded((Fingerprint)o);
+ } else if (o instanceof RemovalError) {
+ RemovalError e = (RemovalError) o;
+ listener.onRemovalError(e.fingerprint, e.errMsgId, e.errString);
+ }
+ }
+ }
+ mListener = listener;
+ }
+
+ public interface Listener {
+ void onRemovalSucceeded(Fingerprint fingerprint);
+ void onRemovalError(Fingerprint fp, int errMsgId, CharSequence errString);
+ }
+
+ final boolean isRemovingFingerprint(int fid) {
+ return inProgress() && mFingerprintRemoving.getFingerId() == fid;
+ }
+
+ final boolean inProgress() {
+ return mFingerprintRemoving != null;
+ }
+
+ @Override
+ public int getMetricsCategory() {
+ return MetricsEvent.FINGERPRINT_REMOVE_SIDECAR;
+ }
+
+}
diff --git a/src/com/android/settings/fingerprint/FingerprintSettings.java b/src/com/android/settings/fingerprint/FingerprintSettings.java
index dc6616a..01670fe 100644
--- a/src/com/android/settings/fingerprint/FingerprintSettings.java
+++ b/src/com/android/settings/fingerprint/FingerprintSettings.java
@@ -31,7 +31,6 @@
import android.hardware.fingerprint.FingerprintManager;
import android.hardware.fingerprint.FingerprintManager.AuthenticationCallback;
import android.hardware.fingerprint.FingerprintManager.AuthenticationResult;
-import android.hardware.fingerprint.FingerprintManager.RemovalCallback;
import android.os.Bundle;
import android.os.CancellationSignal;
import android.os.Handler;
@@ -64,11 +63,11 @@
import com.android.settings.Utils;
import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
import com.android.settings.widget.FooterPreference;
-import com.android.settings.widget.FooterPreferenceMixin;
import com.android.settingslib.HelpUtils;
import com.android.settingslib.RestrictedLockUtils;
import java.util.List;
+import java.util.HashMap;
import static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
@@ -160,6 +159,10 @@
private Drawable mHighlightDrawable;
private int mUserId;
+ private static final String TAG_REMOVAL_SIDECAR = "removal_sidecar";
+ private FingerprintRemoveSidecar mRemovalSidecar;
+ private HashMap<Integer, String> mFingerprintsRenaming;
+
private AuthenticationCallback mAuthCallback = new AuthenticationCallback() {
@Override
public void onAuthenticationSucceeded(AuthenticationResult result) {
@@ -184,22 +187,30 @@
.sendToTarget();
}
};
- private RemovalCallback mRemoveCallback = new RemovalCallback() {
- @Override
+ FingerprintRemoveSidecar.Listener mRemovalListener =
+ new FingerprintRemoveSidecar.Listener() {
public void onRemovalSucceeded(Fingerprint fingerprint) {
mHandler.obtainMessage(MSG_REFRESH_FINGERPRINT_TEMPLATES,
fingerprint.getFingerId(), 0).sendToTarget();
+ updateDialog();
}
-
- @Override
public void onRemovalError(Fingerprint fp, int errMsgId, CharSequence errString) {
final Activity activity = getActivity();
if (activity != null) {
Toast.makeText(activity, errString, Toast.LENGTH_SHORT);
}
+ updateDialog();
+ }
+ private void updateDialog() {
+ RenameDeleteDialog renameDeleteDialog = (RenameDeleteDialog)getFragmentManager().
+ findFragmentByTag(RenameDeleteDialog.class.getName());
+ if (renameDeleteDialog != null) {
+ renameDeleteDialog.enableDelete();
+ }
}
};
+
private final Handler mHandler = new Handler() {
@Override
public void handleMessage(android.os.Message msg) {
@@ -263,6 +274,9 @@
}
private void retryFingerprint() {
+ if (mRemovalSidecar.inProgress()) {
+ return;
+ }
if (!mInFingerprintLockout) {
mFingerprintCancel = new CancellationSignal();
mFingerprintManager.authenticate(null, mFingerprintCancel, 0 /* flags */,
@@ -278,7 +292,31 @@
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
+
+ Activity activity = getActivity();
+ mFingerprintManager = Utils.getFingerprintManagerOrNull(activity);
+
+ mRemovalSidecar = (FingerprintRemoveSidecar)
+ getFragmentManager().findFragmentByTag(TAG_REMOVAL_SIDECAR);
+ if (mRemovalSidecar == null) {
+ mRemovalSidecar = new FingerprintRemoveSidecar();
+ getFragmentManager().beginTransaction()
+ .add(mRemovalSidecar, TAG_REMOVAL_SIDECAR).commit();
+ }
+ mRemovalSidecar.setFingerprintManager(mFingerprintManager);
+ mRemovalSidecar.setListener(mRemovalListener);
+
+ RenameDeleteDialog renameDeleteDialog = (RenameDeleteDialog)getFragmentManager().
+ findFragmentByTag(RenameDeleteDialog.class.getName());
+ if (renameDeleteDialog != null) {
+ renameDeleteDialog.setDeleteInProgress(mRemovalSidecar.inProgress());
+ }
+
+ mFingerprintsRenaming = new HashMap<Integer, String>();
+
if (savedInstanceState != null) {
+ mFingerprintsRenaming = (HashMap<Integer, String>)
+ savedInstanceState.getSerializable("mFingerprintsRenaming");
mToken = savedInstanceState.getByteArray(
ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE_TOKEN);
mLaunchedConfirm = savedInstanceState.getBoolean(
@@ -287,9 +325,6 @@
mUserId = getActivity().getIntent().getIntExtra(
Intent.EXTRA_USER_ID, UserHandle.myUserId());
- Activity activity = getActivity();
- mFingerprintManager = Utils.getFingerprintManagerOrNull(activity);
-
// Need to authenticate a session token if none
if (mToken == null && mLaunchedConfirm == false) {
mLaunchedConfirm = true;
@@ -347,6 +382,12 @@
pref.setFingerprint(item);
pref.setPersistent(false);
pref.setIcon(R.drawable.ic_fingerprint_24dp);
+ if (mRemovalSidecar.isRemovingFingerprint(item.getFingerId())) {
+ pref.setEnabled(false);
+ }
+ if (mFingerprintsRenaming.containsKey(item.getFingerId())) {
+ pref.setTitle(mFingerprintsRenaming.get(item.getFingerId()));
+ }
root.addPreference(pref);
pref.setOnPreferenceChangeListener(this);
}
@@ -366,11 +407,14 @@
final int max = getContext().getResources().getInteger(
com.android.internal.R.integer.config_fingerprintMaxTemplatesPerUser);
boolean tooMany = mFingerprintManager.getEnrolledFingerprints(mUserId).size() >= max;
+ // retryFingerprint() will be called when remove finishes
+ // need to disable enroll or have a way to determine if enroll is in progress
+ final boolean removalInProgress = mRemovalSidecar.inProgress();
CharSequence maxSummary = tooMany ?
getContext().getString(R.string.fingerprint_add_max, max) : "";
Preference addPreference = findPreference(KEY_FINGERPRINT_ADD);
addPreference.setSummary(maxSummary);
- addPreference.setEnabled(!tooMany);
+ addPreference.setEnabled(!tooMany && !removalInProgress);
}
private static String genKey(int id) {
@@ -383,6 +427,9 @@
// Make sure we reload the preference hierarchy since fingerprints may be added,
// deleted or renamed.
updatePreferences();
+ if (mRemovalSidecar != null) {
+ mRemovalSidecar.setListener(mRemovalListener);
+ }
}
private void updatePreferences() {
@@ -394,6 +441,9 @@
public void onPause() {
super.onPause();
stopFingerprint();
+ if (mRemovalSidecar != null) {
+ mRemovalSidecar.setListener(null);
+ }
}
@Override
@@ -401,6 +451,7 @@
outState.putByteArray(ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE_TOKEN,
mToken);
outState.putBoolean(KEY_LAUNCHED_CONFIRM, mLaunchedConfirm);
+ outState.putSerializable("mFingerprintsRenaming", mFingerprintsRenaming);
}
@Override
@@ -415,7 +466,7 @@
startActivityForResult(intent, ADD_FINGERPRINT_REQUEST);
} else if (pref instanceof FingerprintPreference) {
FingerprintPreference fpref = (FingerprintPreference) pref;
- final Fingerprint fp =fpref.getFingerprint();
+ final Fingerprint fp = fpref.getFingerprint();
showRenameDeleteDialog(fp);
return super.onPreferenceTreeClick(pref);
}
@@ -425,7 +476,14 @@
private void showRenameDeleteDialog(final Fingerprint fp) {
RenameDeleteDialog renameDeleteDialog = new RenameDeleteDialog();
Bundle args = new Bundle();
- args.putParcelable("fingerprint", fp);
+ if (mFingerprintsRenaming.containsKey(fp.getFingerId())) {
+ final Fingerprint f = new Fingerprint(mFingerprintsRenaming.get(fp.getFingerId()),
+ fp.getGroupId(), fp.getFingerId(), fp.getDeviceId());
+ args.putParcelable("fingerprint", f);
+ } else {
+ args.putParcelable("fingerprint", fp);
+ }
+ renameDeleteDialog.setDeleteInProgress(mRemovalSidecar.inProgress());
renameDeleteDialog.setArguments(args);
renameDeleteDialog.setTargetFragment(this, 0);
renameDeleteDialog.show(getFragmentManager(), RenameDeleteDialog.class.getName());
@@ -537,11 +595,16 @@
}
private void deleteFingerPrint(Fingerprint fingerPrint) {
- mFingerprintManager.remove(fingerPrint, mUserId, mRemoveCallback);
+ mRemovalSidecar.startRemove(fingerPrint, mUserId);
+ String name = genKey(fingerPrint.getFingerId());
+ Preference prefToRemove = findPreference(name);
+ prefToRemove.setEnabled(false);
+ updateAddPreference();
}
private void renameFingerPrint(int fingerId, String newName) {
mFingerprintManager.rename(fingerId, mUserId, newName);
+ mFingerprintsRenaming.put(fingerId, newName);
updatePreferences();
}
@@ -561,7 +624,12 @@
private Boolean mTextHadFocus;
private int mTextSelectionStart;
private int mTextSelectionEnd;
+ private AlertDialog mAlertDialog;
+ private boolean mDeleteInProgress;
+ public void setDeleteInProgress(boolean deleteInProgress) {
+ mDeleteInProgress = deleteInProgress;
+ }
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
mFp = getArguments().getParcelable("fingerprint");
@@ -571,7 +639,7 @@
mTextSelectionStart = savedInstanceState.getInt("startSelection");
mTextSelectionEnd = savedInstanceState.getInt("endSelection");
}
- final AlertDialog alertDialog = new AlertDialog.Builder(getActivity())
+ mAlertDialog = new AlertDialog.Builder(getActivity())
.setView(R.layout.fingerprint_rename_dialog)
.setPositiveButton(R.string.security_settings_fingerprint_enroll_dialog_ok,
new DialogInterface.OnClickListener() {
@@ -605,10 +673,10 @@
}
})
.create();
- alertDialog.setOnShowListener(new DialogInterface.OnShowListener() {
+ mAlertDialog.setOnShowListener(new DialogInterface.OnShowListener() {
@Override
public void onShow(DialogInterface dialog) {
- mDialogTextField = (EditText) alertDialog.findViewById(
+ mDialogTextField = (EditText) mAlertDialog.findViewById(
R.id.fingerprint_rename_field);
CharSequence name = mFingerName == null ? mFp.getName() : mFingerName;
mDialogTextField.setText(name);
@@ -617,14 +685,24 @@
} else {
mDialogTextField.setSelection(mTextSelectionStart, mTextSelectionEnd);
}
+ if (mDeleteInProgress) {
+ mAlertDialog.getButton(AlertDialog.BUTTON_NEGATIVE).setEnabled(false);
+ }
}
});
if (mTextHadFocus == null || mTextHadFocus) {
// Request the IME
- alertDialog.getWindow().setSoftInputMode(
+ mAlertDialog.getWindow().setSoftInputMode(
WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
}
- return alertDialog;
+ return mAlertDialog;
+ }
+
+ public void enableDelete() {
+ mDeleteInProgress = false;
+ if (mAlertDialog != null) {
+ mAlertDialog.getButton(AlertDialog.BUTTON_NEGATIVE).setEnabled(true);
+ }
}
private void onDeleteClick(DialogInterface dialog) {
diff --git a/src/com/android/settings/fuelgauge/PowerUsageAdvanced.java b/src/com/android/settings/fuelgauge/PowerUsageAdvanced.java
index fe0cf4d..b341760 100644
--- a/src/com/android/settings/fuelgauge/PowerUsageAdvanced.java
+++ b/src/com/android/settings/fuelgauge/PowerUsageAdvanced.java
@@ -66,7 +66,8 @@
UsageType.USER,
UsageType.IDLE,
UsageType.APP,
- UsageType.UNACCOUNTED};
+ UsageType.UNACCOUNTED,
+ UsageType.OVERCOUNTED};
private BatteryHistoryPreference mHistPref;
private PreferenceGroup mUsageListGroup;
private PowerUsageFeatureProvider mPowerUsageFeatureProvider;
@@ -169,6 +170,9 @@
mUsageListGroup.removeAll();
for (int i = 0, size = dataList.size(); i < size; i++) {
final PowerUsageData batteryData = dataList.get(i);
+ if (shouldHide(batteryData)) {
+ continue;
+ }
final PowerGaugePreference pref = new PowerGaugePreference(getPrefContext());
pref.setKey(String.valueOf(batteryData.usageType));
@@ -199,6 +203,8 @@
return UsageType.CELL;
} else if (drainType == DrainType.UNACCOUNTED) {
return UsageType.UNACCOUNTED;
+ } else if (drainType == DrainType.OVERCOUNTED) {
+ return UsageType.OVERCOUNTED;
} else if (mPowerUsageFeatureProvider.isTypeSystem(sipper)) {
return UsageType.SYSTEM;
} else if (mPowerUsageFeatureProvider.isTypeService(sipper)) {
@@ -209,6 +215,16 @@
}
@VisibleForTesting
+ boolean shouldHide(PowerUsageData powerUsageData) {
+ if (powerUsageData.usageType == UsageType.UNACCOUNTED
+ || powerUsageData.usageType == UsageType.OVERCOUNTED) {
+ return true;
+ }
+
+ return false;
+ }
+
+ @VisibleForTesting
List<PowerUsageData> parsePowerUsageData(BatteryStatsHelper statusHelper) {
final List<BatterySipper> batterySippers = statusHelper.getUsageList();
final Map<Integer, PowerUsageData> batteryDataMap = new HashMap<>();
@@ -297,7 +313,8 @@
UsageType.BLUETOOTH,
UsageType.USER,
UsageType.IDLE,
- UsageType.UNACCOUNTED})
+ UsageType.UNACCOUNTED,
+ UsageType.OVERCOUNTED})
public @interface UsageType {
int APP = 0;
int WIFI = 1;
@@ -308,6 +325,7 @@
int USER = 6;
int IDLE = 7;
int UNACCOUNTED = 8;
+ int OVERCOUNTED = 9;
}
@StringRes
@@ -353,6 +371,8 @@
return R.string.power_idle;
case UsageType.UNACCOUNTED:
return R.string.power_unaccounted;
+ case UsageType.OVERCOUNTED:
+ return R.string.power_overcounted;
case UsageType.APP:
default:
return R.string.power_apps;
diff --git a/src/com/android/settings/fuelgauge/PowerUsageSummary.java b/src/com/android/settings/fuelgauge/PowerUsageSummary.java
index 2c1fd78..d9323db 100644
--- a/src/com/android/settings/fuelgauge/PowerUsageSummary.java
+++ b/src/com/android/settings/fuelgauge/PowerUsageSummary.java
@@ -599,6 +599,8 @@
|| drainType == DrainType.WIFI
|| drainType == DrainType.SCREEN
|| drainType == DrainType.BLUETOOTH
+ || drainType == DrainType.UNACCOUNTED
+ || drainType == DrainType.OVERCOUNTED
|| (sipper.totalPowerMah * SECONDS_IN_HOUR) < MIN_POWER_THRESHOLD_MILLI_AMP
|| mPowerFeatureProvider.isTypeService(sipper)
|| mPowerFeatureProvider.isTypeSystem(sipper);
@@ -625,7 +627,11 @@
final BatterySipper sipper = sippers.get(i);
if (shouldHideSipper(sipper)) {
sippers.remove(i);
- totalPowerMah += sipper.totalPowerMah;
+ if (sipper.drainType != DrainType.OVERCOUNTED
+ && sipper.drainType != DrainType.UNACCOUNTED) {
+ // Don't add it if it is overcounted or unaccounted
+ totalPowerMah += sipper.totalPowerMah;
+ }
}
}
diff --git a/src/com/android/settings/notification/LockScreenNotificationPreferenceController.java b/src/com/android/settings/notification/LockScreenNotificationPreferenceController.java
index a7ebbe1..547ff80 100644
--- a/src/com/android/settings/notification/LockScreenNotificationPreferenceController.java
+++ b/src/com/android/settings/notification/LockScreenNotificationPreferenceController.java
@@ -267,16 +267,20 @@
}
}
+ public int getSummaryResource() {
+ final boolean enabled = getLockscreenNotificationsEnabled(UserHandle.myUserId());
+ final boolean allowPrivate = !mSecure
+ || getLockscreenAllowPrivateNotifications(UserHandle.myUserId());
+ return !enabled ? R.string.lock_screen_notifications_summary_disable :
+ allowPrivate ? R.string.lock_screen_notifications_summary_show :
+ R.string.lock_screen_notifications_summary_hide;
+ }
+
private void updateLockscreenNotifications() {
if (mLockscreen == null) {
return;
}
- final boolean enabled = getLockscreenNotificationsEnabled(UserHandle.myUserId());
- final boolean allowPrivate = !mSecure
- || getLockscreenAllowPrivateNotifications(UserHandle.myUserId());
- mLockscreenSelectedValue = !enabled ? R.string.lock_screen_notifications_summary_disable :
- allowPrivate ? R.string.lock_screen_notifications_summary_show :
- R.string.lock_screen_notifications_summary_hide;
+ mLockscreenSelectedValue = getSummaryResource();
mLockscreen.setValue(Integer.toString(mLockscreenSelectedValue));
}
diff --git a/tests/robotests/src/com/android/settings/SecuritySettingsTest.java b/tests/robotests/src/com/android/settings/SecuritySettingsTest.java
index 91111a8..9bdf502 100644
--- a/tests/robotests/src/com/android/settings/SecuritySettingsTest.java
+++ b/tests/robotests/src/com/android/settings/SecuritySettingsTest.java
@@ -24,10 +24,12 @@
import android.os.Bundle;
import android.provider.Settings;
import android.support.v7.preference.Preference;
+import android.support.v7.preference.PreferenceGroup;
import android.support.v7.preference.PreferenceScreen;
import com.android.internal.widget.LockPatternUtils;
import com.android.settings.dashboard.SummaryLoader;
+import com.android.settings.notification.LockScreenNotificationPreferenceController;
import com.android.settings.testutils.FakeFeatureFactory;
import com.android.settings.testutils.shadow.ShadowSecureSettings;
import com.android.settingslib.drawer.DashboardCategory;
@@ -47,6 +49,7 @@
import org.robolectric.util.ReflectionHelpers;
import java.util.Map;
+import org.robolectric.util.ReflectionHelpers;
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Matchers.any;
@@ -186,4 +189,22 @@
verify(preference).setSummary(context.getResources().getQuantityString(
R.plurals.manage_trust_agents_summary_on, 2, 2));
}
+
+ @Test
+ public void testSetLockscreenPreferencesSummary_shouldSetSummaryFromLockScreenNotification() {
+ final Preference preference = mock(Preference.class);
+ final PreferenceGroup group = mock(PreferenceGroup.class);
+ when(group.findPreference(SecuritySettings.KEY_LOCKSCREEN_PREFERENCES))
+ .thenReturn(preference);
+ final LockScreenNotificationPreferenceController controller =
+ mock(LockScreenNotificationPreferenceController.class);
+
+ final SecuritySettings securitySettings = new SecuritySettings();
+ ReflectionHelpers.setField(securitySettings,
+ "mLockScreenNotificationPreferenceController", controller);
+
+ when(controller.getSummaryResource()).thenReturn(1234);
+ securitySettings.setLockscreenPreferencesSummary(group);
+ verify(preference).setSummary(1234);
+ }
}
diff --git a/tests/robotests/src/com/android/settings/deletionhelper/AutomaticStorageManagerSwitchBarControllerTest.java b/tests/robotests/src/com/android/settings/deletionhelper/AutomaticStorageManagerSwitchBarControllerTest.java
new file mode 100644
index 0000000..b4f5f3d
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/deletionhelper/AutomaticStorageManagerSwitchBarControllerTest.java
@@ -0,0 +1,124 @@
+/*
+ * 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.deletionhelper;
+
+import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+
+import android.app.Fragment;
+import android.app.FragmentManager;
+import android.content.Context;
+import android.support.v7.preference.Preference;
+
+import com.android.internal.logging.nano.MetricsProto;
+import com.android.settings.SettingsRobolectricTestRunner;
+import com.android.settings.TestConfig;
+import com.android.settings.core.instrumentation.MetricsFeatureProvider;
+import com.android.settings.overlay.FeatureFactory;
+import com.android.settings.testutils.FakeFeatureFactory;
+import com.android.settings.testutils.shadow.SettingsShadowSystemProperties;
+import com.android.settings.widget.SwitchBar;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Answers;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+
+@RunWith(SettingsRobolectricTestRunner.class)
+@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
+public class AutomaticStorageManagerSwitchBarControllerTest {
+ private Context mContext;
+ private SwitchBar mSwitchBar;
+ private MetricsFeatureProvider mMetricsFeatureProvider;
+ private Preference mPreference;
+
+ @Mock(answer = Answers.RETURNS_DEEP_STUBS)
+ private FragmentManager mFragmentManager;
+
+ private AutomaticStorageManagerSwitchBarController mController;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+
+ mContext = spy(RuntimeEnvironment.application);
+ mSwitchBar = new SwitchBar(mContext);
+
+ Context fakeContextForFakeProvider = mock(Context.class, RETURNS_DEEP_STUBS);
+ FeatureFactory featureFactory = FakeFeatureFactory.getFactory(fakeContextForFakeProvider);
+ mMetricsFeatureProvider = featureFactory.getMetricsFeatureProvider();
+ mPreference = new Preference(mContext);
+
+ mController =
+ new AutomaticStorageManagerSwitchBarController(
+ mContext,
+ mSwitchBar,
+ mMetricsFeatureProvider,
+ mPreference,
+ mFragmentManager);
+ }
+
+ @Test
+ public void onSwitchChanged_false_recordsAMetric() {
+ mController.onSwitchChanged(null, false);
+
+ verify(mMetricsFeatureProvider)
+ .action(
+ eq(mContext),
+ eq(MetricsProto.MetricsEvent.ACTION_TOGGLE_STORAGE_MANAGER),
+ eq(false));
+ }
+
+ @Test
+ public void onSwitchChanged_true_recordsAMetric() {
+ mController.onSwitchChanged(null, true);
+
+ verify(mMetricsFeatureProvider)
+ .action(
+ eq(mContext),
+ eq(MetricsProto.MetricsEvent.ACTION_TOGGLE_STORAGE_MANAGER),
+ eq(true));
+ }
+
+ @Test
+ public void onSwitchChanged_showWarningFragmentIfNotEnabledByDefault() {
+ mController.onSwitchChanged(null, true);
+
+ verify(mFragmentManager.beginTransaction())
+ .add(any(Fragment.class), eq(ActivationWarningFragment.TAG));
+ }
+
+ @Config(shadows = {SettingsShadowSystemProperties.class})
+ @Test
+ public void onSwitchChange_doNotShowWarningFragmentIfEnabledByDefault() {
+ SettingsShadowSystemProperties.set("ro.storage_manager.enabled", "true");
+
+ mController.onSwitchChanged(null, true);
+
+ verify(mFragmentManager.beginTransaction(), never())
+ .add(any(Fragment.class), eq(ActivationWarningFragment.TAG));
+ }
+}
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageAdvancedTest.java b/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageAdvancedTest.java
index 6ac6500..4216d57 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageAdvancedTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageAdvancedTest.java
@@ -207,7 +207,7 @@
assertThat(usageTypeSet).asList().containsExactly(UsageType.APP, UsageType.WIFI,
UsageType.CELL, UsageType.BLUETOOTH, UsageType.IDLE, UsageType.SERVICE,
- UsageType.USER, UsageType.SYSTEM, UsageType.UNACCOUNTED);
+ UsageType.USER, UsageType.SYSTEM, UsageType.UNACCOUNTED, UsageType.OVERCOUNTED);
}
@Test
@@ -223,4 +223,27 @@
assertThat(dataList.get(i - 1).totalPowerMah).isAtLeast(dataList.get(i).totalPowerMah);
}
}
+
+ @Test
+ public void testShouldHide_typeUnAccounted_returnTrue() {
+ mPowerUsageData.usageType = UsageType.UNACCOUNTED;
+
+ assertThat(mPowerUsageAdvanced.shouldHide(mPowerUsageData)).isTrue();
+ }
+
+
+ @Test
+ public void testShouldHide_typeOverCounted_returnTrue() {
+ mPowerUsageData.usageType = UsageType.OVERCOUNTED;
+
+ assertThat(mPowerUsageAdvanced.shouldHide(mPowerUsageData)).isTrue();
+ }
+
+
+ @Test
+ public void testShouldHide_typeNormal_returnFalse() {
+ mPowerUsageData.usageType = UsageType.APP;
+
+ assertThat(mPowerUsageAdvanced.shouldHide(mPowerUsageData)).isFalse();
+ }
}
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageSummaryTest.java b/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageSummaryTest.java
index 5f2d54f..7f59b18 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageSummaryTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageSummaryTest.java
@@ -90,6 +90,7 @@
private static final double TOTAL_POWER = 200;
private static final double BATTERY_SCREEN_USAGE = 300;
private static final double BATTERY_SYSTEM_USAGE = 600;
+ private static final double BATTERY_OVERCOUNTED_USAGE = 500;
private static final double PRECISION = 0.001;
private static final double POWER_USAGE_PERCENTAGE = 50;
private static final Intent ADDITIONAL_BATTERY_INFO_INTENT =
@@ -112,6 +113,8 @@
@Mock
private BatterySipper mScreenBatterySipper;
@Mock
+ private BatterySipper mOvercountedBatterySipper;
+ @Mock
private BatterySipper mSystemBatterySipper;
@Mock
private BatterySipper mCellBatterySipper;
@@ -188,6 +191,9 @@
mSystemBatterySipper.totalPowerMah = BATTERY_SYSTEM_USAGE;
when(mSystemBatterySipper.getUid()).thenReturn(Process.SYSTEM_UID);
+ mOvercountedBatterySipper.drainType = BatterySipper.DrainType.OVERCOUNTED;
+ mOvercountedBatterySipper.totalPowerMah = BATTERY_OVERCOUNTED_USAGE;
+
mUsageList = new ArrayList<>();
mUsageList.add(mNormalBatterySipper);
mUsageList.add(mScreenBatterySipper);
@@ -303,6 +309,7 @@
sippers.add(mNormalBatterySipper);
sippers.add(mScreenBatterySipper);
sippers.add(mSystemBatterySipper);
+ sippers.add(mOvercountedBatterySipper);
when(mFeatureFactory.powerUsageFeatureProvider.isTypeSystem(mSystemBatterySipper))
.thenReturn(true);
@@ -318,6 +325,18 @@
}
@Test
+ public void testShouldHideSipper_TypeUnAccounted_ReturnTrue() {
+ mNormalBatterySipper.drainType = BatterySipper.DrainType.UNACCOUNTED;
+ assertThat(mFragment.shouldHideSipper(mNormalBatterySipper)).isTrue();
+ }
+
+ @Test
+ public void testShouldHideSipper_TypeOverCounted_ReturnTrue() {
+ mNormalBatterySipper.drainType = BatterySipper.DrainType.OVERCOUNTED;
+ assertThat(mFragment.shouldHideSipper(mNormalBatterySipper)).isTrue();
+ }
+
+ @Test
public void testShouldHideSipper_typeWifi_returnTrue() {
mNormalBatterySipper.drainType = BatterySipper.DrainType.WIFI;
assertThat(mFragment.shouldHideSipper(mNormalBatterySipper)).isTrue();