DeletionHelperSettings.java revision 1efe581749de7f50de41bac1e31b1389ac964615
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; 3920c31e6ef425e2127a1243cc679b31afeee47541Daniel Nishiimport java.util.Collections; 4009fa1388d090666e631f9d764f935604a2c753e9Daniel Nishiimport java.util.HashSet; 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 { 4809fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi private static final String APPS_KEY = "apps_group"; 4909fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi private static final String KEY_DOWNLOADS_PREFERENCE = "delete_downloads"; 50b26f457e30d6d444c873efaaf26181139bb92aedDaniel Nishi private static final String KEY_PHOTOS_VIDEOS_PREFERENCE = "delete_photos"; 5109fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi private static final int DOWNLOADS_LOADER_ID = 1; 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; 6109fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi 6209fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi public static DeletionHelperSettings newInstance() { 6309fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi return new DeletionHelperSettings(); 6409fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi } 6509fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi 6609fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi @Override 6709fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { 6809fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi addPreferencesFromResource(R.xml.deletion_helper_list); 6909fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi mApps = (AppDeletionPreferenceGroup) findPreference(APPS_KEY); 7009fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi 7109fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi HashSet<String> checkedApplications = null; 7209fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi if (savedInstanceState != null) { 7309fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi checkedApplications = 7409fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi (HashSet<String>) savedInstanceState.getSerializable( 7509fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi AppDeletionType.EXTRA_CHECKED_SET); 7609fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi } 7709fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi mAppBackend = new AppDeletionType(getActivity().getApplication(), checkedApplications); 7809fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi mAppBackend.registerView(mApps); 7909fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi mAppBackend.registerFreeableChangedListener(this); 8009fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi mApps.setDeletionType(mAppBackend); 81b26f457e30d6d444c873efaaf26181139bb92aedDaniel Nishi 82b26f457e30d6d444c873efaaf26181139bb92aedDaniel Nishi mPhotoPreference = (PhotosDeletionPreference) findPreference(KEY_PHOTOS_VIDEOS_PREFERENCE); 83b26f457e30d6d444c873efaaf26181139bb92aedDaniel Nishi mProvider = FeatureFactory.getFactory(getActivity()).getDeletionHelperFeatureProvider(); 84b26f457e30d6d444c873efaaf26181139bb92aedDaniel Nishi if (mProvider != null) { 85b26f457e30d6d444c873efaaf26181139bb92aedDaniel Nishi mPhotoVideoDeletion = mProvider.createPhotoVideoDeletionType(getContext()); 86b26f457e30d6d444c873efaaf26181139bb92aedDaniel Nishi } 8709fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi } 8809fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi 8909fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi @Override 9009fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi public void onActivityCreated(Bundle savedInstanceState) { 9109fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi super.onActivityCreated(savedInstanceState); 9209fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi initializeButtons(); 9396fda63c3eeabf90a5420730d4729726dce504b3Daniel Nishi setHasOptionsMenu(true); 9409fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi 9509fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi Activity activity = getActivity(); 9609fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi if (activity.checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) 9709fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi != PackageManager.PERMISSION_GRANTED) { 9809fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi activity.requestPermissions( 9909fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi new String[] {Manifest.permission.READ_EXTERNAL_STORAGE}, 10009fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi 0); 10109fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi } 102b26f457e30d6d444c873efaaf26181139bb92aedDaniel Nishi 1031741bb654cca0989ff33df02536041adc0873405Daniel Nishi if (mProvider == null || mPhotoVideoDeletion == null) { 104b26f457e30d6d444c873efaaf26181139bb92aedDaniel Nishi getPreferenceScreen().removePreference(mPhotoPreference); 105b26f457e30d6d444c873efaaf26181139bb92aedDaniel Nishi mPhotoPreference = null; 106b26f457e30d6d444c873efaaf26181139bb92aedDaniel Nishi } else { 107b26f457e30d6d444c873efaaf26181139bb92aedDaniel Nishi mPhotoPreference.registerFreeableChangedListener(this); 108b26f457e30d6d444c873efaaf26181139bb92aedDaniel Nishi mPhotoPreference.registerDeletionService(mPhotoVideoDeletion); 109b26f457e30d6d444c873efaaf26181139bb92aedDaniel Nishi } 11020c31e6ef425e2127a1243cc679b31afeee47541Daniel Nishi 11120c31e6ef425e2127a1243cc679b31afeee47541Daniel Nishi String[] uncheckedFiles = null; 11220c31e6ef425e2127a1243cc679b31afeee47541Daniel Nishi if (savedInstanceState != null) { 11320c31e6ef425e2127a1243cc679b31afeee47541Daniel Nishi uncheckedFiles = savedInstanceState.getStringArray( 11420c31e6ef425e2127a1243cc679b31afeee47541Daniel Nishi DownloadsDeletionType.EXTRA_UNCHECKED_DOWNLOADS); 11520c31e6ef425e2127a1243cc679b31afeee47541Daniel Nishi } 11609fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi mDownloadsPreference = 11709fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi (DownloadsDeletionPreferenceGroup) findPreference(KEY_DOWNLOADS_PREFERENCE); 11820c31e6ef425e2127a1243cc679b31afeee47541Daniel Nishi mDownloadsDeletion = new DownloadsDeletionType(getActivity(), uncheckedFiles); 11909fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi mDownloadsPreference.registerFreeableChangedListener(this); 12009fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi mDownloadsPreference.registerDeletionService(mDownloadsDeletion); 12109fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi updateFreeButtonText(); 12209fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi } 12309fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi 12409fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi @Override 12509fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi public void onResume() { 12609fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi super.onResume(); 12709fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi mAppBackend.onResume(); 12809fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi mDownloadsDeletion.onResume(); 12909fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi 13009fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi if (getActivity().checkSelfPermission( 13109fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) { 13209fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi getLoaderManager().initLoader(DOWNLOADS_LOADER_ID, new Bundle(), mDownloadsDeletion); 13309fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi } 134b26f457e30d6d444c873efaaf26181139bb92aedDaniel Nishi 135b26f457e30d6d444c873efaaf26181139bb92aedDaniel Nishi if (mPhotoVideoDeletion != null) { 136b26f457e30d6d444c873efaaf26181139bb92aedDaniel Nishi mPhotoVideoDeletion.onResume(); 137b26f457e30d6d444c873efaaf26181139bb92aedDaniel Nishi } 13809fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi } 13909fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi 14009fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi 14109fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi @Override 14209fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi public void onPause() { 14309fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi super.onPause(); 14409fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi mAppBackend.onPause(); 14509fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi mDownloadsDeletion.onPause(); 146b26f457e30d6d444c873efaaf26181139bb92aedDaniel Nishi 147b26f457e30d6d444c873efaaf26181139bb92aedDaniel Nishi if (mPhotoVideoDeletion != null) { 148b26f457e30d6d444c873efaaf26181139bb92aedDaniel Nishi mPhotoVideoDeletion.onPause(); 149b26f457e30d6d444c873efaaf26181139bb92aedDaniel Nishi } 15009fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi } 15109fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi 15209fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi @Override 15309fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi public void onSaveInstanceState(Bundle outState) { 15409fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi super.onSaveInstanceState(outState); 15509fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi mAppBackend.onSaveInstanceStateBundle(outState); 15620c31e6ef425e2127a1243cc679b31afeee47541Daniel Nishi mDownloadsDeletion.onSaveInstanceStateBundle(outState); 15709fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi } 15809fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi 15909fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi @Override 16009fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi public void onFreeableChanged(int numItems, long bytesFreeable) { 1612a508e16fa21573aa2fcb2f985136566b8301f35Daniel Nishi // bytesFreeable is the number of bytes freed by a single deletion type. If it is non-zero, 1622a508e16fa21573aa2fcb2f985136566b8301f35Daniel Nishi // there is stuff to free and we can enable it. If it is zero, though, we still need to get 1632a508e16fa21573aa2fcb2f985136566b8301f35Daniel Nishi // getTotalFreeableSpace to check all deletion types. 1642a508e16fa21573aa2fcb2f985136566b8301f35Daniel Nishi mFree.setEnabled(bytesFreeable != 0 || getTotalFreeableSpace() != 0); 16509fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi updateFreeButtonText(); 16609fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi } 16709fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi 16809fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi /** 16909fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi * Clears out the selected apps and data from the device and closes the fragment. 17009fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi */ 17109fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi protected void clearData() { 172b26f457e30d6d444c873efaaf26181139bb92aedDaniel Nishi // This should be fine as long as there is only one extra deletion feature. 173b26f457e30d6d444c873efaaf26181139bb92aedDaniel Nishi // In the future, this should be done in an async queue in order to not 174b26f457e30d6d444c873efaaf26181139bb92aedDaniel Nishi // interfere with the simultaneous PackageDeletionTask. 175b26f457e30d6d444c873efaaf26181139bb92aedDaniel Nishi if (mPhotoPreference != null && mPhotoPreference.isChecked()) { 176b26f457e30d6d444c873efaaf26181139bb92aedDaniel Nishi mPhotoVideoDeletion.clearFreeableData(getActivity()); 177b26f457e30d6d444c873efaaf26181139bb92aedDaniel Nishi } 17809fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi mDownloadsDeletion.clearFreeableData(getActivity()); 17909fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi mAppBackend.clearFreeableData(getActivity()); 18009fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi } 18109fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi 18209fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi @Override 18309fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi public void onClick(View v) { 184aff68018da784efc08b532597c2691465546957bDaniel Nishi if (v.getId() == R.id.next_button) { 18509fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi ConfirmDeletionDialog dialog = 18609fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi ConfirmDeletionDialog.newInstance(getTotalFreeableSpace()); 18709fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi // The 0 is a placeholder for an optional result code. 18809fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi dialog.setTargetFragment(this, 0); 18909fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi dialog.show(getFragmentManager(), ConfirmDeletionDialog.TAG); 1902ace931586ac5ee3d0633c051bc276690975f3eaDaniel Nishi MetricsLogger.action(getContext(), MetricsEvent.ACTION_DELETION_HELPER_CLEAR); 19109fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi } else { 1922ace931586ac5ee3d0633c051bc276690975f3eaDaniel Nishi MetricsLogger.action(getContext(), MetricsEvent.ACTION_DELETION_HELPER_CANCEL); 193aff68018da784efc08b532597c2691465546957bDaniel Nishi getActivity().finish(); 19409fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi } 19509fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi } 19609fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi 19709fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi @Override 19809fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi public void onRequestPermissionsResult(int requestCode, String permissions[], 19909fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi int[] grantResults) { 20009fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi if (requestCode == 0) { 20109fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 20209fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi mDownloadsDeletion.onResume(); 20309fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi getLoaderManager().initLoader(DOWNLOADS_LOADER_ID, new Bundle(), 20409fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi mDownloadsDeletion); 20509fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi } 20609fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi } 20709fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi } 20809fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi 20996fda63c3eeabf90a5420730d4729726dce504b3Daniel Nishi @Override 21096fda63c3eeabf90a5420730d4729726dce504b3Daniel Nishi public void onCreateOptionsMenu(Menu menu, MenuInflater menuInflater) { 21196fda63c3eeabf90a5420730d4729726dce504b3Daniel Nishi Activity activity = getActivity(); 21296fda63c3eeabf90a5420730d4729726dce504b3Daniel Nishi String mHelpUri = getResources().getString(R.string.help_uri_deletion_helper); 21396fda63c3eeabf90a5420730d4729726dce504b3Daniel Nishi if (mHelpUri != null && activity != null) { 21496fda63c3eeabf90a5420730d4729726dce504b3Daniel Nishi HelpUtils.prepareHelpMenuItem(activity, menu, mHelpUri, getClass().getName()); 21596fda63c3eeabf90a5420730d4729726dce504b3Daniel Nishi } 21696fda63c3eeabf90a5420730d4729726dce504b3Daniel Nishi } 21796fda63c3eeabf90a5420730d4729726dce504b3Daniel Nishi 21809fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi private void initializeButtons() { 21909fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi ButtonBarProvider activity = (ButtonBarProvider) getActivity(); 22009fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi activity.getButtonBar().setVisibility(View.VISIBLE); 22109fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi 22209fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi mCancel = activity.getSkipButton(); 22309fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi mCancel.setText(R.string.cancel); 22409fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi mCancel.setOnClickListener(this); 22509fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi mCancel.setVisibility(View.VISIBLE); 22609fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi 22709fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi mFree = activity.getNextButton(); 22809fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi mFree.setText(R.string.storage_menu_free); 22909fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi mFree.setOnClickListener(this); 2302a508e16fa21573aa2fcb2f985136566b8301f35Daniel Nishi mFree.setEnabled(false); 23109fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi } 23209fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi 23309fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi private void updateFreeButtonText() { 234dbf58432eba75178987aa239d739947c1ab36f45Daniel Nishi Activity activity = getActivity(); 235dbf58432eba75178987aa239d739947c1ab36f45Daniel Nishi if (activity == null) { 236dbf58432eba75178987aa239d739947c1ab36f45Daniel Nishi return; 237dbf58432eba75178987aa239d739947c1ab36f45Daniel Nishi } 238dbf58432eba75178987aa239d739947c1ab36f45Daniel Nishi mFree.setText(String.format(activity.getString(R.string.deletion_helper_free_button), 239dbf58432eba75178987aa239d739947c1ab36f45Daniel Nishi Formatter.formatFileSize(activity, getTotalFreeableSpace()))); 24009fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi } 24109fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi 24209fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi private long getTotalFreeableSpace() { 24309fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi long freeableSpace = 0; 24409fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi freeableSpace += mAppBackend.getTotalAppsFreeableSpace(false); 245b26f457e30d6d444c873efaaf26181139bb92aedDaniel Nishi if (mPhotoPreference != null) { 246b26f457e30d6d444c873efaaf26181139bb92aedDaniel Nishi freeableSpace += mPhotoPreference.getFreeableBytes(); 247b26f457e30d6d444c873efaaf26181139bb92aedDaniel Nishi } 24809fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi freeableSpace += mDownloadsDeletion.getFreeableBytes(); 24909fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi return freeableSpace; 25009fa1388d090666e631f9d764f935604a2c753e9Daniel Nishi } 2511efe581749de7f50de41bac1e31b1389ac964615Tamas Berghammer} 252