package com.numix.calculator; import org.javia.arity.SyntaxException; 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.preference.PreferenceManager; import android.view.View; import android.widget.RemoteViews; import com.numix.calculator.BaseModule.Mode; public class CalculatorWidget extends AppWidgetProvider { public final static String PREFERENCE_WIDGET_PREAMBLE = "com.numix.calculator.CALC_WIDGET_VALUE_"; public static final String DIGIT_0 = "com.numix.calculator.0"; public static final String DIGIT_1 = "com.numix.calculator.1"; public static final String DIGIT_2 = "com.numix.calculator.2"; public static final String DIGIT_3 = "com.numix.calculator.3"; public static final String DIGIT_4 = "com.numix.calculator.4"; public static final String DIGIT_5 = "com.numix.calculator.5"; public static final String DIGIT_6 = "com.numix.calculator.6"; public static final String DIGIT_7 = "com.numix.calculator.7"; public static final String DIGIT_8 = "com.numix.calculator.8"; public static final String DIGIT_9 = "com.numix.calculator.9"; public static final String DOT = "com.numix.calculator.dot"; public static final String PLUS = "com.numix.calculator.plus"; public static final String MINUS = "com.numix.calculator.minus"; public static final String MUL = "com.numix.calculator.mul"; public static final String DIV = "com.numix.calculator.div"; public static final String EQUALS = "com.numix.calculator.equals"; public static final String CLR = "com.numix.calculator.clear"; public static final String DEL = "com.numix.calculator.delete"; public static final String SHOW_CLEAR = "com.numix.calculator.show_clear"; private boolean mClearText = false; @Override public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { for(int appWidgetID : appWidgetIds) { updateAppWidget(context, appWidgetManager, appWidgetID); } } @Override public void onReceive(Context context, Intent intent) { int appWidgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, 0); String value = getValue(context, appWidgetId); if(value.equals(context.getResources().getString(R.string.error))) value = ""; mClearText = intent.getBooleanExtra(SHOW_CLEAR, false); if(intent.getAction().equals(DIGIT_0)) { if(mClearText) { value = ""; mClearText = false; } value += "0"; } else if(intent.getAction().equals(DIGIT_1)) { if(mClearText) { value = ""; mClearText = false; } value += "1"; } else if(intent.getAction().equals(DIGIT_2)) { if(mClearText) { value = ""; mClearText = false; } value += "2"; } else if(intent.getAction().equals(DIGIT_3)) { if(mClearText) { value = ""; mClearText = false; } value += "3"; } else if(intent.getAction().equals(DIGIT_4)) { if(mClearText) { value = ""; mClearText = false; } value += "4"; } else if(intent.getAction().equals(DIGIT_5)) { if(mClearText) { value = ""; mClearText = false; } value += "5"; } else if(intent.getAction().equals(DIGIT_6)) { if(mClearText) { value = ""; mClearText = false; } value += "6"; } else if(intent.getAction().equals(DIGIT_7)) { if(mClearText) { value = ""; mClearText = false; } value += "7"; } else if(intent.getAction().equals(DIGIT_8)) { if(mClearText) { value = ""; mClearText = false; } value += "8"; } else if(intent.getAction().equals(DIGIT_9)) { if(mClearText) { value = ""; mClearText = false; } value += "9"; } else if(intent.getAction().equals(DOT)) { if(mClearText) { value = ""; mClearText = false; } value += context.getResources().getString(R.string.dot); } else if(intent.getAction().equals(DIV)) { value += context.getResources().getString(R.string.div); } else if(intent.getAction().equals(MUL)) { value += context.getResources().getString(R.string.mul); } else if(intent.getAction().equals(MINUS)) { value += context.getResources().getString(R.string.minus); } else if(intent.getAction().equals(PLUS)) { value += context.getResources().getString(R.string.plus); } else if(intent.getAction().equals(EQUALS)) { if(mClearText) { value = ""; mClearText = false; } else { mClearText = true; } final String input = value; if(input.isEmpty()) return; final Logic mLogic = new Logic(context, null, null); mLogic.setLineLength(7); try { value = mLogic.evaluate(input); } catch(SyntaxException e) { value = context.getResources().getString(R.string.error); } // Try to save it to history if(!value.equals(context.getResources().getString(R.string.error))) { final Persist persist = new Persist(context); persist.load(); if(persist.getMode() == null) persist.setMode(Mode.DECIMAL); final History history = persist.mHistory; history.enter(input, value); persist.save(); } } else if(intent.getAction().equals(CLR)) { value = ""; } else if(intent.getAction().equals(DEL)) { if(value.length() > 0) value = value.substring(0, value.length() - 1); } setValue(context, appWidgetId, value); AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context); int[] appWidgetIds = appWidgetManager.getAppWidgetIds(new ComponentName(context, CalculatorWidget.class)); for(int appWidgetID : appWidgetIds) { updateAppWidget(context, appWidgetManager, appWidgetID); } super.onReceive(context, intent); } private void updateAppWidget(Context context, AppWidgetManager appWidgetManager, int appWidgetId) { RemoteViews remoteViews = new RemoteViews(context.getPackageName(), CalculatorSettings.useLightTheme(context) ? R.layout.widget_light : R.layout.widget); String value = getValue(context, appWidgetId); int displayId = android.os.Build.VERSION.SDK_INT > android.os.Build.VERSION_CODES.JELLY_BEAN_MR1 ? R.id.display_long_clickable : R.id.display; remoteViews.setViewVisibility(displayId, View.VISIBLE); remoteViews.setTextViewText(displayId, value); remoteViews.setTextViewText(R.id.display, value); remoteViews.setViewVisibility(R.id.clear, mClearText ? View.VISIBLE : View.GONE); remoteViews.setViewVisibility(R.id.delete, mClearText ? View.GONE : View.VISIBLE); setOnClickListeners(context, appWidgetId, remoteViews); try { appWidgetManager.updateAppWidget(appWidgetId, remoteViews); } catch(Exception e) {} } private void setOnClickListeners(Context context, int appWidgetId, RemoteViews remoteViews) { final Intent intent = new Intent(context, CalculatorWidget.class); intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId); intent.putExtra(SHOW_CLEAR, mClearText); // The pending intent request code must be unique // Not just for these 17 buttons, but for each widget as well // Painful T_T Right? // So take the id and shift it over 5 bits (enough to store our 17 // values) int shiftedAppWidgetId = appWidgetId << 5; // And add our button values (0-16) intent.setAction(DIGIT_0); remoteViews.setOnClickPendingIntent(R.id.digit0, PendingIntent.getBroadcast(context, shiftedAppWidgetId + 0, intent, 0)); intent.setAction(DIGIT_1); remoteViews.setOnClickPendingIntent(R.id.digit1, PendingIntent.getBroadcast(context, shiftedAppWidgetId + 1, intent, 0)); intent.setAction(DIGIT_2); remoteViews.setOnClickPendingIntent(R.id.digit2, PendingIntent.getBroadcast(context, shiftedAppWidgetId + 2, intent, 0)); intent.setAction(DIGIT_3); remoteViews.setOnClickPendingIntent(R.id.digit3, PendingIntent.getBroadcast(context, shiftedAppWidgetId + 3, intent, 0)); intent.setAction(DIGIT_4); remoteViews.setOnClickPendingIntent(R.id.digit4, PendingIntent.getBroadcast(context, shiftedAppWidgetId + 4, intent, 0)); intent.setAction(DIGIT_5); remoteViews.setOnClickPendingIntent(R.id.digit5, PendingIntent.getBroadcast(context, shiftedAppWidgetId + 5, intent, 0)); intent.setAction(DIGIT_6); remoteViews.setOnClickPendingIntent(R.id.digit6, PendingIntent.getBroadcast(context, shiftedAppWidgetId + 6, intent, 0)); intent.setAction(DIGIT_7); remoteViews.setOnClickPendingIntent(R.id.digit7, PendingIntent.getBroadcast(context, shiftedAppWidgetId + 7, intent, 0)); intent.setAction(DIGIT_8); remoteViews.setOnClickPendingIntent(R.id.digit8, PendingIntent.getBroadcast(context, shiftedAppWidgetId + 8, intent, 0)); intent.setAction(DIGIT_9); remoteViews.setOnClickPendingIntent(R.id.digit9, PendingIntent.getBroadcast(context, shiftedAppWidgetId + 9, intent, 0)); intent.setAction(DOT); remoteViews.setOnClickPendingIntent(R.id.dot, PendingIntent.getBroadcast(context, shiftedAppWidgetId + 10, intent, 0)); intent.setAction(DIV); remoteViews.setOnClickPendingIntent(R.id.div, PendingIntent.getBroadcast(context, shiftedAppWidgetId + 11, intent, 0)); intent.setAction(MUL); remoteViews.setOnClickPendingIntent(R.id.mul, PendingIntent.getBroadcast(context, shiftedAppWidgetId + 12, intent, 0)); intent.setAction(MINUS); remoteViews.setOnClickPendingIntent(R.id.minus, PendingIntent.getBroadcast(context, shiftedAppWidgetId + 13, intent, 0)); intent.setAction(PLUS); remoteViews.setOnClickPendingIntent(R.id.plus, PendingIntent.getBroadcast(context, shiftedAppWidgetId + 14, intent, 0)); intent.setAction(EQUALS); remoteViews.setOnClickPendingIntent(R.id.equal, PendingIntent.getBroadcast(context, shiftedAppWidgetId + 15, intent, 0)); intent.setAction(CLR); remoteViews.setOnClickPendingIntent(R.id.clear, PendingIntent.getBroadcast(context, shiftedAppWidgetId + 16, intent, 0)); intent.setAction(DEL); remoteViews.setOnClickPendingIntent(R.id.delete, PendingIntent.getBroadcast(context, shiftedAppWidgetId + 17, intent, 0)); } private static String getValue(Context context, int appWidgetId) { return PreferenceManager.getDefaultSharedPreferences(context).getString(PREFERENCE_WIDGET_PREAMBLE + appWidgetId, ""); } private static void setValue(Context context, int appWidgetId, String newValue) { PreferenceManager.getDefaultSharedPreferences(context).edit().putString(PREFERENCE_WIDGET_PREAMBLE + appWidgetId, newValue).commit(); } }