| /* |
| * Copyright (C) 2013 Samsung System LSI |
| * 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.bluetooth.map; |
| |
| import android.util.Log; |
| |
| import com.android.bluetooth.SignedLongLong; |
| |
| import java.io.UnsupportedEncodingException; |
| import java.nio.ByteBuffer; |
| import java.nio.ByteOrder; |
| import java.text.ParseException; |
| import java.text.SimpleDateFormat; |
| import java.util.Arrays; |
| import java.util.Date; |
| |
| /** |
| * This class encapsulates the appParams needed for MAP. |
| */ |
| public class BluetoothMapAppParams { |
| |
| private static final String TAG = "BluetoothMapAppParams"; |
| |
| private static final int MAX_LIST_COUNT = 0x01; |
| private static final int START_OFFSET = 0x02; |
| private static final int FILTER_MESSAGE_TYPE = 0x03; |
| private static final int FILTER_PERIOD_BEGIN = 0x04; |
| private static final int FILTER_PERIOD_END = 0x05; |
| private static final int FILTER_READ_STATUS = 0x06; |
| private static final int FILTER_RECIPIENT = 0x07; |
| private static final int FILTER_ORIGINATOR = 0x08; |
| private static final int FILTER_PRIORITY = 0x09; |
| private static final int ATTACHMENT = 0x0A; |
| private static final int TRANSPARENT = 0x0B; |
| private static final int RETRY = 0x0C; |
| private static final int NEW_MESSAGE = 0x0D; |
| private static final int NOTIFICATION_STATUS = 0x0E; |
| private static final int MAS_INSTANCE_ID = 0x0F; |
| private static final int PARAMETER_MASK = 0x10; |
| private static final int FOLDER_LISTING_SIZE = 0x11; |
| private static final int MESSAGE_LISTING_SIZE = 0x12; |
| private static final int SUBJECT_LENGTH = 0x13; |
| private static final int CHARSET = 0x14; |
| private static final int FRACTION_REQUEST = 0x15; |
| private static final int FRACTION_DELIVER = 0x16; |
| private static final int STATUS_INDICATOR = 0x17; |
| private static final int STATUS_VALUE = 0x18; |
| private static final int MSE_TIME = 0x19; |
| private static final int DATABASE_INDETIFIER = 0x1A; |
| private static final int CONVO_LIST_VER_COUNTER = 0x1B; |
| private static final int PRESENCE_AVAILABLE = 0x1C; |
| private static final int PRESENCE_TEXT = 0x1D; |
| private static final int LAST_ACTIVITY = 0x1E; |
| private static final int CHAT_STATE = 0x21; |
| private static final int FILTER_CONVO_ID = 0x22; |
| private static final int CONVO_LISTING_SIZE = 0x36; |
| private static final int FILTER_PRESENCE = 0x37; |
| private static final int FILTER_UID_PRESENT = 0x38; |
| private static final int CHAT_STATE_CONVO_ID = 0x39; |
| private static final int FOLDER_VER_COUNTER = 0x23; |
| private static final int FILTER_MESSAGE_HANDLE = 0x24; |
| private static final int NOTIFICATION_FILTER = 0x25; |
| private static final int CONVO_PARAMETER_MASK = 0x26; |
| |
| // Length defined for Application Parameters |
| private static final int MAX_LIST_COUNT_LEN = 0x02; //, 0x0000, 0xFFFF), |
| private static final int START_OFFSET_LEN = 0x02; //, 0x0000, 0xFFFF), |
| private static final int FILTER_MESSAGE_TYPE_LEN = 0x01; //, 0x0000, 0x000f), |
| private static final int FILTER_READ_STATUS_LEN = 0x01; //, 0x0000, 0x0002), |
| private static final int FILTER_PRIORITY_LEN = 0x01; //, 0x0000, 0x0002), |
| private static final int ATTACHMENT_LEN = 0x01; //, 0x0000, 0x0001), |
| private static final int TRANSPARENT_LEN = 0x01; //, 0x0000, 0x0001), |
| private static final int RETRY_LEN = 0x01; //, 0x0000, 0x0001), |
| private static final int NEW_MESSAGE_LEN = 0x01; //, 0x0000, 0x0001), |
| private static final int NOTIFICATION_STATUS_LEN = 0x01; //, 0x0000, 0xFFFF), |
| private static final int MAS_INSTANCE_ID_LEN = 0x01; //, 0x0000, 0x00FF), |
| private static final int PARAMETER_MASK_LEN = 0x04; //, 0x0000, 0x0000), |
| private static final int FOLDER_LISTING_SIZE_LEN = 0x02; //, 0x0000, 0xFFFF), |
| private static final int MESSAGE_LISTING_SIZE_LEN = 0x02; //, 0x0000, 0xFFFF), |
| private static final int SUBJECT_LENGTH_LEN = 0x01; //, 0x0000, 0x00FF), |
| private static final int CHARSET_LEN = 0x01; //, 0x0000, 0x0001), |
| private static final int FRACTION_REQUEST_LEN = 0x01; //, 0x0000, 0x0001), |
| private static final int FRACTION_DELIVER_LEN = 0x01; //, 0x0000, 0x0001), |
| private static final int STATUS_INDICATOR_LEN = 0x01; //, 0x0000, 0x0001), |
| private static final int STATUS_VALUE_LEN = 0x01; //, 0x0000, 0x0001), |
| private static final int DATABASE_INDETIFIER_LEN = 0x10; |
| private static final int CONVO_LIST_VER_COUNTER_LEN = 0x10; |
| private static final int PRESENCE_AVAILABLE_LEN = 0X01; |
| private static final int CHAT_STATE_LEN = 0x01; |
| private static final int CHAT_STATE_CONVO_ID_LEN = 0x10; |
| private static final int FILTER_CONVO_ID_LEN = 0x20; |
| private static final int CONVO_LISTING_SIZE_LEN = 0x02; |
| private static final int FILTER_PRESENCE_LEN = 0x01; |
| private static final int FILTER_UID_PRESENT_LEN = 0x01; |
| private static final int FOLDER_VER_COUNTER_LEN = 0x20; |
| private static final int FILTER_MESSAGE_HANDLE_LEN = 0x08; |
| private static final int NOTIFICATION_FILTER_LEN = 0x04; |
| private static final int CONVO_PARAMETER_MASK_LEN = 0x04; |
| |
| // Default values |
| public static final int INVALID_VALUE_PARAMETER = -1; |
| public static final int NOTIFICATION_STATUS_NO = 0; |
| public static final int NOTIFICATION_STATUS_YES = 1; |
| public static final int STATUS_INDICATOR_READ = 0; |
| public static final int STATUS_INDICATOR_DELETED = 1; |
| public static final int STATUS_VALUE_YES = 1; |
| public static final int STATUS_VALUE_NO = 0; |
| public static final int CHARSET_NATIVE = 0; |
| public static final int CHARSET_UTF8 = 1; |
| public static final int FRACTION_REQUEST_FIRST = 0; |
| public static final int FRACTION_REQUEST_NEXT = 1; |
| public static final int FRACTION_DELIVER_MORE = 0; |
| public static final int FRACTION_DELIVER_LAST = 1; |
| |
| public static final int FILTER_NO_SMS_GSM = 0x01; |
| public static final int FILTER_NO_SMS_CDMA = 0x02; |
| public static final int FILTER_NO_EMAIL = 0x04; |
| public static final int FILTER_NO_MMS = 0x08; |
| public static final int FILTER_NO_IM = 0x10; |
| public static final int FILTER_MSG_TYPE_MASK = 0x1F; |
| |
| private int mMaxListCount = INVALID_VALUE_PARAMETER; |
| private int mStartOffset = INVALID_VALUE_PARAMETER; |
| private int mFilterMessageType = INVALID_VALUE_PARAMETER; |
| // It seems like these are not implemented... |
| private long mFilterPeriodBegin = INVALID_VALUE_PARAMETER; |
| private long mFilterPeriodEnd = INVALID_VALUE_PARAMETER; |
| private int mFilterReadStatus = INVALID_VALUE_PARAMETER; |
| private String mFilterRecipient = null; |
| private String mFilterOriginator = null; |
| private int mFilterPriority = INVALID_VALUE_PARAMETER; |
| private int mAttachment = INVALID_VALUE_PARAMETER; |
| private int mTransparent = INVALID_VALUE_PARAMETER; |
| private int mRetry = INVALID_VALUE_PARAMETER; |
| private int mNewMessage = INVALID_VALUE_PARAMETER; |
| private int mNotificationStatus = INVALID_VALUE_PARAMETER; |
| private long mNotificationFilter = INVALID_VALUE_PARAMETER; |
| private int mMasInstanceId = INVALID_VALUE_PARAMETER; |
| private long mParameterMask = INVALID_VALUE_PARAMETER; |
| private int mFolderListingSize = INVALID_VALUE_PARAMETER; |
| private int mMessageListingSize = INVALID_VALUE_PARAMETER; |
| private int mConvoListingSize = INVALID_VALUE_PARAMETER; |
| private int mSubjectLength = INVALID_VALUE_PARAMETER; |
| private int mCharset = INVALID_VALUE_PARAMETER; |
| private int mFractionRequest = INVALID_VALUE_PARAMETER; |
| private int mFractionDeliver = INVALID_VALUE_PARAMETER; |
| private int mStatusIndicator = INVALID_VALUE_PARAMETER; |
| private int mStatusValue = INVALID_VALUE_PARAMETER; |
| private long mMseTime = INVALID_VALUE_PARAMETER; |
| // TODO: Change to use SignedLongLong? |
| private long mConvoListingVerCounterLow = INVALID_VALUE_PARAMETER; |
| private long mConvoListingVerCounterHigh = INVALID_VALUE_PARAMETER; |
| private long mDatabaseIdentifierLow = INVALID_VALUE_PARAMETER; |
| private long mDatabaseIdentifierHigh = INVALID_VALUE_PARAMETER; |
| private long mFolderVerCounterLow = INVALID_VALUE_PARAMETER; |
| private long mFolderVerCounterHigh = INVALID_VALUE_PARAMETER; |
| private int mPresenceAvailability = INVALID_VALUE_PARAMETER; |
| private String mPresenceStatus = null; |
| private long mLastActivity = INVALID_VALUE_PARAMETER; |
| private int mChatState = INVALID_VALUE_PARAMETER; |
| private SignedLongLong mFilterConvoId = null; |
| private int mFilterPresence = INVALID_VALUE_PARAMETER; |
| private int mFilterUidPresent = INVALID_VALUE_PARAMETER; |
| private SignedLongLong mChatStateConvoId = null; |
| private long mFilterMsgHandle = INVALID_VALUE_PARAMETER; |
| private long mConvoParameterMask = INVALID_VALUE_PARAMETER; |
| |
| /** |
| * Default constructor, used to build an application parameter object to be |
| * encoded. By default the member variables will be initialized to |
| * {@link INVALID_VALUE_PARAMETER} for values, and empty strings for String |
| * typed members. |
| */ |
| public BluetoothMapAppParams() { |
| } |
| |
| /** |
| * Creates an application parameter object based on a application parameter |
| * OBEX header. The content of the {@link appParam} byte array will be |
| * parsed, and its content will be stored in the member variables. |
| * {@link INVALID_VALUE_PARAMETER} can be used to determine if a value is |
| * set or not, where strings will be empty, if {@link appParam} did not |
| * contain the parameter. |
| * |
| * @param appParams |
| * the byte array containing the application parameters OBEX |
| * header |
| * @throws IllegalArgumentException |
| * when a parameter does not respect the valid ranges specified |
| * in the MAP spec. |
| * @throws ParseException |
| * if a parameter string if formated incorrectly. |
| */ |
| public BluetoothMapAppParams(final byte[] appParams) |
| throws IllegalArgumentException, ParseException { |
| parseParams(appParams); |
| } |
| |
| /** |
| * Parse an application parameter OBEX header stored in a byte array. |
| * |
| * @param appParams |
| * the byte array containing the application parameters OBEX |
| * header |
| * @throws IllegalArgumentException |
| * when a parameter does not respect the valid ranges specified |
| * in the MAP spec. |
| * @throws ParseException |
| * if a parameter string if formated incorrectly. |
| */ |
| private void parseParams(final byte[] appParams) |
| throws ParseException, IllegalArgumentException { |
| int i = 0; |
| int tagId, tagLength; |
| ByteBuffer appParamBuf = ByteBuffer.wrap(appParams); |
| appParamBuf.order(ByteOrder.BIG_ENDIAN); |
| while (i < appParams.length) { |
| tagId = appParams[i++] & 0xff; // Convert to unsigned to support values above 127 |
| tagLength = appParams[i++] & 0xff; // Convert to unsigned to support values above 127 |
| switch (tagId) { |
| case MAX_LIST_COUNT: |
| if (tagLength != MAX_LIST_COUNT_LEN) { |
| Log.w(TAG, "MAX_LIST_COUNT: Wrong length received: " + tagLength |
| + " expected: " + MAX_LIST_COUNT_LEN); |
| } else { |
| setMaxListCount(appParamBuf.getShort(i) & 0xffff); // Make it unsigned |
| } |
| break; |
| case START_OFFSET: |
| if (tagLength != START_OFFSET_LEN) { |
| Log.w(TAG, |
| "START_OFFSET: Wrong length received: " + tagLength + " expected: " |
| + START_OFFSET_LEN); |
| } else { |
| setStartOffset(appParamBuf.getShort(i) & 0xffff); // Make it unsigned |
| } |
| break; |
| case FILTER_MESSAGE_TYPE: |
| if (tagLength != FILTER_MESSAGE_TYPE_LEN) { |
| Log.w(TAG, "FILTER_MESSAGE_TYPE: Wrong length received: " + tagLength |
| + " expected: " + FILTER_MESSAGE_TYPE_LEN); |
| } else { |
| setFilterMessageType(appParams[i] & 0x1f); |
| } |
| break; |
| case FILTER_PERIOD_BEGIN: |
| if (tagLength != 0) { |
| setFilterPeriodBegin(new String(appParams, i, tagLength)); |
| } else { |
| Log.w(TAG, "FILTER_PERIOD_BEGIN: Wrong length received: " + tagLength |
| + " expected to be more than 0"); |
| } |
| break; |
| case FILTER_PERIOD_END: |
| if (tagLength != 0) { |
| setFilterPeriodEnd(new String(appParams, i, tagLength)); |
| } else { |
| Log.w(TAG, "FILTER_PERIOD_END: Wrong length received: " + tagLength |
| + " expected to be more than 0"); |
| } |
| break; |
| case FILTER_READ_STATUS: |
| if (tagLength != FILTER_READ_STATUS_LEN) { |
| Log.w(TAG, "FILTER_READ_STATUS: Wrong length received: " + tagLength |
| + " expected: " + FILTER_READ_STATUS_LEN); |
| } else { |
| setFilterReadStatus(appParams[i] & 0x03); // Lower two bits |
| } |
| break; |
| case FILTER_RECIPIENT: |
| if (tagLength != 0) { |
| setFilterRecipient(new String(appParams, i, tagLength)); |
| } else { |
| Log.w(TAG, "FILTER_RECIPIENT: Wrong length received: " + tagLength |
| + " expected to be more than 0"); |
| } |
| break; |
| case FILTER_ORIGINATOR: |
| if (tagLength != 0) { |
| setFilterOriginator(new String(appParams, i, tagLength)); |
| } else { |
| Log.w(TAG, "FILTER_ORIGINATOR: Wrong length received: " + tagLength |
| + " expected to be more than 0"); |
| } |
| break; |
| case FILTER_PRIORITY: |
| if (tagLength != FILTER_PRIORITY_LEN) { |
| Log.w(TAG, "FILTER_PRIORITY: Wrong length received: " + tagLength |
| + " expected: " + FILTER_PRIORITY_LEN); |
| } else { |
| setFilterPriority(appParams[i] & 0x03); // Lower two bits |
| } |
| break; |
| case ATTACHMENT: |
| if (tagLength != ATTACHMENT_LEN) { |
| Log.w(TAG, "ATTACHMENT: Wrong length received: " + tagLength + " expected: " |
| + ATTACHMENT_LEN); |
| } else { |
| setAttachment(appParams[i] & 0x01); // Lower bit |
| } |
| break; |
| case TRANSPARENT: |
| if (tagLength != TRANSPARENT_LEN) { |
| Log.w(TAG, |
| "TRANSPARENT: Wrong length received: " + tagLength + " expected: " |
| + TRANSPARENT_LEN); |
| } else { |
| setTransparent(appParams[i] & 0x01); // Lower bit |
| } |
| break; |
| case RETRY: |
| if (tagLength != RETRY_LEN) { |
| Log.w(TAG, "RETRY: Wrong length received: " + tagLength + " expected: " |
| + RETRY_LEN); |
| } else { |
| setRetry(appParams[i] & 0x01); // Lower bit |
| } |
| break; |
| case NEW_MESSAGE: |
| if (tagLength != NEW_MESSAGE_LEN) { |
| Log.w(TAG, |
| "NEW_MESSAGE: Wrong length received: " + tagLength + " expected: " |
| + NEW_MESSAGE_LEN); |
| } else { |
| setNewMessage(appParams[i] & 0x01); // Lower bit |
| } |
| break; |
| case NOTIFICATION_STATUS: |
| if (tagLength != NOTIFICATION_STATUS_LEN) { |
| Log.w(TAG, "NOTIFICATION_STATUS: Wrong length received: " + tagLength |
| + " expected: " + NOTIFICATION_STATUS_LEN); |
| } else { |
| setNotificationStatus(appParams[i] & 0x01); // Lower bit |
| } |
| break; |
| case NOTIFICATION_FILTER: |
| if (tagLength != NOTIFICATION_FILTER_LEN) { |
| Log.w(TAG, "NOTIFICATION_FILTER: Wrong length received: " + tagLength |
| + " expected: " + NOTIFICATION_FILTER_LEN); |
| } else { |
| setNotificationFilter(appParamBuf.getInt(i) & 0xffffffffL); // 4 bytes |
| } |
| break; |
| case MAS_INSTANCE_ID: |
| if (tagLength != MAS_INSTANCE_ID_LEN) { |
| Log.w(TAG, "MAS_INSTANCE_ID: Wrong length received: " + tagLength |
| + " expected: " + MAS_INSTANCE_ID_LEN); |
| } else { |
| setMasInstanceId(appParams[i] & 0xff); |
| } |
| break; |
| case PARAMETER_MASK: |
| if (tagLength != PARAMETER_MASK_LEN) { |
| Log.w(TAG, "PARAMETER_MASK: Wrong length received: " + tagLength |
| + " expected: " + PARAMETER_MASK_LEN); |
| } else { |
| setParameterMask(appParamBuf.getInt(i) & 0xffffffffL); // Make it unsigned |
| } |
| break; |
| case FOLDER_LISTING_SIZE: |
| if (tagLength != FOLDER_LISTING_SIZE_LEN) { |
| Log.w(TAG, "FOLDER_LISTING_SIZE: Wrong length received: " + tagLength |
| + " expected: " + FOLDER_LISTING_SIZE_LEN); |
| } else { |
| setFolderListingSize(appParamBuf.getShort(i) & 0xffff); // Make it unsigned |
| } |
| break; |
| case MESSAGE_LISTING_SIZE: |
| if (tagLength != MESSAGE_LISTING_SIZE_LEN) { |
| Log.w(TAG, "MESSAGE_LISTING_SIZE: Wrong length received: " + tagLength |
| + " expected: " + MESSAGE_LISTING_SIZE_LEN); |
| } else { |
| setMessageListingSize(appParamBuf.getShort(i) & 0xffff); // Make it unsigned |
| } |
| break; |
| case SUBJECT_LENGTH: |
| if (tagLength != SUBJECT_LENGTH_LEN) { |
| Log.w(TAG, "SUBJECT_LENGTH: Wrong length received: " + tagLength |
| + " expected: " + SUBJECT_LENGTH_LEN); |
| } else { |
| setSubjectLength(appParams[i] & 0xff); |
| } |
| break; |
| case CHARSET: |
| if (tagLength != CHARSET_LEN) { |
| Log.w(TAG, "CHARSET: Wrong length received: " + tagLength + " expected: " |
| + CHARSET_LEN); |
| } else { |
| setCharset(appParams[i] & 0x01); // Lower bit |
| } |
| break; |
| case FRACTION_REQUEST: |
| if (tagLength != FRACTION_REQUEST_LEN) { |
| Log.w(TAG, "FRACTION_REQUEST: Wrong length received: " + tagLength |
| + " expected: " + FRACTION_REQUEST_LEN); |
| } else { |
| setFractionRequest(appParams[i] & 0x01); // Lower bit |
| } |
| break; |
| case FRACTION_DELIVER: |
| if (tagLength != FRACTION_DELIVER_LEN) { |
| Log.w(TAG, "FRACTION_DELIVER: Wrong length received: " + tagLength |
| + " expected: " + FRACTION_DELIVER_LEN); |
| } else { |
| setFractionDeliver(appParams[i] & 0x01); // Lower bit |
| } |
| break; |
| case STATUS_INDICATOR: |
| if (tagLength != STATUS_INDICATOR_LEN) { |
| Log.w(TAG, "STATUS_INDICATOR: Wrong length received: " + tagLength |
| + " expected: " + STATUS_INDICATOR_LEN); |
| } else { |
| setStatusIndicator(appParams[i] & 0x01); // Lower bit |
| } |
| break; |
| case STATUS_VALUE: |
| if (tagLength != STATUS_VALUE_LEN) { |
| Log.w(TAG, |
| "STATUS_VALUER: Wrong length received: " + tagLength + " expected: " |
| + STATUS_VALUE_LEN); |
| } else { |
| setStatusValue(appParams[i] & 0x01); // Lower bit |
| } |
| break; |
| case MSE_TIME: |
| setMseTime(new String(appParams, i, tagLength)); |
| break; |
| case DATABASE_INDETIFIER: |
| if ((tagLength != DATABASE_INDETIFIER_LEN)) { |
| Log.w(TAG, "DATABASE_IDENTIFIER: Wrong length received: " + tagLength |
| + " expected: " + DATABASE_INDETIFIER_LEN); |
| } else { |
| setDatabaseIdentifier(appParamBuf.getLong(i)/*MSB*/, |
| appParamBuf.getLong(i + 8)/*LSB*/); |
| } |
| break; |
| case CONVO_LIST_VER_COUNTER: |
| if ((tagLength != CONVO_LIST_VER_COUNTER_LEN)) { |
| Log.w(TAG, "CONVO_LIST_VER_COUNTER: Wrong length received: " + tagLength |
| + " expected: " + CONVO_LIST_VER_COUNTER_LEN); |
| } else { |
| setConvoListingVerCounter(appParamBuf.getLong(i)/*MSB*/, |
| appParamBuf.getLong(i + 8)/*LSB*/); |
| } |
| break; |
| case PRESENCE_AVAILABLE: |
| if ((tagLength != PRESENCE_AVAILABLE_LEN)) { |
| Log.w(TAG, "PRESENCE_AVAILABLE: Wrong length received: " + tagLength |
| + " expected: " + PRESENCE_AVAILABLE_LEN); |
| } else { |
| setPresenceAvailability(appParams[i]); |
| } |
| break; |
| case PRESENCE_TEXT: |
| if (tagLength != 0) { |
| setPresenceStatus(new String(appParams, i, tagLength)); |
| } else { |
| Log.w(TAG, "PRESENCE_STATUS: Wrong length received: " + tagLength |
| + " expected to be more than 0"); |
| } |
| break; |
| case LAST_ACTIVITY: |
| if (tagLength != 0) { |
| setLastActivity(new String(appParams, i, tagLength)); |
| } else { |
| Log.w(TAG, "LAST_ACTIVITY: Wrong length received: " + tagLength |
| + " expected to be more than 0"); |
| } |
| break; |
| case CHAT_STATE: |
| if ((tagLength != CHAT_STATE_LEN)) { |
| Log.w(TAG, "CHAT_STATE: Wrong length received: " + tagLength + " expected: " |
| + CHAT_STATE_LEN); |
| } else { |
| setChatState(appParams[i]); |
| } |
| break; |
| case FILTER_CONVO_ID: |
| if ((tagLength != 0) && (tagLength <= FILTER_CONVO_ID_LEN)) { |
| setFilterConvoId(new String(appParams, i, tagLength)); |
| } else { |
| Log.w(TAG, "FILTER_CONVO_ID: Wrong length received: " + tagLength |
| + " expected: " + FILTER_CONVO_ID_LEN); |
| } |
| break; |
| case CONVO_LISTING_SIZE: |
| if (tagLength != CONVO_LISTING_SIZE_LEN) { |
| Log.w(TAG, |
| "LISTING_SIZE: Wrong length received: " + tagLength + " expected: " |
| + CONVO_LISTING_SIZE_LEN); |
| |
| } else { |
| setConvoListingSize(appParamBuf.getShort(i) & 0xffff); |
| } |
| break; |
| case FILTER_PRESENCE: |
| if ((tagLength != FILTER_PRESENCE_LEN)) { |
| Log.w(TAG, "FILTER_PRESENCE: Wrong length received: " + tagLength |
| + " expected: " + FILTER_PRESENCE_LEN); |
| } else { |
| setFilterPresence(appParams[i]); |
| } |
| break; |
| case FILTER_UID_PRESENT: |
| if ((tagLength != FILTER_UID_PRESENT_LEN)) { |
| Log.w(TAG, "FILTER_UID_PRESENT: Wrong length received: " + tagLength |
| + " expected: " + FILTER_UID_PRESENT_LEN); |
| } else { |
| setFilterUidPresent(appParams[i] & 0x1); |
| } |
| break; |
| case CHAT_STATE_CONVO_ID: |
| if ((tagLength != CHAT_STATE_CONVO_ID_LEN)) { |
| Log.w(TAG, "CHAT_STATE_CONVO_ID: Wrong length received: " + tagLength |
| + " expected: " + CHAT_STATE_CONVO_ID_LEN); |
| } else { |
| /* TODO: Is this correct convoId handling? */ |
| setChatStateConvoId(appParamBuf.getLong(i)/*MSB*/, |
| appParamBuf.getLong(i + 8)/*LSB*/); |
| Log.d(TAG, "CHAT_STATE_CONVO_ID: convo id " + "MSB=" |
| + BluetoothMapUtils.getLongAsString(appParamBuf.getLong(i)) |
| + ", LSB(+8)=" + BluetoothMapUtils.getLongAsString( |
| appParamBuf.getLong(i + 8))); |
| |
| } |
| break; |
| case FOLDER_VER_COUNTER: |
| break; |
| case FILTER_MESSAGE_HANDLE: |
| if ((tagLength != 0 && tagLength <= FILTER_MESSAGE_HANDLE_LEN)) { |
| setFilterMsgHandle(new String(appParams, i, tagLength)); |
| } else { |
| Log.w(TAG, "FILTER_MESSAGE_HANDLE: Wrong length received: " + tagLength |
| + " expected: " + FILTER_MESSAGE_HANDLE_LEN); |
| } |
| |
| break; |
| case CONVO_PARAMETER_MASK: |
| if (tagLength != CONVO_PARAMETER_MASK_LEN) { |
| Log.w(TAG, "CONVO_PARAMETER_MASK: Wrong length received: " + tagLength |
| + " expected: " + CONVO_PARAMETER_MASK_LEN); |
| } else { |
| setConvoParameterMask( |
| appParamBuf.getInt(i) & 0xffffffffL); // Make it unsigned |
| } |
| break; |
| default: |
| // Just skip unknown Tags, no need to report error |
| Log.w(TAG, "Unknown TagId received ( 0x" + Integer.toString(tagId, 16) |
| + "), skipping..."); |
| break; |
| } |
| i += tagLength; // Offset to next TagId |
| } |
| } |
| |
| /** |
| * Get the approximate length needed to store the appParameters in a byte |
| * array. |
| * |
| * @return the length in bytes |
| * @throws UnsupportedEncodingException |
| * if the platform does not support UTF-8 encoding. |
| */ |
| private int getParamMaxLength() throws UnsupportedEncodingException { |
| int length = 0; |
| length += 38 * 2; // tagId + tagLength |
| length += 33 + 4 * 16; // fixed sizes TODO: Update when spec is ready |
| length += getFilterPeriodBegin() == INVALID_VALUE_PARAMETER ? 0 : 20; |
| length += getFilterPeriodEnd() == INVALID_VALUE_PARAMETER ? 0 : 20; |
| if (getFilterRecipient() != null) { |
| length += getFilterRecipient().getBytes("UTF-8").length; |
| } |
| if (getFilterOriginator() != null) { |
| length += getFilterOriginator().getBytes("UTF-8").length; |
| } |
| length += getMseTime() == INVALID_VALUE_PARAMETER ? 0 : 20; |
| if (getPresenceStatus() != null) { |
| length += getPresenceStatus().getBytes("UTF-8").length; |
| } |
| length += (getLastActivity() == INVALID_VALUE_PARAMETER) ? 0 : 20; |
| return length; |
| } |
| |
| /** |
| * Encode the application parameter object to a byte array. |
| * |
| * @return a byte Array representation of the application parameter object. |
| * @throws UnsupportedEncodingException |
| * if the platform does not support UTF-8 encoding. |
| */ |
| public byte[] encodeParams() throws UnsupportedEncodingException { |
| ByteBuffer appParamBuf = ByteBuffer.allocate(getParamMaxLength()); |
| appParamBuf.order(ByteOrder.BIG_ENDIAN); |
| byte[] retBuf; |
| |
| if (getMaxListCount() != INVALID_VALUE_PARAMETER) { |
| appParamBuf.put((byte) MAX_LIST_COUNT); |
| appParamBuf.put((byte) MAX_LIST_COUNT_LEN); |
| appParamBuf.putShort((short) getMaxListCount()); |
| } |
| if (getStartOffset() != INVALID_VALUE_PARAMETER) { |
| appParamBuf.put((byte) START_OFFSET); |
| appParamBuf.put((byte) START_OFFSET_LEN); |
| appParamBuf.putShort((short) getStartOffset()); |
| } |
| if (getFilterMessageType() != INVALID_VALUE_PARAMETER) { |
| appParamBuf.put((byte) FILTER_MESSAGE_TYPE); |
| appParamBuf.put((byte) FILTER_MESSAGE_TYPE_LEN); |
| appParamBuf.put((byte) getFilterMessageType()); |
| } |
| if (getFilterPeriodBegin() != INVALID_VALUE_PARAMETER) { |
| appParamBuf.put((byte) FILTER_PERIOD_BEGIN); |
| appParamBuf.put((byte) getFilterPeriodBeginString().getBytes("UTF-8").length); |
| appParamBuf.put(getFilterPeriodBeginString().getBytes("UTF-8")); |
| } |
| if (getFilterPeriodEnd() != INVALID_VALUE_PARAMETER) { |
| appParamBuf.put((byte) FILTER_PERIOD_END); |
| appParamBuf.put((byte) getFilterPeriodEndString().getBytes("UTF-8").length); |
| appParamBuf.put(getFilterPeriodEndString().getBytes("UTF-8")); |
| } |
| if (getFilterReadStatus() != INVALID_VALUE_PARAMETER) { |
| appParamBuf.put((byte) FILTER_READ_STATUS); |
| appParamBuf.put((byte) FILTER_READ_STATUS_LEN); |
| appParamBuf.put((byte) getFilterReadStatus()); |
| } |
| if (getFilterRecipient() != null) { |
| appParamBuf.put((byte) FILTER_RECIPIENT); |
| appParamBuf.put((byte) getFilterRecipient().getBytes("UTF-8").length); |
| appParamBuf.put(getFilterRecipient().getBytes("UTF-8")); |
| } |
| if (getFilterOriginator() != null) { |
| appParamBuf.put((byte) FILTER_ORIGINATOR); |
| appParamBuf.put((byte) getFilterOriginator().getBytes("UTF-8").length); |
| appParamBuf.put(getFilterOriginator().getBytes("UTF-8")); |
| } |
| if (getFilterPriority() != INVALID_VALUE_PARAMETER) { |
| appParamBuf.put((byte) FILTER_PRIORITY); |
| appParamBuf.put((byte) FILTER_PRIORITY_LEN); |
| appParamBuf.put((byte) getFilterPriority()); |
| } |
| if (getAttachment() != INVALID_VALUE_PARAMETER) { |
| appParamBuf.put((byte) ATTACHMENT); |
| appParamBuf.put((byte) ATTACHMENT_LEN); |
| appParamBuf.put((byte) getAttachment()); |
| } |
| if (getTransparent() != INVALID_VALUE_PARAMETER) { |
| appParamBuf.put((byte) TRANSPARENT); |
| appParamBuf.put((byte) TRANSPARENT_LEN); |
| appParamBuf.put((byte) getTransparent()); |
| } |
| if (getRetry() != INVALID_VALUE_PARAMETER) { |
| appParamBuf.put((byte) RETRY); |
| appParamBuf.put((byte) RETRY_LEN); |
| appParamBuf.put((byte) getRetry()); |
| } |
| if (getNewMessage() != INVALID_VALUE_PARAMETER) { |
| appParamBuf.put((byte) NEW_MESSAGE); |
| appParamBuf.put((byte) NEW_MESSAGE_LEN); |
| appParamBuf.put((byte) getNewMessage()); |
| } |
| if (getNotificationStatus() != INVALID_VALUE_PARAMETER) { |
| appParamBuf.put((byte) NOTIFICATION_STATUS); |
| appParamBuf.put((byte) NOTIFICATION_STATUS_LEN); |
| appParamBuf.putShort((short) getNotificationStatus()); |
| } |
| if (getNotificationFilter() != INVALID_VALUE_PARAMETER) { |
| appParamBuf.put((byte) NOTIFICATION_FILTER); |
| appParamBuf.put((byte) NOTIFICATION_FILTER_LEN); |
| appParamBuf.putInt((int) getNotificationFilter()); |
| } |
| if (getMasInstanceId() != INVALID_VALUE_PARAMETER) { |
| appParamBuf.put((byte) MAS_INSTANCE_ID); |
| appParamBuf.put((byte) MAS_INSTANCE_ID_LEN); |
| appParamBuf.put((byte) getMasInstanceId()); |
| } |
| if (getParameterMask() != INVALID_VALUE_PARAMETER) { |
| appParamBuf.put((byte) PARAMETER_MASK); |
| appParamBuf.put((byte) PARAMETER_MASK_LEN); |
| appParamBuf.putInt((int) getParameterMask()); |
| } |
| if (getFolderListingSize() != INVALID_VALUE_PARAMETER) { |
| appParamBuf.put((byte) FOLDER_LISTING_SIZE); |
| appParamBuf.put((byte) FOLDER_LISTING_SIZE_LEN); |
| appParamBuf.putShort((short) getFolderListingSize()); |
| } |
| if (getMessageListingSize() != INVALID_VALUE_PARAMETER) { |
| appParamBuf.put((byte) MESSAGE_LISTING_SIZE); |
| appParamBuf.put((byte) MESSAGE_LISTING_SIZE_LEN); |
| appParamBuf.putShort((short) getMessageListingSize()); |
| } |
| if (getSubjectLength() != INVALID_VALUE_PARAMETER) { |
| appParamBuf.put((byte) SUBJECT_LENGTH); |
| appParamBuf.put((byte) SUBJECT_LENGTH_LEN); |
| appParamBuf.put((byte) getSubjectLength()); |
| } |
| if (getCharset() != INVALID_VALUE_PARAMETER) { |
| appParamBuf.put((byte) CHARSET); |
| appParamBuf.put((byte) CHARSET_LEN); |
| appParamBuf.put((byte) getCharset()); |
| } |
| if (getFractionRequest() != INVALID_VALUE_PARAMETER) { |
| appParamBuf.put((byte) FRACTION_REQUEST); |
| appParamBuf.put((byte) FRACTION_REQUEST_LEN); |
| appParamBuf.put((byte) getFractionRequest()); |
| } |
| if (getFractionDeliver() != INVALID_VALUE_PARAMETER) { |
| appParamBuf.put((byte) FRACTION_DELIVER); |
| appParamBuf.put((byte) FRACTION_DELIVER_LEN); |
| appParamBuf.put((byte) getFractionDeliver()); |
| } |
| if (getStatusIndicator() != INVALID_VALUE_PARAMETER) { |
| appParamBuf.put((byte) STATUS_INDICATOR); |
| appParamBuf.put((byte) STATUS_INDICATOR_LEN); |
| appParamBuf.put((byte) getStatusIndicator()); |
| } |
| if (getStatusValue() != INVALID_VALUE_PARAMETER) { |
| appParamBuf.put((byte) STATUS_VALUE); |
| appParamBuf.put((byte) STATUS_VALUE_LEN); |
| appParamBuf.put((byte) getStatusValue()); |
| } |
| if (getMseTime() != INVALID_VALUE_PARAMETER) { |
| appParamBuf.put((byte) MSE_TIME); |
| appParamBuf.put((byte) getMseTimeString().getBytes("UTF-8").length); |
| appParamBuf.put(getMseTimeString().getBytes("UTF-8")); |
| } |
| // Note: New for IM |
| if (getDatabaseIdentifier() != null) { |
| appParamBuf.put((byte) DATABASE_INDETIFIER); |
| appParamBuf.put((byte) DATABASE_INDETIFIER_LEN); |
| appParamBuf.put(getDatabaseIdentifier()); |
| } |
| if (getConvoListingVerCounter() != null) { |
| appParamBuf.put((byte) CONVO_LIST_VER_COUNTER); |
| appParamBuf.put((byte) CONVO_LIST_VER_COUNTER_LEN); |
| appParamBuf.put(getConvoListingVerCounter()); |
| } |
| if (getPresenceAvailability() != INVALID_VALUE_PARAMETER) { |
| appParamBuf.put((byte) PRESENCE_AVAILABLE); |
| appParamBuf.put((byte) PRESENCE_AVAILABLE_LEN); |
| appParamBuf.putInt((int) getPresenceAvailability()); |
| } |
| if (getPresenceStatus() != null) { |
| appParamBuf.put((byte) PRESENCE_TEXT); |
| appParamBuf.put((byte) getPresenceStatus().getBytes("UTF-8").length); |
| appParamBuf.put(getPresenceStatus().getBytes()); |
| } |
| if (getLastActivity() != INVALID_VALUE_PARAMETER) { |
| appParamBuf.put((byte) LAST_ACTIVITY); |
| appParamBuf.put((byte) getLastActivityString().getBytes("UTF-8").length); |
| appParamBuf.put(getLastActivityString().getBytes()); |
| } |
| if (getChatState() != INVALID_VALUE_PARAMETER) { |
| appParamBuf.put((byte) CHAT_STATE); |
| appParamBuf.put((byte) CHAT_STATE_LEN); |
| appParamBuf.putShort((short) getChatState()); |
| } |
| if (getFilterConvoId() != null) { |
| appParamBuf.put((byte) FILTER_CONVO_ID); |
| appParamBuf.put((byte) FILTER_CONVO_ID_LEN); |
| appParamBuf.putLong(getFilterConvoId().getMostSignificantBits()); |
| appParamBuf.putLong(getFilterConvoId().getLeastSignificantBits()); |
| } |
| if (getConvoListingSize() != INVALID_VALUE_PARAMETER) { |
| appParamBuf.put((byte) CONVO_LISTING_SIZE); |
| appParamBuf.put((byte) CONVO_LISTING_SIZE_LEN); |
| appParamBuf.putShort((short) getConvoListingSize()); |
| } |
| if (getFilterPresence() != INVALID_VALUE_PARAMETER) { |
| appParamBuf.put((byte) FILTER_PRESENCE); |
| appParamBuf.put((byte) FILTER_PRESENCE_LEN); |
| appParamBuf.putShort((short) getFilterPresence()); |
| } |
| if (getFilterUidPresent() != INVALID_VALUE_PARAMETER) { |
| appParamBuf.put((byte) FILTER_UID_PRESENT); |
| appParamBuf.put((byte) FILTER_UID_PRESENT_LEN); |
| appParamBuf.putShort((short) getFilterUidPresent()); |
| } |
| if (getChatStateConvoId() != null) { |
| appParamBuf.put((byte) CHAT_STATE_CONVO_ID); |
| appParamBuf.put((byte) CHAT_STATE_CONVO_ID_LEN); |
| appParamBuf.putLong(getChatStateConvoId().getMostSignificantBits()); |
| appParamBuf.putLong(getChatStateConvoId().getLeastSignificantBits()); |
| } |
| if (getFolderVerCounter() != null) { |
| appParamBuf.put((byte) FOLDER_VER_COUNTER); |
| appParamBuf.put((byte) FOLDER_VER_COUNTER_LEN); |
| appParamBuf.put(getFolderVerCounter()); |
| } |
| if (getFilterMsgHandle() != INVALID_VALUE_PARAMETER) { |
| appParamBuf.put((byte) FILTER_MESSAGE_HANDLE); |
| appParamBuf.put((byte) FILTER_MESSAGE_HANDLE_LEN); |
| appParamBuf.putLong(getFilterMsgHandle()); |
| } |
| if (getConvoParameterMask() != INVALID_VALUE_PARAMETER) { |
| appParamBuf.put((byte) CONVO_PARAMETER_MASK); |
| appParamBuf.put((byte) CONVO_PARAMETER_MASK_LEN); |
| appParamBuf.putInt((int) getConvoParameterMask()); |
| } |
| |
| // We need to reduce the length of the array to match the content |
| retBuf = Arrays.copyOfRange(appParamBuf.array(), appParamBuf.arrayOffset(), |
| appParamBuf.arrayOffset() + appParamBuf.position()); |
| return retBuf; |
| } |
| |
| public int getMaxListCount() { |
| return mMaxListCount; |
| } |
| |
| public void setMaxListCount(int maxListCount) throws IllegalArgumentException { |
| if (maxListCount < 0 || maxListCount > 0xFFFF) { |
| throw new IllegalArgumentException("Out of range, valid range is 0x0000 to 0xFFFF"); |
| } |
| this.mMaxListCount = maxListCount; |
| } |
| |
| public int getStartOffset() { |
| return mStartOffset; |
| } |
| |
| public void setStartOffset(int startOffset) throws IllegalArgumentException { |
| if (startOffset < 0 || startOffset > 0xFFFF) { |
| throw new IllegalArgumentException("Out of range, valid range is 0x0000 to 0xFFFF"); |
| } |
| this.mStartOffset = startOffset; |
| } |
| |
| public int getFilterMessageType() { |
| return mFilterMessageType; |
| } |
| |
| public void setFilterMessageType(int filterMessageType) throws IllegalArgumentException { |
| if (filterMessageType < 0 || filterMessageType > 0x001F) { |
| throw new IllegalArgumentException("Out of range, valid range is 0x0000 to 0x001F"); |
| } |
| this.mFilterMessageType = filterMessageType; |
| } |
| |
| public long getFilterPeriodBegin() { |
| return mFilterPeriodBegin; |
| } |
| |
| public String getFilterPeriodBeginString() { |
| SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd'T'HHmmss"); |
| Date date = new Date(mFilterPeriodBegin); |
| return format.format(date); // Format to YYYYMMDDTHHMMSS local time |
| } |
| |
| public void setFilterPeriodBegin(long filterPeriodBegin) { |
| this.mFilterPeriodBegin = filterPeriodBegin; |
| } |
| |
| public void setFilterPeriodBegin(String filterPeriodBegin) throws ParseException { |
| SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd'T'HHmmss"); |
| Date date = format.parse(filterPeriodBegin); |
| this.mFilterPeriodBegin = date.getTime(); |
| } |
| |
| public long getFilterLastActivityBegin() { |
| return mFilterPeriodBegin; |
| } |
| |
| public String getFilterLastActivityBeginString() { |
| SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd'T'HHmmss"); |
| Date date = new Date(mFilterPeriodBegin); |
| return format.format(date); // Format to YYYYMMDDTHHMMSS local time |
| } |
| |
| public void setFilterLastActivityBegin(long filterPeriodBegin) { |
| this.mFilterPeriodBegin = filterPeriodBegin; |
| } |
| |
| public void setFilterLastActivityBegin(String filterPeriodBegin) throws ParseException { |
| SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd'T'HHmmss"); |
| Date date = format.parse(filterPeriodBegin); |
| this.mFilterPeriodBegin = date.getTime(); |
| } |
| |
| public long getFilterPeriodEnd() { |
| return mFilterPeriodEnd; |
| } |
| |
| public long getFilterLastActivityEnd() { |
| return mFilterPeriodEnd; |
| } |
| |
| public String getFilterLastActivityEndString() { |
| SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd'T'HHmmss"); |
| Date date = new Date(mFilterPeriodEnd); |
| return format.format(date); // Format to YYYYMMDDTHHMMSS local time |
| } |
| |
| public void setFilterLastActivityEnd(long filterPeriodEnd) { |
| this.mFilterPeriodEnd = filterPeriodEnd; //er reuse the same |
| } |
| |
| public void setFilterPeriodEnd(String filterPeriodEnd) throws ParseException { |
| SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd'T'HHmmss"); |
| Date date = format.parse(filterPeriodEnd); |
| this.mFilterPeriodEnd = date.getTime(); |
| } |
| |
| public String getFilterPeriodEndString() { |
| SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd'T'HHmmss"); |
| Date date = new Date(mFilterPeriodEnd); |
| return format.format(date); // Format to YYYYMMDDTHHMMSS local time |
| } |
| |
| public void setFilterPeriodEnd(long filterPeriodEnd) { |
| this.mFilterPeriodEnd = filterPeriodEnd; |
| } |
| |
| public void setFilterLastActivityEnd(String filterPeriodEnd) throws ParseException { |
| SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd'T'HHmmss"); |
| Date date = format.parse(filterPeriodEnd); |
| this.mFilterPeriodEnd = date.getTime(); |
| } |
| |
| public int getFilterReadStatus() { |
| return mFilterReadStatus; |
| } |
| |
| public void setFilterReadStatus(int filterReadStatus) throws IllegalArgumentException { |
| if (filterReadStatus < 0 || filterReadStatus > 0x0002) { |
| throw new IllegalArgumentException("Out of range, valid range is 0x0000 to 0x0002"); |
| } |
| this.mFilterReadStatus = filterReadStatus; |
| } |
| |
| public String getFilterRecipient() { |
| return mFilterRecipient; |
| } |
| |
| public void setFilterRecipient(String filterRecipient) { |
| this.mFilterRecipient = filterRecipient; |
| } |
| |
| public String getFilterOriginator() { |
| return mFilterOriginator; |
| } |
| |
| public void setFilterOriginator(String filterOriginator) { |
| this.mFilterOriginator = filterOriginator; |
| } |
| |
| public int getFilterPriority() { |
| return mFilterPriority; |
| } |
| |
| public void setFilterPriority(int filterPriority) throws IllegalArgumentException { |
| if (filterPriority < 0 || filterPriority > 0x0002) { |
| throw new IllegalArgumentException("Out of range, valid range is 0x0000 to 0x0002"); |
| } |
| this.mFilterPriority = filterPriority; |
| } |
| |
| public void setDatabaseIdentifier(long idHigh, long idLow) { |
| this.mDatabaseIdentifierHigh = idHigh; |
| this.mDatabaseIdentifierLow = idLow; |
| } |
| |
| public byte[] getDatabaseIdentifier() { |
| if (mDatabaseIdentifierLow != INVALID_VALUE_PARAMETER |
| && mDatabaseIdentifierHigh != INVALID_VALUE_PARAMETER) { |
| ByteBuffer ret = ByteBuffer.allocate(16); |
| ret.putLong(mDatabaseIdentifierHigh); |
| ret.putLong(mDatabaseIdentifierLow); |
| return ret.array(); |
| } else { |
| return null; |
| } |
| } |
| |
| public void setConvoListingVerCounter(long countLow, long countHigh) { |
| this.mConvoListingVerCounterHigh = countHigh; |
| this.mConvoListingVerCounterLow = countLow; |
| } |
| |
| public byte[] getConvoListingVerCounter() { |
| if (mConvoListingVerCounterHigh != INVALID_VALUE_PARAMETER |
| && mConvoListingVerCounterLow != INVALID_VALUE_PARAMETER) { |
| ByteBuffer ret = ByteBuffer.allocate(16); |
| ret.putLong(mConvoListingVerCounterHigh); |
| ret.putLong(mConvoListingVerCounterLow); |
| return ret.array(); |
| } else { |
| return null; |
| } |
| } |
| |
| public void setFolderVerCounter(long countLow, long countHigh) { |
| this.mFolderVerCounterHigh = countHigh; |
| this.mFolderVerCounterLow = countLow; |
| } |
| |
| public byte[] getFolderVerCounter() { |
| if (mFolderVerCounterHigh != INVALID_VALUE_PARAMETER |
| && mFolderVerCounterLow != INVALID_VALUE_PARAMETER) { |
| ByteBuffer ret = ByteBuffer.allocate(16); |
| ret.putLong(mFolderVerCounterHigh); |
| ret.putLong(mFolderVerCounterLow); |
| return ret.array(); |
| } else { |
| return null; |
| } |
| } |
| |
| public SignedLongLong getChatStateConvoId() { |
| return mChatStateConvoId; |
| } |
| |
| public byte[] getChatStateConvoIdByteArray() { |
| if (mChatStateConvoId != null) { |
| ByteBuffer ret = ByteBuffer.allocate(16); |
| ret.putLong(mChatStateConvoId.getMostSignificantBits()); |
| ret.putLong(mChatStateConvoId.getLeastSignificantBits()); |
| return ret.array(); |
| } else { |
| return null; |
| } |
| } |
| |
| public String getChatStateConvoIdString() { |
| String str = null; |
| str = new String(this.getChatStateConvoIdByteArray()); |
| return str; |
| } |
| |
| public void setChatStateConvoId(long idHigh, long idLow) { |
| mChatStateConvoId = new SignedLongLong(idLow, idHigh); |
| } |
| |
| public void setFilterMsgHandle(String handle) { |
| try { |
| mFilterMsgHandle = BluetoothMapUtils.getLongFromString(handle); |
| } catch (UnsupportedEncodingException | NumberFormatException e) { |
| Log.w(TAG, "Error creating long from handle string", e); |
| } |
| } |
| |
| public long getFilterMsgHandle() { |
| return mFilterMsgHandle; |
| } |
| |
| public String getFilterMsgHandleString() { |
| String str = null; |
| if (mFilterMsgHandle != INVALID_VALUE_PARAMETER) { |
| str = BluetoothMapUtils.getLongAsString(mFilterMsgHandle); |
| } |
| return str; |
| } |
| |
| public int getFilterUidPresent() { |
| return mFilterUidPresent; |
| } |
| |
| public void setFilterUidPresent(int present) { |
| if (present < 0 || present > 0x00FF) { |
| throw new IllegalArgumentException("Out of range, valid range is 0x0000 to 0x00FF"); |
| } |
| this.mFilterUidPresent = present; |
| } |
| |
| public int getFilterPresence() { |
| return mFilterPresence; |
| } |
| |
| |
| public SignedLongLong getFilterConvoId() { |
| return mFilterConvoId; |
| } |
| |
| /** |
| * Get a decimal representation of the lower bits of the ConvoId - used for queries. |
| * The upper bits are used for convo-type. |
| * @return decimal representation of the convo ID. |
| */ |
| public String getFilterConvoIdString() { |
| String str = null; |
| if (mFilterConvoId != null) { |
| str = BluetoothMapUtils.getLongAsString(mFilterConvoId.getLeastSignificantBits()); |
| } |
| return str; |
| } |
| |
| |
| public void setFilterConvoId(String id) { |
| try { |
| mFilterConvoId = SignedLongLong.fromString(id); |
| } catch (UnsupportedEncodingException | NumberFormatException e) { |
| Log.w(TAG, "Error creating long from id string", e); |
| } |
| } |
| |
| |
| public void setChatState(int state) { |
| if (state < 0 || state > 0x00FF) { |
| throw new IllegalArgumentException("Out of range, valid range is 0x0000 to 0x00FF"); |
| } |
| this.mChatState = state; |
| } |
| |
| public int getChatState() { |
| return mChatState; |
| } |
| |
| public long getLastActivity() { |
| return this.mLastActivity; |
| } |
| |
| public String getLastActivityString() { |
| SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd'T'HHmmssZ"); |
| Date date = new Date(mLastActivity); |
| return format.format(date); // Format to YYYYMMDDTHHMMSS local time |
| } |
| |
| public void setLastActivity(long last) { |
| this.mLastActivity = last; |
| } |
| |
| public void setLastActivity(String lastActivity) throws ParseException { |
| SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd'T'HHmmssZ"); |
| Date date = format.parse(lastActivity); |
| this.mLastActivity = date.getTime(); |
| } |
| |
| public void setPresenceStatus(String status) { |
| this.mPresenceStatus = status; |
| } |
| |
| public String getPresenceStatus() { |
| return this.mPresenceStatus; |
| } |
| |
| public void setFilterPresence(int presence) { |
| if (presence < 0 || presence > 0xFFFF) { |
| throw new IllegalArgumentException("Out of range, valid range is 0x0000 to 0xFFFF"); |
| } |
| this.mFilterPresence = presence; |
| } |
| |
| public void setPresenceAvailability(int availability) { |
| if (availability < 0 || availability > 0x00FF) { |
| throw new IllegalArgumentException("Out of range, valid range is 0x0000 to 0x00FF"); |
| } |
| this.mPresenceAvailability = availability; |
| } |
| |
| public int getPresenceAvailability() { |
| return mPresenceAvailability; |
| } |
| |
| public int getSubjectLength() { |
| return mSubjectLength; |
| } |
| |
| public int getAttachment() { |
| return mAttachment; |
| } |
| |
| public void setAttachment(int attachment) throws IllegalArgumentException { |
| if (attachment < 0 || attachment > 0x0001) { |
| throw new IllegalArgumentException("Out of range, valid range is 0x0000 to 0x0001"); |
| } |
| this.mAttachment = attachment; |
| } |
| |
| public int getTransparent() { |
| return mTransparent; |
| } |
| |
| public void setTransparent(int transparent) throws IllegalArgumentException { |
| if (transparent < 0 || transparent > 0x0001) { |
| throw new IllegalArgumentException("Out of range, valid range is 0x0000 to 0x0001"); |
| } |
| this.mTransparent = transparent; |
| } |
| |
| public int getRetry() { |
| return mRetry; |
| } |
| |
| public void setRetry(int retry) throws IllegalArgumentException { |
| if (retry < 0 || retry > 0x0001) { |
| throw new IllegalArgumentException("Out of range, valid range is 0x0000 to 0x0001"); |
| } |
| this.mRetry = retry; |
| } |
| |
| public int getNewMessage() { |
| return mNewMessage; |
| } |
| |
| public void setNewMessage(int newMessage) throws IllegalArgumentException { |
| if (newMessage < 0 || newMessage > 0x0001) { |
| throw new IllegalArgumentException("Out of range, valid range is 0x0000 to 0x0001"); |
| } |
| this.mNewMessage = newMessage; |
| } |
| |
| public int getNotificationStatus() { |
| return mNotificationStatus; |
| } |
| |
| public void setNotificationStatus(int notificationStatus) throws IllegalArgumentException { |
| if (notificationStatus < 0 || notificationStatus > 0x0001) { |
| throw new IllegalArgumentException("Out of range, valid range is 0x0000 to 0x0001"); |
| } |
| this.mNotificationStatus = notificationStatus; |
| } |
| |
| public long getNotificationFilter() { |
| return mNotificationFilter; |
| } |
| |
| public void setNotificationFilter(long notificationFilter) throws IllegalArgumentException { |
| if (notificationFilter < 0 || notificationFilter > 0xFFFFFFFFL) { |
| throw new IllegalArgumentException( |
| "Out of range, valid range is 0x0000 to 0xFFFFFFFFL"); |
| } |
| this.mNotificationFilter = notificationFilter; |
| } |
| |
| public int getMasInstanceId() { |
| return mMasInstanceId; |
| } |
| |
| public void setMasInstanceId(int masInstanceId) { |
| if (masInstanceId < 0 || masInstanceId > 0x00FF) { |
| throw new IllegalArgumentException("Out of range, valid range is 0x0000 to 0x00FF"); |
| } |
| this.mMasInstanceId = masInstanceId; |
| } |
| |
| public long getParameterMask() { |
| return mParameterMask; |
| } |
| |
| public void setParameterMask(long parameterMask) { |
| if (parameterMask < 0 || parameterMask > 0xFFFFFFFFL) { |
| throw new IllegalArgumentException("Out of range, valid range is 0x0000 to 0xFFFFFFFF"); |
| } |
| this.mParameterMask = parameterMask; |
| } |
| |
| public void setConvoParameterMask(long parameterMask) { |
| if (parameterMask < 0 || parameterMask > 0xFFFFFFFFL) { |
| throw new IllegalArgumentException("Out of range, valid range is 0x0000 to 0xFFFFFFFF"); |
| } |
| this.mConvoParameterMask = parameterMask; |
| } |
| |
| public long getConvoParameterMask() { |
| return mConvoParameterMask; |
| } |
| |
| public int getFolderListingSize() { |
| return mFolderListingSize; |
| } |
| |
| public void setFolderListingSize(int folderListingSize) { |
| if (folderListingSize < 0 || folderListingSize > 0xFFFF) { |
| throw new IllegalArgumentException("Out of range, valid range is 0x0000 to 0xFFFF"); |
| } |
| this.mFolderListingSize = folderListingSize; |
| } |
| |
| public int getMessageListingSize() { |
| return mMessageListingSize; |
| } |
| |
| public void setMessageListingSize(int messageListingSize) { |
| if (messageListingSize < 0 || messageListingSize > 0xFFFF) { |
| throw new IllegalArgumentException("Out of range, valid range is 0x0000 to 0xFFFF"); |
| } |
| this.mMessageListingSize = messageListingSize; |
| } |
| |
| public int getConvoListingSize() { |
| return mConvoListingSize; |
| } |
| |
| public void setConvoListingSize(int convoListingSize) { |
| if (convoListingSize < 0 || convoListingSize > 0xFFFF) { |
| throw new IllegalArgumentException("Out of range, valid range is 0x0000 to 0xFFFF"); |
| } |
| this.mConvoListingSize = convoListingSize; |
| } |
| |
| public void setSubjectLength(int subjectLength) { |
| if (subjectLength < 0 || subjectLength > 0xFF) { |
| throw new IllegalArgumentException("Out of range, valid range is 0x0000 to 0x00FF"); |
| } |
| this.mSubjectLength = subjectLength; |
| } |
| |
| public int getCharset() { |
| return mCharset; |
| } |
| |
| public void setCharset(int charset) { |
| if (charset < 0 || charset > 0x1) { |
| throw new IllegalArgumentException( |
| "Out of range: " + charset + ", valid range is 0x0000 to 0x0001"); |
| } |
| this.mCharset = charset; |
| } |
| |
| public int getFractionRequest() { |
| return mFractionRequest; |
| } |
| |
| public void setFractionRequest(int fractionRequest) { |
| if (fractionRequest < 0 || fractionRequest > 0x1) { |
| throw new IllegalArgumentException("Out of range, valid range is 0x0000 to 0x0001"); |
| } |
| this.mFractionRequest = fractionRequest; |
| } |
| |
| public int getFractionDeliver() { |
| return mFractionDeliver; |
| } |
| |
| public void setFractionDeliver(int fractionDeliver) { |
| if (fractionDeliver < 0 || fractionDeliver > 0x1) { |
| throw new IllegalArgumentException("Out of range, valid range is 0x0000 to 0x0001"); |
| } |
| this.mFractionDeliver = fractionDeliver; |
| } |
| |
| public int getStatusIndicator() { |
| return mStatusIndicator; |
| } |
| |
| public void setStatusIndicator(int statusIndicator) { |
| if (statusIndicator < 0 || statusIndicator > 0x1) { |
| throw new IllegalArgumentException("Out of range, valid range is 0x0000 to 0x0001"); |
| } |
| this.mStatusIndicator = statusIndicator; |
| } |
| |
| public int getStatusValue() { |
| return mStatusValue; |
| } |
| |
| public void setStatusValue(int statusValue) { |
| if (statusValue < 0 || statusValue > 0x1) { |
| throw new IllegalArgumentException("Out of range, valid range is 0x0000 to 0x0001"); |
| } |
| this.mStatusValue = statusValue; |
| } |
| |
| public long getMseTime() { |
| return mMseTime; |
| } |
| |
| public String getMseTimeString() { |
| SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd'T'HHmmssZ"); |
| Date date = new Date(getMseTime()); |
| return format.format(date); // Format to YYYYMMDDTHHMMSS±hhmm UTC time ± offset |
| } |
| |
| public void setMseTime(long mseTime) { |
| this.mMseTime = mseTime; |
| } |
| |
| public void setMseTime(String mseTime) throws ParseException { |
| SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd'T'HHmmssZ"); |
| Date date = format.parse(mseTime); |
| this.mMseTime = date.getTime(); |
| } |
| |
| |
| } |