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