SetupWizard: Fix scenario where GMS setup disables its components

Change-Id: Ia8edd39645f83625ff06fb61903b672b774257d6
This commit is contained in:
cretin45 2015-02-17 17:09:32 -08:00
parent 77c129f8b9
commit 79840ecb4e
4 changed files with 131 additions and 40 deletions

View File

@ -125,6 +125,7 @@ public class GmsAccountPage extends SetupPage {
} }
} else if (requestCode == SetupWizardApp.REQUEST_CODE_RESTORE_GMS) { } else if (requestCode == SetupWizardApp.REQUEST_CODE_RESTORE_GMS) {
handleResult(resultCode); handleResult(resultCode);
setHidden(true);
} }
return true; return true;
} }
@ -150,6 +151,8 @@ public class GmsAccountPage extends SetupPage {
private static void launchGmsRestorePage(final Activity activity) { private static void launchGmsRestorePage(final Activity activity) {
try { try {
// GMS can disable this after logging in sometimes
SetupWizardUtils.enableGMSSetupWizard(activity);
Intent intent = new Intent(ACTION_RESTORE); Intent intent = new Intent(ACTION_RESTORE);
intent.putExtra(SetupWizardApp.EXTRA_ALLOW_SKIP, true); intent.putExtra(SetupWizardApp.EXTRA_ALLOW_SKIP, true);
intent.putExtra(SetupWizardApp.EXTRA_USE_IMMERSIVE, true); intent.putExtra(SetupWizardApp.EXTRA_USE_IMMERSIVE, true);
@ -169,7 +172,7 @@ public class GmsAccountPage extends SetupPage {
e.printStackTrace(); e.printStackTrace();
// XXX: In open source, we don't know what gms version a user has. // XXX: In open source, we don't know what gms version a user has.
// Bail if the restore activity is not found. // Bail if the restore activity is not found.
((SetupWizardActivity)activity).onNextPage(); ((SetupWizardActivity) activity).onNextPage();
} }
} }

View File

@ -18,7 +18,6 @@ package com.cyanogenmod.setupwizard.ui;
import android.animation.Animator; import android.animation.Animator;
import android.app.Activity; import android.app.Activity;
import android.app.AppGlobals;
import android.app.WallpaperManager; import android.app.WallpaperManager;
import android.content.Intent; import android.content.Intent;
import android.content.res.Resources; import android.content.res.Resources;
@ -305,18 +304,23 @@ public class SetupWizardActivity extends Activity implements SetupDataCallbacks
} }
private void finishSetup() { private void finishSetup() {
SetupWizardApp setupWizardApp = (SetupWizardApp)getApplication();
if (!mIsGuestUser) { if (!mIsGuestUser) {
getApplication().sendBroadcastAsUser(new Intent(SetupWizardApp.ACTION_FINISHED), setupWizardApp.sendBroadcastAsUser(new Intent(SetupWizardApp.ACTION_FINISHED),
UserHandle.getCallingUserHandle()); UserHandle.getCallingUserHandle());
} }
mSetupData.finishPages(); mSetupData.finishPages();
Settings.Global.putInt(getContentResolver(), Settings.Global.DEVICE_PROVISIONED, 1); Settings.Global.putInt(getContentResolver(), Settings.Global.DEVICE_PROVISIONED, 1);
Settings.Secure.putInt(getContentResolver(), Settings.Secure.USER_SETUP_COMPLETE, 1); Settings.Secure.putInt(getContentResolver(), Settings.Secure.USER_SETUP_COMPLETE, 1);
((SetupWizardApp)AppGlobals.getInitialApplication()).enableStatusBar(); setupWizardApp.enableStatusBar();
finish(); finish();
if (mEnableAccessibilityController != null) { if (mEnableAccessibilityController != null) {
mEnableAccessibilityController.onDestroy(); 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);
} }
} }

View File

@ -22,8 +22,9 @@ import android.app.ActivityOptions;
import android.content.ComponentName; import android.content.ComponentName;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.pm.ComponentInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.net.ConnectivityManager; import android.net.ConnectivityManager;
import android.net.NetworkInfo; import android.net.NetworkInfo;
import android.net.wifi.WifiManager; import android.net.wifi.WifiManager;
@ -31,14 +32,13 @@ import android.os.UserHandle;
import android.os.UserManager; import android.os.UserManager;
import android.telephony.SubscriptionManager; import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager; import android.telephony.TelephonyManager;
import android.util.Log;
import com.cyanogenmod.setupwizard.SetupWizardApp; import com.cyanogenmod.setupwizard.SetupWizardApp;
import com.google.android.gms.common.ConnectionResult; import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.GooglePlayServicesUtil; import com.google.android.gms.common.GooglePlayServicesUtil;
import java.util.List;
public class SetupWizardUtils { public class SetupWizardUtils {
private static final String TAG = SetupWizardUtils.class.getSimpleName(); private static final String TAG = SetupWizardUtils.class.getSimpleName();
@ -160,24 +160,72 @@ public class SetupWizardUtils {
return AccountManager.get(context).getAccountsByType(accountType).length > 0; return AccountManager.get(context).getAccountsByType(accountType).length > 0;
} }
public static void disableSetupWizards(Activity context) { public static void disableSetupWizard(Activity context) {
Intent intent = new Intent(Intent.ACTION_MAIN); disableComponent(context, context.getPackageName(),
intent.addCategory(Intent.CATEGORY_HOME); "com.cyanogenmod.setupwizard.ui.SetupWizardActivity");
final PackageManager pm = context.getPackageManager(); }
final List<ResolveInfo> resolveInfos =
pm.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY); public static void disableGMSSetupWizard(Activity context) {
for (ResolveInfo info : resolveInfos) { try {
if (GOOGLE_SETUPWIZARD_PACKAGE.equals(info.activityInfo.packageName)) { PackageInfo packageInfo = context.getPackageManager()
final ComponentName componentName = .getPackageInfo(GOOGLE_SETUPWIZARD_PACKAGE,
new ComponentName(info.activityInfo.packageName, info.activityInfo.name); PackageManager.GET_ACTIVITIES |
pm.setComponentEnabledSetting(componentName, PackageManager.GET_RECEIVERS | PackageManager.GET_SERVICES);
PackageManager.COMPONENT_ENABLED_STATE_DISABLED, disableComponentArray(context, packageInfo.activities);
0); 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); 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);
} }
} }

View File

@ -19,7 +19,10 @@ package com.cyanogenmod.setupwizard.tests;
import android.app.Activity; import android.app.Activity;
import android.content.ComponentName; import android.content.ComponentName;
import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.pm.ComponentInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import android.os.Bundle; import android.os.Bundle;
import android.provider.Settings; import android.provider.Settings;
@ -58,13 +61,19 @@ public class ManualTestActivity extends Activity {
Intent intent = new Intent("android.intent.action.MAIN"); Intent intent = new Intent("android.intent.action.MAIN");
intent.addCategory("android.intent.category.HOME"); intent.addCategory("android.intent.category.HOME");
final PackageManager pm = getPackageManager(); final PackageManager pm = getPackageManager();
ComponentName componentName = new ComponentName("com.cyanogenmod.setupwizard", "com.cyanogenmod.setupwizard.ui.SetupWizardActivity"); ComponentName componentName = new ComponentName("com.cyanogenmod.setupwizard",
pm.setComponentEnabledSetting(componentName, PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP); "com.cyanogenmod.setupwizard.ui.SetupWizardActivity");
pm.setComponentEnabledSetting(componentName, PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
PackageManager.DONT_KILL_APP);
pm.clearApplicationUserData("com.cyanogenmod.setupwizard", null);
try { try {
componentName = new ComponentName("com.google.android.setupwizard", "com.google.android.setupwizard.SetupWizardActivity"); PackageInfo packageInfo = getPackageManager()
pm.setComponentEnabledSetting(componentName, PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP); .getPackageInfo("com.google.android.setupwizard",
componentName = new ComponentName("com.google.android.setupwizard", "com.google.android.setupwizard.WizardManager"); PackageManager.GET_ACTIVITIES |
pm.setComponentEnabledSetting(componentName, PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP); PackageManager.GET_RECEIVERS | PackageManager.GET_SERVICES);
enableComponentArray(packageInfo.activities);
enableComponentArray(packageInfo.services);
enableComponentArray(packageInfo.receivers);
pm.clearApplicationUserData("com.google.android.setupwizard", null); pm.clearApplicationUserData("com.google.android.setupwizard", null);
} catch (Exception e) { } catch (Exception e) {
Toast.makeText(this, "GMS not installed", Toast.LENGTH_SHORT).show(); 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 intent = new Intent("android.intent.action.MAIN");
intent.addCategory("android.intent.category.HOME"); intent.addCategory("android.intent.category.HOME");
final PackageManager pm = getPackageManager(); final PackageManager pm = getPackageManager();
ComponentName componentName = new ComponentName("com.google.android.setupwizard", "com.google.android.setupwizard.SetupWizardActivity"); PackageInfo packageInfo = this.getPackageManager()
pm.setComponentEnabledSetting(componentName, PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP); .getPackageInfo("com.google.android.setupwizard",
componentName = new ComponentName("com.google.android.setupwizard", "com.google.android.setupwizard.WizardManager"); PackageManager.GET_ACTIVITIES |
pm.setComponentEnabledSetting(componentName, PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP); PackageManager.GET_RECEIVERS | PackageManager.GET_SERVICES);
enableComponentArray(packageInfo.activities);
enableComponentArray(packageInfo.services);
enableComponentArray(packageInfo.receivers);
pm.clearApplicationUserData("com.google.android.setupwizard", null); pm.clearApplicationUserData("com.google.android.setupwizard", null);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | intent.getFlags()); intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | intent.getFlags());
startActivity(intent); startActivity(intent);
@ -102,13 +114,19 @@ public class ManualTestActivity extends Activity {
Intent intent = new Intent("android.intent.action.MAIN"); Intent intent = new Intent("android.intent.action.MAIN");
intent.addCategory("android.intent.category.HOME"); intent.addCategory("android.intent.category.HOME");
final PackageManager pm = getPackageManager(); final PackageManager pm = getPackageManager();
ComponentName componentName = new ComponentName("com.cyanogenmod.setupwizard", "com.cyanogenmod.setupwizard.ui.SetupWizardActivity"); ComponentName componentName = new ComponentName("com.cyanogenmod.setupwizard",
pm.setComponentEnabledSetting(componentName, PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP); "com.cyanogenmod.setupwizard.ui.SetupWizardActivity");
pm.setComponentEnabledSetting(componentName,
PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP);
try { try {
componentName = new ComponentName("com.google.android.setupwizard", "com.google.android.setupwizard.SetupWizardActivity"); PackageInfo packageInfo = this.getPackageManager()
pm.setComponentEnabledSetting(componentName, PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP); .getPackageInfo("com.google.android.setupwizard",
componentName = new ComponentName("com.google.android.setupwizard", "com.google.android.setupwizard.WizardManager"); PackageManager.GET_ACTIVITIES |
pm.setComponentEnabledSetting(componentName, PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP); 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) { } catch (Exception e) {
Toast.makeText(this, "GMS not installed", Toast.LENGTH_SHORT).show(); Toast.makeText(this, "GMS not installed", Toast.LENGTH_SHORT).show();
e.printStackTrace(); e.printStackTrace();
@ -118,4 +136,22 @@ public class ManualTestActivity extends Activity {
finish(); 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);
}
} }