/**
* Copyright (c) 2012 Todoroo Inc
*
* See the file "LICENSE" for the full license governing this code.
*/
package com.todoroo.astrid.service;
import android.app.Activity;
import android.graphics.PixelFormat;
import android.text.TextUtils;
import android.view.WindowManager;
import com.timsu.astrid.R;
import com.todoroo.andlib.service.ContextManager;
import com.todoroo.andlib.utility.AndroidUtilities;
import com.todoroo.andlib.utility.Preferences;
import com.todoroo.astrid.utility.AstridPreferences;
import com.todoroo.astrid.widget.TasksWidget;
@SuppressWarnings("nls")
public class ThemeService {
public static final String THEME_WHITE = "white";
public static final String THEME_WHITE_RED = "white-red";
public static final String THEME_WHITE_ALT = "white-alt";
public static final String THEME_BLACK = "black";
public static final String THEME_TRANSPARENT = "transparent";
public static final String THEME_TRANSPARENT_WHITE = "transparent-white";
public static final String THEME_WIDGET_SAME_AS_APP = "same-as-app";
public static final String THEME_WIDGET_LEGACY = "legacy-widget";
public static final int FLAG_FORCE_DARK = 1;
public static final int FLAG_FORCE_LIGHT = 2;
public static final int FLAG_INVERT = 3;
private static int currentTheme;
// Widget config activities set this flag since they theme differently than the normal
// filter list. In other cases this should be false
private static boolean forceFilterInvert = false;
public static void applyTheme(Activity activity) {
currentTheme = getTheme();
activity.setTheme(currentTheme);
activity.getWindow().setFormat(PixelFormat.RGBA_8888);
activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_DITHER);
}
public static int getTheme() {
String preference = Preferences.getStringValue(R.string.p_theme);
return getStyleForSetting(preference);
}
public static int getWidgetTheme() {
String preference = Preferences.getStringValue(R.string.p_theme_widget);
if (TextUtils.isEmpty(preference) || THEME_WIDGET_SAME_AS_APP.equals(preference))
return getTheme();
else if (THEME_WIDGET_LEGACY.equals(preference))
return TasksWidget.THEME_LEGACY;
else
return getStyleForSetting(preference);
}
private static int getStyleForSetting(String setting) {
if(THEME_BLACK.equals(setting))
return R.style.Theme;
else if(THEME_TRANSPARENT.equals(setting))
return R.style.Theme_Transparent;
else if(THEME_TRANSPARENT_WHITE.equals(setting))
return R.style.Theme_TransparentWhite;
else if (THEME_WHITE_RED.equals(setting))
return R.style.Theme_White;
else if (THEME_WHITE_ALT.equals(setting))
return R.style.Theme_White_Alt;
else
return R.style.Theme_White_Blue;
}
public static int getThemeColor() {
int theme = getTheme();
switch(theme) {
case R.style.Theme:
case R.style.Theme_Transparent:
return R.color.blue_theme_color;
case R.style.Theme_White:
case R.style.Theme_TransparentWhite:
return R.color.red_theme_color;
case R.style.Theme_White_Blue:
default:
return R.color.dark_blue_theme_color;
}
}
public static int getEditDialogTheme() {
boolean ics = AndroidUtilities.getSdkVersion() >= 14;
int themeSetting = getTheme();
int theme;
if (themeSetting == R.style.Theme || themeSetting == R.style.Theme_Transparent) {
if (ics)
theme = R.style.TEA_Dialog_ICS;
else
theme = R.style.TEA_Dialog;
} else {
if (ics)
theme = R.style.TEA_Dialog_White_ICS;
else
theme = R.style.TEA_Dialog_White;
}
return theme;
}
public static int getDialogTheme() {
int themeSetting = getTheme();
int theme;
if (themeSetting == R.style.Theme || themeSetting == R.style.Theme_Transparent) {
theme = R.style.Theme_Dialog;
} else {
theme = R.style.Theme_Dialog_White;
}
return theme;
}
public static int getDialogTextColor() {
if (AndroidUtilities.getSdkVersion() >= 11) {
int theme = getTheme();
if (theme == R.style.Theme || theme == R.style.Theme_Transparent)
return android.R.color.white;
else
return android.R.color.black;
} else {
return android.R.color.white;
}
}
public static String getDialogTextColorString() {
int color = getDialogTextColor();
if (color == android.R.color.white)
return "white";
return "black";
}
public static int getDrawable(int lightDrawable) {
return getDrawable(lightDrawable, 0);
}
/**
* Only widget config activities should call this (see note on the flag above)
* @param forceInvert
*/
public static void setForceFilterInvert(boolean forceInvert) {
forceFilterInvert = forceInvert;
}
public static int getFilterThemeFlags() {
if (forceFilterInvert)
return ThemeService.FLAG_INVERT;
if (AstridPreferences.useTabletLayout(ContextManager.getContext()))
return ThemeService.FLAG_FORCE_LIGHT;
return 0;
}
public static int getDrawable(int lightDrawable, int alter) {
int theme = getTheme();
boolean darkTheme = theme == R.style.Theme || theme == R.style.Theme_Transparent;
switch(alter) {
case FLAG_FORCE_DARK:
darkTheme = true;
break;
case FLAG_FORCE_LIGHT:
darkTheme = false;
break;
case FLAG_INVERT:
darkTheme = !darkTheme;
break;
default:
break;
}
if (lightDrawable == R.drawable.icn_menu_refresh &&
AstridPreferences.useTabletLayout(ContextManager.getContext()))
return R.drawable.icn_menu_refresh_tablet;
if (theme == R.style.Theme_White_Alt) {
switch(lightDrawable) {
case R.drawable.ic_menu_save:
return R.drawable.ic_menu_save_blue_alt;
case R.drawable.ic_menu_close:
return R.drawable.ic_menu_close_blue_alt;
case R.drawable.ic_menu_mic:
return R.drawable.ic_menu_mic_blue_alt;
case R.drawable.ic_menu_attach:
return R.drawable.ic_menu_attach_blue_alt;
case R.drawable.list_settings:
return R.drawable.list_settings_white;
}
}
if(!darkTheme)
return lightDrawable;
switch(lightDrawable) {
case R.drawable.ic_menu_save:
return R.drawable.ic_menu_save;
case R.drawable.ic_menu_close:
return R.drawable.ic_menu_close;
case R.drawable.ic_menu_mic:
return R.drawable.ic_menu_mic;
case R.drawable.ic_menu_attach:
return R.drawable.ic_menu_attach;
case R.drawable.list_settings:
return R.drawable.list_settings;
case R.drawable.icn_menu_refresh:
return R.drawable.icn_menu_refresh_dark;
case R.drawable.icn_menu_filters:
return R.drawable.icn_menu_filters_dark;
case R.drawable.icn_featured_lists:
return R.drawable.icn_featured_lists_dark;
case R.drawable.icn_menu_sort_by_size:
return R.drawable.icn_menu_sort_by_size_dark;
case R.drawable.icn_menu_search:
return R.drawable.icn_menu_search_dark;
case R.drawable.icn_menu_friends:
return R.drawable.icn_menu_friends_dark;
case R.drawable.icn_menu_lists:
return R.drawable.icn_menu_lists_dark;
case R.drawable.icn_menu_plugins:
return R.drawable.icn_menu_plugins_dark;
case R.drawable.icn_menu_settings:
return R.drawable.icn_menu_settings_dark;
case R.drawable.icn_menu_support:
return R.drawable.icn_menu_support_dark;
case R.drawable.icn_menu_tutorial:
return R.drawable.icn_menu_tutorial_dark;
case R.drawable.filter_assigned:
return R.drawable.filter_assigned_dark;
case R.drawable.filter_calendar:
return R.drawable.filter_calendar_dark;
case R.drawable.filter_inbox:
return R.drawable.filter_inbox_dark;
case R.drawable.waiting_on_me:
return R.drawable.waiting_on_me_dark;
case R.drawable.filter_pencil:
return R.drawable.filter_pencil_dark;
case R.drawable.filter_sliders:
return R.drawable.filter_sliders_dark;
case R.drawable.gl_lists:
return R.drawable.gl_lists_dark;
}
throw new RuntimeException("No theme drawable found for " +
ContextManager.getResources().getResourceName(lightDrawable));
}
public static int getDarkVsLight(int resForWhite, int resForDark, boolean altIsDark) {
int theme = getTheme();
if (theme == R.style.Theme || (theme == R.style.Theme_White_Alt && altIsDark) || theme == R.style.Theme_TransparentWhite) {
return resForDark;
} else {
return resForWhite;
}
}
public static int getTaskEditDrawable(int regularDrawable, int lightBlueDrawable) {
return getDarkVsLight(regularDrawable, lightBlueDrawable, true);
}
public static int getTaskEditThemeColor() {
return getDarkVsLight(R.color.task_edit_selected, R.color.blue_theme_color, true);
}
public static void forceTheme(int theme) {
currentTheme = theme;
}
}