package net.cactii.flash2;
import android.app.PendingIntent;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.net.Uri;
import android.preference.PreferenceManager;
import android.provider.Settings;
import android.widget.RemoteViews;
public class TorchWidgetProvider extends AppWidgetProvider {
private static TorchWidgetProvider sInstance;
static synchronized TorchWidgetProvider getInstance() {
if (sInstance == null) {
sInstance = new TorchWidgetProvider();
}
return sInstance;
}
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
for (int appWidgetId : appWidgetIds)
this.updateState(context, appWidgetId);
}
private static PendingIntent getLaunchPendingIntent(Context context, int appWidgetId,
int buttonId) {
Intent launchIntent = new Intent();
launchIntent.setClass(context, TorchWidgetProvider.class);
launchIntent.addCategory(Intent.CATEGORY_ALTERNATIVE);
launchIntent.setData(Uri.parse("custom:" + appWidgetId + "/" + buttonId));
PendingIntent pi = PendingIntent.getBroadcast(context, 0 /*
* no
* requestCode
*/, launchIntent, 0 /*
* no
* flags
*/);
return pi;
}
public void onReceive(Context context, Intent intent) {
super.onReceive(context, intent);
SharedPreferences mPrefs = PreferenceManager.getDefaultSharedPreferences(context);
if (intent.hasCategory(Intent.CATEGORY_ALTERNATIVE)) {
Uri data = intent.getData();
int buttonId;
int widgetId;
widgetId = Integer.parseInt(data.getSchemeSpecificPart().split("/")[0]);
buttonId = Integer.parseInt(data.getSchemeSpecificPart().split("/")[1]);
if (buttonId == 0) {
Intent pendingIntent = new Intent(TorchSwitch.TOGGLE_FLASHLIGHT);
pendingIntent.putExtra("bright",
mPrefs.getBoolean("widget_bright_" + widgetId, false));
pendingIntent.putExtra("strobe",
mPrefs.getBoolean("widget_strobe_" + widgetId, false));
pendingIntent.putExtra("period",
mPrefs.getInt("widget_strobe_freq_" + widgetId, 200));
context.sendBroadcast(pendingIntent);
}
try {
Thread.sleep(50);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
this.updateAllStates(context);
} else if (intent.getAction().equals(TorchSwitch.TORCH_STATE_CHANGED)) {
this.updateAllStates(context);
}
}
public void updateAllStates(Context context) {
final AppWidgetManager am = AppWidgetManager.getInstance(context);
int[] appWidgetIds = am.getAppWidgetIds(
new ComponentName(context, this.getClass()));
for (int appWidgetId : appWidgetIds)
this.updateState(context, appWidgetId);
}
public void updateState(Context context, int appWidgetId) {
RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget);
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
views.setOnClickPendingIntent(R.id.btn, getLaunchPendingIntent(context, appWidgetId, 0));
if ((Settings.System.getInt(context.getContentResolver(),
Settings.System.TORCH_STATE, 0) == 1)) {
views.setImageViewResource(R.id.img_torch, R.drawable.icon);
} else {
views.setImageViewResource(R.id.img_torch, R.drawable.widget_off);
}
if (prefs.getBoolean("widget_strobe_" + appWidgetId, false)) {
views.setTextViewText(R.id.ind, "Strobe");
} else if (prefs.getBoolean("widget_bright_" + appWidgetId, false)) {
views.setTextViewText(R.id.ind, "Bright");
} else {
views.setTextViewText(R.id.ind, "Torch");
}
final AppWidgetManager gm = AppWidgetManager.getInstance(context);
gm.updateAppWidget(appWidgetId, views);
}
}