summaryrefslogtreecommitdiffstats
path: root/core/java
diff options
context:
space:
mode:
authorJeff Sharkey <jsharkey@android.com>2012-08-04 15:24:58 -0700
committerJeff Sharkey <jsharkey@android.com>2012-08-23 16:41:06 -0700
commit899223b97c9b0ae56a8211a46600914c0ecfd854 (patch)
tree19b98a147be6309366dc1652f17e9fe3fe6f6e63 /core/java
parent2c1dfa29b40a988e3ea8f6922768465743aafddc (diff)
downloadframeworks_base-899223b97c9b0ae56a8211a46600914c0ecfd854.zip
frameworks_base-899223b97c9b0ae56a8211a46600914c0ecfd854.tar.gz
frameworks_base-899223b97c9b0ae56a8211a46600914c0ecfd854.tar.bz2
Begin moving VPN to NetworkStateTracker pattern.
Created base tracker that handles common bookkeeping, and move VPN to become a tracker. VPN status is now reflected in NetworkInfo, and is mapped to LegacyVpnInfo. Legacy VPN now "babysits" any init services it starts, watching for when they stop unexpectedly. Bug: 5756357 Change-Id: Iba7ec79da69469f6bd9a970cc39cf6b885b4c9c4
Diffstat (limited to 'core/java')
-rw-r--r--core/java/android/net/BaseNetworkStateTracker.java153
-rw-r--r--core/java/android/os/SystemService.java4
-rw-r--r--core/java/com/android/internal/net/LegacyVpnInfo.java25
-rw-r--r--core/java/com/android/internal/net/VpnConfig.java10
4 files changed, 189 insertions, 3 deletions
diff --git a/core/java/android/net/BaseNetworkStateTracker.java b/core/java/android/net/BaseNetworkStateTracker.java
new file mode 100644
index 0000000..99bd647
--- /dev/null
+++ b/core/java/android/net/BaseNetworkStateTracker.java
@@ -0,0 +1,153 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.net;
+
+import android.content.Context;
+import android.os.Handler;
+
+import com.android.internal.util.Preconditions;
+
+import java.util.concurrent.atomic.AtomicBoolean;
+
+/**
+ * Interface to control and observe state of a specific network, hiding
+ * network-specific details from {@link ConnectivityManager}. Surfaces events
+ * through the registered {@link Handler} to enable {@link ConnectivityManager}
+ * to respond to state changes over time.
+ *
+ * @hide
+ */
+public abstract class BaseNetworkStateTracker implements NetworkStateTracker {
+ // TODO: better document threading expectations
+ // TODO: migrate to make NetworkStateTracker abstract class
+
+ public static final String PROP_TCP_BUFFER_UNKNOWN = "net.tcp.buffersize.unknown";
+ public static final String PROP_TCP_BUFFER_WIFI = "net.tcp.buffersize.wifi";
+
+ protected Context mContext;
+ private Handler mTarget;
+
+ protected NetworkInfo mNetworkInfo;
+ protected LinkProperties mLinkProperties;
+ protected LinkCapabilities mLinkCapabilities;
+
+ private AtomicBoolean mTeardownRequested = new AtomicBoolean(false);
+ private AtomicBoolean mPrivateDnsRouteSet = new AtomicBoolean(false);
+ private AtomicBoolean mDefaultRouteSet = new AtomicBoolean(false);
+
+ public BaseNetworkStateTracker(int networkType) {
+ mNetworkInfo = new NetworkInfo(
+ networkType, -1, ConnectivityManager.getNetworkTypeName(networkType), null);
+ mLinkProperties = new LinkProperties();
+ mLinkCapabilities = new LinkCapabilities();
+ }
+
+ @Deprecated
+ protected Handler getTargetHandler() {
+ return mTarget;
+ }
+
+ protected final void dispatchStateChanged() {
+ // TODO: include snapshot of other fields when sending
+ mTarget.obtainMessage(EVENT_STATE_CHANGED, getNetworkInfo()).sendToTarget();
+ }
+
+ protected final void dispatchConfigurationChanged() {
+ // TODO: include snapshot of other fields when sending
+ mTarget.obtainMessage(EVENT_CONFIGURATION_CHANGED, getNetworkInfo()).sendToTarget();
+ }
+
+ @Override
+ public final void startMonitoring(Context context, Handler target) {
+ mContext = Preconditions.checkNotNull(context);
+ mTarget = Preconditions.checkNotNull(target);
+ startMonitoringInternal();
+ }
+
+ protected abstract void startMonitoringInternal();
+
+ @Override
+ public final NetworkInfo getNetworkInfo() {
+ return new NetworkInfo(mNetworkInfo);
+ }
+
+ @Override
+ public final LinkProperties getLinkProperties() {
+ return new LinkProperties(mLinkProperties);
+ }
+
+ @Override
+ public final LinkCapabilities getLinkCapabilities() {
+ return new LinkCapabilities(mLinkCapabilities);
+ }
+
+ @Override
+ public boolean setRadio(boolean turnOn) {
+ // Base tracker doesn't handle radios
+ return true;
+ }
+
+ @Override
+ public boolean isAvailable() {
+ return mNetworkInfo.isAvailable();
+ }
+
+ @Override
+ public void setUserDataEnable(boolean enabled) {
+ // Base tracker doesn't handle enabled flags
+ }
+
+ @Override
+ public void setPolicyDataEnable(boolean enabled) {
+ // Base tracker doesn't handle enabled flags
+ }
+
+ @Override
+ public boolean isPrivateDnsRouteSet() {
+ return mPrivateDnsRouteSet.get();
+ }
+
+ @Override
+ public void privateDnsRouteSet(boolean enabled) {
+ mPrivateDnsRouteSet.set(enabled);
+ }
+
+ @Override
+ public boolean isDefaultRouteSet() {
+ return mDefaultRouteSet.get();
+ }
+
+ @Override
+ public void defaultRouteSet(boolean enabled) {
+ mDefaultRouteSet.set(enabled);
+ }
+
+ @Override
+ public boolean isTeardownRequested() {
+ return mTeardownRequested.get();
+ }
+
+ @Override
+ public void setTeardownRequested(boolean isRequested) {
+ mTeardownRequested.set(isRequested);
+ }
+
+ @Override
+ public void setDependencyMet(boolean met) {
+ // Base tracker doesn't handle dependencies
+ }
+}
diff --git a/core/java/android/os/SystemService.java b/core/java/android/os/SystemService.java
index db58012..f345271 100644
--- a/core/java/android/os/SystemService.java
+++ b/core/java/android/os/SystemService.java
@@ -16,6 +16,8 @@
package android.os;
+import android.util.Slog;
+
import com.google.android.collect.Maps;
import java.util.HashMap;
@@ -81,7 +83,7 @@ public class SystemService {
if (state != null) {
return state;
} else {
- throw new IllegalStateException("Service " + service + " in unknown state " + rawState);
+ return State.STOPPED;
}
}
diff --git a/core/java/com/android/internal/net/LegacyVpnInfo.java b/core/java/com/android/internal/net/LegacyVpnInfo.java
index b620aba..d6f6d0b 100644
--- a/core/java/com/android/internal/net/LegacyVpnInfo.java
+++ b/core/java/com/android/internal/net/LegacyVpnInfo.java
@@ -17,8 +17,10 @@
package com.android.internal.net;
import android.app.PendingIntent;
+import android.net.NetworkInfo;
import android.os.Parcel;
import android.os.Parcelable;
+import android.util.Log;
/**
* A simple container used to carry information of the ongoing legacy VPN.
@@ -27,6 +29,8 @@ import android.os.Parcelable;
* @hide
*/
public class LegacyVpnInfo implements Parcelable {
+ private static final String TAG = "LegacyVpnInfo";
+
public static final int STATE_DISCONNECTED = 0;
public static final int STATE_INITIALIZING = 1;
public static final int STATE_CONNECTING = 2;
@@ -66,4 +70,25 @@ public class LegacyVpnInfo implements Parcelable {
return new LegacyVpnInfo[size];
}
};
+
+ /**
+ * Return best matching {@link LegacyVpnInfo} state based on given
+ * {@link NetworkInfo}.
+ */
+ public static int stateFromNetworkInfo(NetworkInfo info) {
+ switch (info.getDetailedState()) {
+ case CONNECTING:
+ return STATE_CONNECTING;
+ case CONNECTED:
+ return STATE_CONNECTED;
+ case DISCONNECTED:
+ return STATE_DISCONNECTED;
+ case FAILED:
+ return STATE_FAILED;
+ default:
+ Log.w(TAG, "Unhandled state " + info.getDetailedState()
+ + " ; treating as disconnected");
+ return STATE_DISCONNECTED;
+ }
+ }
}
diff --git a/core/java/com/android/internal/net/VpnConfig.java b/core/java/com/android/internal/net/VpnConfig.java
index d6f9e07..956653b 100644
--- a/core/java/com/android/internal/net/VpnConfig.java
+++ b/core/java/com/android/internal/net/VpnConfig.java
@@ -22,6 +22,8 @@ import android.content.Intent;
import android.os.Parcel;
import android.os.Parcelable;
+import com.android.internal.util.Preconditions;
+
import java.util.List;
/**
@@ -45,13 +47,14 @@ public class VpnConfig implements Parcelable {
}
public static PendingIntent getIntentForStatusPanel(Context context, VpnConfig config) {
+ Preconditions.checkNotNull(config);
+
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, (config == null) ?
- PendingIntent.FLAG_NO_CREATE : PendingIntent.FLAG_CANCEL_CURRENT);
+ return PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);
}
public String user;
@@ -64,6 +67,7 @@ public class VpnConfig implements Parcelable {
public List<String> searchDomains;
public PendingIntent configureIntent;
public long startTime = -1;
+ public boolean legacy;
@Override
public int describeContents() {
@@ -82,6 +86,7 @@ public class VpnConfig implements Parcelable {
out.writeStringList(searchDomains);
out.writeParcelable(configureIntent, flags);
out.writeLong(startTime);
+ out.writeInt(legacy ? 1 : 0);
}
public static final Parcelable.Creator<VpnConfig> CREATOR =
@@ -99,6 +104,7 @@ public class VpnConfig implements Parcelable {
config.searchDomains = in.createStringArrayList();
config.configureIntent = in.readParcelable(null);
config.startTime = in.readLong();
+ config.legacy = in.readInt() != 0;
return config;
}