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

Commit b9832618 authored by Ruben Brunk's avatar Ruben Brunk Committed by android-build-merger
Browse files

Merge \"Remove VR package disable logic.\" into nyc-mr1-dev

am: b005e068

Change-Id: I0ee90e535d49ee04e6e26048e6e72e15b44fad17
parents c577b1be b005e068
Loading
Loading
Loading
Loading
+0 −101
Original line number Diff line number Diff line
@@ -403,107 +403,6 @@ public class VrManagerService extends SystemService implements EnabledComponentC

        publishLocalService(VrManagerInternal.class, new LocalService());
        publishBinderService(VR_MANAGER_BINDER_SERVICE, mVrManager.asBinder());

        // If there are no VR packages installed on the device, then disable VR
        // components, otherwise, enable them.
        setEnabledStatusOfVrComponents();
    }

    private void setEnabledStatusOfVrComponents() {
        ArraySet<ComponentName> vrComponents = SystemConfig.getInstance().getDefaultVrComponents();
        if (vrComponents == null) {
           return;
        }

        // We only want to enable VR components if there is a VR package installed on the device.
        // The VR components themselves do not quality as a VR package, so exclude them.
        ArraySet<String> vrComponentPackageNames = new ArraySet<>();
        for (ComponentName componentName : vrComponents) {
            vrComponentPackageNames.add(componentName.getPackageName());
        }

        // Check to see if there are any packages on the device, other than the VR component
        // packages.
        PackageManager pm = mContext.getPackageManager();
        List<PackageInfo> packageInfos = pm.getInstalledPackages(
                PackageManager.GET_CONFIGURATIONS);
        boolean vrModeIsUsed = false;
        for (PackageInfo packageInfo : packageInfos) {
            if (packageInfo != null && packageInfo.packageName != null &&
                    pm.getApplicationEnabledSetting(packageInfo.packageName) ==
                            PackageManager.COMPONENT_ENABLED_STATE_DEFAULT) {
                vrModeIsUsed = enableVrComponentsIfVrModeUsed(pm, packageInfo,
                        vrComponentPackageNames, vrComponents);
                if (vrModeIsUsed) {
                    break;
                }
            }
        }

        if (!vrModeIsUsed) {
            Slog.i(TAG, "No VR packages found, disabling VR components");
            setVrComponentsEnabledOrDisabled(vrComponents, false);

            // Register to receive an intent when a new package is installed, in case that package
            // requires VR components.
            IntentFilter intentFilter = new IntentFilter();
            intentFilter.addAction(Intent.ACTION_PACKAGE_ADDED);
            intentFilter.addDataScheme("package");
            mContext.registerReceiver(new BroadcastReceiver() {
                @Override
                public void onReceive(Context context, Intent intent) {
                    PackageManager pm = context.getPackageManager();
                    final String packageName = intent.getData().getSchemeSpecificPart();
                    if (packageName != null) {
                        try {
                            PackageInfo packageInfo = pm.getPackageInfo(packageName,
                                    PackageManager.GET_CONFIGURATIONS);
                            enableVrComponentsIfVrModeUsed(pm, packageInfo,
                                    vrComponentPackageNames, vrComponents);
                        } catch (NameNotFoundException e) {
                        }
                    }
                };
            }, intentFilter);
        }
    }

    private void setVrComponentsEnabledOrDisabled(ArraySet<ComponentName> vrComponents,
            boolean enabled) {
        int state = enabled ?
                PackageManager.COMPONENT_ENABLED_STATE_ENABLED :
                PackageManager.COMPONENT_ENABLED_STATE_DISABLED;
        PackageManager pm = mContext.getPackageManager();
        for (ComponentName componentName : vrComponents) {
            try {
                // Note that we must first check for the existance of the package before trying
                // to set its enabled state.  This is to prevent PackageManager from throwing
                // an excepton if the package is not found (not just a NameNotFoundException
                // exception).
                PackageInfo packageInfo = pm.getPackageInfo(componentName.getPackageName(),
                        PackageManager.GET_CONFIGURATIONS);
                pm.setApplicationEnabledSetting(componentName.getPackageName(), state , 0);
            } catch (NameNotFoundException e) {
            }
        }
    }

    private boolean enableVrComponentsIfVrModeUsed(PackageManager pm, PackageInfo packageInfo,
            ArraySet<String> vrComponentPackageNames, ArraySet<ComponentName> vrComponents) {
        boolean isVrComponent = vrComponents != null &&
                vrComponentPackageNames.contains(packageInfo.packageName);
        if (packageInfo != null && packageInfo.reqFeatures != null && !isVrComponent) {
            for (FeatureInfo featureInfo : packageInfo.reqFeatures) {
                if (featureInfo.name != null &&
                    (featureInfo.name.equals(PackageManager.FEATURE_VR_MODE) ||
                     featureInfo.name.equals(PackageManager.FEATURE_VR_MODE_HIGH_PERFORMANCE))) {
                    Slog.i(TAG, "VR package found, enabling VR components");
                    setVrComponentsEnabledOrDisabled(vrComponents, true);
                    return true;
                }
            }
        }
        return false;
    }

    @Override