diff options
author | Eric Erfanian <erfanian@google.com> | 2017-03-15 14:41:07 -0700 |
---|---|---|
committer | Eric Erfanian <erfanian@google.com> | 2017-03-15 16:24:23 -0700 |
commit | d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9 (patch) | |
tree | b54abbb51fb7d66e7755a1fbb5db023ff601090b /java/com/android/voicemailomtp/sms | |
parent | 30436e7e6d3f2c8755a91b2b6222b74d465a9e87 (diff) |
Update Dialer source from latest green build.
* Refactor voicemail component
* Add new enriched calling components
Test: treehugger, manual aosp testing
Change-Id: I521a0f86327d4b42e14d93927c7d613044ed5942
Diffstat (limited to 'java/com/android/voicemailomtp/sms')
9 files changed, 0 insertions, 1085 deletions
diff --git a/java/com/android/voicemailomtp/sms/LegacyModeSmsHandler.java b/java/com/android/voicemailomtp/sms/LegacyModeSmsHandler.java deleted file mode 100644 index bb722bffc..000000000 --- a/java/com/android/voicemailomtp/sms/LegacyModeSmsHandler.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright (C) 2016 Google Inc. All Rights Reserved. - * - * 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.voicemailomtp.sms; - -import android.content.Context; -import android.os.Bundle; -import android.telecom.PhoneAccountHandle; -import android.telephony.VisualVoicemailSms; - -import com.android.voicemailomtp.OmtpConstants; -import com.android.voicemailomtp.OmtpVvmCarrierConfigHelper; -import com.android.voicemailomtp.TelephonyManagerStub; -import com.android.voicemailomtp.VvmLog; - -/** - * Class ot handle voicemail SMS under legacy mode - * - * @see OmtpVvmCarrierConfigHelper#isLegacyModeEnabled() - */ -public class LegacyModeSmsHandler { - - private static final String TAG = "LegacyModeSmsHandler"; - - public static void handle(Context context, VisualVoicemailSms sms) { - VvmLog.v(TAG, "processing VVM SMS on legacy mode"); - String eventType = sms.getPrefix(); - Bundle data = sms.getFields(); - PhoneAccountHandle handle = sms.getPhoneAccountHandle(); - - if (eventType.equals(OmtpConstants.SYNC_SMS_PREFIX)) { - SyncMessage message = new SyncMessage(data); - VvmLog.v(TAG, "Received SYNC sms for " + handle + - " with event " + message.getSyncTriggerEvent()); - - switch (message.getSyncTriggerEvent()) { - case OmtpConstants.NEW_MESSAGE: - case OmtpConstants.MAILBOX_UPDATE: - // The user has called into the voicemail and the new message count could - // change. - // For some carriers new message count could be set to 0 even if there are still - // unread messages, to clear the message waiting indicator. - VvmLog.v(TAG, "updating MWI"); - - // Setting voicemail message count to non-zero will show the telephony voicemail - // notification, and zero will clear it. - TelephonyManagerStub.showVoicemailNotification(message.getNewMessageCount()); - break; - default: - break; - } - } - } -} diff --git a/java/com/android/voicemailomtp/sms/OmtpCvvmMessageSender.java b/java/com/android/voicemailomtp/sms/OmtpCvvmMessageSender.java deleted file mode 100644 index 63af2c13d..000000000 --- a/java/com/android/voicemailomtp/sms/OmtpCvvmMessageSender.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright (C) 2015 Google Inc. All Rights Reserved. - * - * 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.voicemailomtp.sms; - -import android.app.PendingIntent; -import android.content.Context; -import android.support.annotation.Nullable; -import android.telecom.PhoneAccountHandle; -import android.telephony.SmsManager; -import com.android.voicemailomtp.OmtpConstants; - -/** - * An implementation of the OmtpMessageSender for T-Mobile. - */ -public class OmtpCvvmMessageSender extends OmtpMessageSender { - public OmtpCvvmMessageSender(Context context, PhoneAccountHandle phoneAccountHandle, - short applicationPort, String destinationNumber) { - super(context, phoneAccountHandle, applicationPort, destinationNumber); - } - - @Override - public void requestVvmActivation(@Nullable PendingIntent sentIntent) { - sendCvvmMessage(OmtpConstants.ACTIVATE_REQUEST, sentIntent); - } - - @Override - public void requestVvmDeactivation(@Nullable PendingIntent sentIntent) { - sendCvvmMessage(OmtpConstants.DEACTIVATE_REQUEST, sentIntent); - } - - @Override - public void requestVvmStatus(@Nullable PendingIntent sentIntent) { - sendCvvmMessage(OmtpConstants.STATUS_REQUEST, sentIntent); - } - - private void sendCvvmMessage(String request, PendingIntent sentIntent) { - StringBuilder sb = new StringBuilder().append(request); - sb.append(OmtpConstants.SMS_PREFIX_SEPARATOR); - appendField(sb, "dt", "15"); - sendSms(sb.toString(), sentIntent); - } -} diff --git a/java/com/android/voicemailomtp/sms/OmtpMessageReceiver.java b/java/com/android/voicemailomtp/sms/OmtpMessageReceiver.java deleted file mode 100644 index c4ad2085f..000000000 --- a/java/com/android/voicemailomtp/sms/OmtpMessageReceiver.java +++ /dev/null @@ -1,162 +0,0 @@ -/* - * Copyright (C) 2015 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.voicemailomtp.sms; - -import android.annotation.TargetApi; -import android.content.BroadcastReceiver; -import android.content.ContentUris; -import android.content.Context; -import android.content.Intent; -import android.net.Uri; -import android.os.Build.VERSION_CODES; -import android.os.Bundle; -import android.os.UserManager; -import android.telecom.PhoneAccountHandle; -import android.telephony.VisualVoicemailSms; -import com.android.voicemailomtp.ActivationTask; -import com.android.voicemailomtp.OmtpConstants; -import com.android.voicemailomtp.OmtpService; -import com.android.voicemailomtp.OmtpVvmCarrierConfigHelper; -import com.android.voicemailomtp.Voicemail; -import com.android.voicemailomtp.VvmLog; -import com.android.voicemailomtp.protocol.VisualVoicemailProtocol; -import com.android.voicemailomtp.settings.VisualVoicemailSettingsUtil; -import com.android.voicemailomtp.sync.OmtpVvmSyncService; -import com.android.voicemailomtp.sync.SyncOneTask; -import com.android.voicemailomtp.sync.SyncTask; -import com.android.voicemailomtp.sync.VoicemailsQueryHelper; -import com.android.voicemailomtp.utils.VoicemailDatabaseUtil; - -/** Receive SMS messages and send for processing by the OMTP visual voicemail source. */ -@TargetApi(VERSION_CODES.CUR_DEVELOPMENT) -public class OmtpMessageReceiver extends BroadcastReceiver { - - private static final String TAG = "OmtpMessageReceiver"; - - private Context mContext; - - @Override - public void onReceive(Context context, Intent intent) { - mContext = context; - VisualVoicemailSms sms = intent.getExtras().getParcelable(OmtpService.EXTRA_VOICEMAIL_SMS); - PhoneAccountHandle phone = sms.getPhoneAccountHandle(); - - if (phone == null) { - // This should never happen - VvmLog.i(TAG, "Received message for null phone account"); - return; - } - - if (!context.getSystemService(UserManager.class).isUserUnlocked()) { - VvmLog.i(TAG, "Received message on locked device"); - // LegacyModeSmsHandler can handle new message notifications without storage access - LegacyModeSmsHandler.handle(context, sms); - // A full sync will happen after the device is unlocked, so nothing else need to be - // done. - return; - } - - OmtpVvmCarrierConfigHelper helper = new OmtpVvmCarrierConfigHelper(mContext, phone); - if (!VisualVoicemailSettingsUtil.isEnabled(mContext, phone)) { - if (helper.isLegacyModeEnabled()) { - LegacyModeSmsHandler.handle(context, sms); - } else { - VvmLog.i(TAG, "Received vvm message for disabled vvm source."); - } - return; - } - - String eventType = sms.getPrefix(); - Bundle data = sms.getFields(); - - if (eventType == null || data == null) { - VvmLog.e(TAG, "Unparsable VVM SMS received, ignoring"); - return; - } - - if (eventType.equals(OmtpConstants.SYNC_SMS_PREFIX)) { - SyncMessage message = new SyncMessage(data); - - VvmLog.v(TAG, "Received SYNC sms for " + phone + - " with event " + message.getSyncTriggerEvent()); - processSync(phone, message); - } else if (eventType.equals(OmtpConstants.STATUS_SMS_PREFIX)) { - VvmLog.v(TAG, "Received Status sms for " + phone); - // If the STATUS SMS is initiated by ActivationTask the TaskSchedulerService will reject - // the follow request. Providing the data will also prevent ActivationTask from - // requesting another STATUS SMS. The following task will only run if the carrier - // spontaneous send a STATUS SMS, in that case, the VVM service should be reactivated. - ActivationTask.start(context, phone, data); - } else { - VvmLog.w(TAG, "Unknown prefix: " + eventType); - VisualVoicemailProtocol protocol = helper.getProtocol(); - if (protocol == null) { - return; - } - Bundle statusData = helper.getProtocol() - .translateStatusSmsBundle(helper, eventType, data); - if (statusData != null) { - VvmLog.i(TAG, "Protocol recognized the SMS as STATUS, activating"); - ActivationTask.start(context, phone, data); - } - } - } - - /** - * A sync message has two purposes: to signal a new voicemail message, and to indicate the - * voicemails on the server have changed remotely (usually through the TUI). Save the new - * message to the voicemail provider if it is the former case and perform a full sync in the - * latter case. - * - * @param message The sync message to extract data from. - */ - private void processSync(PhoneAccountHandle phone, SyncMessage message) { - switch (message.getSyncTriggerEvent()) { - case OmtpConstants.NEW_MESSAGE: - if (!OmtpConstants.VOICE.equals(message.getContentType())) { - VvmLog.i(TAG, "Non-voice message of type '" + message.getContentType() - + "' received, ignoring"); - return; - } - - Voicemail.Builder builder = Voicemail.createForInsertion( - message.getTimestampMillis(), message.getSender()) - .setPhoneAccount(phone) - .setSourceData(message.getId()) - .setDuration(message.getLength()) - .setSourcePackage(mContext.getPackageName()); - Voicemail voicemail = builder.build(); - - VoicemailsQueryHelper queryHelper = new VoicemailsQueryHelper(mContext); - if (queryHelper.isVoicemailUnique(voicemail)) { - Uri uri = VoicemailDatabaseUtil.insert(mContext, voicemail); - voicemail = builder.setId(ContentUris.parseId(uri)).setUri(uri).build(); - SyncOneTask.start(mContext, phone, voicemail); - } - break; - case OmtpConstants.MAILBOX_UPDATE: - SyncTask.start(mContext, phone, OmtpVvmSyncService.SYNC_DOWNLOAD_ONLY); - break; - case OmtpConstants.GREETINGS_UPDATE: - // Not implemented in V1 - break; - default: - VvmLog.e(TAG, - "Unrecognized sync trigger event: " + message.getSyncTriggerEvent()); - break; - } - } -} diff --git a/java/com/android/voicemailomtp/sms/OmtpMessageSender.java b/java/com/android/voicemailomtp/sms/OmtpMessageSender.java deleted file mode 100644 index 2323e4bcf..000000000 --- a/java/com/android/voicemailomtp/sms/OmtpMessageSender.java +++ /dev/null @@ -1,89 +0,0 @@ -/* - * Copyright (C) 2015 Google Inc. All Rights Reserved. - * - * 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.voicemailomtp.sms; - -import android.app.PendingIntent; -import android.content.Context; -import android.support.annotation.Nullable; -import android.telecom.PhoneAccountHandle; -import android.telephony.SmsManager; -import android.telephony.VisualVoicemailService; -import com.android.voicemailomtp.OmtpConstants; -import com.android.voicemailomtp.TelephonyManagerStub; -import com.android.voicemailomtp.VvmLog; -import java.io.UnsupportedEncodingException; -import java.util.Locale; - -/** - * Send client originated OMTP messages to the OMTP server. - * <p> - * Uses {@link PendingIntent} instead of a call back to notify when the message is - * sent. This is primarily to keep the implementation simple and reuse what the underlying - * {@link SmsManager} interface provides. - * <p> - * Provides simple APIs to send different types of mobile originated OMTP SMS to the VVM server. - */ -public abstract class OmtpMessageSender { - protected static final String TAG = "OmtpMessageSender"; - protected final Context mContext; - protected final PhoneAccountHandle mPhoneAccountHandle; - protected final short mApplicationPort; - protected final String mDestinationNumber; - - - public OmtpMessageSender(Context context, PhoneAccountHandle phoneAccountHandle, - short applicationPort, - String destinationNumber) { - mContext = context; - mPhoneAccountHandle = phoneAccountHandle; - mApplicationPort = applicationPort; - mDestinationNumber = destinationNumber; - } - - /** - * Sends a request to the VVM server to activate VVM for the current subscriber. - * - * @param sentIntent If not NULL this PendingIntent is broadcast when the message is - * successfully sent, or failed. - */ - public void requestVvmActivation(@Nullable PendingIntent sentIntent) {} - - /** - * Sends a request to the VVM server to deactivate VVM for the current subscriber. - * - * @param sentIntent If not NULL this PendingIntent is broadcast when the message is - * successfully sent, or failed. - */ - public void requestVvmDeactivation(@Nullable PendingIntent sentIntent) {} - - /** - * Send a request to the VVM server to get account status of the current subscriber. - * - * @param sentIntent If not NULL this PendingIntent is broadcast when the message is - * successfully sent, or failed. - */ - public void requestVvmStatus(@Nullable PendingIntent sentIntent) {} - - protected void sendSms(String text, PendingIntent sentIntent) { - VisualVoicemailService - .sendVisualVoicemailSms(mContext, mPhoneAccountHandle, mDestinationNumber, - mApplicationPort, text, sentIntent); - } - - protected void appendField(StringBuilder sb, String field, Object value) { - sb.append(field).append(OmtpConstants.SMS_KEY_VALUE_SEPARATOR).append(value); - } -} diff --git a/java/com/android/voicemailomtp/sms/OmtpStandardMessageSender.java b/java/com/android/voicemailomtp/sms/OmtpStandardMessageSender.java deleted file mode 100644 index aa8374781..000000000 --- a/java/com/android/voicemailomtp/sms/OmtpStandardMessageSender.java +++ /dev/null @@ -1,119 +0,0 @@ -/* - * Copyright (C) 2015 Google Inc. All Rights Reserved. - * - * 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.voicemailomtp.sms; - -import android.app.PendingIntent; -import android.content.Context; -import android.support.annotation.Nullable; -import android.telecom.PhoneAccountHandle; -import android.telephony.SmsManager; -import android.text.TextUtils; -import com.android.voicemailomtp.OmtpConstants; - -/** - * A implementation of the OmtpMessageSender using the standard OMTP sms protocol. - */ -public class OmtpStandardMessageSender extends OmtpMessageSender { - private final String mClientType; - private final String mProtocolVersion; - private final String mClientPrefix; - - /** - * Creates a new instance of OmtpStandardMessageSender. - * - * @param applicationPort If set to a value > 0 then a binary sms is sent to this port number. - * Otherwise, a standard text SMS is sent. - * @param destinationNumber Destination number to be used. - * @param clientType The "ct" field to be set in the MO message. This is the value used by the - * VVM server to identify the client. Certain VVM servers require a specific agreed - * value for this field. - * @param protocolVersion OMTP protocol version. - * @param clientPrefix The client prefix requested to be used by the server in its MT messages. - */ - public OmtpStandardMessageSender(Context context, PhoneAccountHandle phoneAccountHandle, - short applicationPort, - String destinationNumber, String clientType, String protocolVersion, - String clientPrefix) { - super(context, phoneAccountHandle, applicationPort, destinationNumber); - mClientType = clientType; - mProtocolVersion = protocolVersion; - mClientPrefix = clientPrefix; - } - - // Activate message: - // V1.1: Activate:pv=<value>;ct=<value> - // V1.2: Activate:pv=<value>;ct=<value>;pt=<value>;<Clientprefix> - // V1.3: Activate:pv=<value>;ct=<value>;pt=<value>;<Clientprefix> - @Override - public void requestVvmActivation(@Nullable PendingIntent sentIntent) { - StringBuilder sb = new StringBuilder().append(OmtpConstants.ACTIVATE_REQUEST); - - appendProtocolVersionAndClientType(sb); - if (TextUtils.equals(mProtocolVersion, OmtpConstants.PROTOCOL_VERSION1_2) || - TextUtils.equals(mProtocolVersion, OmtpConstants.PROTOCOL_VERSION1_3)) { - appendApplicationPort(sb); - appendClientPrefix(sb); - } - - sendSms(sb.toString(), sentIntent); - } - - // Deactivate message: - // V1.1: Deactivate:pv=<value>;ct=<string> - // V1.2: Deactivate:pv=<value>;ct=<string> - // V1.3: Deactivate:pv=<value>;ct=<string> - @Override - public void requestVvmDeactivation(@Nullable PendingIntent sentIntent) { - StringBuilder sb = new StringBuilder().append(OmtpConstants.DEACTIVATE_REQUEST); - appendProtocolVersionAndClientType(sb); - - sendSms(sb.toString(), sentIntent); - } - - // Status message: - // V1.1: STATUS - // V1.2: STATUS - // V1.3: STATUS:pv=<value>;ct=<value>;pt=<value>;<Clientprefix> - @Override - public void requestVvmStatus(@Nullable PendingIntent sentIntent) { - StringBuilder sb = new StringBuilder().append(OmtpConstants.STATUS_REQUEST); - - if (TextUtils.equals(mProtocolVersion, OmtpConstants.PROTOCOL_VERSION1_3)) { - appendProtocolVersionAndClientType(sb); - appendApplicationPort(sb); - appendClientPrefix(sb); - } - - sendSms(sb.toString(), sentIntent); - } - - private void appendProtocolVersionAndClientType(StringBuilder sb) { - sb.append(OmtpConstants.SMS_PREFIX_SEPARATOR); - appendField(sb, OmtpConstants.PROTOCOL_VERSION, mProtocolVersion); - sb.append(OmtpConstants.SMS_FIELD_SEPARATOR); - appendField(sb, OmtpConstants.CLIENT_TYPE, mClientType); - } - - private void appendApplicationPort(StringBuilder sb) { - sb.append(OmtpConstants.SMS_FIELD_SEPARATOR); - appendField(sb, OmtpConstants.APPLICATION_PORT, mApplicationPort); - } - - private void appendClientPrefix(StringBuilder sb) { - sb.append(OmtpConstants.SMS_FIELD_SEPARATOR); - sb.append(mClientPrefix); - } -} diff --git a/java/com/android/voicemailomtp/sms/StatusMessage.java b/java/com/android/voicemailomtp/sms/StatusMessage.java deleted file mode 100644 index 3dfd4973e..000000000 --- a/java/com/android/voicemailomtp/sms/StatusMessage.java +++ /dev/null @@ -1,209 +0,0 @@ -/* - * Copyright (C) 2015 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.voicemailomtp.sms; - -import android.os.Bundle; -import com.android.voicemailomtp.NeededForTesting; -import com.android.voicemailomtp.OmtpConstants; -import com.android.voicemailomtp.VisualVoicemailPreferences; -import com.android.voicemailomtp.VvmLog; - -/** - * Structured data representation of OMTP STATUS message. - * - * The getters will return null if the field was not set in the message body or it could not be - * parsed. - */ -public class StatusMessage { - // NOTE: Following Status SMS fields are not yet parsed, as they do not seem - // to be useful for initial omtp source implementation. - // lang, g_len, vs_len, pw_len, pm, gm, vtc, vt - - private final String mProvisioningStatus; - private final String mStatusReturnCode; - private final String mSubscriptionUrl; - private final String mServerAddress; - private final String mTuiAccessNumber; - private final String mClientSmsDestinationNumber; - private final String mImapPort; - private final String mImapUserName; - private final String mImapPassword; - private final String mSmtpPort; - private final String mSmtpUserName; - private final String mSmtpPassword; - private final String mTuiPasswordLength; - - @Override - public String toString() { - return "StatusMessage [mProvisioningStatus=" + mProvisioningStatus - + ", mStatusReturnCode=" + mStatusReturnCode - + ", mSubscriptionUrl=" + mSubscriptionUrl - + ", mServerAddress=" + mServerAddress - + ", mTuiAccessNumber=" + mTuiAccessNumber - + ", mClientSmsDestinationNumber=" + mClientSmsDestinationNumber - + ", mImapPort=" + mImapPort - + ", mImapUserName=" + mImapUserName - + ", mImapPassword=" + VvmLog.pii(mImapPassword) - + ", mSmtpPort=" + mSmtpPort - + ", mSmtpUserName=" + mSmtpUserName - + ", mSmtpPassword=" + VvmLog.pii(mSmtpPassword) - + ", mTuiPasswordLength=" + mTuiPasswordLength + "]"; - } - - public StatusMessage(Bundle wrappedData) { - mProvisioningStatus = unquote(getString(wrappedData, OmtpConstants.PROVISIONING_STATUS)); - mStatusReturnCode = getString(wrappedData, OmtpConstants.RETURN_CODE); - mSubscriptionUrl = getString(wrappedData, OmtpConstants.SUBSCRIPTION_URL); - mServerAddress = getString(wrappedData, OmtpConstants.SERVER_ADDRESS); - mTuiAccessNumber = getString(wrappedData, OmtpConstants.TUI_ACCESS_NUMBER); - mClientSmsDestinationNumber = getString(wrappedData, - OmtpConstants.CLIENT_SMS_DESTINATION_NUMBER); - mImapPort = getString(wrappedData, OmtpConstants.IMAP_PORT); - mImapUserName = getString(wrappedData, OmtpConstants.IMAP_USER_NAME); - mImapPassword = getString(wrappedData, OmtpConstants.IMAP_PASSWORD); - mSmtpPort = getString(wrappedData, OmtpConstants.SMTP_PORT); - mSmtpUserName = getString(wrappedData, OmtpConstants.SMTP_USER_NAME); - mSmtpPassword = getString(wrappedData, OmtpConstants.SMTP_PASSWORD); - mTuiPasswordLength = getString(wrappedData, OmtpConstants.TUI_PASSWORD_LENGTH); - } - - private static String unquote(String string) { - if (string.length() < 2) { - return string; - } - if (string.startsWith("\"") && string.endsWith("\"")) { - return string.substring(1, string.length() - 1); - } - return string; - } - - /** - * @return the subscriber's VVM provisioning status. - */ - public String getProvisioningStatus() { - return mProvisioningStatus; - } - - /** - * @return the return-code of the status SMS. - */ - public String getReturnCode() { - return mStatusReturnCode; - } - - /** - * @return the URL of the voicemail server. This is the URL to send the users to for subscribing - * to the visual voicemail service. - */ - @NeededForTesting - public String getSubscriptionUrl() { - return mSubscriptionUrl; - } - - /** - * @return the voicemail server address. Either server IP address or fully qualified domain - * name. - */ - public String getServerAddress() { - return mServerAddress; - } - - /** - * @return the Telephony User Interface number to call to access voicemails directly from the - * IVR. - */ - @NeededForTesting - public String getTuiAccessNumber() { - return mTuiAccessNumber; - } - - /** - * @return the number to which client originated SMSes should be sent to. - */ - @NeededForTesting - public String getClientSmsDestinationNumber() { - return mClientSmsDestinationNumber; - } - - /** - * @return the IMAP server port to talk to. - */ - public String getImapPort() { - return mImapPort; - } - - /** - * @return the IMAP user name to be used for authentication. - */ - public String getImapUserName() { - return mImapUserName; - } - - /** - * @return the IMAP password to be used for authentication. - */ - public String getImapPassword() { - return mImapPassword; - } - - /** - * @return the SMTP server port to talk to. - */ - @NeededForTesting - public String getSmtpPort() { - return mSmtpPort; - } - - /** - * @return the SMTP user name to be used for SMTP authentication. - */ - @NeededForTesting - public String getSmtpUserName() { - return mSmtpUserName; - } - - /** - * @return the SMTP password to be used for SMTP authentication. - */ - @NeededForTesting - public String getSmtpPassword() { - return mSmtpPassword; - } - - public String getTuiPasswordLength() { - return mTuiPasswordLength; - } - - private static String getString(Bundle bundle, String key) { - String value = bundle.getString(key); - if (value == null) { - return ""; - } - return value; - } - - /** - * Saves a StatusMessage to the {@link VisualVoicemailPreferences}. Not all fields are saved. - */ - public VisualVoicemailPreferences.Editor putStatus(VisualVoicemailPreferences.Editor editor) { - return editor - .putString(OmtpConstants.IMAP_PORT, getImapPort()) - .putString(OmtpConstants.SERVER_ADDRESS, getServerAddress()) - .putString(OmtpConstants.IMAP_USER_NAME, getImapUserName()) - .putString(OmtpConstants.IMAP_PASSWORD, getImapPassword()) - .putString(OmtpConstants.TUI_PASSWORD_LENGTH, getTuiPasswordLength()); - } -}
\ No newline at end of file diff --git a/java/com/android/voicemailomtp/sms/StatusSmsFetcher.java b/java/com/android/voicemailomtp/sms/StatusSmsFetcher.java deleted file mode 100644 index 4e10c0e43..000000000 --- a/java/com/android/voicemailomtp/sms/StatusSmsFetcher.java +++ /dev/null @@ -1,162 +0,0 @@ -/* - * Copyright (C) 2015 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.voicemailomtp.sms; - -import android.annotation.TargetApi; -import android.app.Activity; -import android.app.PendingIntent; -import android.content.BroadcastReceiver; -import android.content.Context; -import android.content.Intent; -import android.content.IntentFilter; -import android.os.Build.VERSION_CODES; -import android.os.Bundle; -import android.support.annotation.MainThread; -import android.support.annotation.Nullable; -import android.support.annotation.WorkerThread; -import android.telecom.PhoneAccountHandle; -import android.telephony.SmsManager; -import android.telephony.VisualVoicemailSms; -import com.android.voicemailomtp.Assert; -import com.android.voicemailomtp.OmtpConstants; -import com.android.voicemailomtp.OmtpService; -import com.android.voicemailomtp.OmtpVvmCarrierConfigHelper; -import com.android.voicemailomtp.VvmLog; -import com.android.voicemailomtp.protocol.VisualVoicemailProtocol; -import java.io.Closeable; -import java.io.IOException; -import java.util.concurrent.CancellationException; -import java.util.concurrent.CompletableFuture; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.TimeoutException; - -/** Intercepts a incoming STATUS SMS with a blocking call. */ -@SuppressWarnings("AndroidApiChecker") /* CompletableFuture is java8*/ -@TargetApi(VERSION_CODES.CUR_DEVELOPMENT) -public class StatusSmsFetcher extends BroadcastReceiver implements Closeable { - - private static final String TAG = "VvmStatusSmsFetcher"; - - private static final long STATUS_SMS_TIMEOUT_MILLIS = 60_000; - - private static final String ACTION_REQUEST_SENT_INTENT - = "com.android.voicemailomtp.sms.REQUEST_SENT"; - private static final int ACTION_REQUEST_SENT_REQUEST_CODE = 0; - - private CompletableFuture<Bundle> mFuture = new CompletableFuture<>(); - - private final Context mContext; - private final PhoneAccountHandle mPhoneAccountHandle; - - public StatusSmsFetcher(Context context, PhoneAccountHandle phoneAccountHandle) { - mContext = context; - mPhoneAccountHandle = phoneAccountHandle; - IntentFilter filter = new IntentFilter(ACTION_REQUEST_SENT_INTENT); - filter.addAction(OmtpService.ACTION_SMS_RECEIVED); - context.registerReceiver(this, filter); - } - - @Override - public void close() throws IOException { - mContext.unregisterReceiver(this); - } - - @WorkerThread - @Nullable - public Bundle get() throws InterruptedException, ExecutionException, TimeoutException, - CancellationException { - Assert.isNotMainThread(); - return mFuture.get(STATUS_SMS_TIMEOUT_MILLIS, TimeUnit.MILLISECONDS); - } - - public PendingIntent getSentIntent() { - Intent intent = new Intent(ACTION_REQUEST_SENT_INTENT); - intent.setPackage(mContext.getPackageName()); - // Because the receiver is registered dynamically, implicit intent must be used. - // There should only be a single status SMS request at a time. - return PendingIntent.getBroadcast(mContext, ACTION_REQUEST_SENT_REQUEST_CODE, intent, - PendingIntent.FLAG_CANCEL_CURRENT); - } - - @Override - @MainThread - public void onReceive(Context context, Intent intent) { - Assert.isMainThread(); - if (ACTION_REQUEST_SENT_INTENT.equals(intent.getAction())) { - int resultCode = getResultCode(); - - if (resultCode == Activity.RESULT_OK) { - VvmLog.d(TAG, "Request SMS successfully sent"); - return; - } - - VvmLog.e(TAG, "Request SMS send failed: " + sentSmsResultToString(resultCode)); - mFuture.cancel(true); - return; - } - - VisualVoicemailSms sms = intent.getExtras().getParcelable(OmtpService.EXTRA_VOICEMAIL_SMS); - - if (!mPhoneAccountHandle.equals(sms.getPhoneAccountHandle())) { - return; - } - String eventType = sms.getPrefix(); - - if (eventType.equals(OmtpConstants.STATUS_SMS_PREFIX)) { - mFuture.complete(sms.getFields()); - return; - } - - if (eventType.equals(OmtpConstants.SYNC_SMS_PREFIX)) { - return; - } - - VvmLog.i(TAG, "VVM SMS with event " + eventType - + " received, attempting to translate to STATUS SMS"); - OmtpVvmCarrierConfigHelper helper = new OmtpVvmCarrierConfigHelper(context, - mPhoneAccountHandle); - VisualVoicemailProtocol protocol = helper.getProtocol(); - if (protocol == null) { - return; - } - Bundle translatedBundle = protocol.translateStatusSmsBundle(helper, eventType, - sms.getFields()); - - if (translatedBundle != null) { - VvmLog.i(TAG, "Translated to STATUS SMS"); - mFuture.complete(translatedBundle); - } - } - - private static String sentSmsResultToString(int resultCode) { - switch (resultCode) { - case Activity.RESULT_OK: - return "OK"; - case SmsManager.RESULT_ERROR_GENERIC_FAILURE: - return "RESULT_ERROR_GENERIC_FAILURE"; - case SmsManager.RESULT_ERROR_NO_SERVICE: - return "RESULT_ERROR_GENERIC_FAILURE"; - case SmsManager.RESULT_ERROR_NULL_PDU: - return "RESULT_ERROR_GENERIC_FAILURE"; - case SmsManager.RESULT_ERROR_RADIO_OFF: - return "RESULT_ERROR_GENERIC_FAILURE"; - default: - return "UNKNOWN CODE: " + resultCode; - } - } -} diff --git a/java/com/android/voicemailomtp/sms/SyncMessage.java b/java/com/android/voicemailomtp/sms/SyncMessage.java deleted file mode 100644 index 89cfc0f19..000000000 --- a/java/com/android/voicemailomtp/sms/SyncMessage.java +++ /dev/null @@ -1,166 +0,0 @@ -/* - * Copyright (C) 2015 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.voicemailomtp.sms; - -import android.os.Bundle; -import android.support.annotation.Nullable; -import com.android.voicemailomtp.NeededForTesting; -import com.android.voicemailomtp.OmtpConstants; -import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.util.Locale; - -/** - * Structured data representation of an OMTP SYNC message. - * - * Getters will return null if the field was not set in the message body or it could not be parsed. - */ -public class SyncMessage { - // Sync event that triggered this message. - private final String mSyncTriggerEvent; - // Total number of new messages on the server. - private final int mNewMessageCount; - // UID of the new message. - private final String mMessageId; - // Length of the message. - private final int mMessageLength; - // Content type (voice, video, fax...) of the new message. - private final String mContentType; - // Sender of the new message. - private final String mSender; - // Timestamp (in millis) of the new message. - private final long mMsgTimeMillis; - - @Override - public String toString() { - return "SyncMessage [mSyncTriggerEvent=" + mSyncTriggerEvent - + ", mNewMessageCount=" + mNewMessageCount - + ", mMessageId=" + mMessageId - + ", mMessageLength=" + mMessageLength - + ", mContentType=" + mContentType - + ", mSender=" + mSender - + ", mMsgTimeMillis=" + mMsgTimeMillis + "]"; - } - - public SyncMessage(Bundle wrappedData) { - mSyncTriggerEvent = getString(wrappedData, OmtpConstants.SYNC_TRIGGER_EVENT); - mMessageId = getString(wrappedData, OmtpConstants.MESSAGE_UID); - mMessageLength = getInt(wrappedData, OmtpConstants.MESSAGE_LENGTH); - mContentType = getString(wrappedData, OmtpConstants.CONTENT_TYPE); - mSender = getString(wrappedData, OmtpConstants.SENDER); - mNewMessageCount = getInt(wrappedData, OmtpConstants.NUM_MESSAGE_COUNT); - mMsgTimeMillis = parseTime(wrappedData.getString(OmtpConstants.TIME)); - } - - private static long parseTime(@Nullable String value) { - if (value == null) { - return 0L; - } - try { - return new SimpleDateFormat( - OmtpConstants.DATE_TIME_FORMAT, Locale.US) - .parse(value).getTime(); - } catch (ParseException e) { - return 0L; - } - } - /** - * @return the event that triggered the sync message. This is a mandatory field and must always - * be set. - */ - public String getSyncTriggerEvent() { - return mSyncTriggerEvent; - } - - /** - * @return the number of new messages stored on the voicemail server. - */ - @NeededForTesting - public int getNewMessageCount() { - return mNewMessageCount; - } - - /** - * @return the message ID of the new message. - * <p> - * Expected to be set only for - * {@link com.android.voicemailomtp.OmtpConstants#NEW_MESSAGE} - */ - public String getId() { - return mMessageId; - } - - /** - * @return the content type of the new message. - * <p> - * Expected to be set only for - * {@link com.android.voicemailomtp.OmtpConstants#NEW_MESSAGE} - */ - @NeededForTesting - public String getContentType() { - return mContentType; - } - - /** - * @return the message length of the new message. - * <p> - * Expected to be set only for - * {@link com.android.voicemailomtp.OmtpConstants#NEW_MESSAGE} - */ - public int getLength() { - return mMessageLength; - } - - /** - * @return the sender's phone number of the new message specified as MSISDN. - * <p> - * Expected to be set only for - * {@link com.android.voicemailomtp.OmtpConstants#NEW_MESSAGE} - */ - public String getSender() { - return mSender; - } - - /** - * @return the timestamp as milliseconds for the new message. - * <p> - * Expected to be set only for - * {@link com.android.voicemailomtp.OmtpConstants#NEW_MESSAGE} - */ - public long getTimestampMillis() { - return mMsgTimeMillis; - } - - private static int getInt(Bundle wrappedData, String key) { - String value = wrappedData.getString(key); - if (value == null) { - return 0; - } - try { - return Integer.parseInt(value); - } catch (NumberFormatException e) { - return 0; - } - } - - private static String getString(Bundle wrappedData, String key) { - String value = wrappedData.getString(key); - if (value == null) { - return ""; - } - return value; - } -}
\ No newline at end of file diff --git a/java/com/android/voicemailomtp/sms/Vvm3MessageSender.java b/java/com/android/voicemailomtp/sms/Vvm3MessageSender.java deleted file mode 100644 index 02e465967..000000000 --- a/java/com/android/voicemailomtp/sms/Vvm3MessageSender.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright (C) 2016 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.voicemailomtp.sms; - -import android.app.PendingIntent; -import android.content.Context; -import android.support.annotation.Nullable; -import android.telecom.PhoneAccountHandle; -import android.telephony.SmsManager; - -public class Vvm3MessageSender extends OmtpMessageSender { - - /** - * Creates a new instance of Vvm3MessageSender. - * - * @param applicationPort If set to a value > 0 then a binary sms is sent to this port number. - * Otherwise, a standard text SMS is sent. - */ - public Vvm3MessageSender(Context context, PhoneAccountHandle phoneAccountHandle, - short applicationPort, String destinationNumber) { - super(context, phoneAccountHandle, applicationPort, destinationNumber); - } - - @Override - public void requestVvmActivation(@Nullable PendingIntent sentIntent) { - // Activation not supported for VVM3, send a status request instead. - requestVvmStatus(sentIntent); - } - - @Override - public void requestVvmDeactivation(@Nullable PendingIntent sentIntent) { - // Deactivation not supported for VVM3, do nothing - } - - - @Override - public void requestVvmStatus(@Nullable PendingIntent sentIntent) { - // Status message: - // STATUS - StringBuilder sb = new StringBuilder().append("STATUS"); - sendSms(sb.toString(), sentIntent); - } -} |