DeletionHelperSettings.java revision dee882c960b4db9bae9f2c9144b84c6ba001a051
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; 34b26f457e30d6d444c873efaaf26181139bb92aedDaniel Nishiimport com.android.storagemanager.overlay.DeletionHelperFeatureProvider; 35dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinezimport com.android.storagemanager.overlay.FeatureFactory; 3620c31e6ef425e2127a1243cc679b31afeee47541Daniel Nishiimport java.util.ArrayList; 3709fa1388d090666e631f9d764f935604a2c753e9Daniel Nishiimport java.util.HashSet; 389385b673317060523b66a40780d5ad1df1530a56Salvador Martinezimport java.util.List; 3909fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi 4009fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi/** 4109fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi * Settings screen for the deletion helper, which manually removes data which is not recently used. 4209fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi */ 4309fa1388d090666e631f9d764f935604a2c753e9Daniel Nishipublic class DeletionHelperSettings extends PreferenceFragment implements 4409fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi DeletionType.FreeableChangedListener, 4509fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi View.OnClickListener { 469385b673317060523b66a40780d5ad1df1530a56Salvador Martinez protected static final String APPS_KEY = "apps_group"; 479385b673317060523b66a40780d5ad1df1530a56Salvador Martinez protected static final String KEY_DOWNLOADS_PREFERENCE = "delete_downloads"; 489385b673317060523b66a40780d5ad1df1530a56Salvador Martinez protected static final String KEY_PHOTOS_VIDEOS_PREFERENCE = "delete_photos"; 499385b673317060523b66a40780d5ad1df1530a56Salvador Martinez private static final String THRESHOLD_KEY = "threshold_key"; 5009fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi private static final int DOWNLOADS_LOADER_ID = 1; 519385b673317060523b66a40780d5ad1df1530a56Salvador Martinez private static final int NUM_DELETION_TYPES = 3; 5209fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi 5309fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi private AppDeletionPreferenceGroup mApps; 5409fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi private AppDeletionType mAppBackend; 5509fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi private DownloadsDeletionPreferenceGroup mDownloadsPreference; 5609fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi private DownloadsDeletionType mDownloadsDeletion; 57b26f457e30d6d444c873efaaf26181139bb92aedDaniel Nishi private PhotosDeletionPreference mPhotoPreference; 58b26f457e30d6d444c873efaaf26181139bb92aedDaniel Nishi private DeletionType mPhotoVideoDeletion; 5909fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi private Button mCancel, mFree; 60b26f457e30d6d444c873efaaf26181139bb92aedDaniel Nishi private DeletionHelperFeatureProvider mProvider; 619385b673317060523b66a40780d5ad1df1530a56Salvador Martinez private List<DeletionType> mDeletableContentList; 629385b673317060523b66a40780d5ad1df1530a56Salvador Martinez private int mThresholdType; 6309fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi 649385b673317060523b66a40780d5ad1df1530a56Salvador Martinez public static DeletionHelperSettings newInstance(int thresholdType) { 659385b673317060523b66a40780d5ad1df1530a56Salvador Martinez DeletionHelperSettings instance = new DeletionHelperSettings(); 669385b673317060523b66a40780d5ad1df1530a56Salvador Martinez Bundle bundle = new Bundle(1); 679385b673317060523b66a40780d5ad1df1530a56Salvador Martinez bundle.putInt(THRESHOLD_KEY, thresholdType); 689385b673317060523b66a40780d5ad1df1530a56Salvador Martinez instance.setArguments(bundle); 699385b673317060523b66a40780d5ad1df1530a56Salvador Martinez return instance; 7009fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi } 7109fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi 7209fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi @Override 7309fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { 7409fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi addPreferencesFromResource(R.xml.deletion_helper_list); 75dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez mThresholdType = getArguments().getInt(THRESHOLD_KEY, AppsAsyncLoader.NORMAL_THRESHOLD); 7609fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi mApps = (AppDeletionPreferenceGroup) findPreference(APPS_KEY); 779385b673317060523b66a40780d5ad1df1530a56Salvador Martinez mPhotoPreference = (PhotosDeletionPreference) findPreference(KEY_PHOTOS_VIDEOS_PREFERENCE); 789385b673317060523b66a40780d5ad1df1530a56Salvador Martinez mProvider = FeatureFactory.getFactory(getActivity()).getDeletionHelperFeatureProvider(); 799385b673317060523b66a40780d5ad1df1530a56Salvador Martinez if (mProvider != null) { 809385b673317060523b66a40780d5ad1df1530a56Salvador Martinez mPhotoVideoDeletion = 819385b673317060523b66a40780d5ad1df1530a56Salvador Martinez mProvider.createPhotoVideoDeletionType(getContext(), mThresholdType); 829385b673317060523b66a40780d5ad1df1530a56Salvador Martinez } 8309fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi 8409fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi HashSet<String> checkedApplications = null; 8509fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi if (savedInstanceState != null) { 8609fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi checkedApplications = 8709fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi (HashSet<String>) savedInstanceState.getSerializable( 8809fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi AppDeletionType.EXTRA_CHECKED_SET); 8909fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi } 90dee882c960b4db9bae9f2c9144b84c6ba001a051Salvador Martinez mAppBackend = new AppDeletionType(this, checkedApplications, mThresholdType); 9109fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi mAppBackend.registerView(mApps); 9209fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi mAppBackend.registerFreeableChangedListener(this); 9309fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi mApps.setDeletionType(mAppBackend); 94b26f457e30d6d444c873efaaf26181139bb92aedDaniel Nishi 959385b673317060523b66a40780d5ad1df1530a56Salvador Martinez mDeletableContentList = new ArrayList<>(NUM_DELETION_TYPES); 9609fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi } 9709fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi 9809fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi @Override 9909fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi public void onActivityCreated(Bundle savedInstanceState) { 10009fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi super.onActivityCreated(savedInstanceState); 10109fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi initializeButtons(); 10296fda63c3eeabf90a5420730d4729726dce504b3Daniel Nishi setHasOptionsMenu(true); 10309fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi Activity activity = getActivity(); 10409fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi if (activity.checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) 10509fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi != PackageManager.PERMISSION_GRANTED) { 10609fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi activity.requestPermissions( 10709fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi new String[] {Manifest.permission.READ_EXTERNAL_STORAGE}, 10809fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi 0); 10909fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi } 110b26f457e30d6d444c873efaaf26181139bb92aedDaniel Nishi 1119385b673317060523b66a40780d5ad1df1530a56Salvador Martinez if (mProvider != null && mPhotoVideoDeletion != null) { 1129385b673317060523b66a40780d5ad1df1530a56Salvador Martinez mPhotoPreference.setDaysToKeep(mProvider.getDaysToKeep(mThresholdType)); 113b26f457e30d6d444c873efaaf26181139bb92aedDaniel Nishi mPhotoPreference.registerFreeableChangedListener(this); 114b26f457e30d6d444c873efaaf26181139bb92aedDaniel Nishi mPhotoPreference.registerDeletionService(mPhotoVideoDeletion); 1159385b673317060523b66a40780d5ad1df1530a56Salvador Martinez mDeletableContentList.add(mPhotoVideoDeletion); 116b26f457e30d6d444c873efaaf26181139bb92aedDaniel Nishi } 11720c31e6ef425e2127a1243cc679b31afeee47541Daniel Nishi 11820c31e6ef425e2127a1243cc679b31afeee47541Daniel Nishi String[] uncheckedFiles = null; 11920c31e6ef425e2127a1243cc679b31afeee47541Daniel Nishi if (savedInstanceState != null) { 1209385b673317060523b66a40780d5ad1df1530a56Salvador Martinez uncheckedFiles = 1219385b673317060523b66a40780d5ad1df1530a56Salvador Martinez savedInstanceState.getStringArray( 12220c31e6ef425e2127a1243cc679b31afeee47541Daniel Nishi DownloadsDeletionType.EXTRA_UNCHECKED_DOWNLOADS); 12320c31e6ef425e2127a1243cc679b31afeee47541Daniel Nishi } 12409fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi mDownloadsPreference = 12509fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi (DownloadsDeletionPreferenceGroup) findPreference(KEY_DOWNLOADS_PREFERENCE); 12620c31e6ef425e2127a1243cc679b31afeee47541Daniel Nishi mDownloadsDeletion = new DownloadsDeletionType(getActivity(), uncheckedFiles); 12709fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi mDownloadsPreference.registerFreeableChangedListener(this); 12809fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi mDownloadsPreference.registerDeletionService(mDownloadsDeletion); 1299385b673317060523b66a40780d5ad1df1530a56Salvador Martinez mDeletableContentList.add(mDownloadsDeletion); 1309385b673317060523b66a40780d5ad1df1530a56Salvador Martinez 1319385b673317060523b66a40780d5ad1df1530a56Salvador Martinez mDeletableContentList.add(mAppBackend); 13209fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi updateFreeButtonText(); 13309fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi } 13409fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi 13509fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi @Override 13609fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi public void onResume() { 13709fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi super.onResume(); 1389385b673317060523b66a40780d5ad1df1530a56Salvador Martinez for (int i = 0, size = mDeletableContentList.size(); i < size; i++) { 1399385b673317060523b66a40780d5ad1df1530a56Salvador Martinez mDeletableContentList.get(i).onResume(); 14009fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi } 141b26f457e30d6d444c873efaaf26181139bb92aedDaniel Nishi 1429385b673317060523b66a40780d5ad1df1530a56Salvador Martinez if (mDownloadsDeletion != null 1439385b673317060523b66a40780d5ad1df1530a56Salvador Martinez && getActivity().checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) 1449385b673317060523b66a40780d5ad1df1530a56Salvador Martinez == PackageManager.PERMISSION_GRANTED) { 1459385b673317060523b66a40780d5ad1df1530a56Salvador Martinez getLoaderManager().initLoader(DOWNLOADS_LOADER_ID, new Bundle(), mDownloadsDeletion); 146b26f457e30d6d444c873efaaf26181139bb92aedDaniel Nishi } 14709fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi } 14809fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi 14909fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi @Override 15009fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi public void onPause() { 15109fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi super.onPause(); 1529385b673317060523b66a40780d5ad1df1530a56Salvador Martinez for (int i = 0, size = mDeletableContentList.size(); i < size; i++) { 1539385b673317060523b66a40780d5ad1df1530a56Salvador Martinez mDeletableContentList.get(i).onPause(); 154b26f457e30d6d444c873efaaf26181139bb92aedDaniel Nishi } 15509fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi } 15609fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi 15709fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi @Override 15809fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi public void onSaveInstanceState(Bundle outState) { 15909fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi super.onSaveInstanceState(outState); 1609385b673317060523b66a40780d5ad1df1530a56Salvador Martinez for (int i = 0, size = mDeletableContentList.size(); i < size; i++) { 1619385b673317060523b66a40780d5ad1df1530a56Salvador Martinez mDeletableContentList.get(i).onSaveInstanceStateBundle(outState); 1629385b673317060523b66a40780d5ad1df1530a56Salvador Martinez } 16309fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi } 16409fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi 1659385b673317060523b66a40780d5ad1df1530a56Salvador Martinez 16609fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi @Override 16709fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi public void onFreeableChanged(int numItems, long bytesFreeable) { 1682a508e16fa21573aa2fcb2f985136566b8301f35Daniel Nishi // bytesFreeable is the number of bytes freed by a single deletion type. If it is non-zero, 1692a508e16fa21573aa2fcb2f985136566b8301f35Daniel Nishi // there is stuff to free and we can enable it. If it is zero, though, we still need to get 1702a508e16fa21573aa2fcb2f985136566b8301f35Daniel Nishi // getTotalFreeableSpace to check all deletion types. 1712a508e16fa21573aa2fcb2f985136566b8301f35Daniel Nishi mFree.setEnabled(bytesFreeable != 0 || getTotalFreeableSpace() != 0); 17209fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi updateFreeButtonText(); 17309fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi } 17409fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi 17509fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi /** 17609fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi * Clears out the selected apps and data from the device and closes the fragment. 17709fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi */ 17809fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi protected void clearData() { 179b26f457e30d6d444c873efaaf26181139bb92aedDaniel Nishi // This should be fine as long as there is only one extra deletion feature. 180b26f457e30d6d444c873efaaf26181139bb92aedDaniel Nishi // In the future, this should be done in an async queue in order to not 181b26f457e30d6d444c873efaaf26181139bb92aedDaniel Nishi // interfere with the simultaneous PackageDeletionTask. 182b26f457e30d6d444c873efaaf26181139bb92aedDaniel Nishi if (mPhotoPreference != null && mPhotoPreference.isChecked()) { 183b26f457e30d6d444c873efaaf26181139bb92aedDaniel Nishi mPhotoVideoDeletion.clearFreeableData(getActivity()); 184b26f457e30d6d444c873efaaf26181139bb92aedDaniel Nishi } 1859385b673317060523b66a40780d5ad1df1530a56Salvador Martinez if (mDownloadsPreference != null) { 1869385b673317060523b66a40780d5ad1df1530a56Salvador Martinez mDownloadsDeletion.clearFreeableData(getActivity()); 1879385b673317060523b66a40780d5ad1df1530a56Salvador Martinez } 18809fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi mAppBackend.clearFreeableData(getActivity()); 18909fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi } 19009fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi 19109fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi @Override 19209fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi public void onClick(View v) { 193aff68018da784efc08b532597c2691465546957bDaniel Nishi if (v.getId() == R.id.next_button) { 19409fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi ConfirmDeletionDialog dialog = 19509fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi ConfirmDeletionDialog.newInstance(getTotalFreeableSpace()); 19609fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi // The 0 is a placeholder for an optional result code. 19709fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi dialog.setTargetFragment(this, 0); 19809fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi dialog.show(getFragmentManager(), ConfirmDeletionDialog.TAG); 1992ace931586ac5ee3d0633c051bc276690975f3eaDaniel Nishi MetricsLogger.action(getContext(), MetricsEvent.ACTION_DELETION_HELPER_CLEAR); 20009fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi } else { 2012ace931586ac5ee3d0633c051bc276690975f3eaDaniel Nishi MetricsLogger.action(getContext(), MetricsEvent.ACTION_DELETION_HELPER_CANCEL); 202aff68018da784efc08b532597c2691465546957bDaniel Nishi getActivity().finish(); 20309fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi } 20409fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi } 20509fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi 20609fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi @Override 20709fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi public void onRequestPermissionsResult(int requestCode, String permissions[], 20809fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi int[] grantResults) { 20909fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi if (requestCode == 0) { 21009fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 21109fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi mDownloadsDeletion.onResume(); 21209fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi getLoaderManager().initLoader(DOWNLOADS_LOADER_ID, new Bundle(), 21309fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi mDownloadsDeletion); 21409fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi } 21509fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi } 21609fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi } 21709fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi 21896fda63c3eeabf90a5420730d4729726dce504b3Daniel Nishi @Override 21996fda63c3eeabf90a5420730d4729726dce504b3Daniel Nishi public void onCreateOptionsMenu(Menu menu, MenuInflater menuInflater) { 22096fda63c3eeabf90a5420730d4729726dce504b3Daniel Nishi Activity activity = getActivity(); 22196fda63c3eeabf90a5420730d4729726dce504b3Daniel Nishi String mHelpUri = getResources().getString(R.string.help_uri_deletion_helper); 22296fda63c3eeabf90a5420730d4729726dce504b3Daniel Nishi if (mHelpUri != null && activity != null) { 22396fda63c3eeabf90a5420730d4729726dce504b3Daniel Nishi HelpUtils.prepareHelpMenuItem(activity, menu, mHelpUri, getClass().getName()); 22496fda63c3eeabf90a5420730d4729726dce504b3Daniel Nishi } 22596fda63c3eeabf90a5420730d4729726dce504b3Daniel Nishi } 22696fda63c3eeabf90a5420730d4729726dce504b3Daniel Nishi 22709fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi private void initializeButtons() { 22809fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi ButtonBarProvider activity = (ButtonBarProvider) getActivity(); 22909fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi activity.getButtonBar().setVisibility(View.VISIBLE); 23009fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi 23109fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi mCancel = activity.getSkipButton(); 23209fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi mCancel.setText(R.string.cancel); 23309fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi mCancel.setOnClickListener(this); 23409fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi mCancel.setVisibility(View.VISIBLE); 23509fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi 23609fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi mFree = activity.getNextButton(); 23709fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi mFree.setText(R.string.storage_menu_free); 23809fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi mFree.setOnClickListener(this); 2392a508e16fa21573aa2fcb2f985136566b8301f35Daniel Nishi mFree.setEnabled(false); 24009fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi } 24109fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi 24209fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi private void updateFreeButtonText() { 243dbf58432eba75178987aa239d739947c1ab36f45Daniel Nishi Activity activity = getActivity(); 244dbf58432eba75178987aa239d739947c1ab36f45Daniel Nishi if (activity == null) { 245dbf58432eba75178987aa239d739947c1ab36f45Daniel Nishi return; 246dbf58432eba75178987aa239d739947c1ab36f45Daniel Nishi } 247dbf58432eba75178987aa239d739947c1ab36f45Daniel Nishi mFree.setText(String.format(activity.getString(R.string.deletion_helper_free_button), 248dbf58432eba75178987aa239d739947c1ab36f45Daniel Nishi Formatter.formatFileSize(activity, getTotalFreeableSpace()))); 24909fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi } 25009fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi 25109fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi private long getTotalFreeableSpace() { 25209fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi long freeableSpace = 0; 25309fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi freeableSpace += mAppBackend.getTotalAppsFreeableSpace(false); 254b26f457e30d6d444c873efaaf26181139bb92aedDaniel Nishi if (mPhotoPreference != null) { 255b26f457e30d6d444c873efaaf26181139bb92aedDaniel Nishi freeableSpace += mPhotoPreference.getFreeableBytes(); 256b26f457e30d6d444c873efaaf26181139bb92aedDaniel Nishi } 2579385b673317060523b66a40780d5ad1df1530a56Salvador Martinez if (mDownloadsPreference != null) { 2589385b673317060523b66a40780d5ad1df1530a56Salvador Martinez freeableSpace += mDownloadsDeletion.getFreeableBytes(); 2599385b673317060523b66a40780d5ad1df1530a56Salvador Martinez } 26009fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi return freeableSpace; 26109fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi } 2621efe581749de7f50de41bac1e31b1389ac964615Tamas Berghammer} 263