Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 95c3c504 authored by Daniel Nishi's avatar Daniel Nishi Committed by Android (Google) Code Review
Browse files

Merge "Add downloads to the deletion helper." into nyc-mr1-dev

parents b071fdca 2ef20fb3
Loading
Loading
Loading
Loading
+9 −0
Original line number Diff line number Diff line
@@ -7589,4 +7589,13 @@
    <!-- Summary of how much backed up storage that photos and videos service can clear from the local device. [CHAR LIMIT=NONE]-->
    <string name="deletion_helper_photos_summary"><xliff:g id="used" example="1.2GB">%1$s</xliff:g>, older than <xliff:g id="days">%2$d</xliff:g> days</string>
    <!-- Preference title for the downloads deletion service. [CHAR LIMIT=40]-->
    <string name="deletion_helper_downloads_title">Downloads (<xliff:g id="numItems" example="67">%1$d</xliff:g>)</string>
    <!-- Summary of how much stale data can be cleared from the local download folder. [CHAR LIMIT=NONE]-->
    <string name="deletion_helper_downloads_summary"><xliff:g id="used" example="1.2GB">%1$s</xliff:g>, last modified <xliff:g id="days">%2$s</xliff:g></string>
    <!-- Summary for when when there is nothing in the downloads folder to clear. [CHAR LIMIT=NONE]-->
    <string name="deletion_helper_downloads_summary_empty"><xliff:g id="used" example="1.2GB">%1$s</xliff:g></string>
</resources>
+5 −2
Original line number Diff line number Diff line
@@ -20,6 +20,9 @@
    <com.android.settings.PhotosDeletionPreference
        android:key="delete_photos" />

    <com.android.settings.deletionhelper.DownloadsDeletionPreference
        android:key="delete_downloads" />

    <PreferenceCategory
        android:key="apps_group"
        android:title="@string/deletion_helper_apps_title" />
+117 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2016 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.settings;

import android.content.Context;
import android.content.res.Resources;
import android.graphics.drawable.Drawable;
import android.support.v7.preference.Preference;
import android.support.v7.preference.Preference.OnPreferenceChangeListener;
import android.support.v7.preference.CheckBoxPreference;
import android.support.v7.preference.PreferenceViewHolder;
import android.util.AttributeSet;
import android.util.TypedValue;
import android.text.format.Formatter;
import android.widget.TextView;
import com.android.settings.deletionhelper.DeletionType;

/**
 * Preference to handle the deletion of various data types in the Deletion Helper.
 */
public abstract class DeletionPreference extends CheckBoxPreference implements
        DeletionType.FreeableChangedListener, OnPreferenceChangeListener {
    private DeletionType.FreeableChangedListener mListener;
    private boolean mChecked;
    private long mFreeableBytes;
    private int mFreeableItems;
    private DeletionType mDeletionService;

    public DeletionPreference(Context context, AttributeSet attrs) {
        super(context, attrs);
        setOnPreferenceChangeListener(this);
    }

    @Override
    public void onBindViewHolder(PreferenceViewHolder holder) {
        super.onBindViewHolder(holder);
        final TextView titleView = (TextView) holder.findViewById(android.R.id.title);
        if (titleView != null) {
            titleView.setTextColor(getTintColor(getContext()));
        }
    }

    /**
     * Returns the number of bytes which can be cleared by the deletion service.
     * @return The number of bytes.
     */
    public long getFreeableBytes() {
        return mChecked ? mFreeableBytes : 0;
    }

    /**
     * Register a listener to be called back on when the freeable bytes have changed.
     * @param listener The callback listener.
     */
    public void registerFreeableChangedListener(DeletionType.FreeableChangedListener listener) {
        mListener = listener;
    }

    /**
     * Registers a deletion service to update the preference's information.
     * @param deletionService A photo/video deletion service.
     */
    public void registerDeletionService(DeletionType deletionService) {
        mDeletionService = deletionService;
        if (mDeletionService != null) {
            mDeletionService.registerFreeableChangedListener(this);
        }
    }

    /**
     * Returns the deletion service powering the preference.
     * @return The deletion service.
     */
    public DeletionType getDeletionService() {
        return mDeletionService;
    }

    @Override
    public void onFreeableChanged(int numItems, long freeableBytes) {
        mFreeableItems = numItems;
        mFreeableBytes = freeableBytes;
        maybeUpdateListener();
    }

    @Override
    public boolean onPreferenceChange(Preference preference, Object newValue) {
        mChecked = (boolean) newValue;
        maybeUpdateListener();
        return true;
    }

    private int getTintColor(Context context) {
        TypedValue value = new TypedValue();
        context.getTheme().resolveAttribute(android.R.attr.colorAccent, value, true);
        return context.getColor(value.resourceId);
    }

    private void maybeUpdateListener() {
        if (mListener != null) {
            mListener.onFreeableChanged(mFreeableItems, getFreeableBytes());
        }
    }
}
+8 −85
Original line number Diff line number Diff line
@@ -19,107 +19,36 @@ package com.android.settings;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.drawable.Drawable;
import android.support.v7.preference.Preference;
import android.support.v7.preference.Preference.OnPreferenceChangeListener;
import android.support.v7.preference.CheckBoxPreference;
import android.support.v7.preference.PreferenceViewHolder;
import android.util.AttributeSet;
import android.util.TypedValue;
import android.text.format.Formatter;
import android.widget.TextView;
import com.android.settings.deletionhelper.DeletionType;

/**
 * Preference to handle the deletion of photos and videos in the Deletion Helper.
 */
public class PhotosDeletionPreference extends CheckBoxPreference implements
        DeletionType.FreeableChangedListener, OnPreferenceChangeListener {
public class PhotosDeletionPreference extends DeletionPreference {
    // TODO(b/28560570): Remove this dummy value.
    private static final int FAKE_DAYS_TO_KEEP = 30;
    private DeletionType.FreeableChangedListener mListener;
    private boolean mChecked;
    private long mFreeableBytes;
    private int mFreeableItems;
    private DeletionType mDeletionService;

    public PhotosDeletionPreference(Context context, AttributeSet attrs) {
        super(context, attrs);
        setIcon(getIcon(context));
        updatePreferenceText();
        setOnPreferenceChangeListener(this);
    }

    @Override
    public void onBindViewHolder(PreferenceViewHolder holder) {
        super.onBindViewHolder(holder);
        final TextView titleView = (TextView) holder.findViewById(android.R.id.title);
        if (titleView != null) {
            titleView.setTextColor(getTintColor(getContext()));
        }
    }

    /**
     * Get the tint color for the preference's icon and text.
     * @param context UI context to get the theme.
     * @return The tint color.
     */
    public int getTintColor(Context context) {
        TypedValue value = new TypedValue();
        context.getTheme().resolveAttribute(android.R.attr.colorAccent, value, true);
        return context.getColor(value.resourceId);
        updatePreferenceText(0, 0);
    }

    /**
     * Updates the title and summary of the preference with fresh information.
     */
    public void updatePreferenceText() {
    public void updatePreferenceText(int items, long bytes) {
        Context context = getContext();
        setTitle(context.getString(R.string.deletion_helper_photos_title,
                mFreeableItems));
        setTitle(context.getString(R.string.deletion_helper_photos_title, items));
        setSummary(context.getString(R.string.deletion_helper_photos_summary,
                Formatter.formatFileSize(context, mFreeableBytes), FAKE_DAYS_TO_KEEP));
    }

    /**
     * Returns the number of bytes which can be cleared by the deletion service.
     * @return The number of bytes.
     */
    public long getFreeableBytes() {
        return mChecked ? mFreeableBytes : 0;
    }

    /**
     * Register a listener to be called back on when the freeable bytes have changed.
     * @param listener The callback listener.
     */
    public void registerFreeableChangedListener(DeletionType.FreeableChangedListener listener) {
        mListener = listener;
    }

    /**
     * Registers a deletion service to update the preference's information.
     * @param deletionService A photo/video deletion service.
     */
    public void registerDeletionService(DeletionType deletionService) {
        mDeletionService = deletionService;
        if (mDeletionService != null) {
            mDeletionService.registerFreeableChangedListener(this);
        }
                Formatter.formatFileSize(context, bytes), FAKE_DAYS_TO_KEEP));
    }

    @Override
    public void onFreeableChanged(int numItems, long freeableBytes) {
        mFreeableItems = numItems;
        mFreeableBytes = freeableBytes;
        updatePreferenceText();
        maybeUpdateListener();
    }

    @Override
    public boolean onPreferenceChange(Preference preference, Object newValue) {
        mChecked = (boolean) newValue;
        maybeUpdateListener();
        return true;
    public void onFreeableChanged(int items, long bytes) {
        super.onFreeableChanged(items, bytes);
        updatePreferenceText(items, bytes);
    }

    private Drawable getIcon(Context context) {
@@ -134,10 +63,4 @@ public class PhotosDeletionPreference extends CheckBoxPreference implements
        }
        return iconDrawable;
    }

    private void maybeUpdateListener() {
        if (mListener != null) {
            mListener.onFreeableChanged(mFreeableItems, getFreeableBytes());
        }
    }
}
+27 −1
Original line number Diff line number Diff line
@@ -25,6 +25,7 @@ import android.util.ArraySet;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import com.android.settings.deletionhelper.DownloadsDeletionPreference;
import com.android.settings.PhotosDeletionPreference;
import com.android.settings.SettingsPreferenceFragment;
import com.android.settings.R;
@@ -54,10 +55,14 @@ public class DeletionHelperFragment extends SettingsPreferenceFragment implement

    private static final String KEY_APPS_GROUP = "apps_group";
    private static final String KEY_PHOTOS_VIDEOS_PREFERENCE = "delete_photos";
    private static final String KEY_DOWNLOADS_PREFERENCE = "delete_downloads";

    private static final int DOWNLOADS_LOADER_ID = 1;

    private Button mCancel, mFree;
    private PreferenceGroup mApps;
    private PhotosDeletionPreference mPhotoPreference;
    private DownloadsDeletionPreference mDownloadsPreference;

    private ApplicationsState mState;
    private Session mSession;
@@ -67,6 +72,7 @@ public class DeletionHelperFragment extends SettingsPreferenceFragment implement
    private boolean mHasReceivedAppEntries, mHasReceivedBridgeCallback, mFinishedLoading;
    private DeletionHelperFeatureProvider mProvider;
    private DeletionType mPhotoVideoDeletion;
    private DownloadsDeletionType mDownloadsDeletion;

    @Override
    public void onCreate(Bundle savedInstanceState) {
@@ -80,11 +86,14 @@ public class DeletionHelperFragment extends SettingsPreferenceFragment implement
        addPreferencesFromResource(R.xml.deletion_helper_list);
        mApps = (PreferenceGroup) findPreference(KEY_APPS_GROUP);
        mPhotoPreference = (PhotosDeletionPreference) findPreference(KEY_PHOTOS_VIDEOS_PREFERENCE);
        mDownloadsPreference =
                (DownloadsDeletionPreference) findPreference(KEY_DOWNLOADS_PREFERENCE);
        mProvider =
                FeatureFactory.getFactory(app).getDeletionHelperFeatureProvider();
        if (mProvider != null) {
            mPhotoVideoDeletion = mProvider.createPhotoVideoDeletionType();
        }
        mDownloadsDeletion = new DownloadsDeletionType(getActivity());

        if (savedInstanceState != null) {
            mHasReceivedAppEntries =
@@ -117,6 +126,9 @@ public class DeletionHelperFragment extends SettingsPreferenceFragment implement
                if (mPhotoPreference != null && mPhotoPreference.isChecked()) {
                    mPhotoVideoDeletion.clearFreeableData();
                }
                if (mDownloadsPreference != null && mDownloadsPreference.isChecked()) {
                    mDownloadsDeletion.clearFreeableData();
                }

                ArraySet<String> apps = new ArraySet<>();
                for (AppEntry entry : mAppEntries) {
@@ -153,6 +165,9 @@ public class DeletionHelperFragment extends SettingsPreferenceFragment implement
            mPhotoPreference.registerFreeableChangedListener(this);
            mPhotoPreference.registerDeletionService(mPhotoVideoDeletion);
        }

        mDownloadsPreference.registerFreeableChangedListener(this);
        mDownloadsPreference.registerDeletionService(mDownloadsDeletion);
    }

    @Override
@@ -172,6 +187,10 @@ public class DeletionHelperFragment extends SettingsPreferenceFragment implement
        if (mPhotoVideoDeletion != null) {
            mPhotoVideoDeletion.onResume();
        }
        if (mDownloadsDeletion != null) {
            mDownloadsDeletion.onResume();
            getLoaderManager().initLoader(DOWNLOADS_LOADER_ID, new Bundle(), mDownloadsDeletion);
        }
    }


@@ -193,6 +212,9 @@ public class DeletionHelperFragment extends SettingsPreferenceFragment implement
        if (mPhotoVideoDeletion != null) {
            mPhotoVideoDeletion.onPause();
        }
        if (mDownloadsDeletion != null) {
            mDownloadsDeletion.onPause();
        }
    }

    private void rebuild() {
@@ -211,7 +233,8 @@ public class DeletionHelperFragment extends SettingsPreferenceFragment implement
        for (int i = 0; i < entryCount; i++) {
            AppEntry entry = apps.get(i);
            final String packageName = entry.label;
            AppDeletionPreference preference = (AppDeletionPreference) getCachedPreference(entry.label);
            AppDeletionPreference preference =
                    (AppDeletionPreference) getCachedPreference(entry.label);
            if (preference == null) {
                preference = new AppDeletionPreference(getActivity(), entry,
                        mState);
@@ -322,6 +345,9 @@ public class DeletionHelperFragment extends SettingsPreferenceFragment implement
        if (mPhotoPreference != null) {
            freeableSpace += mPhotoPreference.getFreeableBytes();
        }
        if (mDownloadsPreference != null) {
            freeableSpace += mDownloadsPreference.getFreeableBytes();
        }
        return freeableSpace;
    }
}
 No newline at end of file
Loading