From 790dcdcd96591abe2dd59c240149a202fde46406 Mon Sep 17 00:00:00 2001 From: Sundeep Ghuman Date: Fri, 2 Feb 2018 16:46:32 -0800 Subject: [PATCH 01/13] Modify logging in WifiSettings. This now respects both the Log tag setting and the developer options toggle. Bug: NA Test: NA Change-Id: I444b00cb35a61d8779cc46c90b33e611d5b0ac06 --- src/com/android/settings/wifi/WifiSettings.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/com/android/settings/wifi/WifiSettings.java b/src/com/android/settings/wifi/WifiSettings.java index 22f8c43f237..ab873dd685c 100644 --- a/src/com/android/settings/wifi/WifiSettings.java +++ b/src/com/android/settings/wifi/WifiSettings.java @@ -109,6 +109,10 @@ public class WifiSettings extends RestrictedSettingsFragment private static final String PREF_KEY_CONFIGURE_WIFI_SETTINGS = "configure_settings"; private static final String PREF_KEY_SAVED_NETWORKS = "saved_networks"; + private static boolean isVerboseLoggingEnabled() { + return WifiTracker.sVerboseLogging || Log.isLoggable(TAG, Log.VERBOSE); + } + private final Runnable mUpdateAccessPointsRunnable = () -> { updateAccessPointPreferences(); }; @@ -371,7 +375,7 @@ public class WifiSettings extends RestrictedSettingsFragment } setProgressBarVisible(true); mWifiTracker.forceUpdate(); - if (WifiTracker.sVerboseLogging) { + if (isVerboseLoggingEnabled()) { Log.i(TAG, "WifiSettings force update APs: " + mWifiTracker.getAccessPoints()); } getView().removeCallbacks(mUpdateAccessPointsRunnable); @@ -762,7 +766,7 @@ public class WifiSettings extends RestrictedSettingsFragment } // AccessPoints are sorted by the WifiTracker final List accessPoints = mWifiTracker.getAccessPoints(); - if (WifiTracker.sVerboseLogging) { + if (isVerboseLoggingEnabled()) { Log.i(TAG, "updateAccessPoints called for: " + accessPoints); } From 1a0d4428ba7a58bf13d1bd665996cea8ca675754 Mon Sep 17 00:00:00 2001 From: Antony Sargent Date: Tue, 6 Feb 2018 15:49:12 -0800 Subject: [PATCH 02/13] Call super.onDestroy in ResetNetworkConfirm fragment Test: monkey tests Change-Id: I0ca8d0296db20a48e318391ef111cada8109e13b Fixes: 72999943 --- src/com/android/settings/ResetNetworkConfirm.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/com/android/settings/ResetNetworkConfirm.java b/src/com/android/settings/ResetNetworkConfirm.java index 78e83394101..8d6700cd11e 100644 --- a/src/com/android/settings/ResetNetworkConfirm.java +++ b/src/com/android/settings/ResetNetworkConfirm.java @@ -225,6 +225,7 @@ public class ResetNetworkConfirm extends InstrumentedFragment { mEraseEsimTask.cancel(true /* mayInterruptIfRunning */); mEraseEsimTask = null; } + super.onDestroy(); } @Override From 6cdb07862a33bcac2645fffdd976a2461a576ae9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?tiansiming=20=5B=E7=94=B0=E6=80=9D=E6=98=8E=5D?= Date: Sun, 4 Feb 2018 20:45:42 +0800 Subject: [PATCH 03/13] Fix NPE in AutoSyncWorkDataPreferenceController MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit AutoSyncWorkDataPreferenceController gets mUserHandle from Utils.getManagedProfileWithDisabled which may return null, crash will happend when updateState called. So a judgement here seems helpful to make the program more robust. Bug: https://partnerissuetracker.corp.google.com/u/1/issues/72908879 Test: make ROBOTEST_FILTER="(AutoSyncWorkDataPreferenceControllerTest)" RunSettingsRoboTests Change-Id: I53ca027a2f2dd79655cc2eee67db236cfa03f656 Signed-off-by: tiansiming [田思明] --- .../AutoSyncWorkDataPreferenceController.java | 7 +++++++ .../AutoSyncWorkDataPreferenceControllerTest.java | 15 +++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/src/com/android/settings/accounts/AutoSyncWorkDataPreferenceController.java b/src/com/android/settings/accounts/AutoSyncWorkDataPreferenceController.java index acf43aa635b..712dbb7ecfa 100644 --- a/src/com/android/settings/accounts/AutoSyncWorkDataPreferenceController.java +++ b/src/com/android/settings/accounts/AutoSyncWorkDataPreferenceController.java @@ -17,6 +17,7 @@ package com.android.settings.accounts; import android.app.Fragment; import android.content.Context; +import android.os.UserHandle; import com.android.settings.Utils; @@ -34,4 +35,10 @@ public class AutoSyncWorkDataPreferenceController extends AutoSyncPersonalDataPr public String getPreferenceKey() { return KEY_AUTO_SYNC_WORK_ACCOUNT; } + + @Override + public boolean isAvailable() { + return mUserHandle != null && !mUserManager.isManagedProfile() && !mUserManager.isLinkedUser() + && mUserManager.getProfiles(UserHandle.myUserId()).size() > 1; + } } diff --git a/tests/robotests/src/com/android/settings/accounts/AutoSyncWorkDataPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/accounts/AutoSyncWorkDataPreferenceControllerTest.java index a25aa281a01..4857120034f 100644 --- a/tests/robotests/src/com/android/settings/accounts/AutoSyncWorkDataPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/accounts/AutoSyncWorkDataPreferenceControllerTest.java @@ -91,6 +91,21 @@ public class AutoSyncWorkDataPreferenceControllerTest { assertThat(mController.isAvailable()).isFalse(); } + @Test + public void checkIsAvailable_null_workProfileUserHandle_shouldNotDisplay() { + when(mUserManager.isManagedProfile()).thenReturn(false); + when(mUserManager.isLinkedUser()).thenReturn(false); + + final List infos = new ArrayList<>(); + infos.add(new UserInfo(UserHandle.USER_SYSTEM, "user 1", 0 /* flags */)); + infos.add(new UserInfo(999, "xspace", 800010)); + when(mUserManager.getProfiles(eq(UserHandle.USER_SYSTEM))).thenReturn(infos); + mController = new AutoSyncWorkDataPreferenceController(mContext, mFragment); + + assertThat(mController.mUserHandle).isEqualTo(null); + assertThat(mController.isAvailable()).isFalse(); + } + @Test public void multipleProfile_shouldInitWithWorkProfileUserHandle() { when(mUserManager.isManagedProfile()).thenReturn(false); From 0d2fcea68837613bb1b554b05c00a33102e59e8f Mon Sep 17 00:00:00 2001 From: Beverly Date: Wed, 7 Feb 2018 09:23:54 -0500 Subject: [PATCH 04/13] Change character limit for condition_zen_title Change-Id: I187e859bd010a746acea8953be88687df8758a54 Fixes: 73018789 Test: n/a --- res/values/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/res/values/strings.xml b/res/values/strings.xml index 4b2c67344dc..15fa19bb8fd 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -8428,7 +8428,7 @@ Wi-Fi, Bluetooth, and mobile network are turned off. You can\'t make phone calls or connect to the internet. - + Do Not Disturb is on From 826e6c4b9a8ffc8bec048354ad8d2a5572af2a3f Mon Sep 17 00:00:00 2001 From: Julia Reynolds Date: Wed, 7 Feb 2018 10:42:00 -0500 Subject: [PATCH 05/13] Notification lock screen setting updates - String update - Don't show 'hide notifications' option at app/channel level if 'don't show' is selected globally Test: SettingsRoboTests Change-Id: I180b91019183865aa0f4f6adce917ebe7211dbb5 Fixes: 72833828 Fixes: 72651566 --- res/values/strings.xml | 8 ++--- .../VisibilityPreferenceController.java | 19 ++++++----- .../VisibilityPreferenceControllerTest.java | 34 +++++++++++-------- 3 files changed, 35 insertions(+), 26 deletions(-) diff --git a/res/values/strings.xml b/res/values/strings.xml index 35bc32eedd9..0e7b0b99e93 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -7083,7 +7083,7 @@ Blink light - On the lock screen + On lock screen - Hide sensitive notification content + Hide sensitive content @@ -7113,7 +7113,7 @@ - Hide sensitive work notification content + Hide sensitive work content @@ -7373,7 +7373,7 @@ Let these notifications continue to interrupt when Do Not Disturb is set to Priority Only - On the lock screen + On lock screen Blocked diff --git a/src/com/android/settings/notification/VisibilityPreferenceController.java b/src/com/android/settings/notification/VisibilityPreferenceController.java index 62ca183ccc4..dac90ef7be7 100644 --- a/src/com/android/settings/notification/VisibilityPreferenceController.java +++ b/src/com/android/settings/notification/VisibilityPreferenceController.java @@ -84,14 +84,17 @@ public class VisibilityPreferenceController extends NotificationPreferenceContro | DevicePolicyManager.KEYGUARD_DISABLE_UNREDACTED_NOTIFICATIONS); } - final String summaryHideEntry = - mContext.getString(R.string.lock_screen_notifications_summary_hide); - final String summaryHideEntryValue = Integer.toString(Notification.VISIBILITY_PRIVATE); - entries.add(summaryHideEntry); - values.add(summaryHideEntryValue); - setRestrictedIfNotificationFeaturesDisabled(pref, - summaryHideEntry, summaryHideEntryValue, - DevicePolicyManager.KEYGUARD_DISABLE_SECURE_NOTIFICATIONS); + if (getLockscreenNotificationsEnabled()) { + final String summaryHideEntry = + mContext.getString(R.string.lock_screen_notifications_summary_hide); + final String summaryHideEntryValue = Integer.toString( + Notification.VISIBILITY_PRIVATE); + entries.add(summaryHideEntry); + values.add(summaryHideEntryValue); + setRestrictedIfNotificationFeaturesDisabled(pref, + summaryHideEntry, summaryHideEntryValue, + DevicePolicyManager.KEYGUARD_DISABLE_SECURE_NOTIFICATIONS); + } entries.add(mContext.getString(R.string.lock_screen_notifications_summary_disable)); values.add(Integer.toString(Notification.VISIBILITY_SECRET)); pref.setEntries(entries.toArray(new CharSequence[entries.size()])); diff --git a/tests/robotests/src/com/android/settings/notification/VisibilityPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/VisibilityPreferenceControllerTest.java index 25dba80ef1c..d3863db4653 100644 --- a/tests/robotests/src/com/android/settings/notification/VisibilityPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/notification/VisibilityPreferenceControllerTest.java @@ -16,6 +16,7 @@ package com.android.settings.notification; +import static android.app.Notification.VISIBILITY_PRIVATE; import static android.app.NotificationChannel.DEFAULT_CHANNEL_ID; import static android.app.NotificationManager.IMPORTANCE_DEFAULT; import static android.app.NotificationManager.IMPORTANCE_MIN; @@ -114,14 +115,14 @@ public class VisibilityPreferenceControllerTest { } @Test - public void testNoCrashIfNoOnResume() throws Exception { + public void testNoCrashIfNoOnResume() { mController.isAvailable(); mController.updateState(mock(RestrictedListPreference.class)); mController.onPreferenceChange(mock(RestrictedListPreference.class), true); } @Test - public void testIsAvailable_notSecure() throws Exception { + public void testIsAvailable_notSecure() { when(mLockUtils.isSecure(anyInt())).thenReturn(false); NotificationBackend.AppRow appRow = new NotificationBackend.AppRow(); NotificationChannel channel = new NotificationChannel("", "", IMPORTANCE_DEFAULT); @@ -130,7 +131,7 @@ public class VisibilityPreferenceControllerTest { } @Test - public void testIsAvailable_notIfNotImportant() throws Exception { + public void testIsAvailable_notIfNotImportant() { NotificationBackend.AppRow appRow = new NotificationBackend.AppRow(); NotificationChannel channel = new NotificationChannel("", "", IMPORTANCE_MIN); mController.onResume(appRow, channel, null, null); @@ -138,7 +139,7 @@ public class VisibilityPreferenceControllerTest { } @Test - public void testIsAvailable() throws Exception { + public void testIsAvailable() { NotificationBackend.AppRow appRow = new NotificationBackend.AppRow(); NotificationChannel channel = new NotificationChannel(DEFAULT_CHANNEL_ID, "", IMPORTANCE_DEFAULT); @@ -151,7 +152,7 @@ public class VisibilityPreferenceControllerTest { } @Test - public void testUpdateState_disabledByAdmin_disableSecure() throws Exception { + public void testUpdateState_disabledByAdmin_disableSecure() { ShadowRestrictionUtils.setRestricted(true); UserInfo userInfo = new UserInfo(2, "user 2", UserInfo.FLAG_MANAGED_PROFILE); when(mUm.getUserInfo(anyInt())).thenReturn(userInfo); @@ -173,7 +174,7 @@ public class VisibilityPreferenceControllerTest { } @Test - public void testUpdateState_disabledByAdmin_disableUnredacted() throws Exception { + public void testUpdateState_disabledByAdmin_disableUnredacted() { ShadowRestrictionUtils.setRestricted(true); UserInfo userInfo = new UserInfo(2, "user 2", UserInfo.FLAG_MANAGED_PROFILE); when(mUm.getUserInfo(anyInt())).thenReturn(userInfo); @@ -195,7 +196,7 @@ public class VisibilityPreferenceControllerTest { } @Test - public void testUpdateState_noLockScreenNotificationsGlobally() throws Exception { + public void testUpdateState_noLockScreenNotificationsGlobally() { Settings.Secure.putInt(mContext.getContentResolver(), Settings.Secure.LOCK_SCREEN_SHOW_NOTIFICATIONS, 0); @@ -211,10 +212,14 @@ public class VisibilityPreferenceControllerTest { verify(pref, times(1)).setEntryValues(argumentCaptor.capture()); assertFalse(toStringList(argumentCaptor.getValue()) .contains(String.valueOf(VISIBILITY_NO_OVERRIDE))); + assertFalse(toStringList(argumentCaptor.getValue()) + .contains(String.valueOf(VISIBILITY_PRIVATE))); } @Test - public void testUpdateState_noPrivateLockScreenNotificationsGlobally() throws Exception { + public void testUpdateState_noPrivateLockScreenNotificationsGlobally() { + Settings.Secure.putInt(mContext.getContentResolver(), + Settings.Secure.LOCK_SCREEN_SHOW_NOTIFICATIONS, 1); Settings.Secure.putInt(mContext.getContentResolver(), Settings.Secure.LOCK_SCREEN_ALLOW_PRIVATE_NOTIFICATIONS, 0); @@ -228,12 +233,13 @@ public class VisibilityPreferenceControllerTest { ArgumentCaptor argumentCaptor = ArgumentCaptor.forClass(CharSequence[].class); verify(pref, times(1)).setEntryValues(argumentCaptor.capture()); + assertEquals(2, toStringList(argumentCaptor.getValue()).size()); assertFalse(toStringList(argumentCaptor.getValue()) .contains(String.valueOf(VISIBILITY_NO_OVERRIDE))); } @Test - public void testUpdateState_noGlobalRestriction() throws Exception { + public void testUpdateState_noGlobalRestriction() { NotificationBackend.AppRow appRow = new NotificationBackend.AppRow(); NotificationChannel channel = mock(NotificationChannel.class); mController.onResume(appRow, channel, null, null); @@ -247,7 +253,7 @@ public class VisibilityPreferenceControllerTest { List values = toStringList(argumentCaptor.getValue()); assertEquals(3, values.size()); assertTrue(values.contains(String.valueOf(VISIBILITY_NO_OVERRIDE))); - assertTrue(values.contains(String.valueOf(Notification.VISIBILITY_PRIVATE))); + assertTrue(values.contains(String.valueOf(VISIBILITY_PRIVATE))); assertTrue(values.contains(String.valueOf(Notification.VISIBILITY_SECRET))); } @@ -260,7 +266,7 @@ public class VisibilityPreferenceControllerTest { } @Test - public void testUpdateState_noChannelOverride() throws Exception { + public void testUpdateState_noChannelOverride() { Settings.Secure.putInt(mContext.getContentResolver(), Settings.Secure.LOCK_SCREEN_ALLOW_PRIVATE_NOTIFICATIONS, 0); @@ -275,11 +281,11 @@ public class VisibilityPreferenceControllerTest { ArgumentCaptor argumentCaptor = ArgumentCaptor.forClass(String.class); verify(pref, times(1)).setValue(argumentCaptor.capture()); - assertEquals(String.valueOf(Notification.VISIBILITY_PRIVATE), argumentCaptor.getValue()); + assertEquals(String.valueOf(VISIBILITY_PRIVATE), argumentCaptor.getValue()); } @Test - public void testUpdateState_channelOverride() throws Exception { + public void testUpdateState_channelOverride() { Settings.Secure.putInt(mContext.getContentResolver(), Settings.Secure.LOCK_SCREEN_ALLOW_PRIVATE_NOTIFICATIONS, 0); @@ -310,7 +316,7 @@ public class VisibilityPreferenceControllerTest { RestrictedListPreference pref = mock(RestrictedListPreference.class); mController.updateState(pref); - mController.onPreferenceChange(pref, String.valueOf(Notification.VISIBILITY_PRIVATE)); + mController.onPreferenceChange(pref, String.valueOf(VISIBILITY_PRIVATE)); assertEquals(VISIBILITY_NO_OVERRIDE, channel.getLockscreenVisibility()); verify(mBackend, times(1)).updateChannel(any(), anyInt(), any()); From f11c8857665cfa0599f96b7b08055302aa3d197f Mon Sep 17 00:00:00 2001 From: Fan Zhang Date: Tue, 6 Feb 2018 14:21:01 -0800 Subject: [PATCH 06/13] Pre-fixup for nav up button - Remove SettingsDrawerActivity.EXTRA_SHOW_MENU and force up nav button to always show. The button doesn't do anything yet. It just finishes current activity. - Remove dead code about suggestions Change-Id: I61fa9fefbaa9bced841a05969544b1c824c564ce Bug: 72337421 Test: rebuild --- .../android/settings/SettingsActivity.java | 112 +++++------------- .../settings/backup/BackupSettingsHelper.java | 8 +- .../DashboardFeatureProviderImpl.java | 4 - .../settings/deviceinfo/StorageSettings.java | 1 - .../storage/UserProfileController.java | 1 - .../settings/SettingsActivityTest.java | 16 --- .../backup/BackupSettingsHelperTest.java | 27 ++--- 7 files changed, 44 insertions(+), 125 deletions(-) diff --git a/src/com/android/settings/SettingsActivity.java b/src/com/android/settings/SettingsActivity.java index 01818e99313..7328c76497b 100644 --- a/src/com/android/settings/SettingsActivity.java +++ b/src/com/android/settings/SettingsActivity.java @@ -82,8 +82,6 @@ public class SettingsActivity extends SettingsDrawerActivity // Constants for state save/restore private static final String SAVE_KEY_CATEGORIES = ":settings:categories"; - @VisibleForTesting - static final String SAVE_KEY_SHOW_HOME_AS_UP = ":settings:show_home_as_up"; /** * When starting this activity, the invoking Intent can contain this extra @@ -146,12 +144,10 @@ public class SettingsActivity extends SettingsDrawerActivity public static final String EXTRA_HIDE_DRAWER = ":settings:hide_drawer"; public static final String META_DATA_KEY_FRAGMENT_CLASS = - "com.android.settings.FRAGMENT_CLASS"; + "com.android.settings.FRAGMENT_CLASS"; private static final String EXTRA_UI_OPTIONS = "settings:ui_options"; - private static final int REQUEST_SUGGESTION = 42; - private String mFragmentClass; private CharSequence mInitialTitle; @@ -183,9 +179,6 @@ public class SettingsActivity extends SettingsDrawerActivity private Button mNextButton; - @VisibleForTesting - boolean mDisplayHomeAsUpEnabled; - private boolean mIsShowingDashboard; private boolean mIsShortcut; @@ -197,7 +190,6 @@ public class SettingsActivity extends SettingsDrawerActivity private ArrayList mCategories = new ArrayList<>(); private DashboardFeatureProvider mDashboardFeatureProvider; - private ComponentName mCurrentSuggestion; public SwitchBar getSwitchBar() { return mSwitchBar; @@ -310,9 +302,6 @@ public class SettingsActivity extends SettingsDrawerActivity mCategories.addAll(categories); setTitleFromBackStack(); } - - mDisplayHomeAsUpEnabled = savedState.getBoolean(SAVE_KEY_SHOW_HOME_AS_UP); - } else { launchSettingFragment(initialFragmentName, isSubSettings, intent); } @@ -337,8 +326,8 @@ public class SettingsActivity extends SettingsDrawerActivity ActionBar actionBar = getActionBar(); if (actionBar != null) { - actionBar.setDisplayHomeAsUpEnabled(mDisplayHomeAsUpEnabled); - actionBar.setHomeButtonEnabled(mDisplayHomeAsUpEnabled); + actionBar.setDisplayHomeAsUpEnabled(true); + actionBar.setHomeButtonEnabled(true); actionBar.setDisplayShowTitleEnabled(!mIsShowingDashboard); } mSwitchBar = findViewById(R.id.switch_bar); @@ -353,21 +342,21 @@ public class SettingsActivity extends SettingsDrawerActivity if (buttonBar != null) { buttonBar.setVisibility(View.VISIBLE); - Button backButton = (Button)findViewById(R.id.back_button); + Button backButton = (Button) findViewById(R.id.back_button); backButton.setOnClickListener(new OnClickListener() { public void onClick(View v) { setResult(RESULT_CANCELED, null); finish(); } }); - Button skipButton = (Button)findViewById(R.id.skip_button); + Button skipButton = (Button) findViewById(R.id.skip_button); skipButton.setOnClickListener(new OnClickListener() { public void onClick(View v) { setResult(RESULT_OK, null); finish(); } }); - mNextButton = (Button)findViewById(R.id.next_button); + mNextButton = (Button) findViewById(R.id.next_button); mNextButton.setOnClickListener(new OnClickListener() { public void onClick(View v) { setResult(RESULT_OK, null); @@ -380,8 +369,7 @@ public class SettingsActivity extends SettingsDrawerActivity String buttonText = intent.getStringExtra(EXTRA_PREFS_SET_NEXT_TEXT); if (TextUtils.isEmpty(buttonText)) { mNextButton.setVisibility(View.GONE); - } - else { + } else { mNextButton.setText(buttonText); } } @@ -389,8 +377,7 @@ public class SettingsActivity extends SettingsDrawerActivity String buttonText = intent.getStringExtra(EXTRA_PREFS_SET_BACK_TEXT); if (TextUtils.isEmpty(buttonText)) { backButton.setVisibility(View.GONE); - } - else { + } else { backButton.setText(buttonText); } } @@ -408,26 +395,17 @@ public class SettingsActivity extends SettingsDrawerActivity @VisibleForTesting void launchSettingFragment(String initialFragmentName, boolean isSubSettings, Intent intent) { if (!mIsShowingDashboard && initialFragmentName != null) { - // UP will be shown only if it is a sub settings - if (mIsShortcut) { - mDisplayHomeAsUpEnabled = isSubSettings; - } else if (isSubSettings) { - mDisplayHomeAsUpEnabled = true; - } else { - mDisplayHomeAsUpEnabled = false; - } setTitleFromIntent(intent); Bundle initialArguments = intent.getBundleExtra(EXTRA_SHOW_FRAGMENT_ARGUMENTS); switchToFragment(initialFragmentName, initialArguments, true, false, - mInitialTitleResId, mInitialTitle, false); + mInitialTitleResId, mInitialTitle, false); } else { // Show search icon as up affordance if we are displaying the main Dashboard - mDisplayHomeAsUpEnabled = true; mInitialTitleResId = R.string.dashboard_title; switchToFragment(DashboardSummary.class.getName(), null /* args */, false, false, - mInitialTitleResId, mInitialTitle, false); + mInitialTitleResId, mInitialTitle, false); } } @@ -509,15 +487,6 @@ public class SettingsActivity extends SettingsDrawerActivity if (mCategories.size() > 0) { outState.putParcelableArrayList(SAVE_KEY_CATEGORIES, mCategories); } - - outState.putBoolean(SAVE_KEY_SHOW_HOME_AS_UP, mDisplayHomeAsUpEnabled); - } - - @Override - protected void onRestoreInstanceState(Bundle savedInstanceState) { - super.onRestoreInstanceState(savedInstanceState); - - mDisplayHomeAsUpEnabled = savedInstanceState.getBoolean(SAVE_KEY_SHOW_HOME_AS_UP); } @Override @@ -610,17 +579,17 @@ public class SettingsActivity extends SettingsDrawerActivity * single-pane mode, a new activity will be launched in which to show the * fragment. * - * @param fragmentClass Full name of the class implementing the fragment. - * @param args Any desired arguments to supply to the fragment. - * @param titleRes Optional resource identifier of the title of this - * fragment. - * @param titleText Optional text of the title of this fragment. - * @param resultTo Optional fragment that result data should be sent to. - * If non-null, resultTo.onActivityResult() will be called when this - * preference panel is done. The launched panel must use - * {@link #finishPreferencePanel(Fragment, int, Intent)} when done. + * @param fragmentClass Full name of the class implementing the fragment. + * @param args Any desired arguments to supply to the fragment. + * @param titleRes Optional resource identifier of the title of this + * fragment. + * @param titleText Optional text of the title of this fragment. + * @param resultTo Optional fragment that result data should be sent to. + * If non-null, resultTo.onActivityResult() will be called when this + * preference panel is done. The launched panel must use + * {@link #finishPreferencePanel(Fragment, int, Intent)} when done. * @param resultRequestCode If resultTo is non-null, this is the caller's - * request code to be received with the result. + * request code to be received with the result. */ public void startPreferencePanel(Fragment caller, String fragmentClass, Bundle args, int titleRes, CharSequence titleText, Fragment resultTo, int resultRequestCode) { @@ -639,10 +608,10 @@ public class SettingsActivity extends SettingsDrawerActivity * activity will be launched in which to show the fragment. * * @param fragmentClass Full name of the class implementing the fragment. - * @param args Any desired arguments to supply to the fragment. - * @param titleRes Optional resource identifier of the title of this fragment. - * @param titleText Optional text of the title of this fragment. - * @param userHandle The user for which the panel has to be started. + * @param args Any desired arguments to supply to the fragment. + * @param titleRes Optional resource identifier of the title of this fragment. + * @param titleText Optional text of the title of this fragment. + * @param userHandle The user for which the panel has to be started. */ public void startPreferencePanelAsUser(Fragment caller, String fragmentClass, Bundle args, int titleRes, CharSequence titleText, UserHandle userHandle) { @@ -676,11 +645,11 @@ public class SettingsActivity extends SettingsDrawerActivity /** * Called by a preference panel fragment to finish itself. * - * @param caller The fragment that is asking to be finished. + * @param caller The fragment that is asking to be finished. * @param resultCode Optional result code to send back to the original - * launching fragment. + * launching fragment. * @param resultData Optional result data to send back to the original - * launching fragment. + * launching fragment. */ public void finishPreferencePanel(Fragment caller, int resultCode, Intent resultData) { setResult(resultCode, resultData); @@ -691,8 +660,8 @@ public class SettingsActivity extends SettingsDrawerActivity * Start a new fragment. * * @param fragment The fragment to start - * @param push If true, the current fragment will be pushed onto the back stack. If false, - * the current fragment will be replaced. + * @param push If true, the current fragment will be pushed onto the back stack. If false, + * the current fragment will be replaced. */ public void startPreferenceFragment(Fragment fragment, boolean push) { FragmentTransaction transaction = getFragmentManager().beginTransaction(); @@ -940,29 +909,6 @@ public class SettingsActivity extends SettingsDrawerActivity return mNextButton; } - @Override - public boolean shouldUpRecreateTask(Intent targetIntent) { - return super.shouldUpRecreateTask(new Intent(this, SettingsActivity.class)); - } - - public void startSuggestion(Intent intent) { - if (intent == null || ActivityManager.isUserAMonkey()) { - return; - } - mCurrentSuggestion = intent.getComponent(); - startActivityForResult(intent, REQUEST_SUGGESTION); - } - - @Override - protected void onActivityResult(int requestCode, int resultCode, Intent data) { - if (requestCode == REQUEST_SUGGESTION && mCurrentSuggestion != null - && resultCode != RESULT_CANCELED) { - getPackageManager().setComponentEnabledSetting(mCurrentSuggestion, - PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP); - } - super.onActivityResult(requestCode, resultCode, data); - } - @VisibleForTesting Bitmap getBitmapFromXmlResource(int drawableRes) { Drawable drawable = getResources().getDrawable(drawableRes, getTheme()); diff --git a/src/com/android/settings/backup/BackupSettingsHelper.java b/src/com/android/settings/backup/BackupSettingsHelper.java index b0d6cf88678..d0a029c355e 100644 --- a/src/com/android/settings/backup/BackupSettingsHelper.java +++ b/src/com/android/settings/backup/BackupSettingsHelper.java @@ -24,13 +24,12 @@ import android.content.Intent; import android.os.RemoteException; import android.os.ServiceManager; import android.os.UserHandle; -import android.util.Log; - import android.support.annotation.VisibleForTesting; +import android.util.Log; import com.android.settings.R; import com.android.settings.Settings.PrivacySettingsActivity; -import com.android.settingslib.drawer.SettingsDrawerActivity; + import java.net.URISyntaxException; /** @@ -153,8 +152,7 @@ public class BackupSettingsHelper { private Intent getIntentForDefaultBackupSettings() { // Extra needed by {@link SettingsDrawerActivity} to show the back button navigation. - return new Intent(mContext, PrivacySettingsActivity.class) - .putExtra(SettingsDrawerActivity.EXTRA_SHOW_MENU, true); + return new Intent(mContext, PrivacySettingsActivity.class); } /** diff --git a/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java b/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java index 086a131a9c8..3ed76d8dd52 100644 --- a/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java +++ b/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java @@ -33,21 +33,18 @@ import android.support.annotation.VisibleForTesting; import android.support.v7.preference.Preference; import android.text.TextUtils; import android.util.ArrayMap; -import android.util.FeatureFlagUtils; import android.util.Log; import android.util.Pair; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.settings.R; import com.android.settings.SettingsActivity; -import com.android.settings.core.FeatureFlags; import com.android.settings.overlay.FeatureFactory; import com.android.settingslib.core.instrumentation.MetricsFeatureProvider; import com.android.settingslib.core.instrumentation.VisibilityLoggerMixin; import com.android.settingslib.drawer.CategoryManager; import com.android.settingslib.drawer.DashboardCategory; import com.android.settingslib.drawer.ProfileSelectDialog; -import com.android.settingslib.drawer.SettingsDrawerActivity; import com.android.settingslib.drawer.Tile; import com.android.settingslib.drawer.TileUtils; import com.android.settingslib.utils.ThreadUtils; @@ -212,7 +209,6 @@ public class DashboardFeatureProviderImpl implements DashboardFeatureProvider { final Intent intent = new Intent(tile.intent) .putExtra(VisibilityLoggerMixin.EXTRA_SOURCE_METRICS_CATEGORY, MetricsEvent.DASHBOARD_SUMMARY) - .putExtra(SettingsDrawerActivity.EXTRA_SHOW_MENU, true) .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK); launchIntentOrSelectProfile(activity, tile, intent, MetricsEvent.DASHBOARD_SUMMARY); } diff --git a/src/com/android/settings/deviceinfo/StorageSettings.java b/src/com/android/settings/deviceinfo/StorageSettings.java index efcf03db02d..209346913bb 100644 --- a/src/com/android/settings/deviceinfo/StorageSettings.java +++ b/src/com/android/settings/deviceinfo/StorageSettings.java @@ -236,7 +236,6 @@ public class StorageSettings extends SettingsPreferenceFragment implements Index Intent intent = Utils.onBuildStartFragmentIntent(getActivity(), StorageDashboardFragment.class.getName(), args, null, R.string.storage_settings, null, false, getMetricsCategory()); - intent.putExtra(SettingsDrawerActivity.EXTRA_SHOW_MENU, true); getActivity().startActivity(intent); finish(); } diff --git a/src/com/android/settings/deviceinfo/storage/UserProfileController.java b/src/com/android/settings/deviceinfo/storage/UserProfileController.java index 4870e7e3fa3..c9fe54e74fe 100644 --- a/src/com/android/settings/deviceinfo/storage/UserProfileController.java +++ b/src/com/android/settings/deviceinfo/storage/UserProfileController.java @@ -85,7 +85,6 @@ public class UserProfileController extends AbstractPreferenceController implemen Intent intent = Utils.onBuildStartFragmentIntent(mContext, StorageProfileFragment.class.getName(), args, null, 0, mUser.name, false, MetricsProto.MetricsEvent.DEVICEINFO_STORAGE); - intent.putExtra(SettingsDrawerActivity.EXTRA_SHOW_MENU, true); mContext.startActivity(intent); return true; } diff --git a/tests/robotests/src/com/android/settings/SettingsActivityTest.java b/tests/robotests/src/com/android/settings/SettingsActivityTest.java index 509ecdad1a9..25abd4d84ea 100644 --- a/tests/robotests/src/com/android/settings/SettingsActivityTest.java +++ b/tests/robotests/src/com/android/settings/SettingsActivityTest.java @@ -16,7 +16,6 @@ package com.android.settings; -import static com.google.common.truth.Truth.assertThat; import static org.mockito.ArgumentMatchers.nullable; import static org.mockito.Matchers.anyInt; import static org.mockito.Mockito.doReturn; @@ -28,17 +27,14 @@ import static org.mockito.Mockito.when; import android.app.ActivityManager; import android.app.FragmentManager; import android.app.FragmentTransaction; -import android.content.Context; import android.content.Intent; import android.graphics.Bitmap; -import android.os.Bundle; import com.android.settings.testutils.SettingsRobolectricTestRunner; 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; @@ -48,9 +44,6 @@ import org.robolectric.annotation.Config; @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION) public class SettingsActivityTest { - @Mock(answer = Answers.RETURNS_DEEP_STUBS) - private Context mContext; - @Mock private FragmentManager mFragmentManager; @Mock @@ -84,13 +77,4 @@ public class SettingsActivityTest { verify(mTaskDescription).setIcon(nullable(Bitmap.class)); } - - @Test - public void testSaveState_EnabledHomeSaved() { - mActivity.mDisplayHomeAsUpEnabled = true; - Bundle bundle = new Bundle(); - mActivity.saveState(bundle); - - assertThat((boolean) bundle.get(SettingsActivity.SAVE_KEY_SHOW_HOME_AS_UP)).isTrue(); - } } diff --git a/tests/robotests/src/com/android/settings/backup/BackupSettingsHelperTest.java b/tests/robotests/src/com/android/settings/backup/BackupSettingsHelperTest.java index 9de0c6a3c2e..4e5428cc6f8 100644 --- a/tests/robotests/src/com/android/settings/backup/BackupSettingsHelperTest.java +++ b/tests/robotests/src/com/android/settings/backup/BackupSettingsHelperTest.java @@ -16,6 +16,14 @@ package com.android.settings.backup; +import static com.google.common.truth.Truth.assertThat; +import static org.mockito.Mockito.anyInt; +import static org.mockito.Mockito.anyString; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + import android.app.backup.BackupManager; import android.app.backup.IBackupManager; import android.content.ComponentName; @@ -26,6 +34,10 @@ import android.content.res.Resources; import android.os.IBinder; import android.os.RemoteException; +import com.android.settings.R; +import com.android.settings.TestConfig; +import com.android.settings.testutils.SettingsRobolectricTestRunner; + import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -36,19 +48,6 @@ import org.robolectric.annotation.Config; import org.robolectric.annotation.Implementation; import org.robolectric.annotation.Implements; -import static com.google.common.truth.Truth.assertThat; -import static org.mockito.Mockito.anyInt; -import static org.mockito.Mockito.anyString; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.spy; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - -import com.android.settings.R; -import com.android.settings.testutils.SettingsRobolectricTestRunner; -import com.android.settings.TestConfig; -import com.android.settingslib.drawer.SettingsDrawerActivity; - @RunWith(SettingsRobolectricTestRunner.class) @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION, shadows = {BackupSettingsHelperTest.ShadowBackupManagerStub.class}) @@ -263,8 +262,6 @@ public class BackupSettingsHelperTest { assertThat(backupIntent.getComponent().getClassName()).isEqualTo( DEFAULT_SETTINGS_CLASSNAME); - assertThat(backupIntent.getExtras().getBoolean( - SettingsDrawerActivity.EXTRA_SHOW_MENU)).isTrue(); } @Test From 408dc4122883d1296bb891196e28a5d012ab6594 Mon Sep 17 00:00:00 2001 From: Salvador Martinez Date: Fri, 19 Jan 2018 16:33:35 -0800 Subject: [PATCH 07/13] Update copy for battery estimate related features Many features are using the enhanced estimates but the copy for them has gotten out of sync. This CL moves shared strings between Settings and SysUI to SettingsLib and also updates features that use the strings to have consistent behavior/text. Test: Robotests Bug: 65656091 Bug: 66909350 Bug: 67469159 Change-Id: Ie5ef1ed65429ca9805cff374f1439e5d61eb6591 --- res/values/strings.xml | 3 + src/com/android/settings/Utils.java | 117 +---------- .../RecentAppsPreferenceController.java | 4 +- .../fuelgauge/AdvancedPowerUsageDetail.java | 5 +- .../BatteryAppListPreferenceController.java | 10 +- .../settings/fuelgauge/BatteryInfo.java | 103 +++++----- .../settings/fuelgauge/BatteryUtils.java | 43 ++-- .../fuelgauge/DebugEstimatesLoader.java | 6 +- .../fuelgauge/PowerUsageAdvanced.java | 3 +- .../settings/fuelgauge/PowerUsageSummary.java | 18 +- .../fuelgauge/PowerUsageSummaryLegacy.java | 17 +- .../batterytip/BatteryTipDialogFragment.java | 4 +- .../batterytip/HighUsageAdapter.java | 3 +- .../batterytip/tips/HighUsageTip.java | 4 +- ...centNotifyingAppsPreferenceController.java | 3 +- .../src/com/android/settings/UtilsTest.java | 188 ++---------------- .../settings/fuelgauge/BatteryInfoTest.java | 48 ++++- .../PowerUsageSummaryLegacyTest.java | 6 +- 18 files changed, 185 insertions(+), 400 deletions(-) diff --git a/res/values/strings.xml b/res/values/strings.xml index 35bc32eedd9..d462450c141 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -5133,6 +5133,9 @@ Manage battery usage + + Battery left estimate is based on your device usage + Estimated time left diff --git a/src/com/android/settings/Utils.java b/src/com/android/settings/Utils.java index f45ac5edb25..1a321274b42 100644 --- a/src/com/android/settings/Utils.java +++ b/src/com/android/settings/Utils.java @@ -52,11 +52,8 @@ import android.graphics.Canvas; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.hardware.fingerprint.FingerprintManager; -import android.icu.text.MeasureFormat; import android.icu.text.RelativeDateTimeFormatter; import android.icu.text.RelativeDateTimeFormatter.RelativeUnit; -import android.icu.util.Measure; -import android.icu.util.MeasureUnit; import android.icu.util.ULocale; import android.net.ConnectivityManager; import android.net.LinkProperties; @@ -88,8 +85,6 @@ import android.support.v7.preference.PreferenceScreen; import android.telephony.TelephonyManager; import android.text.Spannable; import android.text.SpannableString; -import android.text.SpannableStringBuilder; -import android.text.Spanned; import android.text.TextUtils; import android.text.format.DateUtils; import android.text.style.TtsSpan; @@ -112,6 +107,7 @@ import com.android.settings.wrapper.DevicePolicyManagerWrapper; import com.android.settings.wrapper.FingerprintManagerWrapper; import com.android.settingslib.core.instrumentation.VisibilityLoggerMixin; +import com.android.settingslib.utils.StringUtil; import java.net.InetAddress; import java.util.ArrayList; import java.util.Iterator; @@ -138,10 +134,6 @@ public final class Utils extends com.android.settingslib.Utils { private static final String SETTINGS_PACKAGE_NAME = "com.android.settings"; - private static final int SECONDS_PER_MINUTE = 60; - private static final int SECONDS_PER_HOUR = 60 * 60; - private static final int SECONDS_PER_DAY = 24 * 60 * 60; - public static final String OS_PKG = "os"; /** @@ -771,113 +763,6 @@ public final class Utils extends com.android.settingslib.Utils { return tm.getSimCount() > 1; } - /** - * Returns elapsed time for the given millis, in the following format: - * 2d 5h 40m 29s - * @param context the application context - * @param millis the elapsed time in milli seconds - * @param withSeconds include seconds? - * @return the formatted elapsed time - */ - public static CharSequence formatElapsedTime(Context context, double millis, - boolean withSeconds) { - SpannableStringBuilder sb = new SpannableStringBuilder(); - int seconds = (int) Math.floor(millis / 1000); - if (!withSeconds) { - // Round up. - seconds += 30; - } - - int days = 0, hours = 0, minutes = 0; - if (seconds >= SECONDS_PER_DAY) { - days = seconds / SECONDS_PER_DAY; - seconds -= days * SECONDS_PER_DAY; - } - if (seconds >= SECONDS_PER_HOUR) { - hours = seconds / SECONDS_PER_HOUR; - seconds -= hours * SECONDS_PER_HOUR; - } - if (seconds >= SECONDS_PER_MINUTE) { - minutes = seconds / SECONDS_PER_MINUTE; - seconds -= minutes * SECONDS_PER_MINUTE; - } - - final ArrayList measureList = new ArrayList(4); - if (days > 0) { - measureList.add(new Measure(days, MeasureUnit.DAY)); - } - if (hours > 0) { - measureList.add(new Measure(hours, MeasureUnit.HOUR)); - } - if (minutes > 0) { - measureList.add(new Measure(minutes, MeasureUnit.MINUTE)); - } - if (withSeconds && seconds > 0) { - measureList.add(new Measure(seconds, MeasureUnit.SECOND)); - } - if (measureList.size() == 0) { - // Everything addable was zero, so nothing was added. We add a zero. - measureList.add(new Measure(0, withSeconds ? MeasureUnit.SECOND : MeasureUnit.MINUTE)); - } - final Measure[] measureArray = measureList.toArray(new Measure[measureList.size()]); - - final Locale locale = context.getResources().getConfiguration().locale; - final MeasureFormat measureFormat = MeasureFormat.getInstance( - locale, MeasureFormat.FormatWidth.NARROW); - sb.append(measureFormat.formatMeasures(measureArray)); - - if (measureArray.length == 1 && MeasureUnit.MINUTE.equals(measureArray[0].getUnit())) { - // Add ttsSpan if it only have minute value, because it will be read as "meters" - final TtsSpan ttsSpan = new TtsSpan.MeasureBuilder().setNumber(minutes) - .setUnit("minute").build(); - sb.setSpan(ttsSpan, 0, sb.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); - } - - return sb; - } - - /** - * Returns relative time for the given millis in the past, in a short format such as "2 days - * ago", "5 hr. ago", "40 min. ago", or "29 sec. ago". - * - *

The unit is chosen to have good information value while only using one unit. So 27 hours - * and 50 minutes would be formatted as "28 hr. ago", while 50 hours would be formatted as - * "2 days ago". - * - * @param context the application context - * @param millis the elapsed time in milli seconds - * @param withSeconds include seconds? - * @return the formatted elapsed time - */ - public static CharSequence formatRelativeTime(Context context, double millis, - boolean withSeconds) { - final int seconds = (int) Math.floor(millis / 1000); - final RelativeUnit unit; - final int value; - if (withSeconds && seconds < 2 * SECONDS_PER_MINUTE) { - unit = RelativeUnit.SECONDS; - value = seconds; - } else if (seconds < 2 * SECONDS_PER_HOUR) { - unit = RelativeUnit.MINUTES; - value = (seconds + SECONDS_PER_MINUTE / 2) / SECONDS_PER_MINUTE; - } else if (seconds < 2 * SECONDS_PER_DAY) { - unit = RelativeUnit.HOURS; - value = (seconds + SECONDS_PER_HOUR / 2) / SECONDS_PER_HOUR; - } else { - unit = RelativeUnit.DAYS; - value = (seconds + SECONDS_PER_DAY / 2) / SECONDS_PER_DAY; - } - - final Locale locale = context.getResources().getConfiguration().locale; - final RelativeDateTimeFormatter formatter = RelativeDateTimeFormatter.getInstance( - ULocale.forLocale(locale), - null /* default NumberFormat */, - RelativeDateTimeFormatter.Style.SHORT, - android.icu.text.DisplayContext.CAPITALIZATION_FOR_MIDDLE_OF_SENTENCE); - - return formatter.format(value, RelativeDateTimeFormatter.Direction.LAST, unit); - } - /** * Queries for the UserInfo of a user. Returns null if the user doesn't exist (was removed). * @param userManager Instance of UserManager diff --git a/src/com/android/settings/applications/RecentAppsPreferenceController.java b/src/com/android/settings/applications/RecentAppsPreferenceController.java index e15671bc24a..b177225f1f2 100644 --- a/src/com/android/settings/applications/RecentAppsPreferenceController.java +++ b/src/com/android/settings/applications/RecentAppsPreferenceController.java @@ -38,13 +38,13 @@ import android.util.IconDrawableFactory; import android.util.Log; import com.android.settings.R; -import com.android.settings.Utils; import com.android.settings.applications.appinfo.AppInfoDashboardFragment; import com.android.settings.core.PreferenceControllerMixin; import com.android.settings.widget.AppPreference; import com.android.settingslib.applications.AppUtils; import com.android.settingslib.applications.ApplicationsState; import com.android.settingslib.core.AbstractPreferenceController; +import com.android.settingslib.utils.StringUtil; import com.android.settingslib.wrapper.PackageManagerWrapper; import java.util.ArrayList; @@ -239,7 +239,7 @@ public class RecentAppsPreferenceController extends AbstractPreferenceController pref.setKey(pkgName); pref.setTitle(appEntry.label); pref.setIcon(mIconDrawableFactory.getBadgedIcon(appEntry.info)); - pref.setSummary(Utils.formatRelativeTime(mContext, + pref.setSummary(StringUtil.formatRelativeTime(mContext, System.currentTimeMillis() - stat.getLastTimeUsed(), false)); pref.setOrder(i); pref.setOnPreferenceClickListener(preference -> { diff --git a/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java b/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java index e073456db82..981b0dc1129 100644 --- a/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java +++ b/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java @@ -58,6 +58,7 @@ import com.android.settingslib.applications.AppUtils; import com.android.settingslib.applications.ApplicationsState; import com.android.settingslib.core.AbstractPreferenceController; +import com.android.settingslib.utils.StringUtil; import java.util.ArrayList; import java.util.List; @@ -284,10 +285,10 @@ public class AdvancedPowerUsageDetail extends DashboardFragment implements final int powerMah = bundle.getInt(EXTRA_POWER_USAGE_AMOUNT); mForegroundPreference.setSummary( TextUtils.expandTemplate(getText(R.string.battery_used_for), - Utils.formatElapsedTime(context, foregroundTimeMs, false))); + StringUtil.formatElapsedTime(context, foregroundTimeMs, false))); mBackgroundPreference.setSummary( TextUtils.expandTemplate(getText(R.string.battery_active_for), - Utils.formatElapsedTime(context, backgroundTimeMs, false))); + StringUtil.formatElapsedTime(context, backgroundTimeMs, false))); mPowerUsagePreference.setSummary( getString(R.string.battery_detail_power_percentage, usagePercent, powerMah)); } diff --git a/src/com/android/settings/fuelgauge/BatteryAppListPreferenceController.java b/src/com/android/settings/fuelgauge/BatteryAppListPreferenceController.java index 91f35e2533a..2095f25e679 100644 --- a/src/com/android/settings/fuelgauge/BatteryAppListPreferenceController.java +++ b/src/com/android/settings/fuelgauge/BatteryAppListPreferenceController.java @@ -18,7 +18,6 @@ package com.android.settings.fuelgauge; import android.app.Activity; -import android.app.Fragment; import android.content.Context; import android.graphics.drawable.Drawable; import android.os.BatteryStats; @@ -31,7 +30,6 @@ import android.support.annotation.VisibleForTesting; import android.support.v14.preference.PreferenceFragment; import android.support.v7.preference.Preference; import android.support.v7.preference.PreferenceGroup; -import android.support.v7.preference.PreferenceManager; import android.support.v7.preference.PreferenceScreen; import android.text.TextUtils; import android.text.format.DateUtils; @@ -48,16 +46,14 @@ import com.android.settings.R; import com.android.settings.SettingsActivity; import com.android.settings.core.FeatureFlags; import com.android.settings.core.PreferenceControllerMixin; -import com.android.settings.Utils; import com.android.settings.fuelgauge.anomaly.Anomaly; -import com.android.settings.overlay.FeatureFactory; import com.android.settingslib.core.AbstractPreferenceController; -import com.android.settingslib.core.instrumentation.MetricsFeatureProvider; import com.android.settingslib.core.lifecycle.Lifecycle; import com.android.settingslib.core.lifecycle.LifecycleObserver; import com.android.settingslib.core.lifecycle.events.OnDestroy; import com.android.settingslib.core.lifecycle.events.OnPause; +import com.android.settingslib.utils.StringUtil; import java.util.ArrayList; import java.util.List; @@ -362,8 +358,8 @@ public class BatteryAppListPreferenceController extends AbstractPreferenceContro // Only show summary when usage time is longer than one minute final long usageTimeMs = sipper.usageTimeMs; if (usageTimeMs >= DateUtils.MINUTE_IN_MILLIS) { - final CharSequence timeSequence = Utils.formatElapsedTime(mContext, usageTimeMs, - false); + final CharSequence timeSequence = + StringUtil.formatElapsedTime(mContext, usageTimeMs, false); preference.setSummary( (sipper.drainType != DrainType.APP || mBatteryUtils.shouldHideSipper(sipper)) ? timeSequence diff --git a/src/com/android/settings/fuelgauge/BatteryInfo.java b/src/com/android/settings/fuelgauge/BatteryInfo.java index 63841307ed8..43465ab3c57 100644 --- a/src/com/android/settings/fuelgauge/BatteryInfo.java +++ b/src/com/android/settings/fuelgauge/BatteryInfo.java @@ -25,7 +25,6 @@ import android.os.BatteryStats.HistoryItem; import android.os.Bundle; import android.os.SystemClock; import android.support.annotation.WorkerThread; -import android.text.TextUtils; import android.text.format.Formatter; import android.util.SparseIntArray; @@ -34,8 +33,14 @@ import com.android.settings.Utils; import com.android.settings.graph.UsageView; import com.android.settings.overlay.FeatureFactory; import com.android.settingslib.R; +import com.android.settingslib.utils.PowerUtil; +import com.android.settingslib.utils.StringUtil; +import java.util.concurrent.TimeUnit; public class BatteryInfo { + private static final long SEVEN_MINUTES_MICROS = TimeUnit.MINUTES.toMicros(7); + private static final long FIFTEEN_MINUTES_MICROS = TimeUnit.MINUTES.toMicros(15); + private static final long ONE_DAY_MICROS = TimeUnit.DAYS.toMicros(1); public CharSequence chargeLabel; public CharSequence remainingLabel; @@ -100,7 +105,7 @@ public class BatteryInfo { if (lastTime >= 0) { points.put(lastTime, lastLevel); points.put((int) (timePeriod + - BatteryUtils.convertUsToMs(remainingTimeUs)), + PowerUtil.convertUsToMs(remainingTimeUs)), mCharging ? 100 : 0); } } @@ -160,7 +165,7 @@ public class BatteryInfo { PowerUsageFeatureProvider provider = FeatureFactory.getFactory(context).getPowerUsageFeatureProvider(context); final long elapsedRealtimeUs = - BatteryUtils.convertMsToUs(SystemClock.elapsedRealtime()); + PowerUtil.convertMsToUs(SystemClock.elapsedRealtime()); Intent batteryBroadcast = context.registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED)); @@ -176,7 +181,7 @@ public class BatteryInfo { .logRuntime(LOG_TAG, "time for enhanced BatteryInfo", startTime); return BatteryInfo.getBatteryInfo(context, batteryBroadcast, stats, elapsedRealtimeUs, shortString, - BatteryUtils.convertMsToUs(estimate.estimateMillis), + PowerUtil.convertMsToUs(estimate.estimateMillis), estimate.isBasedOnUsage); } } @@ -217,53 +222,61 @@ public class BatteryInfo { info.statusLabel = Utils.getBatteryStatus(resources, batteryBroadcast); if (!info.mCharging) { - if (drainTimeUs > 0) { - info.remainingTimeUs = drainTimeUs; - CharSequence timeString = Utils.formatElapsedTime(context, - BatteryUtils.convertUsToMs(drainTimeUs), false /* withSeconds */); - info.remainingLabel = TextUtils.expandTemplate(context.getText(shortString ? - R.string.power_remaining_duration_only_short : - (basedOnUsage ? - R.string.power_remaining_duration_only_enhanced : - R.string.power_remaining_duration_only)), timeString); - info.chargeLabel = TextUtils.expandTemplate(context.getText( - shortString ? - R.string.power_discharging_duration_short : - basedOnUsage ? - R.string.power_discharging_duration_enhanced : - R.string.power_discharging_duration), - info.batteryPercentString, timeString); - } else { - info.remainingLabel = null; - info.chargeLabel = info.batteryPercentString; - } + updateBatteryInfoDischarging(context, shortString, drainTimeUs, basedOnUsage, info); } else { - final long chargeTime = stats.computeChargeTimeRemaining(elapsedRealtimeUs); - final int status = batteryBroadcast.getIntExtra(BatteryManager.EXTRA_STATUS, - BatteryManager.BATTERY_STATUS_UNKNOWN); - info.discharging = false; - if (chargeTime > 0 && status != BatteryManager.BATTERY_STATUS_FULL) { - info.remainingTimeUs = chargeTime; - CharSequence timeString = Utils.formatElapsedTime(context, - BatteryUtils.convertUsToMs(chargeTime), false /* withSeconds */); - int resId = R.string.power_charging_duration; - info.remainingLabel = TextUtils.expandTemplate(context.getText( - R.string.power_remaining_charging_duration_only), timeString); - info.chargeLabel = TextUtils.expandTemplate(context.getText(resId), - info.batteryPercentString, timeString); - } else { - final String chargeStatusLabel = resources.getString( - R.string.battery_info_status_charging_lower); - info.remainingLabel = null; - info.chargeLabel = info.batteryLevel == 100 ? info.batteryPercentString : - resources.getString(R.string.power_charging, info.batteryPercentString, - chargeStatusLabel); - } + updateBatteryInfoCharging(context, batteryBroadcast, stats, elapsedRealtimeUs, info); } BatteryUtils.logRuntime(LOG_TAG, "time for getBatteryInfo", startTime); return info; } + private static void updateBatteryInfoCharging(Context context, Intent batteryBroadcast, + BatteryStats stats, long elapsedRealtimeUs, BatteryInfo info) { + final Resources resources = context.getResources(); + final long chargeTime = stats.computeChargeTimeRemaining(elapsedRealtimeUs); + final int status = batteryBroadcast.getIntExtra(BatteryManager.EXTRA_STATUS, + BatteryManager.BATTERY_STATUS_UNKNOWN); + info.discharging = false; + if (chargeTime > 0 && status != BatteryManager.BATTERY_STATUS_FULL) { + info.remainingTimeUs = chargeTime; + CharSequence timeString = StringUtil.formatElapsedTime(context, + PowerUtil.convertUsToMs(info.remainingTimeUs), false /* withSeconds */); + int resId = R.string.power_charging_duration; + info.remainingLabel = context.getString( + R.string.power_remaining_charging_duration_only, timeString); + info.chargeLabel = context.getString(resId, info.batteryPercentString, timeString); + } else { + final String chargeStatusLabel = resources.getString( + R.string.battery_info_status_charging_lower); + info.remainingLabel = null; + info.chargeLabel = info.batteryLevel == 100 ? info.batteryPercentString : + resources.getString(R.string.power_charging, info.batteryPercentString, + chargeStatusLabel); + } + } + + private static void updateBatteryInfoDischarging(Context context, boolean shortString, + long drainTimeUs, boolean basedOnUsage, BatteryInfo info) { + if (drainTimeUs > 0) { + info.remainingTimeUs = drainTimeUs; + info.remainingLabel = PowerUtil.getBatteryRemainingStringFormatted( + context, + PowerUtil.convertUsToMs(drainTimeUs), + null /* percentageString */, + basedOnUsage && !shortString + ); + info.chargeLabel = PowerUtil.getBatteryRemainingStringFormatted( + context, + PowerUtil.convertUsToMs(drainTimeUs), + info.batteryPercentString, + basedOnUsage && !shortString + ); + } else { + info.remainingLabel = null; + info.chargeLabel = info.batteryPercentString; + } + } + public interface BatteryDataParser { void onParsingStarted(long startTime, long endTime); diff --git a/src/com/android/settings/fuelgauge/BatteryUtils.java b/src/com/android/settings/fuelgauge/BatteryUtils.java index 5738c290eb3..da9b7059908 100644 --- a/src/com/android/settings/fuelgauge/BatteryUtils.java +++ b/src/com/android/settings/fuelgauge/BatteryUtils.java @@ -43,6 +43,7 @@ import com.android.settings.R; import com.android.settings.fuelgauge.anomaly.Anomaly; import com.android.settings.overlay.FeatureFactory; +import com.android.settingslib.utils.PowerUtil; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.util.Collections; @@ -68,19 +69,18 @@ public class BatteryUtils { int BACKGROUND = 2; int ALL = 3; } - private static final String TAG = "BatteryUtils"; private static final int MIN_POWER_THRESHOLD_MILLI_AMP = 5; + private static final int SECONDS_IN_HOUR = 60 * 60; private static BatteryUtils sInstance; - private PackageManager mPackageManager; + private AppOpsManager mAppOpsManager; private Context mContext; @VisibleForTesting PowerUsageFeatureProvider mPowerUsageFeatureProvider; - public static BatteryUtils getInstance(Context context) { if (sInstance == null || sInstance.isDataCorrupted()) { sInstance = new BatteryUtils(context); @@ -131,29 +131,30 @@ public class BatteryUtils { // Return the min value of STATE_TOP time and foreground activity time, since both of these // time have some errors - return convertUsToMs( + return PowerUtil.convertUsToMs( Math.min(timeUs, getForegroundActivityTotalTimeUs(uid, rawRealTimeUs))); } private long getScreenUsageTimeMs(BatteryStats.Uid uid, int which) { - final long rawRealTimeUs = convertMsToUs(SystemClock.elapsedRealtime()); + final long rawRealTimeUs = PowerUtil.convertMsToUs(SystemClock.elapsedRealtime()); return getScreenUsageTimeMs(uid, which, rawRealTimeUs); } private long getProcessBackgroundTimeMs(BatteryStats.Uid uid, int which) { - final long rawRealTimeUs = convertMsToUs(SystemClock.elapsedRealtime()); + final long rawRealTimeUs = PowerUtil.convertMsToUs(SystemClock.elapsedRealtime()); final long timeUs = uid.getProcessStateTime( BatteryStats.Uid.PROCESS_STATE_BACKGROUND, rawRealTimeUs, which); Log.v(TAG, "package: " + mPackageManager.getNameForUid(uid.getUid())); Log.v(TAG, "background time(us): " + timeUs); - return convertUsToMs(timeUs); + return PowerUtil.convertUsToMs(timeUs); } private long getProcessForegroundTimeMs(BatteryStats.Uid uid, int which) { - final long rawRealTimeUs = convertMsToUs(SystemClock.elapsedRealtime()); + final long rawRealTimeUs = PowerUtil.convertMsToUs(SystemClock.elapsedRealtime()); return getScreenUsageTimeMs(uid, which, rawRealTimeUs) - + convertUsToMs(getForegroundServiceTotalTimeUs(uid, rawRealTimeUs)); + + PowerUtil.convertUsToMs( + getForegroundServiceTotalTimeUs(uid, rawRealTimeUs)); } /** @@ -267,9 +268,10 @@ public class BatteryUtils { */ public long calculateRunningTimeBasedOnStatsType(BatteryStatsHelper batteryStatsHelper, int statsType) { - final long elapsedRealtimeUs = convertMsToUs(SystemClock.elapsedRealtime()); + final long elapsedRealtimeUs = PowerUtil.convertMsToUs( + SystemClock.elapsedRealtime()); // Return the battery time (millisecond) on status mStatsType - return convertUsToMs( + return PowerUtil.convertUsToMs( batteryStatsHelper.getStats().computeBatteryRealtime(elapsedRealtimeUs, statsType)); } @@ -390,25 +392,15 @@ public class BatteryUtils { } } - public static long convertUsToMs(long timeUs) { - return timeUs / 1000; - } - - public static long convertMsToUs(long timeMs) { - return timeMs * 1000; - } - public void setForceAppStandby(int uid, String packageName, int mode) { final boolean isPreOApp = isLegacyApp(packageName); if (isPreOApp) { // Control whether app could run in the background if it is pre O app - mAppOpsManager.setMode(AppOpsManager.OP_RUN_IN_BACKGROUND, uid, packageName, - mode); + mAppOpsManager.setMode(AppOpsManager.OP_RUN_IN_BACKGROUND, uid, packageName, mode); } // Control whether app could run jobs in the background - mAppOpsManager.setMode(AppOpsManager.OP_RUN_ANY_IN_BACKGROUND, uid, packageName, - mode); + mAppOpsManager.setMode(AppOpsManager.OP_RUN_ANY_IN_BACKGROUND, uid, packageName, mode); } public void initBatteryStatsHelper(BatteryStatsHelper statsHelper, Bundle bundle, @@ -425,7 +417,8 @@ public class BatteryUtils { // Stuff we always need to get BatteryInfo final Intent batteryBroadcast = mContext.registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED)); - final long elapsedRealtimeUs = BatteryUtils.convertMsToUs(SystemClock.elapsedRealtime()); + final long elapsedRealtimeUs = PowerUtil.convertMsToUs( + SystemClock.elapsedRealtime()); BatteryInfo batteryInfo; // 0 means we are discharging, anything else means charging @@ -443,7 +436,7 @@ public class BatteryUtils { if (estimate != null) { batteryInfo = BatteryInfo.getBatteryInfo(mContext, batteryBroadcast, stats, elapsedRealtimeUs, false /* shortString */, - BatteryUtils.convertMsToUs(estimate.estimateMillis), + PowerUtil.convertMsToUs(estimate.estimateMillis), estimate.isBasedOnUsage); } else { batteryInfo = BatteryInfo.getBatteryInfo(mContext, batteryBroadcast, stats, diff --git a/src/com/android/settings/fuelgauge/DebugEstimatesLoader.java b/src/com/android/settings/fuelgauge/DebugEstimatesLoader.java index e58ccd339a0..509f96758d2 100644 --- a/src/com/android/settings/fuelgauge/DebugEstimatesLoader.java +++ b/src/com/android/settings/fuelgauge/DebugEstimatesLoader.java @@ -22,6 +22,7 @@ import android.os.BatteryStats; import android.os.SystemClock; import com.android.internal.os.BatteryStatsHelper; import com.android.settings.overlay.FeatureFactory; +import com.android.settingslib.utils.PowerUtil; import com.android.settingslib.utils.AsyncLoader; import java.util.ArrayList; import java.util.List; @@ -46,7 +47,8 @@ public class DebugEstimatesLoader extends AsyncLoader> { FeatureFactory.getFactory(context).getPowerUsageFeatureProvider(context); // get stuff we'll need for both BatteryInfo - final long elapsedRealtimeUs = BatteryUtils.convertMsToUs(SystemClock.elapsedRealtime()); + final long elapsedRealtimeUs = PowerUtil.convertMsToUs( + SystemClock.elapsedRealtime()); Intent batteryBroadcast = getContext().registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED)); BatteryStats stats = mStatsHelper.getStats(); @@ -60,7 +62,7 @@ public class DebugEstimatesLoader extends AsyncLoader> { } BatteryInfo newInfo = BatteryInfo.getBatteryInfo(getContext(), batteryBroadcast, stats, elapsedRealtimeUs, false, - BatteryUtils.convertMsToUs(estimate.estimateMillis), + PowerUtil.convertMsToUs(estimate.estimateMillis), estimate.isBasedOnUsage); List infos = new ArrayList<>(); diff --git a/src/com/android/settings/fuelgauge/PowerUsageAdvanced.java b/src/com/android/settings/fuelgauge/PowerUsageAdvanced.java index 6ed92a7cb42..25351d33db5 100644 --- a/src/com/android/settings/fuelgauge/PowerUsageAdvanced.java +++ b/src/com/android/settings/fuelgauge/PowerUsageAdvanced.java @@ -47,6 +47,7 @@ import com.android.settings.overlay.FeatureFactory; import com.android.settings.search.BaseSearchIndexProvider; import com.android.settingslib.core.AbstractPreferenceController; +import com.android.settingslib.utils.StringUtil; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.util.ArrayList; @@ -318,7 +319,7 @@ public class PowerUsageAdvanced extends PowerUsageBase { return; } if (usageData.usageList.size() <= 1) { - CharSequence timeSequence = Utils.formatElapsedTime(getContext(), + CharSequence timeSequence = StringUtil.formatElapsedTime(getContext(), usageData.totalUsageTimeMs, false); usageData.summary = usageData.usageType == UsageType.IDLE ? timeSequence : TextUtils.expandTemplate(getText(R.string.battery_used_for), timeSequence); diff --git a/src/com/android/settings/fuelgauge/PowerUsageSummary.java b/src/com/android/settings/fuelgauge/PowerUsageSummary.java index 74dc986b574..3583b142b69 100644 --- a/src/com/android/settings/fuelgauge/PowerUsageSummary.java +++ b/src/com/android/settings/fuelgauge/PowerUsageSummary.java @@ -37,10 +37,7 @@ import android.view.View.OnClickListener; import android.view.View.OnLongClickListener; import android.widget.TextView; -import com.android.internal.hardware.AmbientDisplayConfiguration; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; -import com.android.internal.os.BatterySipper; -import com.android.internal.os.BatterySipper.DrainType; import com.android.settings.R; import com.android.settings.Settings.HighPowerApplicationsActivity; import com.android.settings.SettingsActivity; @@ -48,10 +45,7 @@ import com.android.settings.Utils; import com.android.settings.applications.LayoutPreference; import com.android.settings.applications.manageapplications.ManageApplications; import com.android.settings.dashboard.SummaryLoader; -import com.android.settings.display.AmbientDisplayPreferenceController; -import com.android.settings.display.AutoBrightnessPreferenceController; import com.android.settings.display.BatteryPercentagePreferenceController; -import com.android.settings.display.TimeoutPreferenceController; import com.android.settings.fuelgauge.anomaly.Anomaly; import com.android.settings.fuelgauge.anomaly.AnomalyDetectionPolicy; import com.android.settings.fuelgauge.batterytip.BatteryTipLoader; @@ -63,6 +57,8 @@ import com.android.settingslib.core.AbstractPreferenceController; import com.android.settingslib.core.instrumentation.MetricsFeatureProvider; import com.android.settingslib.core.lifecycle.Lifecycle; +import com.android.settingslib.utils.PowerUtil; +import com.android.settingslib.utils.StringUtil; import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -164,12 +160,12 @@ public class PowerUsageSummary extends PowerUsageBase implements OnLongClickList // be unplugged for a period of time before being willing ot make an estimate. summary1.setText(mPowerFeatureProvider.getOldEstimateDebugString( Formatter.formatShortElapsedTime(getContext(), - BatteryUtils.convertUsToMs(oldInfo.remainingTimeUs)))); + PowerUtil.convertUsToMs(oldInfo.remainingTimeUs)))); // for this one we can just set the string directly summary2.setText(mPowerFeatureProvider.getEnhancedEstimateDebugString( Formatter.formatShortElapsedTime(getContext(), - BatteryUtils.convertUsToMs(newInfo.remainingTimeUs)))); + PowerUtil.convertUsToMs(newInfo.remainingTimeUs)))); batteryView.setBatteryLevel(oldInfo.batteryLevel); batteryView.setCharging(!oldInfo.discharging); @@ -314,10 +310,10 @@ public class PowerUsageSummary extends PowerUsageBase implements OnLongClickList final long lastFullChargeTime = mBatteryUtils.calculateLastFullChargeTime(mStatsHelper, System.currentTimeMillis()); updateLastFullChargePreference(lastFullChargeTime); - mScreenUsagePref.setSubtitle(Utils.formatElapsedTime(getContext(), + mScreenUsagePref.setSubtitle(StringUtil.formatElapsedTime(getContext(), mBatteryUtils.calculateScreenUsageTime(mStatsHelper), false)); - final CharSequence timeSequence = Utils.formatRelativeTime(context, lastFullChargeTime, + final CharSequence timeSequence = StringUtil.formatRelativeTime(context, lastFullChargeTime, false); mBatteryAppListPreferenceController.refreshAppListGroup(mStatsHelper, false /* showAllApps */, timeSequence); @@ -340,7 +336,7 @@ public class PowerUsageSummary extends PowerUsageBase implements OnLongClickList @VisibleForTesting void updateLastFullChargePreference(long timeMs) { - final CharSequence timeSequence = Utils.formatRelativeTime(getContext(), timeMs, false); + final CharSequence timeSequence = StringUtil.formatRelativeTime(getContext(), timeMs, false); mLastFullChargePref.setSubtitle(timeSequence); } diff --git a/src/com/android/settings/fuelgauge/PowerUsageSummaryLegacy.java b/src/com/android/settings/fuelgauge/PowerUsageSummaryLegacy.java index 605591dda15..e6c49237218 100644 --- a/src/com/android/settings/fuelgauge/PowerUsageSummaryLegacy.java +++ b/src/com/android/settings/fuelgauge/PowerUsageSummaryLegacy.java @@ -69,6 +69,8 @@ import com.android.settings.overlay.FeatureFactory; import com.android.settingslib.core.instrumentation.MetricsFeatureProvider; import com.android.settingslib.core.AbstractPreferenceController; +import com.android.settingslib.utils.PowerUtil; +import com.android.settingslib.utils.StringUtil; import java.util.ArrayList; import java.util.List; @@ -210,12 +212,12 @@ public class PowerUsageSummaryLegacy extends PowerUsageBase implements // be unplugged for a period of time before being willing ot make an estimate. summary1.setText(mPowerFeatureProvider.getOldEstimateDebugString( Formatter.formatShortElapsedTime(getContext(), - BatteryUtils.convertUsToMs(oldInfo.remainingTimeUs)))); + PowerUtil.convertUsToMs(oldInfo.remainingTimeUs)))); // for this one we can just set the string directly summary2.setText(mPowerFeatureProvider.getEnhancedEstimateDebugString( Formatter.formatShortElapsedTime(getContext(), - BatteryUtils.convertUsToMs(newInfo.remainingTimeUs)))); + PowerUtil.convertUsToMs(newInfo.remainingTimeUs)))); batteryView.setBatteryLevel(oldInfo.batteryLevel); batteryView.setCharging(!oldInfo.discharging); @@ -524,7 +526,7 @@ public class PowerUsageSummaryLegacy extends PowerUsageBase implements updateScreenPreference(); updateLastFullChargePreference(lastFullChargeTime); - final CharSequence timeSequence = Utils.formatRelativeTime(context, lastFullChargeTime, + final CharSequence timeSequence = StringUtil.formatRelativeTime(context, lastFullChargeTime, false); final int resId = mShowAllApps ? R.string.power_usage_list_summary_device : R.string.power_usage_list_summary; @@ -653,12 +655,13 @@ public class PowerUsageSummaryLegacy extends PowerUsageBase implements mStatsHelper.getUsageList(), DrainType.SCREEN); final long usageTimeMs = sipper != null ? sipper.usageTimeMs : 0; - mScreenUsagePref.setSubtitle(Utils.formatElapsedTime(getContext(), usageTimeMs, false)); + mScreenUsagePref.setSubtitle( + StringUtil.formatElapsedTime(getContext(), usageTimeMs, false)); } @VisibleForTesting void updateLastFullChargePreference(long timeMs) { - final CharSequence timeSequence = Utils.formatRelativeTime(getContext(), timeMs, false); + final CharSequence timeSequence = StringUtil.formatRelativeTime(getContext(), timeMs, false); mLastFullChargePref.setSubtitle(timeSequence); } @@ -685,8 +688,8 @@ public class PowerUsageSummaryLegacy extends PowerUsageBase implements // Only show summary when usage time is longer than one minute final long usageTimeMs = sipper.usageTimeMs; if (usageTimeMs >= DateUtils.MINUTE_IN_MILLIS) { - final CharSequence timeSequence = Utils.formatElapsedTime(getContext(), usageTimeMs, - false); + final CharSequence timeSequence = + StringUtil.formatElapsedTime(getContext(), usageTimeMs, false); preference.setSummary( (sipper.drainType != DrainType.APP || mBatteryUtils.shouldHideSipper(sipper)) ? timeSequence diff --git a/src/com/android/settings/fuelgauge/batterytip/BatteryTipDialogFragment.java b/src/com/android/settings/fuelgauge/batterytip/BatteryTipDialogFragment.java index 66ce3caad01..d93b58909d4 100644 --- a/src/com/android/settings/fuelgauge/batterytip/BatteryTipDialogFragment.java +++ b/src/com/android/settings/fuelgauge/batterytip/BatteryTipDialogFragment.java @@ -36,6 +36,7 @@ import com.android.settings.fuelgauge.batterytip.tips.BatteryTip; import com.android.settings.fuelgauge.batterytip.tips.HighUsageTip; import com.android.settings.fuelgauge.batterytip.tips.RestrictAppTip; import com.android.settings.fuelgauge.batterytip.tips.UnrestrictAppTip; +import com.android.settingslib.utils.StringUtil; import java.util.List; @@ -83,7 +84,8 @@ public class BatteryTipDialogFragment extends InstrumentedDialogFragment impleme return new AlertDialog.Builder(context) .setMessage(getString(R.string.battery_tip_dialog_message, - Utils.formatElapsedTime(context, highUsageTip.getScreenTimeMs(), + StringUtil.formatElapsedTime( + context, highUsageTip.getScreenTimeMs(), false /* withSeconds */))) .setView(view) .setPositiveButton(android.R.string.ok, null) diff --git a/src/com/android/settings/fuelgauge/batterytip/HighUsageAdapter.java b/src/com/android/settings/fuelgauge/batterytip/HighUsageAdapter.java index 6c129d8a9be..d982280a4eb 100644 --- a/src/com/android/settings/fuelgauge/batterytip/HighUsageAdapter.java +++ b/src/com/android/settings/fuelgauge/batterytip/HighUsageAdapter.java @@ -30,6 +30,7 @@ import android.widget.TextView; import com.android.settings.R; import com.android.settings.Utils; +import com.android.settingslib.utils.StringUtil; import java.util.List; /** @@ -78,7 +79,7 @@ public class HighUsageAdapter extends RecyclerView.Adapter Date: Wed, 7 Feb 2018 15:44:28 -0500 Subject: [PATCH 08/13] Update style switchbar layout Test: manual Change-Id: If1aaffe0ea7790603291ba412500e47efa6b7b3e Fixes: 72424821 Fixes: 72423465 --- res/layout/styled_switch_bar.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/res/layout/styled_switch_bar.xml b/res/layout/styled_switch_bar.xml index 1777c0f0978..3baaac39610 100644 --- a/res/layout/styled_switch_bar.xml +++ b/res/layout/styled_switch_bar.xml @@ -16,13 +16,13 @@ + android:layout_height="wrap_content" + android:layout_width="match_parent" > From 26e35dac79ce0e9ce38a1bd5aadaae505e4103ce Mon Sep 17 00:00:00 2001 From: Andrew Sapperstein Date: Wed, 7 Feb 2018 13:57:57 -0800 Subject: [PATCH 09/13] Delete WPS settings. Removes the WPS PIN and Push button settings, all of the strings, and related code. Change-Id: I1c7a35ffc8491c57e07accba9b1b5f5407b01831 Fixes: 72421239 Test: deletes code, robotests --- res/drawable-hdpi/ic_wps_dark.png | Bin 1897 -> 0 bytes res/drawable-hdpi/ic_wps_light.png | Bin 1881 -> 0 bytes res/drawable-mdpi/ic_wps_dark.png | Bin 1309 -> 0 bytes res/drawable-mdpi/ic_wps_light.png | Bin 1274 -> 0 bytes res/drawable-xhdpi/ic_wps_dark.png | Bin 2590 -> 0 bytes res/drawable-xhdpi/ic_wps_light.png | Bin 2560 -> 0 bytes res/drawable-xxhdpi/ic_wps_dark.png | Bin 2827 -> 0 bytes res/drawable-xxhdpi/ic_wps_light.png | Bin 2854 -> 0 bytes res/layout/wifi_wps_dialog.xml | 66 ---- res/values/strings.xml | 30 -- res/values/themes.xml | 8 - res/xml/wifi_configure_settings.xml | 8 - .../settings/wifi/ConfigureWifiSettings.java | 2 - .../android/settings/wifi/WifiSettings.java | 30 -- src/com/android/settings/wifi/WpsDialog.java | 297 ------------------ .../wifi/WpsPreferenceController.java | 155 --------- .../wifi/WpsPreferenceControllerTest.java | 140 --------- 17 files changed, 736 deletions(-) delete mode 100644 res/drawable-hdpi/ic_wps_dark.png delete mode 100644 res/drawable-hdpi/ic_wps_light.png delete mode 100644 res/drawable-mdpi/ic_wps_dark.png delete mode 100644 res/drawable-mdpi/ic_wps_light.png delete mode 100644 res/drawable-xhdpi/ic_wps_dark.png delete mode 100644 res/drawable-xhdpi/ic_wps_light.png delete mode 100644 res/drawable-xxhdpi/ic_wps_dark.png delete mode 100644 res/drawable-xxhdpi/ic_wps_light.png delete mode 100644 res/layout/wifi_wps_dialog.xml delete mode 100644 src/com/android/settings/wifi/WpsDialog.java delete mode 100644 src/com/android/settings/wifi/WpsPreferenceController.java delete mode 100644 tests/robotests/src/com/android/settings/wifi/WpsPreferenceControllerTest.java diff --git a/res/drawable-hdpi/ic_wps_dark.png b/res/drawable-hdpi/ic_wps_dark.png deleted file mode 100644 index 918b0cc48bc4ed3319775d9be6b338cbb44e3fcc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1897 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 Tami&o00000NkvXXu0mjfIi@LS diff --git a/res/drawable-mdpi/ic_wps_dark.png b/res/drawable-mdpi/ic_wps_dark.png deleted file mode 100644 index 77d73a808cda8d3169ead319c82868f595ff05e5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1309 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzmUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UV>C6dj$D1FjT2AFf_CjA5L~c#`DCC7XMsm#F_88EW4Dvpb_@*6Z#`WcLn01eoqoSNG*slc{qH+7FD{%T zsJpQ#;Yy8$ypL<5$)@-V4*Y@qb|RdQ>s#1 zS_^fi1RQC1n-y9BaEhREtHX@^FoJxo(oPi|b`uQ_2GgT+(Fsn;j#&eW1**v7P<(f(!r;l25c zft(8tWLlRQ)MsTN7Y6~FVC zA0LQK;4WaRxNNvFp=8U-J$yFIZrl{;V%6&Rn-OrYWvcA{$?0ao2E7stuXOOY_O8jH1^((b`QVuiD zV7kYe$8>+?*Yw6-t|RAkj6ck4Jmkb;Gv|ka##yy9_pW}moNr*^7`Ll;<2ohRR0c8i zV*Le<*+;HVs+={+@$OBdQ(6yWigx(P8Wx}UvqdV~AP+C7ID z%|F;4P(JcPJoSxM!QGQusSgYv+5VT|ULUo%vT2Xz%ap_fNp61ze!K zRB-(>$-9>sWkP30ayVX^XAmqdvB|$7zC$oxKTz+<)WS22Ocjg~tFP&+i>+AyrB=DH z{G0=a;|cwR%3kZYCZ;mzS?@Qya?8Br-s&R1M^y(GU9)LU6HeNGhRkC;RE#5ej(dj3=BLHdK}yVmSB+;7Hx&Yd2<_47q0Dhlq@QQF^qV!cw4tIM{?&q_)&JN9TP)t-zB&b!K?*>S`+?I7C& z(WJh5u08%Ar%(7_wqyHMkuL?J^2#qQSKhkb_sNMt)M3r$m4B}NzTaEV=up&YzrBi^ z16Ts6mbgZgq$HN4S|t~y0x1R~14Cn70}EXv^AJNbD^p7=BO_e{b1MS_-=CkeQ8eV{ zr(~v8qHD0QGBSf`P}gJu6-|;L8-nxGO3D+9QW+dm@{>{(JaZG%Q-e|yQz{EjrhPx#AY({UO#lFTCIA3{ga82g0001h=l}q9FaQARU;qF* zm;eA5aGbhPJOBUy24YJ`L;(K){{a7>y{D4^000SaNLh0L002k;002k;M#*bF000BZ zNklh%t|Ee>f*=S%1vl=+rJySp{tIs0 zyNDQt(WRn`_=s>()P>O~DkhC+@R3Y(W-`+*>QuU>`cB7?g;;R8kE%N7JKy>0R9*h# zHgmZK27^KQ+N-+P^F!OVmk*$DmgkKsTcc{qOkA4+`Bwlc#~Tb*&JW-Y{D>2AU$4QH zAf^K7pm!A44Y&m#g@X}p#dFvi@5}fGZ{q8iKfy%r5}dDN0f+D+&S0$w;t=}y17~p_ zx8r#{5c4Pe^)JEsop=WKViE6QHbCsgBls(9=2Wf3+`I5QzROHDO=CD5n!QN+v-5}W zco_c@Z%2R5>%L8b$!S}{69M3R%(QJg>SUmZK0ALHPlb_LydH-7MG79pRaHuI%c8vk zH{vKXO`~a=$()2Zvh%$W`5A1%DSQ$`v!J%)y2$x7CYNv)IeUd2eA`>2Hh+8qGNpDSlxM<*36D@44>n8 z@vRd;E*uB28qc$mihn96M_Ud0=VIIz{9TO60WIRBB)|)kYXEt0gB=ld9``HG6#z2b zXM=@p;ouZ*4!YMRVJ?KdljscwgSCqR*bxSo;(JdLVt&rmPegkJzu+rLBQIcA^kutO zX7JM($n6>%1vL|q|1;g$>Gp!9zLb(- z!O$2$DTu*fkUM`iE;u=Yc?<%~xo~=Q08oI~hHH&AGlw6-<|KfMf$OCuw68Frn3x^s z+E8jJ1K1hBR*kiDtYCA4ergdujr|eTa!1N~g|ju?^?$cVWIJAxicQ`tF6z9bPmzkUFKb{I?vVs`4Dagx z6Dt25raJBf&;eqD!A-!Gb~^ulE(yRCAlbpxf4%=*`vH90ymGA%GSIxsLz`SWW4001R)MObuXVRU6W zZEs|0W_bWIFflVNFgPtTH&ih;IyE*rFgPtRH##sdEBZ)j0000PbVXQnQ*UN;cVTj6 k06}DLVr3vnZDD6+Qe|Oed2z{QJOBUy07*qoM6N<$f)5otw*UYD diff --git a/res/drawable-xhdpi/ic_wps_dark.png b/res/drawable-xhdpi/ic_wps_dark.png deleted file mode 100644 index 3ea4a3b6bcb8574c28cafd39445da0cfe116922f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2590 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 SQ+|D70KwYc>V<_{;(r0<6O*(6 diff --git a/res/drawable-xxhdpi/ic_wps_dark.png b/res/drawable-xxhdpi/ic_wps_dark.png deleted file mode 100644 index 8b38db86f79148d4229ca4a8ffd1ae32b8bbd557..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2827 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 diff --git a/res/layout/wifi_wps_dialog.xml b/res/layout/wifi_wps_dialog.xml deleted file mode 100644 index a86823d66fa..00000000000 --- a/res/layout/wifi_wps_dialog.xml +++ /dev/null @@ -1,66 +0,0 @@ - - - - - - - - - - - - - - - - - -