/* * Copyright (C) 2015 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.messaging.ui; import android.app.AlertDialog; import android.app.Dialog; import android.app.DialogFragment; import android.app.Fragment; import android.app.FragmentTransaction; import android.content.Context; import android.content.DialogInterface; import android.content.res.Resources; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.ListView; import android.widget.TextView; import com.android.messaging.R; import com.android.messaging.datamodel.action.HandleLowStorageAction; import com.android.messaging.sms.SmsReleaseStorage; import com.android.messaging.sms.SmsReleaseStorage.Duration; import com.android.messaging.sms.SmsStorageStatusManager; import com.android.messaging.util.Assert; import com.google.common.collect.Lists; import java.util.List; /** * Dialog to show the sms storage low warning */ public class SmsStorageLowWarningFragment extends Fragment { private SmsStorageLowWarningFragment() { } public static SmsStorageLowWarningFragment newInstance() { return new SmsStorageLowWarningFragment(); } @Override public void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); final FragmentTransaction ft = getFragmentManager().beginTransaction(); final ChooseActionDialogFragment dialog = ChooseActionDialogFragment.newInstance(); dialog.setTargetFragment(this, 0/*requestCode*/); dialog.show(ft, null/*tag*/); } /** * Perform confirm action for a specific action * * @param actionIndex */ private void confirm(final int actionIndex) { final FragmentTransaction ft = getFragmentManager().beginTransaction(); final ConfirmationDialog dialog = ConfirmationDialog.newInstance(actionIndex); dialog.setTargetFragment(this, 0/*requestCode*/); dialog.show(ft, null/*tag*/); } /** * The dialog is cancelled at any step */ private void cancel() { getActivity().finish(); } /** * The dialog to show for user to choose what delete actions to take when storage is low */ private static class ChooseActionDialogFragment extends DialogFragment { public static ChooseActionDialogFragment newInstance() { return new ChooseActionDialogFragment(); } @Override public Dialog onCreateDialog(final Bundle savedInstanceState) { final AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); final LayoutInflater inflater = getActivity().getLayoutInflater(); final View dialogLayout = inflater.inflate( R.layout.sms_storage_low_warning_dialog, null); final ListView actionListView = (ListView) dialogLayout.findViewById( R.id.free_storage_action_list); final List actions = loadFreeStorageActions(getActivity().getResources()); final ActionListAdapter listAdapter = new ActionListAdapter(getActivity(), actions); actionListView.setAdapter(listAdapter); builder.setTitle(R.string.sms_storage_low_title) .setView(dialogLayout) .setNegativeButton(R.string.ignore, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int id) { dialog.cancel(); } }); final Dialog dialog = builder.create(); dialog.setCanceledOnTouchOutside(false); return dialog; } @Override public void onCancel(final DialogInterface dialog) { ((SmsStorageLowWarningFragment) getTargetFragment()).cancel(); } private class ActionListAdapter extends ArrayAdapter { public ActionListAdapter(final Context context, final List actions) { super(context, R.layout.sms_free_storage_action_item_view, actions); } @Override public View getView(final int position, final View view, final ViewGroup parent) { TextView actionItemView; if (view == null || !(view instanceof TextView)) { final LayoutInflater inflater = LayoutInflater.from(getContext()); actionItemView = (TextView) inflater.inflate( R.layout.sms_free_storage_action_item_view, parent, false); } else { actionItemView = (TextView) view; } final String action = getItem(position); actionItemView.setText(action); actionItemView.setOnClickListener(new OnClickListener() { @Override public void onClick(final View view) { dismiss(); ((SmsStorageLowWarningFragment) getTargetFragment()).confirm(position); } }); return actionItemView; } } } private static final String KEY_ACTION_INDEX = "action_index"; /** * The dialog to confirm user's delete action */ private static class ConfirmationDialog extends DialogFragment { private Duration mDuration; private String mDurationString; public static ConfirmationDialog newInstance(final int actionIndex) { final ConfirmationDialog dialog = new ConfirmationDialog(); final Bundle args = new Bundle(); args.putInt(KEY_ACTION_INDEX, actionIndex); dialog.setArguments(args); return dialog; } @Override public void onCancel(final DialogInterface dialog) { ((SmsStorageLowWarningFragment) getTargetFragment()).cancel(); } @Override public Dialog onCreateDialog(final Bundle savedInstanceState) { mDuration = SmsReleaseStorage.parseMessageRetainingDuration(); mDurationString = SmsReleaseStorage.getMessageRetainingDurationString(mDuration); final int actionIndex = getArguments().getInt(KEY_ACTION_INDEX); if (actionIndex < 0 || actionIndex > 1) { return null; } final AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); builder.setTitle(R.string.sms_storage_low_title) .setMessage(getConfirmDialogMessage(actionIndex)) .setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() { @Override public void onClick(final DialogInterface dialog, final int button) { dismiss(); ((SmsStorageLowWarningFragment) getTargetFragment()).cancel(); } }) .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { @Override public void onClick(final DialogInterface dialog, final int button) { dismiss(); handleAction(actionIndex); getActivity().finish(); SmsStorageStatusManager.cancelStorageLowNotification(); } }); return builder.create(); } private void handleAction(final int actionIndex) { final long durationInMillis = SmsReleaseStorage.durationToTimeInMillis(mDuration); switch (actionIndex) { case 0: HandleLowStorageAction.handleDeleteMediaMessages(durationInMillis); break; case 1: HandleLowStorageAction.handleDeleteOldMessages(durationInMillis); break; default: Assert.fail("Unsupported action"); break; } } /** * Get the confirm dialog text for a specific delete action * @param index The action index * @return */ private String getConfirmDialogMessage(final int index) { switch (index) { case 0: return getString(R.string.delete_all_media_confirmation, mDurationString); case 1: return getString(R.string.delete_oldest_messages_confirmation, mDurationString); case 2: return getString(R.string.auto_delete_oldest_messages_confirmation, mDurationString); } throw new IllegalArgumentException( "SmsStorageLowWarningFragment: invalid action index " + index); } } /** * Load the text of delete message actions * * @param resources * @return */ private static List loadFreeStorageActions(final Resources resources) { final Duration duration = SmsReleaseStorage.parseMessageRetainingDuration(); final String durationString = SmsReleaseStorage.getMessageRetainingDurationString(duration); final List actions = Lists.newArrayList(); actions.add(resources.getString(R.string.delete_all_media)); actions.add(resources.getString(R.string.delete_oldest_messages, durationString)); // TODO: Auto-purging is disabled for Bugle V1. // actions.add(resources.getString(R.string.auto_delete_oldest_messages, durationString)); return actions; } }