Home | History | Annotate | Download | only in partnerwidget
      1 package com.google.android.leanbacklauncher.partnerwidget;
      2 
      3 import android.appwidget.AppWidgetManager;
      4 import android.appwidget.AppWidgetProvider;
      5 import android.content.ComponentName;
      6 import android.content.Context;
      7 import android.content.Intent;
      8 import android.net.ConnectivityManager;
      9 import android.net.NetworkInfo;
     10 import android.os.Bundle;
     11 import android.widget.RemoteViews;
     12 
     13 public class ClockWidgetProvider extends AppWidgetProvider {
     14 
     15     private static final String SHARED_PREFS = "widget-prefs";
     16     private static final int INET_CONDITION_THRESHOLD = 50;
     17     private static final String INET_CONDITION_ACTION = "android.net.conn.INET_CONDITION_ACTION";
     18     private static final String EXTRA_INET_CONDITION = "inetCondition";
     19 
     20     @Override
     21     public void onReceive(Context context, Intent intent) {
     22         String intentAction = intent.getAction();
     23 
     24         if (INET_CONDITION_ACTION.equals(intentAction) ||
     25                 ConnectivityManager.CONNECTIVITY_ACTION.equals(intentAction)) {
     26 
     27             if (INET_CONDITION_ACTION.equals(intentAction)) {
     28                 // a broadcast with this intent action is only fired when we are actually connected
     29                 // (i.e connectionStatus = 100).  So, clearing connectivity status when changing
     30                 // networks is required
     31                 int connectionStatus = intent.getIntExtra(EXTRA_INET_CONDITION, -551);
     32                 writeConnectivity(context, connectionStatus > INET_CONDITION_THRESHOLD);
     33             }
     34 
     35             update(context);
     36         }
     37 
     38         super.onReceive(context, intent);
     39     }
     40 
     41     @Override
     42     public void onAppWidgetOptionsChanged(Context context, AppWidgetManager appWidgetManager,
     43             int appWidgetId, Bundle newOptions) {
     44         update(context);
     45     }
     46 
     47     public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
     48         update(context);
     49         super.onUpdate(context, appWidgetManager, appWidgetIds);
     50     }
     51 
     52     private void update(Context context) {
     53         AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
     54         ComponentName thisWidget = new ComponentName(context, ClockWidgetProvider.class);
     55         appWidgetManager.updateAppWidget(thisWidget, getRemoteViews(context));
     56     }
     57 
     58     private RemoteViews getRemoteViews(Context context) {
     59         RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.clock_widget);
     60         remoteViews.setImageViewResource(R.id.connectivity_indicator, getConnectedResId(context));
     61 
     62         return remoteViews;
     63     }
     64 
     65     private static int getConnectedResId(Context context) {
     66         ConnectivityManager cm = (ConnectivityManager) context
     67                 .getSystemService(Context.CONNECTIVITY_SERVICE);
     68         NetworkInfo info = cm.getActiveNetworkInfo();
     69 
     70         int resId = 0;
     71         if (info == null || !info.isAvailable() || !info.isConnected()) {
     72             // can't have Internet access with no network
     73             writeConnectivity(context, false);
     74             resId = R.drawable.ic_widget_wifi_not_connected;
     75         } else if (!readConnectivity(context)) {
     76             resId = R.drawable.ic_widget_wifi_no_internet;
     77         } else {
     78             // internet is connected and working, show nothing
     79             resId = android.R.color.transparent;
     80         }
     81 
     82         return resId;
     83     }
     84 
     85     private static void writeConnectivity(Context context, boolean inetConnected) {
     86         context.getSharedPreferences(SHARED_PREFS, Context.MODE_PRIVATE).edit()
     87                 .putBoolean(EXTRA_INET_CONDITION, inetConnected).apply();
     88     }
     89 
     90     private static boolean readConnectivity(Context context) {
     91         return context.getSharedPreferences(SHARED_PREFS, Context.MODE_PRIVATE).getBoolean(
     92                 EXTRA_INET_CONDITION, true);
     93     }
     94 
     95 }
     96