blob: 77a285138ebe607486a1dc4c9ef9266ab2a3346d [file] [log] [blame]
package com.google.android.leanbacklauncher.partnerwidget;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.Bundle;
import android.widget.RemoteViews;
public class ClockWidgetProvider extends AppWidgetProvider {
private static final String SHARED_PREFS = "widget-prefs";
private static final int INET_CONDITION_THRESHOLD = 50;
private static final String INET_CONDITION_ACTION = "android.net.conn.INET_CONDITION_ACTION";
private static final String EXTRA_INET_CONDITION = "inetCondition";
@Override
public void onReceive(Context context, Intent intent) {
String intentAction = intent.getAction();
if (INET_CONDITION_ACTION.equals(intentAction) ||
ConnectivityManager.CONNECTIVITY_ACTION.equals(intentAction)) {
if (INET_CONDITION_ACTION.equals(intentAction)) {
// a broadcast with this intent action is only fired when we are actually connected
// (i.e connectionStatus = 100). So, clearing connectivity status when changing
// networks is required
int connectionStatus = intent.getIntExtra(EXTRA_INET_CONDITION, -551);
writeConnectivity(context, connectionStatus > INET_CONDITION_THRESHOLD);
}
update(context);
}
super.onReceive(context, intent);
}
@Override
public void onAppWidgetOptionsChanged(Context context, AppWidgetManager appWidgetManager,
int appWidgetId, Bundle newOptions) {
update(context);
}
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
update(context);
super.onUpdate(context, appWidgetManager, appWidgetIds);
}
private void update(Context context) {
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
ComponentName thisWidget = new ComponentName(context, ClockWidgetProvider.class);
appWidgetManager.updateAppWidget(thisWidget, getRemoteViews(context));
}
private RemoteViews getRemoteViews(Context context) {
RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.clock_widget);
remoteViews.setImageViewResource(R.id.connectivity_indicator, getConnectedResId(context));
return remoteViews;
}
private static int getConnectedResId(Context context) {
ConnectivityManager cm = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo info = cm.getActiveNetworkInfo();
int resId = 0;
if (info == null || !info.isAvailable() || !info.isConnected()) {
// can't have Internet access with no network
writeConnectivity(context, false);
resId = R.drawable.ic_widget_wifi_not_connected;
} else if (!readConnectivity(context)) {
resId = R.drawable.ic_widget_wifi_no_internet;
} else {
// internet is connected and working, show nothing
resId = android.R.color.transparent;
}
return resId;
}
private static void writeConnectivity(Context context, boolean inetConnected) {
context.getSharedPreferences(SHARED_PREFS, Context.MODE_PRIVATE).edit()
.putBoolean(EXTRA_INET_CONDITION, inetConnected).apply();
}
private static boolean readConnectivity(Context context) {
return context.getSharedPreferences(SHARED_PREFS, Context.MODE_PRIVATE).getBoolean(
EXTRA_INET_CONDITION, true);
}
}