(null) }
259 | var showRecurrenceMenu by remember { mutableStateOf(false) }
260 |
261 | val datePickerState = rememberDatePickerState(
262 | initialSelectedDateMillis = dueDateTime.toInstant(ZoneOffset.UTC).toEpochMilli(),
263 | )
264 |
265 | val timePickerState = rememberTimePickerState(
266 | initialHour = dueDateTime.hour,
267 | initialMinute = dueDateTime.minute
268 | )
269 |
270 | val validInput by remember {
271 | derivedStateOf {
272 | dueDateTime > LocalDateTime.now() && title.isNotBlank()
273 | }
274 | }
275 |
276 | LaunchedEffect(reminder) {
277 | if (reminder != null) {
278 | title = reminder.title
279 | description = reminder.description
280 | recurrencePattern = reminder.recurrencePattern
281 |
282 | dueDateTime = LocalDateTime.ofInstant(
283 | Instant.ofEpochMilli(reminder.dueDate),
284 | ZoneId.systemDefault()
285 | )
286 | }
287 | }
288 |
289 | ModalBottomSheet(
290 | onDismissRequest = onDismiss,
291 | sheetState = bottomSheetState,
292 | dragHandle = { BottomSheetDefaults.DragHandle() }
293 | ) {
294 | Column(
295 | modifier = Modifier
296 | .fillMaxWidth()
297 | .padding(horizontal = 16.dp, vertical = 8.dp)
298 | .verticalScroll(rememberScrollState()),
299 | verticalArrangement = Arrangement.spacedBy(16.dp)
300 | ) {
301 | Text(
302 | text = if (reminder == null) "Add New Reminder" else "Edit Reminder",
303 | style = MaterialTheme.typography.titleLarge,
304 | modifier = Modifier.padding(bottom = 8.dp)
305 | )
306 |
307 | OutlinedTextField(
308 | modifier = Modifier.fillMaxWidth(),
309 | keyboardOptions = KeyboardOptions(capitalization = KeyboardCapitalization.Words),
310 | value = title,
311 | onValueChange = { title = it },
312 | label = { Text("Title") },
313 | singleLine = true
314 | )
315 |
316 | OutlinedTextField(
317 | modifier = Modifier.fillMaxWidth(),
318 | keyboardOptions = KeyboardOptions(capitalization = KeyboardCapitalization.Sentences),
319 | value = description ?: "",
320 | onValueChange = { description = it },
321 | label = { Text("Description") },
322 | )
323 |
324 | Row(
325 | modifier = Modifier
326 | .fillMaxWidth()
327 | .clickable { showDatePicker = true },
328 | verticalAlignment = Alignment.CenterVertically
329 | ) {
330 | Icon(
331 | painter = painterResource(R.drawable.ic_calendar),
332 | contentDescription = "Select Date",
333 | tint = MaterialTheme.colorScheme.primary,
334 | modifier = Modifier.padding(end = 16.dp)
335 | )
336 | Text(
337 | text = "Date: ${
338 | Utils.formatDate(
339 | LocalContext.current,
340 | dueDateTime.toLocalDate()
341 | )
342 | }",
343 | style = MaterialTheme.typography.bodyLarge
344 | )
345 | }
346 |
347 | Row(
348 | modifier = Modifier
349 | .fillMaxWidth()
350 | .clickable { showTimePicker = true },
351 | verticalAlignment = Alignment.CenterVertically
352 | ) {
353 | Icon(
354 | painter = painterResource(R.drawable.ic_alarm),
355 | contentDescription = "Select Time",
356 | tint = MaterialTheme.colorScheme.primary,
357 | modifier = Modifier.padding(end = 16.dp)
358 | )
359 | Text(
360 | text = "Time: ${
361 | Utils.formatTime(
362 | LocalContext.current,
363 | dueDateTime.toLocalTime()
364 | )
365 | }",
366 | style = MaterialTheme.typography.bodyLarge
367 | )
368 | }
369 |
370 | // Recurrence pattern row
371 | Box(modifier = Modifier.fillMaxWidth()) {
372 | Row(
373 | modifier = Modifier
374 | .fillMaxWidth()
375 | .clickable { showRecurrenceMenu = true },
376 | verticalAlignment = Alignment.CenterVertically
377 | ) {
378 | Icon(
379 | painter = painterResource(R.drawable.ic_calendar),
380 | contentDescription = "Set Recurrence",
381 | tint = MaterialTheme.colorScheme.primary,
382 | modifier = Modifier.padding(end = 16.dp)
383 | )
384 | Text(
385 | text = "Repeat: ${recurrencePattern?.displayName ?: "Never"}",
386 | style = MaterialTheme.typography.bodyLarge
387 | )
388 | }
389 |
390 | DropdownMenu(
391 | expanded = showRecurrenceMenu,
392 | onDismissRequest = { showRecurrenceMenu = false },
393 | modifier = Modifier.width(240.dp)
394 | ) {
395 | RecurrencePattern.entries.forEach { pattern ->
396 | DropdownMenuItem(
397 | text = { Text(pattern.displayName) },
398 | onClick = {
399 | recurrencePattern =
400 | if (pattern == RecurrencePattern.NONE) null else pattern
401 | showRecurrenceMenu = false
402 | }
403 | )
404 | }
405 | }
406 | }
407 |
408 | Row(
409 | modifier = Modifier
410 | .fillMaxWidth()
411 | .padding(top = 8.dp, bottom = 24.dp),
412 | horizontalArrangement = Arrangement.End
413 | ) {
414 | TextButton(
415 | onClick = onDismiss,
416 | modifier = Modifier.padding(end = 8.dp)
417 | ) {
418 | Text("Cancel")
419 | }
420 |
421 | Button(
422 | onClick = {
423 | onSetAlarm(
424 | title.trim(),
425 | description?.takeIf { it.isNotBlank() },
426 | dueDateTime
427 | .atZone(ZoneId.systemDefault())
428 | .toInstant()
429 | .toEpochMilli(),
430 | recurrencePattern
431 | )
432 | },
433 | enabled = validInput
434 | ) {
435 | Text("Save")
436 | }
437 | }
438 | }
439 | }
440 |
441 | if (showDatePicker) {
442 | DatePickerDialog(
443 | onDismissRequest = { showDatePicker = false },
444 | confirmButton = {
445 | TextButton(
446 | onClick = {
447 | datePickerState.selectedDateMillis?.let { millis ->
448 | val newDate = Instant
449 | .ofEpochMilli(millis)
450 | .atZone(ZoneOffset.UTC)
451 | .toLocalDate()
452 | .atStartOfDay()
453 | .toLocalDate()
454 | dueDateTime = LocalDateTime.of(newDate, dueDateTime.toLocalTime())
455 | }
456 | showDatePicker = false
457 | }
458 | ) {
459 | Text("Confirm")
460 | }
461 | },
462 | dismissButton = {
463 | TextButton(onClick = { showDatePicker = false }) {
464 | Text("Cancel")
465 | }
466 | }
467 | ) {
468 | DatePicker(state = datePickerState)
469 | }
470 | }
471 |
472 | if (showTimePicker) {
473 | androidx.compose.material3.AlertDialog(
474 | onDismissRequest = { showTimePicker = false },
475 | title = { Text("Select Time") },
476 | text = {
477 | TimePicker(
478 | state = timePickerState,
479 | colors = TimePickerDefaults.colors(
480 | timeSelectorSelectedContainerColor = MaterialTheme.colorScheme.primary,
481 | timeSelectorSelectedContentColor = MaterialTheme.colorScheme.onPrimary
482 | )
483 | )
484 | },
485 | confirmButton = {
486 | TextButton(
487 | onClick = {
488 | val newTime = LocalTime.of(timePickerState.hour, timePickerState.minute)
489 | dueDateTime = LocalDateTime.of(dueDateTime.toLocalDate(), newTime)
490 | showTimePicker = false
491 | }
492 | ) {
493 | Text("Confirm")
494 | }
495 | },
496 | dismissButton = {
497 | TextButton(onClick = { showTimePicker = false }) {
498 | Text("Cancel")
499 | }
500 | }
501 | )
502 | }
503 | }
504 |
505 | @Composable
506 | fun ReminderCard(
507 | reminder: Reminder,
508 | onClick: () -> Unit,
509 | onDelete: () -> Unit
510 | ) {
511 | val context = LocalContext.current
512 | var dueDateTime = LocalDateTime.ofInstant(
513 | Instant.ofEpochMilli(reminder.dueDate),
514 | ZoneId.systemDefault()
515 | )
516 |
517 | if (reminder.recurrencePattern != null)
518 | while (dueDateTime.isBefore(LocalDateTime.now()))
519 | dueDateTime =
520 | dueDateTime.plus(reminder.recurrencePattern.intervalMillis, ChronoUnit.MILLIS)
521 |
522 | val isOverdue = reminder.recurrencePattern == null && dueDateTime.isBefore(LocalDateTime.now())
523 |
524 | Card(
525 | modifier = Modifier
526 | .fillMaxWidth()
527 | .padding(vertical = 8.dp)
528 | .clickable(onClick = onClick),
529 | colors = CardDefaults.cardColors(
530 | containerColor = when {
531 | isOverdue -> MaterialTheme.colorScheme.errorContainer.copy(alpha = 0.2f)
532 | else -> MaterialTheme.colorScheme.surface
533 | }
534 | ),
535 | elevation = CardDefaults.cardElevation(defaultElevation = 2.dp)
536 | ) {
537 | Column(
538 | modifier = Modifier.padding(16.dp)
539 | ) {
540 | Row(
541 | verticalAlignment = Alignment.CenterVertically,
542 | modifier = Modifier.fillMaxWidth()
543 | ) {
544 | Text(
545 | text = reminder.title,
546 | style = MaterialTheme.typography.titleMedium,
547 | color = when {
548 | isOverdue -> MaterialTheme.colorScheme.error
549 | else -> MaterialTheme.colorScheme.onSurface
550 | },
551 | fontWeight = FontWeight.SemiBold,
552 | modifier = Modifier.weight(1f)
553 | )
554 |
555 | IconButton(
556 | onClick = onDelete,
557 | modifier = Modifier.size(36.dp)
558 | ) {
559 | Icon(
560 | imageVector = Icons.Default.Delete,
561 | contentDescription = "Delete",
562 | tint = MaterialTheme.colorScheme.error.copy(alpha = 0.8f),
563 | modifier = Modifier.size(20.dp)
564 | )
565 | }
566 | }
567 |
568 | if (!reminder.description.isNullOrBlank()) {
569 | Spacer(modifier = Modifier.height(8.dp))
570 | Text(
571 | text = reminder.description,
572 | style = MaterialTheme.typography.bodyMedium,
573 | color = MaterialTheme.colorScheme.onSurfaceVariant,
574 | maxLines = 2,
575 | overflow = TextOverflow.Ellipsis
576 | )
577 | }
578 |
579 | Spacer(modifier = Modifier.height(12.dp))
580 | Divider(color = MaterialTheme.colorScheme.outlineVariant.copy(alpha = 0.5f))
581 | Spacer(modifier = Modifier.height(12.dp))
582 |
583 | Column(
584 | modifier = Modifier.fillMaxWidth()
585 | ) {
586 | Row(
587 | verticalAlignment = Alignment.CenterVertically,
588 | modifier = Modifier.padding(bottom = 8.dp)
589 | ) {
590 | Icon(
591 | painter = painterResource(R.drawable.ic_calendar),
592 | contentDescription = "Due Date",
593 | tint = MaterialTheme.colorScheme.primary,
594 | modifier = Modifier
595 | .size(20.dp)
596 | .padding(end = 4.dp)
597 | )
598 |
599 | Text(
600 | text = "Due:",
601 | style = MaterialTheme.typography.bodyMedium,
602 | fontWeight = FontWeight.Medium,
603 | color = MaterialTheme.colorScheme.onSurface,
604 | modifier = Modifier.padding(end = 8.dp)
605 | )
606 |
607 | Text(
608 | text = Utils.parseMillisToDeviceTimeFormat(context, reminder.dueDate),
609 | style = MaterialTheme.typography.bodyMedium,
610 | color = MaterialTheme.colorScheme.onSurfaceVariant
611 | )
612 | }
613 |
614 | if (reminder.recurrencePattern != null || !isOverdue) {
615 | Row(
616 | verticalAlignment = Alignment.CenterVertically,
617 | modifier = Modifier.padding(bottom = 0.dp)
618 | ) {
619 | Icon(
620 | painter = if (reminder.recurrencePattern != null)
621 | painterResource(R.drawable.ic_repeat)
622 | else
623 | painterResource(R.drawable.ic_alarm),
624 | contentDescription = "Next Trigger",
625 | tint = MaterialTheme.colorScheme.secondary,
626 | modifier = Modifier
627 | .size(20.dp)
628 | .padding(end = 4.dp)
629 | )
630 |
631 | Text(
632 | text = "Next:",
633 | style = MaterialTheme.typography.bodyMedium,
634 | fontWeight = FontWeight.Medium,
635 | color = MaterialTheme.colorScheme.onSurface,
636 | modifier = Modifier.padding(end = 8.dp)
637 | )
638 |
639 | Text(
640 | text = Utils.parseMillisToDeviceTimeFormat(
641 | context,
642 | dueDateTime.atZone(ZoneId.systemDefault())
643 | .toInstant()
644 | .toEpochMilli()
645 | ),
646 | style = MaterialTheme.typography.bodyMedium,
647 | color = MaterialTheme.colorScheme.onSurfaceVariant
648 | )
649 | }
650 | }
651 |
652 | if (reminder.recurrencePattern != null) {
653 | Row(
654 | verticalAlignment = Alignment.CenterVertically,
655 | modifier = Modifier.padding(top = 4.dp)
656 | ) {
657 | Surface(
658 | color = MaterialTheme.colorScheme.secondaryContainer.copy(alpha = 0.7f),
659 | shape = MaterialTheme.shapes.small
660 | ) {
661 | Row(
662 | verticalAlignment = Alignment.CenterVertically,
663 | modifier = Modifier.padding(8.dp)
664 | ) {
665 | Icon(
666 | painter = painterResource(R.drawable.ic_repeat),
667 | contentDescription = null,
668 | tint = MaterialTheme.colorScheme.secondary,
669 | modifier = Modifier.size(14.dp)
670 | )
671 | Text(
672 | text = reminder.recurrencePattern.displayName,
673 | style = MaterialTheme.typography.labelSmall,
674 | color = MaterialTheme.colorScheme.secondary,
675 | modifier = Modifier.padding(start = 4.dp)
676 | )
677 | }
678 | }
679 | }
680 | }
681 |
682 | if (isOverdue) {
683 | Row(
684 | verticalAlignment = Alignment.CenterVertically,
685 | modifier = Modifier.padding(top = 4.dp)
686 | ) {
687 | Surface(
688 | color = MaterialTheme.colorScheme.error.copy(alpha = 0.1f),
689 | shape = MaterialTheme.shapes.small
690 | ) {
691 | Row(
692 | verticalAlignment = Alignment.CenterVertically,
693 | modifier = Modifier.padding(horizontal = 8.dp, vertical = 4.dp)
694 | ) {
695 | Icon(
696 | imageVector = Icons.Outlined.Warning,
697 | contentDescription = null,
698 | tint = MaterialTheme.colorScheme.error,
699 | modifier = Modifier.size(14.dp)
700 | )
701 | Text(
702 | text = "Overdue",
703 | style = MaterialTheme.typography.labelSmall,
704 | color = MaterialTheme.colorScheme.error,
705 | modifier = Modifier.padding(start = 4.dp)
706 | )
707 | }
708 | }
709 | }
710 | }
711 | }
712 | }
713 | }
714 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/vishnu/remindme/ui/theme/Color.kt:
--------------------------------------------------------------------------------
1 | package com.vishnu.remindme.ui.theme
2 |
3 | import androidx.compose.ui.graphics.Color
4 |
5 | val Purple80 = Color(0xFFD0BCFF)
6 | val PurpleGrey80 = Color(0xFFCCC2DC)
7 | val Pink80 = Color(0xFFEFB8C8)
8 |
9 | val Purple40 = Color(0xFF6650a4)
10 | val PurpleGrey40 = Color(0xFF625b71)
11 | val Pink40 = Color(0xFF7D5260)
--------------------------------------------------------------------------------
/app/src/main/java/com/vishnu/remindme/ui/theme/Theme.kt:
--------------------------------------------------------------------------------
1 | package com.vishnu.remindme.ui.theme
2 |
3 | import android.os.Build
4 | import androidx.compose.foundation.isSystemInDarkTheme
5 | import androidx.compose.material3.MaterialTheme
6 | import androidx.compose.material3.darkColorScheme
7 | import androidx.compose.material3.dynamicDarkColorScheme
8 | import androidx.compose.material3.dynamicLightColorScheme
9 | import androidx.compose.material3.lightColorScheme
10 | import androidx.compose.runtime.Composable
11 | import androidx.compose.ui.platform.LocalContext
12 |
13 | private val DarkColorScheme = darkColorScheme(
14 | primary = Purple80,
15 | secondary = PurpleGrey80,
16 | tertiary = Pink80
17 | )
18 |
19 | private val LightColorScheme = lightColorScheme(
20 | primary = Purple40,
21 | secondary = PurpleGrey40,
22 | tertiary = Pink40
23 |
24 | /* Other default colors to override
25 | background = Color(0xFFFFFBFE),
26 | surface = Color(0xFFFFFBFE),
27 | onPrimary = Color.White,
28 | onSecondary = Color.White,
29 | onTertiary = Color.White,
30 | onBackground = Color(0xFF1C1B1F),
31 | onSurface = Color(0xFF1C1B1F),
32 | */
33 | )
34 |
35 | @Composable
36 | fun RemindMeTheme(
37 | darkTheme: Boolean = isSystemInDarkTheme(),
38 | // Dynamic color is available on Android 12+
39 | dynamicColor: Boolean = true,
40 | content: @Composable () -> Unit
41 | ) {
42 | val colorScheme = when {
43 | dynamicColor && Build.VERSION.SDK_INT >= Build.VERSION_CODES.S -> {
44 | val context = LocalContext.current
45 | if (darkTheme) dynamicDarkColorScheme(context) else dynamicLightColorScheme(context)
46 | }
47 |
48 | darkTheme -> DarkColorScheme
49 | else -> LightColorScheme
50 | }
51 |
52 | MaterialTheme(
53 | colorScheme = colorScheme,
54 | typography = Typography,
55 | content = content
56 | )
57 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/vishnu/remindme/ui/theme/Type.kt:
--------------------------------------------------------------------------------
1 | package com.vishnu.remindme.ui.theme
2 |
3 | import androidx.compose.material3.Typography
4 | import androidx.compose.ui.text.TextStyle
5 | import androidx.compose.ui.text.font.FontFamily
6 | import androidx.compose.ui.text.font.FontWeight
7 | import androidx.compose.ui.unit.sp
8 |
9 | // Set of Material typography styles to start with
10 | val Typography = Typography(
11 | bodyLarge = TextStyle(
12 | fontFamily = FontFamily.Default,
13 | fontWeight = FontWeight.Normal,
14 | fontSize = 16.sp,
15 | lineHeight = 24.sp,
16 | letterSpacing = 0.5.sp
17 | )
18 | /* Other default text styles to override
19 | titleLarge = TextStyle(
20 | fontFamily = FontFamily.Default,
21 | fontWeight = FontWeight.Normal,
22 | fontSize = 22.sp,
23 | lineHeight = 28.sp,
24 | letterSpacing = 0.sp
25 | ),
26 | labelSmall = TextStyle(
27 | fontFamily = FontFamily.Default,
28 | fontWeight = FontWeight.Medium,
29 | fontSize = 11.sp,
30 | lineHeight = 16.sp,
31 | letterSpacing = 0.5.sp
32 | )
33 | */
34 | )
--------------------------------------------------------------------------------
/app/src/main/java/com/vishnu/remindme/utils/Constants.kt:
--------------------------------------------------------------------------------
1 | package com.vishnu.remindme.utils
2 |
3 | class Constants {
4 | companion object {
5 | val REMINDER_ITEM_KEY = "reminder_item"
6 | }
7 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/vishnu/remindme/utils/Utils.kt:
--------------------------------------------------------------------------------
1 | package com.vishnu.remindme.utils
2 |
3 | import android.content.Context
4 | import android.text.format.DateFormat
5 | import java.time.Instant
6 | import java.time.LocalDate
7 | import java.time.LocalTime
8 | import java.time.ZoneId
9 | import java.time.format.DateTimeFormatter
10 | import java.util.Locale
11 |
12 | class Utils {
13 | companion object {
14 | fun parseMillisToDeviceTimeFormat(context: Context, millis: Long): String {
15 | val is24HourFormat = DateFormat.is24HourFormat(context)
16 | val pattern = if (is24HourFormat) "HH:mm, dd MMM yyyy" else "hh:mm a, dd MMM yyyy"
17 | val formatter = DateTimeFormatter.ofPattern(pattern, Locale.getDefault())
18 | .withZone(ZoneId.systemDefault())
19 | return formatter.format(Instant.ofEpochMilli(millis))
20 | }
21 |
22 | fun formatTime(context: Context, time: LocalTime): String {
23 | val is24HourFormat = DateFormat.is24HourFormat(context)
24 | val pattern = if (is24HourFormat) "HH:mm" else "hh:mm a"
25 | val formatter = DateTimeFormatter.ofPattern(pattern, Locale.getDefault())
26 | .withZone(ZoneId.systemDefault())
27 | return formatter.format(time)
28 | }
29 |
30 | fun formatDate(context: Context, time: LocalDate): String {
31 | val pattern = "dd MMM yyyy"
32 | val formatter = DateTimeFormatter.ofPattern(pattern, Locale.getDefault())
33 | .withZone(ZoneId.systemDefault())
34 | return formatter.format(time)
35 | }
36 | }
37 | }
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_alarm.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_calendar.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_launcher_foreground.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
12 |
13 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_launcher_monochrome.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
12 |
13 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_repeat.xml:
--------------------------------------------------------------------------------
1 |
6 |
7 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-hdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/VishnuSanal/RemindMe/ed66237ff18884e8fc63cb1f7779b52f511b2785/app/src/main/res/mipmap-hdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-hdpi/ic_launcher_round.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/VishnuSanal/RemindMe/ed66237ff18884e8fc63cb1f7779b52f511b2785/app/src/main/res/mipmap-hdpi/ic_launcher_round.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-mdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/VishnuSanal/RemindMe/ed66237ff18884e8fc63cb1f7779b52f511b2785/app/src/main/res/mipmap-mdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-mdpi/ic_launcher_round.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/VishnuSanal/RemindMe/ed66237ff18884e8fc63cb1f7779b52f511b2785/app/src/main/res/mipmap-mdpi/ic_launcher_round.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/VishnuSanal/RemindMe/ed66237ff18884e8fc63cb1f7779b52f511b2785/app/src/main/res/mipmap-xhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/VishnuSanal/RemindMe/ed66237ff18884e8fc63cb1f7779b52f511b2785/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/VishnuSanal/RemindMe/ed66237ff18884e8fc63cb1f7779b52f511b2785/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/VishnuSanal/RemindMe/ed66237ff18884e8fc63cb1f7779b52f511b2785/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/VishnuSanal/RemindMe/ed66237ff18884e8fc63cb1f7779b52f511b2785/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/VishnuSanal/RemindMe/ed66237ff18884e8fc63cb1f7779b52f511b2785/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png
--------------------------------------------------------------------------------
/app/src/main/res/values/colors.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | #FFBB86FC
4 | #FF6200EE
5 | #FF3700B3
6 | #FF03DAC5
7 | #FF018786
8 | #FF000000
9 | #FFFFFFFF
10 |
--------------------------------------------------------------------------------
/app/src/main/res/values/ic_launcher_background.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | #EADDFF
4 |
--------------------------------------------------------------------------------
/app/src/main/res/values/strings.xml:
--------------------------------------------------------------------------------
1 |
2 | Remind Me!
3 |
--------------------------------------------------------------------------------
/app/src/main/res/values/themes.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
7 |
--------------------------------------------------------------------------------
/app/src/main/res/xml/backup_rules.xml:
--------------------------------------------------------------------------------
1 |
8 |
9 |
13 |
--------------------------------------------------------------------------------
/app/src/main/res/xml/data_extraction_rules.xml:
--------------------------------------------------------------------------------
1 |
6 |
7 |
8 |
12 |
13 |
19 |
--------------------------------------------------------------------------------
/app/src/test/java/com/vishnu/remindme/ExampleUnitTest.kt:
--------------------------------------------------------------------------------
1 | package com.vishnu.remindme
2 |
3 | import org.junit.Assert.assertEquals
4 | import org.junit.Test
5 |
6 | /**
7 | * Example local unit test, which will execute on the development machine (host).
8 | *
9 | * See [testing documentation](http://d.android.com/tools/testing).
10 | */
11 | class ExampleUnitTest {
12 | @Test
13 | fun addition_isCorrect() {
14 | assertEquals(4, 2 + 2)
15 | }
16 | }
--------------------------------------------------------------------------------
/build.gradle.kts:
--------------------------------------------------------------------------------
1 | // Top-level build file where you can add configuration options common to all sub-projects/modules.
2 | plugins {
3 | alias(libs.plugins.android.application) apply false
4 | alias(libs.plugins.kotlin.android) apply false
5 | alias(libs.plugins.kotlin.compose) apply false
6 |
7 | id("com.google.dagger.hilt.android") version "2.52" apply false
8 | id("com.google.devtools.ksp") version "2.0.20-1.0.25" apply false
9 | }
--------------------------------------------------------------------------------
/docs/privacypolicy/policy.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | Privacy Policy
7 |
8 |
9 |
10 | Privacy PolicyThis privacy policy applies to the RemindMe! app (hereby referred to as "Application") for mobile devices that was created by Vishnu Sanal T (hereby referred to as "Service Provider") as an Open Source service. This service is intended for use "AS IS".
What information does the Application obtain and how is it used?The Application does not obtain any information when you download and use it. Registration is not required to use the Application.
Does the Application collect precise real time location information of the device?This Application does not collect precise information about the location of your mobile device.
Do third parties see and/or have access to information obtained by the Application?Since the Application does not collect any information, no data is shared with third parties.
What are my opt-out rights?You can stop all collection of information by the Application easily by uninstalling it. You may use the standard uninstall processes as may be available as part of your mobile device or via the mobile application marketplace or network.
ChildrenThe Application is not used to knowingly solicit data from or market to children under the age of 13.
The Service Provider does not knowingly collect personally
11 | identifiable information from children. The Service Provider
12 | encourages all children to never submit any personally
13 | identifiable information through the Application and/or Services.
14 | The Service Provider encourage parents and legal guardians to monitor
15 | their children's Internet usage and to help enforce this Policy by instructing
16 | their children never to provide personally identifiable information through the Application and/or Services without their permission. If you have reason to believe that a child
17 | has provided personally identifiable information to the Service Provider through the Application and/or Services,
18 | please contact the Service Provider (t.v.s10123@gmail.com) so that they will be able to take the necessary actions.
19 | You must also be at least 16 years of age to consent to the processing
20 | of your personally identifiable information in your country (in some countries we may allow your parent
21 | or guardian to do so on your behalf).
SecurityThe Service Provider is concerned about safeguarding the confidentiality of your information. However, since the Application does not collect any information, there is no risk of your data being accessed by unauthorized individuals.
ChangesThis Privacy Policy may be updated from time to time for any reason. The Service Provider will notify you of any changes to their Privacy Policy by updating this page with the new Privacy Policy. You are advised to consult this Privacy Policy regularly for any changes, as continued use is deemed approval of all changes.
This privacy policy is effective as of 2025-03-16
Your ConsentBy using the Application, you are consenting to the processing of your information as set forth in this Privacy Policy now and as amended by the Service Provider.
Contact UsIf you have any questions regarding privacy while using the Application, or have questions about the practices, please contact the Service Provider via email at t.v.s10123@gmail.com.
This privacy policy page was generated by App Privacy Policy Generator
22 |
23 |
24 |
25 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/changelogs/6.txt:
--------------------------------------------------------------------------------
1 | - fix icon
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/full_description.txt:
--------------------------------------------------------------------------------
1 | Have you found yourself in a situation where you wanted a *strong* reminder to something someday in the future?!
2 |
3 | A reminder wouldn't really do since it would just give you a notification, an e-mail, or a small _pling_ which can get lost in the abyss of notifications we receive every day.
4 |
5 | Have you thought, "Wish I could set an alarm for a future day/time"?
6 |
7 | Don't worry, RemindMe! Got you covered.
8 |
9 | PS: `SYSTEM_ALERT_WINDOW` permission is used because Android wouldn't let me start an activity from the background. Hence, I display a transparent system overlay for a very small duration (500 ms), then open the alarm activity as soon as the overlay gets drawn, and close the overlay later.
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/images/featureGraphic.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/VishnuSanal/RemindMe/ed66237ff18884e8fc63cb1f7779b52f511b2785/fastlane/metadata/android/en-US/images/featureGraphic.png
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/images/icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/VishnuSanal/RemindMe/ed66237ff18884e8fc63cb1f7779b52f511b2785/fastlane/metadata/android/en-US/images/icon.png
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/images/phoneScreenshots/1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/VishnuSanal/RemindMe/ed66237ff18884e8fc63cb1f7779b52f511b2785/fastlane/metadata/android/en-US/images/phoneScreenshots/1.png
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/images/phoneScreenshots/2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/VishnuSanal/RemindMe/ed66237ff18884e8fc63cb1f7779b52f511b2785/fastlane/metadata/android/en-US/images/phoneScreenshots/2.png
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/images/phoneScreenshots/3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/VishnuSanal/RemindMe/ed66237ff18884e8fc63cb1f7779b52f511b2785/fastlane/metadata/android/en-US/images/phoneScreenshots/3.png
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/short_description.txt:
--------------------------------------------------------------------------------
1 | Set alarms for a specific date in the future (alarm, not a reminder!).
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/title.txt:
--------------------------------------------------------------------------------
1 | Remind Me!
--------------------------------------------------------------------------------
/gradle.properties:
--------------------------------------------------------------------------------
1 | # Project-wide Gradle settings.
2 | # IDE (e.g. Android Studio) users:
3 | # Gradle settings configured through the IDE *will override*
4 | # any settings specified in this file.
5 | # For more details on how to configure your build environment visit
6 | # http://www.gradle.org/docs/current/userguide/build_environment.html
7 | # Specifies the JVM arguments used for the daemon process.
8 | # The setting is particularly useful for tweaking memory settings.
9 | org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8
10 | # When configured, Gradle will run in incubating parallel mode.
11 | # This option should only be used with decoupled projects. For more details, visit
12 | # https://developer.android.com/r/tools/gradle-multi-project-decoupled-projects
13 | # org.gradle.parallel=true
14 | # AndroidX package structure to make it clearer which packages are bundled with the
15 | # Android operating system, and which are packaged with your app's APK
16 | # https://developer.android.com/topic/libraries/support-library/androidx-rn
17 | android.useAndroidX=true
18 | # Kotlin code style for this project: "official" or "obsolete":
19 | kotlin.code.style=official
20 | # Enables namespacing of each library's R class so that its R class includes only the
21 | # resources declared in the library itself and none from the library's dependencies,
22 | # thereby reducing the size of the R class for that library
23 | android.nonTransitiveRClass=true
24 | ksp.incremental=false
--------------------------------------------------------------------------------
/gradle/libs.versions.toml:
--------------------------------------------------------------------------------
1 | [versions]
2 | agp = "8.7.3"
3 | kotlin = "2.0.21"
4 | coreKtx = "1.15.0"
5 | junit = "4.13.2"
6 | junitVersion = "1.2.1"
7 | espressoCore = "3.6.1"
8 | lifecycleRuntimeKtx = "2.8.7"
9 | activityCompose = "1.9.3"
10 | composeBom = "2024.12.01"
11 |
12 | hiltAndroid = "2.52"
13 | hiltNavigationCompose = "1.2.0"
14 | roomKtx = "2.6.1"
15 | roomRuntime = "2.6.1"
16 | lifecycleService = "2.8.7"
17 |
18 | [libraries]
19 | androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" }
20 | junit = { group = "junit", name = "junit", version.ref = "junit" }
21 | androidx-junit = { group = "androidx.test.ext", name = "junit", version.ref = "junitVersion" }
22 | androidx-espresso-core = { group = "androidx.test.espresso", name = "espresso-core", version.ref = "espressoCore" }
23 | androidx-lifecycle-runtime-ktx = { group = "androidx.lifecycle", name = "lifecycle-runtime-ktx", version.ref = "lifecycleRuntimeKtx" }
24 | androidx-activity-compose = { group = "androidx.activity", name = "activity-compose", version.ref = "activityCompose" }
25 | androidx-compose-bom = { group = "androidx.compose", name = "compose-bom", version.ref = "composeBom" }
26 | androidx-ui = { group = "androidx.compose.ui", name = "ui" }
27 | androidx-ui-graphics = { group = "androidx.compose.ui", name = "ui-graphics" }
28 | androidx-ui-tooling = { group = "androidx.compose.ui", name = "ui-tooling" }
29 | androidx-ui-tooling-preview = { group = "androidx.compose.ui", name = "ui-tooling-preview" }
30 | androidx-ui-test-manifest = { group = "androidx.compose.ui", name = "ui-test-manifest" }
31 | androidx-ui-test-junit4 = { group = "androidx.compose.ui", name = "ui-test-junit4" }
32 | androidx-material3 = { group = "androidx.compose.material3", name = "material3" }
33 |
34 | androidx-hilt-navigation-compose = { module = "androidx.hilt:hilt-navigation-compose", version.ref = "hiltNavigationCompose" }
35 | androidx-room-ktx = { module = "androidx.room:room-ktx", version.ref = "roomKtx" }
36 | androidx-room-runtime = { module = "androidx.room:room-runtime", version.ref = "roomRuntime" }
37 | compiler = { module = "androidx.room:room-compiler", version.ref = "roomKtx" }
38 | hilt-android = { module = "com.google.dagger:hilt-android", version.ref = "hiltAndroid" }
39 | hilt-android-compiler = { module = "com.google.dagger:hilt-android-compiler", version.ref = "hiltAndroid" }
40 | androidx-lifecycle-service = { group = "androidx.lifecycle", name = "lifecycle-service", version.ref = "lifecycleService" }
41 |
42 | [plugins]
43 | android-application = { id = "com.android.application", version.ref = "agp" }
44 | kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" }
45 | kotlin-compose = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" }
46 |
47 |
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/VishnuSanal/RemindMe/ed66237ff18884e8fc63cb1f7779b52f511b2785/gradle/wrapper/gradle-wrapper.jar
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.properties:
--------------------------------------------------------------------------------
1 | #Sun Dec 15 21:09:08 IST 2024
2 | distributionBase=GRADLE_USER_HOME
3 | distributionPath=wrapper/dists
4 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-bin.zip
5 | zipStoreBase=GRADLE_USER_HOME
6 | zipStorePath=wrapper/dists
7 |
--------------------------------------------------------------------------------
/gradlew:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env sh
2 |
3 | #
4 | # Copyright 2015 the original author or authors.
5 | #
6 | # Licensed under the Apache License, Version 2.0 (the "License");
7 | # you may not use this file except in compliance with the License.
8 | # You may obtain a copy of the License at
9 | #
10 | # https://www.apache.org/licenses/LICENSE-2.0
11 | #
12 | # Unless required by applicable law or agreed to in writing, software
13 | # distributed under the License is distributed on an "AS IS" BASIS,
14 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 | # See the License for the specific language governing permissions and
16 | # limitations under the License.
17 | #
18 |
19 | ##############################################################################
20 | ##
21 | ## Gradle start up script for UN*X
22 | ##
23 | ##############################################################################
24 |
25 | # Attempt to set APP_HOME
26 | # Resolve links: $0 may be a link
27 | PRG="$0"
28 | # Need this for relative symlinks.
29 | while [ -h "$PRG" ] ; do
30 | ls=`ls -ld "$PRG"`
31 | link=`expr "$ls" : '.*-> \(.*\)$'`
32 | if expr "$link" : '/.*' > /dev/null; then
33 | PRG="$link"
34 | else
35 | PRG=`dirname "$PRG"`"/$link"
36 | fi
37 | done
38 | SAVED="`pwd`"
39 | cd "`dirname \"$PRG\"`/" >/dev/null
40 | APP_HOME="`pwd -P`"
41 | cd "$SAVED" >/dev/null
42 |
43 | APP_NAME="Gradle"
44 | APP_BASE_NAME=`basename "$0"`
45 |
46 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
47 | DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
48 |
49 | # Use the maximum available, or set MAX_FD != -1 to use that value.
50 | MAX_FD="maximum"
51 |
52 | warn () {
53 | echo "$*"
54 | }
55 |
56 | die () {
57 | echo
58 | echo "$*"
59 | echo
60 | exit 1
61 | }
62 |
63 | # OS specific support (must be 'true' or 'false').
64 | cygwin=false
65 | msys=false
66 | darwin=false
67 | nonstop=false
68 | case "`uname`" in
69 | CYGWIN* )
70 | cygwin=true
71 | ;;
72 | Darwin* )
73 | darwin=true
74 | ;;
75 | MINGW* )
76 | msys=true
77 | ;;
78 | NONSTOP* )
79 | nonstop=true
80 | ;;
81 | esac
82 |
83 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
84 |
85 |
86 | # Determine the Java command to use to start the JVM.
87 | if [ -n "$JAVA_HOME" ] ; then
88 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
89 | # IBM's JDK on AIX uses strange locations for the executables
90 | JAVACMD="$JAVA_HOME/jre/sh/java"
91 | else
92 | JAVACMD="$JAVA_HOME/bin/java"
93 | fi
94 | if [ ! -x "$JAVACMD" ] ; then
95 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
96 |
97 | Please set the JAVA_HOME variable in your environment to match the
98 | location of your Java installation."
99 | fi
100 | else
101 | JAVACMD="java"
102 | which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
103 |
104 | Please set the JAVA_HOME variable in your environment to match the
105 | location of your Java installation."
106 | fi
107 |
108 | # Increase the maximum file descriptors if we can.
109 | if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
110 | MAX_FD_LIMIT=`ulimit -H -n`
111 | if [ $? -eq 0 ] ; then
112 | if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
113 | MAX_FD="$MAX_FD_LIMIT"
114 | fi
115 | ulimit -n $MAX_FD
116 | if [ $? -ne 0 ] ; then
117 | warn "Could not set maximum file descriptor limit: $MAX_FD"
118 | fi
119 | else
120 | warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
121 | fi
122 | fi
123 |
124 | # For Darwin, add options to specify how the application appears in the dock
125 | if $darwin; then
126 | GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
127 | fi
128 |
129 | # For Cygwin or MSYS, switch paths to Windows format before running java
130 | if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
131 | APP_HOME=`cygpath --path --mixed "$APP_HOME"`
132 | CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
133 |
134 | JAVACMD=`cygpath --unix "$JAVACMD"`
135 |
136 | # We build the pattern for arguments to be converted via cygpath
137 | ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
138 | SEP=""
139 | for dir in $ROOTDIRSRAW ; do
140 | ROOTDIRS="$ROOTDIRS$SEP$dir"
141 | SEP="|"
142 | done
143 | OURCYGPATTERN="(^($ROOTDIRS))"
144 | # Add a user-defined pattern to the cygpath arguments
145 | if [ "$GRADLE_CYGPATTERN" != "" ] ; then
146 | OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
147 | fi
148 | # Now convert the arguments - kludge to limit ourselves to /bin/sh
149 | i=0
150 | for arg in "$@" ; do
151 | CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
152 | CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
153 |
154 | if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
155 | eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
156 | else
157 | eval `echo args$i`="\"$arg\""
158 | fi
159 | i=`expr $i + 1`
160 | done
161 | case $i in
162 | 0) set -- ;;
163 | 1) set -- "$args0" ;;
164 | 2) set -- "$args0" "$args1" ;;
165 | 3) set -- "$args0" "$args1" "$args2" ;;
166 | 4) set -- "$args0" "$args1" "$args2" "$args3" ;;
167 | 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
168 | 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
169 | 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
170 | 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
171 | 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
172 | esac
173 | fi
174 |
175 | # Escape application args
176 | save () {
177 | for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
178 | echo " "
179 | }
180 | APP_ARGS=`save "$@"`
181 |
182 | # Collect all arguments for the java command, following the shell quoting and substitution rules
183 | eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
184 |
185 | exec "$JAVACMD" "$@"
186 |
--------------------------------------------------------------------------------
/gradlew.bat:
--------------------------------------------------------------------------------
1 | @rem
2 | @rem Copyright 2015 the original author or authors.
3 | @rem
4 | @rem Licensed under the Apache License, Version 2.0 (the "License");
5 | @rem you may not use this file except in compliance with the License.
6 | @rem You may obtain a copy of the License at
7 | @rem
8 | @rem https://www.apache.org/licenses/LICENSE-2.0
9 | @rem
10 | @rem Unless required by applicable law or agreed to in writing, software
11 | @rem distributed under the License is distributed on an "AS IS" BASIS,
12 | @rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | @rem See the License for the specific language governing permissions and
14 | @rem limitations under the License.
15 | @rem
16 |
17 | @if "%DEBUG%" == "" @echo off
18 | @rem ##########################################################################
19 | @rem
20 | @rem Gradle startup script for Windows
21 | @rem
22 | @rem ##########################################################################
23 |
24 | @rem Set local scope for the variables with windows NT shell
25 | if "%OS%"=="Windows_NT" setlocal
26 |
27 | set DIRNAME=%~dp0
28 | if "%DIRNAME%" == "" set DIRNAME=.
29 | set APP_BASE_NAME=%~n0
30 | set APP_HOME=%DIRNAME%
31 |
32 | @rem Resolve any "." and ".." in APP_HOME to make it shorter.
33 | for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
34 |
35 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
36 | set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
37 |
38 | @rem Find java.exe
39 | if defined JAVA_HOME goto findJavaFromJavaHome
40 |
41 | set JAVA_EXE=java.exe
42 | %JAVA_EXE% -version >NUL 2>&1
43 | if "%ERRORLEVEL%" == "0" goto execute
44 |
45 | echo.
46 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
47 | echo.
48 | echo Please set the JAVA_HOME variable in your environment to match the
49 | echo location of your Java installation.
50 |
51 | goto fail
52 |
53 | :findJavaFromJavaHome
54 | set JAVA_HOME=%JAVA_HOME:"=%
55 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe
56 |
57 | if exist "%JAVA_EXE%" goto execute
58 |
59 | echo.
60 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
61 | echo.
62 | echo Please set the JAVA_HOME variable in your environment to match the
63 | echo location of your Java installation.
64 |
65 | goto fail
66 |
67 | :execute
68 | @rem Setup the command line
69 |
70 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
71 |
72 |
73 | @rem Execute Gradle
74 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
75 |
76 | :end
77 | @rem End local scope for the variables with windows NT shell
78 | if "%ERRORLEVEL%"=="0" goto mainEnd
79 |
80 | :fail
81 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
82 | rem the _cmd.exe /c_ return code!
83 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
84 | exit /b 1
85 |
86 | :mainEnd
87 | if "%OS%"=="Windows_NT" endlocal
88 |
89 | :omega
90 |
--------------------------------------------------------------------------------
/settings.gradle.kts:
--------------------------------------------------------------------------------
1 | pluginManagement {
2 | repositories {
3 | google {
4 | content {
5 | includeGroupByRegex("com\\.android.*")
6 | includeGroupByRegex("com\\.google.*")
7 | includeGroupByRegex("androidx.*")
8 | }
9 | }
10 | mavenCentral()
11 | gradlePluginPortal()
12 | }
13 | }
14 | dependencyResolutionManagement {
15 | repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
16 | repositories {
17 | google()
18 | mavenCentral()
19 | }
20 | }
21 |
22 | rootProject.name = "Remind Me!"
23 | include(":app")
24 |
--------------------------------------------------------------------------------