diff options
Diffstat (limited to 'services/java')
-rw-r--r-- | services/java/com/android/server/AppsLaunchFailureReceiver.java | 86 | ||||
-rw-r--r-- | services/java/com/android/server/SystemServer.java | 36 |
2 files changed, 122 insertions, 0 deletions
diff --git a/services/java/com/android/server/AppsLaunchFailureReceiver.java b/services/java/com/android/server/AppsLaunchFailureReceiver.java new file mode 100644 index 0000000..81b23ec --- /dev/null +++ b/services/java/com/android/server/AppsLaunchFailureReceiver.java @@ -0,0 +1,86 @@ +/* + * Copyright (C) 2010, T-Mobile USA, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.server; + +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.pm.ThemeUtils; +import android.content.res.ThemeConfig; +import android.content.res.ThemeManager; +import android.os.SystemClock; +import android.provider.ThemesContract; + +import java.util.ArrayList; +import java.util.List; + +public class AppsLaunchFailureReceiver extends BroadcastReceiver { + + private static final int FAILURES_THRESHOLD = 3; + private static final int EXPIRATION_TIME_IN_MILLISECONDS = 30000; // 30 seconds + + private int mFailuresCount = 0; + private long mStartTime = 0; + + // This function implements the following logic. + // If after a theme was applied the number of application launch failures + // at any moment was equal to FAILURES_THRESHOLD + // in less than EXPIRATION_TIME_IN_MILLISECONDS + // the default theme is applied unconditionally. + @Override + public void onReceive(Context context, Intent intent) { + String action = intent.getAction(); + if (action.equals(Intent.ACTION_APP_LAUNCH_FAILURE)) { + long currentTime = SystemClock.uptimeMillis(); + if (currentTime - mStartTime > EXPIRATION_TIME_IN_MILLISECONDS) { + // reset both the count and the timer + mStartTime = currentTime; + mFailuresCount = 0; + } + if (mFailuresCount <= FAILURES_THRESHOLD) { + mFailuresCount++; + if (mFailuresCount == FAILURES_THRESHOLD) { + // let the theme manager take care of getting us back on the default theme + ThemeManager tm = + (ThemeManager) context.getSystemService(Context.THEME_SERVICE); + List<String> components = new ArrayList<String>(); + components.add(ThemesContract.ThemesColumns.MODIFIES_FONTS); + components.add(ThemesContract.ThemesColumns.MODIFIES_LAUNCHER); + components.add(ThemesContract.ThemesColumns.MODIFIES_ALARMS); + components.add(ThemesContract.ThemesColumns.MODIFIES_BOOT_ANIM); + components.add(ThemesContract.ThemesColumns.MODIFIES_ICONS); + components.add(ThemesContract.ThemesColumns.MODIFIES_LOCKSCREEN); + components.add(ThemesContract.ThemesColumns.MODIFIES_NOTIFICATIONS); + components.add(ThemesContract.ThemesColumns.MODIFIES_OVERLAYS); + components.add(ThemesContract.ThemesColumns.MODIFIES_RINGTONES); + components.add(ThemesContract.ThemesColumns.MODIFIES_STATUS_BAR); + components.add(ThemesContract.ThemesColumns.MODIFIES_NAVIGATION_BAR); + tm.requestThemeChange(ThemeConfig.SYSTEM_DEFAULT, components); + } + } + } else if (action.equals(Intent.ACTION_APP_LAUNCH_FAILURE_RESET) + || action.equals(ThemeUtils.ACTION_THEME_CHANGED)) { + mFailuresCount = 0; + mStartTime = SystemClock.uptimeMillis(); + } else if (action.equals(Intent.ACTION_PACKAGE_ADDED) || + action.equals(Intent.ACTION_PACKAGE_REMOVED)) { + mFailuresCount = 0; + mStartTime = SystemClock.uptimeMillis(); + } + } + +} diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java index ab59aeb..b816843 100644 --- a/services/java/com/android/server/SystemServer.java +++ b/services/java/com/android/server/SystemServer.java @@ -25,11 +25,16 @@ import android.content.ComponentName; import android.content.ContentResolver; import android.content.Context; import android.content.Intent; +import android.content.IntentFilter; +import android.content.pm.IPackageManager; import android.content.pm.PackageManager; +import android.content.pm.ThemeUtils; import android.content.res.Configuration; import android.content.res.Resources.Theme; import android.database.ContentObserver; import android.database.Cursor; +import android.content.res.ThemeConfig; +import android.database.ContentObserver; import android.os.Build; import android.os.Environment; import android.os.FactoryTest; @@ -564,6 +569,7 @@ public final class SystemServer { MediaRouterService mediaRouter = null; GestureService gestureService = null; EdgeGestureService edgeGestureService = null; + ThemeService themeService = null; // Bring up services needed for UI. if (mFactoryTestMode != FactoryTest.FACTORY_TEST_LOW_LEVEL) { @@ -991,6 +997,14 @@ public final class SystemServer { mSystemServiceManager.startService(TvInputManagerService.class); } + try { + Slog.i(TAG, "Theme Service"); + themeService = new ThemeService(context); + ServiceManager.addService(Context.THEME_SERVICE, themeService); + } catch (Throwable e) { + reportWtf("starting Theme Service", e); + } + if (!disableNonCoreServices) { try { Slog.i(TAG, "Media Router Service"); @@ -1137,6 +1151,16 @@ public final class SystemServer { } } + IntentFilter filter = new IntentFilter(); + filter.addAction(Intent.ACTION_APP_LAUNCH_FAILURE); + filter.addAction(Intent.ACTION_APP_LAUNCH_FAILURE_RESET); + filter.addAction(Intent.ACTION_PACKAGE_ADDED); + filter.addAction(Intent.ACTION_PACKAGE_REMOVED); + filter.addAction(ThemeUtils.ACTION_THEME_CHANGED); + filter.addCategory(Intent.CATEGORY_THEME_PACKAGE_INSTALLED_STATE_CHANGE); + filter.addDataScheme("package"); + context.registerReceiver(new AppsLaunchFailureReceiver(), filter); + // These are needed to propagate to the runnable below. final NetworkManagementService networkManagementF = networkManagement; final NetworkStatsService networkStatsF = networkStats; @@ -1157,6 +1181,7 @@ public final class SystemServer { final MediaRouterService mediaRouterF = mediaRouter; final AudioService audioServiceF = audioService; final MmsServiceBroker mmsServiceF = mmsService; + final ThemeService themeServiceF = themeService; // We now tell the activity manager it is okay to run third party // code. It will call back into us once it has gotten to the state @@ -1286,6 +1311,17 @@ public final class SystemServer { } catch (Throwable e) { reportWtf("Notifying MmsService running", e); } + + try { + // now that the system is up, apply default theme if applicable + if (themeServiceF != null) themeServiceF.systemRunning(); + ThemeConfig themeConfig = + ThemeConfig.getBootTheme(context.getContentResolver()); + String iconPkg = themeConfig.getIconPackPkgName(); + mPackageManagerService.updateIconMapping(iconPkg); + } catch (Throwable e) { + reportWtf("Icon Mapping failed", e); + } } }); } |