Fast track the installed app details storage.
Change-Id: Ic96a7b4bea6d92a32669887dacbc1f4e54e25ea9 Fixes: 35805032 Test: Settings robotest
This commit is contained in:
@@ -615,28 +615,6 @@ public class AppStorageSettings extends AppInfoWithHeader
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
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
|
@Override
|
||||||
public int getMetricsCategory() {
|
public int getMetricsCategory() {
|
||||||
return MetricsEvent.APPLICATIONS_APP_STORAGE;
|
return MetricsEvent.APPLICATIONS_APP_STORAGE;
|
||||||
|
@@ -16,10 +16,13 @@
|
|||||||
|
|
||||||
package com.android.settings.applications;
|
package com.android.settings.applications;
|
||||||
|
|
||||||
|
import static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
|
||||||
|
|
||||||
import android.Manifest.permission;
|
import android.Manifest.permission;
|
||||||
import android.app.Activity;
|
import android.app.Activity;
|
||||||
import android.app.ActivityManager;
|
import android.app.ActivityManager;
|
||||||
import android.app.AlertDialog;
|
import android.app.AlertDialog;
|
||||||
|
import android.app.LoaderManager;
|
||||||
import android.app.LoaderManager.LoaderCallbacks;
|
import android.app.LoaderManager.LoaderCallbacks;
|
||||||
import android.app.admin.DevicePolicyManager;
|
import android.app.admin.DevicePolicyManager;
|
||||||
import android.content.ActivityNotFoundException;
|
import android.content.ActivityNotFoundException;
|
||||||
@@ -103,6 +106,8 @@ import com.android.settingslib.applications.ApplicationsState;
|
|||||||
import com.android.settingslib.applications.ApplicationsState.AppEntry;
|
import com.android.settingslib.applications.ApplicationsState.AppEntry;
|
||||||
import com.android.settingslib.applications.PermissionsSummaryHelper;
|
import com.android.settingslib.applications.PermissionsSummaryHelper;
|
||||||
import com.android.settingslib.applications.PermissionsSummaryHelper.PermissionsResultCallback;
|
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.ChartData;
|
||||||
import com.android.settingslib.net.ChartDataLoader;
|
import com.android.settingslib.net.ChartDataLoader;
|
||||||
|
|
||||||
@@ -111,8 +116,6 @@ import java.util.ArrayList;
|
|||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Activity to display application information from Settings. This activity presents
|
* Activity to display application information from Settings. This activity presents
|
||||||
* extended information associated with a package like code, data, total size, permissions
|
* extended information associated with a package like code, data, total size, permissions
|
||||||
@@ -123,7 +126,8 @@ import static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
|
|||||||
* uninstall the application.
|
* uninstall the application.
|
||||||
*/
|
*/
|
||||||
public class InstalledAppDetails extends AppInfoBase
|
public class InstalledAppDetails extends AppInfoBase
|
||||||
implements View.OnClickListener, OnPreferenceClickListener {
|
implements View.OnClickListener, OnPreferenceClickListener,
|
||||||
|
LoaderManager.LoaderCallbacks<AppStorageStats> {
|
||||||
|
|
||||||
private static final String LOG_TAG = "InstalledAppDetails";
|
private static final String LOG_TAG = "InstalledAppDetails";
|
||||||
|
|
||||||
@@ -138,6 +142,7 @@ public class InstalledAppDetails extends AppInfoBase
|
|||||||
private static final int SUB_INFO_FRAGMENT = 1;
|
private static final int SUB_INFO_FRAGMENT = 1;
|
||||||
|
|
||||||
private static final int LOADER_CHART_DATA = 2;
|
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_FORCE_STOP = DLG_BASE + 1;
|
||||||
private static final int DLG_DISABLE = DLG_BASE + 2;
|
private static final int DLG_DISABLE = DLG_BASE + 2;
|
||||||
@@ -191,6 +196,8 @@ public class InstalledAppDetails extends AppInfoBase
|
|||||||
protected ProcStatsData mStatsManager;
|
protected ProcStatsData mStatsManager;
|
||||||
protected ProcStatsPackageEntry mStats;
|
protected ProcStatsPackageEntry mStats;
|
||||||
|
|
||||||
|
private AppStorageStats mLastResult;
|
||||||
|
|
||||||
private boolean handleDisableable(Button button) {
|
private boolean handleDisableable(Button button) {
|
||||||
boolean disableable = false;
|
boolean disableable = false;
|
||||||
// Try to prevent the user from bricking their phone
|
// Try to prevent the user from bricking their phone
|
||||||
@@ -359,13 +366,14 @@ public class InstalledAppDetails extends AppInfoBase
|
|||||||
if (mFinishing) {
|
if (mFinishing) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
mState.requestSize(mPackageName, mUserId);
|
|
||||||
AppItem app = new AppItem(mAppEntry.info.uid);
|
AppItem app = new AppItem(mAppEntry.info.uid);
|
||||||
app.addUid(mAppEntry.info.uid);
|
app.addUid(mAppEntry.info.uid);
|
||||||
if (mStatsSession != null) {
|
if (mStatsSession != null) {
|
||||||
getLoaderManager().restartLoader(LOADER_CHART_DATA,
|
LoaderManager loaderManager = getLoaderManager();
|
||||||
|
loaderManager.restartLoader(LOADER_CHART_DATA,
|
||||||
ChartDataLoader.buildArgs(getTemplate(getContext()), app),
|
ChartDataLoader.buildArgs(getTemplate(getContext()), app),
|
||||||
mDataCallbacks);
|
mDataCallbacks);
|
||||||
|
loaderManager.restartLoader(LOADER_STORAGE, Bundle.EMPTY, this);
|
||||||
}
|
}
|
||||||
new BatteryUpdater().execute();
|
new BatteryUpdater().execute();
|
||||||
new MemoryUpdater().execute();
|
new MemoryUpdater().execute();
|
||||||
@@ -536,6 +544,23 @@ public class InstalledAppDetails extends AppInfoBase
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@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.
|
// Utility method to set application label and icon.
|
||||||
private void setAppLabelAndIcon(PackageInfo pkgInfo) {
|
private void setAppLabelAndIcon(PackageInfo pkgInfo) {
|
||||||
final View appSnippet = mHeader.findViewById(R.id.app_snippet);
|
final View appSnippet = mHeader.findViewById(R.id.app_snippet);
|
||||||
@@ -638,7 +663,8 @@ public class InstalledAppDetails extends AppInfoBase
|
|||||||
|
|
||||||
// Update the preference summaries.
|
// Update the preference summaries.
|
||||||
Activity context = getActivity();
|
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(),
|
PermissionsSummaryHelper.getPermissionSummary(getContext(),
|
||||||
mPackageName, mPermissionCallback);
|
mPackageName, mPermissionCallback);
|
||||||
@@ -707,6 +733,25 @@ public class InstalledAppDetails extends AppInfoBase
|
|||||||
return getString(R.string.computing_size);
|
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
|
@Override
|
||||||
protected AlertDialog createDialog(int id, int errorCode) {
|
protected AlertDialog createDialog(int id, int errorCode) {
|
||||||
switch (id) {
|
switch (id) {
|
||||||
|
@@ -16,7 +16,14 @@
|
|||||||
|
|
||||||
package com.android.settings.applications;
|
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.app.admin.DevicePolicyManager;
|
||||||
|
import android.content.Context;
|
||||||
import android.content.pm.ApplicationInfo;
|
import android.content.pm.ApplicationInfo;
|
||||||
import android.content.pm.PackageInfo;
|
import android.content.pm.PackageInfo;
|
||||||
import android.os.UserManager;
|
import android.os.UserManager;
|
||||||
@@ -25,6 +32,7 @@ import com.android.settings.R;
|
|||||||
import com.android.settings.SettingsRobolectricTestRunner;
|
import com.android.settings.SettingsRobolectricTestRunner;
|
||||||
import com.android.settings.TestConfig;
|
import com.android.settings.TestConfig;
|
||||||
import com.android.settingslib.applications.ApplicationsState.AppEntry;
|
import com.android.settingslib.applications.ApplicationsState.AppEntry;
|
||||||
|
import com.android.settingslib.applications.StorageStatsSource.AppStorageStats;
|
||||||
|
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
@@ -32,14 +40,10 @@ import org.junit.runner.RunWith;
|
|||||||
import org.mockito.Answers;
|
import org.mockito.Answers;
|
||||||
import org.mockito.Mock;
|
import org.mockito.Mock;
|
||||||
import org.mockito.MockitoAnnotations;
|
import org.mockito.MockitoAnnotations;
|
||||||
|
import org.robolectric.RuntimeEnvironment;
|
||||||
import org.robolectric.annotation.Config;
|
import org.robolectric.annotation.Config;
|
||||||
import org.robolectric.util.ReflectionHelpers;
|
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)
|
@RunWith(SettingsRobolectricTestRunner.class)
|
||||||
@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
|
@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
|
||||||
public final class InstalledAppDetailsTest {
|
public final class InstalledAppDetailsTest {
|
||||||
@@ -117,4 +121,24 @@ public final class InstalledAppDetailsTest {
|
|||||||
assertThat(mAppDetail.shouldShowUninstallForAll(appEntry)).isFalse();
|
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");
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user