summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChad Brubaker <cbrubaker@google.com>2013-07-16 18:59:12 -0700
committerChad Brubaker <cbrubaker@google.com>2013-07-16 18:59:12 -0700
commitbf6ff2c025405a3af496fe558dfc4468a9b45cc8 (patch)
tree0a2ab3144251b9d9b6b60ae2b7c149c88e563222
parentd1c87546b37658fbc38cb33504cc726a07e0c4ea (diff)
Support multiple Vpn ManageDialogs
Move away from storing the configs in the Intent to prevent issues with PendingIntents and multiple configs. The Dialog now queries ConnectivityService for the configuration to display in the management dialog. Change-Id: I0e0ef52db840152914d117a24f776d8106e836ff
-rw-r--r--core/java/android/net/IConnectivityManager.aidl2
-rw-r--r--core/java/com/android/internal/net/VpnConfig.java8
-rw-r--r--packages/VpnDialogs/src/com/android/vpndialogs/ManageDialog.java9
-rw-r--r--services/java/com/android/server/ConnectivityService.java14
-rw-r--r--services/java/com/android/server/connectivity/Vpn.java10
5 files changed, 36 insertions, 7 deletions
diff --git a/core/java/android/net/IConnectivityManager.aidl b/core/java/android/net/IConnectivityManager.aidl
index d537b32ff16b..0a476eb88ff7 100644
--- a/core/java/android/net/IConnectivityManager.aidl
+++ b/core/java/android/net/IConnectivityManager.aidl
@@ -124,6 +124,8 @@ interface IConnectivityManager
ParcelFileDescriptor establishVpn(in VpnConfig config);
+ VpnConfig getVpnConfig();
+
void startLegacyVpn(in VpnProfile profile);
LegacyVpnInfo getLegacyVpnInfo();
diff --git a/core/java/com/android/internal/net/VpnConfig.java b/core/java/com/android/internal/net/VpnConfig.java
index abf99a339f88..98599d01873f 100644
--- a/core/java/com/android/internal/net/VpnConfig.java
+++ b/core/java/com/android/internal/net/VpnConfig.java
@@ -21,6 +21,7 @@ import android.content.Context;
import android.content.Intent;
import android.os.Parcel;
import android.os.Parcelable;
+import android.os.UserHandle;
import android.net.RouteInfo;
import android.net.LinkAddress;
@@ -50,15 +51,12 @@ public class VpnConfig implements Parcelable {
return intent;
}
- public static PendingIntent getIntentForStatusPanel(Context context, VpnConfig config) {
- Preconditions.checkNotNull(config);
-
+ public static PendingIntent getIntentForStatusPanel(Context context) {
Intent intent = new Intent();
intent.setClassName(DIALOGS_PACKAGE, DIALOGS_PACKAGE + ".ManageDialog");
- intent.putExtra("config", config);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_NO_HISTORY |
Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
- return PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);
+ return PendingIntent.getActivityAsUser(context, 0, intent, 0, null, UserHandle.CURRENT);
}
public String user;
diff --git a/packages/VpnDialogs/src/com/android/vpndialogs/ManageDialog.java b/packages/VpnDialogs/src/com/android/vpndialogs/ManageDialog.java
index 96de1b9792ae..42b8cce05d6a 100644
--- a/packages/VpnDialogs/src/com/android/vpndialogs/ManageDialog.java
+++ b/packages/VpnDialogs/src/com/android/vpndialogs/ManageDialog.java
@@ -65,11 +65,18 @@ public class ManageDialog extends AlertActivity implements
}
try {
- mConfig = getIntent().getParcelableExtra("config");
mService = IConnectivityManager.Stub.asInterface(
ServiceManager.getService(Context.CONNECTIVITY_SERVICE));
+ mConfig = mService.getVpnConfig();
+
+ // mConfig can be null if we are a restricted user, in that case don't show this dialog
+ if (mConfig == null) {
+ finish();
+ return;
+ }
+
View view = View.inflate(this, R.layout.manage, null);
if (mConfig.session != null) {
((TextView) view.findViewById(R.id.session)).setText(mConfig.session);
diff --git a/services/java/com/android/server/ConnectivityService.java b/services/java/com/android/server/ConnectivityService.java
index 476a6fdffb1a..3a4b7e382f57 100644
--- a/services/java/com/android/server/ConnectivityService.java
+++ b/services/java/com/android/server/ConnectivityService.java
@@ -3426,6 +3426,20 @@ public class ConnectivityService extends IConnectivityManager.Stub {
}
/**
+ * Returns the information of the ongoing VPN. This method is used by VpnDialogs and
+ * not available in ConnectivityManager.
+ * Permissions are checked in Vpn class.
+ * @hide
+ */
+ @Override
+ public VpnConfig getVpnConfig() {
+ int user = UserHandle.getUserId(Binder.getCallingUid());
+ synchronized(mVpns) {
+ return mVpns.get(user).getVpnConfig();
+ }
+ }
+
+ /**
* Callback for VPN subsystem. Currently VPN is not adapted to the service
* through NetworkStateTracker since it works differently. For example, it
* needs to override DNS servers but never takes the default routes. It
diff --git a/services/java/com/android/server/connectivity/Vpn.java b/services/java/com/android/server/connectivity/Vpn.java
index 3a2391f1abca..8cc5b4f69cd9 100644
--- a/services/java/com/android/server/connectivity/Vpn.java
+++ b/services/java/com/android/server/connectivity/Vpn.java
@@ -519,6 +519,14 @@ public class Vpn extends BaseNetworkStateTracker {
}
}
+ /**
+ * Return the configuration of the currently running VPN.
+ */
+ public VpnConfig getVpnConfig() {
+ enforceControlPermission();
+ return mConfig;
+ }
+
@Deprecated
public synchronized void interfaceStatusChanged(String iface, boolean up) {
try {
@@ -610,7 +618,7 @@ public class Vpn extends BaseNetworkStateTracker {
private void showNotification(String label, Bitmap icon, int user) {
if (!mEnableNotif) return;
- mStatusIntent = VpnConfig.getIntentForStatusPanel(mContext, mConfig);
+ mStatusIntent = VpnConfig.getIntentForStatusPanel(mContext);
NotificationManager nm = (NotificationManager)
mContext.getSystemService(Context.NOTIFICATION_SERVICE);