diff options
| author | Hung-ying Tyan <tyanh@google.com> | 2011-01-19 16:48:38 +0800 |
|---|---|---|
| committer | Hung-ying Tyan <tyanh@google.com> | 2011-01-20 12:51:43 +0800 |
| commit | 6b818de29a5c273aad99eb3f5456f88169c911f4 (patch) | |
| tree | 13f303f6b238e6f932e16b16e9b9ffa2fc306dba /vpn/java/android | |
| parent | e25c4d1077071e33795ec0316b504f6cd2a0ba08 (diff) | |
| download | frameworks_base-6b818de29a5c273aad99eb3f5456f88169c911f4.zip frameworks_base-6b818de29a5c273aad99eb3f5456f88169c911f4.tar.gz frameworks_base-6b818de29a5c273aad99eb3f5456f88169c911f4.tar.bz2 | |
Make VpnService synchronous API.
This eases VpnSettings on dealing with multiple-activity-instance problem
(i.e., SettingsActivity and VpnSettingsActivity).
+ Most of the code is moved from the VpnServices package to vpn/java/.
+ VpnManager and VpnServiceBinder are revised to provide synchronous API.
+ Add a new method isIdle() to IVpnService.aidl.
Related bug: 3293236 (need to deal with multiple-activity-instance problem)
Change-Id: I03afa3b3af85d7b4ef800683cd075c356a9266c4
Diffstat (limited to 'vpn/java/android')
| -rw-r--r-- | vpn/java/android/net/vpn/IVpnService.aidl | 13 | ||||
| -rw-r--r-- | vpn/java/android/net/vpn/VpnManager.java | 106 |
2 files changed, 82 insertions, 37 deletions
diff --git a/vpn/java/android/net/vpn/IVpnService.aidl b/vpn/java/android/net/vpn/IVpnService.aidl index fedccb0..6bf3edd 100644 --- a/vpn/java/android/net/vpn/IVpnService.aidl +++ b/vpn/java/android/net/vpn/IVpnService.aidl @@ -24,10 +24,11 @@ import android.net.vpn.VpnProfile; */ interface IVpnService { /** - * Sets up the VPN connection. + * Sets up a VPN connection. * @param profile the profile object * @param username the username for authentication * @param password the corresponding password for authentication + * @return true if VPN is successfully connected */ boolean connect(in VpnProfile profile, String username, String password); @@ -37,7 +38,13 @@ interface IVpnService { void disconnect(); /** - * Makes the service broadcast the connectivity state. + * Gets the the current connection state. */ - void checkStatus(in VpnProfile profile); + String getState(in VpnProfile profile); + + /** + * Returns the idle state. + * @return true if the system is not connecting/connected to a VPN + */ + boolean isIdle(); } diff --git a/vpn/java/android/net/vpn/VpnManager.java b/vpn/java/android/net/vpn/VpnManager.java index ce40b5d..02486bb 100644 --- a/vpn/java/android/net/vpn/VpnManager.java +++ b/vpn/java/android/net/vpn/VpnManager.java @@ -16,17 +16,19 @@ package android.net.vpn; -import java.io.File; - import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; -import android.content.ServiceConnection; import android.os.Environment; +import android.os.IBinder; +import android.os.RemoteException; +import android.os.ServiceManager; import android.os.SystemProperties; import android.util.Log; +import com.android.server.vpn.VpnServiceBinder; + /** * The class provides interface to manage all VPN-related tasks, including: * <ul> @@ -40,8 +42,6 @@ import android.util.Log; * {@hide} */ public class VpnManager { - // Action for broadcasting a connectivity state. - private static final String ACTION_VPN_CONNECTIVITY = "vpn.connectivity"; /** Key to the profile name of a connectivity broadcast event. */ public static final String BROADCAST_PROFILE_NAME = "profile_name"; /** Key to the connectivity state of a connectivity broadcast event. */ @@ -74,8 +74,10 @@ public class VpnManager { private static final String PACKAGE_PREFIX = VpnManager.class.getPackage().getName() + "."; - // Action to start VPN service - private static final String ACTION_VPN_SERVICE = PACKAGE_PREFIX + "SERVICE"; + // Action for broadcasting a connectivity state. + private static final String ACTION_VPN_CONNECTIVITY = "vpn.connectivity"; + + private static final String VPN_SERVICE_NAME = "vpn"; // Action to start VPN settings private static final String ACTION_VPN_SETTINGS = @@ -96,13 +98,76 @@ public class VpnManager { return VpnType.values(); } + public static void startVpnService(Context c) { + ServiceManager.addService(VPN_SERVICE_NAME, new VpnServiceBinder(c)); + } + private Context mContext; + private IVpnService mVpnService; /** * Creates a manager object with the specified context. */ public VpnManager(Context c) { mContext = c; + createVpnServiceClient(); + } + + private void createVpnServiceClient() { + IBinder b = ServiceManager.getService(VPN_SERVICE_NAME); + mVpnService = IVpnService.Stub.asInterface(b); + } + + /** + * Sets up a VPN connection. + * @param profile the profile object + * @param username the username for authentication + * @param password the corresponding password for authentication + * @return true if VPN is successfully connected + */ + public boolean connect(VpnProfile p, String username, String password) { + try { + return mVpnService.connect(p, username, password); + } catch (RemoteException e) { + Log.e(TAG, "connect()", e); + return false; + } + } + + /** + * Tears down the VPN connection. + */ + public void disconnect() { + try { + mVpnService.disconnect(); + } catch (RemoteException e) { + Log.e(TAG, "disconnect()", e); + } + } + + /** + * Gets the the current connection state. + */ + public VpnState getState(VpnProfile p) { + try { + return Enum.valueOf(VpnState.class, mVpnService.getState(p)); + } catch (RemoteException e) { + Log.e(TAG, "getState()", e); + return VpnState.IDLE; + } + } + + /** + * Returns the idle state. + * @return true if the system is not connecting/connected to a VPN + */ + public boolean isIdle() { + try { + return mVpnService.isIdle(); + } catch (RemoteException e) { + Log.e(TAG, "isIdle()", e); + return true; + } } /** @@ -134,33 +199,6 @@ public class VpnManager { } } - /** - * Starts the VPN service to establish VPN connection. - */ - public void startVpnService() { - mContext.startService(new Intent(ACTION_VPN_SERVICE)); - } - - /** - * Stops the VPN service. - */ - public void stopVpnService() { - mContext.stopService(new Intent(ACTION_VPN_SERVICE)); - } - - /** - * Binds the specified ServiceConnection with the VPN service. - */ - public boolean bindVpnService(ServiceConnection c) { - if (!mContext.bindService(new Intent(ACTION_VPN_SERVICE), c, 0)) { - Log.w(TAG, "failed to connect to VPN service"); - return false; - } else { - Log.d(TAG, "succeeded to connect to VPN service"); - return true; - } - } - /** Broadcasts the connectivity state of the specified profile. */ public void broadcastConnectivity(String profileName, VpnState s) { broadcastConnectivity(profileName, s, VPN_ERROR_NO_ERROR); |
