summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--java/com/android/dialer/app/DialtactsActivity.java12
-rw-r--r--java/com/android/dialer/app/calllog/CallLogAsync.java96
-rw-r--r--java/com/android/dialer/main/impl/MainActivity.java21
-rw-r--r--java/com/android/dialer/main/impl/MainSearchController.java36
-rw-r--r--java/com/android/dialer/main/impl/res/values/strings.xml3
-rw-r--r--java/com/android/dialer/voicemail/listui/NewVoicemailMediaPlayerView.java39
-rw-r--r--java/com/android/dialer/voicemail/listui/res/drawable-hdpi/ic_handle.pngbin0 -> 218 bytes
-rw-r--r--java/com/android/dialer/voicemail/listui/res/drawable-mdpi/ic_handle.pngbin0 -> 160 bytes
-rw-r--r--java/com/android/dialer/voicemail/listui/res/drawable-xhdpi/ic_handle.pngbin0 -> 285 bytes
-rw-r--r--java/com/android/dialer/voicemail/listui/res/drawable-xxhdpi/ic_handle.pngbin0 -> 311 bytes
-rw-r--r--java/com/android/dialer/voicemail/listui/res/drawable-xxxhdpi/ic_handle.pngbin0 -> 467 bytes
-rw-r--r--java/com/android/dialer/voicemail/listui/res/drawable/ic_voicemail_seek_handle_disabled.xml20
-rw-r--r--java/com/android/dialer/voicemail/listui/res/values/colors.xml19
13 files changed, 139 insertions, 107 deletions
diff --git a/java/com/android/dialer/app/DialtactsActivity.java b/java/com/android/dialer/app/DialtactsActivity.java
index 7592c6669..4b0384ea5 100644
--- a/java/com/android/dialer/app/DialtactsActivity.java
+++ b/java/com/android/dialer/app/DialtactsActivity.java
@@ -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. */
diff --git a/java/com/android/dialer/app/calllog/CallLogAsync.java b/java/com/android/dialer/app/calllog/CallLogAsync.java
deleted file mode 100644
index 26435f311..000000000
--- a/java/com/android/dialer/app/calllog/CallLogAsync.java
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- * 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);
- }
- }
-}
diff --git a/java/com/android/dialer/main/impl/MainActivity.java b/java/com/android/dialer/main/impl/MainActivity.java
index 168589f13..3edf6c6af 100644
--- a/java/com/android/dialer/main/impl/MainActivity.java
+++ b/java/com/android/dialer/main/impl/MainActivity.java
@@ -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;
@@ -117,6 +120,16 @@ public final class MainActivity extends AppCompatActivity
}
@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
QuickContact.showQuickContact(
@@ -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
diff --git a/java/com/android/dialer/main/impl/MainSearchController.java b/java/com/android/dialer/main/impl/MainSearchController.java
index 041e32ed7..b01f80de6 100644
--- a/java/com/android/dialer/main/impl/MainSearchController.java
+++ b/java/com/android/dialer/main/impl/MainSearchController.java
@@ -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() {}
diff --git a/java/com/android/dialer/main/impl/res/values/strings.xml b/java/com/android/dialer/main/impl/res/values/strings.xml
index f530fa2bf..0fc1246d6 100644
--- a/java/com/android/dialer/main/impl/res/values/strings.xml
+++ b/java/com/android/dialer/main/impl/res/values/strings.xml
@@ -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>
diff --git a/java/com/android/dialer/voicemail/listui/NewVoicemailMediaPlayerView.java b/java/com/android/dialer/voicemail/listui/NewVoicemailMediaPlayerView.java
index 3becd271f..dd59712a4 100644
--- a/java/com/android/dialer/voicemail/listui/NewVoicemailMediaPlayerView.java
+++ b/java/com/android/dialer/voicemail/listui/NewVoicemailMediaPlayerView.java
@@ -20,6 +20,7 @@ import android.app.FragmentManager;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
+import android.graphics.drawable.Drawable;
import android.media.AudioManager;
import android.net.Uri;
import android.provider.VoicemailContract;
@@ -61,6 +62,8 @@ public final class NewVoicemailMediaPlayerView extends LinearLayout {
private ImageButton deleteButton;
private TextView currentSeekBarPosition;
private SeekBar seekBarView;
+ private Drawable voicemailSeekHandleDisabled;
+
private TextView totalDurationView;
private TextView voicemailLoadingStatusView;
private Uri voicemailUri;
@@ -96,6 +99,11 @@ public final class NewVoicemailMediaPlayerView extends LinearLayout {
deleteButton = findViewById(R.id.deleteButton);
totalDurationView = findViewById(R.id.playback_seek_total_duration);
voicemailLoadingStatusView = findViewById(R.id.playback_state_text);
+
+ voicemailSeekHandleDisabled =
+ getContext()
+ .getResources()
+ .getDrawable(R.drawable.ic_voicemail_seek_handle_disabled, getContext().getTheme());
}
private void setupListenersForMediaPlayerButtons() {
@@ -142,7 +150,9 @@ public final class NewVoicemailMediaPlayerView extends LinearLayout {
Assert.isNotNull(voicemailEntryFromAdapter);
Uri uri = Uri.parse(voicemailEntryFromAdapter.voicemailUri());
+
numberVoicemailFrom = voicemailEntryFromAdapter.number().getRawInput().getNumber();
+
Assert.isNotNull(viewHolder);
Assert.isNotNull(uri);
Assert.isNotNull(listener);
@@ -167,6 +177,12 @@ public final class NewVoicemailMediaPlayerView extends LinearLayout {
initializeMediaPlayerButtonsAndViews();
setupListenersForMediaPlayerButtons();
+ // TODO(uabdullah): Handle seekbar seeking properly (a bug)
+ seekBarView.setEnabled(false);
+ seekBarView.setThumb(voicemailSeekHandleDisabled);
+
+ updatePhoneIcon(numberVoicemailFrom);
+
// During the binding we only send a request to the adapter to tell us what the
// state of the media player should be and call that function.
// This could be the paused state, or the playing state of the resume state.
@@ -219,6 +235,23 @@ public final class NewVoicemailMediaPlayerView extends LinearLayout {
}
}
+ /**
+ * Updates the phone icon depending if we can dial it or not.
+ *
+ * <p>Note: This must be called after the onClickListeners have been set, otherwise isClickable()
+ * state is not maintained.
+ */
+ private void updatePhoneIcon(@Nullable String numberVoicemailFrom) {
+ // TODO(uabdullah): Handle restricted/blocked numbers (a bug)
+ if (TextUtils.isEmpty(numberVoicemailFrom)) {
+ phoneButton.setEnabled(false);
+ phoneButton.setClickable(false);
+ } else {
+ phoneButton.setEnabled(true);
+ phoneButton.setClickable(true);
+ }
+ }
+
private final OnSeekBarChangeListener seekbarChangeListener =
new OnSeekBarChangeListener() {
@Override
@@ -466,11 +499,11 @@ public final class NewVoicemailMediaPlayerView extends LinearLayout {
audioManager.setMode(AudioManager.STREAM_MUSIC);
if (audioManager.isSpeakerphoneOn()) {
LogUtil.i(
- "NewVoicemailMediaPlayer.phoneButtonListener", "speaker was on, turning it off");
+ "NewVoicemailMediaPlayer.speakerButtonListener", "speaker was on, turning it off");
audioManager.setSpeakerphoneOn(false);
} else {
LogUtil.i(
- "NewVoicemailMediaPlayer.phoneButtonListener", "speaker was off, turning it on");
+ "NewVoicemailMediaPlayer.speakerButtonListener", "speaker was off, turning it on");
audioManager.setSpeakerphoneOn(true);
}
// TODO(uabdullah): Handle colors of speaker icon when speaker is on and off.
@@ -478,8 +511,6 @@ public final class NewVoicemailMediaPlayerView extends LinearLayout {
};
// TODO(uabdullah): Add phone account handle (a bug)
- // TODO(uabdullah): If the call cannot be made then the phone icon should be greyed out
- // (a bug)
private final View.OnClickListener phoneButtonListener =
new View.OnClickListener() {
@Override
diff --git a/java/com/android/dialer/voicemail/listui/res/drawable-hdpi/ic_handle.png b/java/com/android/dialer/voicemail/listui/res/drawable-hdpi/ic_handle.png
new file mode 100644
index 000000000..315a0dd40
--- /dev/null
+++ b/java/com/android/dialer/voicemail/listui/res/drawable-hdpi/ic_handle.png
Binary files differ
diff --git a/java/com/android/dialer/voicemail/listui/res/drawable-mdpi/ic_handle.png b/java/com/android/dialer/voicemail/listui/res/drawable-mdpi/ic_handle.png
new file mode 100644
index 000000000..8bcec11e0
--- /dev/null
+++ b/java/com/android/dialer/voicemail/listui/res/drawable-mdpi/ic_handle.png
Binary files differ
diff --git a/java/com/android/dialer/voicemail/listui/res/drawable-xhdpi/ic_handle.png b/java/com/android/dialer/voicemail/listui/res/drawable-xhdpi/ic_handle.png
new file mode 100644
index 000000000..36f3466a6
--- /dev/null
+++ b/java/com/android/dialer/voicemail/listui/res/drawable-xhdpi/ic_handle.png
Binary files differ
diff --git a/java/com/android/dialer/voicemail/listui/res/drawable-xxhdpi/ic_handle.png b/java/com/android/dialer/voicemail/listui/res/drawable-xxhdpi/ic_handle.png
new file mode 100644
index 000000000..9a1651cee
--- /dev/null
+++ b/java/com/android/dialer/voicemail/listui/res/drawable-xxhdpi/ic_handle.png
Binary files differ
diff --git a/java/com/android/dialer/voicemail/listui/res/drawable-xxxhdpi/ic_handle.png b/java/com/android/dialer/voicemail/listui/res/drawable-xxxhdpi/ic_handle.png
new file mode 100644
index 000000000..c6dbf3875
--- /dev/null
+++ b/java/com/android/dialer/voicemail/listui/res/drawable-xxxhdpi/ic_handle.png
Binary files differ
diff --git a/java/com/android/dialer/voicemail/listui/res/drawable/ic_voicemail_seek_handle_disabled.xml b/java/com/android/dialer/voicemail/listui/res/drawable/ic_voicemail_seek_handle_disabled.xml
new file mode 100644
index 000000000..5e974c45a
--- /dev/null
+++ b/java/com/android/dialer/voicemail/listui/res/drawable/ic_voicemail_seek_handle_disabled.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2015 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
+ -->
+<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
+ android:src="@drawable/ic_handle"
+ android:tint="@color/voicemail_icon_disabled_tint">
+</bitmap> \ No newline at end of file
diff --git a/java/com/android/dialer/voicemail/listui/res/values/colors.xml b/java/com/android/dialer/voicemail/listui/res/values/colors.xml
new file mode 100644
index 000000000..6ecf4c229
--- /dev/null
+++ b/java/com/android/dialer/voicemail/listui/res/values/colors.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2018 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
+ -->
+<resources>
+ <color name="voicemail_icon_disabled_tint">#80000000</color>
+</resources> \ No newline at end of file