From 03586878fb3d870373f2fdf65afb81cc5ae97067 Mon Sep 17 00:00:00 2001 From: Naveen Kalla Date: Sat, 2 Aug 2014 00:50:29 -0700 Subject: Send Shutdown Request to RIL. Send RIL_REQUEST_SHUTDOWN to RIL when device is shutting down. RIL can use this request to shutdown the SIM card and modem gracefully. Bug: 9773278 Change-Id: I6afa9e810cefc7855f7ae42e51f39cc51fa2aa6e --- .../com/android/internal/telephony/BaseCommands.java | 4 ++++ .../internal/telephony/CommandsInterface.java | 7 +++++++ src/java/com/android/internal/telephony/Phone.java | 10 ++++++++++ .../com/android/internal/telephony/PhoneBase.java | 10 ++++++++++ .../com/android/internal/telephony/PhoneProxy.java | 10 ++++++++++ src/java/com/android/internal/telephony/RIL.java | 20 ++++++++++++++++++++ .../internal/telephony/ServiceStateTracker.java | 9 +++++++++ .../telephony/cdma/CdmaServiceStateTracker.java | 4 +++- .../telephony/gsm/GsmServiceStateTracker.java | 3 +++ .../telephony/imsphone/ImsPhoneCommandInterface.java | 4 ++++ .../internal/telephony/sip/SipCommandInterface.java | 4 ++++ .../internal/telephony/test/SimulatedCommands.java | 5 +++++ 12 files changed, 89 insertions(+), 1 deletion(-) (limited to 'src/java/com') diff --git a/src/java/com/android/internal/telephony/BaseCommands.java b/src/java/com/android/internal/telephony/BaseCommands.java index 47dcc9944..795ecbacd 100644 --- a/src/java/com/android/internal/telephony/BaseCommands.java +++ b/src/java/com/android/internal/telephony/BaseCommands.java @@ -773,4 +773,8 @@ public abstract class BaseCommands implements CommandsInterface { public void setDataAllowed(boolean allowed, Message response) { } + + @Override + public void requestShutdown(Message result) { + } } diff --git a/src/java/com/android/internal/telephony/CommandsInterface.java b/src/java/com/android/internal/telephony/CommandsInterface.java index f323cbca5..cd6124937 100644 --- a/src/java/com/android/internal/telephony/CommandsInterface.java +++ b/src/java/com/android/internal/telephony/CommandsInterface.java @@ -1882,4 +1882,11 @@ public interface CommandsInterface { */ // FIXME We may need to pass AID and slotid also public void setDataAllowed(boolean allowed, Message result); + + /** + * Inform RIL that the device is shutting down + * + * @param result Callback message contains the information of SUCCESS/FAILURE + */ + public void requestShutdown(Message result); } diff --git a/src/java/com/android/internal/telephony/Phone.java b/src/java/com/android/internal/telephony/Phone.java index bbf414c30..ae6f4f5e9 100644 --- a/src/java/com/android/internal/telephony/Phone.java +++ b/src/java/com/android/internal/telephony/Phone.java @@ -1821,4 +1821,14 @@ public interface Phone { * Override the service provider name and the operator name for the input ICCID. */ public boolean setOperatorBrandOverride(String iccId, String brand); + + /** + * Is Radio Present on the device and is it accessible + */ + public boolean isRadioAvailable(); + + /** + * shutdown Radio gracefully + */ + public void shutdownRadio(); } diff --git a/src/java/com/android/internal/telephony/PhoneBase.java b/src/java/com/android/internal/telephony/PhoneBase.java index 0e537fad1..257906f51 100644 --- a/src/java/com/android/internal/telephony/PhoneBase.java +++ b/src/java/com/android/internal/telephony/PhoneBase.java @@ -1859,4 +1859,14 @@ public abstract class PhoneBase extends Handler implements Phone { public boolean setOperatorBrandOverride(String iccId, String brand) { return false; } + + @Override + public boolean isRadioAvailable() { + return mCi.getRadioState().isAvailable(); + } + + @Override + public void shutdownRadio() { + getServiceStateTracker().requestShutdown(); + } } diff --git a/src/java/com/android/internal/telephony/PhoneProxy.java b/src/java/com/android/internal/telephony/PhoneProxy.java index f095a7e46..a44e78478 100644 --- a/src/java/com/android/internal/telephony/PhoneProxy.java +++ b/src/java/com/android/internal/telephony/PhoneProxy.java @@ -1353,4 +1353,14 @@ public class PhoneProxy extends Handler implements Phone { public boolean setOperatorBrandOverride(String iccId, String brand) { return mActivePhone.setOperatorBrandOverride(iccId, brand); } + + @Override + public boolean isRadioAvailable() { + return mCommandsInterface.getRadioState().isAvailable(); + } + + @Override + public void shutdownRadio() { + mActivePhone.shutdownRadio(); + } } diff --git a/src/java/com/android/internal/telephony/RIL.java b/src/java/com/android/internal/telephony/RIL.java index 8b82d5ae9..8802b00f5 100644 --- a/src/java/com/android/internal/telephony/RIL.java +++ b/src/java/com/android/internal/telephony/RIL.java @@ -1498,6 +1498,16 @@ public final class RIL extends BaseCommands implements CommandsInterface { send(rr); } + @Override + public void requestShutdown(Message result) { + RILRequest rr = RILRequest.obtain(RIL_REQUEST_SHUTDOWN, result); + + if (RILJ_LOGD) + riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)); + + send(rr); + } + @Override public void setSuppServiceNotifications(boolean enable, Message result) { @@ -2499,6 +2509,7 @@ public final class RIL extends BaseCommands implements CommandsInterface { case RIL_REQUEST_ALLOW_DATA: ret = responseVoid(p); break; case RIL_REQUEST_GET_HARDWARE_CONFIG: ret = responseHardwareConfig(p); break; case RIL_REQUEST_SIM_AUTHENTICATION: ret = responseICC_IOBase64(p); break; + case RIL_REQUEST_SHUTDOWN: ret = responseVoid(p); break; default: throw new RuntimeException("Unrecognized solicited response: " + rr.mRequest); //break; @@ -2517,6 +2528,14 @@ public final class RIL extends BaseCommands implements CommandsInterface { } } + if (rr.mRequest == RIL_REQUEST_SHUTDOWN) { + // Set RADIO_STATE to RADIO_UNAVAILABLE to continue shutdown process + // regardless of error code to continue shutdown procedure. + riljLog("Response to RIL_REQUEST_SHUTDOWN received. Error is " + + error + " Setting Radio State to Unavailable regardless of error."); + setRadioState(RadioState.RADIO_UNAVAILABLE); + } + // Here and below fake RIL_UNSOL_RESPONSE_SIM_STATUS_CHANGED, see b/7255789. // This is needed otherwise we don't automatically transition to the main lock // screen when the pin or puk is entered incorrectly. @@ -3926,6 +3945,7 @@ public final class RIL extends BaseCommands implements CommandsInterface { case RIL_REQUEST_ALLOW_DATA: return "RIL_REQUEST_ALLOW_DATA"; case RIL_REQUEST_GET_HARDWARE_CONFIG: return "GET_HARDWARE_CONFIG"; case RIL_REQUEST_SIM_AUTHENTICATION: return "RIL_REQUEST_SIM_AUTHENTICATION"; + case RIL_REQUEST_SHUTDOWN: return "RIL_REQUEST_SHUTDOWN"; default: return ""; } } diff --git a/src/java/com/android/internal/telephony/ServiceStateTracker.java b/src/java/com/android/internal/telephony/ServiceStateTracker.java index 96c45a1ef..6cf0a41db 100644 --- a/src/java/com/android/internal/telephony/ServiceStateTracker.java +++ b/src/java/com/android/internal/telephony/ServiceStateTracker.java @@ -210,6 +210,8 @@ public abstract class ServiceStateTracker extends Handler { protected PendingIntent mRadioOffIntent = null; protected static final String ACTION_RADIO_OFF = "android.intent.action.ACTION_RADIO_OFF"; protected boolean mPowerOffDelayNeed = true; + protected boolean mDeviceShuttingDown = false; + protected ServiceStateTracker(PhoneBase phoneBase, CommandsInterface ci, CellInfo cellInfo) { mPhoneBase = phoneBase; @@ -226,6 +228,13 @@ public abstract class ServiceStateTracker extends Handler { ServiceState.rilRadioTechnologyToString(ServiceState.RIL_RADIO_TECHNOLOGY_UNKNOWN)); } + void requestShutdown() { + if (mDeviceShuttingDown == true) return; + mDeviceShuttingDown = true; + mDesiredPowerState = false; + setPowerStateToDesired(); + } + public void dispose() { mCi.unSetOnSignalStrengthUpdate(this); mUiccController.unregisterForIccChanged(this); diff --git a/src/java/com/android/internal/telephony/cdma/CdmaServiceStateTracker.java b/src/java/com/android/internal/telephony/cdma/CdmaServiceStateTracker.java index a3fc310f9..8e0fbc719 100644 --- a/src/java/com/android/internal/telephony/cdma/CdmaServiceStateTracker.java +++ b/src/java/com/android/internal/telephony/cdma/CdmaServiceStateTracker.java @@ -534,7 +534,9 @@ public class CdmaServiceStateTracker extends ServiceStateTracker { // If it's on and available and we want it off gracefully powerOffRadioSafely(dcTracker); - } // Otherwise, we're in the desired state + } else if (mDeviceShuttingDown && mCi.getRadioState().isAvailable()) { + mCi.requestShutdown(null); + } } @Override diff --git a/src/java/com/android/internal/telephony/gsm/GsmServiceStateTracker.java b/src/java/com/android/internal/telephony/gsm/GsmServiceStateTracker.java index b099a9acd..e14216e2d 100644 --- a/src/java/com/android/internal/telephony/gsm/GsmServiceStateTracker.java +++ b/src/java/com/android/internal/telephony/gsm/GsmServiceStateTracker.java @@ -507,6 +507,7 @@ final class GsmServiceStateTracker extends ServiceStateTracker { protected void setPowerStateToDesired() { if (DBG) { + log("mDeviceShuttingDown = " + mDeviceShuttingDown); log("mDesiredPowerState = " + mDesiredPowerState); log("getRadioState = " + mCi.getRadioState()); log("mPowerOffDelayNeed = " + mPowerOffDelayNeed); @@ -548,6 +549,8 @@ final class GsmServiceStateTracker extends ServiceStateTracker { DcTrackerBase dcTracker = mPhone.mDcTracker; powerOffRadioSafely(dcTracker); } + } else if (mDeviceShuttingDown && mCi.getRadioState().isAvailable()) { + mCi.requestShutdown(null); } } diff --git a/src/java/com/android/internal/telephony/imsphone/ImsPhoneCommandInterface.java b/src/java/com/android/internal/telephony/imsphone/ImsPhoneCommandInterface.java index 28bcf6a42..849eeeef0 100644 --- a/src/java/com/android/internal/telephony/imsphone/ImsPhoneCommandInterface.java +++ b/src/java/com/android/internal/telephony/imsphone/ImsPhoneCommandInterface.java @@ -591,4 +591,8 @@ class ImsPhoneCommandInterface extends BaseCommands implements CommandsInterface @Override public void getHardwareConfig(Message result) {} + + @Override + public void requestShutdown(Message result) { + } } diff --git a/src/java/com/android/internal/telephony/sip/SipCommandInterface.java b/src/java/com/android/internal/telephony/sip/SipCommandInterface.java index 433e9f292..bc90229a2 100644 --- a/src/java/com/android/internal/telephony/sip/SipCommandInterface.java +++ b/src/java/com/android/internal/telephony/sip/SipCommandInterface.java @@ -602,4 +602,8 @@ class SipCommandInterface extends BaseCommands implements CommandsInterface { @Override public void getHardwareConfig(Message result) { } + + @Override + public void requestShutdown(Message result) { + } } diff --git a/src/java/com/android/internal/telephony/test/SimulatedCommands.java b/src/java/com/android/internal/telephony/test/SimulatedCommands.java index 11bc6ad30..1a3bab72f 100644 --- a/src/java/com/android/internal/telephony/test/SimulatedCommands.java +++ b/src/java/com/android/internal/telephony/test/SimulatedCommands.java @@ -1735,4 +1735,9 @@ public final class SimulatedCommands extends BaseCommands public void getHardwareConfig(Message result) { unimplemented(result); } + + @Override + public void requestShutdown(Message result) { + setRadioState(RadioState.RADIO_UNAVAILABLE); + } } -- cgit v1.2.3