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