/* * Copyright (C) 2018 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.incallui; import android.app.AlertDialog; import android.app.Dialog; import android.content.Context; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.v4.app.DialogFragment; import android.telephony.PhoneNumberUtils; import android.text.BidiFormatter; import android.text.TextDirectionHeuristics; import android.text.TextUtils; import android.view.View; import android.widget.TextView; import com.android.dialer.common.Assert; import com.android.dialer.common.LogUtil; import com.android.dialer.contacts.ContactsComponent; import com.android.incallui.ContactInfoCache.ContactCacheEntry; import com.android.incallui.ContactInfoCache.ContactInfoCacheCallback; import com.android.incallui.call.CallList; import com.android.incallui.call.DialerCall; import java.lang.ref.WeakReference; /** Dialog that shown to user when receiving RTT request mid call. */ public class RttRequestDialogFragment extends DialogFragment { /** * Returns a new instance of {@link RttRequestDialogFragment} with the given callback. * *

Prefer this method over the default constructor. */ public static RttRequestDialogFragment newInstance(String callId, int rttRequestId) { RttRequestDialogFragment fragment = new RttRequestDialogFragment(); Bundle args = new Bundle(); args.putString(ARG_CALL_ID, Assert.isNotNull(callId)); args.putInt(ARG_RTT_REQUEST_ID, rttRequestId); fragment.setArguments(args); return fragment; } /** Key in the arguments bundle for call id. */ private static final String ARG_CALL_ID = "call_id"; private static final String ARG_RTT_REQUEST_ID = "rtt_request_id"; private TextView detailsTextView; @NonNull @Override public Dialog onCreateDialog(Bundle bundle) { super.onCreateDialog(bundle); LogUtil.enterBlock("RttRequestDialogFragment.onCreateDialog"); View dialogView = View.inflate(getActivity(), R.layout.frag_rtt_request_dialog, null); detailsTextView = dialogView.findViewById(R.id.details); ContactInfoCache cache = ContactInfoCache.getInstance(getContext()); DialerCall dialerCall = CallList.getInstance().getCallById(getArguments().getString(ARG_CALL_ID)); cache.findInfo(dialerCall, false, new ContactLookupCallback(this)); dialogView .findViewById(R.id.rtt_button_decline_request) .setOnClickListener(v -> onNegativeButtonClick()); dialogView .findViewById(R.id.rtt_button_accept_request) .setOnClickListener(v -> onPositiveButtonClick()); AlertDialog alertDialog = new AlertDialog.Builder(getActivity()) .setCancelable(false) .setView(dialogView) .setTitle(R.string.rtt_request_dialog_title) .create(); alertDialog.setCanceledOnTouchOutside(false); return alertDialog; } private void onPositiveButtonClick() { LogUtil.enterBlock("RttRequestDialogFragment.onPositiveButtonClick"); DialerCall call = CallList.getInstance().getCallById(getArguments().getString(ARG_CALL_ID)); call.respondToRttRequest(true, getArguments().getInt(ARG_RTT_REQUEST_ID)); dismiss(); } private void onNegativeButtonClick() { LogUtil.enterBlock("RttRequestDialogFragment.onNegativeButtonClick"); DialerCall call = CallList.getInstance().getCallById(getArguments().getString(ARG_CALL_ID)); call.respondToRttRequest(false, getArguments().getInt(ARG_RTT_REQUEST_ID)); dismiss(); } private void setNameOrNumber(CharSequence nameOrNumber) { detailsTextView.setText(getString(R.string.rtt_request_dialog_details, nameOrNumber)); } private static class ContactLookupCallback implements ContactInfoCacheCallback { private final WeakReference rttRequestDialogFragmentWeakReference; private ContactLookupCallback(RttRequestDialogFragment rttRequestDialogFragment) { rttRequestDialogFragmentWeakReference = new WeakReference<>(rttRequestDialogFragment); } @Override public void onContactInfoComplete(String callId, ContactCacheEntry entry) { RttRequestDialogFragment fragment = rttRequestDialogFragmentWeakReference.get(); if (fragment != null) { fragment.setNameOrNumber(getNameOrNumber(entry, fragment.getContext())); } } private CharSequence getNameOrNumber(ContactCacheEntry entry, Context context) { String preferredName = ContactsComponent.get(context) .contactDisplayPreferences() .getDisplayName(entry.namePrimary, entry.nameAlternative); if (TextUtils.isEmpty(preferredName)) { return TextUtils.isEmpty(entry.number) ? null : PhoneNumberUtils.createTtsSpannable( BidiFormatter.getInstance().unicodeWrap(entry.number, TextDirectionHeuristics.LTR)); } return preferredName; } @Override public void onImageLoadComplete(String callId, ContactCacheEntry entry) {} } }