From 79840ecb4e4bfd5093746be41498cfcdc9254509 Mon Sep 17 00:00:00 2001 From: cretin45 Date: Tue, 17 Feb 2015 17:09:32 -0800 Subject: [PATCH] SetupWizard: Fix scenario where GMS setup disables its components Change-Id: Ia8edd39645f83625ff06fb61903b672b774257d6 --- .../setupwizard/setup/GmsAccountPage.java | 5 +- .../setupwizard/ui/SetupWizardActivity.java | 12 ++- .../setupwizard/util/SetupWizardUtils.java | 86 +++++++++++++++---- .../account/tests/ManualTestActivity.java | 68 +++++++++++---- 4 files changed, 131 insertions(+), 40 deletions(-) diff --git a/src/com/cyanogenmod/setupwizard/setup/GmsAccountPage.java b/src/com/cyanogenmod/setupwizard/setup/GmsAccountPage.java index 2c4203f..11f9e7c 100644 --- a/src/com/cyanogenmod/setupwizard/setup/GmsAccountPage.java +++ b/src/com/cyanogenmod/setupwizard/setup/GmsAccountPage.java @@ -125,6 +125,7 @@ public class GmsAccountPage extends SetupPage { } } else if (requestCode == SetupWizardApp.REQUEST_CODE_RESTORE_GMS) { handleResult(resultCode); + setHidden(true); } return true; } @@ -150,6 +151,8 @@ public class GmsAccountPage extends SetupPage { private static void launchGmsRestorePage(final Activity activity) { try { + // GMS can disable this after logging in sometimes + SetupWizardUtils.enableGMSSetupWizard(activity); Intent intent = new Intent(ACTION_RESTORE); intent.putExtra(SetupWizardApp.EXTRA_ALLOW_SKIP, true); intent.putExtra(SetupWizardApp.EXTRA_USE_IMMERSIVE, true); @@ -169,7 +172,7 @@ public class GmsAccountPage extends SetupPage { e.printStackTrace(); // XXX: In open source, we don't know what gms version a user has. // Bail if the restore activity is not found. - ((SetupWizardActivity)activity).onNextPage(); + ((SetupWizardActivity) activity).onNextPage(); } } diff --git a/src/com/cyanogenmod/setupwizard/ui/SetupWizardActivity.java b/src/com/cyanogenmod/setupwizard/ui/SetupWizardActivity.java index 98be972..bded6ff 100644 --- a/src/com/cyanogenmod/setupwizard/ui/SetupWizardActivity.java +++ b/src/com/cyanogenmod/setupwizard/ui/SetupWizardActivity.java @@ -18,7 +18,6 @@ package com.cyanogenmod.setupwizard.ui; import android.animation.Animator; import android.app.Activity; -import android.app.AppGlobals; import android.app.WallpaperManager; import android.content.Intent; import android.content.res.Resources; @@ -305,18 +304,23 @@ public class SetupWizardActivity extends Activity implements SetupDataCallbacks } private void finishSetup() { + SetupWizardApp setupWizardApp = (SetupWizardApp)getApplication(); if (!mIsGuestUser) { - getApplication().sendBroadcastAsUser(new Intent(SetupWizardApp.ACTION_FINISHED), + setupWizardApp.sendBroadcastAsUser(new Intent(SetupWizardApp.ACTION_FINISHED), UserHandle.getCallingUserHandle()); } mSetupData.finishPages(); Settings.Global.putInt(getContentResolver(), Settings.Global.DEVICE_PROVISIONED, 1); Settings.Secure.putInt(getContentResolver(), Settings.Secure.USER_SETUP_COMPLETE, 1); - ((SetupWizardApp)AppGlobals.getInitialApplication()).enableStatusBar(); + setupWizardApp.enableStatusBar(); finish(); if (mEnableAccessibilityController != null) { mEnableAccessibilityController.onDestroy(); } - SetupWizardUtils.disableSetupWizards(this); + SetupWizardUtils.disableGMSSetupWizard(this); + SetupWizardUtils.disableSetupWizard(this); + Intent intent = new Intent(Intent.ACTION_MAIN); + intent.addCategory(Intent.CATEGORY_HOME); + startActivity(intent); } } diff --git a/src/com/cyanogenmod/setupwizard/util/SetupWizardUtils.java b/src/com/cyanogenmod/setupwizard/util/SetupWizardUtils.java index 3803b93..b986f84 100644 --- a/src/com/cyanogenmod/setupwizard/util/SetupWizardUtils.java +++ b/src/com/cyanogenmod/setupwizard/util/SetupWizardUtils.java @@ -22,8 +22,9 @@ import android.app.ActivityOptions; import android.content.ComponentName; import android.content.Context; import android.content.Intent; +import android.content.pm.ComponentInfo; +import android.content.pm.PackageInfo; import android.content.pm.PackageManager; -import android.content.pm.ResolveInfo; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.net.wifi.WifiManager; @@ -31,14 +32,13 @@ import android.os.UserHandle; import android.os.UserManager; import android.telephony.SubscriptionManager; import android.telephony.TelephonyManager; +import android.util.Log; import com.cyanogenmod.setupwizard.SetupWizardApp; import com.google.android.gms.common.ConnectionResult; import com.google.android.gms.common.GooglePlayServicesUtil; -import java.util.List; - public class SetupWizardUtils { private static final String TAG = SetupWizardUtils.class.getSimpleName(); @@ -160,24 +160,72 @@ public class SetupWizardUtils { return AccountManager.get(context).getAccountsByType(accountType).length > 0; } - public static void disableSetupWizards(Activity context) { - Intent intent = new Intent(Intent.ACTION_MAIN); - intent.addCategory(Intent.CATEGORY_HOME); - final PackageManager pm = context.getPackageManager(); - final List resolveInfos = - pm.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY); - for (ResolveInfo info : resolveInfos) { - if (GOOGLE_SETUPWIZARD_PACKAGE.equals(info.activityInfo.packageName)) { - final ComponentName componentName = - new ComponentName(info.activityInfo.packageName, info.activityInfo.name); - pm.setComponentEnabledSetting(componentName, - PackageManager.COMPONENT_ENABLED_STATE_DISABLED, - 0); + public static void disableSetupWizard(Activity context) { + disableComponent(context, context.getPackageName(), + "com.cyanogenmod.setupwizard.ui.SetupWizardActivity"); + } + + public static void disableGMSSetupWizard(Activity context) { + try { + PackageInfo packageInfo = context.getPackageManager() + .getPackageInfo(GOOGLE_SETUPWIZARD_PACKAGE, + PackageManager.GET_ACTIVITIES | + PackageManager.GET_RECEIVERS | PackageManager.GET_SERVICES); + disableComponentArray(context, packageInfo.activities); + disableComponentArray(context, packageInfo.services); + disableComponentArray(context, packageInfo.receivers); + } catch (PackageManager.NameNotFoundException e) { + Log.e(TAG, "Enable to disable GMS"); + } + } + + public static void enableGMSSetupWizard(Activity context) { + try { + PackageInfo packageInfo = context.getPackageManager() + .getPackageInfo(GOOGLE_SETUPWIZARD_PACKAGE, + PackageManager.GET_ACTIVITIES | + PackageManager.GET_RECEIVERS | PackageManager.GET_SERVICES); + enableComponentArray(context, packageInfo.activities); + enableComponentArray(context, packageInfo.services); + enableComponentArray(context, packageInfo.receivers); + } catch (PackageManager.NameNotFoundException e) { + Log.e(TAG, "Unable to disable GMS"); + } + } + + private static void disableComponentArray(Activity context, ComponentInfo[] components) { + if(components != null) { + ComponentInfo[] componentInfos = components; + for(int i = 0; i < componentInfos.length; i++) { + disableComponent(context, componentInfos[i].packageName, componentInfos[i].name); } } - pm.setComponentEnabledSetting(context.getComponentName(), + } + + private static void disableComponent(Activity context, String packageName, String name) { + disableComponent(context, new ComponentName(packageName, name)); + } + + private static void disableComponent(Activity context, ComponentName component) { + context.getPackageManager().setComponentEnabledSetting(component, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, 0); - intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK); - context.startActivity(intent); + } + + private static void enableComponentArray(Activity context, ComponentInfo[] components) { + if(components != null) { + ComponentInfo[] componentInfos = components; + for(int i = 0; i < componentInfos.length; i++) { + enableComponent(context, componentInfos[i].packageName, componentInfos[i].name); + } + } + } + + private static void enableComponent(Activity context, String packageName, String name) { + enableComponent(context, new ComponentName(packageName, name)); + } + + private static void enableComponent(Activity context, ComponentName component) { + context.getPackageManager().setComponentEnabledSetting(component, + PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP); } } diff --git a/tests/src/com/cyanogenmod/account/tests/ManualTestActivity.java b/tests/src/com/cyanogenmod/account/tests/ManualTestActivity.java index 6b489a7..dfa493a 100644 --- a/tests/src/com/cyanogenmod/account/tests/ManualTestActivity.java +++ b/tests/src/com/cyanogenmod/account/tests/ManualTestActivity.java @@ -19,7 +19,10 @@ package com.cyanogenmod.setupwizard.tests; import android.app.Activity; import android.content.ComponentName; +import android.content.Context; import android.content.Intent; +import android.content.pm.ComponentInfo; +import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.os.Bundle; import android.provider.Settings; @@ -58,13 +61,19 @@ public class ManualTestActivity extends Activity { Intent intent = new Intent("android.intent.action.MAIN"); intent.addCategory("android.intent.category.HOME"); final PackageManager pm = getPackageManager(); - ComponentName componentName = new ComponentName("com.cyanogenmod.setupwizard", "com.cyanogenmod.setupwizard.ui.SetupWizardActivity"); - pm.setComponentEnabledSetting(componentName, PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP); + ComponentName componentName = new ComponentName("com.cyanogenmod.setupwizard", + "com.cyanogenmod.setupwizard.ui.SetupWizardActivity"); + pm.setComponentEnabledSetting(componentName, PackageManager.COMPONENT_ENABLED_STATE_ENABLED, + PackageManager.DONT_KILL_APP); + pm.clearApplicationUserData("com.cyanogenmod.setupwizard", null); try { - componentName = new ComponentName("com.google.android.setupwizard", "com.google.android.setupwizard.SetupWizardActivity"); - pm.setComponentEnabledSetting(componentName, PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP); - componentName = new ComponentName("com.google.android.setupwizard", "com.google.android.setupwizard.WizardManager"); - pm.setComponentEnabledSetting(componentName, PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP); + PackageInfo packageInfo = getPackageManager() + .getPackageInfo("com.google.android.setupwizard", + PackageManager.GET_ACTIVITIES | + PackageManager.GET_RECEIVERS | PackageManager.GET_SERVICES); + enableComponentArray(packageInfo.activities); + enableComponentArray(packageInfo.services); + enableComponentArray(packageInfo.receivers); pm.clearApplicationUserData("com.google.android.setupwizard", null); } catch (Exception e) { Toast.makeText(this, "GMS not installed", Toast.LENGTH_SHORT).show(); @@ -82,10 +91,13 @@ public class ManualTestActivity extends Activity { Intent intent = new Intent("android.intent.action.MAIN"); intent.addCategory("android.intent.category.HOME"); final PackageManager pm = getPackageManager(); - ComponentName componentName = new ComponentName("com.google.android.setupwizard", "com.google.android.setupwizard.SetupWizardActivity"); - pm.setComponentEnabledSetting(componentName, PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP); - componentName = new ComponentName("com.google.android.setupwizard", "com.google.android.setupwizard.WizardManager"); - pm.setComponentEnabledSetting(componentName, PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP); + PackageInfo packageInfo = this.getPackageManager() + .getPackageInfo("com.google.android.setupwizard", + PackageManager.GET_ACTIVITIES | + PackageManager.GET_RECEIVERS | PackageManager.GET_SERVICES); + enableComponentArray(packageInfo.activities); + enableComponentArray(packageInfo.services); + enableComponentArray(packageInfo.receivers); pm.clearApplicationUserData("com.google.android.setupwizard", null); intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | intent.getFlags()); startActivity(intent); @@ -102,13 +114,19 @@ public class ManualTestActivity extends Activity { Intent intent = new Intent("android.intent.action.MAIN"); intent.addCategory("android.intent.category.HOME"); final PackageManager pm = getPackageManager(); - ComponentName componentName = new ComponentName("com.cyanogenmod.setupwizard", "com.cyanogenmod.setupwizard.ui.SetupWizardActivity"); - pm.setComponentEnabledSetting(componentName, PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP); + ComponentName componentName = new ComponentName("com.cyanogenmod.setupwizard", + "com.cyanogenmod.setupwizard.ui.SetupWizardActivity"); + pm.setComponentEnabledSetting(componentName, + PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP); try { - componentName = new ComponentName("com.google.android.setupwizard", "com.google.android.setupwizard.SetupWizardActivity"); - pm.setComponentEnabledSetting(componentName, PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP); - componentName = new ComponentName("com.google.android.setupwizard", "com.google.android.setupwizard.WizardManager"); - pm.setComponentEnabledSetting(componentName, PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP); + PackageInfo packageInfo = this.getPackageManager() + .getPackageInfo("com.google.android.setupwizard", + PackageManager.GET_ACTIVITIES | + PackageManager.GET_RECEIVERS | PackageManager.GET_SERVICES); + enableComponentArray(packageInfo.activities); + enableComponentArray(packageInfo.services); + enableComponentArray(packageInfo.receivers); + pm.clearApplicationUserData("com.google.android.setupwizard", null); } catch (Exception e) { Toast.makeText(this, "GMS not installed", Toast.LENGTH_SHORT).show(); e.printStackTrace(); @@ -118,4 +136,22 @@ public class ManualTestActivity extends Activity { finish(); } + private void enableComponentArray(ComponentInfo[] components) { + if(components != null) { + ComponentInfo[] componentInfos = components; + for(int i = 0; i < componentInfos.length; i++) { + enableComponent(componentInfos[i].packageName, componentInfos[i].name); + } + } + } + + private void enableComponent(String packageName, String name) { + enableComponent(new ComponentName(packageName, name)); + } + + private void enableComponent(ComponentName component) { + getPackageManager().setComponentEnabledSetting(component, + PackageManager.COMPONENT_ENABLED_STATE_ENABLED, 1); + } + } \ No newline at end of file