/*
* Copyright 2011 Artiom Chilaru (http://flexlabs.org)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.flexlabs.widgets.dualbattery;
import android.app.PendingIntent;
import android.appwidget.AppWidgetManager;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.os.BatteryManager;
import android.view.View;
import android.widget.RemoteViews;
import org.flexlabs.widgets.dualbattery.widgetsettings.WidgetActivity;
import org.flexlabs.widgets.dualbattery.widgetsettings.WidgetSettingsContainer;
public class BatteryWidgetUpdater {
// Suppress default constructor for non-instantiability
private BatteryWidgetUpdater() {
throw new AssertionError();
}
public static void updateAllWidgets(Context context, BatteryLevel level, int[] widgets) {
// Get all "running" widgets
AppWidgetManager manager = AppWidgetManager.getInstance(context);
if (widgets == null) {
int[] widgets1 = manager.getAppWidgetIds(new ComponentName(context, BatteryWidget.class));
int[] widgets2 = manager.getAppWidgetIds(new ComponentName(context, BatteryWidget1x1.class));
int[] widgets3 = manager.getAppWidgetIds(new ComponentName(context, BatteryWidget2x2.class));
int[] widgets4 = manager.getAppWidgetIds(new ComponentName(context, BatteryWidget3x4.class));
widgets = new int[widgets1.length + widgets2.length + widgets3.length];
System.arraycopy(widgets1, 0, widgets, 0, widgets1.length);
System.arraycopy(widgets2, 0, widgets, widgets1.length, widgets2.length);
System.arraycopy(widgets3, 0, widgets, widgets1.length + widgets2.length, widgets3.length);
System.arraycopy(widgets4, 0, widgets, widgets1.length + widgets2.length + widgets3.length, widgets4.length);
}
for (int widgetId : widgets) {
updateWidget(context, manager, widgetId, level);
}
}
private static final int[][] textStyleArray = new int[][]
{
new int[] { // textpos: top = 0,
R.id.statusWhiteTop, // color: white = 1
R.id.statusDarkTop, // color: dark = 0
},
new int[] { // textpos: middle = 1
R.id.statusWhiteMiddle,
R.id.statusDarkMiddle,
},
new int[] { // textpos: bottom = 2
R.id.statusWhiteBottom,
R.id.statusDarkBottom,
},
new int[] { // textpos: above = 4
R.id.batteryLabel_top,
R.id.batteryLabel_top_dark,
},
new int[] { // textpos: below = 5
R.id.batteryLabel_bottom,
R.id.batteryLabel_bottom_dark,
}
};
public static void updateWidget(final Context context, final int widgetId) {
new Thread(new Runnable() {
@Override
public void run() {
updateWidget(context, AppWidgetManager.getInstance(context), widgetId, BatteryLevel.getCurrent());
}
}).start();
}
private static void updateWidget(Context context, AppWidgetManager widgetManager, int widgetId, BatteryLevel batteryLevel) {
if (batteryLevel == null)
return;
WidgetSettingsContainer settings = new WidgetSettingsContainer(context, widgetId);
RemoteViews views = new RemoteViews(context.getPackageName(), settings.getTheme().equals(Constants.SETTING_THEME_DEFAULT) ? R.layout.widget : R.layout.widget_90deg);
views.removeAllViews(R.id.widget);
// This is here just for the screenshots ;)
//BatteryApplication.batteryTab = 15;
//BatteryApplication.batteryDock = null;
//BatteryApplication.batteryTab = 86;
//BatteryApplication.status = BatteryManager.BATTERY_STATUS_CHARGING;
//BatteryApplication.batteryDock = 30;
RemoteViews viewsBattery = null, viewsDock = null;
if ((settings.getBatterySelection() & Constants.BATTERY_SELECTION_MAIN) > 0) {
String status = String.valueOf(batteryLevel.get_level()) + "%";
if (settings.getTextPosition() <= Constants.TEXT_POS_BOTTOM)
status = "\n" + status + "\n";
viewsBattery = loadBatteryView(
context, settings, R.string.battery_main, status, batteryLevel.get_level(),
false, batteryLevel.get_status() == BatteryManager.BATTERY_STATUS_CHARGING);
}
if (batteryLevel.is_dockFriendly() &&
(batteryLevel.is_dockConnected() || settings.isAlwaysShow()) &&
((settings.getBatterySelection() & Constants.BATTERY_SELECTION_DOCK) > 0)) {
Integer dockLevel = batteryLevel.get_dock_level();
if (dockLevel == null && settings.isShowOldStatus())
dockLevel = BatteryLevel.lastDockLevel;
String status = "n/a";
if (dockLevel != null) {
status = dockLevel.toString() + "%";
} else if (batteryLevel.get_dock_status() == Constants.DOCK_STATE_UNDOCKED) {
status = settings.isShowNotDocked() ? context.getString(R.string.undocked) : "";
}
if (settings.getTextPosition() <= Constants.TEXT_POS_BOTTOM)
status = "\n" + status + "\n";
viewsDock = loadBatteryView(
context, settings, R.string.battery_dock, status, dockLevel,
batteryLevel.get_dock_level() == null,
batteryLevel.get_dock_status() == Constants.DOCK_STATE_CHARGING);
}
if (settings.isSwapBatteries()) {
if (viewsBattery != null)
views.addView(R.id.widget, viewsBattery);
if (viewsDock != null)
views.addView(R.id.widget, viewsDock);
} else {
if (viewsDock != null)
views.addView(R.id.widget, viewsDock);
if (viewsBattery != null)
views.addView(R.id.widget, viewsBattery);
}
Intent intent = new Intent(context, WidgetActivity.class);
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, widgetId);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
PendingIntent pendingIntent = PendingIntent.getActivity(context, widgetId, intent, PendingIntent.FLAG_UPDATE_CURRENT);
views.setOnClickPendingIntent(R.id.widget, pendingIntent);
widgetManager.updateAppWidget(widgetId, views);
}
private static RemoteViews loadBatteryView(Context context, WidgetSettingsContainer settings, int label, String status, Integer level, boolean disabled, boolean charging) {
RemoteViews views = new RemoteViews(context.getPackageName(), settings.getTheme().equals(Constants.SETTING_THEME_DEFAULT) ? R.layout.widget_battery : R.layout.widget_battery_90deg);
for (int[] aTextStyleArray : textStyleArray)
for (int bTextStyleArray : aTextStyleArray) {
views.setTextViewText(bTextStyleArray, null);
views.setViewVisibility(bTextStyleArray, View.GONE);
}
if ((settings.getMargin() & Constants.MARGIN_TOP) > 0) {
int id = textStyleArray[Constants.TEXT_POS_ABOVE - 1][settings.getTextColorCode()];
views.setViewVisibility(id, View.VISIBLE);
views.setFloat(id, "setTextSize", settings.getTextSize());
views.setTextViewText(id, " ");
}
if ((settings.getMargin() & Constants.MARGIN_BOTTOM) > 0 || settings.isShowLabel()) {
int id = textStyleArray[Constants.TEXT_POS_BELOW - 1][settings.getTextColorCode()];
views.setViewVisibility(id, View.VISIBLE);
views.setFloat(id, "setTextSize", settings.getTextSize());
views.setTextViewText(id, settings.isShowLabel() ? context.getString(label) : " ");
}
if (settings.getTextPosition() > 0) {
int textStatus = textStyleArray[settings.getTextPosition() - 1][settings.getTextColorCode()];
views.setViewVisibility(textStatus, View.VISIBLE);
views.setFloat(textStatus, "setTextSize", settings.getTextSize());
views.setTextViewText(textStatus, status);
}
views.setInt(R.id.battery, "setImageLevel", (level != null ? level : 0) + (disabled ? 200 : 0));
views.setViewVisibility(R.id.batteryCharging, charging ? View.VISIBLE : View.GONE);
return views;
}
}