diff options
6 files changed, 76 insertions, 54 deletions
diff --git a/core/java/android/app/role/RoleManagerCallback.java b/core/java/android/app/role/RoleManagerCallback.java index d9f0a6c97f4d..a92ef327de3c 100644 --- a/core/java/android/app/role/RoleManagerCallback.java +++ b/core/java/android/app/role/RoleManagerCallback.java @@ -19,6 +19,8 @@ package android.app.role; import android.annotation.SystemApi; import android.annotation.TestApi; +import java.util.concurrent.CompletableFuture; + /** * Callback for a {@link RoleManager} request. * @@ -37,4 +39,18 @@ public interface RoleManagerCallback { * Signals a failure. */ void onFailure(); + + /** @hide */ + class Future extends CompletableFuture<Void> implements RoleManagerCallback { + + @Override + public void onSuccess() { + complete(null); + } + + @Override + public void onFailure() { + completeExceptionally(new RuntimeException()); + } + } } diff --git a/services/core/java/com/android/server/policy/role/LegacyRoleResolutionPolicy.java b/services/core/java/com/android/server/policy/role/LegacyRoleResolutionPolicy.java index 7f2dedb70514..bfe7725f3073 100644 --- a/services/core/java/com/android/server/policy/role/LegacyRoleResolutionPolicy.java +++ b/services/core/java/com/android/server/policy/role/LegacyRoleResolutionPolicy.java @@ -22,6 +22,8 @@ import android.content.ComponentName; import android.content.Context; import android.os.Debug; import android.provider.Settings; +import android.telecom.TelecomManager; +import android.text.TextUtils; import android.util.Log; import android.util.Slog; @@ -102,6 +104,15 @@ public class LegacyRoleResolutionPolicy implements RoleManagerService.RoleHolder ComponentName.unflattenFromString(legacyAssistant).getPackageName()); } } + case RoleManager.ROLE_DIALER: { + String setting = Settings.Secure.getStringForUser( + mContext.getContentResolver(), + Settings.Secure.DIALER_DEFAULT_APPLICATION, userId); + + return CollectionUtils.singletonOrEmpty(!TextUtils.isEmpty(setting) + ? setting + : mContext.getSystemService(TelecomManager.class).getSystemDialerPackage()); + } default: { Slog.e(LOG_TAG, "Don't know how to find legacy role holders for " + roleName); return Collections.emptyList(); diff --git a/services/core/java/com/android/server/role/RemoteRoleControllerService.java b/services/core/java/com/android/server/role/RemoteRoleControllerService.java index cc3064efae6a..be2544d42a65 100644 --- a/services/core/java/com/android/server/role/RemoteRoleControllerService.java +++ b/services/core/java/com/android/server/role/RemoteRoleControllerService.java @@ -32,12 +32,14 @@ import android.os.RemoteException; import android.os.UserHandle; import android.rolecontrollerservice.IRoleControllerService; import android.rolecontrollerservice.RoleControllerService; +import android.util.Log; import android.util.Slog; import com.android.internal.util.function.pooled.PooledLambda; import com.android.server.FgThread; import java.util.ArrayDeque; +import java.util.Arrays; import java.util.Queue; /** @@ -226,10 +228,21 @@ public class RemoteRoleControllerService { private boolean mCallbackNotified; + @Nullable + private final String mDebugName; + private Call(@NonNull CallExecutor callExecutor, @NonNull IRoleManagerCallback callback) { mCallExecutor = callExecutor; mCallback = callback; + mDebugName = DEBUG + ? Arrays.stream(Thread.currentThread().getStackTrace()) + .filter(s -> s.getClassName().equals( + RemoteRoleControllerService.class.getName())) + .findFirst() + .get() + .getMethodName() + : null; } @WorkerThread @@ -254,6 +267,10 @@ public class RemoteRoleControllerService { @WorkerThread private void notifyCallback(boolean success) { + if (DEBUG) { + Log.i(LOG_TAG, "notifyCallback(" + this + + ", success = " + success + ")"); + } if (mCallbackNotified) { return; } @@ -273,7 +290,7 @@ public class RemoteRoleControllerService { @Override public String toString() { - return "Call with callback: " + mCallback; + return DEBUG ? mDebugName : "Call with callback: " + mCallback; } @FunctionalInterface diff --git a/services/core/java/com/android/server/role/RoleManagerService.java b/services/core/java/com/android/server/role/RoleManagerService.java index 1c7596b80fd7..264d5ff08646 100644 --- a/services/core/java/com/android/server/role/RoleManagerService.java +++ b/services/core/java/com/android/server/role/RoleManagerService.java @@ -199,6 +199,7 @@ public class RoleManagerService extends SystemService implements RoleUserState.C // for a given role before adding a migration statement for it here migrateRoleIfNecessary(RoleManager.ROLE_SMS, userId); migrateRoleIfNecessary(RoleManager.ROLE_ASSISTANT, userId); + migrateRoleIfNecessary(RoleManager.ROLE_DIALER, userId); // Some vital packages state has changed since last role grant // Run grants again diff --git a/telecomm/java/android/telecom/DefaultDialerManager.java b/telecomm/java/android/telecom/DefaultDialerManager.java index 2680af76d803..b2fa5d43b7ea 100644 --- a/telecomm/java/android/telecom/DefaultDialerManager.java +++ b/telecomm/java/android/telecom/DefaultDialerManager.java @@ -15,17 +15,22 @@ package android.telecom; import android.app.ActivityManager; +import android.app.role.RoleManager; +import android.app.role.RoleManagerCallback; import android.content.Context; import android.content.Intent; import android.content.pm.ActivityInfo; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.net.Uri; +import android.os.AsyncTask; +import android.os.Binder; import android.os.Process; import android.os.UserHandle; -import android.provider.Settings; import android.text.TextUtils; +import com.android.internal.util.CollectionUtils; + import java.util.ArrayList; import java.util.List; @@ -64,25 +69,24 @@ public class DefaultDialerManager { * */ public static boolean setDefaultDialerApplication(Context context, String packageName, int user) { - // Get old package name - String oldPackageName = Settings.Secure.getStringForUser(context.getContentResolver(), - Settings.Secure.DIALER_DEFAULT_APPLICATION, user); - - if (packageName != null && oldPackageName != null && packageName.equals(oldPackageName)) { - // No change - return false; - } - - // Only make the change if the new package belongs to a valid phone application - List<String> packageNames = getInstalledDialerApplications(context, user); - - if (packageNames.contains(packageName)) { - // Update the secure setting. - Settings.Secure.putStringForUser(context.getContentResolver(), - Settings.Secure.DIALER_DEFAULT_APPLICATION, packageName, user); + long identity = Binder.clearCallingIdentity(); + try { + context.getSystemService(RoleManager.class).addRoleHolderAsUser( + RoleManager.ROLE_DIALER, packageName, UserHandle.of(user), + AsyncTask.THREAD_POOL_EXECUTOR, new RoleManagerCallback() { + @Override + public void onSuccess() {} + + @Override + public void onFailure() { + Log.w(TAG, "Failed to set default dialer to %s for user %s", + packageName, user); + } + }); return true; + } finally { + Binder.restoreCallingIdentity(identity); } - return false; } /** @@ -116,28 +120,12 @@ public class DefaultDialerManager { * @hide * */ public static String getDefaultDialerApplication(Context context, int user) { - String defaultPackageName = Settings.Secure.getStringForUser(context.getContentResolver(), - Settings.Secure.DIALER_DEFAULT_APPLICATION, user); - - final List<String> packageNames = getInstalledDialerApplications(context, user); - - // Verify that the default dialer has not been disabled or uninstalled. - if (packageNames.contains(defaultPackageName)) { - return defaultPackageName; - } - - // No user-set dialer found, fallback to system dialer - String systemDialerPackageName = getTelecomManager(context).getSystemDialerPackage(); - - if (TextUtils.isEmpty(systemDialerPackageName)) { - // No system dialer configured at build time - return null; - } - - if (packageNames.contains(systemDialerPackageName)) { - return systemDialerPackageName; - } else { - return null; + long identity = Binder.clearCallingIdentity(); + try { + return CollectionUtils.firstOrNull(context.getSystemService(RoleManager.class) + .getRoleHoldersAsUser(RoleManager.ROLE_DIALER, UserHandle.of(user))); + } finally { + Binder.restoreCallingIdentity(identity); } } diff --git a/telephony/java/com/android/internal/telephony/SmsApplication.java b/telephony/java/com/android/internal/telephony/SmsApplication.java index a508b068065f..d3420eef518d 100644 --- a/telephony/java/com/android/internal/telephony/SmsApplication.java +++ b/telephony/java/com/android/internal/telephony/SmsApplication.java @@ -51,7 +51,6 @@ import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import java.util.Collection; import java.util.HashMap; import java.util.List; -import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; @@ -635,20 +634,10 @@ public final class SmsApplication { } // Update the setting. - CompletableFuture<Void> res = new CompletableFuture<>(); + RoleManagerCallback.Future res = new RoleManagerCallback.Future(); context.getSystemService(RoleManager.class).addRoleHolderAsUser( RoleManager.ROLE_SMS, applicationData.mPackageName, UserHandle.of(userId), - AsyncTask.THREAD_POOL_EXECUTOR, new RoleManagerCallback() { - @Override - public void onSuccess() { - res.complete(null); - } - - @Override - public void onFailure() { - res.completeExceptionally(new RuntimeException()); - } - }); + AsyncTask.THREAD_POOL_EXECUTOR, res); try { res.get(5, TimeUnit.SECONDS); } catch (InterruptedException | ExecutionException | TimeoutException e) { |