summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJoey Hewitt <joey@joeyhewitt.com>2017-09-09 01:09:47 -0700
committerJoey Hewitt <joey@joeyhewitt.com>2017-09-09 17:58:44 -0700
commitf1c2249d76ea977b5a552adc5cef3c416b0f994f (patch)
tree96cf4fc75b87cea8ac07aa4dd53b3572ee2234cb
parentd8f2d5f4a69b1f38734fbad1c4370245540ca28d (diff)
downloadframeworks_opt_telephony_ril_ofono-f1c2249d76ea977b5a552adc5cef3c416b0f994f.tar.gz
frameworks_opt_telephony_ril_ofono-f1c2249d76ea977b5a552adc5cef3c416b0f994f.tar.bz2
frameworks_opt_telephony_ril_ofono-f1c2249d76ea977b5a552adc5cef3c416b0f994f.zip
implement voicemail alert: put count in EF_MWIS
Fix bugs and cleanup the SIM file refresh implementation since it was hard to test in the last commit.
-rw-r--r--src/java/net/scintill/ril_ofono/SimFiles.java65
-rw-r--r--src/java/net/scintill/ril_ofono/SimModule.java28
2 files changed, 61 insertions, 32 deletions
diff --git a/src/java/net/scintill/ril_ofono/SimFiles.java b/src/java/net/scintill/ril_ofono/SimFiles.java
index ee99db3..6cda1c0 100644
--- a/src/java/net/scintill/ril_ofono/SimFiles.java
+++ b/src/java/net/scintill/ril_ofono/SimFiles.java
@@ -90,32 +90,34 @@ import static net.scintill.ril_ofono.PropManager.getProp;
}
}
- private Map<String, SimFileGetter> mSimFiles = new HashMap<>();
+ private Map<String, SimFileFunction> mSimFiles = new HashMap<>();
private Map<String, List<Integer>> mMapPropToDependentFileId = new HashMap<>();
private SimFile getSimFile(String path, int fileid) {
- SimFileGetter sfg = mSimFiles.get(path + IntegralToString.intToHexString(fileid, false, 4));
+ SimFileFunction sfg = mSimFiles.get(path + IntegralToString.intToHexString(fileid, false, 4));
return sfg != null ? sfg.getSimFile() : null;
}
- interface SimFileGetter {
+ interface SimFileFunction {
SimFile getSimFile();
}
- private void addSimFile(String path, int fileid, SimFileGetter getter, Object propHolder, String dependentPropName) {
- mSimFiles.put(path + IntegralToString.intToHexString(fileid, false, 4), getter);
- String mapkey = propHolder.hashCode() + dependentPropName;
- if (mMapPropToDependentFileId.get(mapkey) == null) {
- List<Integer> newList = new ArrayList<>();
- newList.add(fileid);
- mMapPropToDependentFileId.put(mapkey, newList);
- } else {
- mMapPropToDependentFileId.get(mapkey).add(fileid);
+ private void addSimFile(String path, int fileid, SimFileFunction fileFunction, String... dependentPropNames) {
+ mSimFiles.put(path + IntegralToString.intToHexString(fileid, false, 4), fileFunction);
+ for (String dependentPropName : dependentPropNames) {
+ String mapkey = dependentPropName;
+ if (mMapPropToDependentFileId.get(mapkey) == null) {
+ List<Integer> newList = new ArrayList<>();
+ newList.add(fileid);
+ mMapPropToDependentFileId.put(mapkey, newList);
+ } else {
+ mMapPropToDependentFileId.get(mapkey).add(fileid);
+ }
}
}
- /*package*/ void onPropChange(Object propHolder, String propName) {
- List<Integer> fileIds = mMapPropToDependentFileId.get(propHolder.hashCode() + propName);
+ /*package*/ void notifyPropChangeForPotentialFileRefresh(String propName) {
+ List<Integer> fileIds = mMapPropToDependentFileId.get(propName);
if (fileIds != null) {
for (int fileId : fileIds) {
IccRefreshResponse irr = new IccRefreshResponse();
@@ -131,8 +133,10 @@ import static net.scintill.ril_ofono.PropManager.getProp;
final String CARD_IDENTIFIER = "CardIdentifier";
final String SUBSCRIBER_NUMBERS = "SubscriberNumbers";
final String VOICEMAIL_MAILBOX_NUMBER = "VoicemailMailboxNumber";
+ final String VOICEMAIL_WAITING = "VoicemailWaiting";
+ final String VOICEMAIL_MESSAGE_COUNT = "VoicemailMessageCount";
- addSimFile(IccConstants.MF_SIM, IccConstants.EF_ICCID, new SimFileGetter() {
+ addSimFile(IccConstants.MF_SIM, IccConstants.EF_ICCID, new SimFileFunction() {
@Override
public SimFile getSimFile() {
String iccid = getProp(mSimProps, CARD_IDENTIFIER, (String)null);
@@ -144,8 +148,9 @@ import static net.scintill.ril_ofono.PropManager.getProp;
file.mData = Utils.stringToBcd(iccid);
return file;
}
- }, mSimProps, CARD_IDENTIFIER);
- addSimFile(IccConstants.MF_SIM + IccConstants.DF_TELECOM, IccConstants.EF_MSISDN, new SimFileGetter() {
+ }, CARD_IDENTIFIER);
+
+ addSimFile(IccConstants.MF_SIM + IccConstants.DF_TELECOM, IccConstants.EF_MSISDN, new SimFileFunction() {
@Override
public SimFile getSimFile() {
String[] numbers = getProp(mSimProps, SUBSCRIBER_NUMBERS, new String[0]);
@@ -157,8 +162,9 @@ import static net.scintill.ril_ofono.PropManager.getProp;
file.mData = new AdnRecord(null, numbers[0]).buildAdnString(ADN_FOOTER_SIZE);
return file;
}
- }, mSimProps, SUBSCRIBER_NUMBERS);
- addSimFile(IccConstants.MF_SIM + IccConstants.DF_GSM, IccConstants.EF_MBI, new SimFileGetter() {
+ }, SUBSCRIBER_NUMBERS);
+
+ addSimFile(IccConstants.MF_SIM + IccConstants.DF_GSM, IccConstants.EF_MBI, new SimFileFunction() {
@Override
public SimFile getSimFile() {
String voicemailNumber = getProp(mMsgWaitingProps, VOICEMAIL_MAILBOX_NUMBER, (String)null);
@@ -171,8 +177,9 @@ import static net.scintill.ril_ofono.PropManager.getProp;
file.mData = new byte[] { 0x01 /*voicemail index to the below record (we only have one)*/, 0x00, 0x00, 0x00 };
return file;
}
- }, mMsgWaitingProps, VOICEMAIL_MAILBOX_NUMBER);
- addSimFile(IccConstants.MF_SIM + IccConstants.DF_GSM, IccConstants.EF_MBDN, new SimFileGetter() {
+ }, VOICEMAIL_MAILBOX_NUMBER);
+
+ addSimFile(IccConstants.MF_SIM + IccConstants.DF_GSM, IccConstants.EF_MBDN, new SimFileFunction() {
@Override
public SimFile getSimFile() {
String voicemailNumber = getProp(mMsgWaitingProps, VOICEMAIL_MAILBOX_NUMBER, (String)null);
@@ -184,7 +191,21 @@ import static net.scintill.ril_ofono.PropManager.getProp;
file.mData = new AdnRecord(null, voicemailNumber).buildAdnString(ADN_FOOTER_SIZE);
return file;
}
- }, mMsgWaitingProps, VOICEMAIL_MAILBOX_NUMBER);
+ }, VOICEMAIL_MAILBOX_NUMBER);
+
+ addSimFile(IccConstants.MF_SIM + IccConstants.DF_GSM, IccConstants.EF_MWIS, new SimFileFunction() {
+ @Override
+ public SimFile getSimFile() {
+ boolean waiting = getProp(mMsgWaitingProps, VOICEMAIL_WAITING, Boolean.FALSE);
+ int count = getProp(mMsgWaitingProps, VOICEMAIL_MESSAGE_COUNT, (Number)0).byteValue() & 0xff;
+
+ SimFile file = new SimFile();
+ file.mType = TYPE_EF;
+ file.mResponseDataStructure = EF_TYPE_LINEAR_FIXED;
+ file.mData = new byte[] { (byte)(waiting ? 1 : 0), (byte)count };
+ return file;
+ }
+ }, VOICEMAIL_WAITING, VOICEMAIL_MESSAGE_COUNT);
}
class SimFile {
diff --git a/src/java/net/scintill/ril_ofono/SimModule.java b/src/java/net/scintill/ril_ofono/SimModule.java
index 27fbe40..b0a7885 100644
--- a/src/java/net/scintill/ril_ofono/SimModule.java
+++ b/src/java/net/scintill/ril_ofono/SimModule.java
@@ -19,8 +19,6 @@
package net.scintill.ril_ofono;
-import android.os.Registrant;
-
import com.android.internal.telephony.CommandException;
import com.android.internal.telephony.uicc.IccCardApplicationStatus;
import com.android.internal.telephony.uicc.IccCardStatus;
@@ -44,22 +42,24 @@ import static net.scintill.ril_ofono.RilOfono.runOnMainThreadDebounced;
private RegistrantList mIccStatusChangedRegistrants;
- private final Map<String, Variant<?>> mMsgWaitingProps = new HashMap<>();
-
private final Map<String, Variant<?>> mSimProps = new HashMap<>();
private final SimFiles mSimFiles;
+ private boolean mSimShownToUsersOnce = false;
+
/*package*/ static final String SIM_APP_ID = "00";
/*package*/ SimModule(RegistrantList iccStatusChangedRegistrants, RegistrantList iccRefreshRegistrants) {
+ Map<String, Variant<?>> msgWaitingProps = new HashMap<>();
+
mIccStatusChangedRegistrants = iccStatusChangedRegistrants;
- mSimFiles = new SimFiles(mSimProps, mMsgWaitingProps, iccRefreshRegistrants);
+ mSimFiles = new SimFiles(mSimProps, msgWaitingProps, iccRefreshRegistrants);
SimManager sim = RilOfono.sInstance.getOfonoInterface(SimManager.class);
MessageWaiting msgWaiting = RilOfono.sInstance.getOfonoInterface(MessageWaiting.class);
mirrorProps(SimManager.class, sim, SimManager.PropertyChanged.class, mSimProps);
- mirrorProps(MessageWaiting.class, msgWaiting, MessageWaiting.PropertyChanged.class, mMsgWaitingProps);
+ mirrorProps(MessageWaiting.class, msgWaiting, MessageWaiting.PropertyChanged.class, msgWaitingProps);
}
@Override
@@ -118,6 +118,7 @@ import static net.scintill.ril_ofono.RilOfono.runOnMainThreadDebounced;
if (cardStatus.mCardState == CardState.CARDSTATE_PRESENT) {
cardStatus.mGsmUmtsSubscriptionAppIndex = 0;
cardStatus.mApplications = new IccCardApplicationStatus[] { gsmAppStatus };
+ mSimShownToUsersOnce = true;
} else {
cardStatus.mGsmUmtsSubscriptionAppIndex = -1;
cardStatus.mApplications = new IccCardApplicationStatus[0];
@@ -129,13 +130,20 @@ import static net.scintill.ril_ofono.RilOfono.runOnMainThreadDebounced;
}
protected void onPropChange(SimManager simManager, String name, Variant<?> value) {
- // TODO check if something that we report actually changed?
- runOnMainThreadDebounced(mFnNotifySimChanged, 350);
- mSimFiles.onPropChange(mSimProps, name);
+ if (name.equals("Present")) {
+ runOnMainThreadDebounced(mFnNotifySimChanged, 350);
+ }
+
+ // don't bother with file refreshes if we haven't shown anything to callers (that is, we're still initializing)
+ if (mSimShownToUsersOnce) {
+ mSimFiles.notifyPropChangeForPotentialFileRefresh(name);
+ }
}
protected void onPropChange(MessageWaiting messageWaiting, String name, Variant<?> value) {
- mSimFiles.onPropChange(mMsgWaitingProps, name);
+ if (mSimShownToUsersOnce) {
+ mSimFiles.notifyPropChangeForPotentialFileRefresh(name);
+ }
}
private DebouncedRunnable mFnNotifySimChanged = new DebouncedRunnable() {