From df7db074b5e6a19c8a33c2cc6be88f85eb5ee47c Mon Sep 17 00:00:00 2001 From: Amith Yamasani Date: Sun, 1 Jun 2014 10:41:13 -0700 Subject: [PATCH] Derive LauncherAppsService from SystemService And encapsulate the aidl interface implementation. Change-Id: Id9a2544b411648e2596de18682079a64e95b0710 --- .../server/pm/LauncherAppsService.java | 623 +++++++++--------- .../java/com/android/server/SystemServer.java | 3 +- 2 files changed, 321 insertions(+), 305 deletions(-) diff --git a/services/core/java/com/android/server/pm/LauncherAppsService.java b/services/core/java/com/android/server/pm/LauncherAppsService.java index 5e3325c883a97..25ebfc0f9c54b 100644 --- a/services/core/java/com/android/server/pm/LauncherAppsService.java +++ b/services/core/java/com/android/server/pm/LauncherAppsService.java @@ -40,6 +40,7 @@ import android.util.Log; import android.util.Slog; import com.android.internal.content.PackageMonitor; +import com.android.server.SystemService; import java.util.ArrayList; import java.util.List; @@ -48,358 +49,374 @@ import java.util.List; * Service that manages requests and callbacks for launchers that support * managed profiles. */ -public class LauncherAppsService extends ILauncherApps.Stub { - private static final boolean DEBUG = false; - private static final String TAG = "LauncherAppsService"; - private final Context mContext; - private final PackageManager mPm; - private final UserManager mUm; - private final PackageCallbackList mListeners - = new PackageCallbackList(); - private MyPackageMonitor mPackageMonitor = new MyPackageMonitor(); +public class LauncherAppsService extends SystemService { + + private final LauncherAppsImpl mLauncherAppsImpl; public LauncherAppsService(Context context) { - mContext = context; - mPm = mContext.getPackageManager(); - mUm = (UserManager) mContext.getSystemService(Context.USER_SERVICE); + super(context); + mLauncherAppsImpl = new LauncherAppsImpl(context); } - /* - * @see android.content.pm.ILauncherApps#addOnAppsChangedListener( - * android.content.pm.IOnAppsChangedListener) - */ @Override - public void addOnAppsChangedListener(IOnAppsChangedListener listener) throws RemoteException { - synchronized (mListeners) { - if (DEBUG) { - Log.d(TAG, "Adding listener from " + Binder.getCallingUserHandle()); - } - if (mListeners.getRegisteredCallbackCount() == 0) { + public void onStart() { + publishBinderService(Context.LAUNCHER_APPS_SERVICE, mLauncherAppsImpl); + } + + class LauncherAppsImpl extends ILauncherApps.Stub { + private static final boolean DEBUG = false; + private static final String TAG = "LauncherAppsService"; + private final Context mContext; + private final PackageManager mPm; + private final UserManager mUm; + private final PackageCallbackList mListeners + = new PackageCallbackList(); + + private MyPackageMonitor mPackageMonitor = new MyPackageMonitor(); + + public LauncherAppsImpl(Context context) { + mContext = context; + mPm = mContext.getPackageManager(); + mUm = (UserManager) mContext.getSystemService(Context.USER_SERVICE); + } + + /* + * @see android.content.pm.ILauncherApps#addOnAppsChangedListener( + * android.content.pm.IOnAppsChangedListener) + */ + @Override + public void addOnAppsChangedListener(IOnAppsChangedListener listener) throws RemoteException { + synchronized (mListeners) { if (DEBUG) { - Log.d(TAG, "Starting package monitoring"); + Log.d(TAG, "Adding listener from " + Binder.getCallingUserHandle()); } - startWatchingPackageBroadcasts(); + if (mListeners.getRegisteredCallbackCount() == 0) { + if (DEBUG) { + Log.d(TAG, "Starting package monitoring"); + } + startWatchingPackageBroadcasts(); + } + mListeners.unregister(listener); + mListeners.register(listener, Binder.getCallingUserHandle()); } - mListeners.unregister(listener); - mListeners.register(listener, Binder.getCallingUserHandle()); } - } - /* - * @see android.content.pm.ILauncherApps#removeOnAppsChangedListener( - * android.content.pm.IOnAppsChangedListener) - */ - @Override - public void removeOnAppsChangedListener(IOnAppsChangedListener listener) - throws RemoteException { - synchronized (mListeners) { + /* + * @see android.content.pm.ILauncherApps#removeOnAppsChangedListener( + * android.content.pm.IOnAppsChangedListener) + */ + @Override + public void removeOnAppsChangedListener(IOnAppsChangedListener listener) + throws RemoteException { + synchronized (mListeners) { + if (DEBUG) { + Log.d(TAG, "Removing listener from " + Binder.getCallingUserHandle()); + } + mListeners.unregister(listener); + if (mListeners.getRegisteredCallbackCount() == 0) { + stopWatchingPackageBroadcasts(); + } + } + } + + /** + * Register a receiver to watch for package broadcasts + */ + private void startWatchingPackageBroadcasts() { + mPackageMonitor.register(mContext, null, UserHandle.ALL, true); + } + + /** + * Unregister package broadcast receiver + */ + private void stopWatchingPackageBroadcasts() { if (DEBUG) { - Log.d(TAG, "Removing listener from " + Binder.getCallingUserHandle()); + Log.d(TAG, "Stopped watching for packages"); } - mListeners.unregister(listener); - if (mListeners.getRegisteredCallbackCount() == 0) { - stopWatchingPackageBroadcasts(); + mPackageMonitor.unregister(); + } + + void checkCallbackCount() { + synchronized (mListeners) { + if (DEBUG) { + Log.d(TAG, "Callback count = " + mListeners.getRegisteredCallbackCount()); + } + if (mListeners.getRegisteredCallbackCount() == 0) { + stopWatchingPackageBroadcasts(); + } } } - } - /** - * Register a receiver to watch for package broadcasts - */ - private void startWatchingPackageBroadcasts() { - mPackageMonitor.register(mContext, null, UserHandle.ALL, true); - } + /** + * Checks if the caller is in the same group as the userToCheck. + */ + private void ensureInUserProfiles(UserHandle userToCheck, String message) { + final int callingUserId = UserHandle.getCallingUserId(); + final int targetUserId = userToCheck.getIdentifier(); - /** - * Unregister package broadcast receiver - */ - private void stopWatchingPackageBroadcasts() { - if (DEBUG) { - Log.d(TAG, "Stopped watching for packages"); - } - mPackageMonitor.unregister(); - } + if (targetUserId == callingUserId) return; - void checkCallbackCount() { - synchronized (mListeners) { - if (DEBUG) { - Log.d(TAG, "Callback count = " + mListeners.getRegisteredCallbackCount()); - } - if (mListeners.getRegisteredCallbackCount() == 0) { - stopWatchingPackageBroadcasts(); - } - } - } - - /** - * Checks if the caller is in the same group as the userToCheck. - */ - private void ensureInUserProfiles(UserHandle userToCheck, String message) { - final int callingUserId = UserHandle.getCallingUserId(); - final int targetUserId = userToCheck.getIdentifier(); - - if (targetUserId == callingUserId) return; - - long ident = Binder.clearCallingIdentity(); - try { - UserInfo callingUserInfo = mUm.getUserInfo(callingUserId); - UserInfo targetUserInfo = mUm.getUserInfo(targetUserId); - if (targetUserInfo == null - || targetUserInfo.profileGroupId == UserInfo.NO_PROFILE_GROUP_ID - || targetUserInfo.profileGroupId != callingUserInfo.profileGroupId) { - throw new SecurityException(message); - } - } finally { - Binder.restoreCallingIdentity(ident); - } - } - - /** - * Checks if the user is enabled. - */ - private boolean isUserEnabled(UserHandle user) { - long ident = Binder.clearCallingIdentity(); - try { - UserInfo targetUserInfo = mUm.getUserInfo(user.getIdentifier()); - return targetUserInfo != null && targetUserInfo.isEnabled(); - } finally { - Binder.restoreCallingIdentity(ident); - } - } - - @Override - public List getLauncherActivities(String packageName, UserHandle user) - throws RemoteException { - ensureInUserProfiles(user, "Cannot retrieve activities for unrelated profile " + user); - if (!isUserEnabled(user)) { - return new ArrayList(); - } - - final Intent mainIntent = new Intent(Intent.ACTION_MAIN, null); - mainIntent.addCategory(Intent.CATEGORY_LAUNCHER); - mainIntent.setPackage(packageName); - long ident = Binder.clearCallingIdentity(); - try { - List apps = mPm.queryIntentActivitiesAsUser(mainIntent, 0, - user.getIdentifier()); - return apps; - } finally { - Binder.restoreCallingIdentity(ident); - } - } - - @Override - public ResolveInfo resolveActivity(Intent intent, UserHandle user) - throws RemoteException { - ensureInUserProfiles(user, "Cannot resolve activity for unrelated profile " + user); - if (!isUserEnabled(user)) { - return null; - } - - long ident = Binder.clearCallingIdentity(); - try { - ResolveInfo app = mPm.resolveActivityAsUser(intent, 0, user.getIdentifier()); - return app; - } finally { - Binder.restoreCallingIdentity(ident); - } - } - - @Override - public boolean isPackageEnabled(String packageName, UserHandle user) - throws RemoteException { - ensureInUserProfiles(user, "Cannot check package for unrelated profile " + user); - if (!isUserEnabled(user)) { - return false; - } - - long ident = Binder.clearCallingIdentity(); - try { - IPackageManager pm = AppGlobals.getPackageManager(); - PackageInfo info = pm.getPackageInfo(packageName, 0, user.getIdentifier()); - return info != null && info.applicationInfo.enabled; - } finally { - Binder.restoreCallingIdentity(ident); - } - } - - @Override - public boolean isActivityEnabled(ComponentName component, UserHandle user) - throws RemoteException { - ensureInUserProfiles(user, "Cannot check component for unrelated profile " + user); - if (!isUserEnabled(user)) { - return false; - } - - long ident = Binder.clearCallingIdentity(); - try { - IPackageManager pm = AppGlobals.getPackageManager(); - ActivityInfo info = pm.getActivityInfo(component, 0, user.getIdentifier()); - return info != null && info.isEnabled(); - } finally { - Binder.restoreCallingIdentity(ident); - } - } - - @Override - public void startActivityAsUser(ComponentName component, Rect sourceBounds, - Bundle opts, UserHandle user) throws RemoteException { - ensureInUserProfiles(user, "Cannot start activity for unrelated profile " + user); - if (!isUserEnabled(user)) { - throw new IllegalStateException("Cannot start activity for disabled profile " + user); - } - - Intent launchIntent = new Intent(Intent.ACTION_MAIN); - launchIntent.addCategory(Intent.CATEGORY_LAUNCHER); - launchIntent.setComponent(component); - launchIntent.setSourceBounds(sourceBounds); - launchIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - - long ident = Binder.clearCallingIdentity(); - try { - mContext.startActivityAsUser(launchIntent, opts, user); - } finally { - Binder.restoreCallingIdentity(ident); - } - } - - private class MyPackageMonitor extends PackageMonitor { - - /** Checks if user is a profile of or same as listeningUser. - * and the user is enabled. */ - private boolean isEnabledProfileOf(UserHandle user, UserHandle listeningUser, - String debugMsg) { - if (user.getIdentifier() == listeningUser.getIdentifier()) { - if (DEBUG) Log.d(TAG, "Delivering msg to same user " + debugMsg); - return true; - } long ident = Binder.clearCallingIdentity(); try { - UserInfo userInfo = mUm.getUserInfo(user.getIdentifier()); - UserInfo listeningUserInfo = mUm.getUserInfo(listeningUser.getIdentifier()); - if (userInfo == null || listeningUserInfo == null - || userInfo.profileGroupId == UserInfo.NO_PROFILE_GROUP_ID - || userInfo.profileGroupId != listeningUserInfo.profileGroupId - || !userInfo.isEnabled()) { - if (DEBUG) { - Log.d(TAG, "Not delivering msg from " + user + " to " + listeningUser + ":" - + debugMsg); - } - return false; - } else { - if (DEBUG) { - Log.d(TAG, "Delivering msg from " + user + " to " + listeningUser + ":" - + debugMsg); - } - return true; + UserInfo callingUserInfo = mUm.getUserInfo(callingUserId); + UserInfo targetUserInfo = mUm.getUserInfo(targetUserId); + if (targetUserInfo == null + || targetUserInfo.profileGroupId == UserInfo.NO_PROFILE_GROUP_ID + || targetUserInfo.profileGroupId != callingUserInfo.profileGroupId) { + throw new SecurityException(message); } } finally { Binder.restoreCallingIdentity(ident); } } - @Override - public void onPackageAdded(String packageName, int uid) { - UserHandle user = new UserHandle(getChangingUserId()); - final int n = mListeners.beginBroadcast(); - for (int i = 0; i < n; i++) { - IOnAppsChangedListener listener = mListeners.getBroadcastItem(i); - UserHandle listeningUser = (UserHandle) mListeners.getBroadcastCookie(i); - if (!isEnabledProfileOf(user, listeningUser, "onPackageAdded")) continue; - try { - listener.onPackageAdded(user, packageName); - } catch (RemoteException re) { - Slog.d(TAG, "Callback failed ", re); - } + /** + * Checks if the user is enabled. + */ + private boolean isUserEnabled(UserHandle user) { + long ident = Binder.clearCallingIdentity(); + try { + UserInfo targetUserInfo = mUm.getUserInfo(user.getIdentifier()); + return targetUserInfo != null && targetUserInfo.isEnabled(); + } finally { + Binder.restoreCallingIdentity(ident); } - mListeners.finishBroadcast(); - - super.onPackageAdded(packageName, uid); } @Override - public void onPackageRemoved(String packageName, int uid) { - UserHandle user = new UserHandle(getChangingUserId()); - final int n = mListeners.beginBroadcast(); - for (int i = 0; i < n; i++) { - IOnAppsChangedListener listener = mListeners.getBroadcastItem(i); - UserHandle listeningUser = (UserHandle) mListeners.getBroadcastCookie(i); - if (!isEnabledProfileOf(user, listeningUser, "onPackageRemoved")) continue; - try { - listener.onPackageRemoved(user, packageName); - } catch (RemoteException re) { - Slog.d(TAG, "Callback failed ", re); - } + public List getLauncherActivities(String packageName, UserHandle user) + throws RemoteException { + ensureInUserProfiles(user, "Cannot retrieve activities for unrelated profile " + user); + if (!isUserEnabled(user)) { + return new ArrayList(); } - mListeners.finishBroadcast(); - super.onPackageRemoved(packageName, uid); + final Intent mainIntent = new Intent(Intent.ACTION_MAIN, null); + mainIntent.addCategory(Intent.CATEGORY_LAUNCHER); + mainIntent.setPackage(packageName); + long ident = Binder.clearCallingIdentity(); + try { + List apps = mPm.queryIntentActivitiesAsUser(mainIntent, 0, + user.getIdentifier()); + return apps; + } finally { + Binder.restoreCallingIdentity(ident); + } } @Override - public void onPackageModified(String packageName) { - UserHandle user = new UserHandle(getChangingUserId()); - final int n = mListeners.beginBroadcast(); - for (int i = 0; i < n; i++) { - IOnAppsChangedListener listener = mListeners.getBroadcastItem(i); - UserHandle listeningUser = (UserHandle) mListeners.getBroadcastCookie(i); - if (!isEnabledProfileOf(user, listeningUser, "onPackageModified")) continue; - try { - listener.onPackageChanged(user, packageName); - } catch (RemoteException re) { - Slog.d(TAG, "Callback failed ", re); - } + public ResolveInfo resolveActivity(Intent intent, UserHandle user) + throws RemoteException { + ensureInUserProfiles(user, "Cannot resolve activity for unrelated profile " + user); + if (!isUserEnabled(user)) { + return null; } - mListeners.finishBroadcast(); - super.onPackageModified(packageName); + long ident = Binder.clearCallingIdentity(); + try { + ResolveInfo app = mPm.resolveActivityAsUser(intent, 0, user.getIdentifier()); + return app; + } finally { + Binder.restoreCallingIdentity(ident); + } } @Override - public void onPackagesAvailable(String[] packages) { - UserHandle user = new UserHandle(getChangingUserId()); - final int n = mListeners.beginBroadcast(); - for (int i = 0; i < n; i++) { - IOnAppsChangedListener listener = mListeners.getBroadcastItem(i); - UserHandle listeningUser = (UserHandle) mListeners.getBroadcastCookie(i); - if (!isEnabledProfileOf(user, listeningUser, "onPackagesAvailable")) continue; - try { - listener.onPackagesAvailable(user, packages, isReplacing()); - } catch (RemoteException re) { - Slog.d(TAG, "Callback failed ", re); - } + public boolean isPackageEnabled(String packageName, UserHandle user) + throws RemoteException { + ensureInUserProfiles(user, "Cannot check package for unrelated profile " + user); + if (!isUserEnabled(user)) { + return false; } - mListeners.finishBroadcast(); - super.onPackagesAvailable(packages); + long ident = Binder.clearCallingIdentity(); + try { + IPackageManager pm = AppGlobals.getPackageManager(); + PackageInfo info = pm.getPackageInfo(packageName, 0, user.getIdentifier()); + return info != null && info.applicationInfo.enabled; + } finally { + Binder.restoreCallingIdentity(ident); + } } @Override - public void onPackagesUnavailable(String[] packages) { - UserHandle user = new UserHandle(getChangingUserId()); - final int n = mListeners.beginBroadcast(); - for (int i = 0; i < n; i++) { - IOnAppsChangedListener listener = mListeners.getBroadcastItem(i); - UserHandle listeningUser = (UserHandle) mListeners.getBroadcastCookie(i); - if (!isEnabledProfileOf(user, listeningUser, "onPackagesUnavailable")) continue; - try { - listener.onPackagesUnavailable(user, packages, isReplacing()); - } catch (RemoteException re) { - Slog.d(TAG, "Callback failed ", re); - } + public boolean isActivityEnabled(ComponentName component, UserHandle user) + throws RemoteException { + ensureInUserProfiles(user, "Cannot check component for unrelated profile " + user); + if (!isUserEnabled(user)) { + return false; } - mListeners.finishBroadcast(); - super.onPackagesUnavailable(packages); + long ident = Binder.clearCallingIdentity(); + try { + IPackageManager pm = AppGlobals.getPackageManager(); + ActivityInfo info = pm.getActivityInfo(component, 0, user.getIdentifier()); + return info != null && info.isEnabled(); + } finally { + Binder.restoreCallingIdentity(ident); + } } - } - - class PackageCallbackList extends RemoteCallbackList { @Override - public void onCallbackDied(T callback, Object cookie) { - checkCallbackCount(); + public void startActivityAsUser(ComponentName component, Rect sourceBounds, + Bundle opts, UserHandle user) throws RemoteException { + ensureInUserProfiles(user, "Cannot start activity for unrelated profile " + user); + if (!isUserEnabled(user)) { + throw new IllegalStateException("Cannot start activity for disabled profile " + user); + } + + Intent launchIntent = new Intent(Intent.ACTION_MAIN); + launchIntent.addCategory(Intent.CATEGORY_LAUNCHER); + launchIntent.setComponent(component); + launchIntent.setSourceBounds(sourceBounds); + launchIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + + long ident = Binder.clearCallingIdentity(); + try { + mContext.startActivityAsUser(launchIntent, opts, user); + } finally { + Binder.restoreCallingIdentity(ident); + } + } + + private class MyPackageMonitor extends PackageMonitor { + + /** Checks if user is a profile of or same as listeningUser. + * and the user is enabled. */ + private boolean isEnabledProfileOf(UserHandle user, UserHandle listeningUser, + String debugMsg) { + if (user.getIdentifier() == listeningUser.getIdentifier()) { + if (DEBUG) Log.d(TAG, "Delivering msg to same user " + debugMsg); + return true; + } + long ident = Binder.clearCallingIdentity(); + try { + UserInfo userInfo = mUm.getUserInfo(user.getIdentifier()); + UserInfo listeningUserInfo = mUm.getUserInfo(listeningUser.getIdentifier()); + if (userInfo == null || listeningUserInfo == null + || userInfo.profileGroupId == UserInfo.NO_PROFILE_GROUP_ID + || userInfo.profileGroupId != listeningUserInfo.profileGroupId + || !userInfo.isEnabled()) { + if (DEBUG) { + Log.d(TAG, "Not delivering msg from " + user + " to " + listeningUser + ":" + + debugMsg); + } + return false; + } else { + if (DEBUG) { + Log.d(TAG, "Delivering msg from " + user + " to " + listeningUser + ":" + + debugMsg); + } + return true; + } + } finally { + Binder.restoreCallingIdentity(ident); + } + } + + @Override + public void onPackageAdded(String packageName, int uid) { + UserHandle user = new UserHandle(getChangingUserId()); + final int n = mListeners.beginBroadcast(); + for (int i = 0; i < n; i++) { + IOnAppsChangedListener listener = mListeners.getBroadcastItem(i); + UserHandle listeningUser = (UserHandle) mListeners.getBroadcastCookie(i); + if (!isEnabledProfileOf(user, listeningUser, "onPackageAdded")) continue; + try { + listener.onPackageAdded(user, packageName); + } catch (RemoteException re) { + Slog.d(TAG, "Callback failed ", re); + } + } + mListeners.finishBroadcast(); + + super.onPackageAdded(packageName, uid); + } + + @Override + public void onPackageRemoved(String packageName, int uid) { + UserHandle user = new UserHandle(getChangingUserId()); + final int n = mListeners.beginBroadcast(); + for (int i = 0; i < n; i++) { + IOnAppsChangedListener listener = mListeners.getBroadcastItem(i); + UserHandle listeningUser = (UserHandle) mListeners.getBroadcastCookie(i); + if (!isEnabledProfileOf(user, listeningUser, "onPackageRemoved")) continue; + try { + listener.onPackageRemoved(user, packageName); + } catch (RemoteException re) { + Slog.d(TAG, "Callback failed ", re); + } + } + mListeners.finishBroadcast(); + + super.onPackageRemoved(packageName, uid); + } + + @Override + public void onPackageModified(String packageName) { + UserHandle user = new UserHandle(getChangingUserId()); + final int n = mListeners.beginBroadcast(); + for (int i = 0; i < n; i++) { + IOnAppsChangedListener listener = mListeners.getBroadcastItem(i); + UserHandle listeningUser = (UserHandle) mListeners.getBroadcastCookie(i); + if (!isEnabledProfileOf(user, listeningUser, "onPackageModified")) continue; + try { + listener.onPackageChanged(user, packageName); + } catch (RemoteException re) { + Slog.d(TAG, "Callback failed ", re); + } + } + mListeners.finishBroadcast(); + + super.onPackageModified(packageName); + } + + @Override + public void onPackagesAvailable(String[] packages) { + UserHandle user = new UserHandle(getChangingUserId()); + final int n = mListeners.beginBroadcast(); + for (int i = 0; i < n; i++) { + IOnAppsChangedListener listener = mListeners.getBroadcastItem(i); + UserHandle listeningUser = (UserHandle) mListeners.getBroadcastCookie(i); + if (!isEnabledProfileOf(user, listeningUser, "onPackagesAvailable")) continue; + try { + listener.onPackagesAvailable(user, packages, isReplacing()); + } catch (RemoteException re) { + Slog.d(TAG, "Callback failed ", re); + } + } + mListeners.finishBroadcast(); + + super.onPackagesAvailable(packages); + } + + @Override + public void onPackagesUnavailable(String[] packages) { + UserHandle user = new UserHandle(getChangingUserId()); + final int n = mListeners.beginBroadcast(); + for (int i = 0; i < n; i++) { + IOnAppsChangedListener listener = mListeners.getBroadcastItem(i); + UserHandle listeningUser = (UserHandle) mListeners.getBroadcastCookie(i); + if (!isEnabledProfileOf(user, listeningUser, "onPackagesUnavailable")) continue; + try { + listener.onPackagesUnavailable(user, packages, isReplacing()); + } catch (RemoteException re) { + Slog.d(TAG, "Callback failed ", re); + } + } + mListeners.finishBroadcast(); + + super.onPackagesUnavailable(packages); + } + + } + + class PackageCallbackList extends RemoteCallbackList { + @Override + public void onCallbackDied(T callback, Object cookie) { + checkCallbackCount(); + } } } -} +} \ No newline at end of file diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java index 27098e7ae08d2..9174c0ccf4403 100644 --- a/services/java/com/android/server/SystemServer.java +++ b/services/java/com/android/server/SystemServer.java @@ -998,8 +998,7 @@ public final class SystemServer { try { Slog.i(TAG, "LauncherAppsService"); - LauncherAppsService las = new LauncherAppsService(context); - ServiceManager.addService(Context.LAUNCHER_APPS_SERVICE, las); + mSystemServiceManager.startService(LauncherAppsService.class); } catch (Throwable t) { reportWtf("starting LauncherAppsService", t); }