diff --git a/res/values/strings.xml b/res/values/strings.xml
index 07f36e1b803..6c9e64541cb 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -7611,4 +7611,13 @@
Remove photos & videos
+
+ %1$s now free. Manage storage automatically?
+
+ Let Storage manager automatically free up space by removing backed up content from your device?
+
+ No thanks
+
+ Turn on
+
diff --git a/src/com/android/settings/deletionhelper/DeletionHelperFragment.java b/src/com/android/settings/deletionhelper/DeletionHelperFragment.java
index cc1a084e20e..8c08ce77a67 100644
--- a/src/com/android/settings/deletionhelper/DeletionHelperFragment.java
+++ b/src/com/android/settings/deletionhelper/DeletionHelperFragment.java
@@ -17,6 +17,7 @@
package com.android.settings.deletionhelper;
import android.app.Application;
+import android.content.Intent;
import android.os.Bundle;
import android.support.v7.preference.Preference;
import android.support.v7.preference.PreferenceGroup;
@@ -48,6 +49,9 @@ public class DeletionHelperFragment extends SettingsPreferenceFragment implement
ApplicationsState.Callbacks, AppStateBaseBridge.Callback,
Preference.OnPreferenceChangeListener, DeletionType.FreeableChangedListener,
View.OnClickListener {
+ public static final int CLEAR_DATA_RESULT = 1;
+ public static final String FREED_BYTES_KEY = "freed";
+
private static final String TAG = "DeletionHelperFragment";
private static final String EXTRA_HAS_BRIDGE = "hasBridge";
@@ -332,6 +336,10 @@ public class DeletionHelperFragment extends SettingsPreferenceFragment implement
Log.e(TAG, "An error occurred while uninstalling packages.");
}
});
+ Intent data = new Intent();
+ data.putExtra(FREED_BYTES_KEY, getTotalFreeableSpace());
+ getActivity().setResult(CLEAR_DATA_RESULT, data);
+
task.run();
finishFragment();
}
diff --git a/src/com/android/settings/deletionhelper/StorageManagerUpsellDialog.java b/src/com/android/settings/deletionhelper/StorageManagerUpsellDialog.java
new file mode 100644
index 00000000000..e72933ad006
--- /dev/null
+++ b/src/com/android/settings/deletionhelper/StorageManagerUpsellDialog.java
@@ -0,0 +1,128 @@
+/*
+ * 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.deletionhelper;
+
+import android.app.AlertDialog;
+import android.app.Dialog;
+import android.app.DialogFragment;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.content.SharedPreferences;
+import android.os.Bundle;
+import android.text.format.Formatter;
+import com.android.settings.R;
+import android.util.Log;
+
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Fragment for activating the storage manager after a manual clear.
+ */
+public class StorageManagerUpsellDialog extends DialogFragment
+ implements DialogInterface.OnClickListener, DialogInterface.OnDismissListener {
+ public static final String TAG = "StorageManagerUpsellDialog";
+ private static final String SHARED_PREFERENCES_NAME = "StorageManagerUpsellDialog";
+ private static final String NEXT_SHOW_TIME = "next_show_time";
+ private static final String DISMISSED_COUNT = "dismissed_count";
+ private static final String NO_THANKS_COUNT = "no_thanks_count";
+
+ private static final String ARGS_FREED_BYTES = "freed_bytes";
+
+ private static final long NEVER = -1;
+ private static final long DISMISS_SHORT_DELAY = TimeUnit.DAYS.toMillis(14);
+ private static final long DISMISS_LONG_DELAY = TimeUnit.DAYS.toMillis(90);
+ private static final int DISMISS_LONG_THRESHOLD = 9;
+ private static final long NO_THANKS_SHORT_DELAY = TimeUnit.DAYS.toMillis(90);
+ private static final long NO_THANKS_LONG_DELAY = NEVER;
+ private static final int NO_THANKS_LONG_THRESHOLD = 3;
+
+ public static StorageManagerUpsellDialog newInstance(long freedBytes) {
+ StorageManagerUpsellDialog dialog = new StorageManagerUpsellDialog();
+ Bundle args = new Bundle(1);
+ args.putLong(ARGS_FREED_BYTES, freedBytes);
+ dialog.setArguments(args);
+ return dialog;
+ }
+
+ @Override
+ public Dialog onCreateDialog(Bundle savedInstanceState) {
+ final Bundle args = getArguments();
+ long freedBytes = args.getLong(ARGS_FREED_BYTES);
+
+ final Context context = getContext();
+ return new AlertDialog.Builder(context)
+ .setTitle(context.getString(R.string.deletion_helper_upsell_title,
+ Formatter.formatFileSize(context, freedBytes)))
+ .setMessage(context.getString(R.string.deletion_helper_upsell_summary))
+ .setPositiveButton(R.string.deletion_helper_upsell_activate, this)
+ .setNegativeButton(R.string.deletion_helper_upsell_cancel, this)
+ .create();
+ }
+
+ @Override
+ public void onClick(DialogInterface dialog, int buttonId) {
+ if (buttonId == DialogInterface.BUTTON_POSITIVE) {
+ // TODO: Activate the storage manager once the storage manager is landed.
+ } else {
+ SharedPreferences sp = getSharedPreferences(getContext());
+ int noThanksCount = sp.getInt(NO_THANKS_COUNT, 0) + 1;
+ SharedPreferences.Editor editor = sp.edit();
+ editor.putInt(NO_THANKS_COUNT, noThanksCount);
+ editor.putLong(NEXT_SHOW_TIME,
+ System.currentTimeMillis() + getNoThanksDelay(noThanksCount));
+ editor.apply();
+ }
+ }
+
+ @Override
+ public void onCancel(DialogInterface dialog) {
+ SharedPreferences sp = getSharedPreferences(getContext());
+ int dismissCount = sp.getInt(DISMISSED_COUNT, 0) + 1;
+ SharedPreferences.Editor editor = sp.edit();
+ editor.putInt(DISMISSED_COUNT, dismissCount);
+ editor.putLong(NEXT_SHOW_TIME,
+ System.currentTimeMillis() + getDismissDelay(dismissCount));
+ editor.apply();
+ }
+
+ /**
+ * Returns if the dialog should be shown, given the delays between when it is shown.
+ * @param context Context to get shared preferences for determining the next show time.
+ */
+ public static boolean shouldShow(Context context) {
+ // TODO: If the Storage Manager is enabled, return false.
+ long nextTimeToShow = getSharedPreferences(context).getLong(NEXT_SHOW_TIME, 0);
+
+ if (nextTimeToShow == NEVER) {
+ return false;
+ }
+
+ return System.currentTimeMillis() > nextTimeToShow;
+ }
+
+ private static SharedPreferences getSharedPreferences(Context context) {
+ return context.getSharedPreferences(SHARED_PREFERENCES_NAME, Context.MODE_PRIVATE);
+ }
+
+ private static long getNoThanksDelay(int noThanksCount) {
+ return (noThanksCount > NO_THANKS_LONG_THRESHOLD)
+ ? NO_THANKS_LONG_DELAY : NO_THANKS_SHORT_DELAY;
+ }
+
+ private static long getDismissDelay(int dismissCount) {
+ return (dismissCount > DISMISS_LONG_THRESHOLD)
+ ? DISMISS_LONG_DELAY : DISMISS_SHORT_DELAY;
+ }
+}
diff --git a/src/com/android/settings/deviceinfo/PrivateVolumeSettings.java b/src/com/android/settings/deviceinfo/PrivateVolumeSettings.java
index d5cc27636a0..7c427bd1803 100644
--- a/src/com/android/settings/deviceinfo/PrivateVolumeSettings.java
+++ b/src/com/android/settings/deviceinfo/PrivateVolumeSettings.java
@@ -60,6 +60,7 @@ import com.android.settings.Utils;
import com.android.settings.applications.ManageApplications;
import com.android.settings.deletionhelper.DeletionHelperFragment;
import com.android.settings.deletionhelper.AutomaticStorageManagerSettings;
+import com.android.settings.deletionhelper.StorageManagerUpsellDialog;
import com.android.settings.deviceinfo.StorageSettings.MountTask;
import com.android.settingslib.deviceinfo.StorageMeasurement;
import com.android.settingslib.deviceinfo.StorageMeasurement.MeasurementDetails;
@@ -100,6 +101,9 @@ public class PrivateVolumeSettings extends SettingsPreferenceFragment {
R.string.storage_detail_other
};
+ private static final int DELETION_HELPER_SETTINGS = 1;
+ private static final int DELETION_HELPER_CLEAR = 1;
+
private StorageManager mStorageManager;
private UserManager mUserManager;
@@ -418,7 +422,7 @@ public class PrivateVolumeSettings extends SettingsPreferenceFragment {
return true;
case R.id.storage_free:
startFragment(this, DeletionHelperFragment.class.getCanonicalName(),
- R.string.deletion_helper_title, 0, args);
+ R.string.deletion_helper_title, DELETION_HELPER_SETTINGS, args);
return true;
}
return super.onOptionsItemSelected(item);
@@ -507,6 +511,18 @@ public class PrivateVolumeSettings extends SettingsPreferenceFragment {
return super.onPreferenceTreeClick(pref);
}
+ @Override
+ public void onActivityResult(int requestCode, int resultCode, Intent data) {
+ super.onActivityResult(requestCode, resultCode, data);
+ if (requestCode == DELETION_HELPER_SETTINGS && resultCode == DELETION_HELPER_CLEAR &&
+ StorageManagerUpsellDialog.shouldShow(getActivity())) {
+ long freedBytes = data.getLongExtra(DeletionHelperFragment.FREED_BYTES_KEY, 0);
+ StorageManagerUpsellDialog dialog =
+ StorageManagerUpsellDialog.newInstance(freedBytes);
+ dialog.show(getFragmentManager(), StorageManagerUpsellDialog.TAG);
+ }
+ }
+
private final MeasurementReceiver mReceiver = new MeasurementReceiver() {
@Override
public void onDetailsChanged(MeasurementDetails details) {