summaryrefslogtreecommitdiffstats
path: root/services/java/com
diff options
context:
space:
mode:
Diffstat (limited to 'services/java/com')
-rw-r--r--services/java/com/android/server/am/ActivityManagerService.java3
-rw-r--r--services/java/com/android/server/connectivity/Vpn.java55
-rw-r--r--services/java/com/android/server/pm/PackageManagerService.java4
-rw-r--r--services/java/com/android/server/pm/Settings.java2
4 files changed, 36 insertions, 28 deletions
diff --git a/services/java/com/android/server/am/ActivityManagerService.java b/services/java/com/android/server/am/ActivityManagerService.java
index f1098a8..4ec71c1 100644
--- a/services/java/com/android/server/am/ActivityManagerService.java
+++ b/services/java/com/android/server/am/ActivityManagerService.java
@@ -1933,6 +1933,9 @@ public final class ActivityManagerService extends ActivityManagerNative
int debugFlags = 0;
if ((app.info.flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0) {
debugFlags |= Zygote.DEBUG_ENABLE_DEBUGGER;
+ // Also turn on CheckJNI for debuggable apps. It's quite
+ // awkward to turn on otherwise.
+ debugFlags |= Zygote.DEBUG_ENABLE_CHECKJNI;
}
// Run the app in safe mode if its manifest requests so or the
// system is booted in safe mode.
diff --git a/services/java/com/android/server/connectivity/Vpn.java b/services/java/com/android/server/connectivity/Vpn.java
index 372ba85..035a667 100644
--- a/services/java/com/android/server/connectivity/Vpn.java
+++ b/services/java/com/android/server/connectivity/Vpn.java
@@ -18,7 +18,6 @@ package com.android.server.connectivity;
import android.app.Notification;
import android.app.NotificationManager;
-import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ApplicationInfo;
@@ -64,29 +63,40 @@ public class Vpn extends INetworkManagementEventObserver.Stub {
* @return The name of the current prepared package.
*/
public synchronized String prepare(String packageName) {
-
- // TODO: Check if the caller is VpnDialogs.
-
+ // Return the current prepared package if the new one is null.
if (packageName == null) {
return mPackageName;
}
- // Check the permission of the given application.
+ // Check the permission of the caller.
PackageManager pm = mContext.getPackageManager();
- if (pm.checkPermission(VPN, packageName) != PackageManager.PERMISSION_GRANTED) {
+ VpnConfig.enforceCallingPackage(pm.getNameForUid(Binder.getCallingUid()));
+
+ // Check the permission of the given package.
+ if (packageName.isEmpty()) {
+ packageName = null;
+ } else if (pm.checkPermission(VPN, packageName) != PackageManager.PERMISSION_GRANTED) {
throw new SecurityException(packageName + " does not have " + VPN);
}
// Reset the interface and hide the notification.
if (mInterfaceName != null) {
nativeReset(mInterfaceName);
- mInterfaceName = null;
+ mCallback.restore();
hideNotification();
- // TODO: Send out a broadcast.
+ mInterfaceName = null;
}
+ // Notify the package being revoked.
+ if (mPackageName != null) {
+ Intent intent = new Intent(VpnConfig.ACTION_VPN_REVOKED);
+ intent.setPackage(mPackageName);
+ intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY);
+ mContext.sendBroadcast(intent);
+ }
+
+ Log.i(TAG, "Switched from " + mPackageName + " to " + packageName);
mPackageName = packageName;
- Log.i(TAG, "Prepared for " + packageName);
return mPackageName;
}
@@ -118,10 +128,10 @@ public class Vpn extends INetworkManagementEventObserver.Stub {
try {
app = pm.getApplicationInfo(mPackageName, 0);
} catch (Exception e) {
- throw new SecurityException("Not prepared");
+ return null;
}
if (Binder.getCallingUid() != app.uid) {
- throw new SecurityException("Not prepared");
+ return null;
}
// Create and configure the interface.
@@ -148,7 +158,9 @@ public class Vpn extends INetworkManagementEventObserver.Stub {
String dnsServers = (config.dnsServers == null) ? "" : config.dnsServers.trim();
mCallback.override(dnsServers.isEmpty() ? null : dnsServers.split(" "));
- showNotification(pm, app, config.sessionName);
+ config.packageName = mPackageName;
+ config.interfaceName = mInterfaceName;
+ showNotification(pm, app, config);
return descriptor;
}
@@ -169,7 +181,7 @@ public class Vpn extends INetworkManagementEventObserver.Stub {
}
}
- private void showNotification(PackageManager pm, ApplicationInfo app, String sessionName) {
+ private void showNotification(PackageManager pm, ApplicationInfo app, VpnConfig config) {
NotificationManager nm = (NotificationManager)
mContext.getSystemService(Context.NOTIFICATION_SERVICE);
@@ -190,20 +202,9 @@ public class Vpn extends INetworkManagementEventObserver.Stub {
// Load the label.
String label = app.loadLabel(pm).toString();
- // Build the intent.
- // TODO: move these into VpnBuilder.
- Intent intent = new Intent();
- intent.setClassName("com.android.vpndialogs",
- "com.android.vpndialogs.ManageDialog");
- intent.putExtra("packageName", mPackageName);
- intent.putExtra("interfaceName", mInterfaceName);
- intent.putExtra("session", sessionName);
- intent.putExtra("startTime", android.os.SystemClock.elapsedRealtime());
- intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
-
// Build the notification.
- String text = (sessionName == null) ? mContext.getString(R.string.vpn_text) :
- mContext.getString(R.string.vpn_text_long, sessionName);
+ String text = (config.sessionName == null) ? mContext.getString(R.string.vpn_text) :
+ mContext.getString(R.string.vpn_text_long, config.sessionName);
long identity = Binder.clearCallingIdentity();
Notification notification = new Notification.Builder(mContext)
.setSmallIcon(R.drawable.vpn_connected)
@@ -211,7 +212,7 @@ public class Vpn extends INetworkManagementEventObserver.Stub {
.setTicker(mContext.getString(R.string.vpn_ticker, label))
.setContentTitle(mContext.getString(R.string.vpn_title, label))
.setContentText(text)
- .setContentIntent(PendingIntent.getActivity(mContext, 0, intent, 0))
+ .setContentIntent(VpnConfig.getIntentForNotification(mContext, config))
.setDefaults(Notification.DEFAULT_ALL)
.setOngoing(true)
.getNotification();
diff --git a/services/java/com/android/server/pm/PackageManagerService.java b/services/java/com/android/server/pm/PackageManagerService.java
index e1fbe1c..5a9dae9 100644
--- a/services/java/com/android/server/pm/PackageManagerService.java
+++ b/services/java/com/android/server/pm/PackageManagerService.java
@@ -18,6 +18,7 @@ package com.android.server.pm;
import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DEFAULT;
import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DISABLED;
+import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER;
import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_ENABLED;
import com.android.internal.app.IMediaContainerService;
@@ -7048,7 +7049,8 @@ public class PackageManagerService extends IPackageManager.Stub {
final String packageName, String className, int newState, final int flags) {
if (!(newState == COMPONENT_ENABLED_STATE_DEFAULT
|| newState == COMPONENT_ENABLED_STATE_ENABLED
- || newState == COMPONENT_ENABLED_STATE_DISABLED)) {
+ || newState == COMPONENT_ENABLED_STATE_DISABLED
+ || newState == COMPONENT_ENABLED_STATE_DISABLED_USER)) {
throw new IllegalArgumentException("Invalid new component state: "
+ newState);
}
diff --git a/services/java/com/android/server/pm/Settings.java b/services/java/com/android/server/pm/Settings.java
index 2720bf8..5ed7988 100644
--- a/services/java/com/android/server/pm/Settings.java
+++ b/services/java/com/android/server/pm/Settings.java
@@ -18,6 +18,7 @@ package com.android.server.pm;
import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DEFAULT;
import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DISABLED;
+import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER;
import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_ENABLED;
import com.android.internal.util.FastXmlSerializer;
@@ -1912,6 +1913,7 @@ final class Settings {
return false;
}
if (packageSettings.enabled == COMPONENT_ENABLED_STATE_DISABLED
+ || packageSettings.enabled == COMPONENT_ENABLED_STATE_DISABLED_USER
|| (packageSettings.pkg != null && !packageSettings.pkg.applicationInfo.enabled
&& packageSettings.enabled == COMPONENT_ENABLED_STATE_DEFAULT)) {
return false;