1c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor/*
2c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor * Copyright (C) 2012 The Android Open Source Project
3c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor *
4c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor * Licensed under the Apache License, Version 2.0 (the "License");
5c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor * you may not use this file except in compliance with the License.
6c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor * You may obtain a copy of the License at
7c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor *
8c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor *      http://www.apache.org/licenses/LICENSE-2.0
9c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor *
10c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor * Unless required by applicable law or agreed to in writing, software
11c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor * distributed under the License is distributed on an "AS IS" BASIS,
12c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor * See the License for the specific language governing permissions and
14c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor * limitations under the License.
15c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor */
16c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor
17c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylorpackage com.android.mms.widget;
18c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor
19c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylorimport android.app.PendingIntent;
206cc254afc74dee97c7ef356612ae9ec7bc8b77ceTom Taylorimport android.app.TaskStackBuilder;
21c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylorimport android.appwidget.AppWidgetManager;
22c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylorimport android.appwidget.AppWidgetProvider;
23c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylorimport android.content.ComponentName;
24c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylorimport android.content.Context;
25c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylorimport android.content.Intent;
26c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylorimport android.net.Uri;
27c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylorimport android.util.Log;
28c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylorimport android.widget.RemoteViews;
29c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor
30c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylorimport com.android.mms.LogTag;
31c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylorimport com.android.mms.R;
32c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylorimport com.android.mms.ui.ComposeMessageActivity;
33c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylorimport com.android.mms.ui.ConversationList;
34c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor
35c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylorpublic class MmsWidgetProvider extends AppWidgetProvider {
36c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor    public static final String ACTION_NOTIFY_DATASET_CHANGED =
37c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor            "com.android.mms.intent.action.ACTION_NOTIFY_DATASET_CHANGED";
38c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor
39c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor    private static final String TAG = "MmsWidgetProvider";
40c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor
41c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor    /**
42c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor     * Update all widgets in the list
43c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor     */
44c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor    @Override
45c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
46c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor        super.onUpdate(context, appWidgetManager, appWidgetIds);
47c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor
48c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor        for (int i = 0; i < appWidgetIds.length; ++i) {
49c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor            updateWidget(context, appWidgetIds[i]);
50c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor        }
51c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor    }
52c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor
53c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor    @Override
54c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor    public void onReceive(Context context, Intent intent) {
55c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor        if (Log.isLoggable(LogTag.WIDGET, Log.VERBOSE)) {
56c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor            Log.v(TAG, "onReceive intent: " + intent);
57c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor        }
58c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor        String action = intent.getAction();
59c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor
60c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor        // The base class AppWidgetProvider's onReceive handles the normal widget intents. Here
61c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor        // we're looking for an intent sent by the messaging app when it knows a message has
62c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor        // been sent or received (or a conversation has been read) and is telling the widget it
63c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor        // needs to update.
64c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor        if (ACTION_NOTIFY_DATASET_CHANGED.equals(action)) {
65c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor            AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
66c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor            int[] appWidgetIds = appWidgetManager.getAppWidgetIds(new ComponentName(context,
67c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor                    MmsWidgetProvider.class));
68cee64965b033733a494df675892267e109a23dd6Roger Chen
69cee64965b033733a494df675892267e109a23dd6Roger Chen            // We need to update all Mms appwidgets on the home screen.
70cee64965b033733a494df675892267e109a23dd6Roger Chen            for (int appWidgetId : appWidgetIds) {
71cee64965b033733a494df675892267e109a23dd6Roger Chen                appWidgetManager.notifyAppWidgetViewDataChanged(appWidgetId,
72c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor                        R.id.conversation_list);
73c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor            }
74c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor        } else {
75c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor            super.onReceive(context, intent);
76c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor        }
77c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor    }
78c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor
79c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor    /**
80c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor     * Update the widget appWidgetId
81c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor     */
82c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor    private static void updateWidget(Context context, int appWidgetId) {
83c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor        if (Log.isLoggable(LogTag.WIDGET, Log.VERBOSE)) {
84c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor            Log.v(TAG, "updateWidget appWidgetId: " + appWidgetId);
85c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor        }
86c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor        RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget);
87c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor        PendingIntent clickIntent;
88c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor
89c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor        // Launch an intent to avoid ANRs
90c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor        final Intent intent = new Intent(context, MmsWidgetService.class);
91c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor        intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
92c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor        intent.setData(Uri.parse(intent.toUri(Intent.URI_INTENT_SCHEME)));
93c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor        remoteViews.setRemoteAdapter(appWidgetId, R.id.conversation_list, intent);
94c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor
95c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor        remoteViews.setTextViewText(R.id.widget_label, context.getString(R.string.app_label));
96c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor
97c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor        // Open Mms's app conversation list when click on header
98c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor        final Intent convIntent = new Intent(context, ConversationList.class);
99c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor        clickIntent = PendingIntent.getActivity(
100c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor                context, 0, convIntent, PendingIntent.FLAG_UPDATE_CURRENT);
101c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor        remoteViews.setOnClickPendingIntent(R.id.widget_header, clickIntent);
102c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor
103c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor        // On click intent for Compose
104c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor        final Intent composeIntent = new Intent(context, ComposeMessageActivity.class);
105c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor        composeIntent.setAction(Intent.ACTION_SENDTO);
106c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor        clickIntent = PendingIntent.getActivity(
107c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor                context, 0, composeIntent, PendingIntent.FLAG_UPDATE_CURRENT);
108c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor        remoteViews.setOnClickPendingIntent(R.id.widget_compose, clickIntent);
109c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor
110c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor        // On click intent for Conversation
111fb7068020e74e431acc9511212d2a6d17258ab9eAdam Powell        TaskStackBuilder taskStackBuilder = TaskStackBuilder.create(context);
1126cc254afc74dee97c7ef356612ae9ec7bc8b77ceTom Taylor        taskStackBuilder.addParentStack(ComposeMessageActivity.class);
1136cc254afc74dee97c7ef356612ae9ec7bc8b77ceTom Taylor        Intent msgIntent = new Intent(Intent.ACTION_VIEW);
1146cc254afc74dee97c7ef356612ae9ec7bc8b77ceTom Taylor        msgIntent.setType("vnd.android-dir/mms-sms");
1156cc254afc74dee97c7ef356612ae9ec7bc8b77ceTom Taylor        taskStackBuilder.addNextIntent(msgIntent);
1166cc254afc74dee97c7ef356612ae9ec7bc8b77ceTom Taylor        remoteViews.setPendingIntentTemplate(R.id.conversation_list,
1176cc254afc74dee97c7ef356612ae9ec7bc8b77ceTom Taylor                taskStackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT));
118c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor
119c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor        AppWidgetManager.getInstance(context).updateAppWidget(appWidgetId, remoteViews);
120c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor    }
121c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor
122c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor    /*
123c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor     * notifyDatasetChanged call when the conversation list changes so the mms widget will
124c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor     * update and reflect the changes
125c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor     */
126c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor    public static void notifyDatasetChanged(Context context) {
127c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor        if (Log.isLoggable(LogTag.WIDGET, Log.VERBOSE)) {
128c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor            Log.v(TAG, "notifyDatasetChanged");
129c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor        }
130c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor        final Intent intent = new Intent(ACTION_NOTIFY_DATASET_CHANGED);
131c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor        context.sendBroadcast(intent);
132c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor    }
133c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor
134c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor}