package de.fun2code.android.piratebox.widget; 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.widget.RemoteViews; import de.fun2code.android.piratebox.PirateBoxService; import de.fun2code.android.piratebox.R; public class PirateBoxWidget extends AppWidgetProvider { public static final String WIDGET_INTENT_UPDATE = "de.fun2code.android.pawserver.widget.intent.update"; public static final String WIDGET_INTENT_CLICKED = "de.fun2code.android.piratebox.widget.intent.clicked"; @Override public void onReceive(Context context, Intent intent) { AppWidgetManager manager = AppWidgetManager.getInstance(context); int[] widgetIds = manager.getAppWidgetIds(new ComponentName(context, PirateBoxWidget.class)); if(intent.getAction().equals(WIDGET_INTENT_CLICKED)) { Intent serviceIntent = new Intent(context, PirateBoxService.class); boolean serverRunning = PirateBoxService.isRunning(); boolean startingUp = PirateBoxService.isStartingUp(); // Only start if not running an not starting up if(!serverRunning && !startingUp) { showIntermediateImage(context); context.startService(serviceIntent); } // Only stop service, if service is running else if(serverRunning) { showIntermediateImage(context); context.stopService(serviceIntent); } } else { showWidget(context, manager, widgetIds, PirateBoxService.isRunning()); } } /** * Shows the intermediate image * * @param context Context to use */ private void showIntermediateImage(Context context) { AppWidgetManager manager = AppWidgetManager.getInstance(context); int[] widgetIds = manager.getAppWidgetIds(new ComponentName(context, PirateBoxWidget.class)); // Set intermediate image RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget_layout); views.setImageViewResource(R.id.widgetCanvas, R.drawable.widget_limbo); manager.updateAppWidget(widgetIds, views); } @Override public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] ints) { showWidget(context, appWidgetManager, ints, PirateBoxService.isRunning()); } private void showWidget(Context context, AppWidgetManager manager, int[] widgetIds, boolean status) { RemoteViews views = createRemoteViews(context, status); manager.updateAppWidget(widgetIds, views); } private RemoteViews createRemoteViews(Context context, boolean status) { RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget_layout); int iconId = status ? R.drawable.widget_on : R.drawable.widget_off; views.setImageViewResource(R.id.widgetCanvas, iconId); Intent msg = new Intent(WIDGET_INTENT_CLICKED); PendingIntent intent = PendingIntent.getBroadcast(context, -1 /*not used*/, msg, PendingIntent.FLAG_UPDATE_CURRENT); views.setOnClickPendingIntent(R.id.widgetCanvas, intent); return views; } }