feat: the Widget now gets it's colors from the app theme!

This commit is contained in:
pml68 2024-03-06 20:34:36 +01:00
parent e2ac4303f3
commit b2db424d20
9 changed files with 149 additions and 49 deletions

View File

@ -53,7 +53,7 @@ public class DBManager {
}
public Cursor fetchTheme() {
Cursor cursor = this.database.query(SQLiteHelper.TABLE_NAME_SETTINGS, new String[]{SQLiteHelper.THEME, SQLiteHelper.ACCENT_COLOR}, null, null, null, null, null);
Cursor cursor = this.database.query(SQLiteHelper.TABLE_NAME_SETTINGS, new String[]{SQLiteHelper.THEME, SQLiteHelper.CUSTOM_ACCENT_COLOR, SQLiteHelper.CUSTOM_HIGHLIGHT_COLOR, SQLiteHelper.CUSTOM_BACKGROUND_COLOR}, null, null, null, null, null);
if (cursor != null) {
cursor.moveToFirst();
}
@ -116,4 +116,4 @@ public class DBManager {
con.put(SQLiteHelper.DAY_SEL, day_sel);
return this.database.update(SQLiteHelper.TABLE_NAME_WIDGETS, con, SQLiteHelper._ID + " = " + _id, null);
}
}
}

View File

@ -16,7 +16,9 @@ public class SQLiteHelper extends SQLiteOpenHelper {
public static final String PREMIUM_TOKEN = "premium_token";
public static final String PREMIUM_SCOPES = "premium_scopes";
public static final String LOCALE = "language";
public static final String ACCENT_COLOR = "accent_color";
public static final String CUSTOM_ACCENT_COLOR = "custom_accent_color";
public static final String CUSTOM_BACKGROUND_COLOR = "custom_background_color";
public static final String CUSTOM_HIGHLIGHT_COLOR = "custom_highlight_color";
public static final String TABLE_NAME_WIDGETS = "widgets";
public static final String TABLE_NAME_USER_DATA = "user_data";
public static final String TABLE_NAME_SETTINGS = "settings";
@ -33,4 +35,4 @@ public class SQLiteHelper extends SQLiteOpenHelper {
db.execSQL("DROP TABLE IF EXISTS widgets");
onCreate(db);
}
}
}

View File

@ -1,6 +1,7 @@
package hu.refilc.naplo.widget_timetable;
import android.app.PendingIntent;
import android.app.UiModeManager;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.Context;
@ -54,12 +55,16 @@ public class WidgetTimetable extends HomeWidgetProvider {
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds, SharedPreferences widgetData) {
Integer[] fullTheme = getFullTheme(context);
Integer[] textColors = getTextColors(context, fullTheme);
for (int i = 0; i < appWidgetIds.length; i++) {
RemoteViews views = generateView(context, appWidgetIds[i]);
if(userLoggedIn(context)) {
int rday = selectDay(context, appWidgetIds[i], 0, true);
views.setTextViewText(R.id.nav_current, convertDayOfWeek(context, rday));
views.setInt(R.id.nav_current, "setTextColor", getColor(context, textColors[0]));
}
pushUpdate(context, views, appWidgetIds[i]);
@ -73,7 +78,54 @@ public class WidgetTimetable extends HomeWidgetProvider {
manager.notifyAppWidgetViewDataChanged(appWidgetSingleId, R.id.widget_list);
}
public static int getColor(Context context, int color) {
return context.getResources().getColor(color);
}
public static Integer[] getTextColors(Context context, Integer[] fullTheme) {
UiModeManager uiModeManager = (UiModeManager) context.getSystemService(Context.UI_MODE_SERVICE);
int nightMode = uiModeManager.getNightMode();
int textColor;
int textDescColor;
if (fullTheme[0] == 0 && nightMode == UiModeManager.MODE_NIGHT_NO) {
textColor = R.color.text_light;
textDescColor = R.color.text_desc_light;
} else if (fullTheme[0] == 1) {
textColor = R.color.text_light;
textDescColor = R.color.text_desc_light;
} else {
textColor = R.color.text;
textDescColor = R.color.text_desc;
}
return new Integer[]{textColor, textDescColor};
}
public static Integer[] getFullTheme(Context context) {
DBManager dbManager = new DBManager(context.getApplicationContext());
try {
dbManager.open();
Cursor cursor = dbManager.fetchTheme();
dbManager.close();
int theme = cursor.getInt(0);
int customBackgroundColor = cursor.getInt(3);
return new Integer[]{theme, customBackgroundColor};
} catch (Exception e) {
e.printStackTrace();
}
return new Integer[]{0, 0};
}
public static RemoteViews generateView(Context context, int appId) {
Integer[] fullTheme = getFullTheme(context);
Integer[] textColors = getTextColors(context, fullTheme);
Intent serviceIntent = new Intent(context, WidgetTimetableService.class);
serviceIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appId);
serviceIntent.setData(Uri.parse(serviceIntent.toUri(Intent.URI_INTENT_SCHEME)));
@ -82,18 +134,25 @@ public class WidgetTimetable extends HomeWidgetProvider {
views.setViewVisibility(R.id.need_login, View.GONE);
views.setViewVisibility(R.id.tt_grid_cont, View.GONE);
views.setInt(R.id.nav_to_left, "setColorFilter", getColor(context, textColors[1]));
views.setInt(R.id.nav_to_right, "setColorFilter", getColor(context, textColors[1]));
views.setInt(R.id.nav_refresh, "setColorFilter", getColor(context, textColors[1]));
views.setInt(R.id.empty_view, "setTextColor", getColor(context, textColors[0]));
if(!userLoggedIn(context)) {
views.setViewVisibility(R.id.need_login, View.VISIBLE);
views.setOnClickPendingIntent(R.id.open_login, makePending(context, ACTION_WIDGET_CLICK_BUY_PREMIUM, appId));
} else {
views.setViewVisibility(R.id.tt_grid_cont, View.VISIBLE);
views.setInt(R.id.widget_list, "setBackgroundColor", fullTheme[1]);
views.setInt(R.id.bottom_nav, "setBackgroundColor", fullTheme[1]);
views.setOnClickPendingIntent(R.id.nav_to_left, makePending(context, ACTION_WIDGET_CLICK_NAV_LEFT, appId));
views.setOnClickPendingIntent(R.id.nav_to_right, makePending(context, ACTION_WIDGET_CLICK_NAV_RIGHT, appId));
views.setOnClickPendingIntent(R.id.nav_current, makePending(context, ACTION_WIDGET_CLICK_NAV_TODAY, appId));
views.setOnClickPendingIntent(R.id.nav_refresh, makePending(context, ACTION_WIDGET_CLICK_NAV_REFRESH, appId));
views.setRemoteAdapter(R.id.widget_list, serviceIntent);
views.setEmptyView(R.id.widget_list, R.id.empty_view);
views.setInt(R.id.empty_view, "setBackgroundColor", fullTheme[1]);
}
return views;

View File

@ -1,5 +1,6 @@
package hu.refilc.naplo.widget_timetable;
import android.app.UiModeManager;
import android.appwidget.AppWidgetManager;
import android.content.Context;
import android.content.Intent;
@ -30,10 +31,14 @@ public class WidgetTimetableDataProvider implements RemoteViewsService.RemoteVie
private int rday = 0;
private int theme;
private Integer[] fullTheme;
private Integer[] colorValues;
private UiModeManager uiModeManager;
private int nightMode;
List<Lesson> day_subjects = new ArrayList<>();
List<Integer> lessonIndexes = new ArrayList<>();
@ -43,6 +48,7 @@ public class WidgetTimetableDataProvider implements RemoteViewsService.RemoteVie
static class Item {
int Layout;
int BackgroundColor;
int NumVisibility;
int NameVisibility;
@ -55,11 +61,14 @@ public class WidgetTimetableDataProvider implements RemoteViewsService.RemoteVie
int NameColor;
int NameNodescColor;
int DescColor;
int RoomColor;
int TimeColor;
Integer[] NameNodescPadding = {0, 0, 0, 0};
public Item(int Layout, int NumVisibility,int NameVisibility,int NameNodescVisibility,int DescVisibility,int RoomVisibility,int TimeVisibility,int NumColor,int NameColor,int NameNodescColor,int DescColor) {
public Item(int Layout, int BackgroundColor, int NumVisibility,int NameVisibility,int NameNodescVisibility,int DescVisibility,int RoomVisibility,int TimeVisibility,int NumColor,int NameColor,int NameNodescColor,int DescColor,int RoomColor, int TimeColor) {
this.Layout = Layout;
this.BackgroundColor = BackgroundColor;
this.NumVisibility = NumVisibility;
this.NameVisibility = NameVisibility;
this.NameNodescVisibility = NameNodescVisibility;
@ -71,6 +80,8 @@ public class WidgetTimetableDataProvider implements RemoteViewsService.RemoteVie
this.NameColor = NameColor;
this.NameNodescColor = NameNodescColor;
this.DescColor = DescColor;
this.RoomColor = RoomColor;
this.TimeColor = TimeColor;
}
}
@ -102,18 +113,25 @@ public class WidgetTimetableDataProvider implements RemoteViewsService.RemoteVie
this.context = context;
this.appWidgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID);
this.theme = getThemeAccent(context);
this.fullTheme = getFullTheme(context);
this.colorValues = new Integer[]{R.color.filc,
R.color.blue_shade300,
R.color.green_shade300,
R.color.lime_shade300,
R.color.yellow_shade300,
R.color.orange_shade300,
R.color.red_shade300,
R.color.pink_shade300,
R.color.purple_shade300};
this.uiModeManager = (UiModeManager) context.getSystemService(Context.UI_MODE_SERVICE);
this.nightMode = uiModeManager.getNightMode();
this.colorValues = new Integer[]{
R.color.filc,
R.color.blue_shade300,
R.color.green_shade300,
R.color.lime_shade300,
R.color.yellow_shade300,
R.color.orange_shade300,
R.color.red_shade300,
R.color.pink_shade300,
R.color.purple_shade300,
0,
R.color.teal_shade300
};
}
@Override
@ -148,15 +166,18 @@ public class WidgetTimetableDataProvider implements RemoteViewsService.RemoteVie
/* backgroundResources */
view.setInt(R.id.main_lay, "setBackgroundResource", witem.Layout);
view.setInt(R.id.main_lay, "setBackgroundColor", witem.BackgroundColor);
/* Paddings */
view.setViewPadding(R.id.tt_item_name_nodesc, witem.NameNodescPadding[0], witem.NameNodescPadding[1], witem.NameNodescPadding[2], witem.NameNodescPadding[3]);
/* Text Colors */
view.setInt(R.id.tt_item_num, "setTextColor", getColor(context, witem.NumColor));
view.setInt(R.id.tt_item_num, "setTextColor", witem.NumColor);
view.setInt(R.id.tt_item_name, "setTextColor", getColor(context, witem.NameColor));
view.setInt(R.id.tt_item_name_nodesc, "setTextColor", getColor(context, witem.NameNodescColor));
view.setInt(R.id.tt_item_desc, "setTextColor", getColor(context, witem.DescColor));
view.setInt(R.id.tt_item_room, "setTextColor", getColor(context, witem.RoomColor));
view.setInt(R.id.tt_item_time, "setTextColor", getColor(context, witem.TimeColor));
}
public int getColor(Context context, int color) {
@ -167,12 +188,12 @@ public class WidgetTimetableDataProvider implements RemoteViewsService.RemoteVie
public RemoteViews getViewAt(int position) {
RemoteViews view = new RemoteViews(context.getPackageName(), R.layout.timetable_item);
witem = defaultItem(theme);
witem = defaultItem(fullTheme, nightMode, context);
Lesson curr_subject = day_subjects.get(position);
if (curr_subject.status.equals("empty")) {
witem.NumColor = R.color.text_miss_num;
witem.NumColor = getColor(context, R.color.text_miss_num);
witem.TimeVisibility = View.GONE;
witem.RoomVisibility = View.GONE;
@ -181,12 +202,12 @@ public class WidgetTimetableDataProvider implements RemoteViewsService.RemoteVie
}
if (!curr_subject.substituteTeacher.equals("null")) {
witem.NumColor = R.color.yellow;
witem.NumColor = getColor(context, R.color.yellow);
witem.Layout = R.drawable.card_layout_tile_helyetesitett;
}
if (curr_subject.status.equals("Elmaradt")) {
witem.NumColor = R.color.red;
witem.NumColor = getColor(context, R.color.red);
witem.Layout = R.drawable.card_layout_tile_elmarad;
} else if (curr_subject.status.equals("TanevRendjeEsemeny")) {
witem.NumVisibility = View.GONE;
@ -243,9 +264,6 @@ public class WidgetTimetableDataProvider implements RemoteViewsService.RemoteVie
}
private void initData() {
theme = getThemeAccent(context);
rday = WidgetTimetable.selectDay(context, appWidgetId, 0, false);
day_subjects.clear();
@ -297,7 +315,7 @@ public class WidgetTimetableDataProvider implements RemoteViewsService.RemoteVie
}
}
public static Integer getThemeAccent(Context context) {
public static Integer[] getFullTheme(Context context) {
DBManager dbManager = new DBManager(context.getApplicationContext());
try {
@ -305,27 +323,48 @@ public class WidgetTimetableDataProvider implements RemoteViewsService.RemoteVie
Cursor cursor = dbManager.fetchTheme();
dbManager.close();
return cursor.getInt(1);
int theme = cursor.getInt(0);
int customAccentColor = cursor.getInt(1);
int customHighlightColor = cursor.getInt(2);
return new Integer[]{theme, customAccentColor, customHighlightColor};
} catch (Exception e) {
e.printStackTrace();
}
return 0;
return new Integer[]{0, 0, 0};
}
public Item defaultItem(int theme) {
public Item defaultItem(Integer[] fullTheme, int nightMode, Context context) {
int textColor;
int textDescColor;
if (fullTheme[0] == 0 && nightMode == UiModeManager.MODE_NIGHT_NO) {
textColor = R.color.text_light;
textDescColor = R.color.text_desc_light;
} else if (fullTheme[0] == 1) {
textColor = R.color.text_light;
textDescColor = R.color.text_desc_light;
} else {
textColor = R.color.text;
textDescColor = R.color.text_desc;
}
return new Item(
R.drawable.card_layout_tile,
fullTheme[2],
View.VISIBLE,
View.VISIBLE,
View.INVISIBLE,
View.VISIBLE,
View.VISIBLE,
View.VISIBLE,
colorValues[theme >= colorValues.length ? 0 : theme],
R.color.text,
R.color.text,
R.color.text_desc
fullTheme[1],
textColor,
textColor,
textDescColor,
textDescColor,
textColor
);
}
@ -353,4 +392,4 @@ public class WidgetTimetableDataProvider implements RemoteViewsService.RemoteVie
return null;
}
}
}

View File

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="@color/white"/>
<stroke android:width="1dp" android:color="#D8E0E1" />
<solid android:color="@color/highlight"/>
<stroke android:width="1dp" android:color="@color/highlight" />
<corners android:radius="10dp"/>
<padding android:left="0dp" android:top="0dp" android:right="0dp" android:bottom="0dp"/>
</shape>
</shape>

View File

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="@color/highlight"/>
<stroke android:width="1dp" android:color="@color/highlight" />
<solid android:color="#00FFFFFF"/>
<stroke android:width="1dp" android:color="#00FFFFFF" />
<corners android:bottomLeftRadius="14dp" android:bottomRightRadius="14dp"/>
<padding android:left="0dp" android:top="0dp" android:right="0dp" android:bottom="0dp"/>
</shape>
</shape>

View File

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="@color/highlight"/>
<stroke android:width="1dp" android:color="@color/highlight" />
<solid android:color="#00FFFFFF"/>
<stroke android:width="1dp" android:color="#00FFFFFF" />
<corners android:topLeftRadius="14dp" android:topRightRadius="14dp"/>
<padding android:left="0dp" android:top="0dp" android:right="0dp" android:bottom="0dp"/>
</shape>
</shape>

View File

@ -9,7 +9,6 @@
android:id="@+id/tt_grid_cont"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:backgroundTint="#00000000"
android:background="@drawable/card_layout_bg"
android:orientation="vertical">

View File

@ -16,7 +16,7 @@
<color name="shadow_light">#ffE8E8E8</color>
<color name="text_light">#000000</color>
<color name="text_desc_light">#B9B9B9</color>
<color name="text_desc_light">#888C8F</color>
<color name="text_desc_dark_light">#B9B9B9</color>
<color name="text_miss_light">#888C8F</color>
<color name="background_light">#ffF4F9FF</color>
@ -56,12 +56,13 @@
<color name="purple">#ffBF5AF2</color>
<color name="pink">#ffFF375F</color>
<color name="blue_shade300">#FF64B5F6</color>
<color name="green_shade300">#FF81C784</color>
<color name="lime_shade300">#FFDCE775</color>
<color name="yellow_shade300">#FFFFF176</color>
<color name="blue_shade300">#FF63B5F6</color>
<color name="green_shade300">#FF66BB6A</color>
<color name="lime_shade300">#FF9CCC65</color>
<color name="yellow_shade300">#FFFFB74C</color>
<color name="orange_shade300">#FFFF8A65</color>
<color name="red_shade300">#FFE57373</color>
<color name="pink_shade300">#FFF06292</color>
<color name="purple_shade300">#FFBA68C8</color>
</resources>
<color name="teal_shade300">#FF22AC9B</color>
</resources>