refactor radioPowerstate

1. new System API for getRadioPowerState with permision check
2. new System API for onRadioPowerStateChanged in PhoneStateListener
3. replace radioState enum in CommandsInterface to telephonyMgr defined
int.

Bug: 117349311
Test: telephony unit test
Change-Id: I502568280fbf9213ca6bf1f7fb204d0d4ce86580
This commit is contained in:
chen xu
2018-10-11 13:18:26 -07:00
committed by Chen Xu
parent e976a1324b
commit 700c8a0389
7 changed files with 136 additions and 0 deletions

View File

@@ -5324,6 +5324,11 @@ package android.telephony {
field public static final int RESULT_SUCCESS = 0; // 0x0
}
public class PhoneStateListener {
method public void onRadioPowerStateChanged(int);
field public static final int LISTEN_RADIO_POWER_STATE_CHANGED = 8388608; // 0x800000
}
public class ServiceState implements android.os.Parcelable {
method public android.telephony.NetworkRegistrationState getNetworkRegistrationState(int, int);
method public java.util.List<android.telephony.NetworkRegistrationState> getNetworkRegistrationStates();
@@ -5451,6 +5456,7 @@ package android.telephony {
method public boolean getEmergencyCallbackMode();
method public java.lang.String getIsimDomain();
method public int getPreferredNetworkType(int);
method public int getRadioPowerState();
method public int getSimApplicationState();
method public int getSimCardState();
method public java.util.List<android.telephony.TelephonyHistogram> getTelephonyHistograms();
@@ -5514,6 +5520,9 @@ package android.telephony {
field public static final int NETWORK_MODE_TDSCDMA_WCDMA = 14; // 0xe
field public static final int NETWORK_MODE_WCDMA_ONLY = 2; // 0x2
field public static final int NETWORK_MODE_WCDMA_PREF = 0; // 0x0
field public static final int RADIO_POWER_OFF = 0; // 0x0
field public static final int RADIO_POWER_ON = 1; // 0x1
field public static final int RADIO_POWER_UNAVAILABLE = 2; // 0x2
field public static final int SIM_ACTIVATION_STATE_ACTIVATED = 2; // 0x2
field public static final int SIM_ACTIVATION_STATE_ACTIVATING = 1; // 0x1
field public static final int SIM_ACTIVATION_STATE_DEACTIVATED = 3; // 0x3

View File

@@ -216,6 +216,9 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub {
private int mPreferredDataSubId = SubscriptionManager.INVALID_SUBSCRIPTION_ID;
@TelephonyManager.RadioPowerState
private int mRadioPowerState = TelephonyManager.RADIO_POWER_UNAVAILABLE;
private final LocalLog mLocalLog = new LocalLog(100);
private PreciseDataConnectionState mPreciseDataConnectionState =
@@ -762,6 +765,13 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub {
remove(r.binder);
}
}
if ((events & PhoneStateListener.LISTEN_RADIO_POWER_STATE_CHANGED) != 0) {
try {
r.callback.onRadioPowerStateChanged(mRadioPowerState);
} catch (RemoteException ex) {
remove(r.binder);
}
}
}
}
} else {
@@ -1609,6 +1619,32 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub {
}
}
public void notifyRadioPowerStateChanged(@TelephonyManager.RadioPowerState int state) {
if (!checkNotifyPermission("notifyRadioPowerStateChanged()")) {
return;
}
if (VDBG) {
log("notifyRadioPowerStateChanged: state= " + state);
}
synchronized (mRecords) {
mRadioPowerState = state;
for (Record r : mRecords) {
if (r.matchPhoneStateListenerEvent(
PhoneStateListener.LISTEN_RADIO_POWER_STATE_CHANGED)) {
try {
r.callback.onRadioPowerStateChanged(state);
} catch (RemoteException ex) {
mRemoveList.add(r.binder);
}
}
}
handleRemoveListLocked();
}
}
@Override
public void dump(FileDescriptor fd, PrintWriter writer, String[] args) {
final IndentingPrintWriter pw = new IndentingPrintWriter(writer, " ");
@@ -1646,6 +1682,7 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub {
pw.println("mVoLteServiceState=" + mVoLteServiceState);
pw.println("mPhoneCapability=" + mPhoneCapability);
pw.println("mPreferredDataSubId=" + mPreferredDataSubId);
pw.println("mRadioPowerState=" + mRadioPowerState);
pw.decreaseIndent();

View File

@@ -17,6 +17,7 @@
package android.telephony;
import android.annotation.NonNull;
import android.annotation.SystemApi;
import android.annotation.UnsupportedAppUsage;
import android.os.Bundle;
import android.os.Handler;
@@ -291,6 +292,15 @@ public class PhoneStateListener {
*/
public static final int LISTEN_PREFERRED_DATA_SUBID_CHANGE = 0x00400000;
/**
* Listen for changes to the radio power state.
*
* @see #onRadioPowerStateChanged
* @hide
*/
@SystemApi
public static final int LISTEN_RADIO_POWER_STATE_CHANGED = 0x00800000;
/*
* Subscription used to listen to the phone state changes
* @hide
@@ -420,6 +430,9 @@ public class PhoneStateListener {
case LISTEN_PREFERRED_DATA_SUBID_CHANGE:
PhoneStateListener.this.onPreferredDataSubIdChanged((int) msg.obj);
break;
case LISTEN_RADIO_POWER_STATE_CHANGED:
PhoneStateListener.this.onRadioPowerStateChanged((int) msg.obj);
break;
}
}
};
@@ -671,6 +684,17 @@ public class PhoneStateListener {
// default implementation empty
}
/**
* Callback invoked when modem radio power state changes. Requires
* the READ_PRIVILEGED_PHONE_STATE permission.
* @param state the modem radio power state
* @hide
*/
@SystemApi
public void onRadioPowerStateChanged(@TelephonyManager.RadioPowerState int state) {
// default implementation empty
}
/**
* Callback invoked when telephony has received notice from a carrier
* app that a network action that could result in connectivity loss
@@ -807,6 +831,10 @@ public class PhoneStateListener {
send(LISTEN_PREFERRED_DATA_SUBID_CHANGE, 0, 0, subId);
}
public void onRadioPowerStateChanged(@TelephonyManager.RadioPowerState int state) {
send(LISTEN_RADIO_POWER_STATE_CHANGED, 0, 0, state);
}
}
/**

View File

@@ -6869,6 +6869,60 @@ public class TelephonyManager {
return false;
}
/** @hide */
@Retention(RetentionPolicy.SOURCE)
@IntDef(prefix = {"RADIO_POWER_"},
value = {RADIO_POWER_OFF,
RADIO_POWER_ON,
RADIO_POWER_UNAVAILABLE,
})
public @interface RadioPowerState {}
/**
* Radio explicitly powered off (e.g, airplane mode).
* @hide
*/
@SystemApi
public static final int RADIO_POWER_OFF = 0;
/**
* Radio power is on.
* @hide
*/
@SystemApi
public static final int RADIO_POWER_ON = 1;
/**
* Radio power unavailable (eg, modem resetting or not booted).
* @hide
*/
@SystemApi
public static final int RADIO_POWER_UNAVAILABLE = 2;
/**
* @return current modem radio state.
*
* <p>Requires permission: {@link android.Manifest.permission#READ_PRIVILEGED_PHONE_STATE} or
* {@link android.Manifest.permission#READ_PHONE_STATE} or that the calling
* app has carrier privileges (see {@link #hasCarrierPrivileges}).
*
* @hide
*/
@SystemApi
@RequiresPermission(anyOf = {android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE,
android.Manifest.permission.READ_PHONE_STATE})
public @RadioPowerState int getRadioPowerState() {
try {
ITelephony telephony = getITelephony();
if (telephony != null) {
return telephony.getRadioPowerState(getSlotIndex(), mContext.getOpPackageName());
}
} catch (RemoteException ex) {
// This could happen if binder process crashes.
}
return RADIO_POWER_UNAVAILABLE;
}
/** @hide */
@SystemApi
@SuppressLint("Doclava125")

View File

@@ -53,5 +53,6 @@ oneway interface IPhoneStateListener {
void onUserMobileDataStateChanged(in boolean enabled);
void onPhoneCapabilityChanged(in PhoneCapability capability);
void onPreferredDataSubIdChanged(in int subId);
void onRadioPowerStateChanged(in int state);
}

View File

@@ -1499,4 +1499,10 @@ interface ITelephony {
* Set the default SMS app to a given package on a given user.
*/
void setDefaultSmsApp(int userId, String packageName);
/**
* Return the modem radio power state for slot index.
*
*/
int getRadioPowerState(int slotIndex, String callingPackage);
}

View File

@@ -80,4 +80,5 @@ interface ITelephonyRegistry {
void notifyUserMobileDataStateChangedForPhoneId(in int phoneId, in int subId, in boolean state);
void notifyPhoneCapabilityChanged(in PhoneCapability capability);
void notifyPreferredDataSubIdChanged(int preferredSubId);
void notifyRadioPowerStateChanged(in int state);
}