blob: 45b2f42289810eab58a6668fef5322fbd8dd419e [file] [log] [blame]
/*
* 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.dialer.util;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.app.DialogFragment;
import android.content.DialogInterface;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.view.View;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import com.android.dialer.R;
/**
* Helper class for creating block/report dialog fragments.
*/
public class BlockReportSpamDialogs {
public static final String BLOCK_REPORT_SPAM_DIALOG_TAG = "BlockReportSpamDialog";
public static final String BLOCK_DIALOG_TAG = "BlockDialog";
public static final String UNBLOCK_DIALOG_TAG = "UnblockDialog";
public static final String NOT_SPAM_DIALOG_TAG = "NotSpamDialog";
/**
* Listener passed to block/report spam dialog for positive click in
* {@link BlockReportSpamDialogFragment}.
*/
public interface OnSpamDialogClickListener {
/**
* Called when user clicks on positive button in block/report spam dialog.
* @param isSpamChecked Whether the spam checkbox is checked.
*/
void onClick(boolean isSpamChecked);
}
/**
* Listener passed to all dialogs except the block/report spam dialog for positive click.
*/
public interface OnConfirmListener {
/**
* Called when user clicks on positive button in the dialog.
*/
void onClick();
}
/**
* Contains the common attributes between all block/unblock/report dialog fragments.
*/
private static class CommonDialogsFragment extends DialogFragment {
/**
* The number to display in the dialog title.
*/
protected String mDisplayNumber;
/**
* Called when dialog positive button is pressed.
*/
protected OnConfirmListener mPositiveListener;
/**
* Called when dialog is dismissed.
*/
@Nullable
protected DialogInterface.OnDismissListener mDismissListener;
@Override
public void onDismiss(DialogInterface dialog) {
if (mDismissListener != null) {
mDismissListener.onDismiss(dialog);
}
super.onDismiss(dialog);
}
@Override
public void onPause() {
// The dialog is dismissed onPause, i.e. rotation.
dismiss();
mDismissListener = null;
mPositiveListener = null;
mDisplayNumber = null;
super.onPause();
}
}
/**
* Dialog for block/report spam with the mark as spam checkbox.
*/
public static class BlockReportSpamDialogFragment extends CommonDialogsFragment {
/**
* Called when dialog positive button is pressed.
*/
private OnSpamDialogClickListener mPositiveListener;
/**
* Whether the mark as spam checkbox is checked before displaying the dialog.
*/
private boolean mSpamChecked;
public static DialogFragment newInstance(String displayNumber,
boolean spamChecked,
OnSpamDialogClickListener positiveListener,
@Nullable DialogInterface.OnDismissListener
dismissListener) {
BlockReportSpamDialogFragment fragment = new BlockReportSpamDialogFragment();
fragment.mSpamChecked = spamChecked;
fragment.mDisplayNumber = displayNumber;
fragment.mPositiveListener = positiveListener;
fragment.mDismissListener = dismissListener;
return fragment;
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
super.onCreateDialog(savedInstanceState);
View dialogView = View.inflate(getActivity(), R.layout.block_report_spam_dialog, null);
final CheckBox isSpamCheckbox =
(CheckBox) dialogView.findViewById(R.id.report_number_as_spam_action);
// Listen for changes on the checkbox and update if orientation changes
isSpamCheckbox.setChecked(mSpamChecked);
isSpamCheckbox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
mSpamChecked = isChecked;
}
});
AlertDialog.Builder alertDialogBuilder = createDialogBuilder(getActivity(), this);
Dialog dialog = alertDialogBuilder
.setView(dialogView)
.setTitle(getString(R.string.block_report_number_alert_title, mDisplayNumber))
.setPositiveButton(R.string.block_number_ok,
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dismiss();
mPositiveListener.onClick(isSpamCheckbox.isChecked());
}
}).create();
dialog.setCanceledOnTouchOutside(true);
return dialog;
}
}
/**
* Dialog for blocking a number.
*/
public static class BlockDialogFragment extends CommonDialogsFragment {
public static DialogFragment newInstance(String displayNumber,
OnConfirmListener positiveListener,
@Nullable DialogInterface.OnDismissListener
dismissListener) {
BlockDialogFragment fragment = new BlockDialogFragment();
fragment.mDisplayNumber = displayNumber;
fragment.mPositiveListener = positiveListener;
fragment.mDismissListener = dismissListener;
return fragment;
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
super.onCreateDialog(savedInstanceState);
// Return the newly created dialog
AlertDialog.Builder alertDialogBuilder = createDialogBuilder(getActivity(), this);
Dialog dialog = alertDialogBuilder
.setTitle(getString(R.string.block_report_number_alert_title, mDisplayNumber))
.setPositiveButton(R.string.block_number_ok,
createGenericOnClickListener(this, mPositiveListener))
.create();
dialog.setCanceledOnTouchOutside(true);
return dialog;
}
}
/**
* Dialog for unblocking a number.
*/
public static class UnblockDialogFragment extends CommonDialogsFragment {
/**
* Whether or not the number is spam.
*/
private boolean mIsSpam;
public static DialogFragment newInstance(String displayNumber,
boolean isSpam,
OnConfirmListener positiveListener,
@Nullable DialogInterface.OnDismissListener
dismissListener) {
UnblockDialogFragment fragment = new UnblockDialogFragment();
fragment.mDisplayNumber = displayNumber;
fragment.mIsSpam = isSpam;
fragment.mPositiveListener = positiveListener;
fragment.mDismissListener = dismissListener;
return fragment;
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
super.onCreateDialog(savedInstanceState);
// Return the newly created dialog
AlertDialog.Builder alertDialogBuilder = createDialogBuilder(getActivity(), this);
if (mIsSpam) {
alertDialogBuilder.setMessage(R.string.unblock_number_alert_details);
}
Dialog dialog = alertDialogBuilder
.setTitle(getString(R.string.unblock_report_number_alert_title, mDisplayNumber))
.setPositiveButton(R.string.unblock_number_ok,
createGenericOnClickListener(this, mPositiveListener))
.create();
dialog.setCanceledOnTouchOutside(true);
return dialog;
}
}
/**
* Dialog for reporting a number as not spam.
*/
public static class ReportNotSpamDialogFragment extends CommonDialogsFragment {
public static DialogFragment newInstance(String displayNumber,
OnConfirmListener positiveListener,
@Nullable DialogInterface.OnDismissListener
dismissListener) {
ReportNotSpamDialogFragment fragment = new ReportNotSpamDialogFragment();
fragment.mDisplayNumber = displayNumber;
fragment.mPositiveListener = positiveListener;
fragment.mDismissListener = dismissListener;
return fragment;
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
super.onCreateDialog(savedInstanceState);
// Return the newly created dialog
AlertDialog.Builder alertDialogBuilder = createDialogBuilder(getActivity(), this);
Dialog dialog = alertDialogBuilder
.setTitle(getString(R.string.report_not_spam_alert_title, mDisplayNumber))
.setMessage(R.string.report_not_spam_alert_details)
.setPositiveButton(R.string.report_not_spam_alert_button,
createGenericOnClickListener(this, mPositiveListener))
.create();
dialog.setCanceledOnTouchOutside(true);
return dialog;
}
}
/**
* Creates a dialog with the default cancel button listener (dismisses dialog).
*/
private static AlertDialog.Builder createDialogBuilder(Activity activity,
final DialogFragment fragment) {
return new AlertDialog.Builder(activity)
.setCancelable(true)
.setNegativeButton(android.R.string.cancel,
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
fragment.dismiss();
}
});
}
/**
* Creates a generic click listener which dismisses the fragment and then calls the actual
* listener.
*/
private static DialogInterface.OnClickListener createGenericOnClickListener(
final DialogFragment fragment,
final OnConfirmListener listener) {
return new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
fragment.dismiss();
listener.onClick();
}
};
}
}