1/*
2 * Copyright (C) 2015 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16package com.android.messaging.ui;
17
18import android.app.Activity;
19import android.app.Fragment;
20import android.app.PendingIntent;
21import android.content.ContentValues;
22import android.content.Context;
23import android.content.Intent;
24import android.graphics.Point;
25import android.graphics.Rect;
26import android.net.Uri;
27import android.os.Bundle;
28
29import com.android.messaging.Factory;
30import com.android.messaging.datamodel.data.MessageData;
31import com.android.messaging.util.ConversationIdSet;
32
33/**
34 * A central repository of Intents used to start activities.
35 */
36public abstract class UIIntents {
37    public static UIIntents get() {
38        return Factory.get().getUIIntents();
39    }
40
41    // Intent extras
42    public static final String UI_INTENT_EXTRA_CONVERSATION_ID = "conversation_id";
43
44    // Sending draft data (from share intent / message forwarding) to the ConversationActivity.
45    public static final String UI_INTENT_EXTRA_DRAFT_DATA = "draft_data";
46
47    // The request code for picking image from the Document picker.
48    public static final int REQUEST_PICK_IMAGE_FROM_DOCUMENT_PICKER = 1400;
49
50    // Indicates what type of notification this applies to (See BugleNotifications:
51    // UPDATE_NONE, UPDATE_MESSAGES, UPDATE_ERRORS, UPDATE_ALL)
52    public static final String UI_INTENT_EXTRA_NOTIFICATIONS_UPDATE = "notifications_update";
53
54    // Pass a set of conversation id's.
55    public static final String UI_INTENT_EXTRA_CONVERSATION_ID_SET = "conversation_id_set";
56
57    // Sending class zero message to its activity
58    public static final String UI_INTENT_EXTRA_MESSAGE_VALUES = "message_values";
59
60    // For the widget to go to the ConversationList from the Conversation.
61    public static final String UI_INTENT_EXTRA_GOTO_CONVERSATION_LIST = "goto_conv_list";
62
63    // Indicates whether a conversation is launched with custom transition.
64    public static final String UI_INTENT_EXTRA_WITH_CUSTOM_TRANSITION = "with_custom_transition";
65
66    public static final String ACTION_RESET_NOTIFICATIONS =
67            "com.android.messaging.reset_notifications";
68
69    // Sending VCard uri to VCard detail activity
70    public static final String UI_INTENT_EXTRA_VCARD_URI = "vcard_uri";
71
72    public static final String CMAS_COMPONENT = "com.android.cellbroadcastreceiver";
73
74    // Intent action for local broadcast receiver for conversation self id change.
75    public static final String CONVERSATION_SELF_ID_CHANGE_BROADCAST_ACTION =
76            "conversation_self_id_change";
77
78    // Conversation self id
79    public static final String UI_INTENT_EXTRA_CONVERSATION_SELF_ID = "conversation_self_id";
80
81    // For opening an APN editor on a particular row in the apn database.
82    public static final String UI_INTENT_EXTRA_APN_ROW_ID = "apn_row_id";
83
84    // Subscription id
85    public static final String UI_INTENT_EXTRA_SUB_ID = "sub_id";
86
87    // Per-Subscription setting activity title
88    public static final String UI_INTENT_EXTRA_PER_SUBSCRIPTION_SETTING_TITLE =
89            "per_sub_setting_title";
90
91    // Is application settings launched as the top level settings activity?
92    public static final String UI_INTENT_EXTRA_TOP_LEVEL_SETTINGS = "top_level_settings";
93
94    // Sending attachment uri from widget
95    public static final String UI_INTENT_EXTRA_ATTACHMENT_URI = "attachment_uri";
96
97    // Sending attachment content type from widget
98    public static final String UI_INTENT_EXTRA_ATTACHMENT_TYPE = "attachment_type";
99
100    public static final String ACTION_WIDGET_CONVERSATION =
101            "com.android.messaging.widget_conversation:";
102
103    public static final String UI_INTENT_EXTRA_REQUIRES_MMS = "requires_mms";
104
105    public static final String UI_INTENT_EXTRA_SELF_ID = "self_id";
106
107    // Message position to scroll to.
108    public static final String UI_INTENT_EXTRA_MESSAGE_POSITION = "message_position";
109
110    /**
111     * Launch the permission check activity
112     */
113    public abstract void launchPermissionCheckActivity(final Context context);
114
115    public abstract void launchConversationListActivity(final Context context);
116
117    /**
118     * Launch an activity to show a conversation. This method by default provides no additional
119     * activity options.
120     */
121    public void launchConversationActivity(final Context context,
122            final String conversationId, final MessageData draft) {
123        launchConversationActivity(context, conversationId, draft, null,
124                false /* withCustomTransition */);
125    }
126
127    /**
128     * Launch an activity to show a conversation.
129     */
130    public abstract void launchConversationActivity(final Context context,
131            final String conversationId, final MessageData draft, final Bundle activityOptions,
132            final boolean withCustomTransition);
133
134
135    /**
136     * Launch an activity to show conversation with conversation list in back stack.
137     */
138    public abstract void launchConversationActivityWithParentStack(Context context,
139            String conversationId, String smsBody);
140
141    /**
142     * Launch an activity to show a conversation as a new task.
143     */
144    public abstract void launchConversationActivityNewTask(final Context context,
145            final String conversationId);
146
147    /**
148     * Launch an activity to start a new conversation
149     */
150    public abstract void launchCreateNewConversationActivity(final Context context,
151            final MessageData draft);
152
153    /**
154     * Launch debug activity to set MMS config options.
155     */
156    public abstract void launchDebugMmsConfigActivity(final Context context);
157
158    /**
159     * Launch an activity to change settings.
160     */
161    public abstract void launchSettingsActivity(final Context context);
162
163    /**
164     * Launch an activity to add a contact with a given destination.
165     */
166    public abstract void launchAddContactActivity(final Context context, final String destination);
167
168    /**
169     * Launch an activity to show the document picker to pick an image.
170     * @param fragment the requesting fragment
171     */
172    public abstract void launchDocumentImagePicker(final Fragment fragment);
173
174    /**
175     * Launch an activity to show people & options for a given conversation.
176     */
177    public abstract void launchPeopleAndOptionsActivity(final Activity context,
178            final String conversationId);
179
180    /**
181     * Launch an external activity to handle a phone call
182     * @param phoneNumber the phone number to call
183     * @param clickPosition is the location tapped to start this launch for transition use
184     */
185    public abstract void launchPhoneCallActivity(final Context context, final String phoneNumber,
186                                                 final Point clickPosition);
187
188    /**
189     * Launch an activity to show archived conversations.
190     */
191    public abstract void launchArchivedConversationsActivity(final Context context);
192
193    /**
194     * Launch an activity to show blocked participants.
195     */
196    public abstract void launchBlockedParticipantsActivity(final Context context);
197
198    /**
199     * Launch an activity to show a class zero message
200     */
201    public abstract void launchClassZeroActivity(Context context, ContentValues messageValues);
202
203    /**
204     * Launch an activity to let the user forward a message
205     */
206    public abstract void launchForwardMessageActivity(Context context, MessageData message);
207
208    /**
209     * Launch an activity to show details for a VCard
210     */
211    public abstract void launchVCardDetailActivity(Context context, Uri vcardUri);
212
213    /**
214     * Launch an external activity that handles the intent to add VCard to contacts
215     */
216    public abstract void launchSaveVCardToContactsActivity(Context context, Uri vcardUri);
217
218    /**
219     * Launch an activity to let the user select & unselect the list of attachments to send.
220     */
221    public abstract void launchAttachmentChooserActivity(final Activity activity,
222            final String conversationId, final int requestCode);
223
224    /**
225     * Launch full screen video viewer.
226     */
227    public abstract void launchFullScreenVideoViewer(Context context, Uri videoUri);
228
229    /**
230     * Launch full screen photo viewer.
231     */
232    public abstract void launchFullScreenPhotoViewer(Activity activity, Uri initialPhoto,
233            Rect initialPhotoBounds, Uri photosUri);
234
235    /**
236     * Launch an activity to show general app settings
237     * @param topLevel indicates whether the app settings is launched as the top-level settings
238     *        activity (instead of SettingsActivity which shows a collapsed view of the app
239     *        settings + one settings item per subscription). This is true when there's only one
240     *        active SIM in the system so we can show this activity directly.
241     */
242    public abstract void launchApplicationSettingsActivity(Context context, boolean topLevel);
243
244    /**
245     * Launch an activity to show per-subscription settings
246     */
247    public abstract void launchPerSubscriptionSettingsActivity(Context context, int subId,
248            String settingTitle);
249
250    /**
251     * Get a ACTION_VIEW intent
252     * @param url display the data in the url to users
253     */
254    public abstract Intent getViewUrlIntent(final String url);
255
256    /**
257     * Get an intent to launch the ringtone picker
258     * @param title the title to show in the ringtone picker
259     * @param existingUri the currently set uri
260     * @param defaultUri the default uri if none is currently set
261     * @param toneType type of ringtone to pick, maybe any of RingtoneManager.TYPE_*
262     */
263    public abstract Intent getRingtonePickerIntent(final String title, final Uri existingUri,
264            final Uri defaultUri, final int toneType);
265
266    /**
267     * Get an intent to launch the wireless alert viewer.
268     */
269    public abstract Intent getWirelessAlertsIntent();
270
271    /**
272     * Get an intent to launch the dialog for changing the default SMS App.
273     */
274    public abstract Intent getChangeDefaultSmsAppIntent(final Activity activity);
275
276    /**
277     * Broadcast conversation self id change so it may be reflected in the message compose UI.
278     */
279    public abstract void broadcastConversationSelfIdChange(final Context context,
280            final String conversationId, final String conversationSelfId);
281
282    /**
283     * Get a PendingIntent for starting conversation list from notifications.
284     */
285    public abstract PendingIntent getPendingIntentForConversationListActivity(
286            final Context context);
287
288    /**
289     * Get a PendingIntent for starting conversation list from widget.
290     */
291    public abstract PendingIntent getWidgetPendingIntentForConversationListActivity(
292            final Context context);
293
294    /**
295     * Get a PendingIntent for showing a conversation from notifications.
296     */
297    public abstract PendingIntent getPendingIntentForConversationActivity(final Context context,
298            final String conversationId, final MessageData draft);
299
300    /**
301     * Get an Intent for showing a conversation from the widget.
302     */
303    public abstract Intent getIntentForConversationActivity(final Context context,
304            final String conversationId, final MessageData draft);
305
306    /**
307     * Get a PendingIntent for sending a message to a conversation, without opening the Bugle UI.
308     *
309     * <p>This is intended to be used by the Android Wear companion app when sending transcribed
310     * voice replies.
311     */
312    public abstract PendingIntent getPendingIntentForSendingMessageToConversation(
313            final Context context, final String conversationId, final String selfId,
314            final boolean requiresMms, final int requestCode);
315
316    /**
317     * Get a PendingIntent for clearing notifications.
318     *
319     * <p>This is intended to be used by notifications.
320     */
321    public abstract PendingIntent getPendingIntentForClearingNotifications(final Context context,
322            final int updateTargets, final ConversationIdSet conversationIdSet,
323            final int requestCode);
324
325    /**
326     * Get a PendingIntent for showing low storage notifications.
327     */
328    public abstract PendingIntent getPendingIntentForLowStorageNotifications(final Context context);
329
330    /**
331     * Get a PendingIntent for showing a new message to a secondary user.
332     */
333    public abstract PendingIntent getPendingIntentForSecondaryUserNewMessageNotification(
334            final Context context);
335
336    /**
337     * Get an intent for showing the APN editor.
338     */
339    public abstract Intent getApnEditorIntent(final Context context, final String rowId, int subId);
340
341    /**
342     * Get an intent for showing the APN settings.
343     */
344    public abstract Intent getApnSettingsIntent(final Context context, final int subId);
345
346    /**
347     * Get an intent for showing advanced settings.
348     */
349    public abstract Intent getAdvancedSettingsIntent(final Context context);
350
351    /**
352     * Get an intent for the LaunchConversationActivity.
353     */
354    public abstract Intent getLaunchConversationActivityIntent(final Context context);
355
356    /**
357     *  Tell MediaScanner to re-scan the specified volume.
358     */
359    public abstract void kickMediaScanner(final Context context, final String volume);
360
361    /**
362     * Launch to browser for a url.
363     */
364    public abstract void launchBrowserForUrl(final Context context, final String url);
365
366    /**
367     * Get a PendingIntent for the widget conversation template.
368     */
369    public abstract PendingIntent getWidgetPendingIntentForConversationActivity(
370            final Context context, final String conversationId, final int requestCode);
371
372    /**
373     * Get a PendingIntent for the conversation widget configuration activity template.
374     */
375    public abstract PendingIntent getWidgetPendingIntentForConfigurationActivity(
376            final Context context, final int appWidgetId);
377
378}
379