Skip to content

Commit 53703fa

Browse files
authored
fix(android): bring back parent dialog theme (#680)
* fix(android): bring back parent Dialog theme * refactor setButtonTextColor * remove clock and calendar styles
1 parent 70c5942 commit 53703fa

File tree

11 files changed

+64
-42
lines changed

11 files changed

+64
-42
lines changed

android/src/main/java/com/reactcommunity/rndatetimepicker/Common.java

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,17 @@
11
package com.reactcommunity.rndatetimepicker;
22

3+
import android.app.AlertDialog;
4+
import android.app.DatePickerDialog;
5+
import android.content.Context;
6+
import android.content.DialogInterface;
7+
import android.content.res.Resources;
8+
import android.util.TypedValue;
9+
import android.widget.Button;
10+
11+
import androidx.annotation.ColorInt;
12+
import androidx.annotation.ColorRes;
13+
import androidx.annotation.NonNull;
14+
import androidx.core.content.ContextCompat;
315
import androidx.fragment.app.DialogFragment;
416
import androidx.fragment.app.FragmentActivity;
517
import androidx.fragment.app.FragmentManager;
@@ -30,4 +42,32 @@ public static void dismissDialog(FragmentActivity activity, String fragmentTag,
3042
promise.reject(e);
3143
}
3244
}
45+
46+
public static int getDefaultDialogButtonTextColor(@NonNull Context activity) {
47+
TypedValue typedValue = new TypedValue();
48+
Resources.Theme theme = activity.getTheme();
49+
theme.resolveAttribute(android.R.attr.textColorPrimary, typedValue, true);
50+
@ColorRes int colorRes = (typedValue.resourceId != 0) ? typedValue.resourceId : typedValue.data;
51+
@ColorInt int colorId = ContextCompat.getColor(activity, colorRes);
52+
return colorId;
53+
}
54+
55+
@NonNull
56+
public static DialogInterface.OnShowListener setButtonTextColor(@NonNull Context activityContext, final AlertDialog dialog) {
57+
return presentedDialog -> {
58+
int textColorPrimary = getDefaultDialogButtonTextColor(activityContext);
59+
Button positiveButton = dialog.getButton(DatePickerDialog.BUTTON_POSITIVE);
60+
if (positiveButton != null) {
61+
positiveButton.setTextColor(textColorPrimary);
62+
}
63+
Button negativeButton = dialog.getButton(DatePickerDialog.BUTTON_NEGATIVE);
64+
if (negativeButton != null) {
65+
negativeButton.setTextColor(textColorPrimary);
66+
}
67+
Button neutralButton = dialog.getButton(DatePickerDialog.BUTTON_NEUTRAL);
68+
if (neutralButton != null) {
69+
neutralButton.setTextColor(textColorPrimary);
70+
}
71+
};
72+
}
3373
}

android/src/main/java/com/reactcommunity/rndatetimepicker/MinuteIntervalSnappableTimePickerDialog.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@ public MinuteIntervalSnappableTimePickerDialog(
3434
RNTimePickerDisplay display
3535
) {
3636
super(context, listener, hourOfDay, minute, is24HourView);
37-
setCanceledOnTouchOutside(true);
3837
mTimePickerInterval = minuteInterval;
3938
mTimeSetListener = listener;
4039
mDisplay = display;
@@ -52,7 +51,6 @@ public MinuteIntervalSnappableTimePickerDialog(
5251
RNTimePickerDisplay display
5352
) {
5453
super(context, theme, listener, hourOfDay, minute, is24HourView);
55-
setCanceledOnTouchOutside(true);
5654
mTimePickerInterval = minuteInterval;
5755
mTimeSetListener = listener;
5856
mDisplay = display;

android/src/main/java/com/reactcommunity/rndatetimepicker/RNDatePickerDialogFragment.java

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77

88
package com.reactcommunity.rndatetimepicker;
99

10+
import static com.reactcommunity.rndatetimepicker.Common.setButtonTextColor;
11+
1012
import android.annotation.SuppressLint;
1113
import android.app.DatePickerDialog;
1214
import android.app.DatePickerDialog.OnDateSetListener;
@@ -15,7 +17,6 @@
1517
import android.content.DialogInterface;
1618
import android.content.DialogInterface.OnDismissListener;
1719
import android.content.DialogInterface.OnClickListener;
18-
import android.os.Build;
1920
import android.os.Bundle;
2021

2122
import androidx.annotation.NonNull;
@@ -68,14 +69,10 @@ DatePickerDialog getDialog(
6869
}
6970

7071
switch (display) {
71-
case CALENDAR:
7272
case SPINNER:
73-
int theme = display == RNDatePickerDisplay.CALENDAR
74-
? R.style.CalendarDatePickerDialog
75-
: R.style.SpinnerDatePickerDialog;
7673
return new RNDismissableDatePickerDialog(
7774
activityContext,
78-
theme,
75+
R.style.SpinnerDatePickerDialog,
7976
onDateSetListener,
8077
year,
8178
month,
@@ -114,6 +111,7 @@ static DatePickerDialog createDialog(
114111
}
115112

116113
final DatePicker datePicker = dialog.getDatePicker();
114+
dialog.setOnShowListener(setButtonTextColor(activityContext, dialog));
117115

118116
Integer timeZoneOffsetInMilliseconds = getTimeZoneOffset(args);
119117
if (timeZoneOffsetInMilliseconds != null) {

android/src/main/java/com/reactcommunity/rndatetimepicker/RNDatePickerDisplay.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111
* Date picker display options.
1212
*/
1313
public enum RNDatePickerDisplay {
14-
CALENDAR,
1514
SPINNER,
1615
DEFAULT
1716
}

android/src/main/java/com/reactcommunity/rndatetimepicker/RNDismissableDatePickerDialog.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,6 @@ public RNDismissableDatePickerDialog(
4040
int dayOfMonth,
4141
RNDatePickerDisplay display) {
4242
super(context, callback, year, monthOfYear, dayOfMonth);
43-
setCanceledOnTouchOutside(true);
4443
fixSpinner(context, year, monthOfYear, dayOfMonth, display);
4544
}
4645

@@ -53,7 +52,6 @@ public RNDismissableDatePickerDialog(
5352
int dayOfMonth,
5453
RNDatePickerDisplay display) {
5554
super(context, theme, callback, year, monthOfYear, dayOfMonth);
56-
setCanceledOnTouchOutside(true);
5755
fixSpinner(context, year, monthOfYear, dayOfMonth, display);
5856
}
5957

android/src/main/java/com/reactcommunity/rndatetimepicker/RNTimePickerDialogFragment.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88

99
package com.reactcommunity.rndatetimepicker;
1010

11+
import static com.reactcommunity.rndatetimepicker.Common.setButtonTextColor;
12+
1113
import android.app.Dialog;
1214
import android.app.TimePickerDialog;
1315
import android.app.TimePickerDialog.OnTimeSetListener;
@@ -72,13 +74,10 @@ static TimePickerDialog getDialog(
7274
is24hour = args.getBoolean(RNConstants.ARG_IS24HOUR, DateFormat.is24HourFormat(activityContext));
7375
}
7476

75-
if (display == RNTimePickerDisplay.CLOCK || display == RNTimePickerDisplay.SPINNER) {
76-
int theme = display == RNTimePickerDisplay.CLOCK
77-
? R.style.ClockTimePickerDialog
78-
: R.style.SpinnerTimePickerDialog;
77+
if (display == RNTimePickerDisplay.SPINNER) {
7978
return new RNDismissableTimePickerDialog(
8079
activityContext,
81-
theme,
80+
R.style.SpinnerTimePickerDialog,
8281
onTimeSetListener,
8382
hour,
8483
minute,
@@ -113,6 +112,7 @@ static TimePickerDialog createDialog(
113112
if (args != null && args.containsKey(RNConstants.ARG_NEGATIVE_BUTTON_LABEL)) {
114113
dialog.setButton(DialogInterface.BUTTON_NEGATIVE, args.getString(RNConstants.ARG_NEGATIVE_BUTTON_LABEL), dialog);
115114
}
115+
dialog.setOnShowListener(setButtonTextColor(activityContext, dialog));
116116
return dialog;
117117
}
118118

android/src/main/java/com/reactcommunity/rndatetimepicker/RNTimePickerDisplay.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212
* Date picker display options.
1313
*/
1414
public enum RNTimePickerDisplay {
15-
CLOCK,
1615
SPINNER,
1716
DEFAULT
1817
}
Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
11
<resources xmlns:tools="http://schemas.android.com/tools">
2+
3+
<!-- color from https://m1.material.io/style/color.html#color-themes -->
24
<style name="SpinnerDatePickerDialog" parent="SpinnerDatePickerDialogBase">
3-
<item name="colorPrimary">@android:color/white</item>
5+
<item name="android:windowBackground">#424242</item>
46
</style>
57

68
<style name="SpinnerTimePickerDialog" parent="SpinnerTimePickerDialogBase">
7-
<item name="colorPrimary">@android:color/white</item>
9+
<item name="android:windowBackground">#424242</item>
810
</style>
11+
912
</resources>

android/src/main/res/values/styles.xml

Lines changed: 2 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,15 @@
11
<resources xmlns:tools="http://schemas.android.com/tools">
2-
<style name="SpinnerDatePickerDialogBase" tools:targetApi="lollipop">
2+
<style name="SpinnerDatePickerDialogBase" parent="Theme.AppCompat.DayNight.Dialog" tools:targetApi="lollipop">
33
<item name="android:datePickerStyle">@style/SpinnerDatePickerStyle</item>
4-
<item name="android:windowIsFloating">true</item>
54
</style>
65
<style name="SpinnerDatePickerDialog" parent="SpinnerDatePickerDialogBase" />
76

87
<style name="SpinnerDatePickerStyle" parent="android:Widget.Material.DatePicker" tools:targetApi="lollipop">
98
<item name="android:datePickerMode">spinner</item>
109
</style>
1110

12-
<style name="CalendarDatePickerDialog" parent="Theme.AppCompat.Light.Dialog" tools:targetApi="lollipop">
13-
<item name="android:datePickerStyle">@style/CalendarDatePickerStyle</item>
14-
</style>
15-
16-
<style name="CalendarDatePickerStyle" parent="android:Widget.Material.Light.DatePicker" tools:targetApi="lollipop">
17-
<item name="android:datePickerMode">calendar</item>
18-
</style>
19-
20-
21-
<style name="ClockTimePickerDialog" parent="Theme.AppCompat.Light.Dialog" tools:targetApi="lollipop">
22-
<item name="android:timePickerStyle">@style/ClockTimePickerStyle</item>
23-
</style>
24-
25-
<style name="ClockTimePickerStyle" parent="android:Widget.Material.Light.TimePicker" tools:targetApi="lollipop">
26-
<item name="android:timePickerMode">clock</item>
27-
</style>
28-
29-
<style name="SpinnerTimePickerDialogBase" tools:targetApi="lollipop">
11+
<style name="SpinnerTimePickerDialogBase" parent="Theme.AppCompat.DayNight.Dialog" tools:targetApi="lollipop">
3012
<item name="android:timePickerStyle">@style/SpinnerTimePickerStyle</item>
31-
<item name="android:windowIsFloating">true</item>
3213
</style>
3314
<style name="SpinnerTimePickerDialog" parent="SpinnerTimePickerDialogBase" />
3415

src/DateTimePickerAndroid.android.js

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ import {
2828
function open(props: AndroidNativeProps) {
2929
const {
3030
mode = ANDROID_MODE.date,
31-
display = ANDROID_DISPLAY.default,
31+
display,
3232
value: originalValue,
3333
is24Hour,
3434
minimumDate,
@@ -49,9 +49,13 @@ function open(props: AndroidNativeProps) {
4949

5050
const presentPicker = async () => {
5151
try {
52+
const displayOverride =
53+
display === ANDROID_DISPLAY.spinner
54+
? ANDROID_DISPLAY.spinner
55+
: ANDROID_DISPLAY.default;
5256
const {action, day, month, year, minute, hour} = await openPicker({
5357
value: valueTimestamp,
54-
display,
58+
display: displayOverride,
5559
is24Hour,
5660
minimumDate,
5761
maximumDate,

0 commit comments

Comments
 (0)