blob: 589625b8e0ae38bd7fe80630ff89fb3c22fb9ed7 [file] [log] [blame]
wangqibc28ea72018-04-02 16:23:00 -07001/*
2 * Copyright (C) 2018 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.android.incallui;
18
19import android.app.AlertDialog;
20import android.app.Dialog;
21import android.content.Context;
22import android.os.Bundle;
23import android.support.annotation.NonNull;
24import android.support.v4.app.DialogFragment;
25import android.telephony.PhoneNumberUtils;
26import android.text.BidiFormatter;
27import android.text.TextDirectionHeuristics;
28import android.text.TextUtils;
29import android.view.View;
30import android.widget.TextView;
wangqibc28ea72018-04-02 16:23:00 -070031import com.android.dialer.common.Assert;
32import com.android.dialer.common.LogUtil;
twyen5578d922018-06-25 12:36:26 -070033import com.android.dialer.contacts.ContactsComponent;
wangqibc28ea72018-04-02 16:23:00 -070034import com.android.incallui.ContactInfoCache.ContactCacheEntry;
35import com.android.incallui.ContactInfoCache.ContactInfoCacheCallback;
36import com.android.incallui.call.CallList;
37import com.android.incallui.call.DialerCall;
38import java.lang.ref.WeakReference;
39
40/** Dialog that shown to user when receiving RTT request mid call. */
41public class RttRequestDialogFragment extends DialogFragment {
42
43 /**
44 * Returns a new instance of {@link RttRequestDialogFragment} with the given callback.
45 *
46 * <p>Prefer this method over the default constructor.
47 */
48 public static RttRequestDialogFragment newInstance(String callId, int rttRequestId) {
49 RttRequestDialogFragment fragment = new RttRequestDialogFragment();
50 Bundle args = new Bundle();
51 args.putString(ARG_CALL_ID, Assert.isNotNull(callId));
52 args.putInt(ARG_RTT_REQUEST_ID, rttRequestId);
53 fragment.setArguments(args);
54 return fragment;
55 }
56
57 /** Key in the arguments bundle for call id. */
58 private static final String ARG_CALL_ID = "call_id";
59
60 private static final String ARG_RTT_REQUEST_ID = "rtt_request_id";
61
62 private TextView detailsTextView;
63
64 @NonNull
65 @Override
66 public Dialog onCreateDialog(Bundle bundle) {
67 super.onCreateDialog(bundle);
68 LogUtil.enterBlock("RttRequestDialogFragment.onCreateDialog");
69
70 View dialogView = View.inflate(getActivity(), R.layout.frag_rtt_request_dialog, null);
71 detailsTextView = dialogView.findViewById(R.id.details);
72
73 ContactInfoCache cache = ContactInfoCache.getInstance(getContext());
74 DialerCall dialerCall =
75 CallList.getInstance().getCallById(getArguments().getString(ARG_CALL_ID));
76 cache.findInfo(dialerCall, false, new ContactLookupCallback(this));
77
78 dialogView
79 .findViewById(R.id.rtt_button_decline_request)
80 .setOnClickListener(v -> onNegativeButtonClick());
81 dialogView
82 .findViewById(R.id.rtt_button_accept_request)
83 .setOnClickListener(v -> onPositiveButtonClick());
84
85 AlertDialog alertDialog =
calderwoodra929539e2018-05-19 00:05:02 -070086 new AlertDialog.Builder(getActivity())
wangqibc28ea72018-04-02 16:23:00 -070087 .setCancelable(false)
88 .setView(dialogView)
89 .setTitle(R.string.rtt_request_dialog_title)
90 .create();
91
92 alertDialog.setCanceledOnTouchOutside(false);
93 return alertDialog;
94 }
95
96 private void onPositiveButtonClick() {
97 LogUtil.enterBlock("RttRequestDialogFragment.onPositiveButtonClick");
98
99 DialerCall call = CallList.getInstance().getCallById(getArguments().getString(ARG_CALL_ID));
100 call.respondToRttRequest(true, getArguments().getInt(ARG_RTT_REQUEST_ID));
101 dismiss();
102 }
103
104 private void onNegativeButtonClick() {
105 LogUtil.enterBlock("RttRequestDialogFragment.onNegativeButtonClick");
106
107 DialerCall call = CallList.getInstance().getCallById(getArguments().getString(ARG_CALL_ID));
108 call.respondToRttRequest(false, getArguments().getInt(ARG_RTT_REQUEST_ID));
109 dismiss();
110 }
111
112 private void setNameOrNumber(CharSequence nameOrNumber) {
113 detailsTextView.setText(getString(R.string.rtt_request_dialog_details, nameOrNumber));
114 }
115
116 private static class ContactLookupCallback implements ContactInfoCacheCallback {
117 private final WeakReference<RttRequestDialogFragment> rttRequestDialogFragmentWeakReference;
118
119 private ContactLookupCallback(RttRequestDialogFragment rttRequestDialogFragment) {
120 rttRequestDialogFragmentWeakReference = new WeakReference<>(rttRequestDialogFragment);
121 }
122
123 @Override
124 public void onContactInfoComplete(String callId, ContactCacheEntry entry) {
125 RttRequestDialogFragment fragment = rttRequestDialogFragmentWeakReference.get();
126 if (fragment != null) {
127 fragment.setNameOrNumber(getNameOrNumber(entry, fragment.getContext()));
128 }
129 }
130
131 private CharSequence getNameOrNumber(ContactCacheEntry entry, Context context) {
132 String preferredName =
twyen5578d922018-06-25 12:36:26 -0700133 ContactsComponent.get(context)
134 .contactDisplayPreferences()
135 .getDisplayName(entry.namePrimary, entry.nameAlternative);
wangqibc28ea72018-04-02 16:23:00 -0700136 if (TextUtils.isEmpty(preferredName)) {
137 return TextUtils.isEmpty(entry.number)
138 ? null
139 : PhoneNumberUtils.createTtsSpannable(
140 BidiFormatter.getInstance().unicodeWrap(entry.number, TextDirectionHeuristics.LTR));
141 }
142 return preferredName;
143 }
144
145 @Override
146 public void onImageLoadComplete(String callId, ContactCacheEntry entry) {}
147 }
148}