Fast track the installed app details storage.
Change-Id: Ic96a7b4bea6d92a32669887dacbc1f4e54e25ea9
Fixes: 35805032
Test: Settings robotest
diff --git a/src/com/android/settings/applications/AppStorageSettings.java b/src/com/android/settings/applications/AppStorageSettings.java
index b4d7526..32c8d32 100644
--- a/src/com/android/settings/applications/AppStorageSettings.java
+++ b/src/com/android/settings/applications/AppStorageSettings.java
@@ -615,28 +615,6 @@
}
};
- public static CharSequence getSummary(AppEntry appEntry, Context context) {
- if (appEntry.size == ApplicationsState.SIZE_INVALID
- || appEntry.size == ApplicationsState.SIZE_UNKNOWN) {
- return context.getText(R.string.computing_size);
- } else {
- CharSequence storageType = context.getString(
- (appEntry.info.flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE) != 0
- ? R.string.storage_type_external
- : R.string.storage_type_internal);
- return context.getString(R.string.storage_summary_format,
- getSize(appEntry, context), storageType);
- }
- }
-
- private static CharSequence getSize(AppEntry appEntry, Context context) {
- long size = appEntry.size;
- if (size == SIZE_INVALID) {
- return context.getText(R.string.invalid_size_value);
- }
- return Formatter.formatFileSize(context, size);
- }
-
@Override
public int getMetricsCategory() {
return MetricsEvent.APPLICATIONS_APP_STORAGE;
diff --git a/src/com/android/settings/applications/InstalledAppDetails.java b/src/com/android/settings/applications/InstalledAppDetails.java
index 3427d9e..5a32531 100755
--- a/src/com/android/settings/applications/InstalledAppDetails.java
+++ b/src/com/android/settings/applications/InstalledAppDetails.java
@@ -16,10 +16,13 @@
package com.android.settings.applications;
+import static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
+
import android.Manifest.permission;
import android.app.Activity;
import android.app.ActivityManager;
import android.app.AlertDialog;
+import android.app.LoaderManager;
import android.app.LoaderManager.LoaderCallbacks;
import android.app.admin.DevicePolicyManager;
import android.content.ActivityNotFoundException;
@@ -103,6 +106,8 @@
import com.android.settingslib.applications.ApplicationsState.AppEntry;
import com.android.settingslib.applications.PermissionsSummaryHelper;
import com.android.settingslib.applications.PermissionsSummaryHelper.PermissionsResultCallback;
+import com.android.settingslib.applications.StorageStatsSource;
+import com.android.settingslib.applications.StorageStatsSource.AppStorageStats;
import com.android.settingslib.net.ChartData;
import com.android.settingslib.net.ChartDataLoader;
@@ -111,8 +116,6 @@
import java.util.HashSet;
import java.util.List;
-import static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
-
/**
* Activity to display application information from Settings. This activity presents
* extended information associated with a package like code, data, total size, permissions
@@ -123,7 +126,8 @@
* uninstall the application.
*/
public class InstalledAppDetails extends AppInfoBase
- implements View.OnClickListener, OnPreferenceClickListener {
+ implements View.OnClickListener, OnPreferenceClickListener,
+ LoaderManager.LoaderCallbacks<AppStorageStats> {
private static final String LOG_TAG = "InstalledAppDetails";
@@ -138,6 +142,7 @@
private static final int SUB_INFO_FRAGMENT = 1;
private static final int LOADER_CHART_DATA = 2;
+ private static final int LOADER_STORAGE = 3;
private static final int DLG_FORCE_STOP = DLG_BASE + 1;
private static final int DLG_DISABLE = DLG_BASE + 2;
@@ -191,6 +196,8 @@
protected ProcStatsData mStatsManager;
protected ProcStatsPackageEntry mStats;
+ private AppStorageStats mLastResult;
+
private boolean handleDisableable(Button button) {
boolean disableable = false;
// Try to prevent the user from bricking their phone
@@ -359,13 +366,14 @@
if (mFinishing) {
return;
}
- mState.requestSize(mPackageName, mUserId);
AppItem app = new AppItem(mAppEntry.info.uid);
app.addUid(mAppEntry.info.uid);
if (mStatsSession != null) {
- getLoaderManager().restartLoader(LOADER_CHART_DATA,
+ LoaderManager loaderManager = getLoaderManager();
+ loaderManager.restartLoader(LOADER_CHART_DATA,
ChartDataLoader.buildArgs(getTemplate(getContext()), app),
mDataCallbacks);
+ loaderManager.restartLoader(LOADER_STORAGE, Bundle.EMPTY, this);
}
new BatteryUpdater().execute();
new MemoryUpdater().execute();
@@ -536,6 +544,23 @@
}
}
+ @Override
+ public Loader<AppStorageStats> onCreateLoader(int id, Bundle args) {
+ Context context = getContext();
+ return new FetchPackageStorageAsyncLoader(
+ context, new StorageStatsSource(context), mAppEntry.info, UserHandle.of(mUserId));
+ }
+
+ @Override
+ public void onLoadFinished(Loader<AppStorageStats> loader, AppStorageStats result) {
+ mLastResult = result;
+ refreshUi();
+ }
+
+ @Override
+ public void onLoaderReset(Loader<AppStorageStats> loader) {
+ }
+
// Utility method to set application label and icon.
private void setAppLabelAndIcon(PackageInfo pkgInfo) {
final View appSnippet = mHeader.findViewById(R.id.app_snippet);
@@ -638,7 +663,8 @@
// Update the preference summaries.
Activity context = getActivity();
- mStoragePreference.setSummary(AppStorageSettings.getSummary(mAppEntry, context));
+ boolean isExternal = ((mAppEntry.info.flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE) != 0);
+ mStoragePreference.setSummary(getStorageSummary(context, mLastResult, isExternal));
PermissionsSummaryHelper.getPermissionSummary(getContext(),
mPackageName, mPermissionCallback);
@@ -707,6 +733,25 @@
return getString(R.string.computing_size);
}
+ @VisibleForTesting
+ static CharSequence getStorageSummary(
+ Context context, AppStorageStats stats, boolean isExternal) {
+ if (stats == null) {
+ return context.getText(R.string.computing_size);
+ } else {
+ CharSequence storageType = context.getString(isExternal
+ ? R.string.storage_type_external
+ : R.string.storage_type_internal);
+ return context.getString(R.string.storage_summary_format,
+ getSize(context, stats), storageType);
+ }
+ }
+
+ private static CharSequence getSize(Context context, AppStorageStats stats) {
+ return Formatter.formatFileSize(context, stats.getTotalBytes());
+ }
+
+
@Override
protected AlertDialog createDialog(int id, int errorCode) {
switch (id) {
diff --git a/tests/robotests/src/com/android/settings/applications/InstalledAppDetailsTest.java b/tests/robotests/src/com/android/settings/applications/InstalledAppDetailsTest.java
index 2a703ef..4fe6293 100644
--- a/tests/robotests/src/com/android/settings/applications/InstalledAppDetailsTest.java
+++ b/tests/robotests/src/com/android/settings/applications/InstalledAppDetailsTest.java
@@ -16,7 +16,14 @@
package com.android.settings.applications;
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Matchers.anyString;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
import android.app.admin.DevicePolicyManager;
+import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.os.UserManager;
@@ -25,6 +32,7 @@
import com.android.settings.SettingsRobolectricTestRunner;
import com.android.settings.TestConfig;
import com.android.settingslib.applications.ApplicationsState.AppEntry;
+import com.android.settingslib.applications.StorageStatsSource.AppStorageStats;
import org.junit.Before;
import org.junit.Test;
@@ -32,14 +40,10 @@
import org.mockito.Answers;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
+import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Config;
import org.robolectric.util.ReflectionHelpers;
-import static com.google.common.truth.Truth.assertThat;
-import static org.mockito.Matchers.anyString;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-
@RunWith(SettingsRobolectricTestRunner.class)
@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
public final class InstalledAppDetailsTest {
@@ -117,4 +121,24 @@
assertThat(mAppDetail.shouldShowUninstallForAll(appEntry)).isFalse();
}
+ @Test
+ public void getStorageSummary_shouldWorkForExternal() {
+ Context context = RuntimeEnvironment.application.getApplicationContext();
+ AppStorageStats stats = mock(AppStorageStats.class);
+ when(stats.getTotalBytes()).thenReturn(1L);
+
+ assertThat(InstalledAppDetails.getStorageSummary(context, stats, true))
+ .isEqualTo("1.00B used in External storage");
+ }
+
+ @Test
+ public void getStorageSummary_shouldWorkForInternal() {
+ Context context = RuntimeEnvironment.application.getApplicationContext();
+ AppStorageStats stats = mock(AppStorageStats.class);
+ when(stats.getTotalBytes()).thenReturn(1L);
+
+ assertThat(InstalledAppDetails.getStorageSummary(context, stats, false))
+ .isEqualTo("1.00B used in Internal storage");
+
+ }
}