diff options
-rw-r--r-- | core/jni/android_os_HwBinder.cpp | 7 | ||||
-rw-r--r-- | packages/SystemUI/src/com/android/systemui/statusbar/phone/QSTileHost.java | 20 | ||||
-rw-r--r-- | services/core/Android.mk | 1 | ||||
-rw-r--r-- | services/core/java/com/android/server/pm/Installer.java | 24 |
4 files changed, 44 insertions, 8 deletions
diff --git a/core/jni/android_os_HwBinder.cpp b/core/jni/android_os_HwBinder.cpp index 23a988a3dcc0..740b24d645a8 100644 --- a/core/jni/android_os_HwBinder.cpp +++ b/core/jni/android_os_HwBinder.cpp @@ -241,7 +241,14 @@ static void JHwBinder_native_registerService( using android::hidl::manager::V1_0::IServiceManager; sp<hardware::IBinder> binder = JHwBinder::GetNativeContext(env, thiz); + sp<hidl::base::V1_0::IBase> base = hidl::base::V1_0::IHwBase::asInterface(binder); + if (base.get() == nullptr) { + LOG(ERROR) << "IBinder object cannot be casted to the base interface."; + signalExceptionForError(env, UNKNOWN_ERROR); + return; + } + bool ok = hardware::defaultServiceManager()->add( interfaceChain, serviceName, diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QSTileHost.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QSTileHost.java index fa5777570b5d..18a7c2fbc5a3 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QSTileHost.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QSTileHost.java @@ -335,16 +335,24 @@ public class QSTileHost implements QSTile.Host, Tunable { QSTile<?> tile = mTiles.get(tileSpec); if (tile != null && (!(tile instanceof CustomTile) || ((CustomTile) tile).getUser() == currentUser)) { - if (DEBUG) Log.d(TAG, "Adding " + tile); - tile.removeCallbacks(); - newTiles.put(tileSpec, tile); + if (tile.isAvailable()) { + if (DEBUG) Log.d(TAG, "Adding " + tile); + tile.removeCallbacks(); + newTiles.put(tileSpec, tile); + } else { + tile.destroy(); + } } else { if (DEBUG) Log.d(TAG, "Creating tile: " + tileSpec); try { tile = createTile(tileSpec); - if (tile != null && tile.isAvailable()) { - tile.setTileSpec(tileSpec); - newTiles.put(tileSpec, tile); + if (tile != null) { + if (tile.isAvailable()) { + tile.setTileSpec(tileSpec); + newTiles.put(tileSpec, tile); + } else { + tile.destroy(); + } } } catch (Throwable t) { Log.w(TAG, "Error creating tile for spec: " + tileSpec, t); diff --git a/services/core/Android.mk b/services/core/Android.mk index a5b1069974f2..b7a95c008b3f 100644 --- a/services/core/Android.mk +++ b/services/core/Android.mk @@ -12,6 +12,7 @@ LOCAL_SRC_FILES += \ java/com/android/server/am/EventLogTags.logtags \ ../../../../system/netd/server/binder/android/net/INetd.aidl \ ../../../../system/netd/server/binder/android/net/metrics/INetdEventListener.aidl \ + ../../../native/cmds/installd/binder/android/os/IInstalld.aidl \ LOCAL_AIDL_INCLUDES += \ system/netd/server/binder diff --git a/services/core/java/com/android/server/pm/Installer.java b/services/core/java/com/android/server/pm/Installer.java index 2e18b1c417fe..3dc8f54660e9 100644 --- a/services/core/java/com/android/server/pm/Installer.java +++ b/services/core/java/com/android/server/pm/Installer.java @@ -20,6 +20,10 @@ import android.annotation.Nullable; import android.content.Context; import android.content.pm.PackageStats; import android.os.Build; +import android.os.IInstalld; +import android.os.RemoteException; +import android.os.ServiceManager; +import android.os.ServiceSpecificException; import android.util.Slog; import com.android.internal.os.InstallerConnection; @@ -33,6 +37,8 @@ import java.util.Arrays; public final class Installer extends SystemService { private static final String TAG = "Installer"; + private static final boolean USE_BINDER = true; + /* *************************************************************************** * IMPORTANT: These values are passed to native code. Keep them in sync with * frameworks/native/cmds/installd/installd.h @@ -55,10 +61,13 @@ public final class Installer extends SystemService { public static final int FLAG_CLEAR_CODE_CACHE_ONLY = 1 << 9; private final InstallerConnection mInstaller; + private final IInstalld mInstalld; public Installer(Context context) { super(context); mInstaller = new InstallerConnection(); + // TODO: reconnect if installd restarts + mInstalld = IInstalld.Stub.asInterface(ServiceManager.getService("installd")); } // Package-private installer that accepts a custom InstallerConnection. Used for @@ -66,6 +75,8 @@ public final class Installer extends SystemService { Installer(Context context, InstallerConnection connection) { super(context); mInstaller = connection; + // TODO: reconnect if installd restarts + mInstalld = IInstalld.Stub.asInterface(ServiceManager.getService("installd")); } /** @@ -84,8 +95,17 @@ public final class Installer extends SystemService { public void createAppData(String uuid, String pkgname, int userid, int flags, int appid, String seinfo, int targetSdkVersion) throws InstallerException { - mInstaller.execute("create_app_data", uuid, pkgname, userid, flags, appid, seinfo, - targetSdkVersion); + if (USE_BINDER) { + try { + mInstalld.createAppData(uuid, pkgname, userid, flags, appid, seinfo, + targetSdkVersion); + } catch (RemoteException | ServiceSpecificException e) { + throw new InstallerException(e.getMessage()); + } + } else { + mInstaller.execute("create_app_data", uuid, pkgname, userid, flags, appid, seinfo, + targetSdkVersion); + } } public void restoreconAppData(String uuid, String pkgname, int userid, int flags, int appid, |