diff options
author | Treehugger Robot <treehugger-gerrit@google.com> | 2018-04-10 23:45:42 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2018-04-10 23:45:42 +0000 |
commit | 2d5626caed7c93660a8fdd67a20684403f747099 (patch) | |
tree | 6ad2320ef374eeafdccce97942093432d2834e30 /java | |
parent | 3e98abd1a11c903340496b6563a21fd9ca921411 (diff) | |
parent | a5f86bb8e89f2fdca4b6db947fe63eb7af1bf73e (diff) |
Merge "Implement the disambig dialog for favorite contacts."
Diffstat (limited to 'java')
8 files changed, 126 insertions, 222 deletions
diff --git a/java/com/android/dialer/speeddial/DisambigDialog.java b/java/com/android/dialer/speeddial/DisambigDialog.java index 1ee26f595..2a8200274 100644 --- a/java/com/android/dialer/speeddial/DisambigDialog.java +++ b/java/com/android/dialer/speeddial/DisambigDialog.java @@ -17,59 +17,47 @@ package com.android.dialer.speeddial; import android.app.Dialog; -import android.content.ContentResolver; -import android.content.res.Resources; -import android.database.Cursor; import android.os.Bundle; -import android.provider.ContactsContract.CommonDataKinds.Phone; -import android.support.annotation.Nullable; import android.support.annotation.VisibleForTesting; import android.support.v4.app.DialogFragment; import android.support.v4.app.FragmentManager; import android.support.v7.app.AlertDialog; -import android.text.TextUtils; import android.util.ArraySet; import android.view.LayoutInflater; import android.view.View; +import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; import com.android.dialer.callintent.CallInitiationType; import com.android.dialer.callintent.CallIntentBuilder; -import com.android.dialer.common.LogUtil; -import com.android.dialer.common.concurrent.DialerExecutor.Worker; -import com.android.dialer.duo.DuoComponent; import com.android.dialer.precall.PreCall; -import java.util.ArrayList; -import java.util.Arrays; +import com.android.dialer.speeddial.database.SpeedDialEntry.Channel; +import java.util.List; import java.util.Set; /** Disambiguation dialog for favorite contacts in {@link SpeedDialFragment}. */ public class DisambigDialog extends DialogFragment { - @VisibleForTesting public static final String DISAMBIG_DIALOG_TAG = "disambig_dialog"; - - @SuppressWarnings("unused") - private static final String DISAMBIG_DIALOG_WORKER_TAG = "disambig_dialog_worker"; - private final Set<String> phoneNumbers = new ArraySet<>(); - private LinearLayout container; - @SuppressWarnings("unused") - private String lookupKey; + @VisibleForTesting public List<Channel> channels; + @VisibleForTesting public LinearLayout container; /** Show a disambiguation dialog for a starred contact without a favorite communication avenue. */ - public static DisambigDialog show(String lookupKey, FragmentManager manager) { + public static DisambigDialog show(List<Channel> channels, FragmentManager manager) { DisambigDialog dialog = new DisambigDialog(); - dialog.lookupKey = lookupKey; - dialog.show(manager, DISAMBIG_DIALOG_TAG); + dialog.channels = channels; + dialog.show(manager, null); return dialog; } @Override public Dialog onCreateDialog(Bundle savedInstanceState) { LayoutInflater inflater = getActivity().getLayoutInflater(); + // TODO(calderwoodra): set max height of the scrollview. Might need to override onMeasure. View view = inflater.inflate(R.layout.disambig_dialog_layout, null, false); container = view.findViewById(R.id.communication_avenue_container); + insertOptions(container.findViewById(R.id.communication_avenue_container), channels); return new AlertDialog.Builder(getActivity()).setView(view).create(); } @@ -90,135 +78,68 @@ public class DisambigDialog extends DialogFragment { * <li>Clickable voice option * </ul> */ - @SuppressWarnings("unused") - private void insertOptions(Cursor cursor) { - if (!cursorIsValid(cursor)) { - dismiss(); - return; - } - - do { - String number = cursor.getString(LookupContactInfoWorker.NUMBER_INDEX); - // TODO(calderwoodra): improve this to include fuzzy matching - if (phoneNumbers.add(number)) { - insertOption( - number, - getLabel(getContext().getResources(), cursor), - isVideoReachable(cursor, number)); + private void insertOptions(LinearLayout container, List<Channel> channels) { + for (Channel channel : channels) { + // TODO(calderwoodra): use fuzzy number matcher + if (phoneNumbers.add(channel.number())) { + insertHeader(container, channel.number(), channel.label()); } - } while (cursor.moveToNext()); - cursor.close(); - // TODO(calderwoodra): set max height of the scrollview. Might need to override onMeasure. + insertOption(container, channel); + } } - /** Returns true if the given number is ViLTE reachable or Duo reachable. */ - private boolean isVideoReachable(Cursor cursor, String number) { - boolean isVideoReachable = cursor.getInt(LookupContactInfoWorker.PHONE_PRESENCE_INDEX) == 1; - if (!isVideoReachable) { - isVideoReachable = DuoComponent.get(getContext()).getDuo().isReachable(getContext(), number); - } - return isVideoReachable; + private void insertHeader(LinearLayout container, String number, String phoneType) { + View view = + getActivity() + .getLayoutInflater() + .inflate(R.layout.disambig_option_header_layout, container, false); + ((TextView) view.findViewById(R.id.disambig_header_phone_type)).setText(phoneType); + ((TextView) view.findViewById(R.id.disambig_header_phone_number)).setText(number); + container.addView(view); } /** Inserts a group of options for a specific phone number. */ - private void insertOption(String number, String phoneType, boolean isVideoReachable) { + private void insertOption(LinearLayout container, Channel channel) { View view = getActivity() .getLayoutInflater() .inflate(R.layout.disambig_option_layout, container, false); - ((TextView) view.findViewById(R.id.phone_type)).setText(phoneType); - ((TextView) view.findViewById(R.id.phone_number)).setText(number); - - if (isVideoReachable) { - View videoOption = view.findViewById(R.id.video_call_container); - videoOption.setOnClickListener(v -> onVideoOptionClicked(number)); - videoOption.setVisibility(View.VISIBLE); + if (channel.isVideoTechnology()) { + View videoOption = view.findViewById(R.id.option_container); + videoOption.setOnClickListener(v -> onVideoOptionClicked(channel)); + videoOption.setContentDescription( + getActivity().getString(R.string.disambig_option_video_call)); + ((ImageView) view.findViewById(R.id.disambig_option_image)) + .setImageResource(R.drawable.quantum_ic_videocam_vd_theme_24); + ((TextView) view.findViewById(R.id.disambig_option_text)) + .setText(R.string.disambig_option_video_call); + } else { + View voiceOption = view.findViewById(R.id.option_container); + voiceOption.setOnClickListener(v -> onVoiceOptionClicked(channel)); + voiceOption.setContentDescription( + getActivity().getString(R.string.disambig_option_voice_call)); + ((ImageView) view.findViewById(R.id.disambig_option_image)) + .setImageResource(R.drawable.quantum_ic_phone_vd_theme_24); + ((TextView) view.findViewById(R.id.disambig_option_text)) + .setText(R.string.disambig_option_voice_call); } - View voiceOption = view.findViewById(R.id.voice_call_container); - voiceOption.setOnClickListener(v -> onVoiceOptionClicked(number)); container.addView(view); } - private void onVideoOptionClicked(String number) { + private void onVideoOptionClicked(Channel channel) { // TODO(calderwoodra): save this option if remember is checked // TODO(calderwoodra): place a duo call if possible PreCall.start( getContext(), - new CallIntentBuilder(number, CallInitiationType.Type.SPEED_DIAL).setIsVideoCall(true)); + new CallIntentBuilder(channel.number(), CallInitiationType.Type.SPEED_DIAL) + .setIsVideoCall(true)); + dismiss(); } - private void onVoiceOptionClicked(String number) { + private void onVoiceOptionClicked(Channel channel) { // TODO(calderwoodra): save this option if remember is checked - PreCall.start(getContext(), new CallIntentBuilder(number, CallInitiationType.Type.SPEED_DIAL)); - } - - // TODO(calderwoodra): handle CNAP and cequint types. - // TODO(calderwoodra): unify this into a utility method with CallLogAdapter#getNumberType - private static String getLabel(Resources resources, Cursor cursor) { - int numberType = cursor.getInt(LookupContactInfoWorker.PHONE_TYPE_INDEX); - String numberLabel = cursor.getString(LookupContactInfoWorker.PHONE_LABEL_INDEX); - - // Returns empty label instead of "custom" if the custom label is empty. - if (numberType == Phone.TYPE_CUSTOM && TextUtils.isEmpty(numberLabel)) { - return ""; - } - return (String) Phone.getTypeLabel(resources, numberType, numberLabel); - } - - // Checks if the cursor is valid and logs an error if there are any issues. - private static boolean cursorIsValid(Cursor cursor) { - if (cursor == null) { - LogUtil.e("DisambigDialog.insertOptions", "cursor null."); - return false; - } else if (cursor.isClosed()) { - LogUtil.e("DisambigDialog.insertOptions", "cursor closed."); - cursor.close(); - return false; - } else if (!cursor.moveToFirst()) { - LogUtil.e("DisambigDialog.insertOptions", "cursor empty."); - cursor.close(); - return false; - } - return true; - } - - private static class LookupContactInfoWorker implements Worker<String, Cursor> { - - static final int NUMBER_INDEX = 0; - static final int PHONE_TYPE_INDEX = 1; - static final int PHONE_LABEL_INDEX = 2; - static final int PHONE_PRESENCE_INDEX = 3; - - private static final String[] projection = - new String[] {Phone.NUMBER, Phone.TYPE, Phone.LABEL, Phone.CARRIER_PRESENCE}; - private final ContentResolver resolver; - - LookupContactInfoWorker(ContentResolver resolver) { - this.resolver = resolver; - } - - @Nullable - @Override - public Cursor doInBackground(@Nullable String lookupKey) throws Throwable { - if (TextUtils.isEmpty(lookupKey)) { - LogUtil.e("LookupConctactInfoWorker.doInBackground", "contact id unsest."); - return null; - } - return resolver.query( - Phone.CONTENT_URI, projection, Phone.LOOKUP_KEY + " = ?", new String[] {lookupKey}, null); - } - } - - @VisibleForTesting - public static String[] getProjectionForTesting() { - ArrayList<String> projection = - new ArrayList<>(Arrays.asList(LookupContactInfoWorker.projection)); - projection.add(Phone.LOOKUP_KEY); - return projection.toArray(new String[projection.size()]); - } - - @VisibleForTesting - public LinearLayout getContainer() { - return container; + PreCall.start( + getContext(), new CallIntentBuilder(channel.number(), CallInitiationType.Type.SPEED_DIAL)); + dismiss(); } } diff --git a/java/com/android/dialer/speeddial/SpeedDialFragment.java b/java/com/android/dialer/speeddial/SpeedDialFragment.java index d1f195be1..3cf6cb9b9 100644 --- a/java/com/android/dialer/speeddial/SpeedDialFragment.java +++ b/java/com/android/dialer/speeddial/SpeedDialFragment.java @@ -120,7 +120,7 @@ public class SpeedDialFragment extends Fragment { @Override public void onAmbiguousContactClicked(List<Channel> channels) { - // TODO(calderwoodra): implement the disambig dialog with channels + DisambigDialog.show(channels, getChildFragmentManager()); } @Override diff --git a/java/com/android/dialer/speeddial/res/layout/disambig_option_header_layout.xml b/java/com/android/dialer/speeddial/res/layout/disambig_option_header_layout.xml new file mode 100644 index 000000000..d331a0a6e --- /dev/null +++ b/java/com/android/dialer/speeddial/res/layout/disambig_option_header_layout.xml @@ -0,0 +1,40 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + ~ Copyright (C) 2017 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 + --> +<LinearLayout + xmlns:android="http://schemas.android.com/apk/res/android" + android:id="@+id/disambig_header_container" + android:orientation="vertical" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginBottom="8dp" + android:minHeight="56dp" + android:gravity="center_vertical" + android:paddingStart="24dp" + android:paddingEnd="24dp"> + + <TextView + android:id="@+id/disambig_header_phone_type" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + style="@style/PrimaryText"/> + + <TextView + android:id="@+id/disambig_header_phone_number" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + style="@style/SecondaryText"/> +</LinearLayout> diff --git a/java/com/android/dialer/speeddial/res/layout/disambig_option_layout.xml b/java/com/android/dialer/speeddial/res/layout/disambig_option_layout.xml index 097ac4084..62f6ab5e1 100644 --- a/java/com/android/dialer/speeddial/res/layout/disambig_option_layout.xml +++ b/java/com/android/dialer/speeddial/res/layout/disambig_option_layout.xml @@ -15,89 +15,27 @@ ~ limitations under the License --> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" - android:id="@+id/disambig_option_container" - android:orientation="vertical" + android:id="@+id/option_container" + android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="wrap_content" + android:paddingStart="24dp" + android:paddingEnd="24dp" android:minHeight="56dp" - android:layout_marginBottom="8dp"> - - <LinearLayout - android:orientation="vertical" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:minHeight="56dp" - android:gravity="center_vertical" - android:paddingStart="24dp" - android:paddingEnd="24dp"> - - <TextView - android:id="@+id/phone_type" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - style="@style/PrimaryText"/> - - <TextView - android:id="@+id/phone_number" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - style="@style/SecondaryText"/> - </LinearLayout> - - <LinearLayout - android:id="@+id/video_call_container" - android:orientation="horizontal" - android:layout_width="match_parent" + android:background="?android:attr/selectableItemBackground"> + + <ImageView + android:id="@+id/disambig_option_image" + android:layout_width="24dp" + android:layout_height="24dp" + android:layout_gravity="center_vertical" + android:tint="@color/dialer_secondary_text_color"/> + + <TextView + android:id="@+id/disambig_option_text" + android:layout_width="wrap_content" android:layout_height="wrap_content" - android:paddingStart="24dp" - android:paddingEnd="24dp" - android:minHeight="56dp" - android:background="?android:attr/selectableItemBackground" - android:visibility="gone" - android:contentDescription="@string/disambig_option_video_call"> - - <ImageView - android:layout_width="24dp" - android:layout_height="24dp" - android:layout_gravity="center_vertical" - android:tint="@color/dialer_secondary_text_color" - android:src="@drawable/quantum_ic_videocam_vd_theme_24"/> - - <TextView - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_marginStart="12dp" - android:layout_gravity="center_vertical" - android:text="@string/disambig_option_video_call" - style="@style/PrimaryText"/> - </LinearLayout> - - <LinearLayout - android:id="@+id/voice_call_container" - android:orientation="horizontal" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:paddingStart="24dp" - android:paddingEnd="24dp" - android:minHeight="56dp" - android:background="?android:attr/selectableItemBackground" - android:contentDescription="@string/disambig_option_voice_call"> - - <ImageView - android:id="@+id/disambig_option_icon" - android:layout_width="24dp" - android:layout_height="24dp" - android:layout_gravity="center_vertical" - android:tint="@color/dialer_secondary_text_color" - android:src="@drawable/quantum_ic_phone_vd_theme_24"/> - - <TextView - android:id="@+id/disambig_option_text" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_marginStart="12dp" - android:layout_gravity="center_vertical" - android:text="@string/disambig_option_voice_call" - style="@style/PrimaryText"/> - </LinearLayout> + android:layout_marginStart="12dp" + android:layout_gravity="center_vertical" + style="@style/PrimaryText"/> </LinearLayout>
\ No newline at end of file diff --git a/java/com/android/dialer/speeddial/res/layout/favorite_item_layout.xml b/java/com/android/dialer/speeddial/res/layout/favorite_item_layout.xml index b4af686b7..d4fa07d90 100644 --- a/java/com/android/dialer/speeddial/res/layout/favorite_item_layout.xml +++ b/java/com/android/dialer/speeddial/res/layout/favorite_item_layout.xml @@ -32,8 +32,7 @@ <com.android.dialer.speeddial.SquareImageView android:id="@+id/avatar" android:layout_width="match_parent" - android:layout_height="match_parent" - android:clickable="false"/> + android:layout_height="match_parent"/> <FrameLayout android:id="@+id/video_call_container" @@ -59,6 +58,8 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" + android:layout_marginStart="4dp" + android:layout_marginEnd="4dp" style="@style/PrimaryText"/> <TextView @@ -66,5 +67,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" + android:layout_marginStart="4dp" + android:layout_marginEnd="4dp" style="@style/SecondaryText"/> </LinearLayout>
\ No newline at end of file diff --git a/java/com/android/dialer/speeddial/res/layout/fragment_speed_dial.xml b/java/com/android/dialer/speeddial/res/layout/fragment_speed_dial.xml index 9f2dec931..67ef877ca 100644 --- a/java/com/android/dialer/speeddial/res/layout/fragment_speed_dial.xml +++ b/java/com/android/dialer/speeddial/res/layout/fragment_speed_dial.xml @@ -19,8 +19,6 @@ android:id="@+id/speed_dial_recycler_view" android:layout_width="match_parent" android:layout_height="match_parent" - android:paddingStart="16dp" - android:paddingEnd="16dp" android:clipToPadding="false" android:background="@color/background_dialer_light" android:paddingBottom="@dimen/floating_action_button_list_bottom_padding"/> diff --git a/java/com/android/dialer/speeddial/res/layout/speed_dial_header_layout.xml b/java/com/android/dialer/speeddial/res/layout/speed_dial_header_layout.xml index 0a84b41e6..15c00e45b 100644 --- a/java/com/android/dialer/speeddial/res/layout/speed_dial_header_layout.xml +++ b/java/com/android/dialer/speeddial/res/layout/speed_dial_header_layout.xml @@ -17,6 +17,8 @@ <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" + android:layout_marginStart="16dp" + android:layout_marginEnd="16dp" android:minHeight="@dimen/dialer_list_item_min_height"> <TextView diff --git a/java/com/android/dialer/speeddial/res/layout/suggestion_row_layout.xml b/java/com/android/dialer/speeddial/res/layout/suggestion_row_layout.xml index 4281700f3..ff95b5906 100644 --- a/java/com/android/dialer/speeddial/res/layout/suggestion_row_layout.xml +++ b/java/com/android/dialer/speeddial/res/layout/suggestion_row_layout.xml @@ -18,22 +18,24 @@ xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" - android:minHeight="72dp"> + android:minHeight="72dp" + android:background="?android:attr/selectableItemBackground"> <QuickContactBadge android:id="@+id/avatar" android:layout_width="48dp" android:layout_height="48dp" - android:layout_centerVertical="true"/> + android:layout_centerVertical="true" + android:layout_marginStart="16dp"/> <LinearLayout android:orientation="vertical" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginStart="56dp" android:layout_centerVertical="true" - android:layout_alignParentStart="true" - android:layout_toStartOf="@+id/overflow"> + android:layout_toEndOf="@+id/avatar" + android:layout_toStartOf="@+id/overflow" + android:layout_marginStart="8dp"> <TextView android:id="@+id/name" |