From 4f9e8d4a14be35caa551236c207f48c6855172ed Mon Sep 17 00:00:00 2001 From: Fan Zhang Date: Thu, 9 Feb 2017 16:33:48 -0800 Subject: [PATCH] Update storage setting summary text format. New format: 38% used - 19.80 GB free Bug: 34975053 Test: make RunSettingRoboTests Change-Id: I7c8f5f0fe825eade8167764622c940e8234be6a9 --- res/values/strings.xml | 2 +- .../settings/deviceinfo/StorageSettings.java | 18 ++-- .../SerialNumberPreferenceControllerTest.java | 4 +- .../deviceinfo/StorageSettingsTest.java | 92 +++++++++++++++++++ 4 files changed, 105 insertions(+), 11 deletions(-) create mode 100644 tests/robotests/src/com/android/settings/deviceinfo/StorageSettingsTest.java diff --git a/res/values/strings.xml b/res/values/strings.xml index 6cb164a0df2..2f452fc1b3d 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -7399,7 +7399,7 @@ 24 apps installed - %1$s of %2$s used + %1$s used - %2$s free Sleep after %1$s of inactivity diff --git a/src/com/android/settings/deviceinfo/StorageSettings.java b/src/com/android/settings/deviceinfo/StorageSettings.java index b79560ab975..cf704295c7e 100644 --- a/src/com/android/settings/deviceinfo/StorageSettings.java +++ b/src/com/android/settings/deviceinfo/StorageSettings.java @@ -19,7 +19,6 @@ package com.android.settings.deviceinfo; import android.app.Activity; import android.app.AlertDialog; import android.app.Dialog; -import android.app.DialogFragment; import android.app.Fragment; import android.content.Context; import android.content.DialogInterface; @@ -59,10 +58,10 @@ import com.android.settingslib.deviceinfo.StorageManagerVolumeProvider; import com.android.settingslib.drawer.SettingsDrawerActivity; import java.io.File; +import java.text.NumberFormat; import java.util.ArrayList; import java.util.Collections; import java.util.List; -import java.util.Objects; import static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin; @@ -513,10 +512,13 @@ public class StorageSettings extends SettingsPreferenceFragment implements Index private static class SummaryProvider implements SummaryLoader.SummaryProvider { private final Context mContext; private final SummaryLoader mLoader; + private final StorageManagerVolumeProvider mStorageManagerVolumeProvider; private SummaryProvider(Context context, SummaryLoader loader) { mContext = context; mLoader = loader; + final StorageManager storageManager = mContext.getSystemService(StorageManager.class); + mStorageManagerVolumeProvider = new StorageManagerVolumeProvider(storageManager); } @Override @@ -528,13 +530,13 @@ public class StorageSettings extends SettingsPreferenceFragment implements Index private void updateSummary() { // TODO: Register listener. - final StorageManager storageManager = mContext.getSystemService(StorageManager.class); - PrivateStorageInfo info = PrivateStorageInfo.getPrivateStorageInfo( - new StorageManagerVolumeProvider(storageManager)); - long privateUsedBytes = info.totalBytes - info.freeBytes; + final NumberFormat percentageFormat = NumberFormat.getPercentInstance(); + final PrivateStorageInfo info = PrivateStorageInfo.getPrivateStorageInfo( + mStorageManagerVolumeProvider); + double privateUsedBytes = info.totalBytes - info.freeBytes; mLoader.setSummary(this, mContext.getString(R.string.storage_summary, - Formatter.formatFileSize(mContext, privateUsedBytes), - Formatter.formatFileSize(mContext, info.totalBytes))); + percentageFormat.format(privateUsedBytes / info.totalBytes), + Formatter.formatFileSize(mContext, info.freeBytes))); } } diff --git a/tests/robotests/src/com/android/settings/deviceinfo/SerialNumberPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/deviceinfo/SerialNumberPreferenceControllerTest.java index 72d6609caa6..1b87e6c3433 100644 --- a/tests/robotests/src/com/android/settings/deviceinfo/SerialNumberPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/deviceinfo/SerialNumberPreferenceControllerTest.java @@ -20,6 +20,7 @@ import android.content.Context; import android.support.v7.preference.Preference; import android.support.v7.preference.PreferenceScreen; +import com.android.settings.SettingsRobolectricTestRunner; import com.android.settings.TestConfig; import org.junit.Before; @@ -27,7 +28,6 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.MockitoAnnotations; -import org.robolectric.RobolectricTestRunner; import org.robolectric.annotation.Config; import static com.google.common.truth.Truth.assertThat; @@ -39,7 +39,7 @@ import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -@RunWith(RobolectricTestRunner.class) +@RunWith(SettingsRobolectricTestRunner.class) @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION) public class SerialNumberPreferenceControllerTest { diff --git a/tests/robotests/src/com/android/settings/deviceinfo/StorageSettingsTest.java b/tests/robotests/src/com/android/settings/deviceinfo/StorageSettingsTest.java new file mode 100644 index 00000000000..84d3b98e2bd --- /dev/null +++ b/tests/robotests/src/com/android/settings/deviceinfo/StorageSettingsTest.java @@ -0,0 +1,92 @@ +/* + * 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.deviceinfo; + + +import android.app.Activity; +import android.icu.text.NumberFormat; +import android.os.storage.VolumeInfo; +import android.text.format.Formatter; + +import com.android.settings.R; +import com.android.settings.SettingsRobolectricTestRunner; +import com.android.settings.TestConfig; +import com.android.settings.dashboard.SummaryLoader; +import com.android.settingslib.deviceinfo.StorageManagerVolumeProvider; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; +import org.robolectric.RuntimeEnvironment; +import org.robolectric.annotation.Config; +import org.robolectric.util.ReflectionHelpers; + +import java.util.ArrayList; +import java.util.List; + +import static org.mockito.Mockito.RETURNS_DEEP_STUBS; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +@RunWith(SettingsRobolectricTestRunner.class) +@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION) +public class StorageSettingsTest { + + @Mock + private StorageManagerVolumeProvider mStorageManagerVolumeProvider; + @Mock + private Activity mActivity; + + private List mVolumes; + + private StorageSettings mSettings; + + @Before + public void setUp() { + MockitoAnnotations.initMocks(this); + mVolumes = new ArrayList<>(); + mVolumes.add(mock(VolumeInfo.class, RETURNS_DEEP_STUBS)); + mSettings = new StorageSettings(); + when(mStorageManagerVolumeProvider.getVolumes()).thenReturn(mVolumes); + } + + @Test + public void updateSummary_shouldDisplayUsedPercentAndFreeSpace() { + final SummaryLoader loader = mock(SummaryLoader.class); + final SummaryLoader.SummaryProvider provider = + StorageSettings.SUMMARY_PROVIDER_FACTORY.createSummaryProvider(mActivity, loader); + final VolumeInfo volumeInfo = mVolumes.get(0); + when(volumeInfo.getType()).thenReturn(VolumeInfo.TYPE_PRIVATE); + when(volumeInfo.getPath().getTotalSpace()).thenReturn(500L); + when(volumeInfo.getPath().getFreeSpace()).thenReturn(0L); + + ReflectionHelpers.setField( + provider, "mStorageManagerVolumeProvider", mStorageManagerVolumeProvider); + ReflectionHelpers.setField(provider, "mContext", RuntimeEnvironment.application); + + provider.setListening(true); + + final String percentage = NumberFormat.getPercentInstance().format(1); + final String freeSpace = Formatter.formatFileSize(RuntimeEnvironment.application, 0); + verify(loader).setSummary(provider, + RuntimeEnvironment.application.getString( + R.string.storage_summary, percentage, freeSpace)); + } +}