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