|
66 | 66 | import android.os.PowerManager; |
67 | 67 | import android.os.RemoteException; |
68 | 68 | import android.os.ServiceManager; |
| 69 | +import android.os.SystemClock; |
69 | 70 | import android.os.SystemProperties; |
70 | 71 | import android.provider.Settings; |
71 | 72 | import android.text.TextUtils; |
@@ -995,120 +996,136 @@ public String toString() { |
995 | 996 | // javadoc from interface |
996 | 997 | public int startUsingNetworkFeature(int networkType, String feature, |
997 | 998 | IBinder binder) { |
| 999 | + long startTime = 0; |
| 1000 | + if (DBG) { |
| 1001 | + startTime = SystemClock.elapsedRealtime(); |
| 1002 | + } |
998 | 1003 | if (VDBG) { |
999 | 1004 | log("startUsingNetworkFeature for net " + networkType + ": " + feature + ", uid=" |
1000 | 1005 | + Binder.getCallingUid()); |
1001 | 1006 | } |
1002 | 1007 | enforceChangePermission(); |
1003 | | - if (!ConnectivityManager.isNetworkTypeValid(networkType) || |
1004 | | - mNetConfigs[networkType] == null) { |
1005 | | - return Phone.APN_REQUEST_FAILED; |
1006 | | - } |
1007 | | - |
1008 | | - FeatureUser f = new FeatureUser(networkType, feature, binder); |
1009 | | - |
1010 | | - // TODO - move this into individual networktrackers |
1011 | | - int usedNetworkType = convertFeatureToNetworkType(networkType, feature); |
| 1008 | + try { |
| 1009 | + if (!ConnectivityManager.isNetworkTypeValid(networkType) || |
| 1010 | + mNetConfigs[networkType] == null) { |
| 1011 | + return Phone.APN_REQUEST_FAILED; |
| 1012 | + } |
1012 | 1013 |
|
1013 | | - if (mProtectedNetworks.contains(usedNetworkType)) { |
1014 | | - enforceConnectivityInternalPermission(); |
1015 | | - } |
| 1014 | + FeatureUser f = new FeatureUser(networkType, feature, binder); |
1016 | 1015 |
|
1017 | | - // if UID is restricted, don't allow them to bring up metered APNs |
1018 | | - final boolean networkMetered = isNetworkMeteredUnchecked(usedNetworkType); |
1019 | | - final int uidRules; |
1020 | | - synchronized (mRulesLock) { |
1021 | | - uidRules = mUidRules.get(Binder.getCallingUid(), RULE_ALLOW_ALL); |
1022 | | - } |
1023 | | - if (networkMetered && (uidRules & RULE_REJECT_METERED) != 0) { |
1024 | | - return Phone.APN_REQUEST_FAILED; |
1025 | | - } |
| 1016 | + // TODO - move this into individual networktrackers |
| 1017 | + int usedNetworkType = convertFeatureToNetworkType(networkType, feature); |
1026 | 1018 |
|
1027 | | - NetworkStateTracker network = mNetTrackers[usedNetworkType]; |
1028 | | - if (network != null) { |
1029 | | - Integer currentPid = new Integer(getCallingPid()); |
1030 | | - if (usedNetworkType != networkType) { |
1031 | | - NetworkInfo ni = network.getNetworkInfo(); |
| 1019 | + if (mProtectedNetworks.contains(usedNetworkType)) { |
| 1020 | + enforceConnectivityInternalPermission(); |
| 1021 | + } |
1032 | 1022 |
|
1033 | | - if (ni.isAvailable() == false) { |
1034 | | - if (!TextUtils.equals(feature,Phone.FEATURE_ENABLE_DUN_ALWAYS)) { |
1035 | | - if (DBG) log("special network not available ni=" + ni.getTypeName()); |
1036 | | - return Phone.APN_TYPE_NOT_AVAILABLE; |
1037 | | - } else { |
1038 | | - // else make the attempt anyway - probably giving REQUEST_STARTED below |
1039 | | - if (DBG) { |
1040 | | - log("special network not available, but try anyway ni=" + |
1041 | | - ni.getTypeName()); |
| 1023 | + // if UID is restricted, don't allow them to bring up metered APNs |
| 1024 | + final boolean networkMetered = isNetworkMeteredUnchecked(usedNetworkType); |
| 1025 | + final int uidRules; |
| 1026 | + synchronized (mRulesLock) { |
| 1027 | + uidRules = mUidRules.get(Binder.getCallingUid(), RULE_ALLOW_ALL); |
| 1028 | + } |
| 1029 | + if (networkMetered && (uidRules & RULE_REJECT_METERED) != 0) { |
| 1030 | + return Phone.APN_REQUEST_FAILED; |
| 1031 | + } |
| 1032 | + |
| 1033 | + NetworkStateTracker network = mNetTrackers[usedNetworkType]; |
| 1034 | + if (network != null) { |
| 1035 | + Integer currentPid = new Integer(getCallingPid()); |
| 1036 | + if (usedNetworkType != networkType) { |
| 1037 | + NetworkInfo ni = network.getNetworkInfo(); |
| 1038 | + |
| 1039 | + if (ni.isAvailable() == false) { |
| 1040 | + if (!TextUtils.equals(feature,Phone.FEATURE_ENABLE_DUN_ALWAYS)) { |
| 1041 | + if (DBG) log("special network not available ni=" + ni.getTypeName()); |
| 1042 | + return Phone.APN_TYPE_NOT_AVAILABLE; |
| 1043 | + } else { |
| 1044 | + // else make the attempt anyway - probably giving REQUEST_STARTED below |
| 1045 | + if (DBG) { |
| 1046 | + log("special network not available, but try anyway ni=" + |
| 1047 | + ni.getTypeName()); |
| 1048 | + } |
1042 | 1049 | } |
1043 | 1050 | } |
1044 | | - } |
1045 | 1051 |
|
1046 | | - int restoreTimer = getRestoreDefaultNetworkDelay(usedNetworkType); |
1047 | | - |
1048 | | - synchronized(this) { |
1049 | | - boolean addToList = true; |
1050 | | - if (restoreTimer < 0) { |
1051 | | - // In case there is no timer is specified for the feature, |
1052 | | - // make sure we don't add duplicate entry with the same request. |
1053 | | - for (FeatureUser u : mFeatureUsers) { |
1054 | | - if (u.isSameUser(f)) { |
1055 | | - // Duplicate user is found. Do not add. |
1056 | | - addToList = false; |
1057 | | - break; |
| 1052 | + int restoreTimer = getRestoreDefaultNetworkDelay(usedNetworkType); |
| 1053 | + |
| 1054 | + synchronized(this) { |
| 1055 | + boolean addToList = true; |
| 1056 | + if (restoreTimer < 0) { |
| 1057 | + // In case there is no timer is specified for the feature, |
| 1058 | + // make sure we don't add duplicate entry with the same request. |
| 1059 | + for (FeatureUser u : mFeatureUsers) { |
| 1060 | + if (u.isSameUser(f)) { |
| 1061 | + // Duplicate user is found. Do not add. |
| 1062 | + addToList = false; |
| 1063 | + break; |
| 1064 | + } |
1058 | 1065 | } |
1059 | 1066 | } |
1060 | | - } |
1061 | 1067 |
|
1062 | | - if (addToList) mFeatureUsers.add(f); |
1063 | | - if (!mNetRequestersPids[usedNetworkType].contains(currentPid)) { |
1064 | | - // this gets used for per-pid dns when connected |
1065 | | - mNetRequestersPids[usedNetworkType].add(currentPid); |
| 1068 | + if (addToList) mFeatureUsers.add(f); |
| 1069 | + if (!mNetRequestersPids[usedNetworkType].contains(currentPid)) { |
| 1070 | + // this gets used for per-pid dns when connected |
| 1071 | + mNetRequestersPids[usedNetworkType].add(currentPid); |
| 1072 | + } |
1066 | 1073 | } |
1067 | | - } |
1068 | 1074 |
|
1069 | | - if (restoreTimer >= 0) { |
1070 | | - mHandler.sendMessageDelayed( |
1071 | | - mHandler.obtainMessage(EVENT_RESTORE_DEFAULT_NETWORK, f), restoreTimer); |
1072 | | - } |
| 1075 | + if (restoreTimer >= 0) { |
| 1076 | + mHandler.sendMessageDelayed(mHandler.obtainMessage( |
| 1077 | + EVENT_RESTORE_DEFAULT_NETWORK, f), restoreTimer); |
| 1078 | + } |
1073 | 1079 |
|
1074 | | - if ((ni.isConnectedOrConnecting() == true) && |
1075 | | - !network.isTeardownRequested()) { |
1076 | | - if (ni.isConnected() == true) { |
1077 | | - final long token = Binder.clearCallingIdentity(); |
1078 | | - try { |
1079 | | - // add the pid-specific dns |
1080 | | - handleDnsConfigurationChange(usedNetworkType); |
1081 | | - if (VDBG) log("special network already active"); |
1082 | | - } finally { |
1083 | | - Binder.restoreCallingIdentity(token); |
| 1080 | + if ((ni.isConnectedOrConnecting() == true) && |
| 1081 | + !network.isTeardownRequested()) { |
| 1082 | + if (ni.isConnected() == true) { |
| 1083 | + final long token = Binder.clearCallingIdentity(); |
| 1084 | + try { |
| 1085 | + // add the pid-specific dns |
| 1086 | + handleDnsConfigurationChange(usedNetworkType); |
| 1087 | + if (VDBG) log("special network already active"); |
| 1088 | + } finally { |
| 1089 | + Binder.restoreCallingIdentity(token); |
| 1090 | + } |
| 1091 | + return Phone.APN_ALREADY_ACTIVE; |
1084 | 1092 | } |
1085 | | - return Phone.APN_ALREADY_ACTIVE; |
| 1093 | + if (VDBG) log("special network already connecting"); |
| 1094 | + return Phone.APN_REQUEST_STARTED; |
1086 | 1095 | } |
1087 | | - if (VDBG) log("special network already connecting"); |
1088 | | - return Phone.APN_REQUEST_STARTED; |
1089 | | - } |
1090 | 1096 |
|
1091 | | - // check if the radio in play can make another contact |
1092 | | - // assume if cannot for now |
| 1097 | + // check if the radio in play can make another contact |
| 1098 | + // assume if cannot for now |
1093 | 1099 |
|
1094 | | - if (DBG) { |
1095 | | - log("startUsingNetworkFeature reconnecting to " + networkType + ": " + feature); |
1096 | | - } |
1097 | | - network.reconnect(); |
1098 | | - return Phone.APN_REQUEST_STARTED; |
1099 | | - } else { |
1100 | | - // need to remember this unsupported request so we respond appropriately on stop |
1101 | | - synchronized(this) { |
1102 | | - mFeatureUsers.add(f); |
1103 | | - if (!mNetRequestersPids[usedNetworkType].contains(currentPid)) { |
1104 | | - // this gets used for per-pid dns when connected |
1105 | | - mNetRequestersPids[usedNetworkType].add(currentPid); |
| 1100 | + if (DBG) { |
| 1101 | + log("startUsingNetworkFeature reconnecting to " + networkType + ": " + |
| 1102 | + feature); |
| 1103 | + } |
| 1104 | + network.reconnect(); |
| 1105 | + return Phone.APN_REQUEST_STARTED; |
| 1106 | + } else { |
| 1107 | + // need to remember this unsupported request so we respond appropriately on stop |
| 1108 | + synchronized(this) { |
| 1109 | + mFeatureUsers.add(f); |
| 1110 | + if (!mNetRequestersPids[usedNetworkType].contains(currentPid)) { |
| 1111 | + // this gets used for per-pid dns when connected |
| 1112 | + mNetRequestersPids[usedNetworkType].add(currentPid); |
| 1113 | + } |
1106 | 1114 | } |
| 1115 | + return -1; |
1107 | 1116 | } |
1108 | | - return -1; |
1109 | 1117 | } |
1110 | | - } |
1111 | | - return Phone.APN_TYPE_NOT_AVAILABLE; |
| 1118 | + return Phone.APN_TYPE_NOT_AVAILABLE; |
| 1119 | + } finally { |
| 1120 | + if (DBG) { |
| 1121 | + final long execTime = SystemClock.elapsedRealtime() - startTime; |
| 1122 | + if (execTime > 250) { |
| 1123 | + loge("startUsingNetworkFeature took too long: " + execTime + "ms"); |
| 1124 | + } else { |
| 1125 | + if (VDBG) log("startUsingNetworkFeature took " + execTime + "ms"); |
| 1126 | + } |
| 1127 | + } |
| 1128 | + } |
1112 | 1129 | } |
1113 | 1130 |
|
1114 | 1131 | // javadoc from interface |
|
0 commit comments