package it.angelic.soulissclient; import android.app.Activity; 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.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Typeface; import android.net.Uri; import android.os.Handler; import android.os.Looper; import android.support.annotation.NonNull; import android.util.Log; import android.widget.RemoteViews; import it.angelic.soulissclient.helpers.SoulissPreferenceHelper; import it.angelic.soulissclient.model.ISoulissTypicalSensor; import it.angelic.soulissclient.model.SoulissCommand; import it.angelic.soulissclient.model.SoulissScene; import it.angelic.soulissclient.model.SoulissTypical; import it.angelic.soulissclient.model.db.SoulissCommandDTO; import it.angelic.soulissclient.model.db.SoulissDBHelper; import it.angelic.soulissclient.net.UDPHelper; import it.angelic.soulissclient.util.FontAwesomeUtil; import it.angelic.tagviewlib.SimpleTagViewUtils; public class SoulissWidget extends AppWidgetProvider { private static final String TAG = "SoulissWidget"; private SoulissPreferenceHelper opzioni; /** * Chiamato per refresh del widget, anche dalla rete (stateresponse e pollResponse) * * @param context * @param appWidgetManager * @param appWidgetId */ public static void forcedUpdate(Context context, AppWidgetManager appWidgetManager, int appWidgetId) { SharedPreferences customSharedPreference = context.getSharedPreferences("SoulissWidgetPrefs", Activity.MODE_PRIVATE); Log.w(TAG, "forcedUpdate for widgetId:" + appWidgetId); final int node = customSharedPreference.getInt(appWidgetId + "_NODE", -3); final int slot = customSharedPreference.getInt(appWidgetId + "_SLOT", -3); final long cmd = customSharedPreference.getLong(appWidgetId + "_CMD", -3); final Integer fontCode = customSharedPreference.getInt(appWidgetId + "_FONTCODE", FontAwesomeUtil.getCodeIndexByFontName(context, "fa-cube")); final String name = customSharedPreference.getString(appWidgetId + "_NAME", ""); if (node == -3) { Log.e(TAG, "missing widget preferences, aborting"); return; } RemoteViews updateViews = new RemoteViews(context.getPackageName(), R.layout.widget_layout); SoulissDBHelper db = new SoulissDBHelper(context); SoulissDBHelper.open(); if (node > Constants.MASSIVE_NODE_ID) { try { final SoulissTypical tgt = db.getTypical(node, (short) slot); updateViews.setTextViewText(R.id.button1, tgt.getNiceName()); if (tgt instanceof ISoulissTypicalSensor) { updateViews.setTextViewText(R.id.wid_info, tgt.getOutputDesc() + " - " + ((ISoulissTypicalSensor) tgt).getTypedOutputValue()); } else updateViews.setTextViewText(R.id.wid_info, (tgt.getOutputDesc())); } catch (Exception ee) { updateViews.setTextViewText(R.id.button1, name); updateViews.setTextViewText(R.id.wid_info, context.getString(R.string.widget_cantsave)); } updateViews.setTextViewText(R.id.wid_node, context.getString(R.string.node) + " " + node); updateViews.setTextViewText(R.id.wid_typical, context.getString(R.string.slot) + " " + slot); updateViews.setImageViewBitmap(R.id.widget_awesome, buildFABitmap(fontCode, context)); } else if (node == Constants.MASSIVE_NODE_ID) { //final SoulissTypical tgt = db.getTypical(node, (short) slot); updateViews.setTextViewText(R.id.wid_node, context.getString(R.string.allnodes)); updateViews.setTextViewText(R.id.wid_typical, context.getString(R.string.typical) + " " + slot); updateViews.setTextViewText(R.id.wid_info, context.getString(R.string.scene_cmd_massive)); updateViews.setImageViewBitmap(R.id.widget_awesome, buildFABitmap(FontAwesomeUtil.getCodeIndexByFontName(context, "fa-arrows-alt"), context)); updateViews.setTextViewText(R.id.button1, name); } else if (node == Constants.COMMAND_FAKE_SCENE) { final SoulissScene tgt = db.getScene((short) slot); updateViews.setTextViewText(R.id.wid_node, context.getString(R.string.scene)); updateViews.setTextViewText(R.id.wid_typical, ""); updateViews.setTextViewText(R.id.wid_info, context.getString(R.string.execute)); updateViews.setImageViewBitmap(R.id.widget_awesome, buildFABitmap(FontAwesomeUtil.getCodeIndexByFontName(context, "fa-moon-o"), context)); if (!name.equals("")) updateViews.setTextViewText(R.id.button1, name); else updateViews.setTextViewText(R.id.button1, tgt.getNiceName()); } // UPDATE SINCRONO Intent intent = new Intent(context, SoulissWidget.class); intent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE); Uri data = Uri.withAppendedPath(Uri.parse("W://widget/id/"), String.valueOf(appWidgetId)); intent.setData(data); intent.putExtra("_ID", appWidgetId); PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); updateViews.setOnClickPendingIntent(R.id.button1, pendingIntent); Log.i(TAG, "calling updateAppWidget for widgetId:" + appWidgetId); appWidgetManager.updateAppWidget(appWidgetId, updateViews); // Toast.makeText(context, "forcedUpdate(), node " + // String.valueOf(node), Toast.LENGTH_LONG).show(); } static Bitmap buildFABitmap(Integer fontIndex, Context ctx) { Bitmap myBitmap = Bitmap.createBitmap(160, 84, Bitmap.Config.ARGB_4444); Canvas myCanvas = new Canvas(myBitmap); Paint paint = new Paint(); Typeface clock = FontAwesomeUtil.getAwesomeTypeface(ctx); paint.setAntiAlias(true); paint.setSubpixelText(true); paint.setTypeface(clock); paint.setStyle(Paint.Style.FILL); paint.setColor(Color.WHITE); paint.setTextSize(65); paint.setTextAlign(Paint.Align.CENTER); myCanvas.drawText(SimpleTagViewUtils.getAwesomeCodes(ctx).get(fontIndex), 80, 60, paint); return myBitmap; } @Override public void onReceive(@NonNull final Context context, final Intent intent) { SharedPreferences customSharedPreference = context.getSharedPreferences("SoulissWidgetPrefs", Activity.MODE_PRIVATE); opzioni = new SoulissPreferenceHelper(context); Handler handler = new Handler(); super.onReceive(context, intent); final AppWidgetManager awm = AppWidgetManager.getInstance(context); final int got = intent.getIntExtra("_ID", -1); Log.w(TAG, "widget onReceive() from id:" + got); if (got != -1) { Log.w("SoulissWidget", "PRESS"); final short node = (short) customSharedPreference.getInt(got + "_NODE", -3); final short slot = (short) customSharedPreference.getInt(got + "_SLOT", -3); final long cmd = customSharedPreference.getLong(got + "_CMD", -3); final String name = customSharedPreference.getString(got + "_NAME", ""); final Integer fontCode = customSharedPreference.getInt(got + "_FONTCODE", FontAwesomeUtil.getCodeIndexByFontName(context, "fa-cube")); final RemoteViews updateViews = new RemoteViews(context.getPackageName(), R.layout.widget_layout); // sfondo rosso... if (cmd != -3) { updateViews.setTextViewText(R.id.button1, "Sending command..."); } // updateViews.setInt(R.id.widgetcontainer, "setBackgroundResource", R.drawable.widget_shape_active); //updateViews.setTextViewText(R.id.wid_node, context.getString(R.string.node) + " " + node); //updateViews.setTextViewText(R.id.wid_typical, context.getString(R.string.slot) + " " + slot); // UPDATE SINCRONO intent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE); intent.putExtra("_ID", got); Uri data = Uri.withAppendedPath(Uri.parse("W://widget/id/"), String.valueOf(got)); intent.setData(data); PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); updateViews.setOnClickPendingIntent(R.id.button1, pendingIntent); awm.updateAppWidget(got, updateViews); new Thread(new Runnable() { private SoulissDBHelper db; @Override public void run() { Looper.prepare(); db = new SoulissDBHelper(context); SoulissDBHelper.open(); if (node > Constants.MASSIVE_NODE_ID) { final SoulissTypical tgt = db.getTypical(node, slot); UDPHelper.pollRequest(opzioni, 1, tgt.getNodeId()); final SoulissCommand cmdd = new SoulissCommand(tgt); cmdd.setCommand(cmd); // se comando non vuoto if (cmd != -3) { cmdd.execute(); } } else if (node == Constants.MASSIVE_NODE_ID) { SoulissCommandDTO dto = new SoulissCommandDTO(); UDPHelper.pollRequest(opzioni, db.countNodes(), 0); dto.setNodeId(node); dto.setSlot(slot); if (cmd != -3) { dto.setCommand(cmd); SoulissCommand cmdd = new SoulissCommand(context, dto); cmdd.execute(); } } else if (node == Constants.COMMAND_FAKE_SCENE) { SoulissScene targrt = db.getScene(slot); targrt.execute(); UDPHelper.pollRequest(opzioni, db.countNodes(), 0); } } }).start(); } } @Override public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { Log.w(TAG, "widget onUpdate for " + appWidgetIds.length + " widgets"); super.onUpdate(context, appWidgetManager, appWidgetIds); ComponentName thisWidget = new ComponentName(context, SoulissWidget.class); int[] allWidgetIds = appWidgetManager.getAppWidgetIds(thisWidget); for (int widgetId : allWidgetIds) { forcedUpdate(context, appWidgetManager, widgetId); } } }