From 7c6d4125661f20e9ba57c30b8c6873f4ed4038ba Mon Sep 17 00:00:00 2001 From: calderwoodra Date: Thu, 19 Apr 2018 11:50:09 -0700 Subject: Implement remember this choice in SpeedDialEntry database. In order to connect SpeedDialUiItems to the correct SpeedDialEntry in the database, we need to pipe the entry ID throgh to the UI item. So this change includes the logic to pipe the id as well. Bug: 36841782,77760800 Test: DisambigDialogTest PiperOrigin-RevId: 193550938 Change-Id: I6ec64d0aec7f85d36555707a54953bfdff938bb5 --- .../android/dialer/speeddial/DisambigDialog.java | 64 ++++++++++++++++++++-- 1 file changed, 59 insertions(+), 5 deletions(-) (limited to 'java/com/android/dialer/speeddial/DisambigDialog.java') diff --git a/java/com/android/dialer/speeddial/DisambigDialog.java b/java/com/android/dialer/speeddial/DisambigDialog.java index 6f7403a21..0d29a9c84 100644 --- a/java/com/android/dialer/speeddial/DisambigDialog.java +++ b/java/com/android/dialer/speeddial/DisambigDialog.java @@ -17,42 +17,59 @@ package com.android.dialer.speeddial; import android.app.Dialog; +import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.support.annotation.VisibleForTesting; +import android.support.annotation.WorkerThread; import android.support.v4.app.DialogFragment; import android.support.v4.app.FragmentManager; import android.support.v7.app.AlertDialog; import android.util.ArraySet; import android.view.LayoutInflater; import android.view.View; +import android.widget.CheckBox; 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.Assert; +import com.android.dialer.common.LogUtil; +import com.android.dialer.common.concurrent.DefaultFutureCallback; +import com.android.dialer.common.concurrent.DialerExecutorComponent; import com.android.dialer.constants.ActivityRequestCodes; import com.android.dialer.duo.DuoComponent; import com.android.dialer.logging.DialerImpression; import com.android.dialer.logging.Logger; import com.android.dialer.precall.PreCall; +import com.android.dialer.speeddial.database.SpeedDialEntry; import com.android.dialer.speeddial.database.SpeedDialEntry.Channel; +import com.android.dialer.speeddial.database.SpeedDialEntryDatabaseHelper; +import com.android.dialer.speeddial.loader.SpeedDialUiItem; +import com.google.common.collect.ImmutableList; +import com.google.common.util.concurrent.Futures; +import com.google.common.util.concurrent.ListenableFuture; 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 FRAGMENT_TAG = "disambig_dialog"; private final Set phoneNumbers = new ArraySet<>(); + private SpeedDialUiItem speedDialUiItem; @VisibleForTesting public List channels; @VisibleForTesting public LinearLayout container; + private CheckBox rememberThisChoice; /** Show a disambiguation dialog for a starred contact without a favorite communication avenue. */ - public static DisambigDialog show(List channels, FragmentManager manager) { + public static DisambigDialog show(SpeedDialUiItem speedDialUiItem, FragmentManager manager) { DisambigDialog dialog = new DisambigDialog(); - dialog.channels = channels; - dialog.show(manager, null); + dialog.speedDialUiItem = speedDialUiItem; + dialog.channels = speedDialUiItem.channels(); + dialog.show(manager, FRAGMENT_TAG); return dialog; } @@ -62,6 +79,7 @@ public class DisambigDialog extends DialogFragment { // 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); + rememberThisChoice = view.findViewById(R.id.remember_this_choice_checkbox); insertOptions(container.findViewById(R.id.communication_avenue_container), channels); return new AlertDialog.Builder(getActivity()).setView(view).create(); } @@ -132,7 +150,10 @@ public class DisambigDialog extends DialogFragment { } private void onVideoOptionClicked(Channel channel) { - // TODO(calderwoodra): save this option if remember is checked + if (rememberThisChoice.isChecked()) { + setDefaultChannel(getContext().getApplicationContext(), speedDialUiItem, channel); + } + if (channel.technology() == Channel.DUO) { Logger.get(getContext()) .logImpression( @@ -151,9 +172,42 @@ public class DisambigDialog extends DialogFragment { } private void onVoiceOptionClicked(Channel channel) { - // TODO(calderwoodra): save this option if remember is checked + if (rememberThisChoice.isChecked()) { + setDefaultChannel(getContext().getApplicationContext(), speedDialUiItem, channel); + } + PreCall.start( getContext(), new CallIntentBuilder(channel.number(), CallInitiationType.Type.SPEED_DIAL)); dismiss(); } + + private static void setDefaultChannel(Context appContext, SpeedDialUiItem item, Channel channel) { + LogUtil.enterBlock("DisambigDialog.setDefaultChannel"); + ListenableFuture future = + DialerExecutorComponent.get(appContext) + .backgroundExecutor() + .submit( + () -> { + updateDatabaseEntry(appContext, item, channel); + return null; + }); + Futures.addCallback( + future, + new DefaultFutureCallback<>(), + DialerExecutorComponent.get(appContext).backgroundExecutor()); + } + + @WorkerThread + private static void updateDatabaseEntry( + Context appContext, SpeedDialUiItem item, Channel channel) { + Assert.isWorkerThread(); + SpeedDialEntry entry = + SpeedDialEntry.builder() + .setId(item.speedDialEntryId()) + .setContactId(item.contactId()) + .setLookupKey(item.lookupKey()) + .setDefaultChannel(channel) + .build(); + new SpeedDialEntryDatabaseHelper(appContext).update(ImmutableList.of(entry)); + } } -- cgit v1.2.3