Loading src/java/com/android/internal/telephony/RIL.java +62 −198 Original line number Diff line number Diff line /* * Copyright (C) 2006 The Android Open Source Project * Copyright 2006 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. Loading Loading @@ -85,6 +85,7 @@ import android.text.TextUtils; import android.util.Log; import android.util.SparseArray; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.telephony.cdma.CdmaInformationRecords; import com.android.internal.telephony.cdma.CdmaSmsBroadcastConfigInfo; import com.android.internal.telephony.dataconnection.DataCallResponse; Loading @@ -102,176 +103,15 @@ import java.io.PrintWriter; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Random; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicLong; /** * {@hide} */ class RILRequest { static final String LOG_TAG = "RilRequest"; //***** Class Variables static Random sRandom = new Random(); static AtomicInteger sNextSerial = new AtomicInteger(0); private static Object sPoolSync = new Object(); private static RILRequest sPool = null; private static int sPoolSize = 0; private static final int MAX_POOL_SIZE = 4; //***** Instance Variables int mSerial; int mRequest; Message mResult; RILRequest mNext; int mWakeLockType; WorkSource mWorkSource; String mClientId; // time in ms when RIL request was made long mStartTimeMs; /** * Retrieves a new RILRequest instance from the pool. * * @param request RIL_REQUEST_* * @param result sent when operation completes * @return a RILRequest instance from the pool. */ private static RILRequest obtain(int request, Message result) { RILRequest rr = null; synchronized(sPoolSync) { if (sPool != null) { rr = sPool; sPool = rr.mNext; rr.mNext = null; sPoolSize--; } } if (rr == null) { rr = new RILRequest(); } rr.mSerial = sNextSerial.getAndIncrement(); rr.mRequest = request; rr.mResult = result; rr.mWakeLockType = RIL.INVALID_WAKELOCK; rr.mWorkSource = null; rr.mStartTimeMs = SystemClock.elapsedRealtime(); if (result != null && result.getTarget() == null) { throw new NullPointerException("Message target must not be null"); } return rr; } /** * Retrieves a new RILRequest instance from the pool and sets the clientId * * @param request RIL_REQUEST_* * @param result sent when operation completes * @param workSource WorkSource to track the client * @return a RILRequest instance from the pool. */ static RILRequest obtain(int request, Message result, WorkSource workSource) { RILRequest rr = null; rr = obtain(request, result); if(workSource != null) { rr.mWorkSource = workSource; rr.mClientId = String.valueOf(workSource.get(0)) + ":" + workSource.getName(0); } else { Rlog.e(LOG_TAG, "null workSource " + request); } return rr; } /** * Returns a RILRequest instance to the pool. * * Note: This should only be called once per use. */ void release() { synchronized (sPoolSync) { if (sPoolSize < MAX_POOL_SIZE) { mNext = sPool; sPool = this; sPoolSize++; mResult = null; if(mWakeLockType != RIL.INVALID_WAKELOCK) { //This is OK for some wakelock types and not others if(mWakeLockType == RIL.FOR_WAKELOCK) { Rlog.e(LOG_TAG, "RILRequest releasing with held wake lock: " + serialString()); } } } } } private RILRequest() { } static void resetSerial() { // use a random so that on recovery we probably don't mix old requests // with new. sNextSerial.set(sRandom.nextInt()); } String serialString() { //Cheesy way to do %04d StringBuilder sb = new StringBuilder(8); String sn; long adjustedSerial = (((long)mSerial) - Integer.MIN_VALUE)%10000; sn = Long.toString(adjustedSerial); //sb.append("J["); sb.append('['); for (int i = 0, s = sn.length() ; i < 4 - s; i++) { sb.append('0'); } sb.append(sn); sb.append(']'); return sb.toString(); } void onError(int error, Object ret) { CommandException ex; ex = CommandException.fromRilErrno(error); if (RIL.RILJ_LOGD) Rlog.d(LOG_TAG, serialString() + "< " + RIL.requestToString(mRequest) + " error: " + ex + " ret=" + RIL.retToString(mRequest, ret)); if (mResult != null) { AsyncResult.forMessage(mResult, ret, ex); mResult.sendToTarget(); } } } /** * RIL implementation of the CommandsInterface. * * {@hide} */ public final class RIL extends BaseCommands implements CommandsInterface { public class RIL extends BaseCommands implements CommandsInterface { static final String RILJ_LOG_TAG = "RILJ"; // Have a separate wakelock instance for Ack static final String RILJ_ACK_WAKELOCK_NAME = "RILJ_ACK_WL"; Loading Loading @@ -365,10 +205,13 @@ public final class RIL extends BaseCommands implements CommandsInterface { return list; } class RilHandler extends Handler { /** The handler used to handle the internal event of RIL. */ @VisibleForTesting public class RilHandler extends Handler { //***** Handler implementation @Override public void handleMessage(Message msg) { @Override public void handleMessage(Message msg) { RILRequest rr; switch (msg.what) { Loading Loading @@ -498,7 +341,9 @@ public final class RIL extends BaseCommands implements CommandsInterface { // it here. Current hack is to call getService() on death notification after a delay. } private IRadio getRadioProxy(Message result) { /** Returns a {@link IRadio} instance or null if the service is not available. */ @VisibleForTesting public IRadio getRadioProxy(Message result) { if (!mIsMobileNetworkSupported) { if (RILJ_LOGV) riljLog("getRadioProxy: Not calling getService(): wifi-only"); if (result != null) { Loading Loading @@ -544,7 +389,9 @@ public final class RIL extends BaseCommands implements CommandsInterface { return mRadioProxy; } private IOemHook getOemHookProxy(Message result) { /** Returns an {@link IOemHook} instance or null if the service is not available. */ @VisibleForTesting public IOemHook getOemHookProxy(Message result) { if (!mIsMobileNetworkSupported) { if (RILJ_LOGV) riljLog("getOemHookProxy: Not calling getService(): wifi-only"); if (result != null) { Loading Loading @@ -644,8 +491,8 @@ public final class RIL extends BaseCommands implements CommandsInterface { getOemHookProxy(null); } @Override public void setOnNITZTime(Handler h, int what, Object obj) { @Override public void setOnNITZTime(Handler h, int what, Object obj) { super.setOnNITZTime(h, what, obj); // Send the last NITZ time if we have it Loading Loading @@ -687,8 +534,7 @@ public final class RIL extends BaseCommands implements CommandsInterface { } @Override public void getIccCardStatus(Message result) { public void getIccCardStatus(Message result) { IRadio radioProxy = getRadioProxy(result); if (radioProxy != null) { RILRequest rr = obtainRequest(RIL_REQUEST_GET_SIM_STATUS, result, Loading @@ -704,13 +550,13 @@ public final class RIL extends BaseCommands implements CommandsInterface { } } @Override public void supplyIccPin(String pin, Message result) { @Override public void supplyIccPin(String pin, Message result) { supplyIccPinForApp(pin, null, result); } @Override public void supplyIccPinForApp(String pin, String aid, Message result) { @Override public void supplyIccPinForApp(String pin, String aid, Message result) { IRadio radioProxy = getRadioProxy(result); if (radioProxy != null) { RILRequest rr = obtainRequest(RIL_REQUEST_ENTER_SIM_PIN, result, Loading Loading @@ -759,13 +605,13 @@ public final class RIL extends BaseCommands implements CommandsInterface { } } @Override public void supplyIccPin2(String pin, Message result) { @Override public void supplyIccPin2(String pin, Message result) { supplyIccPin2ForApp(pin, null, result); } @Override public void supplyIccPin2ForApp(String pin, String aid, Message result) { @Override public void supplyIccPin2ForApp(String pin, String aid, Message result) { IRadio radioProxy = getRadioProxy(result); if (radioProxy != null) { RILRequest rr = obtainRequest(RIL_REQUEST_ENTER_SIM_PIN2, result, Loading @@ -786,13 +632,13 @@ public final class RIL extends BaseCommands implements CommandsInterface { } } @Override public void supplyIccPuk2(String puk2, String newPin2, Message result) { @Override public void supplyIccPuk2(String puk2, String newPin2, Message result) { supplyIccPuk2ForApp(puk2, newPin2, null, result); } @Override public void supplyIccPuk2ForApp(String puk, String newPin2, String aid, Message result) { @Override public void supplyIccPuk2ForApp(String puk, String newPin2, String aid, Message result) { IRadio radioProxy = getRadioProxy(result); if (radioProxy != null) { RILRequest rr = obtainRequest(RIL_REQUEST_ENTER_SIM_PUK2, result, Loading @@ -814,13 +660,13 @@ public final class RIL extends BaseCommands implements CommandsInterface { } } @Override public void changeIccPin(String oldPin, String newPin, Message result) { @Override public void changeIccPin(String oldPin, String newPin, Message result) { changeIccPinForApp(oldPin, newPin, null, result); } @Override public void changeIccPinForApp(String oldPin, String newPin, String aid, Message result) { @Override public void changeIccPinForApp(String oldPin, String newPin, String aid, Message result) { IRadio radioProxy = getRadioProxy(result); if (radioProxy != null) { RILRequest rr = obtainRequest(RIL_REQUEST_CHANGE_SIM_PIN, result, Loading @@ -842,13 +688,13 @@ public final class RIL extends BaseCommands implements CommandsInterface { } } @Override public void changeIccPin2(String oldPin2, String newPin2, Message result) { @Override public void changeIccPin2(String oldPin2, String newPin2, Message result) { changeIccPin2ForApp(oldPin2, newPin2, null, result); } @Override public void changeIccPin2ForApp(String oldPin2, String newPin2, String aid, Message result) { @Override public void changeIccPin2ForApp(String oldPin2, String newPin2, String aid, Message result) { IRadio radioProxy = getRadioProxy(result); if (radioProxy != null) { RILRequest rr = obtainRequest(RIL_REQUEST_CHANGE_SIM_PIN2, result, Loading Loading @@ -2121,7 +1967,7 @@ public final class RIL extends BaseCommands implements CommandsInterface { try { oemHookProxy.sendRequestRaw(rr.mSerial, primitiveArrayToArrayList(data)); } catch (RemoteException | RuntimeException e) { handleRadioProxyExceptionForRR(rr, "invokeOemRilRequestStrings", e); handleRadioProxyExceptionForRR(rr, "invokeOemRilRequestRaw", e); } } } Loading Loading @@ -3449,8 +3295,7 @@ public final class RIL extends BaseCommands implements CommandsInterface { } @Override public void getHardwareConfig (Message result) { public void getHardwareConfig(Message result) { IRadio radioProxy = getRadioProxy(result); if (radioProxy != null) { RILRequest rr = obtainRequest(RIL_REQUEST_GET_HARDWARE_CONFIG, result, Loading Loading @@ -3986,7 +3831,8 @@ public final class RIL extends BaseCommands implements CommandsInterface { * @param responseInfo RadioResponseInfo received in response callback * @return RILRequest corresponding to the response */ RILRequest processResponse(RadioResponseInfo responseInfo) { @VisibleForTesting public RILRequest processResponse(RadioResponseInfo responseInfo) { int serial = responseInfo.serial; int error = responseInfo.error; int type = responseInfo.type; Loading Loading @@ -4086,7 +3932,8 @@ public final class RIL extends BaseCommands implements CommandsInterface { * @param responseInfo RadioResponseInfo received in the callback * @param ret object to be returned to request sender */ void processResponseDone(RILRequest rr, RadioResponseInfo responseInfo, Object ret) { @VisibleForTesting public void processResponseDone(RILRequest rr, RadioResponseInfo responseInfo, Object ret) { if (responseInfo.error == 0) { if (RILJ_LOGD) { riljLog(rr.serialString() + "< " + requestToString(rr.mRequest) Loading Loading @@ -4155,7 +4002,6 @@ public final class RIL extends BaseCommands implements CommandsInterface { * There is a WAKE_LOCK_TIMEOUT to release the lock, though it shouldn't * happen often. */ private void acquireWakeLock(RILRequest rr, int wakeLockType) { synchronized (rr) { if (rr.mWakeLockType != INVALID_WAKELOCK) { Loading Loading @@ -4206,6 +4052,24 @@ public final class RIL extends BaseCommands implements CommandsInterface { } } /** Returns the wake lock of the given type. */ @VisibleForTesting public WakeLock getWakeLock(int wakeLockType) { return wakeLockType == FOR_WAKELOCK ? mWakeLock : mAckWakeLock; } /** Returns the {@link RilHandler} instance. */ @VisibleForTesting public RilHandler getRilHandler() { return mRilHandler; } /** Returns the Ril request list. */ @VisibleForTesting public SparseArray<RILRequest> getRilRequestList() { return mRequestList; } private void decrementWakeLock(RILRequest rr) { synchronized (rr) { switch(rr.mWakeLockType) { Loading src/java/com/android/internal/telephony/RILRequest.java 0 → 100644 +195 −0 Original line number Diff line number Diff line /* * Copyright (C) 2017 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.internal.telephony; import android.os.AsyncResult; import android.os.Message; import android.os.SystemClock; import android.os.WorkSource; import android.telephony.Rlog; import java.util.Random; import java.util.concurrent.atomic.AtomicInteger; /** * {@hide} */ public class RILRequest { static final String LOG_TAG = "RilRequest"; //***** Class Variables static Random sRandom = new Random(); static AtomicInteger sNextSerial = new AtomicInteger(0); private static Object sPoolSync = new Object(); private static RILRequest sPool = null; private static int sPoolSize = 0; private static final int MAX_POOL_SIZE = 4; //***** Instance Variables int mSerial; int mRequest; Message mResult; RILRequest mNext; int mWakeLockType; WorkSource mWorkSource; String mClientId; // time in ms when RIL request was made long mStartTimeMs; public int getSerial() { return mSerial; } public int getRequest() { return mRequest; } public Message getResult() { return mResult; } /** * Retrieves a new RILRequest instance from the pool. * * @param request RIL_REQUEST_* * @param result sent when operation completes * @return a RILRequest instance from the pool. */ private static RILRequest obtain(int request, Message result) { RILRequest rr = null; synchronized (sPoolSync) { if (sPool != null) { rr = sPool; sPool = rr.mNext; rr.mNext = null; sPoolSize--; } } if (rr == null) { rr = new RILRequest(); } rr.mSerial = sNextSerial.getAndIncrement(); rr.mRequest = request; rr.mResult = result; rr.mWakeLockType = RIL.INVALID_WAKELOCK; rr.mWorkSource = null; rr.mStartTimeMs = SystemClock.elapsedRealtime(); if (result != null && result.getTarget() == null) { throw new NullPointerException("Message target must not be null"); } return rr; } /** * Retrieves a new RILRequest instance from the pool and sets the clientId * * @param request RIL_REQUEST_* * @param result sent when operation completes * @param workSource WorkSource to track the client * @return a RILRequest instance from the pool. */ static RILRequest obtain(int request, Message result, WorkSource workSource) { RILRequest rr = null; rr = obtain(request, result); if (workSource != null) { rr.mWorkSource = workSource; rr.mClientId = String.valueOf(workSource.get(0)) + ":" + workSource.getName(0); } else { Rlog.e(LOG_TAG, "null workSource " + request); } return rr; } /** * Returns a RILRequest instance to the pool. * * Note: This should only be called once per use. */ void release() { synchronized (sPoolSync) { if (sPoolSize < MAX_POOL_SIZE) { mNext = sPool; sPool = this; sPoolSize++; mResult = null; if (mWakeLockType != RIL.INVALID_WAKELOCK) { //This is OK for some wakelock types and not others if (mWakeLockType == RIL.FOR_WAKELOCK) { Rlog.e(LOG_TAG, "RILRequest releasing with held wake lock: " + serialString()); } } } } } private RILRequest() { } static void resetSerial() { // use a random so that on recovery we probably don't mix old requests // with new. sNextSerial.set(sRandom.nextInt()); } String serialString() { //Cheesy way to do %04d StringBuilder sb = new StringBuilder(8); String sn; long adjustedSerial = (((long) mSerial) - Integer.MIN_VALUE) % 10000; sn = Long.toString(adjustedSerial); //sb.append("J["); sb.append('['); for (int i = 0, s = sn.length(); i < 4 - s; i++) { sb.append('0'); } sb.append(sn); sb.append(']'); return sb.toString(); } void onError(int error, Object ret) { CommandException ex; ex = CommandException.fromRilErrno(error); if (RIL.RILJ_LOGD) { Rlog.d(LOG_TAG, serialString() + "< " + RIL.requestToString(mRequest) + " error: " + ex + " ret=" + RIL.retToString(mRequest, ret)); } if (mResult != null) { AsyncResult.forMessage(mResult, ret, ex); mResult.sendToTarget(); } } } tests/telephonytests/src/com/android/internal/telephony/RILTest.java 0 → 100644 +875 −0 File added.Preview size limit exceeded, changes collapsed. Show changes Loading
src/java/com/android/internal/telephony/RIL.java +62 −198 Original line number Diff line number Diff line /* * Copyright (C) 2006 The Android Open Source Project * Copyright 2006 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. Loading Loading @@ -85,6 +85,7 @@ import android.text.TextUtils; import android.util.Log; import android.util.SparseArray; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.telephony.cdma.CdmaInformationRecords; import com.android.internal.telephony.cdma.CdmaSmsBroadcastConfigInfo; import com.android.internal.telephony.dataconnection.DataCallResponse; Loading @@ -102,176 +103,15 @@ import java.io.PrintWriter; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Random; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicLong; /** * {@hide} */ class RILRequest { static final String LOG_TAG = "RilRequest"; //***** Class Variables static Random sRandom = new Random(); static AtomicInteger sNextSerial = new AtomicInteger(0); private static Object sPoolSync = new Object(); private static RILRequest sPool = null; private static int sPoolSize = 0; private static final int MAX_POOL_SIZE = 4; //***** Instance Variables int mSerial; int mRequest; Message mResult; RILRequest mNext; int mWakeLockType; WorkSource mWorkSource; String mClientId; // time in ms when RIL request was made long mStartTimeMs; /** * Retrieves a new RILRequest instance from the pool. * * @param request RIL_REQUEST_* * @param result sent when operation completes * @return a RILRequest instance from the pool. */ private static RILRequest obtain(int request, Message result) { RILRequest rr = null; synchronized(sPoolSync) { if (sPool != null) { rr = sPool; sPool = rr.mNext; rr.mNext = null; sPoolSize--; } } if (rr == null) { rr = new RILRequest(); } rr.mSerial = sNextSerial.getAndIncrement(); rr.mRequest = request; rr.mResult = result; rr.mWakeLockType = RIL.INVALID_WAKELOCK; rr.mWorkSource = null; rr.mStartTimeMs = SystemClock.elapsedRealtime(); if (result != null && result.getTarget() == null) { throw new NullPointerException("Message target must not be null"); } return rr; } /** * Retrieves a new RILRequest instance from the pool and sets the clientId * * @param request RIL_REQUEST_* * @param result sent when operation completes * @param workSource WorkSource to track the client * @return a RILRequest instance from the pool. */ static RILRequest obtain(int request, Message result, WorkSource workSource) { RILRequest rr = null; rr = obtain(request, result); if(workSource != null) { rr.mWorkSource = workSource; rr.mClientId = String.valueOf(workSource.get(0)) + ":" + workSource.getName(0); } else { Rlog.e(LOG_TAG, "null workSource " + request); } return rr; } /** * Returns a RILRequest instance to the pool. * * Note: This should only be called once per use. */ void release() { synchronized (sPoolSync) { if (sPoolSize < MAX_POOL_SIZE) { mNext = sPool; sPool = this; sPoolSize++; mResult = null; if(mWakeLockType != RIL.INVALID_WAKELOCK) { //This is OK for some wakelock types and not others if(mWakeLockType == RIL.FOR_WAKELOCK) { Rlog.e(LOG_TAG, "RILRequest releasing with held wake lock: " + serialString()); } } } } } private RILRequest() { } static void resetSerial() { // use a random so that on recovery we probably don't mix old requests // with new. sNextSerial.set(sRandom.nextInt()); } String serialString() { //Cheesy way to do %04d StringBuilder sb = new StringBuilder(8); String sn; long adjustedSerial = (((long)mSerial) - Integer.MIN_VALUE)%10000; sn = Long.toString(adjustedSerial); //sb.append("J["); sb.append('['); for (int i = 0, s = sn.length() ; i < 4 - s; i++) { sb.append('0'); } sb.append(sn); sb.append(']'); return sb.toString(); } void onError(int error, Object ret) { CommandException ex; ex = CommandException.fromRilErrno(error); if (RIL.RILJ_LOGD) Rlog.d(LOG_TAG, serialString() + "< " + RIL.requestToString(mRequest) + " error: " + ex + " ret=" + RIL.retToString(mRequest, ret)); if (mResult != null) { AsyncResult.forMessage(mResult, ret, ex); mResult.sendToTarget(); } } } /** * RIL implementation of the CommandsInterface. * * {@hide} */ public final class RIL extends BaseCommands implements CommandsInterface { public class RIL extends BaseCommands implements CommandsInterface { static final String RILJ_LOG_TAG = "RILJ"; // Have a separate wakelock instance for Ack static final String RILJ_ACK_WAKELOCK_NAME = "RILJ_ACK_WL"; Loading Loading @@ -365,10 +205,13 @@ public final class RIL extends BaseCommands implements CommandsInterface { return list; } class RilHandler extends Handler { /** The handler used to handle the internal event of RIL. */ @VisibleForTesting public class RilHandler extends Handler { //***** Handler implementation @Override public void handleMessage(Message msg) { @Override public void handleMessage(Message msg) { RILRequest rr; switch (msg.what) { Loading Loading @@ -498,7 +341,9 @@ public final class RIL extends BaseCommands implements CommandsInterface { // it here. Current hack is to call getService() on death notification after a delay. } private IRadio getRadioProxy(Message result) { /** Returns a {@link IRadio} instance or null if the service is not available. */ @VisibleForTesting public IRadio getRadioProxy(Message result) { if (!mIsMobileNetworkSupported) { if (RILJ_LOGV) riljLog("getRadioProxy: Not calling getService(): wifi-only"); if (result != null) { Loading Loading @@ -544,7 +389,9 @@ public final class RIL extends BaseCommands implements CommandsInterface { return mRadioProxy; } private IOemHook getOemHookProxy(Message result) { /** Returns an {@link IOemHook} instance or null if the service is not available. */ @VisibleForTesting public IOemHook getOemHookProxy(Message result) { if (!mIsMobileNetworkSupported) { if (RILJ_LOGV) riljLog("getOemHookProxy: Not calling getService(): wifi-only"); if (result != null) { Loading Loading @@ -644,8 +491,8 @@ public final class RIL extends BaseCommands implements CommandsInterface { getOemHookProxy(null); } @Override public void setOnNITZTime(Handler h, int what, Object obj) { @Override public void setOnNITZTime(Handler h, int what, Object obj) { super.setOnNITZTime(h, what, obj); // Send the last NITZ time if we have it Loading Loading @@ -687,8 +534,7 @@ public final class RIL extends BaseCommands implements CommandsInterface { } @Override public void getIccCardStatus(Message result) { public void getIccCardStatus(Message result) { IRadio radioProxy = getRadioProxy(result); if (radioProxy != null) { RILRequest rr = obtainRequest(RIL_REQUEST_GET_SIM_STATUS, result, Loading @@ -704,13 +550,13 @@ public final class RIL extends BaseCommands implements CommandsInterface { } } @Override public void supplyIccPin(String pin, Message result) { @Override public void supplyIccPin(String pin, Message result) { supplyIccPinForApp(pin, null, result); } @Override public void supplyIccPinForApp(String pin, String aid, Message result) { @Override public void supplyIccPinForApp(String pin, String aid, Message result) { IRadio radioProxy = getRadioProxy(result); if (radioProxy != null) { RILRequest rr = obtainRequest(RIL_REQUEST_ENTER_SIM_PIN, result, Loading Loading @@ -759,13 +605,13 @@ public final class RIL extends BaseCommands implements CommandsInterface { } } @Override public void supplyIccPin2(String pin, Message result) { @Override public void supplyIccPin2(String pin, Message result) { supplyIccPin2ForApp(pin, null, result); } @Override public void supplyIccPin2ForApp(String pin, String aid, Message result) { @Override public void supplyIccPin2ForApp(String pin, String aid, Message result) { IRadio radioProxy = getRadioProxy(result); if (radioProxy != null) { RILRequest rr = obtainRequest(RIL_REQUEST_ENTER_SIM_PIN2, result, Loading @@ -786,13 +632,13 @@ public final class RIL extends BaseCommands implements CommandsInterface { } } @Override public void supplyIccPuk2(String puk2, String newPin2, Message result) { @Override public void supplyIccPuk2(String puk2, String newPin2, Message result) { supplyIccPuk2ForApp(puk2, newPin2, null, result); } @Override public void supplyIccPuk2ForApp(String puk, String newPin2, String aid, Message result) { @Override public void supplyIccPuk2ForApp(String puk, String newPin2, String aid, Message result) { IRadio radioProxy = getRadioProxy(result); if (radioProxy != null) { RILRequest rr = obtainRequest(RIL_REQUEST_ENTER_SIM_PUK2, result, Loading @@ -814,13 +660,13 @@ public final class RIL extends BaseCommands implements CommandsInterface { } } @Override public void changeIccPin(String oldPin, String newPin, Message result) { @Override public void changeIccPin(String oldPin, String newPin, Message result) { changeIccPinForApp(oldPin, newPin, null, result); } @Override public void changeIccPinForApp(String oldPin, String newPin, String aid, Message result) { @Override public void changeIccPinForApp(String oldPin, String newPin, String aid, Message result) { IRadio radioProxy = getRadioProxy(result); if (radioProxy != null) { RILRequest rr = obtainRequest(RIL_REQUEST_CHANGE_SIM_PIN, result, Loading @@ -842,13 +688,13 @@ public final class RIL extends BaseCommands implements CommandsInterface { } } @Override public void changeIccPin2(String oldPin2, String newPin2, Message result) { @Override public void changeIccPin2(String oldPin2, String newPin2, Message result) { changeIccPin2ForApp(oldPin2, newPin2, null, result); } @Override public void changeIccPin2ForApp(String oldPin2, String newPin2, String aid, Message result) { @Override public void changeIccPin2ForApp(String oldPin2, String newPin2, String aid, Message result) { IRadio radioProxy = getRadioProxy(result); if (radioProxy != null) { RILRequest rr = obtainRequest(RIL_REQUEST_CHANGE_SIM_PIN2, result, Loading Loading @@ -2121,7 +1967,7 @@ public final class RIL extends BaseCommands implements CommandsInterface { try { oemHookProxy.sendRequestRaw(rr.mSerial, primitiveArrayToArrayList(data)); } catch (RemoteException | RuntimeException e) { handleRadioProxyExceptionForRR(rr, "invokeOemRilRequestStrings", e); handleRadioProxyExceptionForRR(rr, "invokeOemRilRequestRaw", e); } } } Loading Loading @@ -3449,8 +3295,7 @@ public final class RIL extends BaseCommands implements CommandsInterface { } @Override public void getHardwareConfig (Message result) { public void getHardwareConfig(Message result) { IRadio radioProxy = getRadioProxy(result); if (radioProxy != null) { RILRequest rr = obtainRequest(RIL_REQUEST_GET_HARDWARE_CONFIG, result, Loading Loading @@ -3986,7 +3831,8 @@ public final class RIL extends BaseCommands implements CommandsInterface { * @param responseInfo RadioResponseInfo received in response callback * @return RILRequest corresponding to the response */ RILRequest processResponse(RadioResponseInfo responseInfo) { @VisibleForTesting public RILRequest processResponse(RadioResponseInfo responseInfo) { int serial = responseInfo.serial; int error = responseInfo.error; int type = responseInfo.type; Loading Loading @@ -4086,7 +3932,8 @@ public final class RIL extends BaseCommands implements CommandsInterface { * @param responseInfo RadioResponseInfo received in the callback * @param ret object to be returned to request sender */ void processResponseDone(RILRequest rr, RadioResponseInfo responseInfo, Object ret) { @VisibleForTesting public void processResponseDone(RILRequest rr, RadioResponseInfo responseInfo, Object ret) { if (responseInfo.error == 0) { if (RILJ_LOGD) { riljLog(rr.serialString() + "< " + requestToString(rr.mRequest) Loading Loading @@ -4155,7 +4002,6 @@ public final class RIL extends BaseCommands implements CommandsInterface { * There is a WAKE_LOCK_TIMEOUT to release the lock, though it shouldn't * happen often. */ private void acquireWakeLock(RILRequest rr, int wakeLockType) { synchronized (rr) { if (rr.mWakeLockType != INVALID_WAKELOCK) { Loading Loading @@ -4206,6 +4052,24 @@ public final class RIL extends BaseCommands implements CommandsInterface { } } /** Returns the wake lock of the given type. */ @VisibleForTesting public WakeLock getWakeLock(int wakeLockType) { return wakeLockType == FOR_WAKELOCK ? mWakeLock : mAckWakeLock; } /** Returns the {@link RilHandler} instance. */ @VisibleForTesting public RilHandler getRilHandler() { return mRilHandler; } /** Returns the Ril request list. */ @VisibleForTesting public SparseArray<RILRequest> getRilRequestList() { return mRequestList; } private void decrementWakeLock(RILRequest rr) { synchronized (rr) { switch(rr.mWakeLockType) { Loading
src/java/com/android/internal/telephony/RILRequest.java 0 → 100644 +195 −0 Original line number Diff line number Diff line /* * Copyright (C) 2017 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.internal.telephony; import android.os.AsyncResult; import android.os.Message; import android.os.SystemClock; import android.os.WorkSource; import android.telephony.Rlog; import java.util.Random; import java.util.concurrent.atomic.AtomicInteger; /** * {@hide} */ public class RILRequest { static final String LOG_TAG = "RilRequest"; //***** Class Variables static Random sRandom = new Random(); static AtomicInteger sNextSerial = new AtomicInteger(0); private static Object sPoolSync = new Object(); private static RILRequest sPool = null; private static int sPoolSize = 0; private static final int MAX_POOL_SIZE = 4; //***** Instance Variables int mSerial; int mRequest; Message mResult; RILRequest mNext; int mWakeLockType; WorkSource mWorkSource; String mClientId; // time in ms when RIL request was made long mStartTimeMs; public int getSerial() { return mSerial; } public int getRequest() { return mRequest; } public Message getResult() { return mResult; } /** * Retrieves a new RILRequest instance from the pool. * * @param request RIL_REQUEST_* * @param result sent when operation completes * @return a RILRequest instance from the pool. */ private static RILRequest obtain(int request, Message result) { RILRequest rr = null; synchronized (sPoolSync) { if (sPool != null) { rr = sPool; sPool = rr.mNext; rr.mNext = null; sPoolSize--; } } if (rr == null) { rr = new RILRequest(); } rr.mSerial = sNextSerial.getAndIncrement(); rr.mRequest = request; rr.mResult = result; rr.mWakeLockType = RIL.INVALID_WAKELOCK; rr.mWorkSource = null; rr.mStartTimeMs = SystemClock.elapsedRealtime(); if (result != null && result.getTarget() == null) { throw new NullPointerException("Message target must not be null"); } return rr; } /** * Retrieves a new RILRequest instance from the pool and sets the clientId * * @param request RIL_REQUEST_* * @param result sent when operation completes * @param workSource WorkSource to track the client * @return a RILRequest instance from the pool. */ static RILRequest obtain(int request, Message result, WorkSource workSource) { RILRequest rr = null; rr = obtain(request, result); if (workSource != null) { rr.mWorkSource = workSource; rr.mClientId = String.valueOf(workSource.get(0)) + ":" + workSource.getName(0); } else { Rlog.e(LOG_TAG, "null workSource " + request); } return rr; } /** * Returns a RILRequest instance to the pool. * * Note: This should only be called once per use. */ void release() { synchronized (sPoolSync) { if (sPoolSize < MAX_POOL_SIZE) { mNext = sPool; sPool = this; sPoolSize++; mResult = null; if (mWakeLockType != RIL.INVALID_WAKELOCK) { //This is OK for some wakelock types and not others if (mWakeLockType == RIL.FOR_WAKELOCK) { Rlog.e(LOG_TAG, "RILRequest releasing with held wake lock: " + serialString()); } } } } } private RILRequest() { } static void resetSerial() { // use a random so that on recovery we probably don't mix old requests // with new. sNextSerial.set(sRandom.nextInt()); } String serialString() { //Cheesy way to do %04d StringBuilder sb = new StringBuilder(8); String sn; long adjustedSerial = (((long) mSerial) - Integer.MIN_VALUE) % 10000; sn = Long.toString(adjustedSerial); //sb.append("J["); sb.append('['); for (int i = 0, s = sn.length(); i < 4 - s; i++) { sb.append('0'); } sb.append(sn); sb.append(']'); return sb.toString(); } void onError(int error, Object ret) { CommandException ex; ex = CommandException.fromRilErrno(error); if (RIL.RILJ_LOGD) { Rlog.d(LOG_TAG, serialString() + "< " + RIL.requestToString(mRequest) + " error: " + ex + " ret=" + RIL.retToString(mRequest, ret)); } if (mResult != null) { AsyncResult.forMessage(mResult, ret, ex); mResult.sendToTarget(); } } }
tests/telephonytests/src/com/android/internal/telephony/RILTest.java 0 → 100644 +875 −0 File added.Preview size limit exceeded, changes collapsed. Show changes