1192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta/* 2192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * Copyright (C) 2014 The Android Open Source Project 3192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * 4192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * Licensed under the Apache License, Version 2.0 (the "License"); 5192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * you may not use this file except in compliance with the License. 6192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * You may obtain a copy of the License at 7192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * 8192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * http://www.apache.org/licenses/LICENSE-2.0 9192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * 10192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * Unless required by applicable law or agreed to in writing, software 11192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * distributed under the License is distributed on an "AS IS" BASIS, 12192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * See the License for the specific language governing permissions and 14192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * limitations under the License. 15192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta */ 16192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 17192d793d2586b620027edd5b45ff4c72a86cc7beHemant Guptapackage android.bluetooth.client.map; 18192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 19192d793d2586b620027edd5b45ff4c72a86cc7beHemant Guptaimport android.bluetooth.BluetoothDevice; 20192d793d2586b620027edd5b45ff4c72a86cc7beHemant Guptaimport android.bluetooth.BluetoothMasInstance; 21192d793d2586b620027edd5b45ff4c72a86cc7beHemant Guptaimport android.bluetooth.BluetoothSocket; 223920adcb7724bb0be6c81e51371219c63e9403eaCasper Bondeimport android.bluetooth.SdpMasRecord; 23192d793d2586b620027edd5b45ff4c72a86cc7beHemant Guptaimport android.os.Handler; 24192d793d2586b620027edd5b45ff4c72a86cc7beHemant Guptaimport android.os.Message; 25192d793d2586b620027edd5b45ff4c72a86cc7beHemant Guptaimport android.util.Log; 26192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 27192d793d2586b620027edd5b45ff4c72a86cc7beHemant Guptaimport android.bluetooth.client.map.BluetoothMasRequestSetMessageStatus.StatusIndicator; 28192d793d2586b620027edd5b45ff4c72a86cc7beHemant Guptaimport android.bluetooth.client.map.utils.ObexTime; 29192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 30192d793d2586b620027edd5b45ff4c72a86cc7beHemant Guptaimport java.io.IOException; 31192d793d2586b620027edd5b45ff4c72a86cc7beHemant Guptaimport java.lang.ref.WeakReference; 32192d793d2586b620027edd5b45ff4c72a86cc7beHemant Guptaimport java.math.BigInteger; 33192d793d2586b620027edd5b45ff4c72a86cc7beHemant Guptaimport java.util.ArrayDeque; 34192d793d2586b620027edd5b45ff4c72a86cc7beHemant Guptaimport java.util.ArrayList; 35192d793d2586b620027edd5b45ff4c72a86cc7beHemant Guptaimport java.util.Date; 36192d793d2586b620027edd5b45ff4c72a86cc7beHemant Guptaimport java.util.Iterator; 37192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 38192d793d2586b620027edd5b45ff4c72a86cc7beHemant Guptaimport javax.obex.ObexTransport; 39192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 40192d793d2586b620027edd5b45ff4c72a86cc7beHemant Guptapublic class BluetoothMasClient { 41192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 42192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta private final static String TAG = "BluetoothMasClient"; 43192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 44192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta private static final int SOCKET_CONNECTED = 10; 45192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 46192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta private static final int SOCKET_ERROR = 11; 47192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 48192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta /** 49192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * Callback message sent when connection state changes 50192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * <p> 51192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * <code>arg1</code> is set to {@link #STATUS_OK} when connection is 52192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * established successfully and {@link #STATUS_FAILED} when connection 53192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * either failed or was disconnected (depends on request from application) 54192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * 55192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * @see #connect() 56192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * @see #disconnect() 57192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta */ 58192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta public static final int EVENT_CONNECT = 1; 59192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 60192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta /** 61192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * Callback message sent when MSE accepted update inbox request 62192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * 63192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * @see #updateInbox() 64192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta */ 65192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta public static final int EVENT_UPDATE_INBOX = 2; 66192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 67192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta /** 68192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * Callback message sent when path is changed 69192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * <p> 70192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * <code>obj</code> is set to path currently set on MSE 71192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * 72192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * @see #setFolderRoot() 73192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * @see #setFolderUp() 74192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * @see #setFolderDown(String) 75192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta */ 76192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta public static final int EVENT_SET_PATH = 3; 77192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 78192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta /** 79192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * Callback message sent when folder listing is received 80192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * <p> 81192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * <code>obj</code> contains ArrayList of sub-folder names 82192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * 83192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * @see #getFolderListing() 84192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * @see #getFolderListing(int, int) 85192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta */ 86192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta public static final int EVENT_GET_FOLDER_LISTING = 4; 87192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 88192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta /** 89192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * Callback message sent when folder listing size is received 90192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * <p> 91192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * <code>obj</code> contains number of items in folder listing 92192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * 93192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * @see #getFolderListingSize() 94192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta */ 95192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta public static final int EVENT_GET_FOLDER_LISTING_SIZE = 5; 96192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 97192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta /** 98192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * Callback message sent when messages listing is received 99192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * <p> 100192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * <code>obj</code> contains ArrayList of {@link BluetoothMapBmessage} 101192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * 102192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * @see #getMessagesListing(String, int) 103192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * @see #getMessagesListing(String, int, MessagesFilter, int) 104192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * @see #getMessagesListing(String, int, MessagesFilter, int, int, int) 105192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta */ 106192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta public static final int EVENT_GET_MESSAGES_LISTING = 6; 107192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 108192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta /** 109192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * Callback message sent when message is received 110192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * <p> 111192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * <code>obj</code> contains {@link BluetoothMapBmessage} 112192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * 113192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * @see #getMessage(String, CharsetType, boolean) 114192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta */ 115192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta public static final int EVENT_GET_MESSAGE = 7; 116192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 117192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta /** 118192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * Callback message sent when message status is changed 119192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * 120192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * @see #setMessageDeletedStatus(String, boolean) 121192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * @see #setMessageReadStatus(String, boolean) 122192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta */ 123192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta public static final int EVENT_SET_MESSAGE_STATUS = 8; 124192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 125192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta /** 126192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * Callback message sent when message is pushed to MSE 127192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * <p> 128192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * <code>obj</code> contains handle of message as allocated by MSE 129192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * 130192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * @see #pushMessage(String, BluetoothMapBmessage, CharsetType) 131192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * @see #pushMessage(String, BluetoothMapBmessage, CharsetType, boolean, 132192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * boolean) 133192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta */ 134192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta public static final int EVENT_PUSH_MESSAGE = 9; 135192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 136192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta /** 137192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * Callback message sent when notification status is changed 138192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * <p> 139192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * <code>obj</code> contains <code>1</code> if notifications are enabled and 140192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * <code>0</code> otherwise 141192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * 142192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * @see #setNotificationRegistration(boolean) 143192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta */ 144192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta public static final int EVENT_SET_NOTIFICATION_REGISTRATION = 10; 145192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 146192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta /** 147192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * Callback message sent when event report is received from MSE to MNS 148192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * <p> 149192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * <code>obj</code> contains {@link BluetoothMapEventReport} 150192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * 151192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * @see #setNotificationRegistration(boolean) 152192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta */ 153192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta public static final int EVENT_EVENT_REPORT = 11; 154192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 155192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta /** 156192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * Callback message sent when messages listing size is received 157192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * <p> 158192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * <code>obj</code> contains number of items in messages listing 159192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * 160192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * @see #getMessagesListingSize() 161192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta */ 162192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta public static final int EVENT_GET_MESSAGES_LISTING_SIZE = 12; 163192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 164192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta /** 165192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * Status for callback message when request is successful 166192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta */ 167192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta public static final int STATUS_OK = 0; 168192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 169192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta /** 170192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * Status for callback message when request is not successful 171192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta */ 172192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta public static final int STATUS_FAILED = 1; 173192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 174192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta /** 175192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * Constant corresponding to <code>ParameterMask</code> application 176192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * parameter value in MAP specification 177192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta */ 178192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta public static final int PARAMETER_DEFAULT = 0x00000000; 179192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 180192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta /** 181192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * Constant corresponding to <code>ParameterMask</code> application 182192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * parameter value in MAP specification 183192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta */ 184192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta public static final int PARAMETER_SUBJECT = 0x00000001; 185192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 186192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta /** 187192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * Constant corresponding to <code>ParameterMask</code> application 188192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * parameter value in MAP specification 189192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta */ 190192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta public static final int PARAMETER_DATETIME = 0x00000002; 191192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 192192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta /** 193192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * Constant corresponding to <code>ParameterMask</code> application 194192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * parameter value in MAP specification 195192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta */ 196192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta public static final int PARAMETER_SENDER_NAME = 0x00000004; 197192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 198192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta /** 199192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * Constant corresponding to <code>ParameterMask</code> application 200192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * parameter value in MAP specification 201192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta */ 202192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta public static final int PARAMETER_SENDER_ADDRESSING = 0x00000008; 203192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 204192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta /** 205192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * Constant corresponding to <code>ParameterMask</code> application 206192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * parameter value in MAP specification 207192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta */ 208192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta public static final int PARAMETER_RECIPIENT_NAME = 0x00000010; 209192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 210192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta /** 211192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * Constant corresponding to <code>ParameterMask</code> application 212192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * parameter value in MAP specification 213192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta */ 214192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta public static final int PARAMETER_RECIPIENT_ADDRESSING = 0x00000020; 215192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 216192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta /** 217192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * Constant corresponding to <code>ParameterMask</code> application 218192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * parameter value in MAP specification 219192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta */ 220192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta public static final int PARAMETER_TYPE = 0x00000040; 221192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 222192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta /** 223192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * Constant corresponding to <code>ParameterMask</code> application 224192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * parameter value in MAP specification 225192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta */ 226192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta public static final int PARAMETER_SIZE = 0x00000080; 227192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 228192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta /** 229192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * Constant corresponding to <code>ParameterMask</code> application 230192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * parameter value in MAP specification 231192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta */ 232192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta public static final int PARAMETER_RECEPTION_STATUS = 0x00000100; 233192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 234192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta /** 235192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * Constant corresponding to <code>ParameterMask</code> application 236192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * parameter value in MAP specification 237192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta */ 238192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta public static final int PARAMETER_TEXT = 0x00000200; 239192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 240192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta /** 241192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * Constant corresponding to <code>ParameterMask</code> application 242192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * parameter value in MAP specification 243192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta */ 244192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta public static final int PARAMETER_ATTACHMENT_SIZE = 0x00000400; 245192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 246192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta /** 247192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * Constant corresponding to <code>ParameterMask</code> application 248192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * parameter value in MAP specification 249192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta */ 250192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta public static final int PARAMETER_PRIORITY = 0x00000800; 251192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 252192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta /** 253192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * Constant corresponding to <code>ParameterMask</code> application 254192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * parameter value in MAP specification 255192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta */ 256192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta public static final int PARAMETER_READ = 0x00001000; 257192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 258192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta /** 259192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * Constant corresponding to <code>ParameterMask</code> application 260192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * parameter value in MAP specification 261192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta */ 262192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta public static final int PARAMETER_SENT = 0x00002000; 263192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 264192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta /** 265192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * Constant corresponding to <code>ParameterMask</code> application 266192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * parameter value in MAP specification 267192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta */ 268192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta public static final int PARAMETER_PROTECTED = 0x00004000; 269192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 270192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta /** 271192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * Constant corresponding to <code>ParameterMask</code> application 272192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * parameter value in MAP specification 273192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta */ 274192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta public static final int PARAMETER_REPLYTO_ADDRESSING = 0x00008000; 275192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 276192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta public enum ConnectionState { 277192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta DISCONNECTED, CONNECTING, CONNECTED, DISCONNECTING; 278192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 279192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 280192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta public enum CharsetType { 281192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta NATIVE, UTF_8; 282192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 283192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 284192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta /** device associated with client */ 285192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta private final BluetoothDevice mDevice; 286192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 287192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta /** MAS instance associated with client */ 2883920adcb7724bb0be6c81e51371219c63e9403eaCasper Bonde private final SdpMasRecord mMas; 289192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 290192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta /** callback handler to application */ 291192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta private final Handler mCallback; 292192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 293192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta private ConnectionState mConnectionState = ConnectionState.DISCONNECTED; 294192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 295192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta private boolean mNotificationEnabled = false; 296192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 297192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta private SocketConnectThread mConnectThread = null; 298192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 299192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta private ObexTransport mObexTransport = null; 300192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 301192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta private BluetoothMasObexClientSession mObexSession = null; 302192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 303192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta private SessionHandler mSessionHandler = null; 304192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 305192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta private BluetoothMnsService mMnsService = null; 306192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 307192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta private ArrayDeque<String> mPath = null; 308192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 309192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta private static class SessionHandler extends Handler { 310192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 311192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta private final WeakReference<BluetoothMasClient> mClient; 312192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 313192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta public SessionHandler(BluetoothMasClient client) { 314192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta super(); 315192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 316192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta mClient = new WeakReference<BluetoothMasClient>(client); 317192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 318192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 319192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta @Override 320192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta public void handleMessage(Message msg) { 321192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 322192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta BluetoothMasClient client = mClient.get(); 323192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta if (client == null) { 324192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta return; 325192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 326192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta Log.v(TAG, "handleMessage "+msg.what); 327192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 328192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta switch (msg.what) { 329192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta case SOCKET_ERROR: 330192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta client.mConnectThread = null; 331192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta client.sendToClient(EVENT_CONNECT, false); 332192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta break; 333192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 334192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta case SOCKET_CONNECTED: 335192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta client.mConnectThread = null; 336192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 337192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta client.mObexTransport = (ObexTransport) msg.obj; 338192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 339192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta client.mObexSession = new BluetoothMasObexClientSession(client.mObexTransport, 340192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta client.mSessionHandler); 341192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta client.mObexSession.start(); 342192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta break; 343192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 344192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta case BluetoothMasObexClientSession.MSG_OBEX_CONNECTED: 345192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta client.mPath.clear(); // we're in root after connected 346192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta client.mConnectionState = ConnectionState.CONNECTED; 347192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta client.sendToClient(EVENT_CONNECT, true); 348192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta break; 349192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 350192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta case BluetoothMasObexClientSession.MSG_OBEX_DISCONNECTED: 351192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta client.mConnectionState = ConnectionState.DISCONNECTED; 352192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta client.mNotificationEnabled = false; 353192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta client.mObexSession = null; 354192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta client.sendToClient(EVENT_CONNECT, false); 355192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta break; 356192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 357192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta case BluetoothMasObexClientSession.MSG_REQUEST_COMPLETED: 358192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta BluetoothMasRequest request = (BluetoothMasRequest) msg.obj; 359192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta int status = request.isSuccess() ? STATUS_OK : STATUS_FAILED; 360192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 361192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta Log.v(TAG, "MSG_REQUEST_COMPLETED (" + status + ") for " 362192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta + request.getClass().getName()); 363192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 364192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta if (request instanceof BluetoothMasRequestUpdateInbox) { 365192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta client.sendToClient(EVENT_UPDATE_INBOX, request.isSuccess()); 366192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 367192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } else if (request instanceof BluetoothMasRequestSetPath) { 368192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta if (request.isSuccess()) { 369192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta BluetoothMasRequestSetPath req = (BluetoothMasRequestSetPath) request; 370192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta switch (req.mDir) { 371192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta case UP: 372192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta if (client.mPath.size() > 0) { 373192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta client.mPath.removeLast(); 374192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 375192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta break; 376192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 377192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta case ROOT: 378192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta client.mPath.clear(); 379192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta break; 380192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 381192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta case DOWN: 382192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta client.mPath.addLast(req.mName); 383192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta break; 384192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 385192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 386192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 387192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta client.sendToClient(EVENT_SET_PATH, request.isSuccess(), 388192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta client.getCurrentPath()); 389192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 390192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } else if (request instanceof BluetoothMasRequestGetFolderListing) { 391192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta BluetoothMasRequestGetFolderListing req = (BluetoothMasRequestGetFolderListing) request; 392192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta ArrayList<String> folders = req.getList(); 393192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 394192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta client.sendToClient(EVENT_GET_FOLDER_LISTING, request.isSuccess(), folders); 395192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 396192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } else if (request instanceof BluetoothMasRequestGetFolderListingSize) { 397192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta int size = ((BluetoothMasRequestGetFolderListingSize) request).getSize(); 398192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 399192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta client.sendToClient(EVENT_GET_FOLDER_LISTING_SIZE, request.isSuccess(), 400192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta size); 401192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 402192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } else if (request instanceof BluetoothMasRequestGetMessagesListing) { 403192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta BluetoothMasRequestGetMessagesListing req = (BluetoothMasRequestGetMessagesListing) request; 404192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta ArrayList<BluetoothMapMessage> msgs = req.getList(); 405192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 406192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta client.sendToClient(EVENT_GET_MESSAGES_LISTING, request.isSuccess(), msgs); 407192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 408192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } else if (request instanceof BluetoothMasRequestGetMessage) { 409192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta BluetoothMasRequestGetMessage req = (BluetoothMasRequestGetMessage) request; 410192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta BluetoothMapBmessage bmsg = req.getMessage(); 411192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 412192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta client.sendToClient(EVENT_GET_MESSAGE, request.isSuccess(), bmsg); 413192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 414192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } else if (request instanceof BluetoothMasRequestSetMessageStatus) { 415192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta client.sendToClient(EVENT_SET_MESSAGE_STATUS, request.isSuccess()); 416192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 417192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } else if (request instanceof BluetoothMasRequestPushMessage) { 418192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta BluetoothMasRequestPushMessage req = (BluetoothMasRequestPushMessage) request; 419192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta String handle = req.getMsgHandle(); 420192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 421192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta client.sendToClient(EVENT_PUSH_MESSAGE, request.isSuccess(), handle); 422192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 423192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } else if (request instanceof BluetoothMasRequestSetNotificationRegistration) { 424192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta BluetoothMasRequestSetNotificationRegistration req = (BluetoothMasRequestSetNotificationRegistration) request; 425192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 426192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta client.mNotificationEnabled = req.isSuccess() ? req.getStatus() 427192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta : client.mNotificationEnabled; 428192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 429192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta client.sendToClient(EVENT_SET_NOTIFICATION_REGISTRATION, 430192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta request.isSuccess(), 431192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta client.mNotificationEnabled ? 1 : 0); 432192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } else if (request instanceof BluetoothMasRequestGetMessagesListingSize) { 433192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta int size = ((BluetoothMasRequestGetMessagesListingSize) request).getSize(); 434192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta client.sendToClient(EVENT_GET_MESSAGES_LISTING_SIZE, request.isSuccess(), 435192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta size); 436192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 437192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta break; 438192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 439192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta case BluetoothMnsService.EVENT_REPORT: 440192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta /* pass event report directly to app */ 441192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta client.sendToClient(EVENT_EVENT_REPORT, true, msg.obj); 442192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta break; 443192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 444192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 445192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 446192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 447192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta private void sendToClient(int event, boolean success) { 448192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta sendToClient(event, success, null); 449192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 450192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 451192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta private void sendToClient(int event, boolean success, int param) { 452192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta sendToClient(event, success, Integer.valueOf(param)); 453192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 454192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 455192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta private void sendToClient(int event, boolean success, Object param) { 4564231be1e03b7c5e563fea1fa7c56abfe2a1e61ddHemant Gupta // Send event, status and notification state for both sucess and failure case. 4574231be1e03b7c5e563fea1fa7c56abfe2a1e61ddHemant Gupta mCallback.obtainMessage(event, success ? STATUS_OK : STATUS_FAILED, mMas.getMasInstanceId(), 4584231be1e03b7c5e563fea1fa7c56abfe2a1e61ddHemant Gupta param).sendToTarget(); 459192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 460192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 461192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta private class SocketConnectThread extends Thread { 462192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta private BluetoothSocket socket = null; 463192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 464192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta public SocketConnectThread() { 465192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta super("SocketConnectThread"); 466192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 467192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 468192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta @Override 469192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta public void run() { 470192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta try { 4713920adcb7724bb0be6c81e51371219c63e9403eaCasper Bonde socket = mDevice.createRfcommSocket(mMas.getRfcommCannelNumber()); 472192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta socket.connect(); 473192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 474192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta BluetoothMapRfcommTransport transport; 475192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta transport = new BluetoothMapRfcommTransport(socket); 476192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 477192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta mSessionHandler.obtainMessage(SOCKET_CONNECTED, transport).sendToTarget(); 478192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } catch (IOException e) { 479192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta Log.e(TAG, "Error when creating/connecting socket", e); 480192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 481192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta closeSocket(); 482192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta mSessionHandler.obtainMessage(SOCKET_ERROR).sendToTarget(); 483192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 484192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 485192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 486192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta @Override 487192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta public void interrupt() { 488192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta closeSocket(); 489192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 490192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 491192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta private void closeSocket() { 492192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta try { 493192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta if (socket != null) { 494192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta socket.close(); 495192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 496192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } catch (IOException e) { 497192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta Log.e(TAG, "Error when closing socket", e); 498192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 499192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 500192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 501192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 502192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta /** 503192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * Object representation of filters to be applied on message listing 504192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * 505192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * @see #getMessagesListing(String, int, MessagesFilter, int) 506192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * @see #getMessagesListing(String, int, MessagesFilter, int, int, int) 507192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta */ 508192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta public static final class MessagesFilter { 509192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 510192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta public final static byte MESSAGE_TYPE_ALL = 0x00; 511192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta public final static byte MESSAGE_TYPE_SMS_GSM = 0x01; 512192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta public final static byte MESSAGE_TYPE_SMS_CDMA = 0x02; 513192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta public final static byte MESSAGE_TYPE_EMAIL = 0x04; 514192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta public final static byte MESSAGE_TYPE_MMS = 0x08; 515192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 516192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta public final static byte READ_STATUS_ANY = 0x00; 517192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta public final static byte READ_STATUS_UNREAD = 0x01; 518192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta public final static byte READ_STATUS_READ = 0x02; 519192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 520192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta public final static byte PRIORITY_ANY = 0x00; 521192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta public final static byte PRIORITY_HIGH = 0x01; 522192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta public final static byte PRIORITY_NON_HIGH = 0x02; 523192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 524192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta byte messageType = MESSAGE_TYPE_ALL; 525192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 526192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta String periodBegin = null; 527192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 528192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta String periodEnd = null; 529192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 530192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta byte readStatus = READ_STATUS_ANY; 531192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 532192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta String recipient = null; 533192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 534192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta String originator = null; 535192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 536192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta byte priority = PRIORITY_ANY; 537192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 538192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta public MessagesFilter() { 539192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 540192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 541192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta public void setMessageType(byte filter) { 542192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta messageType = filter; 543192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 544192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 545192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta public void setPeriod(Date filterBegin, Date filterEnd) { 5464231be1e03b7c5e563fea1fa7c56abfe2a1e61ddHemant Gupta //Handle possible NPE for obexTime constructor utility 5474231be1e03b7c5e563fea1fa7c56abfe2a1e61ddHemant Gupta if(filterBegin != null ) 5484231be1e03b7c5e563fea1fa7c56abfe2a1e61ddHemant Gupta periodBegin = (new ObexTime(filterBegin)).toString(); 5494231be1e03b7c5e563fea1fa7c56abfe2a1e61ddHemant Gupta if(filterEnd != null) 5504231be1e03b7c5e563fea1fa7c56abfe2a1e61ddHemant Gupta periodEnd = (new ObexTime(filterEnd)).toString(); 551192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 552192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 553192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta public void setReadStatus(byte readfilter) { 554192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta readStatus = readfilter; 555192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 556192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 557192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta public void setRecipient(String filter) { 558192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta if ("".equals(filter)) { 559192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta recipient = null; 560192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } else { 561192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta recipient = filter; 562192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 563192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 564192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 565192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta public void setOriginator(String filter) { 566192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta if ("".equals(filter)) { 567192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta originator = null; 568192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } else { 569192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta originator = filter; 570192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 571192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 572192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 573192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta public void setPriority(byte filter) { 574192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta priority = filter; 575192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 576192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 577192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 578192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta /** 579192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * Constructs client object to communicate with single MAS instance on MSE 580192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * 581192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * @param device {@link BluetoothDevice} corresponding to remote device 582192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * acting as MSE 583192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * @param mas {@link BluetoothMasInstance} object describing MAS instance on 584192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * remote device 585192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * @param callback {@link Handler} object to which callback messages will be 586192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * sent Each message will have <code>arg1</code> set to either 587192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * {@link #STATUS_OK} or {@link #STATUS_FAILED} and 588192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * <code>arg2</code> to MAS instance ID. <code>obj</code> in 589192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * message is event specific. 590192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta */ 5913920adcb7724bb0be6c81e51371219c63e9403eaCasper Bonde public BluetoothMasClient(BluetoothDevice device, SdpMasRecord mas, 592192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta Handler callback) { 593192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta mDevice = device; 594192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta mMas = mas; 595192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta mCallback = callback; 596192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 597192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta mPath = new ArrayDeque<String>(); 598192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 599192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 600192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta /** 601192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * Retrieves MAS instance data associated with client 602192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * 603192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * @return instance data object 604192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta */ 6053920adcb7724bb0be6c81e51371219c63e9403eaCasper Bonde public SdpMasRecord getInstanceData() { 606192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta return mMas; 607192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 608192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 609192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta /** 610192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * Connects to MAS instance 611192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * <p> 612192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * Upon completion callback handler will receive {@link #EVENT_CONNECT} 613192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta */ 614192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta public void connect() { 615192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta if (mSessionHandler == null) { 616192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta mSessionHandler = new SessionHandler(this); 617192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 618192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 619192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta if (mConnectThread == null && mObexSession == null) { 620192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta mConnectionState = ConnectionState.CONNECTING; 621192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 622192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta mConnectThread = new SocketConnectThread(); 623192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta mConnectThread.start(); 624192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 625192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 626192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 627192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta /** 628192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * Disconnects from MAS instance 629192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * <p> 630192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * Upon completion callback handler will receive {@link #EVENT_CONNECT} 631192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta */ 632192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta public void disconnect() { 633192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta if (mConnectThread == null && mObexSession == null) { 634192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta return; 635192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 636192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 637192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta mConnectionState = ConnectionState.DISCONNECTING; 638192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 639192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta if (mConnectThread != null) { 640192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta mConnectThread.interrupt(); 641192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 642192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 643192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta if (mObexSession != null) { 644192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta mObexSession.stop(); 645192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 646192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 647192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 648192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta @Override 649192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta public void finalize() { 650192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta disconnect(); 651192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 652192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 653192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta /** 654192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * Gets current connection state 655192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * 656192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * @return current connection state 657192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * @see ConnectionState 658192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta */ 659192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta public ConnectionState getState() { 660192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta return mConnectionState; 661192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 662192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 663192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta private boolean enableNotifications() { 664192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta Log.v(TAG, "enableNotifications()"); 665192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 666192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta if (mMnsService == null) { 667192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta mMnsService = new BluetoothMnsService(); 668192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 669192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 6703920adcb7724bb0be6c81e51371219c63e9403eaCasper Bonde mMnsService.registerCallback(mMas.getMasInstanceId(), mSessionHandler); 671192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 672192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta BluetoothMasRequest request = new BluetoothMasRequestSetNotificationRegistration(true); 673192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta return mObexSession.makeRequest(request); 674192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 675192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 676192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta private boolean disableNotifications() { 677192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta Log.v(TAG, "enableNotifications()"); 678192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 679192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta if (mMnsService != null) { 6803920adcb7724bb0be6c81e51371219c63e9403eaCasper Bonde mMnsService.unregisterCallback(mMas.getMasInstanceId()); 681192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 682192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 683192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta mMnsService = null; 684192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 685192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta BluetoothMasRequest request = new BluetoothMasRequestSetNotificationRegistration(false); 686192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta return mObexSession.makeRequest(request); 687192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 688192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 689192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta /** 690192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * Sets state of notifications for MAS instance 691192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * <p> 692192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * Once notifications are enabled, callback handler will receive 693192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * {@link #EVENT_EVENT_REPORT} when new notification is received 694192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * <p> 695192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * Upon completion callback handler will receive 696192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * {@link #EVENT_SET_NOTIFICATION_REGISTRATION} 697192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * 698192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * @param status <code>true</code> if notifications shall be enabled, 699192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * <code>false</code> otherwise 700192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * @return <code>true</code> if request has been sent, <code>false</code> 701192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * otherwise 702192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta */ 703192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta public boolean setNotificationRegistration(boolean status) { 704192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta if (mObexSession == null) { 705192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta return false; 706192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 707192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 708192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta if (status) { 709192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta return enableNotifications(); 710192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } else { 711192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta return disableNotifications(); 712192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 713192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 714192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 715192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta /** 716192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * Gets current state of notifications for MAS instance 717192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * 718192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * @return <code>true</code> if notifications are enabled, 719192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * <code>false</code> otherwise 720192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta */ 721192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta public boolean getNotificationRegistration() { 722192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta return mNotificationEnabled; 723192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 724192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 725192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta /** 726192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * Goes back to root of folder hierarchy 727192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * <p> 728192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * Upon completion callback handler will receive {@link #EVENT_SET_PATH} 729192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * 730192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * @return <code>true</code> if request has been sent, <code>false</code> 731192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * otherwise 732192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta */ 733192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta public boolean setFolderRoot() { 734192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta if (mObexSession == null) { 735192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta return false; 736192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 737192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 738192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta BluetoothMasRequest request = new BluetoothMasRequestSetPath(true); 739192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta return mObexSession.makeRequest(request); 740192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 741192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 742192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta /** 743192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * Goes back to parent folder in folder hierarchy 744192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * <p> 745192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * Upon completion callback handler will receive {@link #EVENT_SET_PATH} 746192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * 747192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * @return <code>true</code> if request has been sent, <code>false</code> 748192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * otherwise 749192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta */ 750192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta public boolean setFolderUp() { 751192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta if (mObexSession == null) { 752192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta return false; 753192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 754192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 755192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta BluetoothMasRequest request = new BluetoothMasRequestSetPath(false); 756192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta return mObexSession.makeRequest(request); 757192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 758192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 759192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta /** 760192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * Goes down to specified sub-folder in folder hierarchy 761192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * <p> 762192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * Upon completion callback handler will receive {@link #EVENT_SET_PATH} 763192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * 764192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * @param name name of sub-folder 765192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * @return <code>true</code> if request has been sent, <code>false</code> 766192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * otherwise 767192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta */ 768192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta public boolean setFolderDown(String name) { 769192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta if (mObexSession == null) { 770192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta return false; 771192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 772192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 773192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta if (name == null || name.isEmpty() || name.contains("/")) { 774192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta return false; 775192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 776192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 777192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta BluetoothMasRequest request = new BluetoothMasRequestSetPath(name); 778192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta return mObexSession.makeRequest(request); 779192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 780192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 781192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta /** 782192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * Gets current path in folder hierarchy 783192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * 784192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * @return current path 785192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta */ 786192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta public String getCurrentPath() { 787192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta if (mPath.size() == 0) { 788192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta return ""; 789192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 790192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 791192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta Iterator<String> iter = mPath.iterator(); 792192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 793192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta StringBuilder sb = new StringBuilder(iter.next()); 794192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 795192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta while (iter.hasNext()) { 796192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta sb.append("/").append(iter.next()); 797192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 798192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 799192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta return sb.toString(); 800192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 801192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 802192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta /** 803192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * Gets list of sub-folders in current folder 804192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * <p> 805192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * Upon completion callback handler will receive 806192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * {@link #EVENT_GET_FOLDER_LISTING} 807192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * 808192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * @return <code>true</code> if request has been sent, <code>false</code> 809192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * otherwise 810192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta */ 811192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta public boolean getFolderListing() { 812192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta return getFolderListing((short) 0, (short) 0); 813192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 814192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 815192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta /** 816192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * Gets list of sub-folders in current folder 817192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * <p> 818192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * Upon completion callback handler will receive 819192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * {@link #EVENT_GET_FOLDER_LISTING} 820192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * 821192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * @param maxListCount maximum number of items returned or <code>0</code> 822192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * for default value 823192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * @param listStartOffset index of first item returned or <code>0</code> for 824192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * default value 825192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * @return <code>true</code> if request has been sent, <code>false</code> 826192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * otherwise 827192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * @throws IllegalArgumentException if either maxListCount or 828192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * listStartOffset are outside allowed range [0..65535] 829192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta */ 830192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta public boolean getFolderListing(int maxListCount, int listStartOffset) { 831192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta if (mObexSession == null) { 832192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta return false; 833192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 834192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 835192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta BluetoothMasRequest request = new BluetoothMasRequestGetFolderListing(maxListCount, 836192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta listStartOffset); 837192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta return mObexSession.makeRequest(request); 838192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 839192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 840192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta /** 841192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * Gets number of sub-folders in current folder 842192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * <p> 843192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * Upon completion callback handler will receive 844192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * {@link #EVENT_GET_FOLDER_LISTING_SIZE} 845192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * 846192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * @return <code>true</code> if request has been sent, <code>false</code> 847192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * otherwise 848192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta */ 849192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta public boolean getFolderListingSize() { 850192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta if (mObexSession == null) { 851192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta return false; 852192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 853192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 854192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta BluetoothMasRequest request = new BluetoothMasRequestGetFolderListingSize(); 855192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta return mObexSession.makeRequest(request); 856192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 857192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 858192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta /** 859192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * Gets list of messages in specified sub-folder 860192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * <p> 861192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * Upon completion callback handler will receive 862192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * {@link #EVENT_GET_MESSAGES_LISTING} 863192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * 864192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * @param folder name of sub-folder or <code>null</code> for current folder 865192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * @param parameters bit-mask specifying requested parameters in listing or 866192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * <code>0</code> for default value 867192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * @return <code>true</code> if request has been sent, <code>false</code> 868192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * otherwise 869192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta */ 870192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta public boolean getMessagesListing(String folder, int parameters) { 871192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta return getMessagesListing(folder, parameters, null, (byte) 0, 0, 0); 872192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 873192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 874192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta /** 875192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * Gets list of messages in specified sub-folder 876192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * <p> 877192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * Upon completion callback handler will receive 878192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * {@link #EVENT_GET_MESSAGES_LISTING} 879192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * 880192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * @param folder name of sub-folder or <code>null</code> for current folder 881192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * @param parameters corresponds to <code>ParameterMask</code> application 882192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * parameter in MAP specification 883192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * @param filter {@link MessagesFilter} object describing filters to be 884192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * applied on listing by MSE 885192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * @param subjectLength maximum length of message subject in returned 886192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * listing or <code>0</code> for default value 887192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * @return <code>true</code> if request has been sent, <code>false</code> 888192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * otherwise 889192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * @throws IllegalArgumentException if subjectLength is outside allowed 890192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * range [0..255] 891192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta */ 892192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta public boolean getMessagesListing(String folder, int parameters, MessagesFilter filter, 893192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta int subjectLength) { 894192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 895192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta return getMessagesListing(folder, parameters, filter, subjectLength, 0, 0); 896192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 897192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 898192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta /** 899192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * Gets list of messages in specified sub-folder 900192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * <p> 901192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * Upon completion callback handler will receive 902192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * {@link #EVENT_GET_MESSAGES_LISTING} 903192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * 904192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * @param folder name of sub-folder or <code>null</code> for current folder 905192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * @param parameters corresponds to <code>ParameterMask</code> application 906192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * parameter in MAP specification 907192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * @param filter {@link MessagesFilter} object describing filters to be 908192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * applied on listing by MSE 909192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * @param subjectLength maximum length of message subject in returned 910192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * listing or <code>0</code> for default value 911192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * @param maxListCount maximum number of items returned or <code>0</code> 912192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * for default value 913192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * @param listStartOffset index of first item returned or <code>0</code> for 914192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * default value 915192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * @return <code>true</code> if request has been sent, <code>false</code> 916192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * otherwise 917192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * @throws IllegalArgumentException if subjectLength is outside allowed 918192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * range [0..255] or either maxListCount or listStartOffset are 919192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * outside allowed range [0..65535] 920192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta */ 921192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta public boolean getMessagesListing(String folder, int parameters, MessagesFilter filter, 922192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta int subjectLength, int maxListCount, int listStartOffset) { 923192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 924192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta if (mObexSession == null) { 925192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta return false; 926192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 927192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 928192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta BluetoothMasRequest request = new BluetoothMasRequestGetMessagesListing(folder, 929192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta parameters, filter, subjectLength, maxListCount, listStartOffset); 930192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta return mObexSession.makeRequest(request); 931192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 932192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 933192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta /** 934192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * Gets number of messages in current folder 935192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * <p> 936192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * Upon completion callback handler will receive 937192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * {@link #EVENT_GET_MESSAGES_LISTING_SIZE} 938192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * 939192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * @return <code>true</code> if request has been sent, <code>false</code> 940192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * otherwise 941192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta */ 942192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta public boolean getMessagesListingSize() { 943192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta if (mObexSession == null) { 944192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta return false; 945192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 946192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 947192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta BluetoothMasRequest request = new BluetoothMasRequestGetMessagesListingSize(); 948192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta return mObexSession.makeRequest(request); 949192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 950192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 951192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta /** 952192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * Retrieves message from MSE 953192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * <p> 954192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * Upon completion callback handler will receive {@link #EVENT_GET_MESSAGE} 955192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * 956192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * @param handle handle of message to retrieve 957192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * @param charset {@link CharsetType} object corresponding to 958192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * <code>Charset</code> application parameter in MAP 959192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * specification 960192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * @param attachment corresponds to <code>Attachment</code> application 961192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * parameter in MAP specification 962192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * @return <code>true</code> if request has been sent, <code>false</code> 963192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * otherwise 964192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta */ 965d87ff784eb2dfac818df247a153be548b13dfb02Sanket Agarwal public boolean getMessage(String handle, boolean attachment) { 966192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta if (mObexSession == null) { 967192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta return false; 968192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 969192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 970192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta try { 971192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta /* just to validate */ 972192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta new BigInteger(handle, 16); 973192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } catch (NumberFormatException e) { 974192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta return false; 975192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 976192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 977d87ff784eb2dfac818df247a153be548b13dfb02Sanket Agarwal // Since we support only text messaging via Bluetooth, it is OK to restrict the requests to 978d87ff784eb2dfac818df247a153be548b13dfb02Sanket Agarwal // force conversion to UTF-8. 979d87ff784eb2dfac818df247a153be548b13dfb02Sanket Agarwal BluetoothMasRequest request = 980d87ff784eb2dfac818df247a153be548b13dfb02Sanket Agarwal new BluetoothMasRequestGetMessage(handle, CharsetType.UTF_8, attachment); 981192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta return mObexSession.makeRequest(request); 982192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 983192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 984192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta /** 985192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * Sets read status of message on MSE 986192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * <p> 987192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * Upon completion callback handler will receive 988192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * {@link #EVENT_SET_MESSAGE_STATUS} 989192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * 990192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * @param handle handle of message 991192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * @param read <code>true</code> for "read", <code>false</code> for "unread" 992192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * @return <code>true</code> if request has been sent, <code>false</code> 993192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * otherwise 994192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta */ 995192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta public boolean setMessageReadStatus(String handle, boolean read) { 996192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta if (mObexSession == null) { 997192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta return false; 998192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 999192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 1000192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta try { 1001192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta /* just to validate */ 1002192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta new BigInteger(handle, 16); 1003192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } catch (NumberFormatException e) { 1004192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta return false; 1005192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 1006192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 1007192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta BluetoothMasRequest request = new BluetoothMasRequestSetMessageStatus(handle, 1008192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta StatusIndicator.READ, read); 1009192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta return mObexSession.makeRequest(request); 1010192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 1011192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 1012192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta /** 1013192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * Sets deleted status of message on MSE 1014192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * <p> 1015192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * Upon completion callback handler will receive 1016192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * {@link #EVENT_SET_MESSAGE_STATUS} 1017192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * 1018192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * @param handle handle of message 1019192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * @param deleted <code>true</code> for "deleted", <code>false</code> for 1020192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * "undeleted" 1021192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * @return <code>true</code> if request has been sent, <code>false</code> 1022192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * otherwise 1023192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta */ 1024192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta public boolean setMessageDeletedStatus(String handle, boolean deleted) { 1025192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta if (mObexSession == null) { 1026192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta return false; 1027192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 1028192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 1029192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta try { 1030192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta /* just to validate */ 1031192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta new BigInteger(handle, 16); 1032192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } catch (NumberFormatException e) { 1033192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta return false; 1034192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 1035192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 1036192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta BluetoothMasRequest request = new BluetoothMasRequestSetMessageStatus(handle, 1037192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta StatusIndicator.DELETED, deleted); 1038192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta return mObexSession.makeRequest(request); 1039192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 1040192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 1041192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta /** 1042192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * Pushes new message to MSE 1043192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * <p> 1044192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * Upon completion callback handler will receive {@link #EVENT_PUSH_MESSAGE} 1045192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * 1046192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * @param folder name of sub-folder to push to or <code>null</code> for 1047192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * current folder 1048192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * @param charset {@link CharsetType} object corresponding to 1049192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * <code>Charset</code> application parameter in MAP 1050192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * specification 1051192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * @return <code>true</code> if request has been sent, <code>false</code> 1052192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * otherwise 1053192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta */ 1054192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta public boolean pushMessage(String folder, BluetoothMapBmessage bmsg, CharsetType charset) { 1055192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta return pushMessage(folder, bmsg, charset, false, false); 1056192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 1057192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 1058192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta /** 1059192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * Pushes new message to MSE 1060192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * <p> 1061192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * Upon completion callback handler will receive {@link #EVENT_PUSH_MESSAGE} 1062192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * 1063192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * @param folder name of sub-folder to push to or <code>null</code> for 1064192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * current folder 1065192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * @param bmsg {@link BluetoothMapBmessage} object representing message to 1066192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * be pushed 1067192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * @param charset {@link CharsetType} object corresponding to 1068192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * <code>Charset</code> application parameter in MAP 1069192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * specification 1070192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * @param transparent corresponds to <code>Transparent</code> application 1071192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * parameter in MAP specification 1072192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * @param retry corresponds to <code>Transparent</code> application 1073192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * parameter in MAP specification 1074192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * @return <code>true</code> if request has been sent, <code>false</code> 1075192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * otherwise 1076192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta */ 1077192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta public boolean pushMessage(String folder, BluetoothMapBmessage bmsg, CharsetType charset, 1078192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta boolean transparent, boolean retry) { 1079192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta if (mObexSession == null) { 1080192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta return false; 1081192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 1082192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 1083192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta String bmsgString = BluetoothMapBmessageBuilder.createBmessage(bmsg); 1084192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 1085192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta BluetoothMasRequest request = 1086192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta new BluetoothMasRequestPushMessage(folder, bmsgString, charset, transparent, retry); 1087192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta return mObexSession.makeRequest(request); 1088192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 1089192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 1090192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta /** 1091192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * Requests MSE to initiate ubdate of inbox 1092192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * <p> 1093192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * Upon completion callback handler will receive {@link #EVENT_UPDATE_INBOX} 1094192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * 1095192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * @return <code>true</code> if request has been sent, <code>false</code> 1096192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * otherwise 1097192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta */ 1098192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta public boolean updateInbox() { 1099192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta if (mObexSession == null) { 1100192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta return false; 1101192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 1102192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 1103192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta BluetoothMasRequest request = new BluetoothMasRequestUpdateInbox(); 1104192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta return mObexSession.makeRequest(request); 1105192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 1106192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta} 1107