package com.swisscom.safeconnect.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.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.util.TypedValue; import android.widget.RemoteViews; import com.swisscom.safeconnect.R; import com.swisscom.safeconnect.activity.DashboardActivity; import com.swisscom.safeconnect.activity.SplashActivity; import com.swisscom.safeconnect.backend.BackendConnector; import com.swisscom.safeconnect.model.PlumberSubscriptionResponse; import com.swisscom.safeconnect.utils.Config; import com.swisscom.safeconnect.utils.Fonts; /** * Created by cianci on 1/13/15. */ public abstract class PipeWidgetProvider extends AppWidgetProvider { protected static final String ACTION_START_BTN = "com.swisscom.safeconnect.ACTION_BTN"; protected static final String ACTION_START_APP = "com.swisscom.safeconnect.ACTION_START_APP"; protected AppWidgetManager mAppWidgetManager; protected RemoteViews mRemoteViews; protected int mWidgetId = 0; protected int mLayoutId; @Override public void onEnabled(Context context) { super.onEnabled(context); getSubscription(context); } @Override public void onUpdate(final Context context, final AppWidgetManager appWidgetManager, final int[] appWidgetIds) { Config.getInstance().init(context); //Get Subscription information getSubscription(context); for (int widgetId : appWidgetIds) { updateWidget(context, appWidgetManager, widgetId, true); } } @Override public void onReceive(final Context context, final Intent intent) { final String action = intent.getAction(); Config.getInstance().init(context); if (ACTION_START_BTN.equals(action)) { startAction(context); } else if (ACTION_START_APP.equals(action)) { openApp(context); } else if (Config.VPN_CONNECT.equals(action) || Config.UPDATE_INCIDENTS.equals(action) || Config.UPDATE_SUBSCRIPTION.equals(action)) { boolean refreshData = intent.getBooleanExtra(ConnectVpnActivity.KEY_REFRESH_DATA, true); doUpdate(context, refreshData); } else { super.onReceive(context, intent); } } protected void doUpdate(Context ctx, boolean refreshData){ ComponentName name = new ComponentName(ctx, this.getClass()); AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(ctx); int [] ids = appWidgetManager.getAppWidgetIds(name); getSubscription(ctx); for (int i = 0; i < ids.length; i++) { updateWidget(ctx, appWidgetManager, ids[i], refreshData); } } private void startAction(Context context) { //if safe connect is not configured, just open the app if (Config.getInstance().getAuthToken().isEmpty()) { openApp(context); } //no subscription available - open subscription view else if (Config.getInstance().getSubscriptionValidTill() * 1000 <= System.currentTimeMillis()) { openSubscriptions(context); } else { Intent vpnActivityIntent = new Intent(context, ConnectVpnActivity.class); vpnActivityIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); context.startActivity(vpnActivityIntent); } } private void openApp(Context context){ Intent vpnActivityIntent = new Intent(context, SplashActivity.class); vpnActivityIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(vpnActivityIntent); } private void openSubscriptions(Context context){ Intent vpnActivityIntent = new Intent(context, DashboardActivity.class); vpnActivityIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); vpnActivityIntent.putExtra(DashboardActivity.KEY_OPEN_SUBSCRIPTIONS, true); context.startActivity(vpnActivityIntent); } /** * Creates and returns a new bitmap containing the given text. */ public static Bitmap createTextBitmap(Context context, final String text, final float fontSizeSP, int maxWidth) { int fontSizePX = convertDiptoPix(context, fontSizeSP); int pad = (fontSizePX / 9); Paint paint = getPaint(fontSizePX); String[] lines = text.split("\n"); int yOffset = 0; int lineHeight = (int) (fontSizePX * 1.1); int totHeight = (int) (fontSizePX * 1.1) * lines.length; Bitmap bitmap = Bitmap.createBitmap(maxWidth, totHeight, Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(bitmap); for (int i = 0; i < lines.length; ++i) { int tWidth = (int) (paint.measureText(lines[i]) + pad * 2); float xPos = (maxWidth-tWidth)/2; canvas.drawText(lines[i], xPos, fontSizePX + yOffset, paint); yOffset = yOffset + lineHeight; } return bitmap; } public static int findMaxWidth(Context ctx, String text, String deli, float fontSizeSP){ int res = 0; int fontSizePX = convertDiptoPix(ctx, fontSizeSP); int pad = (fontSizePX / 9); Paint paint = getPaint(fontSizePX); String[] words = text.split(deli); for (int i = 0; i < words.length; i++){ int width = (int) (paint.measureText(words[i]) + pad * 2); if (width > res) { res = width; } } return res; } private static int convertDiptoPix(Context context, float dip) { int value = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dip, context.getResources().getDisplayMetrics()); return value; } private static Paint getPaint(float fontSizePX) { Paint paint = new Paint(); paint.setAntiAlias(true); paint.setTypeface(Fonts.FONT_NORMAL); paint.setColor(Color.WHITE); paint.setTextSize(fontSizePX); return paint; } private void getSubscription(Context context) { new BackendConnector(context).getOwnSubscription(Config.getInstance().getPhoneNumber(), Config.getInstance().getDeviceId(), new BackendConnector.ResponseCallback<PlumberSubscriptionResponse>() { @Override public void onRequestComplete(int statusCode, PlumberSubscriptionResponse result) { if (statusCode == 200) { Config.getInstance().setSubscriptionValidTill(result.getValidTill()); } } }); } protected void getWidgetData(final Context context, final AppWidgetManager appWidgetManager, final int widgetId) { mAppWidgetManager = appWidgetManager; mWidgetId = widgetId; mRemoteViews = new RemoteViews(context.getPackageName(), mLayoutId); } protected void updateCommonPart(final Context context){ //vpn button or vpn icon final PendingIntent piStartVpn = PendingIntent.getBroadcast(context, 0, new Intent(context, MalwareStatsWidget.class).setAction(ACTION_START_BTN), 0); mRemoteViews.setOnClickPendingIntent(R.id.startVPN, piStartVpn); mRemoteViews.setOnClickPendingIntent(R.id.iv_icon, piStartVpn); updateToggle(); } protected void updateToggle() { //Update widget status switch (Config.getInstance().getVpnState()) { case CONNECTED: mRemoteViews.setImageViewResource(R.id.startVPN, R.drawable.ic_widget_toggle_on); break; case DISABLED: mRemoteViews.setImageViewResource(R.id.startVPN, R.drawable.ic_widget_toggle_off); break; default: mRemoteViews.setImageViewResource(R.id.startVPN, R.drawable.ic_widget_toggle_waiting); } } /** * Updates single App Widget * * @param context {@link android.content.Context} * @param appWidgetManager {@link android.appwidget.AppWidgetManager} * @param widgetId of current widget */ protected abstract void updateWidget(final Context context, final AppWidgetManager appWidgetManager, final int widgetId, final boolean refreshData); }