summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/jni/android_os_HwBinder.cpp7
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/QSTileHost.java20
-rw-r--r--services/core/Android.mk1
-rw-r--r--services/core/java/com/android/server/pm/Installer.java24
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,