MmsWidgetProvider.java revision c7aa632be8e7d3ebe71f236f534ea2f0af71e04a
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;
20c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylorimport android.appwidget.AppWidgetManager;
21c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylorimport android.appwidget.AppWidgetProvider;
22c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylorimport android.content.ComponentName;
23c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylorimport android.content.Context;
24c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylorimport android.content.Intent;
25c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylorimport android.net.Uri;
26c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylorimport android.util.Log;
27c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylorimport android.widget.RemoteViews;
28c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor
29c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylorimport com.android.mms.LogTag;
30c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylorimport com.android.mms.R;
31c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylorimport com.android.mms.ui.ComposeMessageActivity;
32c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylorimport com.android.mms.ui.ConversationList;
33c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor
34c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylorpublic class MmsWidgetProvider extends AppWidgetProvider {
35c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor    public static final String ACTION_NOTIFY_DATASET_CHANGED =
36c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor            "com.android.mms.intent.action.ACTION_NOTIFY_DATASET_CHANGED";
37c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor
38c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor    private static final String TAG = "MmsWidgetProvider";
39c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor
40c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor    /**
41c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor     * Update all widgets in the list
42c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor     */
43c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor    @Override
44c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
45c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor        super.onUpdate(context, appWidgetManager, appWidgetIds);
46c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor
47c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor        for (int i = 0; i < appWidgetIds.length; ++i) {
48c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor            updateWidget(context, appWidgetIds[i]);
49c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor        }
50c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor    }
51c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor
52c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor    @Override
53c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor    public void onReceive(Context context, Intent intent) {
54c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor        if (Log.isLoggable(LogTag.WIDGET, Log.VERBOSE)) {
55c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor            Log.v(TAG, "onReceive intent: " + intent);
56c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor        }
57c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor        String action = intent.getAction();
58c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor
59c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor        // The base class AppWidgetProvider's onReceive handles the normal widget intents. Here
60c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor        // we're looking for an intent sent by the messaging app when it knows a message has
61c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor        // been sent or received (or a conversation has been read) and is telling the widget it
62c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor        // needs to update.
63c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor        if (ACTION_NOTIFY_DATASET_CHANGED.equals(action)) {
64c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor            AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
65c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor            int[] appWidgetIds = appWidgetManager.getAppWidgetIds(new ComponentName(context,
66c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor                    MmsWidgetProvider.class));
67c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor            if (appWidgetIds.length > 0) {
68c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor                appWidgetManager.notifyAppWidgetViewDataChanged(appWidgetIds[0],
69c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor                        R.id.conversation_list);
70c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor            }
71c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor        } else {
72c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor            super.onReceive(context, intent);
73c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor        }
74c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor    }
75c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor
76c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor    /**
77c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor     * Update the widget appWidgetId
78c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor     */
79c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor    private static void updateWidget(Context context, int appWidgetId) {
80c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor        if (Log.isLoggable(LogTag.WIDGET, Log.VERBOSE)) {
81c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor            Log.v(TAG, "updateWidget appWidgetId: " + appWidgetId);
82c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor        }
83c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor        RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget);
84c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor        PendingIntent clickIntent;
85c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor
86c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor        // Launch an intent to avoid ANRs
87c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor        final Intent intent = new Intent(context, MmsWidgetService.class);
88c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor        intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
89c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor        intent.setData(Uri.parse(intent.toUri(Intent.URI_INTENT_SCHEME)));
90c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor        remoteViews.setRemoteAdapter(appWidgetId, R.id.conversation_list, intent);
91c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor
92c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor        remoteViews.setTextViewText(R.id.widget_label, context.getString(R.string.app_label));
93c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor
94c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor        // Open Mms's app conversation list when click on header
95c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor        final Intent convIntent = new Intent(context, ConversationList.class);
96c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor        clickIntent = PendingIntent.getActivity(
97c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor                context, 0, convIntent, PendingIntent.FLAG_UPDATE_CURRENT);
98c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor        remoteViews.setOnClickPendingIntent(R.id.widget_header, clickIntent);
99c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor
100c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor        // On click intent for Compose
101c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor        final Intent composeIntent = new Intent(context, ComposeMessageActivity.class);
102c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor        composeIntent.setAction(Intent.ACTION_SENDTO);
103c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor        clickIntent = PendingIntent.getActivity(
104c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor                context, 0, composeIntent, PendingIntent.FLAG_UPDATE_CURRENT);
105c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor        remoteViews.setOnClickPendingIntent(R.id.widget_compose, clickIntent);
106c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor
107c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor        // On click intent for Conversation
108c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor        final Intent conversationIntent = new Intent();
109c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor        conversationIntent.setAction(Intent.ACTION_VIEW);
110c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor        clickIntent = PendingIntent.getActivity(
111c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor                context, 0, conversationIntent, PendingIntent.FLAG_UPDATE_CURRENT);
112c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor        remoteViews.setPendingIntentTemplate(R.id.conversation_list, clickIntent);
113c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor
114c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor        AppWidgetManager.getInstance(context).updateAppWidget(appWidgetId, remoteViews);
115c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor    }
116c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor
117c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor    /*
118c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor     * notifyDatasetChanged call when the conversation list changes so the mms widget will
119c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor     * update and reflect the changes
120c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor     */
121c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor    public static void notifyDatasetChanged(Context context) {
122c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor        if (Log.isLoggable(LogTag.WIDGET, Log.VERBOSE)) {
123c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor            Log.v(TAG, "notifyDatasetChanged");
124c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor        }
125c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor        final Intent intent = new Intent(ACTION_NOTIFY_DATASET_CHANGED);
126c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor        context.sendBroadcast(intent);
127c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor    }
128c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor
129c7aa632be8e7d3ebe71f236f534ea2f0af71e04aTom Taylor}