diff options
Diffstat (limited to 'java')
7 files changed, 213 insertions, 36 deletions
diff --git a/java/com/android/dialer/calldetails/CallDetailsActivity.java b/java/com/android/dialer/calldetails/CallDetailsActivity.java index b51d833dc..c29f9e9ae 100644 --- a/java/com/android/dialer/calldetails/CallDetailsActivity.java +++ b/java/com/android/dialer/calldetails/CallDetailsActivity.java @@ -33,13 +33,20 @@ import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.Toolbar; +import android.view.View; import android.widget.Toast; +import com.android.dialer.DialerPhoneNumber; +import com.android.dialer.assisteddialing.ui.AssistedDialingSettingActivity; import com.android.dialer.calldetails.CallDetailsEntries.CallDetailsEntry; import com.android.dialer.callintent.CallInitiationType; import com.android.dialer.callintent.CallIntentBuilder; import com.android.dialer.common.Assert; import com.android.dialer.common.LogUtil; import com.android.dialer.common.concurrent.AsyncTaskExecutors; +import com.android.dialer.common.concurrent.DialerExecutor.FailureListener; +import com.android.dialer.common.concurrent.DialerExecutor.SuccessListener; +import com.android.dialer.common.concurrent.DialerExecutor.Worker; +import com.android.dialer.common.concurrent.DialerExecutorComponent; import com.android.dialer.constants.ActivityRequestCodes; import com.android.dialer.dialercontact.DialerContact; import com.android.dialer.duo.Duo; @@ -51,10 +58,12 @@ import com.android.dialer.logging.DialerImpression; import com.android.dialer.logging.Logger; import com.android.dialer.logging.UiAction; import com.android.dialer.performancereport.PerformanceReport; +import com.android.dialer.phonenumberproto.DialerPhoneNumberUtil; import com.android.dialer.postcall.PostCall; import com.android.dialer.precall.PreCall; import com.android.dialer.protos.ProtoParsers; import com.google.common.base.Preconditions; +import com.google.i18n.phonenumbers.PhoneNumberUtil; import java.lang.ref.WeakReference; import java.util.Collections; import java.util.List; @@ -70,8 +79,8 @@ public class CallDetailsActivity extends AppCompatActivity { public static final String EXTRA_CAN_REPORT_CALLER_ID = "can_report_caller_id"; private static final String EXTRA_CAN_SUPPORT_ASSISTED_DIALING = "can_support_assisted_dialing"; - private final CallDetailsHeaderViewHolder.CallbackActionListener callbackActionListener = - new CallbackActionListener(this); + private final CallDetailsHeaderViewHolder.CallDetailsHeaderListener callDetailsHeaderListener = + new CallDetailsHeaderListener(this); private final CallDetailsFooterViewHolder.DeleteCallDetailsListener deleteCallDetailsListener = new DeleteCallDetailsListener(this); private final CallDetailsFooterViewHolder.ReportCallIdListener reportCallIdListener = @@ -166,7 +175,7 @@ public class CallDetailsActivity extends AppCompatActivity { this /* context */, contact, entries.getEntriesList(), - callbackActionListener, + callDetailsHeaderListener, reportCallIdListener, deleteCallDetailsListener); @@ -248,11 +257,11 @@ public class CallDetailsActivity extends AppCompatActivity { } } - private static final class CallbackActionListener - implements CallDetailsHeaderViewHolder.CallbackActionListener { - private final WeakReference<Activity> activityWeakReference; + private static final class CallDetailsHeaderListener + implements CallDetailsHeaderViewHolder.CallDetailsHeaderListener { + private final WeakReference<CallDetailsActivity> activityWeakReference; - CallbackActionListener(Activity activity) { + CallDetailsHeaderListener(CallDetailsActivity activity) { this.activityWeakReference = new WeakReference<>(activity); } @@ -303,9 +312,43 @@ public class CallDetailsActivity extends AppCompatActivity { PreCall.start(getActivity(), callIntentBuilder); } - private Activity getActivity() { + private CallDetailsActivity getActivity() { return Preconditions.checkNotNull(activityWeakReference.get()); } + + @Override + public void openAssistedDialingSettings(View unused) { + Intent intent = new Intent(getActivity(), AssistedDialingSettingActivity.class); + getActivity().startActivity(intent); + } + + @Override + public void createAssistedDialerNumberParserTask( + AssistedDialingNumberParseWorker worker, + SuccessListener<Integer> successListener, + FailureListener failureListener) { + DialerExecutorComponent.get(getActivity().getApplicationContext()) + .dialerExecutorFactory() + .createUiTaskBuilder( + getActivity().getFragmentManager(), + "CallDetailsActivity.createAssistedDialerNumberParserTask", + new AssistedDialingNumberParseWorker()) + .onSuccess(successListener) + .onFailure(failureListener) + .build() + .executeParallel(getActivity().contact.getNumber()); + } + } + + static class AssistedDialingNumberParseWorker implements Worker<String, Integer> { + + @Override + public Integer doInBackground(@NonNull String phoneNumber) { + DialerPhoneNumberUtil dialerPhoneNumberUtil = + new DialerPhoneNumberUtil(PhoneNumberUtil.getInstance()); + DialerPhoneNumber parsedNumber = dialerPhoneNumberUtil.parse(phoneNumber, null); + return parsedNumber.getDialerInternalPhoneNumber().getCountryCode(); + } } private static final class DeleteCallDetailsListener diff --git a/java/com/android/dialer/calldetails/CallDetailsAdapter.java b/java/com/android/dialer/calldetails/CallDetailsAdapter.java index 07590597e..9095b86ea 100644 --- a/java/com/android/dialer/calldetails/CallDetailsAdapter.java +++ b/java/com/android/dialer/calldetails/CallDetailsAdapter.java @@ -24,7 +24,7 @@ import android.view.LayoutInflater; import android.view.ViewGroup; import com.android.dialer.calldetails.CallDetailsEntries.CallDetailsEntry; import com.android.dialer.calldetails.CallDetailsFooterViewHolder.DeleteCallDetailsListener; -import com.android.dialer.calldetails.CallDetailsHeaderViewHolder.CallbackActionListener; +import com.android.dialer.calldetails.CallDetailsHeaderViewHolder.CallDetailsHeaderListener; import com.android.dialer.calllogutils.CallTypeHelper; import com.android.dialer.calllogutils.CallbackActionHelper; import com.android.dialer.calllogutils.CallbackActionHelper.CallbackAction; @@ -41,7 +41,7 @@ final class CallDetailsAdapter extends RecyclerView.Adapter<RecyclerView.ViewHol private static final int FOOTER_VIEW_TYPE = 3; private final DialerContact contact; - private final CallbackActionListener callbackActionListener; + private final CallDetailsHeaderListener callDetailsHeaderListener; private final CallDetailsFooterViewHolder.ReportCallIdListener reportCallIdListener; private final DeleteCallDetailsListener deleteCallDetailsListener; private final CallTypeHelper callTypeHelper; @@ -51,12 +51,12 @@ final class CallDetailsAdapter extends RecyclerView.Adapter<RecyclerView.ViewHol Context context, @NonNull DialerContact contact, @NonNull List<CallDetailsEntry> callDetailsEntries, - CallbackActionListener callbackActionListener, + CallDetailsHeaderListener callDetailsHeaderListener, CallDetailsFooterViewHolder.ReportCallIdListener reportCallIdListener, DeleteCallDetailsListener deleteCallDetailsListener) { this.contact = Assert.isNotNull(contact); this.callDetailsEntries = callDetailsEntries; - this.callbackActionListener = callbackActionListener; + this.callDetailsHeaderListener = callDetailsHeaderListener; this.reportCallIdListener = reportCallIdListener; this.deleteCallDetailsListener = deleteCallDetailsListener; callTypeHelper = new CallTypeHelper(context.getResources(), DuoComponent.get(context).getDuo()); @@ -68,7 +68,7 @@ final class CallDetailsAdapter extends RecyclerView.Adapter<RecyclerView.ViewHol switch (viewType) { case HEADER_VIEW_TYPE: return new CallDetailsHeaderViewHolder( - inflater.inflate(R.layout.contact_container, parent, false), callbackActionListener); + inflater.inflate(R.layout.contact_container, parent, false), callDetailsHeaderListener); case CALL_ENTRY_VIEW_TYPE: return new CallDetailsEntryViewHolder( inflater.inflate(R.layout.call_details_entry, parent, false)); @@ -87,6 +87,8 @@ final class CallDetailsAdapter extends RecyclerView.Adapter<RecyclerView.ViewHol public void onBindViewHolder(ViewHolder holder, int position) { if (position == 0) { // Header ((CallDetailsHeaderViewHolder) holder).updateContactInfo(contact, getCallbackAction()); + ((CallDetailsHeaderViewHolder) holder) + .updateAssistedDialingInfo(callDetailsEntries.get(position)); } else if (position == getItemCount() - 1) { ((CallDetailsFooterViewHolder) holder).setPhoneNumber(contact.getNumber()); } else { diff --git a/java/com/android/dialer/calldetails/CallDetailsHeaderViewHolder.java b/java/com/android/dialer/calldetails/CallDetailsHeaderViewHolder.java index 1e08963ed..604a5e8dc 100644 --- a/java/com/android/dialer/calldetails/CallDetailsHeaderViewHolder.java +++ b/java/com/android/dialer/calldetails/CallDetailsHeaderViewHolder.java @@ -25,9 +25,16 @@ import android.view.View; import android.view.View.OnClickListener; import android.widget.ImageView; import android.widget.QuickContactBadge; +import android.widget.RelativeLayout; import android.widget.TextView; +import com.android.dialer.calldetails.CallDetailsActivity.AssistedDialingNumberParseWorker; +import com.android.dialer.calldetails.CallDetailsEntries.CallDetailsEntry; import com.android.dialer.calllogutils.CallbackActionHelper.CallbackAction; import com.android.dialer.common.Assert; +import com.android.dialer.common.LogUtil; +import com.android.dialer.common.concurrent.DialerExecutor.FailureListener; +import com.android.dialer.common.concurrent.DialerExecutor.SuccessListener; +import com.android.dialer.compat.telephony.TelephonyManagerCompat; import com.android.dialer.contactphoto.ContactPhotoManager; import com.android.dialer.dialercontact.DialerContact; import com.android.dialer.logging.InteractionEvent; @@ -35,20 +42,22 @@ import com.android.dialer.logging.Logger; /** ViewHolder for Header/Contact in {@link CallDetailsActivity}. */ public class CallDetailsHeaderViewHolder extends RecyclerView.ViewHolder - implements OnClickListener { + implements OnClickListener, FailureListener { - private final CallbackActionListener callbackActionListener; + private final CallDetailsHeaderListener callDetailsHeaderListener; private final ImageView callbackButton; private final TextView nameView; private final TextView numberView; private final TextView networkView; private final QuickContactBadge contactPhoto; private final Context context; + private final TextView assistedDialingInternationalDirectDialCodeAndCountryCodeText; + private final RelativeLayout assistedDialingContainer; private DialerContact contact; private @CallbackAction int callbackAction; - CallDetailsHeaderViewHolder(View container, CallbackActionListener callbackActionListener) { + CallDetailsHeaderViewHolder(View container, CallDetailsHeaderListener callDetailsHeaderListener) { super(container); context = container.getContext(); callbackButton = container.findViewById(R.id.call_back_button); @@ -56,14 +65,71 @@ public class CallDetailsHeaderViewHolder extends RecyclerView.ViewHolder numberView = container.findViewById(R.id.phone_number); networkView = container.findViewById(R.id.network); contactPhoto = container.findViewById(R.id.quick_contact_photo); + assistedDialingInternationalDirectDialCodeAndCountryCodeText = + container.findViewById(R.id.assisted_dialing_text); + assistedDialingContainer = container.findViewById(R.id.assisted_dialing_container); + + assistedDialingContainer.setOnClickListener( + callDetailsHeaderListener::openAssistedDialingSettings); callbackButton.setOnClickListener(this); - this.callbackActionListener = callbackActionListener; + this.callDetailsHeaderListener = callDetailsHeaderListener; Logger.get(context) .logQuickContactOnTouch( contactPhoto, InteractionEvent.Type.OPEN_QUICK_CONTACT_FROM_CALL_DETAILS, true); } + private boolean hasAssistedDialingFeature(Integer features) { + return (features & TelephonyManagerCompat.FEATURES_ASSISTED_DIALING) + == TelephonyManagerCompat.FEATURES_ASSISTED_DIALING; + } + + void updateAssistedDialingInfo(CallDetailsEntry callDetailsEntry) { + + if (callDetailsEntry != null && hasAssistedDialingFeature(callDetailsEntry.getFeatures())) { + showAssistedDialingContainer(true); + callDetailsHeaderListener.createAssistedDialerNumberParserTask( + new CallDetailsActivity.AssistedDialingNumberParseWorker(), + this::updateAssistedDialingText, + this::onFailure); + + } else { + showAssistedDialingContainer(false); + } + } + + private void showAssistedDialingContainer(boolean shouldShowContainer) { + if (shouldShowContainer) { + assistedDialingContainer.setVisibility(View.VISIBLE); + } else { + LogUtil.i( + "CallDetailsHeaderViewHolder.updateAssistedDialingInfo", + "hiding assisted dialing ui elements"); + assistedDialingContainer.setVisibility(View.GONE); + } + } + + private void updateAssistedDialingText(Integer countryCode) { + + // Try and handle any poorly formed inputs. + if (countryCode <= 0) { + onFailure(new IllegalStateException()); + return; + } + + LogUtil.i( + "CallDetailsHeaderViewHolder.updateAssistedDialingText", "Updating Assisted Dialing Text"); + assistedDialingInternationalDirectDialCodeAndCountryCodeText.setText( + context.getString( + R.string.assisted_dialing_country_code_entry, String.valueOf(countryCode))); + } + + @Override + public void onFailure(Throwable unused) { + assistedDialingInternationalDirectDialCodeAndCountryCodeText.setText( + R.string.assisted_dialing_country_code_entry_failure); + } + /** Populates the contact info fields based on the current contact information. */ void updateContactInfo(DialerContact contact, @CallbackAction int callbackAction) { this.contact = contact; @@ -128,13 +194,14 @@ public class CallDetailsHeaderViewHolder extends RecyclerView.ViewHolder if (view == callbackButton) { switch (callbackAction) { case CallbackAction.IMS_VIDEO: - callbackActionListener.placeImsVideoCall(contact.getNumber()); + callDetailsHeaderListener.placeImsVideoCall(contact.getNumber()); break; case CallbackAction.DUO: - callbackActionListener.placeDuoVideoCall(contact.getNumber()); + callDetailsHeaderListener.placeDuoVideoCall(contact.getNumber()); break; case CallbackAction.VOICE: - callbackActionListener.placeVoiceCall(contact.getNumber(), contact.getPostDialDigits()); + callDetailsHeaderListener.placeVoiceCall( + contact.getNumber(), contact.getPostDialDigits()); break; case CallbackAction.NONE: default: @@ -145,8 +212,8 @@ public class CallDetailsHeaderViewHolder extends RecyclerView.ViewHolder } } - /** Listener for making a callback */ - interface CallbackActionListener { + /** Listener for the call details header */ + interface CallDetailsHeaderListener { /** Places an IMS video call. */ void placeImsVideoCall(String phoneNumber); @@ -156,5 +223,13 @@ public class CallDetailsHeaderViewHolder extends RecyclerView.ViewHolder /** Place a traditional voice call. */ void placeVoiceCall(String phoneNumber, String postDialDigits); + + /** Access the Assisted Dialing settings * */ + void openAssistedDialingSettings(View view); + + void createAssistedDialerNumberParserTask( + AssistedDialingNumberParseWorker worker, + SuccessListener<Integer> onSuccess, + FailureListener onFailure); } } diff --git a/java/com/android/dialer/calldetails/res/layout/contact_container.xml b/java/com/android/dialer/calldetails/res/layout/contact_container.xml index b01a6cc13..5f531ab43 100644 --- a/java/com/android/dialer/calldetails/res/layout/contact_container.xml +++ b/java/com/android/dialer/calldetails/res/layout/contact_container.xml @@ -19,49 +19,54 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="@dimen/call_details_top_margin" - android:gravity="center_vertical" android:paddingTop="@dimen/contact_container_padding_top_start" - android:paddingStart="@dimen/contact_container_padding_top_start" android:paddingBottom="@dimen/contact_container_padding_bottom_end" - android:paddingEnd="@dimen/contact_container_padding_bottom_end"> + android:paddingStart="@dimen/contact_container_padding_top_start" + android:paddingEnd="@dimen/contact_container_padding_bottom_end" + android:gravity="center_vertical" + android:orientation="vertical"> <QuickContactBadge android:id="@+id/quick_contact_photo" android:layout_width="@dimen/call_details_contact_photo_size" android:layout_height="@dimen/call_details_contact_photo_size" - android:layout_centerVertical="true" android:padding="@dimen/call_details_contact_photo_padding" android:focusable="true"/> <LinearLayout - android:orientation="vertical" + android:id="@+id/contact_information" android:layout_width="wrap_content" android:layout_height="wrap_content" + android:layout_alignParentTop="true" android:layout_toEndOf="@+id/quick_contact_photo" android:layout_toStartOf="@+id/call_back_button" - android:layout_centerVertical="true"> + android:gravity="center_vertical" + android:minHeight="@dimen/call_details_contact_photo_size" + android:orientation="vertical"> <TextView android:id="@+id/contact_name" + style="@style/PrimaryText" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginStart="@dimen/photo_text_margin" - style="@style/PrimaryText"/> + android:layout_marginStart="@dimen/photo_text_margin"/> <TextView android:id="@+id/phone_number" + style="@style/SecondaryText" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginStart="@dimen/photo_text_margin" - style="@style/SecondaryText"/> + android:layout_marginStart="@dimen/photo_text_margin"/> <TextView android:id="@+id/network" + style="@style/SecondaryText" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="@dimen/photo_text_margin" - android:visibility="gone" - style="@style/SecondaryText"/> + android:visibility="gone"/> + + </LinearLayout> <ImageView @@ -69,10 +74,40 @@ android:layout_width="@dimen/call_back_button_size" android:layout_height="@dimen/call_back_button_size" android:layout_alignParentEnd="true" - android:layout_centerVertical="true" android:background="?android:attr/selectableItemBackgroundBorderless" android:contentDescription="@string/call" android:scaleType="center" android:src="@drawable/quantum_ic_call_white_24" android:tint="@color/secondary_text_color"/> + + + <RelativeLayout + android:id="@+id/assisted_dialing_container" + android:layout_width="match_parent" + android:layout_height="@dimen/ad_container_height" + android:layout_below="@+id/contact_information" + android:background="?android:attr/selectableItemBackground" + android:gravity="center_vertical"> + + <ImageView + android:id="@+id/assisted_dialing_globe" + android:layout_width="@dimen/ad_icon_size" + android:layout_height="@dimen/ad_icon_size" + android:layout_marginTop="@dimen/ad_icon_margin_top_offset" + android:layout_marginStart="@dimen/ad_icon_margin_start_offset" + android:scaleType="fitCenter" + android:src="@drawable/quantum_ic_language_vd_theme_24" + android:tint="@color/secondary_text_color"/> + + <TextView + android:id="@+id/assisted_dialing_text" + style="@style/SecondaryText" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginStart="@dimen/ad_text_margin_start" + android:layout_marginEnd="@dimen/ad_end_margin" + android:layout_toRightOf="@id/assisted_dialing_globe"/> + + </RelativeLayout> + </RelativeLayout>
\ No newline at end of file diff --git a/java/com/android/dialer/calldetails/res/values/dimens.xml b/java/com/android/dialer/calldetails/res/values/dimens.xml index 694c8f47c..8c84b1b9b 100644 --- a/java/com/android/dialer/calldetails/res/values/dimens.xml +++ b/java/com/android/dialer/calldetails/res/values/dimens.xml @@ -18,7 +18,7 @@ <dimen name="call_details_top_margin">6dp</dimen> <!-- contact container --> - <dimen name="contact_container_padding_bottom_end">16dp</dimen> + <dimen name="contact_container_padding_bottom_end">8dp</dimen> <dimen name="contact_container_padding_top_start">12dp</dimen> <dimen name="call_details_contact_photo_size">48dp</dimen> <dimen name="call_details_contact_photo_padding">4dp</dimen> @@ -34,4 +34,14 @@ <dimen name="ec_container_height">48dp</dimen> <dimen name="ec_photo_size">40dp</dimen> <dimen name="ec_divider_top_bottom_margin">8dp</dimen> + + <!-- Assisted Dialing --> + <dimen name="ad_container_height">48dp</dimen> + <dimen name="ad_icon_size">18dp</dimen> + <dimen name="ad_end_margin">16dp</dimen> + <dimen name="ad_text_margin_start">8dp</dimen> + <!-- Used to help smooth the text alignment to the center of the icon --> + <dimen name="ad_icon_margin_top_offset">2dp</dimen> + <dimen name="ad_icon_margin_start_offset">60dp</dimen> + </resources>
\ No newline at end of file diff --git a/java/com/android/dialer/calldetails/res/values/strings.xml b/java/com/android/dialer/calldetails/res/values/strings.xml index 74ac71c32..f81696034 100644 --- a/java/com/android/dialer/calldetails/res/values/strings.xml +++ b/java/com/android/dialer/calldetails/res/values/strings.xml @@ -49,4 +49,10 @@ <!-- Toast message which appears when a contact's caller id is reported as incorrect. [CHAR LIMIT=NONE] --> <string name="report_caller_id_toast">Number reported</string> + + <!-- Assisted dialing section header. [CHAR LIMIT=NONE] --> + <string name="assisted_dialing_country_code_entry">Assisted dialing: Used country code +<xliff:g example="1" id="ad_country_code">%1$s</xliff:g></string> + + <!-- A fallback string for the assisted dialing header incase parsing failes.. [CHAR LIMIT=NONE] --> + <string name="assisted_dialing_country_code_entry_failure">Assisted dialing was used</string> </resources> diff --git a/java/com/android/dialer/compat/telephony/TelephonyManagerCompat.java b/java/com/android/dialer/compat/telephony/TelephonyManagerCompat.java index cadce4d48..6bed818da 100644 --- a/java/com/android/dialer/compat/telephony/TelephonyManagerCompat.java +++ b/java/com/android/dialer/compat/telephony/TelephonyManagerCompat.java @@ -77,6 +77,12 @@ public class TelephonyManagerCompat { BuildCompat.isAtLeastOMR1() ? "android.telephony.extra.IS_REFRESH" : "is_refresh"; /** + * Indicates the call underwent Assisted Dialing; typically set as a feature available from the + * CallLog. + */ + public static final Integer FEATURES_ASSISTED_DIALING = 0x10; + + /** * Returns the number of phones available. Returns 1 for Single standby mode (Single SIM * functionality) Returns 2 for Dual standby mode.(Dual SIM functionality) * |