package com.kedzie.vbox.widget;
import android.app.AlarmManager;
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.IntentFilter;
import android.content.SharedPreferences;
import android.os.Parcelable;
import android.support.v4.content.LocalBroadcastManager;
import android.util.Log;
import android.widget.RemoteViews;
import com.kedzie.vbox.R;
import com.kedzie.vbox.SettingsActivity;
import com.kedzie.vbox.VBoxApplication;
import com.kedzie.vbox.api.IMachine;
import com.kedzie.vbox.api.jaxb.VBoxEventType;
import com.kedzie.vbox.app.Utils;
import com.kedzie.vbox.machine.MachineActivity;
import com.kedzie.vbox.soap.VBoxSvc;
public class Provider extends AppWidgetProvider {
/** Widget update interval */
private static int UPDATE_INTERVAL;
private static final String TAG = "AppWidgetProvider";
private static final String PREFS_NAME = "com.kedzie.vbox.widget";
static final String KEY_IDREF = "_idRef";
static final String KEY_NAME = "_name";
static final String KEY_SERVER = "_server";
static final String KEY_VBOX = "_vbox";
static void savePref(Context context, int appWidgetId, String key, String value) {
SharedPreferences.Editor prefs = context.getSharedPreferences(PREFS_NAME, 0).edit();
prefs.putString(appWidgetId+key, value);
prefs.commit();
}
static void savePrefs(Context context, VBoxSvc vboxApi, IMachine machine, int appWidgetId) {
SharedPreferences.Editor prefs = context.getSharedPreferences(PREFS_NAME, 0).edit();
prefs.putString(appWidgetId+KEY_IDREF, machine.getIdRef());
prefs.putString(appWidgetId+KEY_VBOX, vboxApi.getVBox().getIdRef());
prefs.putString(appWidgetId+KEY_SERVER, vboxApi.getServer().getId().toString());
prefs.putString(appWidgetId+KEY_NAME, machine.getName());
prefs.commit();
Provider.updateAppWidget(context, appWidgetId, machine);
}
@Override
public void onDeleted(Context context, int[] appWidgetIds) {
SharedPreferences.Editor prefs = context.getSharedPreferences(PREFS_NAME, 0).edit();
prefs.remove(appWidgetIds[0]+KEY_NAME);
prefs.remove(appWidgetIds[0]+KEY_SERVER);
prefs.remove(appWidgetIds[0]+KEY_IDREF);
prefs.remove(appWidgetIds[0]+KEY_VBOX);
prefs.commit();
}
static String loadPref(Context context, int appWidgetId, String key) {
return context.getSharedPreferences(PREFS_NAME, 0).getString(appWidgetId + key, "");
}
static void updateAppWidget(Context context, int appWidgetId, IMachine vm) {
RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.appwidget_provider);
views.setImageViewResource(R.id.machine_list_item_ostype, VBoxApplication.getInstance().getOSDrawable(vm.getOSTypeId()));
views.setTextViewText(R.id.machine_list_item_name, vm.getName());
views.setTextViewText(R.id.machine_list_item_state_text, vm.getState().toString());
views.setImageViewResource(R.id.machine_list_item_state, VBoxApplication.getInstance().getDrawable(vm.getState()));
String snapshotText = vm.getCurrentSnapshot()!=null ?
String.format("(%1$s)%2$s", vm.getCurrentSnapshot().getName(), vm.getCurrentStateModified() ? "*" : "") : "";
views.setTextViewText(R.id.machine_list_item_snapshot, snapshotText);
views.setOnClickPendingIntent(R.id.machine_view, PendingIntent.getService(context, 0,
new Intent(context, MachineActivity.class).putExtra(IMachine.BUNDLE, vm).putExtra(VBoxSvc.BUNDLE, (Parcelable)vm.getAPI()), 0));
AppWidgetManager.getInstance(context).updateAppWidget(appWidgetId, views);
}
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {}
@Override
public void onEnabled(Context context) {
Log.d(TAG, "onEnabled");
UPDATE_INTERVAL = Utils.getIntPreference(context, SettingsActivity.PREF_WIDGET_INTERVAL);
getAlarmManager(context).setRepeating(AlarmManager.RTC, UPDATE_INTERVAL, UPDATE_INTERVAL, getBroadcastIntent(context));
LocalBroadcastManager.getInstance(context).registerReceiver(this, new IntentFilter(VBoxEventType.ON_MACHINE_STATE_CHANGED.name()));
}
@Override
public void onDisabled(Context context) {
Log.d(TAG, "onDisabled");
LocalBroadcastManager.getInstance(context).unregisterReceiver(this);
getAlarmManager(context).cancel(getBroadcastIntent(context));
}
@Override
public void onReceive(Context context, Intent intent) {
if(intent.getAction()==null || intent.getAction().equals(VBoxEventType.ON_MACHINE_STATE_CHANGED)) {
context.startService(new Intent(context, UpdateWidgetService.class).putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, getAppWidgetIds(context)));
int newInterval = Utils.getIntPreference(context, SettingsActivity.PREF_WIDGET_INTERVAL);
if(newInterval != UPDATE_INTERVAL) {
Log.i(TAG, "Changed widget update interval");
UPDATE_INTERVAL=newInterval;
AlarmManager alarmManager = getAlarmManager(context);
alarmManager.cancel(getBroadcastIntent(context));
alarmManager.setRepeating(AlarmManager.RTC, newInterval, newInterval, getBroadcastIntent(context));
}
} else
super.onReceive(context, intent);
}
private PendingIntent getBroadcastIntent(Context context) {
return PendingIntent.getBroadcast(context, 0, new Intent(context, Provider.class), 0);
}
private static int[] getAppWidgetIds(Context context) {
return AppWidgetManager.getInstance(context).getAppWidgetIds(new ComponentName(context, Provider.class));
}
private static AlarmManager getAlarmManager(Context context) {
return (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
}
}