Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 79840ecb authored by cretin45's avatar cretin45
Browse files

SetupWizard: Fix scenario where GMS setup disables its components

Change-Id: Ia8edd39645f83625ff06fb61903b672b774257d6
parent 77c129f8
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -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);
+8 −4
Original line number Diff line number Diff line
@@ -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);
    }
}
+67 −19
Original line number Diff line number Diff line
@@ -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<ResolveInfo> 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);
    }
}
+52 −16
Original line number Diff line number Diff line
@@ -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