Fields Summary |
---|
private static final String | LOG_TAG |
private static final boolean | DBG |
private static final int | EVENT_PROCESS_REQUESTS |
private static final int | EVENT_EXECUTE_REQUEST |
private static final int | EVENT_EXECUTE_ALL_REQUESTS |
private static final int | EVENT_RELEASE_REQUEST |
private static final int | EVENT_RELEASE_ALL_REQUESTS |
private static final int | EVENT_DATA_ATTACHED |
private static final int | EVENT_DATA_DETACHED |
private static DctController | sDctController |
private int | mPhoneNum |
private com.android.internal.telephony.PhoneProxy[] | mPhones |
private DcSwitchStateMachine[] | mDcSwitchStateMachine |
private DcSwitchAsyncChannel[] | mDcSwitchAsyncChannel |
private android.os.Handler[] | mDcSwitchStateHandler |
private HashMap | mRequestInfos |
private android.content.Context | mContext |
private android.os.Messenger[] | mNetworkFactoryMessengerUsed to send us NetworkRequests from ConnectivityService. Remember it so we can
unregister on dispose. |
private android.net.NetworkFactory[] | mNetworkFactory |
private android.net.NetworkCapabilities[] | mNetworkFilter |
private com.android.internal.telephony.SubscriptionController | mSubController |
private android.telephony.SubscriptionManager | mSubMgr |
private android.telephony.SubscriptionManager.OnSubscriptionsChangedListener | mOnSubscriptionsChangedListener |
private android.database.ContentObserver | mObserver |
private android.os.Handler | mRspHandler |
Methods Summary |
---|
private java.lang.String | apnForNetworkRequest(android.net.NetworkRequest nr)
NetworkCapabilities nc = nr.networkCapabilities;
// For now, ignore the bandwidth stuff
if (nc.getTransportTypes().length > 0 &&
nc.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) == false) {
return null;
}
// in the near term just do 1-1 matches.
// TODO - actually try to match the set of capabilities
int type = -1;
String name = null;
boolean error = false;
if (nc.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)) {
if (name != null) error = true;
name = PhoneConstants.APN_TYPE_DEFAULT;
type = ConnectivityManager.TYPE_MOBILE;
}
if (nc.hasCapability(NetworkCapabilities.NET_CAPABILITY_MMS)) {
if (name != null) error = true;
name = PhoneConstants.APN_TYPE_MMS;
type = ConnectivityManager.TYPE_MOBILE_MMS;
}
if (nc.hasCapability(NetworkCapabilities.NET_CAPABILITY_SUPL)) {
if (name != null) error = true;
name = PhoneConstants.APN_TYPE_SUPL;
type = ConnectivityManager.TYPE_MOBILE_SUPL;
}
if (nc.hasCapability(NetworkCapabilities.NET_CAPABILITY_DUN)) {
if (name != null) error = true;
name = PhoneConstants.APN_TYPE_DUN;
type = ConnectivityManager.TYPE_MOBILE_DUN;
}
if (nc.hasCapability(NetworkCapabilities.NET_CAPABILITY_FOTA)) {
if (name != null) error = true;
name = PhoneConstants.APN_TYPE_FOTA;
type = ConnectivityManager.TYPE_MOBILE_FOTA;
}
if (nc.hasCapability(NetworkCapabilities.NET_CAPABILITY_IMS)) {
if (name != null) error = true;
name = PhoneConstants.APN_TYPE_IMS;
type = ConnectivityManager.TYPE_MOBILE_IMS;
}
if (nc.hasCapability(NetworkCapabilities.NET_CAPABILITY_CBS)) {
if (name != null) error = true;
name = PhoneConstants.APN_TYPE_CBS;
type = ConnectivityManager.TYPE_MOBILE_CBS;
}
if (nc.hasCapability(NetworkCapabilities.NET_CAPABILITY_IA)) {
if (name != null) error = true;
name = PhoneConstants.APN_TYPE_IA;
type = ConnectivityManager.TYPE_MOBILE_IA;
}
if (nc.hasCapability(NetworkCapabilities.NET_CAPABILITY_RCS)) {
if (name != null) error = true;
name = null;
loge("RCS APN type not yet supported");
}
if (nc.hasCapability(NetworkCapabilities.NET_CAPABILITY_XCAP)) {
if (name != null) error = true;
name = null;
loge("XCAP APN type not yet supported");
}
if (nc.hasCapability(NetworkCapabilities.NET_CAPABILITY_EIMS)) {
if (name != null) error = true;
name = null;
loge("EIMS APN type not yet supported");
}
if (error) {
loge("Multiple apn types specified in request - result is unspecified!");
}
if (type == -1 || name == null) {
loge("Unsupported NetworkRequest in Telephony: nr=" + nr);
return null;
}
return name;
|
public void | dispose()
logd("DctController.dispose");
for (int i = 0; i < mPhoneNum; ++i) {
ConnectivityManager cm = (ConnectivityManager)mPhones[i].getContext()
.getSystemService(Context.CONNECTIVITY_SERVICE);
cm.unregisterNetworkFactory(mNetworkFactoryMessenger[i]);
mNetworkFactoryMessenger[i] = null;
}
mSubMgr.removeOnSubscriptionsChangedListener(mOnSubscriptionsChangedListener);
mContext.getContentResolver().unregisterContentObserver(mObserver);
|
public void | dump(java.io.FileDescriptor fd, java.io.PrintWriter pw, java.lang.String[] args)
pw.println("DctController:");
try {
for (DcSwitchStateMachine dssm : mDcSwitchStateMachine) {
dssm.dump(fd, pw, args);
}
} catch (Exception e) {
e.printStackTrace();
}
pw.flush();
pw.println("++++++++++++++++++++++++++++++++");
try {
for (Entry<Integer, RequestInfo> entry : mRequestInfos.entrySet()) {
pw.println("mRequestInfos[" + entry.getKey() + "]=" + entry.getValue());
}
} catch (Exception e) {
e.printStackTrace();
}
pw.flush();
pw.println("++++++++++++++++++++++++++++++++");
pw.flush();
pw.println("TelephonyNetworkFactories:");
for (NetworkFactory tnf : mNetworkFactory) {
pw.println(" " + tnf);
}
pw.flush();
pw.println("++++++++++++++++++++++++++++++++");
pw.flush();
|
void | executeAllRequests(int phoneId)
logd("executeAllRequests, phone:" + phoneId);
sendMessage(obtainMessage(EVENT_EXECUTE_ALL_REQUESTS, phoneId,0));
|
void | executeRequest(com.android.internal.telephony.dataconnection.DcSwitchAsyncChannel.RequestInfo request)
logd("executeRequest, request= " + request);
sendMessage(obtainMessage(EVENT_EXECUTE_REQUEST, request));
|
public static com.android.internal.telephony.dataconnection.DctController | getInstance()
if (sDctController == null) {
throw new RuntimeException(
"DctController.getInstance can't be called before makeDCTController()");
}
return sDctController;
|
private int | getRequestPhoneId(android.net.NetworkRequest networkRequest)
String specifier = networkRequest.networkCapabilities.getNetworkSpecifier();
int subId;
if (specifier == null || specifier.equals("")) {
subId = mSubController.getDefaultDataSubId();
} else {
subId = Integer.parseInt(specifier);
}
int phoneId = mSubController.getPhoneId(subId);
if (!SubscriptionManager.isValidPhoneId(phoneId)) {
phoneId = 0;
if (!SubscriptionManager.isValidPhoneId(phoneId)) {
throw new RuntimeException("Should not happen, no valid phoneId");
}
}
return phoneId;
|
private int | getTopPriorityRequestPhoneId()
RequestInfo retRequestInfo = null;
int phoneId = 0;
int priority = -1;
//TODO: Handle SIM Switch
for (int i=0; i<mPhoneNum; i++) {
Iterator<Integer> iterator = mRequestInfos.keySet().iterator();
while (iterator.hasNext()) {
RequestInfo requestInfo = mRequestInfos.get(iterator.next());
logd("selectExecPhone requestInfo = " + requestInfo);
if (getRequestPhoneId(requestInfo.request) == i &&
priority < requestInfo.priority) {
priority = requestInfo.priority;
retRequestInfo = requestInfo;
}
}
}
if (retRequestInfo != null) {
phoneId = getRequestPhoneId(retRequestInfo.request);
}
logd("getTopPriorityRequestPhoneId = " + phoneId
+ ", priority = " + priority);
return phoneId;
|
public void | handleMessage(android.os.Message msg)
logd("handleMessage msg=" + msg);
switch (msg.what) {
case EVENT_PROCESS_REQUESTS:
onProcessRequest();
break;
case EVENT_EXECUTE_REQUEST:
onExecuteRequest((RequestInfo)msg.obj);
break;
case EVENT_EXECUTE_ALL_REQUESTS:
onExecuteAllRequests(msg.arg1);
break;
case EVENT_RELEASE_REQUEST:
onReleaseRequest((RequestInfo)msg.obj);
break;
case EVENT_RELEASE_ALL_REQUESTS:
onReleaseAllRequests(msg.arg1);
break;
default:
loge("Un-handled message [" + msg.what + "]");
}
|
private static void | logd(java.lang.String s)
if (DBG) Rlog.d(LOG_TAG, s);
|
private static void | loge(java.lang.String s)
if (DBG) Rlog.e(LOG_TAG, s);
|
public static com.android.internal.telephony.dataconnection.DctController | makeDctController(com.android.internal.telephony.PhoneProxy[] phones)
if (sDctController == null) {
logd("makeDctController: new DctController phones.length=" + phones.length);
sDctController = new DctController(phones);
}
logd("makeDctController: X sDctController=" + sDctController);
return sDctController;
|
private void | onExecuteAllRequests(int phoneId)
logd("onExecuteAllRequests phoneId=" + phoneId);
Iterator<Integer> iterator = mRequestInfos.keySet().iterator();
while (iterator.hasNext()) {
RequestInfo requestInfo = mRequestInfos.get(iterator.next());
if (getRequestPhoneId(requestInfo.request) == phoneId) {
onExecuteRequest(requestInfo);
}
}
|
private void | onExecuteRequest(com.android.internal.telephony.dataconnection.DcSwitchAsyncChannel.RequestInfo requestInfo)
logd("onExecuteRequest request=" + requestInfo);
if (!requestInfo.executed) {
requestInfo.executed = true;
String apn = apnForNetworkRequest(requestInfo.request);
int phoneId = getRequestPhoneId(requestInfo.request);
PhoneBase phoneBase = (PhoneBase)mPhones[phoneId].getActivePhone();
DcTrackerBase dcTracker = phoneBase.mDcTracker;
dcTracker.incApnRefCount(apn);
}
|
private void | onProcessRequest()
//process all requests
//1. Check all requests and find subscription of the top priority
// request
//2. Is current data allowed on the selected subscription
//2-1. If yes, execute all the requests of the sub
//2-2. If no, set data not allow on the current PS subscription
//2-2-1. Set data allow on the selected subscription
int phoneId = getTopPriorityRequestPhoneId();
int activePhoneId = -1;
for (int i=0; i<mDcSwitchStateMachine.length; i++) {
if (!mDcSwitchAsyncChannel[i].isIdleSync()) {
activePhoneId = i;
break;
}
}
logd("onProcessRequest phoneId=" + phoneId
+ ", activePhoneId=" + activePhoneId);
if (activePhoneId == -1 || activePhoneId == phoneId) {
Iterator<Integer> iterator = mRequestInfos.keySet().iterator();
while (iterator.hasNext()) {
RequestInfo requestInfo = mRequestInfos.get(iterator.next());
if (getRequestPhoneId(requestInfo.request) == phoneId && !requestInfo.executed) {
mDcSwitchAsyncChannel[phoneId].connectSync(requestInfo);
}
}
} else {
mDcSwitchAsyncChannel[activePhoneId].disconnectAllSync();
}
|
private void | onReleaseAllRequests(int phoneId)
logd("onReleaseAllRequests phoneId=" + phoneId);
Iterator<Integer> iterator = mRequestInfos.keySet().iterator();
while (iterator.hasNext()) {
RequestInfo requestInfo = mRequestInfos.get(iterator.next());
if (getRequestPhoneId(requestInfo.request) == phoneId) {
onReleaseRequest(requestInfo);
}
}
|
private void | onReleaseRequest(com.android.internal.telephony.dataconnection.DcSwitchAsyncChannel.RequestInfo requestInfo)
logd("onReleaseRequest request=" + requestInfo);
if (requestInfo != null && requestInfo.executed) {
String apn = apnForNetworkRequest(requestInfo.request);
int phoneId = getRequestPhoneId(requestInfo.request);
PhoneBase phoneBase = (PhoneBase)mPhones[phoneId].getActivePhone();
DcTrackerBase dcTracker = phoneBase.mDcTracker;
dcTracker.decApnRefCount(apn);
requestInfo.executed = false;
}
|
private void | onSettingsChange()
//Sub Selection
long dataSubId = mSubController.getDefaultDataSubId();
int activePhoneId = -1;
for (int i=0; i<mDcSwitchStateMachine.length; i++) {
if (!mDcSwitchAsyncChannel[i].isIdleSync()) {
activePhoneId = i;
break;
}
}
int[] subIds = SubscriptionManager.getSubId(activePhoneId);
if (subIds == null || subIds.length == 0) {
loge("onSettingsChange, subIds null or length 0 for activePhoneId " + activePhoneId);
return;
}
logd("onSettingsChange, data sub: " + dataSubId + ", active data sub: " + subIds[0]);
if (subIds[0] != dataSubId) {
Iterator<Integer> iterator = mRequestInfos.keySet().iterator();
while (iterator.hasNext()) {
RequestInfo requestInfo = mRequestInfos.get(iterator.next());
String specifier = requestInfo.request.networkCapabilities.getNetworkSpecifier();
if (specifier == null || specifier.equals("")) {
if (requestInfo.executed) {
String apn = apnForNetworkRequest(requestInfo.request);
logd("[setDataSubId] activePhoneId:" + activePhoneId + ", subId =" +
dataSubId);
PhoneBase phoneBase =
(PhoneBase)mPhones[activePhoneId].getActivePhone();
DcTrackerBase dcTracker = phoneBase.mDcTracker;
dcTracker.decApnRefCount(apn);
requestInfo.executed = false;
}
}
}
}
// Some request maybe pending due to invalid settings
// Try to handle pending request when settings changed
for (int i = 0; i < mPhoneNum; ++i) {
((DctController.TelephonyNetworkFactory)mNetworkFactory[i]).evalPendingRequest();
}
processRequests();
|
private void | onSubInfoReady()
logd("onSubInfoReady mPhoneNum=" + mPhoneNum);
for (int i = 0; i < mPhoneNum; ++i) {
int subId = mPhones[i].getSubId();
logd("onSubInfoReady handle pending requests subId=" + subId);
mNetworkFilter[i].setNetworkSpecifier(String.valueOf(subId));
((DctController.TelephonyNetworkFactory)mNetworkFactory[i]).evalPendingRequest();
}
processRequests();
|
void | processRequests()
logd("processRequests");
sendMessage(obtainMessage(EVENT_PROCESS_REQUESTS));
|
void | releaseAllRequests(int phoneId)
logd("releaseAllRequests, phone:" + phoneId);
sendMessage(obtainMessage(EVENT_RELEASE_ALL_REQUESTS, phoneId, 0));
|
private int | releaseNetwork(android.net.NetworkRequest request)
RequestInfo requestInfo = mRequestInfos.get(request.requestId);
logd("releaseNetwork request=" + request + ", requestInfo=" + requestInfo);
mRequestInfos.remove(request.requestId);
releaseRequest(requestInfo);
processRequests();
return PhoneConstants.APN_REQUEST_STARTED;
|
void | releaseRequest(com.android.internal.telephony.dataconnection.DcSwitchAsyncChannel.RequestInfo request)
logd("releaseRequest, request= " + request);
sendMessage(obtainMessage(EVENT_RELEASE_REQUEST, request));
|
private int | requestNetwork(android.net.NetworkRequest request, int priority)
logd("requestNetwork request=" + request
+ ", priority=" + priority);
RequestInfo requestInfo = new RequestInfo(request, priority);
mRequestInfos.put(request.requestId, requestInfo);
processRequests();
return PhoneConstants.APN_REQUEST_STARTED;
|
private void | updatePhoneBaseForIndex(int index, com.android.internal.telephony.PhoneBase phoneBase)
logd("updatePhoneBaseForIndex for phone index=" + index);
phoneBase.getServiceStateTracker().registerForDataConnectionAttached(mRspHandler,
EVENT_DATA_ATTACHED + index, null);
phoneBase.getServiceStateTracker().registerForDataConnectionDetached(mRspHandler,
EVENT_DATA_DETACHED + index, null);
ConnectivityManager cm = (ConnectivityManager)mPhones[index].getContext()
.getSystemService(Context.CONNECTIVITY_SERVICE);
if (mNetworkFactoryMessenger != null) {
logd("unregister TelephonyNetworkFactory for phone index=" + index);
cm.unregisterNetworkFactory(mNetworkFactoryMessenger[index]);
mNetworkFactoryMessenger[index] = null;
mNetworkFactory[index] = null;
mNetworkFilter[index] = null;
}
mNetworkFilter[index] = new NetworkCapabilities();
mNetworkFilter[index].addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR);
mNetworkFilter[index].addCapability(NetworkCapabilities.NET_CAPABILITY_MMS);
mNetworkFilter[index].addCapability(NetworkCapabilities.NET_CAPABILITY_SUPL);
mNetworkFilter[index].addCapability(NetworkCapabilities.NET_CAPABILITY_DUN);
mNetworkFilter[index].addCapability(NetworkCapabilities.NET_CAPABILITY_FOTA);
mNetworkFilter[index].addCapability(NetworkCapabilities.NET_CAPABILITY_IMS);
mNetworkFilter[index].addCapability(NetworkCapabilities.NET_CAPABILITY_CBS);
mNetworkFilter[index].addCapability(NetworkCapabilities.NET_CAPABILITY_IA);
mNetworkFilter[index].addCapability(NetworkCapabilities.NET_CAPABILITY_RCS);
mNetworkFilter[index].addCapability(NetworkCapabilities.NET_CAPABILITY_XCAP);
mNetworkFilter[index].addCapability(NetworkCapabilities.NET_CAPABILITY_EIMS);
mNetworkFilter[index].addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED);
mNetworkFilter[index].addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET);
mNetworkFactory[index] = new TelephonyNetworkFactory(this.getLooper(),
mPhones[index].getContext(), "TelephonyNetworkFactory", phoneBase,
mNetworkFilter[index]);
mNetworkFactory[index].setScoreFilter(50);
mNetworkFactoryMessenger[index] = new Messenger(mNetworkFactory[index]);
cm.registerNetworkFactory(mNetworkFactoryMessenger[index], "Telephony");
|
public void | updatePhoneObject(com.android.internal.telephony.PhoneProxy phone)
if (phone == null) {
loge("updatePhoneObject phone = null");
return;
}
PhoneBase phoneBase = (PhoneBase)phone.getActivePhone();
if (phoneBase == null) {
loge("updatePhoneObject phoneBase = null");
return;
}
for (int i = 0; i < mPhoneNum; i++) {
if (mPhones[i] == phone) {
updatePhoneBaseForIndex(i, phoneBase);
break;
}
}
|