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

Commit e5f1e626 authored by Treehugger Robot's avatar Treehugger Robot Committed by Gerrit Code Review
Browse files

Merge changes If1ecc3b4,Ied1b369d,I4e492279,I30a4b7fe

* changes:
  Disable phone icon for unknown numbers in NUI Voicemail
  Pressing dial with an empty dialpad now queries the last number in NUI.
  Disable seekbar user seeking
  Add voice search to NUI.
parents f0d56caf 351cbcf3
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);
    }
  }
}
+20 −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,7 +28,9 @@ 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;
import com.android.dialer.contactsfragment.ContactsFragment.Header;
import com.android.dialer.contactsfragment.ContactsFragment.OnContactSelectedListener;
@@ -116,6 +119,16 @@ public final class MainActivity extends AppCompatActivity
    searchController.onSaveInstanceState(bundle);
  }

  @Override
  protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == ActivityRequestCodes.DIALTACTS_VOICE_SEARCH) {
      searchController.onVoiceResults(resultCode, data);
    } else {
      LogUtil.e("MainActivity.onActivityResult", "Unknown request code: " + requestCode);
    }
  }

  @Override
  public void onContactSelected(ImageView photo, Uri contactUri, long contactId) {
    // TODO(calderwoodra): Add impression logging
@@ -130,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
+34 −2
Original line number Diff line number Diff line
@@ -17,16 +17,22 @@
package com.android.dialer.main.impl;

import android.app.FragmentTransaction;
import android.content.ActivityNotFoundException;
import android.content.Intent;
import android.os.Bundle;
import android.speech.RecognizerIntent;
import android.support.annotation.Nullable;
import android.support.design.widget.FloatingActionButton;
import android.support.v7.app.AppCompatActivity;
import android.text.TextUtils;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.Animation.AnimationListener;
import android.widget.Toast;
import com.android.dialer.callintent.CallInitiationType;
import com.android.dialer.common.Assert;
import com.android.dialer.common.LogUtil;
import com.android.dialer.constants.ActivityRequestCodes;
import com.android.dialer.dialpadview.DialpadFragment;
import com.android.dialer.dialpadview.DialpadFragment.DialpadListener;
import com.android.dialer.dialpadview.DialpadFragment.OnDialpadQueryChangedListener;
@@ -36,6 +42,7 @@ import com.android.dialer.searchfragment.list.NewSearchFragment;
import com.android.dialer.searchfragment.list.NewSearchFragment.SearchFragmentListener;
import com.android.dialer.util.ViewUtil;
import com.google.common.base.Optional;
import java.util.ArrayList;

/**
 * Search controller for handling all the logic related to entering and exiting the search UI.
@@ -255,8 +262,12 @@ final class MainSearchController implements SearchBarListener {
   */
  @Override
  public void onSearchBarClicked() {
    openSearch(Optional.absent());
  }

  private void openSearch(Optional<String> query) {
    fab.hide();
    toolbar.expand(/* animate=*/ true, Optional.absent());
    toolbar.expand(/* animate=*/ true, query);
    toolbar.showKeyboard();
    hideBottomNav();

@@ -294,7 +305,28 @@ final class MainSearchController implements SearchBarListener {
  }

  @Override
  public void onVoiceButtonClicked(VoiceSearchResultCallback voiceSearchResultCallback) {}
  public void onVoiceButtonClicked(VoiceSearchResultCallback voiceSearchResultCallback) {
    try {
      Intent voiceIntent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
      mainActivity.startActivityForResult(voiceIntent, ActivityRequestCodes.DIALTACTS_VOICE_SEARCH);
    } catch (ActivityNotFoundException e) {
      Toast.makeText(mainActivity, R.string.voice_search_not_available, Toast.LENGTH_SHORT).show();
    }
  }

  public void onVoiceResults(int resultCode, Intent data) {
    if (resultCode == AppCompatActivity.RESULT_OK) {
      ArrayList<String> matches = data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);
      if (matches.size() > 0) {
        LogUtil.i("MainSearchController.onVoiceResults", "voice search - match found");
        openSearch(Optional.of(matches.get(0)));
      } else {
        LogUtil.i("MainSearchController.onVoiceResults", "voice search - nothing heard");
      }
    } else {
      LogUtil.e("MainSearchController.onVoiceResults", "voice search failed");
    }
  }

  @Override
  public void openSettings() {}
+3 −0
Original line number Diff line number Diff line
@@ -46,4 +46,7 @@
  <string name="tab_title_voicemail">Voicemail</string>
  <!-- Tab text to show users their contacts  [CHAR LIMIT=10] -->
  <string name="tab_title_contacts">Contacts</string>

  <!-- Message displayed when there is no application available to handle voice search. [CHAR LIMIT=NONE] -->
  <string name="voice_search_not_available">Voice search not available</string>
</resources>
Loading