Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 97d0b5e5 authored by calderwoodra's avatar calderwoodra Committed by Copybara-Service
Browse files

Pressing dial with an empty dialpad now queries the last number in NUI.

Bug: 72526019
Test: manual
PiperOrigin-RevId: 183425741
Change-Id: Ied1b369d00baefe02db04ade26bee9faac4f829c
parent 33d4d88a
Loading
Loading
Loading
Loading
+8 −4
Original line number Diff line number Diff line
@@ -73,7 +73,6 @@ import com.android.dialer.animation.AnimUtils;
import com.android.dialer.animation.AnimationListenerAdapter;
import com.android.dialer.app.calllog.CallLogActivity;
import com.android.dialer.app.calllog.CallLogAdapter;
import com.android.dialer.app.calllog.CallLogAsync;
import com.android.dialer.app.calllog.CallLogFragment;
import com.android.dialer.app.calllog.CallLogNotificationsService;
import com.android.dialer.app.calllog.IntentProvider;
@@ -99,6 +98,7 @@ import com.android.dialer.callintent.CallSpecificAppData;
import com.android.dialer.common.Assert;
import com.android.dialer.common.LogUtil;
import com.android.dialer.common.UiUtil;
import com.android.dialer.common.concurrent.DialerExecutorComponent;
import com.android.dialer.common.concurrent.ThreadUtil;
import com.android.dialer.compat.CompatUtils;
import com.android.dialer.configprovider.ConfigProviderBindings;
@@ -912,9 +912,13 @@ public class DialtactsActivity extends TransactionSafeActivity

  @Override
  public void getLastOutgoingCall(LastOutgoingCallCallback callback) {
    new CallLogAsync()
        .getLastOutgoingCall(
            new CallLogAsync.GetLastOutgoingCallArgs(this, callback::lastOutgoingCall));
    DialerExecutorComponent.get(this)
        .dialerExecutorFactory()
        .createUiTaskBuilder(
            getFragmentManager(), "Query last phone number", Calls::getLastOutgoingCall)
        .onSuccess(output -> callback.lastOutgoingCall(output))
        .build()
        .executeParallel(this);
  }

  /** Callback from child DialpadFragment when the dialpad is shown. */
+0 −96
Original line number Diff line number Diff line
/*
 * Copyright (C) 2010 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.dialer.app.calllog;

import android.content.Context;
import android.os.AsyncTask;
import android.provider.CallLog.Calls;
import com.android.dialer.common.Assert;

/**
 * Class to access the call log asynchronously to avoid carrying out database operations on the UI
 * thread, using an {@link AsyncTask}.
 *
 * <pre class="prettyprint"> Typical usage: ==============
 *
 * // From an activity... String mLastNumber = "";
 *
 * CallLogAsync log = new CallLogAsync();
 *
 * CallLogAsync.GetLastOutgoingCallArgs lastCallArgs = new CallLogAsync.GetLastOutgoingCallArgs(
 * this, new CallLogAsync.OnLastOutgoingCallComplete() { public void lastOutgoingCall(String number)
 * { mLastNumber = number; } }); log.getLastOutgoingCall(lastCallArgs); </pre>
 */
public class CallLogAsync {

  /** CallLog.getLastOutgoingCall(...) */
  public AsyncTask getLastOutgoingCall(GetLastOutgoingCallArgs args) {
    Assert.isMainThread();
    return new GetLastOutgoingCallTask(args.callback).execute(args);
  }

  /** Interface to retrieve the last dialed number asynchronously. */
  public interface OnLastOutgoingCallComplete {

    /** @param number The last dialed number or an empty string if none exists yet. */
    void lastOutgoingCall(String number);
  }

  /** Parameter object to hold the args to get the last outgoing call from the call log DB. */
  public static class GetLastOutgoingCallArgs {

    public final Context context;
    public final OnLastOutgoingCallComplete callback;

    public GetLastOutgoingCallArgs(Context context, OnLastOutgoingCallComplete callback) {
      this.context = context;
      this.callback = callback;
    }
  }

  /** AsyncTask to get the last outgoing call from the DB. */
  private class GetLastOutgoingCallTask extends AsyncTask<GetLastOutgoingCallArgs, Void, String> {

    private final OnLastOutgoingCallComplete callback;

    public GetLastOutgoingCallTask(OnLastOutgoingCallComplete callback) {
      this.callback = callback;
    }

    // Happens on a background thread. We cannot run the callback
    // here because only the UI thread can modify the view
    // hierarchy (e.g enable/disable the dial button). The
    // callback is ran rom the post execute method.
    @Override
    protected String doInBackground(GetLastOutgoingCallArgs... list) {
      String number = "";
      for (GetLastOutgoingCallArgs args : list) {
        // May block. Select only the last one.
        number = Calls.getLastOutgoingCall(args.context);
      }
      return number; // passed to the onPostExecute method.
    }

    // Happens on the UI thread, it is safe to run the callback
    // that may do some work on the views.
    @Override
    protected void onPostExecute(String number) {
      Assert.isMainThread();
      callback.lastOutgoingCall(number);
    }
  }
}
+9 −1
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@ import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.provider.CallLog.Calls;
import android.provider.ContactsContract.QuickContact;
import android.support.design.widget.FloatingActionButton;
import android.support.v4.app.FragmentTransaction;
@@ -27,6 +28,7 @@ import android.support.v7.app.AppCompatActivity;
import android.widget.ImageView;
import com.android.dialer.calllog.ui.NewCallLogFragment;
import com.android.dialer.common.LogUtil;
import com.android.dialer.common.concurrent.DialerExecutorComponent;
import com.android.dialer.compat.CompatUtils;
import com.android.dialer.constants.ActivityRequestCodes;
import com.android.dialer.contactsfragment.ContactsFragment;
@@ -141,7 +143,13 @@ public final class MainActivity extends AppCompatActivity

  @Override // DialpadListener
  public void getLastOutgoingCall(LastOutgoingCallCallback callback) {
    // TODO(calderwoodra): migrate CallLogAsync class outside of dialer/app and call it here.
    DialerExecutorComponent.get(this)
        .dialerExecutorFactory()
        .createUiTaskBuilder(
            getFragmentManager(), "Query last phone number", Calls::getLastOutgoingCall)
        .onSuccess(output -> callback.lastOutgoingCall(output))
        .build()
        .executeParallel(this);
  }

  @Override // DialpadListener