From 1fb1c697a2b71ed629df76c4be129729f3cb6aea Mon Sep 17 00:00:00 2001 From: twyen Date: Tue, 21 Nov 2017 17:54:34 -0800 Subject: Fix showing CallingAccountSelector in lock screen android:showWhenLocked and FLAG_SHOW_WHEN_LOCKED is added to PreCallActivity so it can be launched in lockscreen. PreCallCoordinator now grabs new instances of PreCallActions onResume so the state can be flushed. If it is reused states like PendingAction might be used after it is discarded. Added null check before discarding fragment because it might not be created yet due to background query. Bug: 69570769 Test: CallingAccountSelectorTest PiperOrigin-RevId: 176587256 Change-Id: Iaa7145e860136e9177f568e2c84461ed5efa12a1 --- .../dialer/precall/impl/AndroidManifest.xml | 1 + .../precall/impl/CallingAccountSelector.java | 24 +++++++++++++--------- .../dialer/precall/impl/PreCallActivity.java | 2 ++ .../precall/impl/PreCallCoordinatorImpl.java | 2 +- 4 files changed, 18 insertions(+), 11 deletions(-) (limited to 'java/com/android/dialer/precall') diff --git a/java/com/android/dialer/precall/impl/AndroidManifest.xml b/java/com/android/dialer/precall/impl/AndroidManifest.xml index d3d0f538d..b960f6bad 100644 --- a/java/com/android/dialer/precall/impl/AndroidManifest.xml +++ b/java/com/android/dialer/precall/impl/AndroidManifest.xml @@ -23,6 +23,7 @@ android:name="com.android.dialer.precall.impl.PreCallActivity" android:excludeFromRecents="true" android:noHistory="true" + android:showWhenLocked="true" android:theme="@style/Theme.PreCall.DialogHolder"> diff --git a/java/com/android/dialer/precall/impl/CallingAccountSelector.java b/java/com/android/dialer/precall/impl/CallingAccountSelector.java index 144d94e20..4d2e6063a 100644 --- a/java/com/android/dialer/precall/impl/CallingAccountSelector.java +++ b/java/com/android/dialer/precall/impl/CallingAccountSelector.java @@ -119,12 +119,12 @@ public class CallingAccountSelector implements PreCallAction { PendingAction pendingAction = coordinator.startPendingAction(); DialerExecutorComponent.get(coordinator.getActivity()) .dialerExecutorFactory() - .createUiTaskBuilder( - activity.getFragmentManager(), - "PreferredAccountWorker", - new PreferredAccountWorker(phoneNumber)) + .createNonUiTaskBuilder(new PreferredAccountWorker(phoneNumber)) .onSuccess( (result -> { + if (isDiscarding) { + return; + } if (result.phoneAccountHandle.isPresent()) { coordinator.getBuilder().setPhoneAccountHandle(result.phoneAccountHandle.get()); pendingAction.finish(); @@ -213,7 +213,9 @@ public class CallingAccountSelector implements PreCallAction { @Override public void onDiscard() { isDiscarding = true; - selectPhoneAccountDialogFragment.dismiss(); + if (selectPhoneAccountDialogFragment != null) { + selectPhoneAccountDialogFragment.dismiss(); + } } private static class PreferredAccountWorkerResult { @@ -353,11 +355,13 @@ public class CallingAccountSelector implements PreCallAction { new WritePreferredAccountWorkerInput( coordinator.getActivity(), dataId, selectedAccountHandle)); } - DialerExecutorComponent.get(coordinator.getActivity()) - .dialerExecutorFactory() - .createNonUiTaskBuilder(new UserSelectionReporter(selectedAccountHandle, number)) - .build() - .executeParallel(coordinator.getActivity()); + if (number != null) { + DialerExecutorComponent.get(coordinator.getActivity()) + .dialerExecutorFactory() + .createNonUiTaskBuilder(new UserSelectionReporter(selectedAccountHandle, number)) + .build() + .executeParallel(coordinator.getActivity()); + } listener.finish(); } diff --git a/java/com/android/dialer/precall/impl/PreCallActivity.java b/java/com/android/dialer/precall/impl/PreCallActivity.java index 938d31d5f..eadba2b11 100644 --- a/java/com/android/dialer/precall/impl/PreCallActivity.java +++ b/java/com/android/dialer/precall/impl/PreCallActivity.java @@ -19,6 +19,7 @@ package com.android.dialer.precall.impl; import android.app.Activity; import android.os.Bundle; import android.support.annotation.Nullable; +import android.view.WindowManager.LayoutParams; /** A transparent activity to host dialogs for {@link PreCallCoordinatorImpl} */ public class PreCallActivity extends Activity { @@ -30,6 +31,7 @@ public class PreCallActivity extends Activity { super.onCreate(savedInstanceState); preCallCoordinator = new PreCallCoordinatorImpl(this); preCallCoordinator.onCreate(getIntent(), savedInstanceState); + getWindow().addFlags(LayoutParams.FLAG_SHOW_WHEN_LOCKED); } @Override diff --git a/java/com/android/dialer/precall/impl/PreCallCoordinatorImpl.java b/java/com/android/dialer/precall/impl/PreCallCoordinatorImpl.java index de32cc2ae..94ba90d75 100644 --- a/java/com/android/dialer/precall/impl/PreCallCoordinatorImpl.java +++ b/java/com/android/dialer/precall/impl/PreCallCoordinatorImpl.java @@ -59,7 +59,6 @@ public class PreCallCoordinatorImpl implements PreCallCoordinator { } else { builder = Assert.isNotNull(intent.getParcelableExtra(EXTRA_CALL_INTENT_BUILDER)); } - actions = PreCallComponent.get(activity).getPreCall().getActions(); } void onRestoreInstanceState(Bundle savedInstanceState) { @@ -68,6 +67,7 @@ public class PreCallCoordinatorImpl implements PreCallCoordinator { } void onResume() { + actions = PreCallComponent.get(activity).getPreCall().getActions(); runNextAction(); } -- cgit v1.2.3 From e30d7d2e533f830ee638b1a727e537880b18bf66 Mon Sep 17 00:00:00 2001 From: twyen Date: Wed, 22 Nov 2017 12:16:10 -0800 Subject: Check Contacts support for preferred SIM Preferred SIM can only be enabled when both dialer and the system contact app supports it. This CL checks if the app for ACTION_QUICK_CONTACT has the metadata supports_per_number_preferred_account. Also added a flag to disable the whole preferred SIM feature. Bug: 69638458 Test: CallingAccountSelectorTest PiperOrigin-RevId: 176687062 Change-Id: Id00debe2393068a422907a9eff2ac4ef0fcf6f8e --- .../precall/impl/CallingAccountSelector.java | 48 ++++++++++++++++++++++ 1 file changed, 48 insertions(+) (limited to 'java/com/android/dialer/precall') diff --git a/java/com/android/dialer/precall/impl/CallingAccountSelector.java b/java/com/android/dialer/precall/impl/CallingAccountSelector.java index 4d2e6063a..8d3df2360 100644 --- a/java/com/android/dialer/precall/impl/CallingAccountSelector.java +++ b/java/com/android/dialer/precall/impl/CallingAccountSelector.java @@ -20,11 +20,16 @@ import android.app.Activity; import android.content.ContentResolver; import android.content.ContentValues; import android.content.Context; +import android.content.Intent; +import android.content.pm.PackageManager; +import android.content.pm.ResolveInfo; import android.database.Cursor; import android.net.Uri; import android.os.Build.VERSION; import android.os.Build.VERSION_CODES; +import android.provider.ContactsContract.Contacts; import android.provider.ContactsContract.PhoneLookup; +import android.provider.ContactsContract.QuickContact; import android.support.annotation.MainThread; import android.support.annotation.NonNull; import android.support.annotation.Nullable; @@ -60,6 +65,9 @@ public class CallingAccountSelector implements PreCallAction { @VisibleForTesting static final String TAG_CALLING_ACCOUNT_SELECTOR = "CallingAccountSelector"; + @VisibleForTesting + static final String METADATA_SUPPORTS_PREFERRED_SIM = "supports_per_number_preferred_account"; + private SelectPhoneAccountDialogFragment selectPhoneAccountDialogFragment; private boolean isDiscarding; @@ -246,6 +254,9 @@ public class CallingAccountSelector implements PreCallAction { @WorkerThread public PreferredAccountWorkerResult doInBackground(Context context) throws Throwable { PreferredAccountWorkerResult result = new PreferredAccountWorkerResult(); + if (!isPreferredSimEnabled(context)) { + return result; + } result.dataId = getDataId(context.getContentResolver(), phoneNumber); if (result.dataId.isPresent()) { result.phoneAccountHandle = getPreferredAccount(context, result.dataId.get()); @@ -435,4 +446,41 @@ public class CallingAccountSelector implements PreCallAction { return null; } } + + @WorkerThread + private static boolean isPreferredSimEnabled(Context context) { + Assert.isWorkerThread(); + if (!ConfigProviderBindings.get(context).getBoolean("preferred_sim_enabled", true)) { + return false; + } + + Intent quickContactIntent = getQuickContactIntent(); + ResolveInfo resolveInfo = + context + .getPackageManager() + .resolveActivity(quickContactIntent, PackageManager.GET_META_DATA); + if (resolveInfo == null + || resolveInfo.activityInfo == null + || resolveInfo.activityInfo.applicationInfo == null + || resolveInfo.activityInfo.applicationInfo.metaData == null) { + LogUtil.e("CallingAccountSelector.isPreferredSimEnabled", "cannot resolve quick contact app"); + return false; + } + if (!resolveInfo.activityInfo.applicationInfo.metaData.getBoolean( + METADATA_SUPPORTS_PREFERRED_SIM, false)) { + LogUtil.i( + "CallingAccountSelector.isPreferredSimEnabled", + "system contacts does not support preferred SIM"); + return false; + } + return true; + } + + @VisibleForTesting + static Intent getQuickContactIntent() { + Intent intent = new Intent(QuickContact.ACTION_QUICK_CONTACT); + intent.addCategory(Intent.CATEGORY_DEFAULT); + intent.setData(Contacts.CONTENT_URI.buildUpon().appendPath("1").build()); + return intent; + } } -- cgit v1.2.3 From 572a77ed339b5a511f9dc20680939dbb7bf5e085 Mon Sep 17 00:00:00 2001 From: twyen Date: Wed, 22 Nov 2017 15:05:45 -0800 Subject: Automated rollback of changelist 176587256 Bug: 69570769 Test: CallingAccountSelectorTest PiperOrigin-RevId: 176706378 Change-Id: I50da0d2dd40a83ae6c1189fed2693368369849d3 --- .../dialer/precall/impl/AndroidManifest.xml | 1 - .../precall/impl/CallingAccountSelector.java | 24 +++++++++------------- .../dialer/precall/impl/PreCallActivity.java | 2 -- .../precall/impl/PreCallCoordinatorImpl.java | 2 +- 4 files changed, 11 insertions(+), 18 deletions(-) (limited to 'java/com/android/dialer/precall') diff --git a/java/com/android/dialer/precall/impl/AndroidManifest.xml b/java/com/android/dialer/precall/impl/AndroidManifest.xml index b960f6bad..d3d0f538d 100644 --- a/java/com/android/dialer/precall/impl/AndroidManifest.xml +++ b/java/com/android/dialer/precall/impl/AndroidManifest.xml @@ -23,7 +23,6 @@ android:name="com.android.dialer.precall.impl.PreCallActivity" android:excludeFromRecents="true" android:noHistory="true" - android:showWhenLocked="true" android:theme="@style/Theme.PreCall.DialogHolder"> diff --git a/java/com/android/dialer/precall/impl/CallingAccountSelector.java b/java/com/android/dialer/precall/impl/CallingAccountSelector.java index 8d3df2360..4308df73a 100644 --- a/java/com/android/dialer/precall/impl/CallingAccountSelector.java +++ b/java/com/android/dialer/precall/impl/CallingAccountSelector.java @@ -127,12 +127,12 @@ public class CallingAccountSelector implements PreCallAction { PendingAction pendingAction = coordinator.startPendingAction(); DialerExecutorComponent.get(coordinator.getActivity()) .dialerExecutorFactory() - .createNonUiTaskBuilder(new PreferredAccountWorker(phoneNumber)) + .createUiTaskBuilder( + activity.getFragmentManager(), + "PreferredAccountWorker", + new PreferredAccountWorker(phoneNumber)) .onSuccess( (result -> { - if (isDiscarding) { - return; - } if (result.phoneAccountHandle.isPresent()) { coordinator.getBuilder().setPhoneAccountHandle(result.phoneAccountHandle.get()); pendingAction.finish(); @@ -221,9 +221,7 @@ public class CallingAccountSelector implements PreCallAction { @Override public void onDiscard() { isDiscarding = true; - if (selectPhoneAccountDialogFragment != null) { - selectPhoneAccountDialogFragment.dismiss(); - } + selectPhoneAccountDialogFragment.dismiss(); } private static class PreferredAccountWorkerResult { @@ -366,13 +364,11 @@ public class CallingAccountSelector implements PreCallAction { new WritePreferredAccountWorkerInput( coordinator.getActivity(), dataId, selectedAccountHandle)); } - if (number != null) { - DialerExecutorComponent.get(coordinator.getActivity()) - .dialerExecutorFactory() - .createNonUiTaskBuilder(new UserSelectionReporter(selectedAccountHandle, number)) - .build() - .executeParallel(coordinator.getActivity()); - } + DialerExecutorComponent.get(coordinator.getActivity()) + .dialerExecutorFactory() + .createNonUiTaskBuilder(new UserSelectionReporter(selectedAccountHandle, number)) + .build() + .executeParallel(coordinator.getActivity()); listener.finish(); } diff --git a/java/com/android/dialer/precall/impl/PreCallActivity.java b/java/com/android/dialer/precall/impl/PreCallActivity.java index eadba2b11..938d31d5f 100644 --- a/java/com/android/dialer/precall/impl/PreCallActivity.java +++ b/java/com/android/dialer/precall/impl/PreCallActivity.java @@ -19,7 +19,6 @@ package com.android.dialer.precall.impl; import android.app.Activity; import android.os.Bundle; import android.support.annotation.Nullable; -import android.view.WindowManager.LayoutParams; /** A transparent activity to host dialogs for {@link PreCallCoordinatorImpl} */ public class PreCallActivity extends Activity { @@ -31,7 +30,6 @@ public class PreCallActivity extends Activity { super.onCreate(savedInstanceState); preCallCoordinator = new PreCallCoordinatorImpl(this); preCallCoordinator.onCreate(getIntent(), savedInstanceState); - getWindow().addFlags(LayoutParams.FLAG_SHOW_WHEN_LOCKED); } @Override diff --git a/java/com/android/dialer/precall/impl/PreCallCoordinatorImpl.java b/java/com/android/dialer/precall/impl/PreCallCoordinatorImpl.java index 94ba90d75..de32cc2ae 100644 --- a/java/com/android/dialer/precall/impl/PreCallCoordinatorImpl.java +++ b/java/com/android/dialer/precall/impl/PreCallCoordinatorImpl.java @@ -59,6 +59,7 @@ public class PreCallCoordinatorImpl implements PreCallCoordinator { } else { builder = Assert.isNotNull(intent.getParcelableExtra(EXTRA_CALL_INTENT_BUILDER)); } + actions = PreCallComponent.get(activity).getPreCall().getActions(); } void onRestoreInstanceState(Bundle savedInstanceState) { @@ -67,7 +68,6 @@ public class PreCallCoordinatorImpl implements PreCallCoordinator { } void onResume() { - actions = PreCallComponent.get(activity).getPreCall().getActions(); runNextAction(); } -- cgit v1.2.3