SettingsAppWidgetProvider.java revision cd03f5320d42290b1619933954a344b59dc55f4f
103a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff/*
203a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff * Copyright (C) 2009 The Android Open Source Project
303a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff *
403a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff * Licensed under the Apache License, Version 2.0 (the "License");
503a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff * you may not use this file except in compliance with the License.
603a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff * You may obtain a copy of the License at
703a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff *
803a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff *      http://www.apache.org/licenses/LICENSE-2.0
903a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff *
1003a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff * Unless required by applicable law or agreed to in writing, software
1103a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff * distributed under the License is distributed on an "AS IS" BASIS,
1203a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1303a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff * See the License for the specific language governing permissions and
1403a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff * limitations under the License.
1503a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff */
1603a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff
1703a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriffpackage com.android.settings.widget;
1803a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff
1903a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriffimport android.app.PendingIntent;
2003a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriffimport android.appwidget.AppWidgetManager;
2103a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriffimport android.appwidget.AppWidgetProvider;
22d63c0112251ab4e4e977545368dd703d875012a4Nick Pellyimport android.bluetooth.BluetoothAdapter;
2303a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriffimport android.content.ComponentName;
2403a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriffimport android.content.ContentResolver;
2503a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriffimport android.content.Context;
2603a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriffimport android.content.IContentService;
2703a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriffimport android.content.Intent;
2803a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriffimport android.content.pm.PackageManager;
2903a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriffimport android.location.LocationManager;
3003a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriffimport android.net.ConnectivityManager;
3103a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriffimport android.net.Uri;
3203a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriffimport android.net.wifi.WifiManager;
33cd03f5320d42290b1619933954a344b59dc55f4fMike Lockwoodimport android.os.IPowerManager;
3403a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriffimport android.os.RemoteException;
3503a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriffimport android.os.ServiceManager;
3603a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriffimport android.provider.Settings;
3703a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriffimport android.util.Log;
3803a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriffimport android.widget.RemoteViews;
39e936f5b386b39781e8f5e1ab423ebaf790dd9742Ken Shirriffimport android.widget.Toast;
4003a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriffimport com.android.settings.R;
4103a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriffimport com.android.settings.bluetooth.LocalBluetoothManager;
4203a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff
4303a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff/**
4403a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff * Provides control of power-related settings from a widget.
4503a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff */
4603a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriffpublic class SettingsAppWidgetProvider extends AppWidgetProvider {
4703a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff    static final String TAG = "SettingsAppWidgetProvider";
4803a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff
4903a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff    static final ComponentName THIS_APPWIDGET =
5003a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff            new ComponentName("com.android.settings",
5103a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff                    "com.android.settings.widget.SettingsAppWidgetProvider");
5203a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff
5303a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff    private static LocalBluetoothManager mLocalBluetoothManager = null;
5403a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff
5503a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff    private static final int BUTTON_WIFI = 0;
5603a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff    private static final int BUTTON_BRIGHTNESS = 1;
5703a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff    private static final int BUTTON_SYNC = 2;
5803a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff    private static final int BUTTON_GPS = 3;
5903a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff    private static final int BUTTON_BLUETOOTH = 4;
6003a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff
6103a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff    private static final int STATE_DISABLED = 0;
6203a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff    private static final int STATE_ENABLED = 1;
6303a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff    private static final int STATE_INTERMEDIATE = 2;
6403a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff
6503a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff    /**
6603a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff     * Minimum and maximum brightnesses.  Don't go to 0 since that makes the display unusable
6703a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff     */
6803a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff    private static final int MINIMUM_BACKLIGHT = android.os.Power.BRIGHTNESS_DIM + 10;
6903a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff    private static final int MAXIMUM_BACKLIGHT = android.os.Power.BRIGHTNESS_ON;
7003a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff    private static final int DEFAULT_BACKLIGHT = (int) (android.os.Power.BRIGHTNESS_ON * 0.4f);
7103a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff
7203a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff    @Override
7303a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff    public void onUpdate(Context context, AppWidgetManager appWidgetManager,
7403a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff            int[] appWidgetIds) {
7503a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff        // Update each requested appWidgetId
7603a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff        RemoteViews view = buildUpdate(context, -1);
7703a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff
7803a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff        for (int i = 0; i < appWidgetIds.length; i++) {
7903a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff            appWidgetManager.updateAppWidget(appWidgetIds[i], view);
8003a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff        }
8103a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff    }
8203a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff
8303a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff    @Override
8403a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff    public void onEnabled(Context context) {
8503a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff        PackageManager pm = context.getPackageManager();
8603a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff        pm.setComponentEnabledSetting(
8703a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff                new ComponentName("com.android.settings", ".widget.SettingsAppWidgetProvider"),
8803a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff                PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
8903a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff                PackageManager.DONT_KILL_APP);
9003a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff    }
9103a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff
9203a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff    @Override
9303a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff    public void onDisabled(Context context) {
9403a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff        Class clazz = com.android.settings.widget.SettingsAppWidgetProvider.class;
9503a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff        PackageManager pm = context.getPackageManager();
9603a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff        pm.setComponentEnabledSetting(
9703a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff                new ComponentName("com.android.settings", ".widget.SettingsAppWidgetProvider"),
9803a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff                PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
9903a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff                PackageManager.DONT_KILL_APP);
10003a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff    }
10103a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff
10203a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff    /**
10303a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff     * Load image for given widget and build {@link RemoteViews} for it.
10403a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff     */
10503a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff    static RemoteViews buildUpdate(Context context, int appWidgetId) {
10603a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff        RemoteViews views = new RemoteViews(context.getPackageName(),
10703a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff                R.layout.widget);
10803a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff        views.setOnClickPendingIntent(R.id.btn_wifi, getLaunchPendingIntent(context, appWidgetId,
10903a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff                BUTTON_WIFI));
11003a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff        views.setOnClickPendingIntent(R.id.btn_brightness,
11103a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff                getLaunchPendingIntent(context,
11203a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff                        appWidgetId, BUTTON_BRIGHTNESS));
11303a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff        views.setOnClickPendingIntent(R.id.btn_sync,
11403a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff                getLaunchPendingIntent(context,
11503a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff                        appWidgetId, BUTTON_SYNC));
11603a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff        views.setOnClickPendingIntent(R.id.btn_gps,
11703a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff                getLaunchPendingIntent(context, appWidgetId, BUTTON_GPS));
11803a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff        views.setOnClickPendingIntent(R.id.btn_bluetooth,
11903a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff                getLaunchPendingIntent(context,
12003a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff                        appWidgetId, BUTTON_BLUETOOTH));
12103a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff
12203a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff        updateButtons(views, context);
12303a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff        return views;
12403a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff    }
12503a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff
12603a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff    /**
12703a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff     * Updates the widget when something changes, or when a button is pushed.
12803a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff     *
12903a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff     * @param context
13003a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff     */
13103a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff    public static void updateWidget(Context context) {
13203a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff        RemoteViews views = buildUpdate(context, -1);
13303a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff        // Update specific list of appWidgetIds if given, otherwise default to all
13403a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff        final AppWidgetManager gm = AppWidgetManager.getInstance(context);
13503a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff        gm.updateAppWidget(THIS_APPWIDGET, views);
13603a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff    }
13703a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff
13803a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff    /**
13903a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff     * Updates the buttons based on the underlying states of wifi, etc.
14003a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff     *
14103a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff     * @param views   The RemoteViews to update.
14203a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff     * @param context
14303a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff     */
14403a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff    private static void updateButtons(RemoteViews views, Context context) {
14503a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff        switch (getWifiState(context)) {
14603a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff            case STATE_DISABLED:
14703a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff                views.setImageViewResource(R.id.btn_wifi, R.drawable.widget_btn_wifi_off);
14803a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff                break;
14903a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff            case STATE_ENABLED:
15003a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff                views.setImageViewResource(R.id.btn_wifi, R.drawable.widget_btn_wifi);
15103a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff                break;
15203a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff            case STATE_INTERMEDIATE:
15303a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff                views.setImageViewResource(R.id.btn_wifi, R.drawable.widget_btn_wifi_gray);
15403a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff                break;
15503a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff        }
15603a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff        if (getBrightness(context)) {
15703a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff            views.setImageViewResource(R.id.btn_brightness, R.drawable.widget_btn_brightness);
15803a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff        } else {
15903a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff            views.setImageViewResource(R.id.btn_brightness, R.drawable.widget_btn_brightness_off);
16003a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff        }
16103a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff        if (getBackgroundDataState(context)) {
16203a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff            views.setImageViewResource(R.id.btn_sync, R.drawable.widget_btn_sync);
16303a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff        } else {
16403a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff            views.setImageViewResource(R.id.btn_sync, R.drawable.widget_btn_sync_off);
16503a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff        }
16603a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff        if (getGpsState(context)) {
16703a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff            views.setImageViewResource(R.id.btn_gps, R.drawable.widget_btn_gps);
16803a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff        } else {
16903a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff            views.setImageViewResource(R.id.btn_gps, R.drawable.widget_btn_gps_off);
17003a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff        }
17103a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff        switch (getBluetoothState(context)) {
17203a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff            case STATE_DISABLED:
17303a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff                views.setImageViewResource(R.id.btn_bluetooth, R.drawable.widget_btn_bluetooth_off);
17403a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff                break;
17503a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff            case STATE_ENABLED:
17603a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff                views.setImageViewResource(R.id.btn_bluetooth, R.drawable.widget_btn_bluetooth);
17703a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff                break;
17803a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff            case STATE_INTERMEDIATE:
179e936f5b386b39781e8f5e1ab423ebaf790dd9742Ken Shirriff                views.setImageViewResource(R.id.btn_bluetooth,
180e936f5b386b39781e8f5e1ab423ebaf790dd9742Ken Shirriff                        R.drawable.widget_btn_bluetooth_gray);
18103a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff                break;
18203a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff        }
18303a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff    }
18403a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff
18503a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff    /**
18603a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff     * Creates PendingIntent to notify the widget of a button click.
18703a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff     *
18803a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff     * @param context
18903a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff     * @param appWidgetId
19003a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff     * @return
19103a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff     */
192e936f5b386b39781e8f5e1ab423ebaf790dd9742Ken Shirriff    private static PendingIntent getLaunchPendingIntent(Context context, int appWidgetId,
193e936f5b386b39781e8f5e1ab423ebaf790dd9742Ken Shirriff            int buttonId) {
19403a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff        Intent launchIntent = new Intent();
19503a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff        launchIntent.setClass(context, SettingsAppWidgetProvider.class);
19603a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff        launchIntent.addCategory(Intent.CATEGORY_ALTERNATIVE);
19703a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff        launchIntent.setData(Uri.parse("custom:" + buttonId));
19803a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff        PendingIntent pi = PendingIntent.getBroadcast(context, 0 /* no requestCode */,
19903a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff                launchIntent, 0 /* no flags */);
20003a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff        return pi;
20103a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff    }
20203a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff
20303a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff    /**
20403a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff     * Receives and processes a button pressed intent or state change.
20503a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff     *
20603a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff     * @param context
20703a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff     * @param intent  Indicates the pressed button.
20803a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff     */
20903a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff    @Override
21003a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff    public void onReceive(Context context, Intent intent) {
21103a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff        super.onReceive(context, intent);
21203a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff        if (intent.hasCategory(Intent.CATEGORY_ALTERNATIVE)) {
21303a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff            Uri data = intent.getData();
21403a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff            int buttonId = Integer.parseInt(data.getSchemeSpecificPart());
21503a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff            if (buttonId == BUTTON_WIFI) {
21603a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff                toggleWifi(context);
21703a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff            } else if (buttonId == BUTTON_BRIGHTNESS) {
21803a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff                toggleBrightness(context);
21903a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff            } else if (buttonId == BUTTON_SYNC) {
22003a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff                toggleBackgroundData(context);
22103a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff            } else if (buttonId == BUTTON_GPS) {
22203a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff                toggleGps(context);
22303a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff            } else if (buttonId == BUTTON_BLUETOOTH) {
22403a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff                toggleBluetooth(context);
22503a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff            }
22603a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff        }
22703a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff        // State changes fall through
22803a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff        updateWidget(context);
22903a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff    }
23003a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff
23103a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff    /**
23203a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff     * Gets the state of Wi-Fi
23303a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff     *
23403a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff     * @param context
23503a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff     * @return STATE_ENABLED, STATE_DISABLED, or STATE_INTERMEDIATE
23603a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff     */
23703a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff    private static int getWifiState(Context context) {
23803a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff        WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
23903a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff        int wifiState = wifiManager.getWifiState();
24003a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff        if (wifiState == WifiManager.WIFI_STATE_DISABLED) {
24103a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff            return STATE_DISABLED;
24203a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff        } else if (wifiState == WifiManager.WIFI_STATE_ENABLED) {
24303a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff            return STATE_ENABLED;
24403a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff        } else {
24503a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff            return STATE_INTERMEDIATE;
24603a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff        }
24703a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff    }
24803a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff
24903a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff    /**
25003a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff     * Toggles the state of Wi-Fi
25103a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff     *
25203a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff     * @param context
25303a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff     */
25403a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff    private void toggleWifi(Context context) {
25503a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff        WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
25603a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff        int wifiState = getWifiState(context);
25703a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff        if (wifiState == STATE_ENABLED) {
25803a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff            wifiManager.setWifiEnabled(false);
25903a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff        } else if (wifiState == STATE_DISABLED) {
26003a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff            wifiManager.setWifiEnabled(true);
26103a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff        }
262e936f5b386b39781e8f5e1ab423ebaf790dd9742Ken Shirriff        Toast.makeText(context, R.string.gadget_toggle_wifi, Toast.LENGTH_SHORT).show();
26303a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff    }
26403a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff
26503a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff    /**
26603a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff     * Gets the state of background data.
26703a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff     *
26803a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff     * @param context
26903a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff     * @return true if enabled
27003a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff     */
27103a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff    private static boolean getBackgroundDataState(Context context) {
272e936f5b386b39781e8f5e1ab423ebaf790dd9742Ken Shirriff        ConnectivityManager connManager =
273e936f5b386b39781e8f5e1ab423ebaf790dd9742Ken Shirriff                (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
27403a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff        return connManager.getBackgroundDataSetting();
27503a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff    }
27603a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff
27703a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff    /**
27803a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff     * Toggle background data and sync tickles.
27903a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff     *
28003a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff     * @param context
28103a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff     */
28203a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff    private void toggleBackgroundData(Context context) {
283e936f5b386b39781e8f5e1ab423ebaf790dd9742Ken Shirriff        ConnectivityManager connManager =
284e936f5b386b39781e8f5e1ab423ebaf790dd9742Ken Shirriff                (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
28503a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff        boolean sync = getBackgroundDataState(context);
28603a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff        connManager.setBackgroundDataSetting(!sync);
28731989d7994f863191301eac8154b4887b949b2caFred Quintana        ContentResolver.setMasterSyncAutomatically(!sync);
28803a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff    }
28903a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff
29003a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff    /**
29103a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff     * Gets the state of GPS location.
29203a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff     *
29303a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff     * @param context
29403a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff     * @return true if enabled.
29503a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff     */
29603a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff    private static boolean getGpsState(Context context) {
29703a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff        ContentResolver resolver = context.getContentResolver();
29803a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff        return Settings.Secure.isLocationProviderEnabled(resolver, LocationManager.GPS_PROVIDER);
29903a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff    }
30003a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff
30103a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff    /**
30203a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff     * Toggles the state of GPS.
30303a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff     *
30403a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff     * @param context
30503a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff     */
30603a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff    private void toggleGps(Context context) {
30703a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff        ContentResolver resolver = context.getContentResolver();
30803a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff        boolean enabled = getGpsState(context);
309e936f5b386b39781e8f5e1ab423ebaf790dd9742Ken Shirriff        Settings.Secure.setLocationProviderEnabled(resolver, LocationManager.GPS_PROVIDER,
310e936f5b386b39781e8f5e1ab423ebaf790dd9742Ken Shirriff                !enabled);
31103a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff    }
31203a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff
31303a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff    /**
31403a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff     * Gets state of brightness.
31503a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff     *
31603a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff     * @param context
31703a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff     * @return true if more than moderately bright.
31803a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff     */
31903a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff    private static boolean getBrightness(Context context) {
32003a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff        try {
321cd03f5320d42290b1619933954a344b59dc55f4fMike Lockwood            IPowerManager power = IPowerManager.Stub.asInterface(
322cd03f5320d42290b1619933954a344b59dc55f4fMike Lockwood                    ServiceManager.getService("power"));
323cd03f5320d42290b1619933954a344b59dc55f4fMike Lockwood            if (power != null) {
32403a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff                int brightness = Settings.System.getInt(context.getContentResolver(),
32503a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff                        Settings.System.SCREEN_BRIGHTNESS);
32603a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff                return brightness > 100;
32703a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff            }
32803a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff        } catch (Exception e) {
32903a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff            Log.d(TAG, "getBrightness: " + e);
33003a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff        }
33103a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff        return false;
33203a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff    }
33303a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff
33403a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff    /**
33503a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff     * Increases or decreases the brightness.
33603a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff     *
33703a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff     * @param context
33803a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff     */
33903a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff    private void toggleBrightness(Context context) {
34003a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff        try {
341cd03f5320d42290b1619933954a344b59dc55f4fMike Lockwood            IPowerManager power = IPowerManager.Stub.asInterface(
342cd03f5320d42290b1619933954a344b59dc55f4fMike Lockwood                    ServiceManager.getService("power"));
343cd03f5320d42290b1619933954a344b59dc55f4fMike Lockwood            if (power != null) {
34403a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff                ContentResolver cr = context.getContentResolver();
34503a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff                int brightness = Settings.System.getInt(cr,
34603a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff                        Settings.System.SCREEN_BRIGHTNESS);
34703a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff                // Rotate MINIMUM -> DEFAULT -> MAXIMUM
34803a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff                // Technically, not a toggle...
34903a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff                if (brightness < DEFAULT_BACKLIGHT) {
35003a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff                    brightness = DEFAULT_BACKLIGHT;
35103a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff                } else if (brightness < MAXIMUM_BACKLIGHT) {
35203a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff                    brightness = MAXIMUM_BACKLIGHT;
35303a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff                } else {
35403a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff                    brightness = MINIMUM_BACKLIGHT;
35503a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff                }
356cd03f5320d42290b1619933954a344b59dc55f4fMike Lockwood                power.setBacklightBrightness(brightness);
35703a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff                Settings.System.putInt(cr, Settings.System.SCREEN_BRIGHTNESS, brightness);
35803a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff                brightness = Settings.System.getInt(cr,
35903a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff                        Settings.System.SCREEN_BRIGHTNESS);
36003a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff            }
36103a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff        } catch (RemoteException e) {
36203a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff            Log.d(TAG, "toggleBrightness: " + e);
36303a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff        } catch (Settings.SettingNotFoundException e) {
36403a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff            Log.d(TAG, "toggleBrightness: " + e);
36503a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff        }
36603a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff    }
36703a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff
36803a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff    /**
36903a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff     * Gets state of bluetooth
37003a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff     *
37103a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff     * @param context
37203a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff     * @return STATE_ENABLED, STATE_DISABLED, or STATE_INTERMEDIATE
37303a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff     */
37403a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff    private static int getBluetoothState(Context context) {
37503a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff        if (mLocalBluetoothManager == null) {
37603a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff            mLocalBluetoothManager = LocalBluetoothManager.getInstance(context);
37703a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff            if (mLocalBluetoothManager == null) {
37803a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff                return STATE_INTERMEDIATE; // On emulator?
37903a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff            }
38003a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff        }
38103a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff        int state = mLocalBluetoothManager.getBluetoothState();
382ca564d6bdaa56fba60f499e092e1024fff5d1abaNick Pelly        if (state == BluetoothAdapter.STATE_OFF) {
38303a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff            return STATE_DISABLED;
384ca564d6bdaa56fba60f499e092e1024fff5d1abaNick Pelly        } else if (state == BluetoothAdapter.STATE_ON) {
38503a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff            return STATE_ENABLED;
38603a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff        } else {
38703a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff            return STATE_INTERMEDIATE;
38803a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff        }
38903a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff    }
39003a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff
39103a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff    /**
39203a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff     * Toggles the state of bluetooth
39303a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff     *
39403a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff     * @param context
39503a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff     */
39603a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff    private void toggleBluetooth(Context context) {
39703a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff        int state = getBluetoothState(context);
39803a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff        if (state == STATE_ENABLED) {
39903a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff            mLocalBluetoothManager.setBluetoothEnabled(false);
40003a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff        } else if (state == STATE_DISABLED) {
40103a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff            mLocalBluetoothManager.setBluetoothEnabled(true);
40203a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff        }
403e936f5b386b39781e8f5e1ab423ebaf790dd9742Ken Shirriff        Toast.makeText(context, R.string.gadget_toggle_bluetooth, Toast.LENGTH_SHORT).show();
40403a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff    }
40503a6110b4f62e72592b451c05848cfaad8c65324Ken Shirriff}
406