diff options
-rw-r--r-- | core/java/android/provider/Settings.java | 11 | ||||
-rw-r--r-- | services/java/com/android/server/print/UserState.java | 101 |
2 files changed, 76 insertions, 36 deletions
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index 31817cc..83e1544 100644 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -3708,13 +3708,22 @@ public final class Settings { public static final String LONG_PRESS_TIMEOUT = "long_press_timeout"; /** - * List of the enabled print providers. + * List of the enabled print services. * @hide */ public static final String ENABLED_PRINT_SERVICES = "enabled_print_services"; /** + * List of the system print services we enabled on first boot. On + * first boot we enable all system, i.e. bundled print services, + * once, so they work out-of-the-box. + * @hide + */ + public static final String ENABLED_ON_FIRST_BOOT_SYSTEM_PRINT_SERVICES = + "enabled_on_first_boot_system_print_services"; + + /** * Setting to always use the default text-to-speech settings regardless * of the application settings. * 1 = override application settings, diff --git a/services/java/com/android/server/print/UserState.java b/services/java/com/android/server/print/UserState.java index 4a1b96b..7d94a42 100644 --- a/services/java/com/android/server/print/UserState.java +++ b/services/java/com/android/server/print/UserState.java @@ -19,8 +19,6 @@ package com.android.server.print; import android.content.ComponentName; import android.content.Context; import android.content.Intent; -import android.content.SharedPreferences; -import android.content.SharedPreferences.Editor; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; @@ -68,11 +66,6 @@ final class UserState implements PrintSpoolerCallbacks { private static final char COMPONENT_NAME_SEPARATOR = ':'; - private static final String SHARED_PREFERENCES_FILE = "shared_prefs"; - - private static final String KEY_SYSTEM_PRINT_SERVICES_ENABLED = - "KEY_SYSTEM_PRINT_SERVICES_ENABLED"; - private final SimpleStringSplitter mStringColonSplitter = new SimpleStringSplitter(COMPONENT_NAME_SEPARATOR); @@ -105,7 +98,9 @@ final class UserState implements PrintSpoolerCallbacks { mUserId = userId; mLock = lock; mSpooler = new RemotePrintSpooler(context, userId, this); - enableSystemPrintServicesOnce(); + synchronized (mLock) { + enableSystemPrintServicesOnFirstBootLocked(); + } } @Override @@ -379,11 +374,23 @@ final class UserState implements PrintSpoolerCallbacks { return false; } + private boolean readEnabledPrintServicesLocked() { Set<ComponentName> tempEnabledServiceNameSet = new HashSet<ComponentName>(); + readPrintServicesFromSettingLocked(Settings.Secure.ENABLED_PRINT_SERVICES, + tempEnabledServiceNameSet); + if (!tempEnabledServiceNameSet.equals(mEnabledServices)) { + mEnabledServices.clear(); + mEnabledServices.addAll(tempEnabledServiceNameSet); + return true; + } + return false; + } + private void readPrintServicesFromSettingLocked(String setting, + Set<ComponentName> outServiceNames) { String settingValue = Settings.Secure.getStringForUser(mContext.getContentResolver(), - Settings.Secure.ENABLED_PRINT_SERVICES, mUserId); + setting, mUserId); if (!TextUtils.isEmpty(settingValue)) { TextUtils.SimpleStringSplitter splitter = mStringColonSplitter; splitter.setString(settingValue); @@ -394,48 +401,72 @@ final class UserState implements PrintSpoolerCallbacks { } ComponentName componentName = ComponentName.unflattenFromString(string); if (componentName != null) { - tempEnabledServiceNameSet.add(componentName); + outServiceNames.add(componentName); } } } - - if (!tempEnabledServiceNameSet.equals(mEnabledServices)) { - mEnabledServices.clear(); - mEnabledServices.addAll(tempEnabledServiceNameSet); - return true; - } - - return false; } - private void enableSystemPrintServicesOnce() { - SharedPreferences preferences = mContext.getSharedPreferences( - SHARED_PREFERENCES_FILE, Context.MODE_PRIVATE); - if (preferences.getInt(KEY_SYSTEM_PRINT_SERVICES_ENABLED, 0) == 0) { - Editor editor = preferences.edit(); - editor.putInt(KEY_SYSTEM_PRINT_SERVICES_ENABLED, 1); - editor.commit(); + private void enableSystemPrintServicesOnFirstBootLocked() { + // Load enabled and installed services. + readEnabledPrintServicesLocked(); + readInstalledPrintServicesLocked(); - readInstalledPrintServicesLocked(); + // Load the system services once enabled on first boot. + Set<ComponentName> enabledOnFirstBoot = new HashSet<ComponentName>(); + readPrintServicesFromSettingLocked( + Settings.Secure.ENABLED_ON_FIRST_BOOT_SYSTEM_PRINT_SERVICES, + enabledOnFirstBoot); - StringBuilder builder = new StringBuilder(); + StringBuilder builder = new StringBuilder(); - final int serviceCount = mInstalledServices.size(); - for (int i = 0; i < serviceCount; i++) { - ServiceInfo serviceInfo = mInstalledServices.get(i).getResolveInfo().serviceInfo; - if ((serviceInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0) { - ComponentName serviceName = new ComponentName( - serviceInfo.packageName, serviceInfo.name); + final int serviceCount = mInstalledServices.size(); + for (int i = 0; i < serviceCount; i++) { + ServiceInfo serviceInfo = mInstalledServices.get(i).getResolveInfo().serviceInfo; + // Enable system print services if we never did that and are not enabled. + if ((serviceInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0) { + ComponentName serviceName = new ComponentName( + serviceInfo.packageName, serviceInfo.name); + if (!mEnabledServices.contains(serviceName) + && !enabledOnFirstBoot.contains(serviceName)) { if (builder.length() > 0) { builder.append(":"); } builder.append(serviceName.flattenToString()); } } + } + + // Nothing to be enabled - done. + if (builder.length() <= 0) { + return; + } + + String servicesToEnable = builder.toString(); - Settings.Secure.putStringForUser(mContext.getContentResolver(), - Settings.Secure.ENABLED_PRINT_SERVICES, builder.toString(), mUserId); + // Update the enabled services setting. + String enabledServices = Settings.Secure.getStringForUser( + mContext.getContentResolver(), Settings.Secure.ENABLED_PRINT_SERVICES, mUserId); + if (TextUtils.isEmpty(enabledServices)) { + enabledServices = servicesToEnable; + } else { + enabledServices = enabledServices + ":" + servicesToEnable; + } + Settings.Secure.putStringForUser(mContext.getContentResolver(), + Settings.Secure.ENABLED_PRINT_SERVICES, enabledServices, mUserId); + + // Update the enabled on first boot services setting. + String enabledOnFirstBootServices = Settings.Secure.getStringForUser( + mContext.getContentResolver(), + Settings.Secure.ENABLED_ON_FIRST_BOOT_SYSTEM_PRINT_SERVICES, mUserId); + if (TextUtils.isEmpty(enabledOnFirstBootServices)) { + enabledOnFirstBootServices = servicesToEnable; + } else { + enabledOnFirstBootServices = enabledOnFirstBootServices + ":" + enabledServices; } + Settings.Secure.putStringForUser(mContext.getContentResolver(), + Settings.Secure.ENABLED_ON_FIRST_BOOT_SYSTEM_PRINT_SERVICES, + enabledOnFirstBootServices, mUserId); } private void onConfigurationChangedLocked() { |