Skip to content

Commit

Permalink
Merge branch 'develop' into version_kotlin-1.9.20
Browse files Browse the repository at this point in the history
  • Loading branch information
patrickunterwegs committed Nov 22, 2023
2 parents 4050c43 + b0d8376 commit 90fe3c9
Show file tree
Hide file tree
Showing 26 changed files with 962 additions and 1,609 deletions.
10 changes: 5 additions & 5 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,8 @@ android {
buildConfigField "long", "buildTime", System.currentTimeMillis() + "L"
minSdkVersion 21
targetSdkVersion 34
versionCode 206030001
versionName "2.06.03" // keep -release as a suffix also for release, build flavor adds the suffix e.g. .gplay (e.g. 1.00.00-rc0.gplay)
versionCode 206040009
versionName "2.06.04-beta09" // keep -release as a suffix also for release, build flavor adds the suffix e.g. .gplay (e.g. 1.00.00-rc0.gplay)
buildConfigField "String", "versionCodename", "\"Where there is love, there is life. ❤️🌈\""
multiDexEnabled true
vectorDrawables.useSupportLibrary = true
Expand Down Expand Up @@ -161,7 +161,7 @@ dependencies {

// Android KTX
implementation "androidx.core:core-ktx:$version_core"
implementation "org.jetbrains.kotlinx:kotlinx-serialization-json:1.6.0"
implementation "org.jetbrains.kotlinx:kotlinx-serialization-json:1.6.1"

// Android Annotations
implementation "androidx.annotation:annotation:1.7.0"
Expand All @@ -188,15 +188,15 @@ dependencies {

// Amazon billing & maps support
amazonImplementation 'com.amazon.device:amazon-appstore-sdk:3.0.4'
amazonImplementation "com.google.maps.android:maps-compose:4.1.1"
amazonImplementation "com.google.maps.android:maps-compose:4.3.0"
amazonImplementation "com.google.android.gms:play-services-maps:18.2.0"
amazonImplementation "com.google.android.gms:play-services-location:21.0.1"

// Huawei billing
//huaweiImplementation "com.huawei.hms:iap:$version_huawei_iap"

// Google Maps
gplayImplementation "com.google.maps.android:maps-compose:4.1.1"
gplayImplementation "com.google.maps.android:maps-compose:4.3.0"
gplayImplementation "com.google.android.gms:play-services-maps:18.2.0"
gplayImplementation "com.google.android.gms:play-services-location:21.0.1"

Expand Down
2,082 changes: 583 additions & 1,499 deletions app/src/main/baseline-prof.txt

Large diffs are not rendered by default.

26 changes: 26 additions & 0 deletions app/src/main/java/at/techbee/jtx/NotificationPublisher.kt
Original file line number Diff line number Diff line change
Expand Up @@ -174,5 +174,31 @@ class NotificationPublisher : BroadcastReceiver() {
SyncUtil.notifyContentObservers(context)
scheduleNextNotifications(context)
}

fun triggerImmediateAlarm(iCalObject: ICalObject, context: Context) {
if((iCalObject.summary.isNullOrEmpty() && iCalObject.description.isNullOrEmpty())
|| iCalObject.percent == 100
|| iCalObject.status == Status.COMPLETED.status
)
return

val notification = Alarm.createNotification(
iCalObject.id,
0L,
iCalObject.summary,
iCalObject.description,
false, // can never be read only
MainActivity2.NOTIFICATION_CHANNEL_ALARMS,
context
)
val notificationManager = NotificationManagerCompat.from(context)
if (ActivityCompat.checkSelfPermission(
context,
Manifest.permission.POST_NOTIFICATIONS
) == PackageManager.PERMISSION_GRANTED
) {
notificationManager.notify(iCalObject.id.toInt(), notification)
}
}
}
}
31 changes: 30 additions & 1 deletion app/src/main/java/at/techbee/jtx/ui/about/AboutReleaseinfo.kt
Original file line number Diff line number Diff line change
Expand Up @@ -8,20 +8,30 @@

package at.techbee.jtx.ui.about

import androidx.compose.animation.Crossfade
import androidx.compose.foundation.ExperimentalFoundationApi
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.width
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.automirrored.outlined.OpenInNew
import androidx.compose.material.icons.outlined.Visibility
import androidx.compose.material.icons.outlined.VisibilityOff
import androidx.compose.material3.ElevatedAssistChip
import androidx.compose.material3.Icon
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.material3.TextButton
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource
Expand All @@ -39,6 +49,9 @@ fun AboutReleaseinfo(
releaseinfos: List<Release>,
modifier: Modifier = Modifier
) {

var includePrereleases by remember { mutableStateOf(false) }
val releaseInfos2Show = if(includePrereleases) releaseinfos else releaseinfos.filter { !it.prerelease }

LazyColumn(
modifier = modifier
Expand All @@ -56,8 +69,24 @@ fun AboutReleaseinfo(
)
}

item {
ElevatedAssistChip(
onClick = { includePrereleases = !includePrereleases },
label = {
Crossfade(includePrereleases, label = "includePrereleases") {
if (it)
Icon(Icons.Outlined.Visibility, stringResource(id = R.string.visible))
else
Icon(Icons.Outlined.VisibilityOff, stringResource(id = R.string.invisible))
}
Spacer(modifier = Modifier.width(8.dp))
Text("Pre-releases")
}
)
}

items(
items = releaseinfos.toList(),
items = releaseInfos2Show,
key = { release -> release.releaseName }
) { release ->
ReleaseInfoCard(
Expand Down
17 changes: 14 additions & 3 deletions app/src/main/java/at/techbee/jtx/ui/about/AboutScreen.kt
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,19 @@ import androidx.compose.foundation.ExperimentalFoundationApi
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.pager.HorizontalPager
import androidx.compose.foundation.pager.rememberPagerState
import androidx.compose.material3.*
import androidx.compose.runtime.*
import androidx.compose.material3.DrawerValue
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.Icon
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.PrimaryTabRow
import androidx.compose.material3.Scaffold
import androidx.compose.material3.Tab
import androidx.compose.material3.rememberDrawerState
import androidx.compose.runtime.Composable
import androidx.compose.runtime.State
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.ui.Alignment
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.Preview
Expand All @@ -30,7 +41,7 @@ import at.techbee.jtx.ui.reusable.appbars.JtxTopAppBar
import com.mikepenz.aboutlibraries.Libs
import kotlinx.coroutines.launch

@OptIn(ExperimentalFoundationApi::class)
@OptIn(ExperimentalFoundationApi::class, ExperimentalMaterial3Api::class)
@Composable
fun AboutScreen(
translators: List<String>,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ class AboutViewModel(application: Application) : AndroidViewModel(application) {
githubUrl = response.getJSONObject(i).getString("html_url")
)
Log.d("GithubRelease", "tag_name = ${release.releaseName}, description = ${release.releaseText}")
if(!release.prerelease && !releaseinfos.contains(release)) // prereleases are excluded
if(!releaseinfos.contains(release))
releaseinfos.add(release)
}
} catch (e: JSONException) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,7 @@ import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import at.techbee.jtx.NotificationPublisher
import at.techbee.jtx.R
import at.techbee.jtx.database.Component
import at.techbee.jtx.database.ICalCollection
Expand Down Expand Up @@ -262,8 +263,13 @@ fun DetailScreenContent(


val previousIsEditModeState = rememberSaveable { mutableStateOf(isEditMode.value) }
if (previousIsEditModeState.value && !isEditMode.value) //changed from edit to view mode
if (previousIsEditModeState.value && !isEditMode.value) { //changed from edit to view mode
saveEntry()

// trigger alarm immediately if setting is active
if(iCalObject.getModuleFromString() == Module.TODO && autoAlarmSetting == DropdownSettingOption.AUTO_ALARM_ALWAYS_ON_SAVE)
NotificationPublisher.triggerImmediateAlarm(iCalObject, context)
}
previousIsEditModeState.value = isEditMode.value


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,11 @@ import androidx.compose.foundation.pager.HorizontalPager
import androidx.compose.foundation.pager.rememberPagerState
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.verticalScroll
import androidx.compose.material3.*
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.SecondaryTabRow
import androidx.compose.material3.Tab
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.ui.Alignment
Expand All @@ -43,7 +47,7 @@ import at.techbee.jtx.database.locals.StoredListSettingData
import kotlinx.coroutines.launch


@OptIn(ExperimentalFoundationApi::class)
@OptIn(ExperimentalFoundationApi::class, ExperimentalMaterial3Api::class)
@Composable
fun ListOptionsBottomSheet(
module: Module,
Expand Down
6 changes: 6 additions & 0 deletions app/src/main/java/at/techbee/jtx/ui/list/ListViewModel.kt
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,7 @@ import at.techbee.jtx.database.properties.Resource
import at.techbee.jtx.database.relations.ICal4ListRel
import at.techbee.jtx.database.views.ICal4List
import at.techbee.jtx.database.views.VIEW_NAME_ICAL4LIST
import at.techbee.jtx.ui.settings.DropdownSettingOption
import at.techbee.jtx.ui.settings.SettingsStateHolder
import at.techbee.jtx.util.DateTimeUtils
import at.techbee.jtx.util.SyncUtil
Expand Down Expand Up @@ -492,6 +493,7 @@ open class ListViewModel(application: Application, val module: Module) : Android
viewModelScope.launch(Dispatchers.IO) {
try {
val newId = database.insertICalObject(icalObject)
icalObject.id = newId

categories.forEach {
it.icalObjectId = newId
Expand All @@ -517,6 +519,10 @@ open class ListViewModel(application: Application, val module: Module) : Android
sqlConstraintException.value = true
}
onChangeDone()

// trigger alarm immediately if setting is active
if(icalObject.getModuleFromString() == Module.TODO && SettingsStateHolder(_application).settingAutoAlarm.value == DropdownSettingOption.AUTO_ALARM_ALWAYS_ON_SAVE)
NotificationPublisher.triggerImmediateAlarm(icalObject, _application)
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,16 +9,40 @@
package at.techbee.jtx.ui.reusable.dialogs

import androidx.compose.animation.AnimatedVisibility
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.requiredWidth
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.verticalScroll
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.outlined.MoreTime
import androidx.compose.material.icons.outlined.Today
import androidx.compose.material.icons.outlined.TravelExplore
import androidx.compose.material3.*
import androidx.compose.runtime.*
import androidx.compose.material3.AlertDialog
import androidx.compose.material3.Checkbox
import androidx.compose.material3.DatePicker
import androidx.compose.material3.DisplayMode
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.Icon
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.SecondaryTabRow
import androidx.compose.material3.Tab
import androidx.compose.material3.Text
import androidx.compose.material3.TextButton
import androidx.compose.material3.TimePicker
import androidx.compose.material3.rememberDatePickerState
import androidx.compose.material3.rememberTimePickerState
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableIntStateOf
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalInspectionMode
Expand All @@ -35,7 +59,7 @@ import at.techbee.jtx.util.DateTimeUtils
import java.time.Instant
import java.time.ZoneId
import java.time.ZonedDateTime
import java.util.*
import java.util.TimeZone
import kotlin.collections.contains


Expand All @@ -57,28 +81,30 @@ fun DatePickerDialog(
val tabIndexTimezone = 2
var selectedTab by remember { mutableIntStateOf(0) }

/*
fun isValidDate(date: Long): Boolean {
/*
val zonedDate = ZonedDateTime.ofInstant(Instant.ofEpochMilli(date), ZoneId.of("UTC")).withHour(0).withMinute(0).withSecond(0).withNano(0).withZoneSameLocal(DateTimeUtils.requireTzId(timezone))
val zonedMinDate = minDate?.withZoneSameLocal(DateTimeUtils.requireTzId(timezone))
val zonedMaxDate = maxDate?.withZoneSameLocal(DateTimeUtils.requireTzId(timezone))
return if(timezone == TZ_ALLDAY)
zonedDate.year*zonedDate.dayOfYear in (zonedMinDate?.year?:0)*(zonedMinDate?.dayOfYear?:0) until (zonedMaxDate?.year?:3000)*(zonedMaxDate?.dayOfYear?:367)
else
zonedDate.year*zonedDate.dayOfYear in (zonedMinDate?.year?:0)*(zonedMinDate?.dayOfYear?:0) .. (zonedMaxDate?.year?:3000)*(zonedMaxDate?.dayOfYear?:367)
*/
return true
}
*/

val initialZonedDateTime = datetime
?.let { ZonedDateTime.ofInstant(Instant.ofEpochMilli(it), DateTimeUtils.requireTzId(timezone)) }
?: minDate

val datePickerState = rememberDatePickerState(
initialSelectedDateMillis = initialZonedDateTime?.toInstant()?.toEpochMilli()?.plus(initialZonedDateTime.offset.totalSeconds*1000),
initialSelectedDateMillis = initialZonedDateTime?.toInstant()?.toEpochMilli()?.plus(initialZonedDateTime.offset.totalSeconds*1000)
/*
selectableDates = object: SelectableDates {
override fun isSelectableDate(utcTimeMillis: Long) = isValidDate((utcTimeMillis))
}
*/
)
val timePickerState = rememberTimePickerState(initialZonedDateTime?.hour?:0, initialZonedDateTime?.minute?:0)

Expand Down Expand Up @@ -113,6 +139,7 @@ fun DatePickerDialog(
checked = datePickerState.selectedDateMillis != null,
onCheckedChange = {
datePickerState.selectedDateMillis = if (it) defaultDateTime.withZoneSameLocal(ZoneId.of("UTC")).toInstant().toEpochMilli() else null
datePickerState.displayMode = DisplayMode.Picker
newTimezone = if (it) TZ_ALLDAY else null
selectedTab = tabIndexDate
},
Expand Down Expand Up @@ -183,7 +210,7 @@ fun DatePickerDialog(
}
}

AnimatedVisibility(selectedTab == tabIndexDate && datePickerState.selectedDateMillis == null) {
AnimatedVisibility(selectedTab == tabIndexDate && datePickerState.selectedDateMillis == null && datePickerState.displayMode != DisplayMode.Input) {
Text(
stringResource(id = R.string.not_set2),
fontStyle = FontStyle.Italic,
Expand All @@ -194,7 +221,7 @@ fun DatePickerDialog(
)
}

AnimatedVisibility(selectedTab == tabIndexDate && datePickerState.selectedDateMillis != null) {
AnimatedVisibility(selectedTab == tabIndexDate && (datePickerState.selectedDateMillis != null || datePickerState.displayMode == DisplayMode.Input)) {
Column(modifier = Modifier.verticalScroll(rememberScrollState())) {
DatePicker(
state = datePickerState,
Expand Down Expand Up @@ -250,7 +277,7 @@ fun DatePickerDialog(


TextButton(
enabled = datePickerState.selectedDateMillis?.let { isValidDate(it) } ?: true,
//enabled = datePickerState.selectedDateMillis?.let { isValidDate(it) } ?: true,
onClick = {
if (newTimezone != null && newTimezone != TZ_ALLDAY && !TimeZone.getAvailableIDs()
.contains(newTimezone)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -130,7 +130,8 @@ enum class DropdownSetting(
DropdownSettingOption.AUTO_ALARM_OFF,
DropdownSettingOption.AUTO_ALARM_ON_START,
DropdownSettingOption.AUTO_ALARM_ON_DUE,
DropdownSettingOption.AUTO_ALARM_ALWAYS_ON_DUE
DropdownSettingOption.AUTO_ALARM_ALWAYS_ON_DUE,
DropdownSettingOption.AUTO_ALARM_ALWAYS_ON_SAVE
),
default = DropdownSettingOption.AUTO_ALARM_OFF
),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@ enum class DropdownSettingOption(
AUTO_ALARM_ON_START("on_start", R.string.alarms_onstart),
AUTO_ALARM_ON_DUE("on_due", R.string.alarms_ondue),
AUTO_ALARM_ALWAYS_ON_DUE("always_on_due", R.string.alarms_always_ondue),
AUTO_ALARM_ALWAYS_ON_SAVE("always_on_save", R.string.alarms_always_on_save),

PROTECT_BIOMETRIC_OFF("protect_biometric_off", R.string.off),
PROTECT_BIOMETRIC_CONFIDENTIAL("protect_biometric_confidential", R.string.settings_protect_biometric_confidential),
Expand Down
Loading

0 comments on commit 90fe3c9

Please sign in to comment.