ConnectivityServiceMock.java revision 4be10a245ce355d84d70e61cb63d29ed525b478a
16bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt/*
26bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt * Copyright (C) 2008 The Android Open Source Project
36bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt *
46bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt * Licensed under the Apache License, Version 2.0 (the "License");
56bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt * you may not use this file except in compliance with the License.
66bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt * You may obtain a copy of the License at
76bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt *
86bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt *      http://www.apache.org/licenses/LICENSE-2.0
96bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt *
106bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt * Unless required by applicable law or agreed to in writing, software
116bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt * distributed under the License is distributed on an "AS IS" BASIS,
126bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
136bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt * See the License for the specific language governing permissions and
146bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt * limitations under the License.
156bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt */
166bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt
176bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwaltpackage com.android.internal.telephony.mocks;
186bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt
196bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwaltimport static android.Manifest.permission.RECEIVE_DATA_ACTIVITY_CHANGE;
206bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwaltimport static android.net.ConnectivityManager.CONNECTIVITY_ACTION;
216bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwaltimport static android.net.ConnectivityManager.NETID_UNSET;
226bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwaltimport static android.net.ConnectivityManager.TYPE_NONE;
236bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwaltimport static android.net.ConnectivityManager.TYPE_VPN;
246bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwaltimport static android.net.ConnectivityManager.getNetworkTypeName;
256bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwaltimport static android.net.ConnectivityManager.isNetworkTypeValid;
266bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwaltimport static android.net.NetworkCapabilities.NET_CAPABILITY_CAPTIVE_PORTAL;
276bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwaltimport static android.net.NetworkCapabilities.NET_CAPABILITY_INTERNET;
286bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwaltimport static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_METERED;
296bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwaltimport static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED;
306bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwaltimport static android.net.NetworkCapabilities.NET_CAPABILITY_VALIDATED;
316bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwaltimport static android.net.NetworkPolicyManager.RULE_ALLOW_ALL;
326bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwaltimport static android.net.NetworkPolicyManager.RULE_REJECT_ALL;
336bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwaltimport static android.net.NetworkPolicyManager.RULE_REJECT_METERED;
346bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt
356bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwaltimport android.annotation.Nullable;
366bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwaltimport android.app.AlarmManager;
376bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwaltimport android.app.BroadcastOptions;
386bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwaltimport android.app.Notification;
396bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwaltimport android.app.NotificationManager;
406bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwaltimport android.app.PendingIntent;
416bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwaltimport android.content.BroadcastReceiver;
426bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwaltimport android.content.ContentResolver;
436bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwaltimport android.content.Context;
446bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwaltimport android.content.Intent;
456bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwaltimport android.content.IntentFilter;
466bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwaltimport android.content.pm.PackageManager;
476bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwaltimport android.content.res.Configuration;
486bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwaltimport android.content.res.Resources;
496bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwaltimport android.database.ContentObserver;
506bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwaltimport android.net.ConnectivityManager;
516bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwaltimport android.net.ConnectivityManager.PacketKeepalive;
526bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwaltimport android.net.IConnectivityManager;
536bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwaltimport android.net.INetworkManagementEventObserver;
546bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwaltimport android.net.INetworkPolicyListener;
556bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwaltimport android.net.INetworkPolicyManager;
566bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwaltimport android.net.INetworkStatsService;
576bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwaltimport android.net.LinkProperties;
586bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwaltimport android.net.LinkProperties.CompareResult;
596bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwaltimport android.net.Network;
606bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwaltimport android.net.NetworkAgent;
616bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwaltimport android.net.NetworkCapabilities;
626bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwaltimport android.net.NetworkConfig;
636bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwaltimport android.net.NetworkInfo;
646bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwaltimport android.net.NetworkInfo.DetailedState;
656bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwaltimport android.net.NetworkMisc;
666bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwaltimport android.net.NetworkQuotaInfo;
676bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwaltimport android.net.NetworkRequest;
686bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwaltimport android.net.NetworkState;
696bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwaltimport android.net.NetworkUtils;
706bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwaltimport android.net.Proxy;
716bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwaltimport android.net.ProxyInfo;
726bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwaltimport android.net.RouteInfo;
736bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwaltimport android.net.UidRange;
746bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwaltimport android.net.Uri;
756bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwaltimport android.os.Binder;
766bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwaltimport android.os.Build;
776bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwaltimport android.os.Bundle;
786bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwaltimport android.os.FileUtils;
796bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwaltimport android.os.Handler;
806bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwaltimport android.os.HandlerThread;
816bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwaltimport android.os.IBinder;
826bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwaltimport android.os.INetworkManagementService;
836bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwaltimport android.os.Looper;
846bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwaltimport android.os.Message;
856bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwaltimport android.os.Messenger;
866bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwaltimport android.os.ParcelFileDescriptor;
876bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwaltimport android.os.PowerManager;
886bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwaltimport android.os.Process;
896bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwaltimport android.os.RemoteException;
906bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwaltimport android.os.ResultReceiver;
916bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwaltimport android.os.SystemClock;
926bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwaltimport android.os.SystemProperties;
936bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwaltimport android.os.UserHandle;
946bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwaltimport android.os.UserManager;
956bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwaltimport android.provider.Settings;
966bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwaltimport android.security.Credentials;
976bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwaltimport android.security.KeyStore;
986bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwaltimport android.telephony.TelephonyManager;
996bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwaltimport android.text.TextUtils;
1006bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwaltimport android.util.LocalLog;
1016bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwaltimport android.util.LocalLog.ReadOnlyLocalLog;
1026bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwaltimport android.util.Pair;
1036bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwaltimport android.util.Slog;
1046bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwaltimport android.util.SparseArray;
1056bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwaltimport android.util.SparseBooleanArray;
1066bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwaltimport android.util.SparseIntArray;
1076bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwaltimport android.util.Xml;
1086bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt
1096bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwaltimport com.android.internal.R;
1106bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwaltimport com.android.internal.annotations.GuardedBy;
1116bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwaltimport com.android.internal.annotations.VisibleForTesting;
1126bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwaltimport com.android.internal.net.LegacyVpnInfo;
1136bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwaltimport com.android.internal.net.VpnConfig;
1146bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwaltimport com.android.internal.net.VpnInfo;
1156bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwaltimport com.android.internal.net.VpnProfile;
1166bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwaltimport com.android.internal.util.AsyncChannel;
1176bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwaltimport com.android.server.connectivity.NetworkAgentInfo;
1186bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwaltimport com.android.server.connectivity.NetworkMonitor;
1196bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt
1206bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwaltimport java.io.File;
1216bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwaltimport java.io.FileDescriptor;
1226bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwaltimport java.io.FileNotFoundException;
1236bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwaltimport java.io.FileReader;
1246bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwaltimport java.io.IOException;
1256bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwaltimport java.io.PrintWriter;
1266bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwaltimport java.net.Inet4Address;
1276bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwaltimport java.net.InetAddress;
1286bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwaltimport java.net.UnknownHostException;
1296bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwaltimport java.util.ArrayDeque;
1306bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwaltimport java.util.ArrayList;
1316bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwaltimport java.util.Arrays;
1326bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwaltimport java.util.Collection;
1336bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwaltimport java.util.HashMap;
1346bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwaltimport java.util.HashSet;
1356bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwaltimport java.util.SortedSet;
1366bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwaltimport java.util.TreeSet;
1376bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwaltimport java.util.Iterator;
1386bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwaltimport java.util.List;
1396bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwaltimport java.util.Map;
1406bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwaltimport java.util.Objects;
1416bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwaltimport java.util.concurrent.atomic.AtomicInteger;
1426bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt
1436bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt/**
1446bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt * @hide
1456bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt */
1466bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwaltpublic class ConnectivityServiceMock extends IConnectivityManager.Stub
1476bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        implements PendingIntent.OnFinished {
1486bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    private static final String TAG = "ConnectivityServiceMock";
1496bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    private static final boolean DBG = true;
1506bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    private static final boolean VDBG = true;
1516bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt
1526bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    /**
1536bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt     * used internally when registering NetworkFactories
1546bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt     * obj = NetworkFactoryInfo
1556bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt     */
1566bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    private static final int EVENT_REGISTER_NETWORK_FACTORY = 17;
1576bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt
1586bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    /**
1596bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt     * used internally when registering NetworkAgents
1606bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt     * obj = Messenger
1616bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt     */
1626bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    private static final int EVENT_REGISTER_NETWORK_AGENT = 18;
1636bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt
1646bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    /**
1656bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt     * used to add a network request
1666bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt     * includes a NetworkRequestInfo
1676bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt     */
1686bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    private static final int EVENT_REGISTER_NETWORK_REQUEST = 19;
1696bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt
1706bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    /**
1716bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt     * used to add a network listener - no request
1726bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt     * includes a NetworkRequestInfo
1736bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt     */
1746bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    private static final int EVENT_REGISTER_NETWORK_LISTENER = 21;
1756bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt
1766bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    /**
1776bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt     * used to remove a network request, either a listener or a real request
1786bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt     * arg1 = UID of caller
1796bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt     * obj  = NetworkRequest
1806bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt     */
1816bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    private static final int EVENT_RELEASE_NETWORK_REQUEST = 22;
1826bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt
1836bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    /**
1846bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt     * used internally when registering NetworkFactories
1856bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt     * obj = Messenger
1866bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt     */
1876bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    private static final int EVENT_UNREGISTER_NETWORK_FACTORY = 23;
1886bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt
1896bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt
1906bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    private final HandlerThread mHandlerThread;
1916bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    /** Handler used for internal events. */
1926bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    final private InternalHandler mHandler;
1936bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    /** Handler used for incoming {@link NetworkStateTracker} events. */
1946bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    final private NetworkStateTrackerHandler mTrackerHandler;
1956bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt
1966bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    final private Context mContext;
1976bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt
1986bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    public ConnectivityServiceMock(Context context) {
1996bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        if (DBG) log("starting up");
2006bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt
2016bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        mContext = context;
2026bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        mHandlerThread = new HandlerThread("ConnectivityServiceMock");
2036bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        mHandlerThread.start();
2046bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        mHandler = new InternalHandler(mHandlerThread.getLooper());
2056bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        mTrackerHandler = new NetworkStateTrackerHandler(mHandlerThread.getLooper());
2066bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    }
2076bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt
2086bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    public void die() {
2096bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        // clean up threads/handlers
2106bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    }
2116bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt
2126bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    private class InternalHandler extends Handler {
2136bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        public InternalHandler(Looper looper) {
2146bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            super(looper);
2156bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        }
2166bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt
2176bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        @Override
2186bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        public void handleMessage(Message msg) {
2196bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            switch (msg.what) {
2206bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt                case EVENT_REGISTER_NETWORK_FACTORY: {
2216bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt                    handleRegisterNetworkFactory((NetworkFactoryInfo)msg.obj);
2226bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt                    break;
2236bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt                }
2246bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt                case EVENT_UNREGISTER_NETWORK_FACTORY: {
2256bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt                    handleUnregisterNetworkFactory((Messenger)msg.obj);
2266bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt                    break;
2276bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt                }
2286bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt                case EVENT_REGISTER_NETWORK_AGENT: {
2296bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt                    handleRegisterNetworkAgent((NetworkAgentInfo)msg.obj);
2306bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt                    break;
2316bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt                }
2326bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt                case EVENT_REGISTER_NETWORK_REQUEST:
2336bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt                case EVENT_REGISTER_NETWORK_LISTENER: {
2346bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt                    handleRegisterNetworkRequest((NetworkRequestInfo) msg.obj);
2356bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt                    break;
2366bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt                }
2376bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt                case EVENT_RELEASE_NETWORK_REQUEST: {
2386bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt                    handleReleaseNetworkRequest((NetworkRequest) msg.obj, msg.arg1);
2396bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt                    break;
2406bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt                }
2416bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            }
2426bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        }
2436bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    }
2446bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt
2456bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    private class NetworkStateTrackerHandler extends Handler {
2466bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        public NetworkStateTrackerHandler(Looper looper) {
2476bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            super(looper);
2486bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        }
2496bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt
2506bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        @Override
2516bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        public void handleMessage(Message msg) {
2526bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            NetworkInfo info;
2536bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            switch (msg.what) {
2546bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt                case AsyncChannel.CMD_CHANNEL_HALF_CONNECTED: {
2556bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt                    handleAsyncChannelHalfConnect(msg);
2566bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt                    break;
2576bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt                }
2586bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt                case AsyncChannel.CMD_CHANNEL_DISCONNECT: {
2596bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt                    NetworkAgentInfo nai = mNetworkAgentInfos.get(msg.replyTo);
2606bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt                    if (nai != null) nai.asyncChannel.disconnect();
2616bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt                    break;
2626bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt                }
2636bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt                case AsyncChannel.CMD_CHANNEL_DISCONNECTED: {
2646bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt                    handleAsyncChannelDisconnected(msg);
2656bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt                    break;
2666bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt                }
2676bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            }
2686bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        }
2696bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    }
2706bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt
2716bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    private boolean isRequest(NetworkRequest request) {
2726bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        return mNetworkRequests.get(request).isRequest;
2736bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    }
2746bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt
2756bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    private void handleAsyncChannelHalfConnect(Message msg) {
2766bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        AsyncChannel ac = (AsyncChannel) msg.obj;
2776bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        if (mNetworkFactoryInfos.containsKey(msg.replyTo)) {
2786bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            if (msg.arg1 == AsyncChannel.STATUS_SUCCESSFUL) {
2796bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt                if (VDBG) log("NetworkFactory connected");
2806bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt                // A network factory has connected.  Send it all current NetworkRequests.
2816bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt                for (NetworkRequestInfo nri : mNetworkRequests.values()) {
2826bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt                    if (nri.isRequest == false) continue;
2836bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt                    //NetworkAgentInfo nai = mNetworkForRequestId.get(nri.request.requestId);
2846bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt                    NetworkAgentInfo nai = null;
2856bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt                    ac.sendMessage(android.net.NetworkFactory.CMD_REQUEST_NETWORK,
2866bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt                            (nai != null ? nai.getCurrentScore() : 0), 0, nri.request);
2876bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt                }
2886bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            } else {
2896bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt                loge("Error connecting NetworkFactory");
2906bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt                mNetworkFactoryInfos.remove(msg.obj);
2916bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            }
2926bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        } else if (mNetworkAgentInfos.containsKey(msg.replyTo)) {
2936bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            if (msg.arg1 == AsyncChannel.STATUS_SUCCESSFUL) {
2946bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt                if (VDBG) log("NetworkAgent connected");
2956bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt                // A network agent has requested a connection.  Establish the connection.
2966bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt                mNetworkAgentInfos.get(msg.replyTo).asyncChannel.
2976bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt                        sendMessage(AsyncChannel.CMD_CHANNEL_FULL_CONNECTION);
2986bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            } else {
2996bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt                loge("Error connecting NetworkAgent");
3006bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt                NetworkAgentInfo nai = mNetworkAgentInfos.remove(msg.replyTo);
3016bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt                //if (nai != null) {
3026bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt                //    final boolean wasDefault = isDefaultNetwork(nai);
3036bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt                //    synchronized (mNetworkForNetId) {
3046bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt                //        mNetworkForNetId.remove(nai.network.netId);
3056bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt                //        mNetIdInUse.delete(nai.network.netId);
3066bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt                //    }
3076bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt                //    // Just in case.
3086bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt                //    mLegacyTypeTracker.remove(nai, wasDefault);
3096bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt                //}
3106bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            }
3116bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        }
3126bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    }
3136bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt
3146bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    private void handleAsyncChannelDisconnected(Message msg) {
3156bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        NetworkAgentInfo nai = mNetworkAgentInfos.get(msg.replyTo);
3166bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        if (nai != null) {
3176bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            if (DBG) {
3184be10a245ce355d84d70e61cb63d29ed525b478aLorenzo Colitti                log(nai.name() + " got DISCONNECTED, was satisfying " + nai.numNetworkRequests());
3196bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            }
3206bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            // A network agent has disconnected.
3216bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            // TODO - if we move the logic to the network agent (have them disconnect
3226bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            // because they lost all their requests or because their score isn't good)
3236bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            // then they would disconnect organically, report their new state and then
3246bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            // disconnect the channel.
3256bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            //if (nai.networkInfo.isConnected()) {
3266bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            //    nai.networkInfo.setDetailedState(NetworkInfo.DetailedState.DISCONNECTED,
3276bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            //            null, null);
3286bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            //}
3296bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            //final boolean wasDefault = isDefaultNetwork(nai);
3306bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            //if (wasDefault) {
3316bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            //    mDefaultInetConditionPublished = 0;
3326bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            //}
3336bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            //notifyIfacesChanged();
3346bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            // TODO - we shouldn't send CALLBACK_LOST to requests that can be satisfied
3356bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            // by other networks that are already connected. Perhaps that can be done by
3366bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            // sending all CALLBACK_LOST messages (for requests, not listens) at the end
3376bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            // of rematchAllNetworksAndRequests
3386bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            //notifyNetworkCallbacks(nai, ConnectivityManager.CALLBACK_LOST);
3396bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            //mKeepaliveTracker.handleStopAllKeepalives(nai,
3406bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            //       ConnectivityManager.PacketKeepalive.ERROR_INVALID_NETWORK);
3416bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            nai.networkMonitor.sendMessage(NetworkMonitor.CMD_NETWORK_DISCONNECTED);
3426bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            mNetworkAgentInfos.remove(msg.replyTo);
3436bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            //updateClat(null, nai.linkProperties, nai);
3446bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            //synchronized (mNetworkForNetId) {
3456bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            //    // Remove the NetworkAgent, but don't mark the netId as
3466bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            //    // available until we've told netd to delete it below.
3476bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            //    mNetworkForNetId.remove(nai.network.netId);
3486bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            //}
3496bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            // Remove all previously satisfied requests.
3506bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            //for (int i = 0; i < nai.networkRequests.size(); i++) {
3516bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            //    NetworkRequest request = nai.networkRequests.valueAt(i);
3526bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            //    NetworkAgentInfo currentNetwork = mNetworkForRequestId.get(request.requestId);
3536bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            //    if (currentNetwork != null && currentNetwork.network.netId == nai.network.netId) {
3546bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            //        mNetworkForRequestId.remove(request.requestId);
3556bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            //        sendUpdatedScoreToFactories(request, 0);
3566bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            //    }
3576bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            //}
3586bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            //if (nai.networkRequests.get(mDefaultRequest.requestId) != null) {
3596bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            //    removeDataActivityTracking(nai);
3606bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            //    notifyLockdownVpn(nai);
3616bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            //    requestNetworkTransitionWakelock(nai.name());
3626bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            //}
3636bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            //mLegacyTypeTracker.remove(nai, wasDefault);
3646bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            //rematchAllNetworksAndRequests(null, 0);
3656bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            //if (nai.created) {
3666bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            //    // Tell netd to clean up the configuration for this network
3676bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            //    // (routing rules, DNS, etc).
3686bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            //    // This may be slow as it requires a lot of netd shelling out to ip and
3696bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            //    // ip[6]tables to flush routes and remove the incoming packet mark rule, so do it
3706bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            //    // after we've rematched networks with requests which should make a potential
3716bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            //    // fallback network the default or requested a new network from the
3726bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            //    // NetworkFactories, so network traffic isn't interrupted for an unnecessarily
3736bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            //    // long time.
3746bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            //    try {
3756bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            //        mNetd.removeNetwork(nai.network.netId);
3766bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            //    } catch (Exception e) {
3776bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            //        loge("Exception removing network: " + e);
3786bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            //    }
3796bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            //}
3806bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            //synchronized (mNetworkForNetId) {
3816bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            //    mNetIdInUse.delete(nai.network.netId);
3826bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            //}
3836bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        } else {
3846bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            NetworkFactoryInfo nfi = mNetworkFactoryInfos.remove(msg.replyTo);
3856bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            if (DBG && nfi != null) log("unregisterNetworkFactory for " + nfi.name);
3866bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        }
3876bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    }
3886bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt
3896bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    private void log(String str) {
3906bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        Slog.d(TAG, str);
3916bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    }
3926bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    private void loge(String str) {
3936bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        Slog.e(TAG, str);
3946bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    }
3956bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt
3966bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    // NetworkAgentInfo keyed off its connecting messenger
3976bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    // TODO - eval if we can reduce the number of lists/hashmaps/sparsearrays
3986bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    // NOTE: Only should be accessed on ConnectivityServiceThread, except dump().
3996bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    private final HashMap<Messenger, NetworkAgentInfo> mNetworkAgentInfos =
4006bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            new HashMap<Messenger, NetworkAgentInfo>();
4016bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    private final HashMap<Messenger, NetworkFactoryInfo> mNetworkFactoryInfos =
4026bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            new HashMap<Messenger, NetworkFactoryInfo>();
4036bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    private final HashMap<NetworkRequest, NetworkRequestInfo> mNetworkRequests =
4046bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            new HashMap<NetworkRequest, NetworkRequestInfo>();
4056bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt
4066bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    private static class NetworkFactoryInfo {
4076bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        public final String name;
4086bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        public final Messenger messenger;
4096bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        public final AsyncChannel asyncChannel;
4106bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt
4116bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        public NetworkFactoryInfo(String name, Messenger messenger, AsyncChannel asyncChannel) {
4126bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            this.name = name;
4136bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            this.messenger = messenger;
4146bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            this.asyncChannel = asyncChannel;
4156bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        }
4166bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    }
4176bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt
4186bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    private class NetworkRequestInfo implements IBinder.DeathRecipient {
4196bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        static final boolean REQUEST = true;
4206bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        static final boolean LISTEN = false;
4216bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt
4226bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        final NetworkRequest request;
4236bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        final PendingIntent mPendingIntent;
4246bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        boolean mPendingIntentSent;
4256bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        private final IBinder mBinder;
4266bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        final int mPid;
4276bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        final int mUid;
4286bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        final Messenger messenger;
4296bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        final boolean isRequest;
4306bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt
4316bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        NetworkRequestInfo(NetworkRequest r, PendingIntent pi, boolean isRequest) {
4326bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            request = r;
4336bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            mPendingIntent = pi;
4346bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            messenger = null;
4356bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            mBinder = null;
4366bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            mPid = getCallingPid();
4376bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            mUid = getCallingUid();
4386bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            this.isRequest = isRequest;
4396bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        }
4406bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt
4416bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        NetworkRequestInfo(Messenger m, NetworkRequest r, IBinder binder, boolean isRequest) {
4426bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            super();
4436bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            messenger = m;
4446bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            request = r;
4456bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            mBinder = binder;
4466bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            mPid = getCallingPid();
4476bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            mUid = getCallingUid();
4486bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            this.isRequest = isRequest;
4496bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            mPendingIntent = null;
4506bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt
4516bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            try {
4526bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt                mBinder.linkToDeath(this, 0);
4536bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            } catch (RemoteException e) {
4546bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt                binderDied();
4556bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            }
4566bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        }
4576bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt
4586bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        void unlinkDeathRecipient() {
4596bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            if (mBinder != null) {
4606bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt                mBinder.unlinkToDeath(this, 0);
4616bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            }
4626bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        }
4636bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt
4646bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        public void binderDied() {
4656bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            log("ConnectivityService NetworkRequestInfo binderDied(" +
4666bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt                    request + ", " + mBinder + ")");
4676bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            releaseNetworkRequest(request);
4686bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        }
4696bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt
4706bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        public String toString() {
4716bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            return (isRequest ? "Request" : "Listen") +
4726bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt                    " from uid/pid:" + mUid + "/" + mPid +
4736bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt                    " for " + request +
4746bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt                    (mPendingIntent == null ? "" : " to trigger " + mPendingIntent);
4756bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        }
4766bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    }
4776bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt
4786bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt
4796bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    // sequence number of NetworkRequests
4806bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    private int mNextNetworkRequestId = 1;
4816bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    private synchronized int nextNetworkRequestId() {
4826bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        return mNextNetworkRequestId++;
4836bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    }
4846bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt
4856bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    @Override
4866bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    public NetworkInfo getActiveNetworkInfo() {
4876bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        throw new RuntimeException("not implemented");
4886bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    }
4896bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt
4906bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    @Override
4916bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    public Network getActiveNetwork() {
4926bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        throw new RuntimeException("not implemented");
4936bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    }
4946bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt
495511b719a26518314300725337f84bdd511e224f2Robin Lee    @Override
4968ca2e656bd1143d671e893191b08ff93a4bd2692Jeff Sharkey    public Network getActiveNetworkForUid(int uid, boolean ignoreBlocked) {
497511b719a26518314300725337f84bdd511e224f2Robin Lee        throw new RuntimeException("not implemented");
498511b719a26518314300725337f84bdd511e224f2Robin Lee    }
499511b719a26518314300725337f84bdd511e224f2Robin Lee
5006bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    public NetworkInfo getActiveNetworkInfoUnfiltered() {
5016bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        throw new RuntimeException("not implemented");
5026bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    }
5036bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt
5046bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    @Override
5058ca2e656bd1143d671e893191b08ff93a4bd2692Jeff Sharkey    public NetworkInfo getActiveNetworkInfoForUid(int uid, boolean ignoreBlocked) {
5066bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        throw new RuntimeException("not implemented");
5076bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    }
5086bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt
5096bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    @Override
5106bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    public NetworkInfo getNetworkInfo(int networkType) {
5116bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        throw new RuntimeException("not implemented");
5126bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    }
5136bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt
5146bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    @Override
5158ca2e656bd1143d671e893191b08ff93a4bd2692Jeff Sharkey    public NetworkInfo getNetworkInfoForUid(Network network, int uid, boolean ignoreBlocked) {
5166bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        throw new RuntimeException("not implemented");
5176bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    }
5186bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt
5196bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    @Override
5206bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    public NetworkInfo[] getAllNetworkInfo() {
5216bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        throw new RuntimeException("not implemented");
5226bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    }
5236bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt
5246bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    @Override
5256bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    public Network getNetworkForType(int networkType) {
5266bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        throw new RuntimeException("not implemented");
5276bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    }
5286bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt
5296bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    @Override
5306bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    public Network[] getAllNetworks() {
5316bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        throw new RuntimeException("not implemented");
5326bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    }
5336bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt
5346bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    @Override
5356bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    public NetworkCapabilities[] getDefaultNetworkCapabilitiesForUser(int userId) {
5366bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        throw new RuntimeException("not implemented");
5376bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    }
5386bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt
5396bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    @Override
5406bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    public boolean isNetworkSupported(int networkType) {
5416bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        throw new RuntimeException("not implemented");
5426bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    }
5436bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt
5446bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    @Override
5456bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    public LinkProperties getActiveLinkProperties() {
5466bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        throw new RuntimeException("not implemented");
5476bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    }
5486bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt
5496bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    @Override
5506bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    public LinkProperties getLinkPropertiesForType(int networkType) {
5516bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        throw new RuntimeException("not implemented");
5526bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    }
5536bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt
5546bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    @Override
5556bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    public LinkProperties getLinkProperties(Network network) {
5566bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        throw new RuntimeException("not implemented");
5576bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    }
5586bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt
5596bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    @Override
5606bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    public NetworkCapabilities getNetworkCapabilities(Network network) {
5616bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        throw new RuntimeException("not implemented");
5626bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    }
5636bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt
5646bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    @Override
5656bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    public NetworkState[] getAllNetworkState() {
5666bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        throw new RuntimeException("not implemented");
5676bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    }
5686bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt
5696bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    @Override
5706bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    public NetworkQuotaInfo getActiveNetworkQuotaInfo() {
5716bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        throw new RuntimeException("not implemented");
5726bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    }
5736bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt
5746bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    @Override
5756bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    public boolean isActiveNetworkMetered() {
5766bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        throw new RuntimeException("not implemented");
5776bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    }
5786bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt
5796bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    public boolean requestRouteToHostAddress(int networkType, byte[] hostAddress) {
5806bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        throw new RuntimeException("not implemented");
5816bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    }
5826bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt
5836bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    @Override
5846bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    public int getRestoreDefaultNetworkDelay(int networkType) {
5856bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        throw new RuntimeException("not implemented");
5866bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    }
5876bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt
5886bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    @Override
5896bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    protected void dump(FileDescriptor fd, PrintWriter writer, String[] args) {
5906bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        throw new RuntimeException("not implemented");
5916bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    }
5926bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt
5936bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    public void setAcceptUnvalidated(Network network, boolean accept, boolean always) {
5946bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        throw new RuntimeException("not implemented");
5956bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    }
5966bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt
5976bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    public int tether(String iface) {
5986bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        throw new RuntimeException("not implemented");
5996bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    }
6006bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt
6016bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    public int untether(String iface) {
6026bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        throw new RuntimeException("not implemented");
6036bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    }
6046bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt
6056bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    public int getLastTetherError(String iface) {
6066bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        throw new RuntimeException("not implemented");
6076bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    }
6086bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt
6096bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    public String[] getTetherableUsbRegexs() {
6106bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        throw new RuntimeException("not implemented");
6116bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    }
6126bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt
6136bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    public String[] getTetherableWifiRegexs() {
6146bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        throw new RuntimeException("not implemented");
6156bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    }
6166bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt
6176bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    public String[] getTetherableBluetoothRegexs() {
6186bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        throw new RuntimeException("not implemented");
6196bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    }
6206bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt
6216bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    public int setUsbTethering(boolean enable) {
6226bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        throw new RuntimeException("not implemented");
6236bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    }
6246bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt
6256bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    public String[] getTetherableIfaces() {
6266bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        throw new RuntimeException("not implemented");
6276bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    }
6286bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt
6296bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    public String[] getTetheredIfaces() {
6306bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        throw new RuntimeException("not implemented");
6316bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    }
6326bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt
6336bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    public String[] getTetheringErroredIfaces() {
6346bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        throw new RuntimeException("not implemented");
6356bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    }
6366bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt
6376bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    public String[] getTetheredDhcpRanges() {
6386bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        throw new RuntimeException("not implemented");
6396bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    }
6406bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt
6416bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    @Override
6426bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    public boolean isTetheringSupported() {
6436bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        throw new RuntimeException("not implemented");
6446bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    }
6456bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt
6466bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    @Override
6476bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    public void startTethering(int type, ResultReceiver receiver, boolean showProvisioningUi) {
6486bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        throw new RuntimeException("not implemented");
6496bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    }
6506bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt
6516bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    @Override
6526bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    public void stopTethering(int type) {
6536bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        throw new RuntimeException("not implemented");
6546bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    }
6556bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt
6566bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt
6576bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    public void reportInetCondition(int networkType, int percentage) {
6586bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        throw new RuntimeException("not implemented");
6596bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    }
6606bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt
6616bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    public void reportNetworkConnectivity(Network network, boolean hasConnectivity) {
6626bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        throw new RuntimeException("not implemented");
6636bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    }
6646bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt
6656bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    public ProxyInfo getProxyForNetwork(Network network) {
6666bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        throw new RuntimeException("not implemented");
6676bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    }
6686bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt
6696bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    public void setGlobalProxy(ProxyInfo proxyProperties) {
6706bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        throw new RuntimeException("not implemented");
6716bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    }
6726bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt
6736bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    public ProxyInfo getGlobalProxy() {
6746bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        throw new RuntimeException("not implemented");
6756bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    }
6766bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt
6776bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    @Override
6786bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    public boolean prepareVpn(@Nullable String oldPackage, @Nullable String newPackage,
6796bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            int userId) {
6806bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        throw new RuntimeException("not implemented");
6816bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    }
6826bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt
6836bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    public void setVpnPackageAuthorization(String packageName, int userId, boolean authorized) {
6846bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        throw new RuntimeException("not implemented");
6856bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    }
6866bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt
6876bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    @Override
6886bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    public ParcelFileDescriptor establishVpn(VpnConfig config) {
6896bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        throw new RuntimeException("not implemented");
6906bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    }
6916bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt
6926bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    @Override
6936bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    public void startLegacyVpn(VpnProfile profile) {
6946bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        throw new RuntimeException("not implemented");
6956bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    }
6966bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt
6976bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    @Override
6986bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    public LegacyVpnInfo getLegacyVpnInfo(int userId) {
6996bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        throw new RuntimeException("not implemented");
7006bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    }
7016bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt
7026bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    @Override
7036bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    public VpnInfo[] getAllVpnInfo() {
7046bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        throw new RuntimeException("not implemented");
7056bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    }
7066bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt
7076bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    @Override
7086bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    public VpnConfig getVpnConfig(int userId) {
7096bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        throw new RuntimeException("not implemented");
7106bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    }
7116bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt
7126bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    @Override
7136bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    public boolean updateLockdownVpn() {
7146bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        throw new RuntimeException("not implemented");
7156bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    }
7166bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt
7176bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    @Override
71892867f07cf5873b840256c52dc9c2ab5d3455416Robin Lee    public boolean setAlwaysOnVpnPackage(int userId, String packageName, boolean lockdownEnabled) {
7196bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        throw new RuntimeException("not implemented");
7206bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    }
7216bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt
7226bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    @Override
7236bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    public String getAlwaysOnVpnPackage(int userId) {
7246bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        throw new RuntimeException("not implemented");
7256bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    }
7266bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt
7276bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    @Override
7286bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    public int checkMobileProvisioning(int suggestedTimeOutMs) {
7296bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        throw new RuntimeException("not implemented");
7306bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    }
7316bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt
7326bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    @Override
7336bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    public String getMobileProvisioningUrl() {
7346bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        throw new RuntimeException("not implemented");
7356bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    }
7366bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt
7376bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    @Override
7386bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    public void setProvisioningNotificationVisible(boolean visible, int networkType,
7396bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            String action) {
7406bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        throw new RuntimeException("not implemented");
7416bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    }
7426bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt
7436bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    @Override
7446bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    public void setAirplaneMode(boolean enable) {
7456bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        throw new RuntimeException("not implemented");
7466bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    }
7476bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt
7486bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    @Override
7496bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    public NetworkRequest requestNetwork(NetworkCapabilities networkCapabilities,
7506bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            Messenger messenger, int timeoutMs, IBinder binder, int legacyType) {
7516bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        networkCapabilities = new NetworkCapabilities(networkCapabilities);
7526bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt
7536bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        if (timeoutMs < 0 || timeoutMs > ConnectivityManager.MAX_NETWORK_REQUEST_TIMEOUT_MS) {
7546bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            throw new IllegalArgumentException("Bad timeout specified");
7556bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        }
7566bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt
7576bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        NetworkRequest networkRequest = new NetworkRequest(networkCapabilities, legacyType,
75864fbcce906012e4b429c354ba3a200a6ee410010Lorenzo Colitti                nextNetworkRequestId(), NetworkRequest.Type.REQUEST);
75964fbcce906012e4b429c354ba3a200a6ee410010Lorenzo Colitti        NetworkRequestInfo nri = new NetworkRequestInfo(messenger, networkRequest, binder, true);
7606bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        if (DBG) log("requestNetwork for " + nri);
7616bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt
7626bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        mHandler.sendMessage(mHandler.obtainMessage(EVENT_REGISTER_NETWORK_REQUEST, nri));
7636bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt
7646bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        return networkRequest;
7656bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    }
7666bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt
7676bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    @Override
7686bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    public boolean requestBandwidthUpdate(Network network) {
7696bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        throw new RuntimeException("not implemented");
7706bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    }
7716bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt
7726bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt
7736bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    @Override
7746bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    public NetworkRequest pendingRequestForNetwork(NetworkCapabilities networkCapabilities,
7756bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            PendingIntent operation) {
7766bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        throw new RuntimeException("not implemented");
7776bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    }
7786bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt
7796bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    @Override
7806bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    public void releasePendingNetworkRequest(PendingIntent operation) {
7816bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        throw new RuntimeException("not implemented");
7826bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    }
7836bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt
7846bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    @Override
7856bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    public NetworkRequest listenForNetwork(NetworkCapabilities networkCapabilities,
7866bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            Messenger messenger, IBinder binder) {
7876bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        throw new RuntimeException("not implemented");
7886bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    }
7896bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt
7906bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    @Override
7916bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    public void pendingListenForNetwork(NetworkCapabilities networkCapabilities,
7926bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            PendingIntent operation) {
7936bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        throw new RuntimeException("not implemented");
7946bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    }
7956bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt
7966bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    @Override
7976bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    public void releaseNetworkRequest(NetworkRequest networkRequest) {
7986bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        mHandler.sendMessage(mHandler.obtainMessage(EVENT_RELEASE_NETWORK_REQUEST, getCallingUid(),
7996bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt                0, networkRequest));
8006bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    }
8016bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt
8026bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    @Override
8036bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    public void registerNetworkFactory(Messenger messenger, String name) {
8046bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        NetworkFactoryInfo nfi = new NetworkFactoryInfo(name, messenger, new AsyncChannel());
8056bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        mHandler.sendMessage(mHandler.obtainMessage(EVENT_REGISTER_NETWORK_FACTORY, nfi));
8066bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    }
8076bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt
8086bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    private void handleRegisterNetworkFactory(NetworkFactoryInfo nfi) {
8096bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        if (DBG) log("Got NetworkFactory Messenger for " + nfi.name);
8106bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        mNetworkFactoryInfos.put(nfi.messenger, nfi);
8116bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        nfi.asyncChannel.connect(mContext, mTrackerHandler, nfi.messenger);
8126bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    }
8136bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt
8146bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    @Override
8156bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    public void unregisterNetworkFactory(Messenger messenger) {
8166bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        mHandler.sendMessage(mHandler.obtainMessage(EVENT_UNREGISTER_NETWORK_FACTORY, messenger));
8176bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    }
8186bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt
8196bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    private void handleUnregisterNetworkFactory(Messenger messenger) {
8206bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        NetworkFactoryInfo nfi = mNetworkFactoryInfos.remove(messenger);
8216bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        if (nfi == null) {
8226bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            loge("Failed to find Messenger in unregisterNetworkFactory");
8236bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            return;
8246bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        }
8256bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        if (DBG) log("unregisterNetworkFactory for " + nfi.name);
8266bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    }
8276bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt
8286bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    public int registerNetworkAgent(Messenger messenger, NetworkInfo networkInfo,
8296bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            LinkProperties linkProperties, NetworkCapabilities networkCapabilities,
8306bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            int currentScore, NetworkMisc networkMisc) {
8316bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt//        final NetworkAgentInfo nai = new NetworkAgentInfo(messenger, new AsyncChannel(),
8326bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt//                new Network(reserveNetId()), new NetworkInfo(networkInfo), new LinkProperties(
8336bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt//                linkProperties), new NetworkCapabilities(networkCapabilities), currentScore,
8346bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt//                mContext, mTrackerHandler, new NetworkMisc(networkMisc), mDefaultRequest, this);
8356bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt//        synchronized (this) {
8366bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt//            nai.networkMonitor.systemReady = mSystemReady;
8376bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt//        }
8386bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt//        mHandler.sendMessage(mHandler.obtainMessage(EVENT_REGISTER_NETWORK_AGENT, nai));
8396bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt//        return nai.network.netId;
8406bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        throw new RuntimeException("not implemented");
8416bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    }
8426bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt
8436bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    private void handleRegisterNetworkAgent(NetworkAgentInfo na) {
8446bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        if (VDBG) log("Got NetworkAgent Messenger");
8456bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt//        mNetworkAgentInfos.put(na.messenger, na);
8466bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt//        synchronized (mNetworkForNetId) {
8476bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt//            mNetworkForNetId.put(na.network.netId, na);
8486bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt//        }
8496bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt//        na.asyncChannel.connect(mContext, mTrackerHandler, na.messenger);
8506bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt//        NetworkInfo networkInfo = na.networkInfo;
8516bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt//        na.networkInfo = null;
8526bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt//        updateNetworkInfo(na, networkInfo);
8536bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    }
8546bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt
8556bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt
8566bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    private void handleRegisterNetworkRequest(NetworkRequestInfo nri) {
8576bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        mNetworkRequests.put(nri.request, nri);
8586bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        if (!nri.isRequest) {
8596bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            for (NetworkAgentInfo network : mNetworkAgentInfos.values()) {
8606bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt                if (nri.request.networkCapabilities.hasSignalStrength() &&
8616bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt                        network.satisfiesImmutableCapabilitiesOf(nri.request)) {
8626bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt                }
8636bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            }
8646bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        }
8656bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        rematchAllNetworksAndRequests(null, 0);
8666bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        if (nri.isRequest) {
8676bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            sendUpdatedScoreToFactories(nri.request, 0);
8686bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        }
8696bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    }
8706bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt
8716bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    private void handleReleaseNetworkRequest(NetworkRequest request, int callingUid) {
8726bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        NetworkRequestInfo nri = mNetworkRequests.get(request);
8736bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        if (nri != null) {
8746bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            if (DBG) log("releasing NetworkRequest " + request);
8756bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            nri.unlinkDeathRecipient();
8766bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            mNetworkRequests.remove(request);
8776bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            if (nri.isRequest) {
8786bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt                // Find all networks that are satisfying this request and remove the request
8796bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt                // from their request lists.
8806bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt                // TODO - it's my understanding that for a request there is only a single
8816bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt                // network satisfying it, so this loop is wasteful
8826bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt                //boolean wasKept = false;
8836bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt                //for (NetworkAgentInfo nai : mNetworkAgentInfos.values()) {
8846bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt                //    if (nai.networkRequests.get(nri.request.requestId) != null) {
8856bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt                //        nai.networkRequests.remove(nri.request.requestId);
8866bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt                //        if (DBG) {
8876bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt                //            log(" Removing from current network " + nai.name() +
8886bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt                //                    ", leaving " + nai.networkRequests.size() +
8896bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt                //                    " requests.");
8906bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt                //        }
8916bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt                //        if (unneeded(nai)) {
8926bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt                //            if (DBG) log("no live requests for " + nai.name() + "; disconnecting");
8936bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt                //            teardownUnneededNetwork(nai);
8946bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt                //        } else {
8956bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt                //            // suspect there should only be one pass through here
8966bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt                //            // but if any were kept do the check below
8976bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt                //            wasKept |= true;
8986bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt                //        }
8996bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt                //    }
9006bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt                //}
9016bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt
9026bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt                //NetworkAgentInfo nai = mNetworkForRequestId.get(nri.request.requestId);
9036bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt                //if (nai != null) {
9046bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt                //    mNetworkForRequestId.remove(nri.request.requestId);
9056bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt                //}
9066bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt                // Maintain the illusion.  When this request arrived, we might have pretended
9076bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt                // that a network connected to serve it, even though the network was already
9086bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt                // connected.  Now that this request has gone away, we might have to pretend
9096bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt                // that the network disconnected.  LegacyTypeTracker will generate that
9106bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt                // phantom disconnect for this type.
9116bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt                //if (nri.request.legacyType != TYPE_NONE && nai != null) {
9126bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt                //    boolean doRemove = true;
9136bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt                //    if (wasKept) {
9146bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt                //        // check if any of the remaining requests for this network are for the
9156bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt                //        // same legacy type - if so, don't remove the nai
9166bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt                //        for (int i = 0; i < nai.networkRequests.size(); i++) {
9176bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt                //            NetworkRequest otherRequest = nai.networkRequests.valueAt(i);
9186bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt                //            if (otherRequest.legacyType == nri.request.legacyType &&
9196bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt                //                    isRequest(otherRequest)) {
9206bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt                //                if (DBG) log(" still have other legacy request - leaving");
9216bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt                //                doRemove = false;
9226bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt                //            }
9236bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt                //        }
9246bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt                //    }
9256bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt                //
9266bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt                //    if (doRemove) {
9276bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt                //        mLegacyTypeTracker.remove(nri.request.legacyType, nai, false);
9286bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt                //    }
9296bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt                //}
9306bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt
9316bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt                for (NetworkFactoryInfo nfi : mNetworkFactoryInfos.values()) {
9326bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt                    nfi.asyncChannel.sendMessage(android.net.NetworkFactory.CMD_CANCEL_REQUEST,
9336bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt                            nri.request);
9346bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt                }
9356bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            } else {
9366bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt                // listens don't have a singular affectedNetwork.  Check all networks to see
9376bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt                // if this listen request applies and remove it.
9386bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt                //for (NetworkAgentInfo nai : mNetworkAgentInfos.values()) {
9396bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt                //    nai.networkRequests.remove(nri.request.requestId);
9406bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt                //    if (nri.request.networkCapabilities.hasSignalStrength() &&
9416bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt                //            nai.satisfiesImmutableCapabilitiesOf(nri.request)) {
9426bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt                //        updateSignalStrengthThresholds(nai, "RELEASE", nri.request);
9436bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt                //    }
9446bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt                //}
9456bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            }
9466bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            //callCallbackForRequest(nri, null, ConnectivityManager.CALLBACK_RELEASED);
9476bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        }
9486bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    }
9496bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt
9506bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    private void sendUpdatedScoreToFactories(NetworkAgentInfo nai) {
9514be10a245ce355d84d70e61cb63d29ed525b478aLorenzo Colitti        for (int i = 0; i < nai.numNetworkRequests(); i++) {
9524be10a245ce355d84d70e61cb63d29ed525b478aLorenzo Colitti            NetworkRequest nr = nai.requestAt(i);
9536bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            // Don't send listening requests to factories. b/17393458
9546bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            if (!isRequest(nr)) continue;
9556bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt                sendUpdatedScoreToFactories(nr, nai.getCurrentScore());
9566bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        }
9576bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    }
9586bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt
9596bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    private void sendUpdatedScoreToFactories(NetworkRequest networkRequest, int score) {
9606bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        if (VDBG) log("sending new Min Network Score(" + score + "): " + networkRequest.toString());
9616bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        for (NetworkFactoryInfo nfi : mNetworkFactoryInfos.values()) {
9626bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            nfi.asyncChannel.sendMessage(android.net.NetworkFactory.CMD_REQUEST_NETWORK, score, 0,
9636bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt                    networkRequest);
9646bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        }
9656bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    }
9666bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt
9676bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    private void rematchAllNetworksAndRequests(NetworkAgentInfo changed, int oldScore) {
9686bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    }
9696bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt
9706bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    @Override
9716bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    public void onSendFinished(PendingIntent pendingIntent, Intent intent, int resultCode,
9726bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            String resultData, Bundle resultExtras) {
9736bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        throw new RuntimeException("not implemented");
9746bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    }
9756bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt
9766bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    @Override
9776bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    public boolean addVpnAddress(String address, int prefixLength) {
9786bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        throw new RuntimeException("not implemented");
9796bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    }
9806bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt
9816bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    @Override
9826bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    public boolean removeVpnAddress(String address, int prefixLength) {
9836bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        throw new RuntimeException("not implemented");
9846bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    }
9856bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt
9866bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    @Override
9876bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    public boolean setUnderlyingNetworksForVpn(Network[] networks) {
9886bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        throw new RuntimeException("not implemented");
9896bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    }
9906bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt
9916bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    @Override
9926bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    public String getCaptivePortalServerUrl() {
9936bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        throw new RuntimeException("not implemented");
9946bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    }
9956bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt
9966bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    @Override
9976bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    public void startNattKeepalive(Network network, int intervalSeconds, Messenger messenger,
9986bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            IBinder binder, String srcAddr, int srcPort, String dstAddr) {
9996bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        throw new RuntimeException("not implemented");
10006bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    }
10016bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt
10026bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    @Override
10036bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    public void stopKeepalive(Network network, int slot) {
10046bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        throw new RuntimeException("not implemented");
10056bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    }
10066bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt
10076bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    @Override
10086bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    public void factoryReset() {
10096bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        throw new RuntimeException("not implemented");
10106bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    }
10116bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt
10126bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    @VisibleForTesting
10136bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    public NetworkMonitor createNetworkMonitor(Context context, Handler handler,
10146bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            NetworkAgentInfo nai, NetworkRequest defaultRequest) {
10156bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        throw new RuntimeException("not implemented");
10166bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    }
10176bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt
10183baedf2ead743a2c67dcac03733cec52bcef5636Robert Greenwalt    @VisibleForTesting
10193baedf2ead743a2c67dcac03733cec52bcef5636Robert Greenwalt    public NetworkRequest defaultRequest = null;
10206bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    @VisibleForTesting
10216bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    public synchronized void addDefaultRequest() {
10223baedf2ead743a2c67dcac03733cec52bcef5636Robert Greenwalt        if (defaultRequest != null) return;
10236bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        NetworkCapabilities netCap = new NetworkCapabilities();
10246bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        netCap.addCapability(NET_CAPABILITY_INTERNET);
10256bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        netCap.addCapability(NET_CAPABILITY_NOT_RESTRICTED);
10263baedf2ead743a2c67dcac03733cec52bcef5636Robert Greenwalt        defaultRequest = requestNetwork(netCap, null, 0, new Binder(),
10276bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt                ConnectivityManager.TYPE_NONE);
10286bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    }
10296bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt
10306bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    @VisibleForTesting
10313baedf2ead743a2c67dcac03733cec52bcef5636Robert Greenwalt    public synchronized void setCurrentScoreForRequest(NetworkRequest nr, int score) {
10323baedf2ead743a2c67dcac03733cec52bcef5636Robert Greenwalt        sendUpdatedScoreToFactories(nr, score);
10333baedf2ead743a2c67dcac03733cec52bcef5636Robert Greenwalt    }
10343baedf2ead743a2c67dcac03733cec52bcef5636Robert Greenwalt
10353baedf2ead743a2c67dcac03733cec52bcef5636Robert Greenwalt    @VisibleForTesting
10366bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    public synchronized void removeDefaultRequest() {
10373baedf2ead743a2c67dcac03733cec52bcef5636Robert Greenwalt        if (defaultRequest == null) return;
10383baedf2ead743a2c67dcac03733cec52bcef5636Robert Greenwalt        releaseNetworkRequest(defaultRequest);
10393baedf2ead743a2c67dcac03733cec52bcef5636Robert Greenwalt        defaultRequest = null;
10406bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    }
10416bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt
10426bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt
10436bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt}
1044