330 lines
12 KiB
Java
330 lines
12 KiB
Java
/*
|
|
* 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.dialer.blocking;
|
|
|
|
import android.app.AlertDialog;
|
|
import android.app.Dialog;
|
|
import android.app.DialogFragment;
|
|
import android.app.FragmentManager;
|
|
import android.content.ContentValues;
|
|
import android.content.Context;
|
|
import android.content.DialogInterface;
|
|
import android.net.Uri;
|
|
import android.os.Bundle;
|
|
import android.support.design.widget.Snackbar;
|
|
import android.telephony.PhoneNumberUtils;
|
|
import android.text.TextUtils;
|
|
import android.view.View;
|
|
import android.widget.Toast;
|
|
import com.android.contacts.common.util.ContactDisplayUtils;
|
|
import com.android.dialer.blocking.FilteredNumberAsyncQueryHandler.OnBlockNumberListener;
|
|
import com.android.dialer.blocking.FilteredNumberAsyncQueryHandler.OnUnblockNumberListener;
|
|
import com.android.dialer.logging.InteractionEvent;
|
|
import com.android.dialer.logging.Logger;
|
|
import com.android.dialer.voicemailstatus.VisualVoicemailEnabledChecker;
|
|
|
|
/**
|
|
* Fragment for confirming and enacting blocking/unblocking a number. Also invokes snackbar
|
|
* providing undo functionality.
|
|
*/
|
|
@Deprecated
|
|
public class BlockNumberDialogFragment extends DialogFragment {
|
|
|
|
private static final String BLOCK_DIALOG_FRAGMENT = "BlockNumberDialog";
|
|
private static final String ARG_BLOCK_ID = "argBlockId";
|
|
private static final String ARG_NUMBER = "argNumber";
|
|
private static final String ARG_COUNTRY_ISO = "argCountryIso";
|
|
private static final String ARG_DISPLAY_NUMBER = "argDisplayNumber";
|
|
private static final String ARG_PARENT_VIEW_ID = "parentViewId";
|
|
private String number;
|
|
private String displayNumber;
|
|
private String countryIso;
|
|
private FilteredNumberAsyncQueryHandler handler;
|
|
private View parentView;
|
|
private VisualVoicemailEnabledChecker voicemailEnabledChecker;
|
|
private Callback callback;
|
|
|
|
public static BlockNumberDialogFragment show(
|
|
Integer blockId,
|
|
String number,
|
|
String countryIso,
|
|
String displayNumber,
|
|
Integer parentViewId,
|
|
FragmentManager fragmentManager,
|
|
Callback callback) {
|
|
final BlockNumberDialogFragment newFragment =
|
|
BlockNumberDialogFragment.newInstance(
|
|
blockId, number, countryIso, displayNumber, parentViewId);
|
|
|
|
newFragment.setCallback(callback);
|
|
newFragment.show(fragmentManager, BlockNumberDialogFragment.BLOCK_DIALOG_FRAGMENT);
|
|
return newFragment;
|
|
}
|
|
|
|
private static BlockNumberDialogFragment newInstance(
|
|
Integer blockId,
|
|
String number,
|
|
String countryIso,
|
|
String displayNumber,
|
|
Integer parentViewId) {
|
|
final BlockNumberDialogFragment fragment = new BlockNumberDialogFragment();
|
|
final Bundle args = new Bundle();
|
|
if (blockId != null) {
|
|
args.putInt(ARG_BLOCK_ID, blockId.intValue());
|
|
}
|
|
if (parentViewId != null) {
|
|
args.putInt(ARG_PARENT_VIEW_ID, parentViewId.intValue());
|
|
}
|
|
args.putString(ARG_NUMBER, number);
|
|
args.putString(ARG_COUNTRY_ISO, countryIso);
|
|
args.putString(ARG_DISPLAY_NUMBER, displayNumber);
|
|
fragment.setArguments(args);
|
|
return fragment;
|
|
}
|
|
|
|
public void setFilteredNumberAsyncQueryHandlerForTesting(
|
|
FilteredNumberAsyncQueryHandler handler) {
|
|
this.handler = handler;
|
|
}
|
|
|
|
@Override
|
|
public Context getContext() {
|
|
return getActivity();
|
|
}
|
|
|
|
@Override
|
|
public Dialog onCreateDialog(Bundle savedInstanceState) {
|
|
super.onCreateDialog(savedInstanceState);
|
|
final boolean isBlocked = getArguments().containsKey(ARG_BLOCK_ID);
|
|
|
|
number = getArguments().getString(ARG_NUMBER);
|
|
displayNumber = getArguments().getString(ARG_DISPLAY_NUMBER);
|
|
countryIso = getArguments().getString(ARG_COUNTRY_ISO);
|
|
|
|
if (TextUtils.isEmpty(displayNumber)) {
|
|
displayNumber = number;
|
|
}
|
|
|
|
handler = new FilteredNumberAsyncQueryHandler(getContext());
|
|
voicemailEnabledChecker = new VisualVoicemailEnabledChecker(getActivity(), null);
|
|
// Choose not to update VoicemailEnabledChecker, as checks should already been done in
|
|
// all current use cases.
|
|
parentView = getActivity().findViewById(getArguments().getInt(ARG_PARENT_VIEW_ID));
|
|
|
|
CharSequence title;
|
|
String okText;
|
|
String message;
|
|
if (isBlocked) {
|
|
title = null;
|
|
okText = getString(R.string.unblock_number_ok);
|
|
message =
|
|
ContactDisplayUtils.getTtsSpannedPhoneNumber(
|
|
getResources(), R.string.unblock_number_confirmation_title, displayNumber)
|
|
.toString();
|
|
} else {
|
|
title =
|
|
ContactDisplayUtils.getTtsSpannedPhoneNumber(
|
|
getResources(), R.string.old_block_number_confirmation_title, displayNumber);
|
|
okText = getString(R.string.block_number_ok);
|
|
if (FilteredNumberCompat.useNewFiltering(getContext())) {
|
|
message = getString(R.string.block_number_confirmation_message_new_filtering);
|
|
} else if (voicemailEnabledChecker.isVisualVoicemailEnabled()) {
|
|
message = getString(R.string.block_number_confirmation_message_vvm);
|
|
} else {
|
|
message = getString(R.string.block_number_confirmation_message_no_vvm);
|
|
}
|
|
}
|
|
|
|
AlertDialog.Builder builder =
|
|
new AlertDialog.Builder(getActivity())
|
|
.setTitle(title)
|
|
.setMessage(message)
|
|
.setPositiveButton(
|
|
okText,
|
|
new DialogInterface.OnClickListener() {
|
|
@Override
|
|
public void onClick(DialogInterface dialog, int id) {
|
|
if (isBlocked) {
|
|
unblockNumber();
|
|
} else {
|
|
blockNumber();
|
|
}
|
|
}
|
|
})
|
|
.setNegativeButton(android.R.string.cancel, null);
|
|
return builder.create();
|
|
}
|
|
|
|
@Override
|
|
public void onActivityCreated(Bundle savedInstanceState) {
|
|
super.onActivityCreated(savedInstanceState);
|
|
String e164Number = PhoneNumberUtils.formatNumberToE164(number, countryIso);
|
|
if (!FilteredNumbersUtil.canBlockNumber(getContext(), e164Number, number)) {
|
|
dismiss();
|
|
Toast.makeText(
|
|
getContext(),
|
|
ContactDisplayUtils.getTtsSpannedPhoneNumber(
|
|
getResources(), R.string.invalidNumber, displayNumber),
|
|
Toast.LENGTH_SHORT)
|
|
.show();
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void onPause() {
|
|
// Dismiss on rotation.
|
|
dismiss();
|
|
callback = null;
|
|
|
|
super.onPause();
|
|
}
|
|
|
|
public void setCallback(Callback callback) {
|
|
this.callback = callback;
|
|
}
|
|
|
|
private CharSequence getBlockedMessage() {
|
|
return ContactDisplayUtils.getTtsSpannedPhoneNumber(
|
|
getResources(), R.string.snackbar_number_blocked, displayNumber);
|
|
}
|
|
|
|
private CharSequence getUnblockedMessage() {
|
|
return ContactDisplayUtils.getTtsSpannedPhoneNumber(
|
|
getResources(), R.string.snackbar_number_unblocked, displayNumber);
|
|
}
|
|
|
|
private int getActionTextColor() {
|
|
return getContext().getResources().getColor(R.color.dialer_snackbar_action_text_color);
|
|
}
|
|
|
|
private void blockNumber() {
|
|
final CharSequence message = getBlockedMessage();
|
|
final CharSequence undoMessage = getUnblockedMessage();
|
|
final Callback callback = this.callback;
|
|
final int actionTextColor = getActionTextColor();
|
|
final Context applicationContext = getContext().getApplicationContext();
|
|
|
|
final OnUnblockNumberListener onUndoListener =
|
|
new OnUnblockNumberListener() {
|
|
@Override
|
|
public void onUnblockComplete(int rows, ContentValues values) {
|
|
Snackbar.make(parentView, undoMessage, Snackbar.LENGTH_LONG).show();
|
|
if (callback != null) {
|
|
callback.onChangeFilteredNumberUndo();
|
|
}
|
|
}
|
|
};
|
|
|
|
final OnBlockNumberListener onBlockNumberListener =
|
|
new OnBlockNumberListener() {
|
|
@Override
|
|
public void onBlockComplete(final Uri uri) {
|
|
final View.OnClickListener undoListener =
|
|
new View.OnClickListener() {
|
|
@Override
|
|
public void onClick(View view) {
|
|
// Delete the newly created row on 'undo'.
|
|
Logger.get(applicationContext)
|
|
.logInteraction(InteractionEvent.Type.UNDO_BLOCK_NUMBER);
|
|
handler.unblock(onUndoListener, uri);
|
|
}
|
|
};
|
|
|
|
Snackbar.make(parentView, message, Snackbar.LENGTH_LONG)
|
|
.setAction(R.string.snackbar_undo, undoListener)
|
|
.setActionTextColor(actionTextColor)
|
|
.show();
|
|
|
|
if (callback != null) {
|
|
callback.onFilterNumberSuccess();
|
|
}
|
|
|
|
if (FilteredNumbersUtil.hasRecentEmergencyCall(applicationContext)) {
|
|
FilteredNumbersUtil.maybeNotifyCallBlockingDisabled(applicationContext);
|
|
}
|
|
}
|
|
};
|
|
|
|
handler.blockNumber(onBlockNumberListener, number, countryIso);
|
|
}
|
|
|
|
private void unblockNumber() {
|
|
final CharSequence message = getUnblockedMessage();
|
|
final CharSequence undoMessage = getBlockedMessage();
|
|
final Callback callback = this.callback;
|
|
final int actionTextColor = getActionTextColor();
|
|
final Context applicationContext = getContext().getApplicationContext();
|
|
|
|
final OnBlockNumberListener onUndoListener =
|
|
new OnBlockNumberListener() {
|
|
@Override
|
|
public void onBlockComplete(final Uri uri) {
|
|
Snackbar.make(parentView, undoMessage, Snackbar.LENGTH_LONG).show();
|
|
if (callback != null) {
|
|
callback.onChangeFilteredNumberUndo();
|
|
}
|
|
}
|
|
};
|
|
|
|
handler.unblock(
|
|
new OnUnblockNumberListener() {
|
|
@Override
|
|
public void onUnblockComplete(int rows, final ContentValues values) {
|
|
final View.OnClickListener undoListener =
|
|
new View.OnClickListener() {
|
|
@Override
|
|
public void onClick(View view) {
|
|
// Re-insert the row on 'undo', with a new ID.
|
|
Logger.get(applicationContext)
|
|
.logInteraction(InteractionEvent.Type.UNDO_UNBLOCK_NUMBER);
|
|
handler.blockNumber(onUndoListener, values);
|
|
}
|
|
};
|
|
|
|
Snackbar.make(parentView, message, Snackbar.LENGTH_LONG)
|
|
.setAction(R.string.snackbar_undo, undoListener)
|
|
.setActionTextColor(actionTextColor)
|
|
.show();
|
|
|
|
if (callback != null) {
|
|
callback.onUnfilterNumberSuccess();
|
|
}
|
|
}
|
|
},
|
|
getArguments().getInt(ARG_BLOCK_ID));
|
|
}
|
|
|
|
/**
|
|
* Use a callback interface to update UI after success/undo. Favor this approach over other more
|
|
* standard paradigms because of the variety of scenarios in which the DialogFragment can be
|
|
* invoked (by an Activity, by a fragment, by an adapter, by an adapter list item). Because of
|
|
* this, we do NOT support retaining state on rotation, and will dismiss the dialog upon rotation
|
|
* instead.
|
|
*/
|
|
public interface Callback {
|
|
|
|
/** Called when a number is successfully added to the set of filtered numbers */
|
|
void onFilterNumberSuccess();
|
|
|
|
/** Called when a number is successfully removed from the set of filtered numbers */
|
|
void onUnfilterNumberSuccess();
|
|
|
|
/** Called when the action of filtering or unfiltering a number is undone */
|
|
void onChangeFilteredNumberUndo();
|
|
}
|
|
}
|