DeletionHelperSettings.java revision 9385b673317060523b66a40780d5ad1df1530a56
109fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi/* 209fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi * Copyright (C) 2016 The Android Open Source Project 309fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi * 409fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi * Licensed under the Apache License, Version 2.0 (the "License"); 509fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi * you may not use this file except in compliance with the License. 609fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi * You may obtain a copy of the License at 709fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi * 809fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi * http://www.apache.org/licenses/LICENSE-2.0 909fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi * 1009fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi * Unless required by applicable law or agreed to in writing, software 1109fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi * distributed under the License is distributed on an "AS IS" BASIS, 1209fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1309fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi * See the License for the specific language governing permissions and 1409fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi * limitations under the License. 1509fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi */ 1609fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi 1709fa1388d090666e631f9d764f935604a2c753e9Daniel Nishipackage com.android.storagemanager.deletionhelper; 1809fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi 1909fa1388d090666e631f9d764f935604a2c753e9Daniel Nishiimport android.Manifest; 2009fa1388d090666e631f9d764f935604a2c753e9Daniel Nishiimport android.app.Activity; 2109fa1388d090666e631f9d764f935604a2c753e9Daniel Nishiimport android.content.pm.PackageManager; 2209fa1388d090666e631f9d764f935604a2c753e9Daniel Nishiimport android.os.Bundle; 2309fa1388d090666e631f9d764f935604a2c753e9Daniel Nishiimport android.support.v14.preference.PreferenceFragment; 2409fa1388d090666e631f9d764f935604a2c753e9Daniel Nishiimport android.text.format.Formatter; 2596fda63c3eeabf90a5420730d4729726dce504b3Daniel Nishiimport android.view.Menu; 2696fda63c3eeabf90a5420730d4729726dce504b3Daniel Nishiimport android.view.MenuInflater; 2709fa1388d090666e631f9d764f935604a2c753e9Daniel Nishiimport android.view.View; 2809fa1388d090666e631f9d764f935604a2c753e9Daniel Nishiimport android.widget.Button; 292ace931586ac5ee3d0633c051bc276690975f3eaDaniel Nishiimport com.android.internal.logging.MetricsLogger; 301efe581749de7f50de41bac1e31b1389ac964615Tamas Berghammerimport com.android.internal.logging.nano.MetricsProto.MetricsEvent; 3196fda63c3eeabf90a5420730d4729726dce504b3Daniel Nishiimport com.android.settingslib.HelpUtils; 3209fa1388d090666e631f9d764f935604a2c753e9Daniel Nishiimport com.android.storagemanager.ButtonBarProvider; 3309fa1388d090666e631f9d764f935604a2c753e9Daniel Nishiimport com.android.storagemanager.R; 3409fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi 35b26f457e30d6d444c873efaaf26181139bb92aedDaniel Nishiimport com.android.storagemanager.overlay.FeatureFactory; 36b26f457e30d6d444c873efaaf26181139bb92aedDaniel Nishiimport com.android.storagemanager.overlay.DeletionHelperFeatureProvider; 37b26f457e30d6d444c873efaaf26181139bb92aedDaniel Nishi 3820c31e6ef425e2127a1243cc679b31afeee47541Daniel Nishiimport java.util.ArrayList; 3909fa1388d090666e631f9d764f935604a2c753e9Daniel Nishiimport java.util.HashSet; 409385b673317060523b66a40780d5ad1df1530a56Salvador Martinezimport java.util.List; 4109fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi 4209fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi/** 4309fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi * Settings screen for the deletion helper, which manually removes data which is not recently used. 4409fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi */ 4509fa1388d090666e631f9d764f935604a2c753e9Daniel Nishipublic class DeletionHelperSettings extends PreferenceFragment implements 4609fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi DeletionType.FreeableChangedListener, 4709fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi View.OnClickListener { 489385b673317060523b66a40780d5ad1df1530a56Salvador Martinez protected static final String APPS_KEY = "apps_group"; 499385b673317060523b66a40780d5ad1df1530a56Salvador Martinez protected static final String KEY_DOWNLOADS_PREFERENCE = "delete_downloads"; 509385b673317060523b66a40780d5ad1df1530a56Salvador Martinez protected static final String KEY_PHOTOS_VIDEOS_PREFERENCE = "delete_photos"; 519385b673317060523b66a40780d5ad1df1530a56Salvador Martinez private static final String THRESHOLD_KEY = "threshold_key"; 5209fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi private static final int DOWNLOADS_LOADER_ID = 1; 539385b673317060523b66a40780d5ad1df1530a56Salvador Martinez private static final int NUM_DELETION_TYPES = 3; 5409fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi 5509fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi private AppDeletionPreferenceGroup mApps; 5609fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi private AppDeletionType mAppBackend; 5709fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi private DownloadsDeletionPreferenceGroup mDownloadsPreference; 5809fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi private DownloadsDeletionType mDownloadsDeletion; 59b26f457e30d6d444c873efaaf26181139bb92aedDaniel Nishi private PhotosDeletionPreference mPhotoPreference; 60b26f457e30d6d444c873efaaf26181139bb92aedDaniel Nishi private DeletionType mPhotoVideoDeletion; 6109fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi private Button mCancel, mFree; 62b26f457e30d6d444c873efaaf26181139bb92aedDaniel Nishi private DeletionHelperFeatureProvider mProvider; 639385b673317060523b66a40780d5ad1df1530a56Salvador Martinez private List<DeletionType> mDeletableContentList; 649385b673317060523b66a40780d5ad1df1530a56Salvador Martinez private int mThresholdType; 6509fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi 669385b673317060523b66a40780d5ad1df1530a56Salvador Martinez public static DeletionHelperSettings newInstance(int thresholdType) { 679385b673317060523b66a40780d5ad1df1530a56Salvador Martinez DeletionHelperSettings instance = new DeletionHelperSettings(); 689385b673317060523b66a40780d5ad1df1530a56Salvador Martinez Bundle bundle = new Bundle(1); 699385b673317060523b66a40780d5ad1df1530a56Salvador Martinez bundle.putInt(THRESHOLD_KEY, thresholdType); 709385b673317060523b66a40780d5ad1df1530a56Salvador Martinez instance.setArguments(bundle); 719385b673317060523b66a40780d5ad1df1530a56Salvador Martinez return instance; 7209fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi } 7309fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi 7409fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi @Override 7509fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { 7609fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi addPreferencesFromResource(R.xml.deletion_helper_list); 779385b673317060523b66a40780d5ad1df1530a56Salvador Martinez mThresholdType = 789385b673317060523b66a40780d5ad1df1530a56Salvador Martinez getArguments().getInt(THRESHOLD_KEY, AppStateUsageStatsBridge.NORMAL_THRESHOLD); 7909fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi mApps = (AppDeletionPreferenceGroup) findPreference(APPS_KEY); 809385b673317060523b66a40780d5ad1df1530a56Salvador Martinez mPhotoPreference = (PhotosDeletionPreference) findPreference(KEY_PHOTOS_VIDEOS_PREFERENCE); 819385b673317060523b66a40780d5ad1df1530a56Salvador Martinez mProvider = FeatureFactory.getFactory(getActivity()).getDeletionHelperFeatureProvider(); 829385b673317060523b66a40780d5ad1df1530a56Salvador Martinez if (mProvider != null) { 839385b673317060523b66a40780d5ad1df1530a56Salvador Martinez mPhotoVideoDeletion = 849385b673317060523b66a40780d5ad1df1530a56Salvador Martinez mProvider.createPhotoVideoDeletionType(getContext(), mThresholdType); 859385b673317060523b66a40780d5ad1df1530a56Salvador Martinez } 8609fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi 8709fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi HashSet<String> checkedApplications = null; 8809fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi if (savedInstanceState != null) { 8909fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi checkedApplications = 9009fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi (HashSet<String>) savedInstanceState.getSerializable( 9109fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi AppDeletionType.EXTRA_CHECKED_SET); 9209fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi } 939385b673317060523b66a40780d5ad1df1530a56Salvador Martinez mAppBackend = 949385b673317060523b66a40780d5ad1df1530a56Salvador Martinez new AppDeletionType( 959385b673317060523b66a40780d5ad1df1530a56Salvador Martinez getActivity().getApplication(), checkedApplications, mThresholdType); 9609fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi mAppBackend.registerView(mApps); 9709fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi mAppBackend.registerFreeableChangedListener(this); 9809fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi mApps.setDeletionType(mAppBackend); 99b26f457e30d6d444c873efaaf26181139bb92aedDaniel Nishi 1009385b673317060523b66a40780d5ad1df1530a56Salvador Martinez mDeletableContentList = new ArrayList<>(NUM_DELETION_TYPES); 10109fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi } 10209fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi 10309fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi @Override 10409fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi public void onActivityCreated(Bundle savedInstanceState) { 10509fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi super.onActivityCreated(savedInstanceState); 10609fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi initializeButtons(); 10796fda63c3eeabf90a5420730d4729726dce504b3Daniel Nishi setHasOptionsMenu(true); 10809fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi Activity activity = getActivity(); 10909fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi if (activity.checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) 11009fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi != PackageManager.PERMISSION_GRANTED) { 11109fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi activity.requestPermissions( 11209fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi new String[] {Manifest.permission.READ_EXTERNAL_STORAGE}, 11309fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi 0); 11409fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi } 115b26f457e30d6d444c873efaaf26181139bb92aedDaniel Nishi 1169385b673317060523b66a40780d5ad1df1530a56Salvador Martinez if (mProvider != null && mPhotoVideoDeletion != null) { 1179385b673317060523b66a40780d5ad1df1530a56Salvador Martinez mPhotoPreference.setDaysToKeep(mProvider.getDaysToKeep(mThresholdType)); 118b26f457e30d6d444c873efaaf26181139bb92aedDaniel Nishi mPhotoPreference.registerFreeableChangedListener(this); 119b26f457e30d6d444c873efaaf26181139bb92aedDaniel Nishi mPhotoPreference.registerDeletionService(mPhotoVideoDeletion); 1209385b673317060523b66a40780d5ad1df1530a56Salvador Martinez mDeletableContentList.add(mPhotoVideoDeletion); 121b26f457e30d6d444c873efaaf26181139bb92aedDaniel Nishi } 12220c31e6ef425e2127a1243cc679b31afeee47541Daniel Nishi 12320c31e6ef425e2127a1243cc679b31afeee47541Daniel Nishi String[] uncheckedFiles = null; 12420c31e6ef425e2127a1243cc679b31afeee47541Daniel Nishi if (savedInstanceState != null) { 1259385b673317060523b66a40780d5ad1df1530a56Salvador Martinez uncheckedFiles = 1269385b673317060523b66a40780d5ad1df1530a56Salvador Martinez savedInstanceState.getStringArray( 12720c31e6ef425e2127a1243cc679b31afeee47541Daniel Nishi DownloadsDeletionType.EXTRA_UNCHECKED_DOWNLOADS); 12820c31e6ef425e2127a1243cc679b31afeee47541Daniel Nishi } 12909fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi mDownloadsPreference = 13009fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi (DownloadsDeletionPreferenceGroup) findPreference(KEY_DOWNLOADS_PREFERENCE); 13120c31e6ef425e2127a1243cc679b31afeee47541Daniel Nishi mDownloadsDeletion = new DownloadsDeletionType(getActivity(), uncheckedFiles); 13209fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi mDownloadsPreference.registerFreeableChangedListener(this); 13309fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi mDownloadsPreference.registerDeletionService(mDownloadsDeletion); 1349385b673317060523b66a40780d5ad1df1530a56Salvador Martinez mDeletableContentList.add(mDownloadsDeletion); 1359385b673317060523b66a40780d5ad1df1530a56Salvador Martinez 1369385b673317060523b66a40780d5ad1df1530a56Salvador Martinez mDeletableContentList.add(mAppBackend); 13709fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi updateFreeButtonText(); 13809fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi } 13909fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi 14009fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi @Override 14109fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi public void onResume() { 14209fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi super.onResume(); 1439385b673317060523b66a40780d5ad1df1530a56Salvador Martinez for (int i = 0, size = mDeletableContentList.size(); i < size; i++) { 1449385b673317060523b66a40780d5ad1df1530a56Salvador Martinez mDeletableContentList.get(i).onResume(); 14509fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi } 146b26f457e30d6d444c873efaaf26181139bb92aedDaniel Nishi 1479385b673317060523b66a40780d5ad1df1530a56Salvador Martinez if (mDownloadsDeletion != null 1489385b673317060523b66a40780d5ad1df1530a56Salvador Martinez && getActivity().checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) 1499385b673317060523b66a40780d5ad1df1530a56Salvador Martinez == PackageManager.PERMISSION_GRANTED) { 1509385b673317060523b66a40780d5ad1df1530a56Salvador Martinez getLoaderManager().initLoader(DOWNLOADS_LOADER_ID, new Bundle(), mDownloadsDeletion); 151b26f457e30d6d444c873efaaf26181139bb92aedDaniel Nishi } 15209fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi } 15309fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi 15409fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi @Override 15509fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi public void onPause() { 15609fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi super.onPause(); 1579385b673317060523b66a40780d5ad1df1530a56Salvador Martinez for (int i = 0, size = mDeletableContentList.size(); i < size; i++) { 1589385b673317060523b66a40780d5ad1df1530a56Salvador Martinez mDeletableContentList.get(i).onPause(); 159b26f457e30d6d444c873efaaf26181139bb92aedDaniel Nishi } 16009fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi } 16109fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi 16209fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi @Override 16309fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi public void onSaveInstanceState(Bundle outState) { 16409fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi super.onSaveInstanceState(outState); 1659385b673317060523b66a40780d5ad1df1530a56Salvador Martinez for (int i = 0, size = mDeletableContentList.size(); i < size; i++) { 1669385b673317060523b66a40780d5ad1df1530a56Salvador Martinez mDeletableContentList.get(i).onSaveInstanceStateBundle(outState); 1679385b673317060523b66a40780d5ad1df1530a56Salvador Martinez } 16809fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi } 16909fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi 1709385b673317060523b66a40780d5ad1df1530a56Salvador Martinez 17109fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi @Override 17209fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi public void onFreeableChanged(int numItems, long bytesFreeable) { 1732a508e16fa21573aa2fcb2f985136566b8301f35Daniel Nishi // bytesFreeable is the number of bytes freed by a single deletion type. If it is non-zero, 1742a508e16fa21573aa2fcb2f985136566b8301f35Daniel Nishi // there is stuff to free and we can enable it. If it is zero, though, we still need to get 1752a508e16fa21573aa2fcb2f985136566b8301f35Daniel Nishi // getTotalFreeableSpace to check all deletion types. 1762a508e16fa21573aa2fcb2f985136566b8301f35Daniel Nishi mFree.setEnabled(bytesFreeable != 0 || getTotalFreeableSpace() != 0); 17709fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi updateFreeButtonText(); 17809fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi } 17909fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi 18009fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi /** 18109fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi * Clears out the selected apps and data from the device and closes the fragment. 18209fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi */ 18309fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi protected void clearData() { 184b26f457e30d6d444c873efaaf26181139bb92aedDaniel Nishi // This should be fine as long as there is only one extra deletion feature. 185b26f457e30d6d444c873efaaf26181139bb92aedDaniel Nishi // In the future, this should be done in an async queue in order to not 186b26f457e30d6d444c873efaaf26181139bb92aedDaniel Nishi // interfere with the simultaneous PackageDeletionTask. 187b26f457e30d6d444c873efaaf26181139bb92aedDaniel Nishi if (mPhotoPreference != null && mPhotoPreference.isChecked()) { 188b26f457e30d6d444c873efaaf26181139bb92aedDaniel Nishi mPhotoVideoDeletion.clearFreeableData(getActivity()); 189b26f457e30d6d444c873efaaf26181139bb92aedDaniel Nishi } 1909385b673317060523b66a40780d5ad1df1530a56Salvador Martinez if (mDownloadsPreference != null) { 1919385b673317060523b66a40780d5ad1df1530a56Salvador Martinez mDownloadsDeletion.clearFreeableData(getActivity()); 1929385b673317060523b66a40780d5ad1df1530a56Salvador Martinez } 19309fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi mAppBackend.clearFreeableData(getActivity()); 19409fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi } 19509fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi 19609fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi @Override 19709fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi public void onClick(View v) { 198aff68018da784efc08b532597c2691465546957bDaniel Nishi if (v.getId() == R.id.next_button) { 19909fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi ConfirmDeletionDialog dialog = 20009fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi ConfirmDeletionDialog.newInstance(getTotalFreeableSpace()); 20109fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi // The 0 is a placeholder for an optional result code. 20209fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi dialog.setTargetFragment(this, 0); 20309fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi dialog.show(getFragmentManager(), ConfirmDeletionDialog.TAG); 2042ace931586ac5ee3d0633c051bc276690975f3eaDaniel Nishi MetricsLogger.action(getContext(), MetricsEvent.ACTION_DELETION_HELPER_CLEAR); 20509fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi } else { 2062ace931586ac5ee3d0633c051bc276690975f3eaDaniel Nishi MetricsLogger.action(getContext(), MetricsEvent.ACTION_DELETION_HELPER_CANCEL); 207aff68018da784efc08b532597c2691465546957bDaniel Nishi getActivity().finish(); 20809fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi } 20909fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi } 21009fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi 21109fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi @Override 21209fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi public void onRequestPermissionsResult(int requestCode, String permissions[], 21309fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi int[] grantResults) { 21409fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi if (requestCode == 0) { 21509fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 21609fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi mDownloadsDeletion.onResume(); 21709fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi getLoaderManager().initLoader(DOWNLOADS_LOADER_ID, new Bundle(), 21809fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi mDownloadsDeletion); 21909fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi } 22009fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi } 22109fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi } 22209fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi 22396fda63c3eeabf90a5420730d4729726dce504b3Daniel Nishi @Override 22496fda63c3eeabf90a5420730d4729726dce504b3Daniel Nishi public void onCreateOptionsMenu(Menu menu, MenuInflater menuInflater) { 22596fda63c3eeabf90a5420730d4729726dce504b3Daniel Nishi Activity activity = getActivity(); 22696fda63c3eeabf90a5420730d4729726dce504b3Daniel Nishi String mHelpUri = getResources().getString(R.string.help_uri_deletion_helper); 22796fda63c3eeabf90a5420730d4729726dce504b3Daniel Nishi if (mHelpUri != null && activity != null) { 22896fda63c3eeabf90a5420730d4729726dce504b3Daniel Nishi HelpUtils.prepareHelpMenuItem(activity, menu, mHelpUri, getClass().getName()); 22996fda63c3eeabf90a5420730d4729726dce504b3Daniel Nishi } 23096fda63c3eeabf90a5420730d4729726dce504b3Daniel Nishi } 23196fda63c3eeabf90a5420730d4729726dce504b3Daniel Nishi 23209fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi private void initializeButtons() { 23309fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi ButtonBarProvider activity = (ButtonBarProvider) getActivity(); 23409fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi activity.getButtonBar().setVisibility(View.VISIBLE); 23509fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi 23609fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi mCancel = activity.getSkipButton(); 23709fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi mCancel.setText(R.string.cancel); 23809fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi mCancel.setOnClickListener(this); 23909fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi mCancel.setVisibility(View.VISIBLE); 24009fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi 24109fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi mFree = activity.getNextButton(); 24209fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi mFree.setText(R.string.storage_menu_free); 24309fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi mFree.setOnClickListener(this); 2442a508e16fa21573aa2fcb2f985136566b8301f35Daniel Nishi mFree.setEnabled(false); 24509fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi } 24609fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi 24709fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi private void updateFreeButtonText() { 248dbf58432eba75178987aa239d739947c1ab36f45Daniel Nishi Activity activity = getActivity(); 249dbf58432eba75178987aa239d739947c1ab36f45Daniel Nishi if (activity == null) { 250dbf58432eba75178987aa239d739947c1ab36f45Daniel Nishi return; 251dbf58432eba75178987aa239d739947c1ab36f45Daniel Nishi } 252dbf58432eba75178987aa239d739947c1ab36f45Daniel Nishi mFree.setText(String.format(activity.getString(R.string.deletion_helper_free_button), 253dbf58432eba75178987aa239d739947c1ab36f45Daniel Nishi Formatter.formatFileSize(activity, getTotalFreeableSpace()))); 25409fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi } 25509fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi 25609fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi private long getTotalFreeableSpace() { 25709fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi long freeableSpace = 0; 25809fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi freeableSpace += mAppBackend.getTotalAppsFreeableSpace(false); 259b26f457e30d6d444c873efaaf26181139bb92aedDaniel Nishi if (mPhotoPreference != null) { 260b26f457e30d6d444c873efaaf26181139bb92aedDaniel Nishi freeableSpace += mPhotoPreference.getFreeableBytes(); 261b26f457e30d6d444c873efaaf26181139bb92aedDaniel Nishi } 2629385b673317060523b66a40780d5ad1df1530a56Salvador Martinez if (mDownloadsPreference != null) { 2639385b673317060523b66a40780d5ad1df1530a56Salvador Martinez freeableSpace += mDownloadsDeletion.getFreeableBytes(); 2649385b673317060523b66a40780d5ad1df1530a56Salvador Martinez } 26509fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi return freeableSpace; 26609fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi } 2671efe581749de7f50de41bac1e31b1389ac964615Tamas Berghammer} 268