16eb88778484fde825092e8b880dda7948fbdb042Doris Ling/*
26eb88778484fde825092e8b880dda7948fbdb042Doris Ling * Copyright (C) 2017 The Android Open Source Project
36eb88778484fde825092e8b880dda7948fbdb042Doris Ling *
46eb88778484fde825092e8b880dda7948fbdb042Doris Ling * Licensed under the Apache License, Version 2.0 (the "License");
56eb88778484fde825092e8b880dda7948fbdb042Doris Ling * you may not use this file except in compliance with the License.
66eb88778484fde825092e8b880dda7948fbdb042Doris Ling * You may obtain a copy of the License at
76eb88778484fde825092e8b880dda7948fbdb042Doris Ling *
86eb88778484fde825092e8b880dda7948fbdb042Doris Ling *      http://www.apache.org/licenses/LICENSE-2.0
96eb88778484fde825092e8b880dda7948fbdb042Doris Ling *
106eb88778484fde825092e8b880dda7948fbdb042Doris Ling * Unless required by applicable law or agreed to in writing, software
116eb88778484fde825092e8b880dda7948fbdb042Doris Ling * distributed under the License is distributed on an "AS IS" BASIS,
126eb88778484fde825092e8b880dda7948fbdb042Doris Ling * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
136eb88778484fde825092e8b880dda7948fbdb042Doris Ling * See the License for the specific language governing permissions and
146eb88778484fde825092e8b880dda7948fbdb042Doris Ling * limitations under the License.
156eb88778484fde825092e8b880dda7948fbdb042Doris Ling */
166eb88778484fde825092e8b880dda7948fbdb042Doris Ling
176eb88778484fde825092e8b880dda7948fbdb042Doris Lingpackage com.android.settings.applications.appinfo;
186eb88778484fde825092e8b880dda7948fbdb042Doris Ling
196eb88778484fde825092e8b880dda7948fbdb042Doris Lingimport android.app.LoaderManager;
206eb88778484fde825092e8b880dda7948fbdb042Doris Lingimport android.content.Context;
216eb88778484fde825092e8b880dda7948fbdb042Doris Lingimport android.content.Loader;
226eb88778484fde825092e8b880dda7948fbdb042Doris Lingimport android.content.pm.ApplicationInfo;
236eb88778484fde825092e8b880dda7948fbdb042Doris Lingimport android.os.Bundle;
246eb88778484fde825092e8b880dda7948fbdb042Doris Lingimport android.os.UserHandle;
256eb88778484fde825092e8b880dda7948fbdb042Doris Lingimport android.support.annotation.VisibleForTesting;
266eb88778484fde825092e8b880dda7948fbdb042Doris Lingimport android.support.v7.preference.Preference;
276eb88778484fde825092e8b880dda7948fbdb042Doris Lingimport android.text.format.Formatter;
286eb88778484fde825092e8b880dda7948fbdb042Doris Ling
296eb88778484fde825092e8b880dda7948fbdb042Doris Lingimport com.android.settings.R;
306eb88778484fde825092e8b880dda7948fbdb042Doris Lingimport com.android.settings.SettingsPreferenceFragment;
316eb88778484fde825092e8b880dda7948fbdb042Doris Lingimport com.android.settings.applications.AppStorageSettings;
326eb88778484fde825092e8b880dda7948fbdb042Doris Lingimport com.android.settings.applications.FetchPackageStorageAsyncLoader;
336eb88778484fde825092e8b880dda7948fbdb042Doris Lingimport com.android.settingslib.applications.StorageStatsSource;
346eb88778484fde825092e8b880dda7948fbdb042Doris Lingimport com.android.settingslib.core.lifecycle.LifecycleObserver;
356eb88778484fde825092e8b880dda7948fbdb042Doris Lingimport com.android.settingslib.core.lifecycle.events.OnPause;
366eb88778484fde825092e8b880dda7948fbdb042Doris Lingimport com.android.settingslib.core.lifecycle.events.OnResume;
376eb88778484fde825092e8b880dda7948fbdb042Doris Ling
386eb88778484fde825092e8b880dda7948fbdb042Doris Lingpublic class AppStoragePreferenceController extends AppInfoPreferenceControllerBase
396eb88778484fde825092e8b880dda7948fbdb042Doris Ling        implements LoaderManager.LoaderCallbacks<StorageStatsSource.AppStorageStats>,
406eb88778484fde825092e8b880dda7948fbdb042Doris Ling        LifecycleObserver, OnResume, OnPause {
416eb88778484fde825092e8b880dda7948fbdb042Doris Ling
426eb88778484fde825092e8b880dda7948fbdb042Doris Ling    private StorageStatsSource.AppStorageStats mLastResult;
436eb88778484fde825092e8b880dda7948fbdb042Doris Ling
44b5c651c9399aa53e0bef296a265a47c825fe12b2Fan Zhang    public AppStoragePreferenceController(Context context, String key) {
45b5c651c9399aa53e0bef296a265a47c825fe12b2Fan Zhang        super(context, key);
466eb88778484fde825092e8b880dda7948fbdb042Doris Ling    }
476eb88778484fde825092e8b880dda7948fbdb042Doris Ling
486eb88778484fde825092e8b880dda7948fbdb042Doris Ling    @Override
496eb88778484fde825092e8b880dda7948fbdb042Doris Ling    public void updateState(Preference preference) {
506eb88778484fde825092e8b880dda7948fbdb042Doris Ling        final boolean isExternal =
516eb88778484fde825092e8b880dda7948fbdb042Doris Ling                (mParent.getAppEntry().info.flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE) != 0;
526eb88778484fde825092e8b880dda7948fbdb042Doris Ling        preference.setSummary(getStorageSummary(mLastResult, isExternal));
536eb88778484fde825092e8b880dda7948fbdb042Doris Ling    }
546eb88778484fde825092e8b880dda7948fbdb042Doris Ling
556eb88778484fde825092e8b880dda7948fbdb042Doris Ling    @Override
566eb88778484fde825092e8b880dda7948fbdb042Doris Ling    public void onResume() {
576eb88778484fde825092e8b880dda7948fbdb042Doris Ling        mParent.getLoaderManager().restartLoader(mParent.LOADER_STORAGE, Bundle.EMPTY, this);
586eb88778484fde825092e8b880dda7948fbdb042Doris Ling    }
596eb88778484fde825092e8b880dda7948fbdb042Doris Ling
606eb88778484fde825092e8b880dda7948fbdb042Doris Ling    @Override
616eb88778484fde825092e8b880dda7948fbdb042Doris Ling    public void onPause() {
626eb88778484fde825092e8b880dda7948fbdb042Doris Ling        mParent.getLoaderManager().destroyLoader(mParent.LOADER_STORAGE);
636eb88778484fde825092e8b880dda7948fbdb042Doris Ling    }
646eb88778484fde825092e8b880dda7948fbdb042Doris Ling
656eb88778484fde825092e8b880dda7948fbdb042Doris Ling    @Override
666eb88778484fde825092e8b880dda7948fbdb042Doris Ling    protected Class<? extends SettingsPreferenceFragment> getDetailFragmentClass() {
676eb88778484fde825092e8b880dda7948fbdb042Doris Ling        return AppStorageSettings.class;
686eb88778484fde825092e8b880dda7948fbdb042Doris Ling    }
696eb88778484fde825092e8b880dda7948fbdb042Doris Ling
706eb88778484fde825092e8b880dda7948fbdb042Doris Ling    @VisibleForTesting
716eb88778484fde825092e8b880dda7948fbdb042Doris Ling    CharSequence getStorageSummary(
726eb88778484fde825092e8b880dda7948fbdb042Doris Ling            StorageStatsSource.AppStorageStats stats, boolean isExternal) {
736eb88778484fde825092e8b880dda7948fbdb042Doris Ling        if (stats == null) {
746eb88778484fde825092e8b880dda7948fbdb042Doris Ling            return mContext.getText(R.string.computing_size);
756eb88778484fde825092e8b880dda7948fbdb042Doris Ling        }
766eb88778484fde825092e8b880dda7948fbdb042Doris Ling        final CharSequence storageType = mContext.getString(isExternal
776eb88778484fde825092e8b880dda7948fbdb042Doris Ling                ? R.string.storage_type_external
786eb88778484fde825092e8b880dda7948fbdb042Doris Ling                : R.string.storage_type_internal);
796eb88778484fde825092e8b880dda7948fbdb042Doris Ling        return mContext.getString(R.string.storage_summary_format,
806eb88778484fde825092e8b880dda7948fbdb042Doris Ling                Formatter.formatFileSize(mContext, stats.getTotalBytes()),
816eb88778484fde825092e8b880dda7948fbdb042Doris Ling                storageType.toString().toLowerCase());
826eb88778484fde825092e8b880dda7948fbdb042Doris Ling    }
836eb88778484fde825092e8b880dda7948fbdb042Doris Ling
846eb88778484fde825092e8b880dda7948fbdb042Doris Ling    @Override
856eb88778484fde825092e8b880dda7948fbdb042Doris Ling    public Loader<StorageStatsSource.AppStorageStats> onCreateLoader(int id, Bundle args) {
866eb88778484fde825092e8b880dda7948fbdb042Doris Ling        return new FetchPackageStorageAsyncLoader(mContext, new StorageStatsSource(mContext),
876eb88778484fde825092e8b880dda7948fbdb042Doris Ling                mParent.getAppEntry().info, UserHandle.of(UserHandle.myUserId()));
886eb88778484fde825092e8b880dda7948fbdb042Doris Ling    }
896eb88778484fde825092e8b880dda7948fbdb042Doris Ling
906eb88778484fde825092e8b880dda7948fbdb042Doris Ling    @Override
916eb88778484fde825092e8b880dda7948fbdb042Doris Ling    public void onLoadFinished(Loader<StorageStatsSource.AppStorageStats> loader,
926eb88778484fde825092e8b880dda7948fbdb042Doris Ling            StorageStatsSource.AppStorageStats result) {
936eb88778484fde825092e8b880dda7948fbdb042Doris Ling        mLastResult = result;
946eb88778484fde825092e8b880dda7948fbdb042Doris Ling        updateState(mPreference);
956eb88778484fde825092e8b880dda7948fbdb042Doris Ling    }
966eb88778484fde825092e8b880dda7948fbdb042Doris Ling
976eb88778484fde825092e8b880dda7948fbdb042Doris Ling    @Override
986eb88778484fde825092e8b880dda7948fbdb042Doris Ling    public void onLoaderReset(Loader<StorageStatsSource.AppStorageStats> loader) {
996eb88778484fde825092e8b880dda7948fbdb042Doris Ling    }
1006eb88778484fde825092e8b880dda7948fbdb042Doris Ling
1016eb88778484fde825092e8b880dda7948fbdb042Doris Ling}
102