diff options
| author | Joey Hewitt <joey@joeyhewitt.com> | 2017-09-09 01:09:47 -0700 |
|---|---|---|
| committer | Joey Hewitt <joey@joeyhewitt.com> | 2017-09-09 17:58:44 -0700 |
| commit | f1c2249d76ea977b5a552adc5cef3c416b0f994f (patch) | |
| tree | 96cf4fc75b87cea8ac07aa4dd53b3572ee2234cb | |
| parent | d8f2d5f4a69b1f38734fbad1c4370245540ca28d (diff) | |
| download | frameworks_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.java | 65 | ||||
| -rw-r--r-- | src/java/net/scintill/ril_ofono/SimModule.java | 28 |
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() { |
