Fixed an android 2.1 widget bug by using multiple layouts. Better solution?

pull/14/head
Sam Bosley 13 years ago
parent f8e11cde0f
commit b65d12fb3e

@ -0,0 +1,55 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/widget"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
android:background="@android:color/transparent">
<LinearLayout
android:id="@+id/widget_header"
android:layout_width="150dip"
android:layout_height="39dip"
android:orientation="horizontal"
android:padding="3dp"
android:background="@color/widget_header_dark">
<TextView
android:id="@+id/widget_title"
android:layout_width="fill_parent"
android:layout_height="39dip"
android:layout_gravity="left|center_vertical"
android:paddingLeft="2dip"
android:textColor="@color/widget_text_color_light"
android:textSize="16sp"
android:textStyle="bold"
android:maxLines="2"
android:layout_weight="1"
android:gravity="left|center_vertical"
android:ellipsize="end" />
<ImageButton
android:id="@+id/widget_button"
android:layout_width="33dip"
android:layout_height="39dip"
android:layout_gravity="right|center_vertical"
android:background="@android:color/transparent"
android:src="@drawable/plus_button_dark_blue"
android:scaleType="fitCenter"/>
</LinearLayout>
<ImageView
android:id="@+id/widget_header_separator"
android:layout_width="fill_parent"
android:layout_height="1px"
android:background="@color/dark_blue_theme_color"/>
<LinearLayout android:id="@+id/taskbody"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@color/widget_body_dark"
android:orientation="vertical">
</LinearLayout>
</LinearLayout>

@ -0,0 +1,55 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/widget"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
android:background="@android:color/transparent">
<LinearLayout
android:id="@+id/widget_header"
android:layout_width="150dip"
android:layout_height="39dip"
android:orientation="horizontal"
android:padding="3dp"
android:background="@android:color/transparent">
<TextView
android:id="@+id/widget_title"
android:layout_width="fill_parent"
android:layout_height="39dip"
android:layout_gravity="left|center_vertical"
android:paddingLeft="2dip"
android:textColor="@color/widget_text_color_light"
android:textSize="16sp"
android:textStyle="bold"
android:maxLines="2"
android:layout_weight="1"
android:gravity="left|center_vertical"
android:ellipsize="end" />
<ImageButton
android:id="@+id/widget_button"
android:layout_width="33dip"
android:layout_height="39dip"
android:layout_gravity="right|center_vertical"
android:background="@android:color/transparent"
android:src="@drawable/plus_button_dark_blue"
android:scaleType="fitCenter"/>
</LinearLayout>
<ImageView
android:id="@+id/widget_header_separator"
android:layout_width="fill_parent"
android:layout_height="1px"
android:background="@color/dark_blue_theme_color"/>
<LinearLayout android:id="@+id/taskbody"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@android:color/transparent"
android:orientation="vertical">
</LinearLayout>
</LinearLayout>

@ -0,0 +1,55 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/widget"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
android:background="@android:color/transparent">
<LinearLayout
android:id="@+id/widget_header"
android:layout_width="150dip"
android:layout_height="39dip"
android:orientation="horizontal"
android:padding="3dp"
android:background="@drawable/widget_header_legacy">
<TextView
android:id="@+id/widget_title"
android:layout_width="fill_parent"
android:layout_height="39dip"
android:layout_gravity="left|center_vertical"
android:paddingLeft="2dip"
android:textColor="@color/widget_text_color_light"
android:textSize="16sp"
android:textStyle="bold"
android:maxLines="2"
android:layout_weight="1"
android:gravity="left|center_vertical"
android:ellipsize="end" />
<ImageButton
android:id="@+id/widget_button"
android:layout_width="33dip"
android:layout_height="39dip"
android:layout_gravity="right|center_vertical"
android:background="@android:color/transparent"
android:src="@drawable/plus_button_dark_blue"
android:scaleType="fitCenter"/>
</LinearLayout>
<ImageView
android:id="@+id/widget_header_separator"
android:layout_width="fill_parent"
android:layout_height="1px"
android:background="@color/dark_blue_theme_color"/>
<LinearLayout android:id="@+id/taskbody"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@color/widget_body_legacy"
android:orientation="vertical">
</LinearLayout>
</LinearLayout>

@ -0,0 +1,55 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/widget"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
android:background="@android:color/transparent">
<LinearLayout
android:id="@+id/widget_header"
android:layout_width="150dip"
android:layout_height="39dip"
android:orientation="horizontal"
android:padding="3dp"
android:background="@color/widget_header_light">
<TextView
android:id="@+id/widget_title"
android:layout_width="fill_parent"
android:layout_height="39dip"
android:layout_gravity="left|center_vertical"
android:paddingLeft="2dip"
android:textColor="@color/widget_text_color_light"
android:textSize="16sp"
android:textStyle="bold"
android:maxLines="2"
android:layout_weight="1"
android:gravity="left|center_vertical"
android:ellipsize="end" />
<ImageButton
android:id="@+id/widget_button"
android:layout_width="33dip"
android:layout_height="39dip"
android:layout_gravity="right|center_vertical"
android:background="@android:color/transparent"
android:src="@drawable/plus_button_dark_blue"
android:scaleType="fitCenter"/>
</LinearLayout>
<ImageView
android:id="@+id/widget_header_separator"
android:layout_width="fill_parent"
android:layout_height="1px"
android:background="@color/red_theme_color"/>
<LinearLayout android:id="@+id/taskbody"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@color/widget_body_light"
android:orientation="vertical">
</LinearLayout>
</LinearLayout>

@ -0,0 +1,55 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/widget"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
android:background="@android:color/transparent">
<LinearLayout
android:id="@+id/widget_header"
android:layout_width="150dip"
android:layout_height="39dip"
android:orientation="horizontal"
android:padding="3dp"
android:background="@android:color/transparent">
<TextView
android:id="@+id/widget_title"
android:layout_width="fill_parent"
android:layout_height="39dip"
android:layout_gravity="left|center_vertical"
android:paddingLeft="2dip"
android:textColor="@color/widget_text_color_light"
android:textSize="16sp"
android:textStyle="bold"
android:maxLines="2"
android:layout_weight="1"
android:gravity="left|center_vertical"
android:ellipsize="end" />
<ImageButton
android:id="@+id/widget_button"
android:layout_width="33dip"
android:layout_height="39dip"
android:layout_gravity="right|center_vertical"
android:background="@android:color/transparent"
android:src="@drawable/plus_button_dark_blue"
android:scaleType="fitCenter"/>
</LinearLayout>
<ImageView
android:id="@+id/widget_header_separator"
android:layout_width="fill_parent"
android:layout_height="1px"
android:background="@color/dark_blue_theme_color"/>
<LinearLayout android:id="@+id/taskbody"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@android:color/transparent"
android:orientation="vertical">
</LinearLayout>
</LinearLayout>

@ -95,7 +95,7 @@ public class TasksWidget extends AppWidgetProvider {
public static class WidgetUpdateService extends Service { public static class WidgetUpdateService extends Service {
public static String EXTRA_WIDGET_ID = "widget_id"; //$NON-NLS-1$ public static final String EXTRA_WIDGET_ID = "widget_id"; //$NON-NLS-1$
@Autowired @Autowired
Database database; Database database;
@ -145,12 +145,7 @@ public class TasksWidget extends AppWidgetProvider {
public RemoteViews buildUpdate(Context context, int widgetId) { public RemoteViews buildUpdate(Context context, int widgetId) {
DependencyInjectionService.getInstance().inject(this); DependencyInjectionService.getInstance().inject(this);
RemoteViews views = null; RemoteViews views = getThemedRemoteViews(context);
views = new RemoteViews(context.getPackageName(),
R.layout.widget_initialized);
applyThemeToWidget(views);
int numberOfTasks = getNumberOfTasks(); int numberOfTasks = getNumberOfTasks();
@ -272,54 +267,50 @@ public class TasksWidget extends AppWidgetProvider {
return theme == THEME_LEGACY; return theme == THEME_LEGACY;
} }
/**
* The reason we use a bunch of different but almost identical layouts is that there is a bug with
* Android 2.1 (level 7) that doesn't allow setting backgrounds on remote views. I know it's lame,
* but I didn't see a better solution. Alternatively, we could disallow theming widgets on
* Android 2.1.
* @param context
* @return
*/
@SuppressWarnings("nls") @SuppressWarnings("nls")
private void applyThemeToWidget(RemoteViews views) { private RemoteViews getThemedRemoteViews(Context context) {
int theme = ThemeService.getWidgetTheme(); int theme = ThemeService.getWidgetTheme();
Resources r = getResources(); String packageName = context.getPackageName();
int headerColor; Resources r = context.getResources();
int layout;
RemoteViews views = null;
int titleColor; int titleColor;
int bodyColor;
int buttonDrawable; int buttonDrawable;
int separatorColor;
if (isLegacyTheme()) { if (isLegacyTheme()) {
views.setInt(R.id.widget_header, "setBackgroundResource", R.drawable.widget_header_legacy); views = new RemoteViews(packageName, R.layout.widget_initialized_legacy);
views.setInt(R.id.taskbody, "setBackgroundResource", R.drawable.widget_body_legacy);
views.setTextColor(R.id.widget_title, r.getColor(android.R.color.white)); views.setTextColor(R.id.widget_title, r.getColor(android.R.color.white));
views.setInt(R.id.widget_button, "setImageResource", R.drawable.button_plus); views.setInt(R.id.widget_button, "setImageResource", R.drawable.button_plus);
views.setViewVisibility(R.id.widget_header_separator, View.GONE); views.setViewVisibility(R.id.widget_header_separator, View.GONE);
return; return views;
} } else if(isDarkTheme()) {
layout = (theme == R.style.Theme_Transparent ? R.layout.widget_initialized_dark_transparent : R.layout.widget_initialized_dark);
if (isDarkTheme()) {
headerColor = r.getColor(R.color.widget_header_dark);
titleColor = r.getColor(R.color.widget_text_color_dark); titleColor = r.getColor(R.color.widget_text_color_dark);
bodyColor = r.getColor(R.color.widget_body_dark);
buttonDrawable = R.drawable.plus_button_blue; buttonDrawable = R.drawable.plus_button_blue;
separatorColor = r.getColor(R.color.blue_theme_color);
} else if (theme == R.style.Theme_White) { } else if (theme == R.style.Theme_White) {
headerColor = r.getColor(R.color.widget_header_light); layout = R.layout.widget_initialized_red;
titleColor = r.getColor(R.color.widget_text_color_light); titleColor = r.getColor(R.color.widget_text_color_light);
bodyColor = r.getColor(R.color.widget_body_light);
buttonDrawable = R.drawable.plus_button_red; buttonDrawable = R.drawable.plus_button_red;
separatorColor = r.getColor(R.color.red_theme_color);
} else { } else {
headerColor = r.getColor(R.color.widget_header_light); layout = (theme == R.style.Theme_TransparentWhite ? R.layout.widget_initialized_transparent : R.layout.widget_initialized);
titleColor = r.getColor(R.color.widget_text_color_light); titleColor = r.getColor(R.color.widget_text_color_light);
bodyColor = r.getColor(R.color.widget_body_light);
buttonDrawable = R.drawable.plus_button_dark_blue; buttonDrawable = R.drawable.plus_button_dark_blue;
separatorColor = r.getColor(R.color.dark_blue_theme_color);
} }
if (theme == R.style.Theme_Transparent || theme == R.style.Theme_TransparentWhite) { views = new RemoteViews(packageName, layout);
bodyColor = headerColor = r.getColor(android.R.color.transparent);
}
views.setInt(R.id.widget_header, "setBackgroundColor", headerColor);
views.setTextColor(R.id.widget_title, titleColor); views.setTextColor(R.id.widget_title, titleColor);
views.setInt(R.id.taskbody, "setBackgroundColor", bodyColor);
views.setInt(R.id.widget_button, "setImageResource", buttonDrawable); views.setInt(R.id.widget_button, "setImageResource", buttonDrawable);
views.setInt(R.id.widget_header_separator, "setBackgroundColor", separatorColor); return views;
} }
private int getNumberOfTasks() { private int getNumberOfTasks() {

Loading…
Cancel
Save