summaryrefslogtreecommitdiffstats
path: root/services/java
diff options
context:
space:
mode:
Diffstat (limited to 'services/java')
-rw-r--r--services/java/com/android/server/AppsLaunchFailureReceiver.java86
-rw-r--r--services/java/com/android/server/SystemServer.java36
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);
+ }
}
});
}