14f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project/*
24f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project * Copyright (C) 2010 The Android Open Source Project
34f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project *
44f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
54f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project * you may not use this file except in compliance with the License.
64f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project * You may obtain a copy of the License at
74f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project *
84f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
94f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project *
104f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
114f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
124f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
134f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project * See the License for the specific language governing permissions and
144f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project * limitations under the License.
154f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project */
164f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
174f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Projectpackage com.android.protips;
184f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
194f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Projectimport android.app.PendingIntent;
204f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Projectimport android.appwidget.AppWidgetManager;
214f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Projectimport android.appwidget.AppWidgetProvider;
229857d99eecc389389da261a72461322d5cfb8eebMathias Agopianimport android.content.ComponentName;
234f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Projectimport android.content.Context;
244f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Projectimport android.content.SharedPreferences;
254f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Projectimport android.content.Intent;
264f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Projectimport android.content.res.Resources;
274f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Projectimport android.os.Handler;
284f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Projectimport android.os.HandlerThread;
294f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Projectimport android.util.Log;
304f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Projectimport android.view.View;
314f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Projectimport android.widget.RemoteViews;
324f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
334f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Projectimport java.util.regex.Matcher;
344f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Projectimport java.util.regex.Pattern;
354f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
364f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project/** Mister Widget appears on your home screen to provide helpful tips. */
374f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Projectpublic class ProtipWidget extends AppWidgetProvider {
384f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    public static final String ACTION_NEXT_TIP = "com.android.misterwidget.NEXT_TIP";
394f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    public static final String ACTION_POKE = "com.android.misterwidget.HEE_HEE";
404f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
414f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    public static final String EXTRA_TIMES = "times";
424f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
434f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    public static final String PREFS_NAME = "Protips";
444f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    public static final String PREFS_TIP_NUMBER = "widget_tip";
454f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    public static final String PREFS_TIP_SET = "widget_tip_set";
464f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
474f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    private static final Pattern sNewlineRegex = Pattern.compile(" *\\n *");
484f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    private static final Pattern sDrawableRegex = Pattern.compile(" *@(drawable/[a-z0-9_]+) *");
494f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
504f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    private static Handler mAsyncHandler;
514f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    static {
524f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project        HandlerThread thr = new HandlerThread("ProtipWidget async");
534f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project        thr.start();
544f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project        mAsyncHandler = new Handler(thr.getLooper());
554f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    }
564f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
574f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    // initial appearance: eyes closed, no bubble
582bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind    private int mIconRes = R.drawable.droidman_open;
592bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind    private int mMessage = 0;
602bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind    private int mTipSet = 0;
612bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind
624f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    private AppWidgetManager mWidgetManager = null;
634f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    private int[] mWidgetIds;
644f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    private Context mContext;
654f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
664f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    private CharSequence[] mTips;
674f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
684f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    private void setup(Context context) {
694f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project        mContext = context;
704f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project        mWidgetManager = AppWidgetManager.getInstance(context);
714f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project        mWidgetIds = mWidgetManager.getAppWidgetIds(new ComponentName(context, ProtipWidget.class));
724f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
732bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        SharedPreferences pref = context.getSharedPreferences(PREFS_NAME, 0);
742bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        mMessage = pref.getInt(PREFS_TIP_NUMBER, 0);
752bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        mTipSet = pref.getInt(PREFS_TIP_SET, 0);
762bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind
772bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        mTips = context.getResources().getTextArray(mTipSet == 1 ? R.array.tips2 : R.array.tips);
782bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind
792bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        if (mTips != null) {
802bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind            if (mMessage >= mTips.length) mMessage = 0;
812bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        } else {
822bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind            mMessage = -1;
832bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        }
842bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind    }
852bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind
862bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind    public void goodmorning() {
872bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        mMessage = -1;
882bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        try {
892bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind            setIcon(R.drawable.droidman_down_closed);
902bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind            Thread.sleep(500);
912bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind            setIcon(R.drawable.droidman_down_open);
922bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind            Thread.sleep(200);
932bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind            setIcon(R.drawable.droidman_down_closed);
942bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind            Thread.sleep(100);
952bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind            setIcon(R.drawable.droidman_down_open);
962bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind            Thread.sleep(600);
972bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        } catch (InterruptedException ex) {
982bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        }
992bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        mMessage = 0;
1002bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        mIconRes = R.drawable.droidman_open;
1012bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        refresh();
1022bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind    }
1032bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind
1042bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind    @Override
1052bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind    public void onReceive(final Context context, final Intent intent) {
1062bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        final PendingResult result = goAsync();
1072bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        Runnable worker = new Runnable() {
1082bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind            @Override
1092bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind            public void run() {
1102bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind                onReceiveAsync(context, intent);
1112bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind                result.finish();
1122bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind            }
1132bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        };
1142bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        mAsyncHandler.post(worker);
1152bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind    }
1162bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind
1172bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind    void onReceiveAsync(Context context, Intent intent) {
1182bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        setup(context);
1192bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind
1202bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        Resources res = mContext.getResources();
1212bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        mTips = res.getTextArray(mTipSet == 1 ? R.array.tips2 : R.array.tips);
1222bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind
1232bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        if (intent.getAction().equals(ACTION_NEXT_TIP)) {
1242bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind            mMessage = getNextMessageIndex();
1252bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind            SharedPreferences.Editor pref = context.getSharedPreferences(PREFS_NAME, 0).edit();
1262bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind            pref.putInt(PREFS_TIP_NUMBER, mMessage);
1272bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind            pref.apply();
1282bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind            refresh();
1292bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        } else if (intent.getAction().equals(ACTION_POKE)) {
1302bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind            blink(intent.getIntExtra(EXTRA_TIMES, 1));
1312bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        } else if (intent.getAction().equals(AppWidgetManager.ACTION_APPWIDGET_ENABLED)) {
1322bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind            goodmorning();
1332bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        } else if (intent.getAction().equals("android.provider.Telephony.SECRET_CODE")) {
1342bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind            Log.d("Protips", "ACHIEVEMENT UNLOCKED");
1352bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind            mTipSet = 1 - mTipSet;
1362bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind            mMessage = 0;
1372bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind
1382bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind            SharedPreferences.Editor pref = context.getSharedPreferences(PREFS_NAME, 0).edit();
1392bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind            pref.putInt(PREFS_TIP_NUMBER, mMessage);
1402bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind            pref.putInt(PREFS_TIP_SET, mTipSet);
1412bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind            pref.apply();
1422bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind
1432bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind            mContext.startActivity(
1442bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind                new Intent(Intent.ACTION_MAIN)
1452bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind                    .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_CLEAR_TOP)
1462bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind                    .addCategory(Intent.CATEGORY_HOME));
1472bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind
1482bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind            final Intent bcast = new Intent(context, ProtipWidget.class);
1492bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind            bcast.setAction(ACTION_POKE);
1502bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind            bcast.putExtra(EXTRA_TIMES, 3);
1512bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind            mContext.sendBroadcast(bcast);
1522bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        } else {
1532bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind            mIconRes = R.drawable.droidman_open;
1542bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind            refresh();
1552bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        }
1562bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind    }
1572bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind
1582bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind    private void refresh() {
1592bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind        RemoteViews rv = buildUpdate(mContext);
1604f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project        for (int i : mWidgetIds) {
1614f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project            mWidgetManager.updateAppWidget(i, rv);
1624f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project        }
1634f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    }
1644f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
1654f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    private void setIcon(int resId) {
1664f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project        mIconRes = resId;
1674f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project        refresh();
1684f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    }
1694f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
1704f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    private int getNextMessageIndex() {
1714f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project        return (mMessage + 1) % mTips.length;
1724f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    }
1734f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
1744f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    private void blink(int blinks) {
1754f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project        // don't blink if no bubble showing or if goodmorning() is happening
1764f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project        if (mMessage < 0) return;
1774f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
1784f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project        setIcon(R.drawable.droidman_closed);
1794f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project        try {
1804f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project            Thread.sleep(100);
1814f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project            while (0<--blinks) {
1824f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project                setIcon(R.drawable.droidman_open);
1834f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project                Thread.sleep(200);
1844f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project                setIcon(R.drawable.droidman_closed);
1854f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project                Thread.sleep(100);
1864f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project            }
1874f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project        } catch (InterruptedException ex) { }
1884f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project        setIcon(R.drawable.droidman_open);
1894f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    }
1904f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
1914f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    public RemoteViews buildUpdate(Context context) {
1924f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project        RemoteViews updateViews = new RemoteViews(
1934f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project            context.getPackageName(), R.layout.widget);
1944f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
1954f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project        // Action for tap on bubble
1964f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project        Intent bcast = new Intent(context, ProtipWidget.class);
1974f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project        bcast.setAction(ACTION_NEXT_TIP);
1984f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project        PendingIntent pending = PendingIntent.getBroadcast(
1994f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project            context, 0, bcast, PendingIntent.FLAG_UPDATE_CURRENT);
2004f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project        updateViews.setOnClickPendingIntent(R.id.tip_bubble, pending);
2014f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
2024f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project        // Action for tap on android
2034f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project        bcast = new Intent(context, ProtipWidget.class);
2044f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project        bcast.setAction(ACTION_POKE);
2054f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project        bcast.putExtra(EXTRA_TIMES, 1);
2064f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project        pending = PendingIntent.getBroadcast(
2074f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project            context, 0, bcast, PendingIntent.FLAG_UPDATE_CURRENT);
2084f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project        updateViews.setOnClickPendingIntent(R.id.bugdroid, pending);
2094f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
2104f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project        // Tip bubble text
2114f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project        if (mMessage >= 0) {
2124f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project            String[] parts = sNewlineRegex.split(mTips[mMessage], 2);
2134f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project            String title = parts[0];
2144f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project            String text = parts.length > 1 ? parts[1] : "";
2154f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
2164f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project            // Look for a callout graphic referenced in the text
2174f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project            Matcher m = sDrawableRegex.matcher(text);
2184f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project            if (m.find()) {
2194f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project                String imageName = m.group(1);
2204f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project                int resId = context.getResources().getIdentifier(
2214f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
2224f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project                    imageName, null, context.getPackageName());
2234f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project                updateViews.setImageViewResource(R.id.tip_callout, resId);
2244f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project                updateViews.setViewVisibility(R.id.tip_callout, View.VISIBLE);
2254f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project                text = m.replaceFirst("");
2264f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project            } else {
2274f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project                updateViews.setImageViewResource(R.id.tip_callout, 0);
2284f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project                updateViews.setViewVisibility(R.id.tip_callout, View.GONE);
2294f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project            }
2304f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
2314f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project            updateViews.setTextViewText(R.id.tip_message,
2324f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project                text);
2334f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project            updateViews.setTextViewText(R.id.tip_header,
2344f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project                title);
2354f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project            updateViews.setTextViewText(R.id.tip_footer,
2364f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project                context.getResources().getString(
2374f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project                    R.string.pager_footer,
2384f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project                    (1+mMessage), mTips.length));
2394f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project            updateViews.setViewVisibility(R.id.tip_bubble, View.VISIBLE);
2404f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project        } else {
2414f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project            updateViews.setViewVisibility(R.id.tip_bubble, View.INVISIBLE);
2424f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project        }
2434f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
2444f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project        updateViews.setImageViewResource(R.id.bugdroid, mIconRes);
2454f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
2464f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project        return updateViews;
2474f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    }
2484f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project}
2494f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project