Skip to content

Commit 003d484

Browse files
committed
Ui update: dark mode switcher and ui fixes
1 parent 4998db2 commit 003d484

23 files changed

Lines changed: 225 additions & 137 deletions

app/src/main/java/tk/phili/dienst/dienst/calendar/CalendarAddDialog.java

Lines changed: 15 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -51,15 +51,15 @@
5151

5252
public class CalendarAddDialog extends DialogFragment implements Toolbar.OnMenuItemClickListener {
5353

54-
Calendar calendar = null;
55-
long id;
56-
public SharedPreferences sp;
54+
private Calendar calendar = null;
55+
private long id;
56+
private SharedPreferences sp;
5757
private SharedPreferences.Editor editor;
5858

59-
Toolbar toolbar;
60-
EditText dateView, partnerView, notesView;
59+
private Toolbar toolbar;
60+
private EditText dateView, partnerView, notesView;
6161

62-
Runnable dismissCallback;
62+
public Runnable dismissCallback;
6363

6464
private OnBackInvokedCallback backInvokedCallback;
6565

@@ -136,14 +136,13 @@ public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceStat
136136
notesView = view.findViewById(R.id.add_calendar_notes);
137137

138138
toolbar.inflateMenu(R.menu.save);
139-
MenuTintUtils.tintAllIcons(toolbar.getMenu(), Color.WHITE);
140139
toolbar.setOnMenuItemClickListener(this);
141140
toolbar.setNavigationOnClickListener(view1 -> {
142141
dismiss();
143-
Utils.hideKeyboard(getActivity());
142+
Utils.hideKeyboard(requireActivity());
144143
});
145144

146-
sp = getContext().getSharedPreferences("MainActivity", MODE_PRIVATE);
145+
sp = requireContext().getSharedPreferences("MainActivity", MODE_PRIVATE);
147146
editor = sp.edit();
148147

149148
int day = getArguments().getInt("day", 1);
@@ -269,15 +268,15 @@ public void save() {
269268
if (!gCalExistsEvent) {
270269
long currentTimeMillis = cal.getTimeInMillis();
271270
long endTimeMillis = currentTimeMillis + 900000;
272-
ContentResolver cr = getContext().getContentResolver();
271+
ContentResolver cr = requireContext().getContentResolver();
273272
ContentValues values = new ContentValues();
274273
values.put(CalendarContract.Events.DTSTART, currentTimeMillis);
275274
values.put(CalendarContract.Events.DTEND, endTimeMillis);
276275
values.put(CalendarContract.Events.TITLE, getString(R.string.calendar_event_title).replace("%a", dienstpartner));
277-
values.put(CalendarContract.Events.DESCRIPTION, beschreibung + "");
276+
values.put(CalendarContract.Events.DESCRIPTION, beschreibung);
278277
values.put(CalendarContract.Events.CALENDAR_ID, calendarId);
279278
values.put(CalendarContract.Events.EVENT_TIMEZONE, TimeZone.getDefault().getDisplayName());
280-
int permissionCheck = ContextCompat.checkSelfPermission(getContext(),
279+
int permissionCheck = ContextCompat.checkSelfPermission(requireContext(),
281280
Manifest.permission.WRITE_CALENDAR);
282281
if (permissionCheck == PackageManager.PERMISSION_GRANTED) {
283282
Uri uri = cr.insert(CalendarContract.Events.CONTENT_URI, values);
@@ -295,13 +294,13 @@ public void save() {
295294
long currentTimeMillis = cal.getTimeInMillis();
296295
long endTimeMillis = currentTimeMillis + 900000;
297296
long eventId = eventIdEvent;
298-
ContentResolver cr = getContext().getContentResolver();
297+
ContentResolver cr = requireContext().getContentResolver();
299298
ContentValues values = new ContentValues();
300299
values.put(CalendarContract.Events.DTSTART, currentTimeMillis);
301300
values.put(CalendarContract.Events.DTEND, endTimeMillis);
302301
values.put(CalendarContract.Events.TITLE, getString(R.string.calendar_event_title).replace("%a", dienstpartner));
303302
values.put(CalendarContract.Events.DESCRIPTION, beschreibung + "");
304-
int permissionCheck = ContextCompat.checkSelfPermission(getContext(),
303+
int permissionCheck = ContextCompat.checkSelfPermission(requireContext(),
305304
Manifest.permission.WRITE_CALENDAR);
306305
if (permissionCheck == PackageManager.PERMISSION_GRANTED) {
307306
Uri uri = ContentUris.withAppendedId(CalendarContract.Events.CONTENT_URI, eventId);
@@ -310,9 +309,9 @@ public void save() {
310309
}
311310
}
312311

313-
if (ContextCompat.checkSelfPermission(getContext(), Manifest.permission.POST_NOTIFICATIONS) != PackageManager.PERMISSION_GRANTED) {
312+
if (ContextCompat.checkSelfPermission(requireContext(), Manifest.permission.POST_NOTIFICATIONS) != PackageManager.PERMISSION_GRANTED) {
314313
ActivityCompat
315-
.requestPermissions(getActivity(), new String[]{Manifest.permission.POST_NOTIFICATIONS}, 100001);
314+
.requestPermissions(requireActivity(), new String[]{Manifest.permission.POST_NOTIFICATIONS}, 100001);
316315
return;
317316
}
318317

app/src/main/java/tk/phili/dienst/dienst/report/ReportAddDialog.java

Lines changed: 14 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -45,21 +45,14 @@
4545

4646
public class ReportAddDialog extends DialogFragment implements Toolbar.OnMenuItemClickListener {
4747

48-
Calendar myCalendar = null;
49-
DatePickerDialog.OnDateSetListener date = null;
48+
private Calendar myCalendar = null;
49+
private DatePickerDialog.OnDateSetListener date = null;
5050

5151
private Report report;
52-
ReportManager reportManager;
53-
54-
EditText dateView,
55-
hourView,
56-
minutesView,
57-
placementsView,
58-
returnsView,
59-
videosView,
60-
studiesView,
61-
annotationView;
62-
Toolbar toolbar;
52+
private ReportManager reportManager;
53+
54+
private EditText dateView, hourView, minutesView, placementsView, returnsView, videosView, studiesView, annotationView;
55+
private Toolbar toolbar;
6356

6457
public Runnable dismissCallback;
6558

@@ -84,8 +77,7 @@ static ReportAddDialog newInstance() {
8477
}
8578

8679
@Override
87-
public View onCreateView(LayoutInflater inflater, ViewGroup container,
88-
Bundle savedInstanceState) {
80+
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
8981
return inflater.inflate(R.layout.dialog_report_add, container, false);
9082
}
9183

@@ -122,8 +114,7 @@ public void dismiss() {
122114
}
123115

124116
if (mBackStackId >= 0) {
125-
getParentFragmentManager().popBackStack(mBackStackId,
126-
FragmentManager.POP_BACK_STACK_INCLUSIVE);
117+
getParentFragmentManager().popBackStack(mBackStackId, FragmentManager.POP_BACK_STACK_INCLUSIVE);
127118
} else {
128119
FragmentTransaction ft = getParentFragmentManager().beginTransaction();
129120
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_CLOSE);
@@ -148,14 +139,13 @@ public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceStat
148139

149140
toolbar = view.findViewById(R.id.toolbar);
150141
toolbar.inflateMenu(R.menu.save);
151-
MenuTintUtils.tintAllIcons(toolbar.getMenu(), Color.WHITE);
152142
toolbar.setOnMenuItemClickListener(this);
153143
toolbar.setNavigationOnClickListener(view1 -> {
154144
dismiss();
155-
Utils.hideKeyboard(getActivity());
145+
Utils.hideKeyboard(requireActivity());
156146
});
157147

158-
reportManager = new ReportManager(getContext());
148+
reportManager = new ReportManager(requireContext());
159149

160150
long id = getArguments().getLong("id", Long.MAX_VALUE);
161151

@@ -209,9 +199,7 @@ public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceStat
209199
dateView.setOnFocusChangeListener((v, hasFocus) -> {
210200
if (ViewCompat.isAttachedToWindow(v)) {
211201
if (hasFocus) {
212-
DatePickerDialog dpd = new DatePickerDialog(getContext(), date, myCalendar
213-
.get(Calendar.YEAR), myCalendar.get(Calendar.MONTH),
214-
myCalendar.get(Calendar.DAY_OF_MONTH));
202+
DatePickerDialog dpd = new DatePickerDialog(requireContext(), date, myCalendar.get(Calendar.YEAR), myCalendar.get(Calendar.MONTH), myCalendar.get(Calendar.DAY_OF_MONTH));
215203
dpd.setOnCancelListener(dialog -> hourView.requestFocus());
216204
dpd.show();
217205
}
@@ -306,20 +294,12 @@ public void afterTextChanged(Editable s) {
306294

307295
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
308296
backInvokedCallback = () -> dismiss();
309-
getActivity().getOnBackInvokedDispatcher().registerOnBackInvokedCallback(
310-
OnBackInvokedDispatcher.PRIORITY_DEFAULT,
311-
backInvokedCallback
312-
);
297+
getActivity().getOnBackInvokedDispatcher().registerOnBackInvokedCallback(OnBackInvokedDispatcher.PRIORITY_DEFAULT, backInvokedCallback);
313298
}
314299
}
315300

316301
public void showError(final String messagebox) {
317-
AlertDialog dialog = new MaterialAlertDialogBuilder(new ContextThemeWrapper(getContext(), R.style.AppThemeDark))
318-
.setTitle(getString(R.string.error))
319-
.setMessage(messagebox)
320-
.setPositiveButton(R.string.ok, null)
321-
.setNegativeButton("", null)
322-
.create();
302+
AlertDialog dialog = new MaterialAlertDialogBuilder(new ContextThemeWrapper(getContext(), R.style.AppThemeDark)).setTitle(getString(R.string.error)).setMessage(messagebox).setPositiveButton(R.string.ok, null).setNegativeButton("", null).create();
323303
dialog.show();
324304

325305
dialog.getButton(AlertDialog.BUTTON_NEGATIVE).setEnabled(false);
@@ -367,8 +347,7 @@ public void save() {
367347
reportManager.createReport(report);
368348

369349
dismiss();
370-
if (dismissCallback != null)
371-
dismissCallback.run();
350+
if (dismissCallback != null) dismissCallback.run();
372351
}
373352

374353

app/src/main/java/tk/phili/dienst/dienst/report/ReportFragment.java

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -452,7 +452,6 @@ public void updateList() {
452452
noReportView.setVisibility(View.GONE);
453453
}
454454

455-
456455
updateSummary();
457456
}
458457

@@ -485,7 +484,7 @@ public void openGoalEditDialog() {
485484
try {
486485
Integer.parseInt(edt.getText().toString());
487486
} catch (Exception e) {
488-
Toast.makeText(getContext(), getString(R.string.goal_invalid), Toast.LENGTH_LONG).show();
487+
Toast.makeText(requireContext(), getString(R.string.goal_invalid), Toast.LENGTH_LONG).show();
489488
return;
490489
}
491490
editor.putString("goal", edt.getText().toString());
@@ -529,12 +528,14 @@ public void updateSummary() {
529528
} else {
530529
goalView.setVisibility(View.GONE);
531530
}
532-
reportsRecycler.setPadding(reportsRecycler.getPaddingLeft(),
533-
goalState.isHasGoal() ? goalView.getHeight() - Utils.dpToPx(16) : 0,
534-
reportsRecycler.getPaddingRight(),
535-
reportsRecycler.getPaddingBottom());
536-
Utils.setMargins(reportsRecycler,
537-
0, goalState.isHasGoal() ? Utils.dpToPx(16) : 0, 0, 0);
531+
reportsRecycler.post(() -> {
532+
reportsRecycler.setPadding(reportsRecycler.getPaddingLeft(),
533+
goalState.isHasGoal() ? goalView.getHeight() - Utils.dpToPx(16) : 0,
534+
reportsRecycler.getPaddingRight(),
535+
reportsRecycler.getPaddingBottom());
536+
Utils.setMargins(reportsRecycler,
537+
0, goalState.isHasGoal() ? Utils.dpToPx(16) : 0, 0, 0);
538+
});
538539
}
539540

540541

app/src/main/java/tk/phili/dienst/dienst/settings/SettingsFragment.java

Lines changed: 47 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import android.net.Uri;
1414
import android.os.Build;
1515
import android.os.Bundle;
16+
import android.provider.Settings;
1617
import android.view.LayoutInflater;
1718
import android.view.View;
1819
import android.view.ViewGroup;
@@ -23,6 +24,7 @@
2324

2425
import androidx.annotation.NonNull;
2526
import androidx.annotation.Nullable;
27+
import androidx.appcompat.app.AppCompatDelegate;
2628
import androidx.appcompat.view.ContextThemeWrapper;
2729
import androidx.appcompat.widget.AppCompatImageView;
2830
import androidx.appcompat.widget.Toolbar;
@@ -108,6 +110,7 @@ public void onViewCreated(View view, Bundle savedInstanceState) {
108110
MaterialEditTextPreference reportLayoutEdit = view.findViewById(R.id.report_layout_settings);
109111
MaterialStandardPreference exportSetting = view.findViewById(R.id.export);
110112
MaterialStandardPreference resetSetting = view.findViewById(R.id.reset);
113+
MaterialEditTextPreference darkModeSetting = view.findViewById(R.id.darkMode);
111114
MaterialSwitchPreference privateModeSwitch = view.findViewById(R.id.report_private_mode);
112115
MaterialStandardPreference languageSamplPresSetting = view.findViewById(R.id.language_empf);
113116
MaterialStandardPreference languageDailyTextSetting = view.findViewById(R.id.language_tt);
@@ -120,11 +123,13 @@ public void onViewCreated(View view, Bundle savedInstanceState) {
120123

121124
reportLayoutEdit.setUserInputModule(sim);
122125
reportLayoutEdit.setStorageModule(ssm);
126+
darkModeSetting.setUserInputModule(sim);
127+
darkModeSetting.setStorageModule(ssm);
123128
privateModeSwitch.setStorageModule(ssm);
124129

125-
126130
setIcon(exportSetting, R.drawable.ic_baseline_backup_24);
127131
setIcon(resetSetting, R.drawable.ic_baseline_delete_forever_24);
132+
setIcon(darkModeSetting, R.drawable.dark_mode_24px);
128133
setIcon(reportLayoutEdit, R.drawable.ic_baseline_style_24);
129134
setIcon(privateModeSwitch, R.drawable.ic_baseline_privacy_tip_24);
130135
setIcon(languageSamplPresSetting, R.drawable.ic_thumb_up_black_24dp);
@@ -355,9 +360,9 @@ public void onViewCreated(View view, Bundle savedInstanceState) {
355360
notificationSetting.setOnClickListener(__ -> {
356361
Intent intent = new Intent();
357362
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
358-
intent = new Intent(android.provider.Settings.ACTION_CHANNEL_NOTIFICATION_SETTINGS)
359-
.putExtra(android.provider.Settings.EXTRA_APP_PACKAGE, getContext().getPackageName())
360-
.putExtra(android.provider.Settings.EXTRA_CHANNEL_ID, "calendar");
363+
intent = new Intent(Settings.ACTION_CHANNEL_NOTIFICATION_SETTINGS)
364+
.putExtra(Settings.EXTRA_APP_PACKAGE, getContext().getPackageName())
365+
.putExtra(Settings.EXTRA_CHANNEL_ID, "calendar");
361366
} else {
362367
intent.setAction("android.settings.APP_NOTIFICATION_SETTINGS");
363368

@@ -470,6 +475,35 @@ public void showEditTextInput(String key, CharSequence title, CharSequence defau
470475
})
471476
.show();
472477

478+
} else if (key.equalsIgnoreCase("dark_mode")) {
479+
final CharSequence[] items = {getString(R.string.dark_mode_auto), getString(R.string.dark_mode_dark), getString(R.string.dark_mode_light)};
480+
481+
int checkedItem = 0;
482+
if (sp.contains("dark_mode")) {
483+
checkedItem = sp.getInt("dark_mode", 0);
484+
}
485+
486+
new MaterialAlertDialogBuilder(contextThemeWrapper)
487+
.setTitle(R.string.dark_mode)
488+
.setSingleChoiceItems(items, checkedItem, (dialog, item) -> {
489+
editor.putInt("dark_mode", item);
490+
editor.apply();
491+
listener.onInput(items[item].toString());
492+
493+
int mode = 0;
494+
if (item == 0) {
495+
mode = AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM;
496+
} else if (item == 1) {
497+
mode = AppCompatDelegate.MODE_NIGHT_YES;
498+
} else if (item == 2) {
499+
mode = AppCompatDelegate.MODE_NIGHT_NO;
500+
}
501+
AppCompatDelegate.setDefaultNightMode(mode);
502+
503+
dialog.dismiss();
504+
})
505+
.create()
506+
.show();
473507
}
474508
}
475509

@@ -531,6 +565,15 @@ public String getString(String key, String defaultVal) {
531565
} else {
532566
return SettingsFragment.this.getString(R.string.report_layout_2);
533567
}
568+
} else if (key.equalsIgnoreCase("dark_mode")) {
569+
switch (sp.getInt("dark_mode", 0)) {
570+
case 1:
571+
return SettingsFragment.this.getString(R.string.dark_mode_dark);
572+
case 2:
573+
return SettingsFragment.this.getString(R.string.dark_mode_light);
574+
default:
575+
return SettingsFragment.this.getString(R.string.dark_mode_auto);
576+
}
534577
}
535578
return null;
536579
}

app/src/main/java/tk/phili/dienst/dienst/uiwrapper/WrapperActivity.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,9 @@
88
import android.os.Build;
99
import android.os.Bundle;
1010

11+
import androidx.activity.EdgeToEdge;
1112
import androidx.appcompat.app.AppCompatActivity;
13+
import androidx.appcompat.app.AppCompatDelegate;
1214
import androidx.appcompat.widget.Toolbar;
1315
import androidx.drawerlayout.widget.DrawerLayout;
1416
import androidx.fragment.app.Fragment;
@@ -52,8 +54,20 @@ public class WrapperActivity extends AppCompatActivity implements FragmentCommun
5254

5355
@Override
5456
protected void onCreate(Bundle savedInstanceState) {
57+
EdgeToEdge.enable(this);
5558
super.onCreate(savedInstanceState);
5659

60+
int darkMode = getSharedPreferences("MainActivity", Context.MODE_PRIVATE).getInt("dark_mode", 0);
61+
int mode = 0;
62+
if (darkMode == 0) {
63+
mode = AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM;
64+
} else if (darkMode == 1) {
65+
mode = AppCompatDelegate.MODE_NIGHT_YES;
66+
} else if (darkMode == 2) {
67+
mode = AppCompatDelegate.MODE_NIGHT_NO;
68+
}
69+
AppCompatDelegate.setDefaultNightMode(mode);
70+
5771
if (!getSharedPreferences("Splash", Context.MODE_PRIVATE).getBoolean("dsgvo_accept", false)) {
5872
startActivity(new Intent(this, GDPRInfo.class));
5973
overridePendingTransition(android.R.anim.slide_in_left, android.R.anim.slide_out_right);
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
<vector xmlns:android="http://schemas.android.com/apk/res/android"
2+
android:width="24dp"
3+
android:height="24dp"
4+
android:viewportWidth="960"
5+
android:viewportHeight="960"
6+
android:tint="?attr/colorControlNormal">
7+
<path
8+
android:fillColor="@android:color/white"
9+
android:pathData="M240,613Q254,606 269,603Q284,600 300,600L320,600L320,160L300,160Q275,160 257.5,177.5Q240,195 240,220L240,613ZM400,600L720,600L720,160Q720,160 720,160Q720,160 720,160L400,160L400,600ZM240,613Q240,613 240,613Q240,613 240,613L240,613L240,160L240,160Q240,160 240,160Q240,160 240,160L240,613ZM300,880Q242,880 201,839Q160,798 160,740L160,220Q160,162 201,121Q242,80 300,80L720,80Q753,80 776.5,103.5Q800,127 800,160L800,661Q800,669 793.5,675.5Q787,682 770,690Q756,697 748,710Q740,723 740,740Q740,757 748,770.5Q756,784 770,790Q784,796 792,806.5Q800,817 800,829L800,839Q800,856 788.5,868Q777,880 760,880L300,880ZM300,800L673,800Q667,786 663.5,771.5Q660,757 660,740Q660,724 663,709Q666,694 673,680L300,680Q274,680 257,697.5Q240,715 240,740Q240,766 257,783Q274,800 300,800Z"/>
10+
</vector>
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
<vector xmlns:android="http://schemas.android.com/apk/res/android"
2+
android:width="24dp"
3+
android:height="24dp"
4+
android:viewportWidth="960"
5+
android:viewportHeight="960"
6+
android:tint="?attr/colorControlNormal">
7+
<path
8+
android:fillColor="@android:color/white"
9+
android:pathData="M480,840Q329,840 224.5,735.5Q120,631 120,480Q120,342 210,240.5Q300,139 440,122Q453,120 463,125.5Q473,131 479,140Q485,149 485.5,161Q486,173 478,184Q461,210 452.5,239Q444,268 444,300Q444,390 507,453Q570,516 660,516Q691,516 721.5,507Q752,498 776,482Q787,475 798.5,475.5Q810,476 819,481Q829,486 834.5,496Q840,506 838,520Q824,658 720.5,749Q617,840 480,840ZM480,760Q568,760 638,711.5Q708,663 740,585Q720,590 700,593Q680,596 660,596Q537,596 450.5,509.5Q364,423 364,300Q364,280 367,260Q370,240 375,220Q297,252 248.5,322Q200,392 200,480Q200,596 282,678Q364,760 480,760ZM470,490Q470,490 470,490Q470,490 470,490Q470,490 470,490Q470,490 470,490Q470,490 470,490Q470,490 470,490Q470,490 470,490Q470,490 470,490Q470,490 470,490Q470,490 470,490Q470,490 470,490Q470,490 470,490Z"/>
10+
</vector>

0 commit comments

Comments
 (0)