diff options
Diffstat (limited to 'java/com/android/dialer/shortcuts')
9 files changed, 98 insertions, 28 deletions
diff --git a/java/com/android/dialer/shortcuts/AndroidManifest.xml b/java/com/android/dialer/shortcuts/AndroidManifest.xml index 71320517d..15f77944e 100644 --- a/java/com/android/dialer/shortcuts/AndroidManifest.xml +++ b/java/com/android/dialer/shortcuts/AndroidManifest.xml @@ -20,7 +20,7 @@ android:minSdkVersion="23" android:targetSdkVersion="26"/> - <application> + <application android:theme="@style/Theme.AppCompat"> <service android:exported="false" diff --git a/java/com/android/dialer/shortcuts/CallContactActivity.java b/java/com/android/dialer/shortcuts/CallContactActivity.java index b80797984..87f6fcedc 100644 --- a/java/com/android/dialer/shortcuts/CallContactActivity.java +++ b/java/com/android/dialer/shortcuts/CallContactActivity.java @@ -70,6 +70,7 @@ public class CallContactActivity extends TransactionSafeActivity private void makeCall() { CallSpecificAppData callSpecificAppData = CallSpecificAppData.newBuilder() + .setAllowAssistedDialing(true) .setCallInitiationType(CallInitiationType.Type.LAUNCHER_SHORTCUT) .build(); PhoneNumberInteraction.startInteractionForPhoneCall( diff --git a/java/com/android/dialer/shortcuts/IconFactory.java b/java/com/android/dialer/shortcuts/IconFactory.java index a8c4ada4e..7aad1129a 100644 --- a/java/com/android/dialer/shortcuts/IconFactory.java +++ b/java/com/android/dialer/shortcuts/IconFactory.java @@ -20,16 +20,21 @@ import android.content.Context; import android.content.pm.ShortcutInfo; import android.graphics.Bitmap; import android.graphics.BitmapFactory; +import android.graphics.drawable.AdaptiveIconDrawable; import android.graphics.drawable.Drawable; import android.graphics.drawable.Icon; import android.net.Uri; +import android.os.Build.VERSION; +import android.os.Build.VERSION_CODES; import android.provider.ContactsContract; import android.support.annotation.NonNull; +import android.support.annotation.Nullable; +import android.support.annotation.RequiresApi; import android.support.annotation.WorkerThread; import android.support.v4.graphics.drawable.RoundedBitmapDrawable; import android.support.v4.graphics.drawable.RoundedBitmapDrawableFactory; -import com.android.contacts.common.lettertiles.LetterTileDrawable; import com.android.dialer.common.Assert; +import com.android.dialer.lettertile.LetterTileDrawable; import com.android.dialer.util.DrawableConverter; import java.io.InputStream; @@ -83,6 +88,38 @@ class IconFactory { ContactsContract.Contacts.openContactPhotoInputStream( context.getContentResolver(), lookupUri, false /* preferHighres */); + return VERSION.SDK_INT >= VERSION_CODES.O + ? createAdaptiveIcon(displayName, lookupKey, inputStream) + : createFlatIcon(displayName, lookupKey, inputStream); + } + + @RequiresApi(VERSION_CODES.O) + private Icon createAdaptiveIcon( + @NonNull String displayName, @NonNull String lookupKey, @Nullable InputStream inputStream) { + if (inputStream == null) { + LetterTileDrawable letterTileDrawable = new LetterTileDrawable(context.getResources()); + // The adaptive icons clip the drawable to a safe area inside the drawable. Scale the letter + // so it fits inside the safe area. + letterTileDrawable.setScale(1f / (1f + AdaptiveIconDrawable.getExtraInsetFraction())); + letterTileDrawable.setCanonicalDialerLetterTileDetails( + displayName, + lookupKey, + LetterTileDrawable.SHAPE_RECTANGLE, + LetterTileDrawable.TYPE_DEFAULT); + + int iconSize = + context + .getResources() + .getDimensionPixelSize(R.dimen.launcher_shortcut_adaptive_icon_size); + return Icon.createWithAdaptiveBitmap( + DrawableConverter.drawableToBitmap(letterTileDrawable, iconSize, iconSize)); + } + Bitmap bitmap = BitmapFactory.decodeStream(inputStream); + return Icon.createWithAdaptiveBitmap(bitmap); + } + + private Icon createFlatIcon( + @NonNull String displayName, @NonNull String lookupKey, @Nullable InputStream inputStream) { Drawable drawable; if (inputStream == null) { // No photo for contact; use a letter tile. diff --git a/java/com/android/dialer/shortcuts/ShortcutRefresher.java b/java/com/android/dialer/shortcuts/ShortcutRefresher.java index 120382dc5..496f3f02a 100644 --- a/java/com/android/dialer/shortcuts/ShortcutRefresher.java +++ b/java/com/android/dialer/shortcuts/ShortcutRefresher.java @@ -20,21 +20,17 @@ import android.content.Context; import android.os.Build; import android.support.annotation.MainThread; import android.support.annotation.NonNull; -import android.support.annotation.WorkerThread; import com.android.contacts.common.list.ContactEntry; import com.android.dialer.common.Assert; import com.android.dialer.common.LogUtil; -import com.android.dialer.common.concurrent.AsyncTaskExecutor; -import com.android.dialer.common.concurrent.AsyncTaskExecutors; -import com.android.dialer.common.concurrent.FallibleAsyncTask; +import com.android.dialer.common.concurrent.DialerExecutor.Worker; +import com.android.dialer.common.concurrent.DialerExecutors; import java.util.ArrayList; import java.util.List; /** Refreshes launcher shortcuts from UI components using provided list of contacts. */ public final class ShortcutRefresher { - private static final AsyncTaskExecutor EXECUTOR = AsyncTaskExecutors.createThreadPoolExecutor(); - /** Asynchronously updates launcher shortcuts using the provided list of contacts. */ @MainThread public static void refresh(@NonNull Context context, List<ContactEntry> contacts) { @@ -49,36 +45,27 @@ public final class ShortcutRefresher { return; } - //noinspection unchecked - EXECUTOR.submit(Task.ID, new Task(context), new ArrayList<>(contacts)); + DialerExecutors.createNonUiTaskBuilder(new RefreshWorker(context)) + .build() + .executeSerial(new ArrayList<>(contacts)); } - private static final class Task extends FallibleAsyncTask<List<ContactEntry>, Void, Void> { - private static final String ID = "ShortcutRefresher.Task"; - + private static final class RefreshWorker implements Worker<List<ContactEntry>, Void> { private final Context context; - Task(Context context) { + RefreshWorker(Context context) { this.context = context; } - /** - * @param params array containing exactly one element, the list of contacts from favorites - * tiles, ordered in tile order. - */ - @SafeVarargs @Override - @NonNull - @WorkerThread - protected final Void doInBackgroundFallible(List<ContactEntry>... params) { - Assert.isWorkerThread(); + public Void doInBackground(List<ContactEntry> contacts) { LogUtil.enterBlock("ShortcutRefresher.Task.doInBackground"); // Only dynamic shortcuts are maintained from UI components. Pinned shortcuts are maintained // by the job scheduler. This is because a pinned contact may not necessarily still be in the // favorites tiles, so refreshing it would require an additional database query. We don't want // to incur the cost of that extra database query every time the favorites tiles change. - new DynamicShortcuts(context, new IconFactory(context)).refresh(params[0]); // Blocking + new DynamicShortcuts(context, new IconFactory(context)).refresh(contacts); // Blocking return null; } diff --git a/java/com/android/dialer/shortcuts/Shortcuts.java b/java/com/android/dialer/shortcuts/Shortcuts.java index b6a7fa82a..c2bbb4dde 100644 --- a/java/com/android/dialer/shortcuts/Shortcuts.java +++ b/java/com/android/dialer/shortcuts/Shortcuts.java @@ -18,7 +18,7 @@ package com.android.dialer.shortcuts; import android.content.Context; import android.support.annotation.NonNull; -import com.android.dialer.common.ConfigProviderBindings; +import com.android.dialer.configprovider.ConfigProviderBindings; /** Checks if dynamic shortcuts should be enabled. */ public class Shortcuts { diff --git a/java/com/android/dialer/shortcuts/res/drawable-anydpi-v26/ic_shortcut_add_contact.xml b/java/com/android/dialer/shortcuts/res/drawable-anydpi-v26/ic_shortcut_add_contact.xml new file mode 100644 index 000000000..07ed17226 --- /dev/null +++ b/java/com/android/dialer/shortcuts/res/drawable-anydpi-v26/ic_shortcut_add_contact.xml @@ -0,0 +1,21 @@ +<?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 + --> +<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android"> + <background android:drawable="@color/shortcut_add_contact_background_color"/> + + <foreground android:drawable="@drawable/ic_add_contact_foreground"/> +</adaptive-icon> diff --git a/java/com/android/dialer/shortcuts/res/drawable/ic_add_contact_foreground.xml b/java/com/android/dialer/shortcuts/res/drawable/ic_add_contact_foreground.xml new file mode 100644 index 000000000..6bc172767 --- /dev/null +++ b/java/com/android/dialer/shortcuts/res/drawable/ic_add_contact_foreground.xml @@ -0,0 +1,23 @@ +<?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 + --> + +<bitmap xmlns:android="http://schemas.android.com/apk/res/android" + android:gravity="center" + android:src="@drawable/quantum_ic_person_add_white_24" + android:tint="@color/shortcut_add_contact_foreground_color"> + +</bitmap> diff --git a/java/com/android/dialer/shortcuts/res/values/dimens.xml b/java/com/android/dialer/shortcuts/res/values/dimens.xml index 232125653..369d38c15 100644 --- a/java/com/android/dialer/shortcuts/res/values/dimens.xml +++ b/java/com/android/dialer/shortcuts/res/values/dimens.xml @@ -16,4 +16,5 @@ --> <resources> <dimen name="launcher_shortcut_icon_size">48dp</dimen> + <dimen name="launcher_shortcut_adaptive_icon_size">108dp</dimen> </resources> diff --git a/java/com/android/dialer/shortcuts/res/values/strings.xml b/java/com/android/dialer/shortcuts/res/values/strings.xml index 5f14a8100..b3ff190d9 100644 --- a/java/com/android/dialer/shortcuts/res/values/strings.xml +++ b/java/com/android/dialer/shortcuts/res/values/strings.xml @@ -14,12 +14,12 @@ ~ See the License for the specific language governing permissions and ~ limitations under the License --> -<resources> +<resources xmlns:tools="http://schemas.android.com/tools"> <!-- Text to display in launcher shortcut for adding a new contact. Short version. [CHAR LIMIT=10] --> - <string name="dialer_shortcut_add_contact_short">New contact</string> + <string name="dialer_shortcut_add_contact_short" tools:ignore="UnusedResources">New contact</string> <!-- Text to display in launcher shortcut for adding a new contact. Long version. [CHAR LIMIT=25] --> - <string name="dialer_shortcut_add_contact_long">New contact</string> + <string name="dialer_shortcut_add_contact_long" tools:ignore="UnusedResources">New contact</string> <!-- Message to display when the user taps a pinned launcher shortcut (on a homescreen) which has been disabled. A shortcut may be disabled if the |