Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ad7aa871 authored by Daniel Nishi's avatar Daniel Nishi
Browse files

Fast track the installed app details storage.

Change-Id: Ic96a7b4bea6d92a32669887dacbc1f4e54e25ea9
Fixes: 35805032
Test: Settings robotest
parent bdaf7572
Loading
Loading
Loading
Loading
+0 −22
Original line number Diff line number Diff line
@@ -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
    public int getMetricsCategory() {
        return MetricsEvent.APPLICATIONS_APP_STORAGE;
+51 −6
Original line number Diff line number Diff line
@@ -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;
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.ArrayList;
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 @@ import static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
 * 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 @@ public class InstalledAppDetails extends AppInfoBase
    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 @@ public class InstalledAppDetails extends AppInfoBase
    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 @@ public class InstalledAppDetails extends AppInfoBase
        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 @@ 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.
    private void setAppLabelAndIcon(PackageInfo pkgInfo) {
        final View appSnippet = mHeader.findViewById(R.id.app_snippet);
@@ -638,7 +663,8 @@ public class InstalledAppDetails extends AppInfoBase

        // 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 @@ public class InstalledAppDetails extends AppInfoBase
        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) {
+29 −5
Original line number Diff line number Diff line
@@ -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.R;
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.junit.runner.RunWith;
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 @@ public final class InstalledAppDetailsTest {
        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");

    }
}