diff --git a/Habitica/build.gradle b/Habitica/build.gradle index 1c10ed982..f7435677b 100644 --- a/Habitica/build.gradle +++ b/Habitica/build.gradle @@ -40,7 +40,7 @@ dependencies { compileOnly 'javax.annotation:javax.annotation-api:1.3.2' //App Compatibility and Material Design implementation "androidx.appcompat:appcompat:$appcompat_version" - implementation 'com.google.android.material:material:1.10.0' + implementation 'com.google.android.material:material:1.11.0' implementation "androidx.recyclerview:recyclerview:$recyclerview_version" implementation "androidx.preference:preference-ktx:$preferences_version" implementation "androidx.swiperefreshlayout:swiperefreshlayout:1.1.0" @@ -51,7 +51,7 @@ dependencies { implementation('com.jaredrummler:android-device-names:2.1.1') // IAP Handling / Verification - implementation "com.android.billingclient:billing-ktx:6.1.0" + implementation "com.android.billingclient:billing-ktx:6.2.1" implementation 'fr.avianey.com.viewpagerindicator:library:2.4.1@aar' implementation("io.coil-kt:coil-compose:$coil_version") @@ -111,11 +111,11 @@ dependencies { implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:$coroutines_version" implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$coroutines_version" implementation "com.google.accompanist:accompanist-themeadapter-material:$accompanist_version" - implementation "androidx.compose.material3:material3:1.2.0" + implementation "androidx.compose.material3:material3:1.2.1" implementation "com.google.accompanist:accompanist-systemuicontroller:$accompanist_version" implementation 'com.google.android.play:core:1.10.3' - implementation 'androidx.activity:activity-compose:1.8.2' + implementation 'androidx.activity:activity-compose:1.9.0' implementation "androidx.compose.runtime:runtime-livedata:$compose_version" implementation "androidx.compose.material:material:$compose_version" implementation "androidx.compose.animation:animation:$compose_version" @@ -144,7 +144,7 @@ android { defaultConfig { minSdkVersion min_sdk - compileSdk 34 + compileSdk target_sdk applicationId "com.habitrpg.android.habitica" vectorDrawables.useSupportLibrary = true buildConfigField "String", "STORE", "\"google\"" @@ -167,11 +167,12 @@ android { viewBinding true compose true renderScript true + buildConfig = true aidl true } composeOptions { - kotlinCompilerExtensionVersion = "1.5.3" + kotlinCompilerExtensionVersion = rootProject.compose_compiler } signingConfigs { diff --git a/Habitica/res/layout/shop_section_header.xml b/Habitica/res/layout/shop_section_header.xml index 9ebfaecf8..655c639a3 100644 --- a/Habitica/res/layout/shop_section_header.xml +++ b/Habitica/res/layout/shop_section_header.xml @@ -16,7 +16,7 @@ android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" - style="@style/Caption4" + style="@style/Caption2" tools:text="Section Header" android:textColor="?textColorSecondary" android:layout_marginStart="16dp" diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmSocialLocalRepository.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmSocialLocalRepository.kt index dc47c90dc..ad3d23474 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmSocialLocalRepository.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmSocialLocalRepository.kt @@ -215,7 +215,7 @@ class RealmSocialLocalRepository(realm: Realm) : user: User?, newValue: Boolean, ) { - executeTransaction { user?.party?.quest?.RSVPNeeded = newValue } + executeTransaction { user?.party?.quest?.rsvpNeeded = newValue } } override fun likeMessage( diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/AppConfigManager.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/AppConfigManager.kt index 26f519e16..d7fc41c2d 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/AppConfigManager.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/AppConfigManager.kt @@ -189,6 +189,7 @@ class AppConfigManager(contentRepository: ContentRepository?) : } fun enableCustomizationShop(): Boolean { + if (BuildConfig.DEBUG) return true return remoteConfig.getBoolean("enableCustomizationShop") } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/shops/Shop.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/shops/Shop.kt index 57108013e..739cb8f93 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/shops/Shop.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/shops/Shop.kt @@ -29,6 +29,6 @@ class Shop { const val QUEST_SHOP = "questShop" const val TIME_TRAVELERS_SHOP = "timeTravelersShop" const val SEASONAL_SHOP = "seasonalShop" - const val CUSTOMIZATIONS = "customizations" + const val CUSTOMIZATIONS = "customizationsShop" } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/ChallengeFormActivity.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/ChallengeFormActivity.kt index 9a2611f65..76543eb26 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/ChallengeFormActivity.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/ChallengeFormActivity.kt @@ -212,10 +212,10 @@ class ChallengeFormActivity : BaseActivity() { } override fun onCreate(savedInstanceState: Bundle?) { - addHabit = createTask(resources.getString(R.string.add_habit)) - addDaily = createTask(resources.getString(R.string.add_daily)) - addTodo = createTask(resources.getString(R.string.add_todo)) - addReward = createTask(resources.getString(R.string.add_reward)) + addHabit = createTask("addhabit", resources.getString(R.string.add_habit)) + addDaily = createTask("adddaily", resources.getString(R.string.add_daily)) + addTodo = createTask("addtodo", resources.getString(R.string.add_todo)) + addReward = createTask("addreward", resources.getString(R.string.add_reward)) super.onCreate(savedInstanceState) @@ -579,10 +579,10 @@ class ChallengeFormActivity : BaseActivity() { companion object { const val CHALLENGE_ID_KEY = "challengeId" - private fun createTask(taskName: String): Task { + private fun createTask(taskid: String, taskName: String): Task { val t = Task() - t.id = "addtask" + t.id = taskid t.text = taskName return t diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/TaskFormActivity.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/TaskFormActivity.kt index f1bcad846..d7bb4bc37 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/TaskFormActivity.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/TaskFormActivity.kt @@ -862,7 +862,7 @@ class TaskFormActivity : BaseActivity() { } val alert = HabiticaAlertDialog(this) alert.setTitle(R.string.are_you_sure) - alert.addButton(R.string.delete_task, false, isDestructive = true) { _, _ -> + alert.addButton(R.string.delete_task, true, isDestructive = true) { _, _ -> if (task?.isValid != true) return@addButton task?.id?.let { lifecycleScope.launch(Dispatchers.Main) { diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/social/InboxAdapter.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/social/InboxAdapter.kt index 855ec0c6d..7a231e83f 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/social/InboxAdapter.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/social/InboxAdapter.kt @@ -31,14 +31,6 @@ class InboxAdapter(private var user: User?) : return if (isPositionIntroMessage(position)) FIRST_MESSAGE else NORMAL_MESSAGE } - override fun getItemId(position: Int): Long { - return if (isPositionIntroMessage(position)) -1 else super.getItemId(position) - } - - override fun getItem(position: Int): ChatMessage? { - return if (isPositionIntroMessage(position)) ChatMessage() else super.getItem(position) - } - override fun onCreateViewHolder( parent: ViewGroup, viewType: Int, diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/social/challenges/ChallengeTasksRecyclerViewAdapter.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/social/challenges/ChallengeTasksRecyclerViewAdapter.kt index cac68ac7c..b22a9aca6 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/social/challenges/ChallengeTasksRecyclerViewAdapter.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/social/challenges/ChallengeTasksRecyclerViewAdapter.kt @@ -39,7 +39,7 @@ class ChallengeTasksRecyclerViewAdapter( TaskType.DAILY -> TYPE_DAILY TaskType.TODO -> TYPE_TODO TaskType.REWARD -> TYPE_REWARD - else -> if (task?.id == "addtask") TYPE_ADD_ITEM else TYPE_HEADER + else -> if (task?.id?.startsWith("add") == true) TYPE_ADD_ITEM else TYPE_HEADER } } @@ -55,6 +55,18 @@ class ChallengeTasksRecyclerViewAdapter( return position } + override fun onBindViewHolder(holder: BindableViewHolder, position: Int) { + if (holder is RewardViewHolder) { + val task = filteredContent?.get(position) + holder.isLocked = true + if (task != null) { + holder.bind(task, position, true, "normal", null) + } + } else { + super.onBindViewHolder(holder, position) + } + } + override fun onCreateViewHolder( parent: ViewGroup, viewType: Int, diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/customization/ComposeAvatarCustomizationFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/customization/ComposeAvatarCustomizationFragment.kt index bb148f690..119592971 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/customization/ComposeAvatarCustomizationFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/customization/ComposeAvatarCustomizationFragment.kt @@ -473,8 +473,8 @@ private fun AvatarCustomizationView( item(span = { GridItemSpan(3) }) { Text( typeName.uppercase(), - fontSize = 12.sp, - fontWeight = FontWeight.Medium, + fontSize = 14.sp, + fontWeight = FontWeight.SemiBold, color = colorResource(id = R.color.text_ternary), textAlign = TextAlign.Center, modifier = Modifier.padding(10.dp), diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/InboxMessageListFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/InboxMessageListFragment.kt index ce6ede816..a024cb344 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/InboxMessageListFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/InboxMessageListFragment.kt @@ -15,6 +15,7 @@ import androidx.fragment.app.viewModels import androidx.lifecycle.Lifecycle import androidx.lifecycle.lifecycleScope import androidx.lifecycle.repeatOnLifecycle +import androidx.paging.PagingData import androidx.recyclerview.widget.RecyclerView import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.data.SocialRepository @@ -115,7 +116,9 @@ class InboxMessageListFragment : BaseMainFragment) { - socialRepository.markSomePrivateMessagesAsRead(viewModel.user.value, messages) + private fun markMessagesAsRead(messages: PagingData) { + //socialRepository.markSomePrivateMessagesAsRead(viewModel.user.value, messages) } private fun refreshConversation() { diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/QuestDetailFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/QuestDetailFragment.kt index dbc0173d6..eb33bd9e1 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/QuestDetailFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/QuestDetailFragment.kt @@ -119,7 +119,7 @@ class QuestDetailFragment : BaseMainFragment() { val user = userViewModel.user.value if (binding?.questResponseWrapper != null) { - if (userViewModel.userID != party?.quest?.leader && user?.party?.quest?.key == group.quest?.key && user?.party?.quest?.RSVPNeeded == false) { + if (userViewModel.userID != party?.quest?.leader && user?.party?.quest?.key == group.quest?.key && user?.party?.quest?.rsvpNeeded == false) { binding?.questLeaveButton?.visibility = View.VISIBLE } else { binding?.questLeaveButton?.visibility = View.GONE diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/AuthenticationViewModel.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/AuthenticationViewModel.kt index 2212b375d..65ceaa559 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/AuthenticationViewModel.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/AuthenticationViewModel.kt @@ -120,7 +120,7 @@ class AuthenticationViewModel // the app access to the account, but the user can fix this. // Forward the user to an activity in Google Play services. if (!activity.isFinishing) { - val intent = e.intent + val intent = e.intent ?: return recoverFromPlayServicesErrorResult.launch(intent) } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/InboxViewModel.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/InboxViewModel.kt index 4e4c06d0f..241fd4166 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/InboxViewModel.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/InboxViewModel.kt @@ -9,7 +9,9 @@ import androidx.paging.DataSource import androidx.paging.PagedList import androidx.paging.Pager import androidx.paging.PagingConfig +import androidx.paging.PagingData import androidx.paging.PagingSource +import androidx.paging.PagingState import androidx.paging.liveData import com.habitrpg.android.habitica.data.SocialRepository import com.habitrpg.android.habitica.data.UserRepository @@ -48,27 +50,14 @@ class InboxViewModel val memberIDState: StateFlow = memberIDFlow private val config = - PagedList.Config.Builder() - .setPageSize(10) - .setEnablePlaceholders(false) - .build() - - private val dataSourceFactory = - MessagesDataSourceFactory(socialRepository, recipientID, ChatMessage()) - val messages: LiveData> = - Pager( - PagingConfig( - config.pageSize, - config.prefetchDistance, - config.enablePlaceholders, - config.initialLoadSizeHint, - config.maxSize, - ), + PagingConfig(pageSize = 10, enablePlaceholders = false) + val messages: LiveData> = + Pager( + config, null, - dataSourceFactory.asPagingSourceFactory( - ArchTaskExecutor.getIOThreadExecutor().asCoroutineDispatcher(), - ), - ).liveData + ) { + MessagesDataSource(socialRepository, recipientID, ChatMessage()) + }.liveData private val member = memberIDFlow .filterNotNull() @@ -84,7 +73,7 @@ class InboxViewModel get() = memberIDFlow.value fun invalidateDataSource() { - dataSourceFactory.sourceLiveData.value?.invalidate() + } init { @@ -95,7 +84,8 @@ class InboxViewModel val member = socialRepository.retrieveMember(recipientUsername, false) setMemberID(member?.id ?: "") invalidateDataSource() - dataSourceFactory.updateRecipientID(memberID) + + // dataSourceFactory.updateRecipientID(memberID) } } } @@ -105,87 +95,30 @@ class MessagesDataSource( val socialRepository: SocialRepository, var recipientID: String?, var footer: ChatMessage?, -) : - PagingSource() { +) : PagingSource() { private var lastFetchWasEnd = false - override fun loadRange( - params: LoadRangeParams, - callback: LoadRangeCallback, - ) { + override fun getRefreshKey(state: PagingState): Int? { + TODO("Not yet implemented") + } + + override suspend fun load(params: LoadParams): LoadResult { if (lastFetchWasEnd) { - callback.onResult(emptyList()) - return + return LoadResult.Page(emptyList(), null, null) } - MainScope().launch(Dispatchers.Main.immediate) { - if (recipientID?.isNotBlank() != true) { - return@launch - } - val page = ceil(params.startPosition.toFloat() / params.loadSize.toFloat()).toInt() - val messages = - socialRepository.retrieveInboxMessages(recipientID ?: "", page) ?: return@launch - if (messages.size < 10) { - lastFetchWasEnd = true - callback.onResult(messages) - } else { - callback.onResult(messages) - } + if (recipientID?.isNotBlank() != true) { + return LoadResult.Error(Exception("Recipient ID is blank")) } - } - - override fun loadInitial( - params: LoadInitialParams, - callback: LoadInitialCallback, - ) { - lastFetchWasEnd = false - MainScope().launch(Dispatchers.Main.immediate) { - socialRepository.getInboxMessages(recipientID) - .map { socialRepository.getUnmanagedCopy(it) } - .take(1) - .flatMapLatest { - if (it.isEmpty()) { - if (recipientID?.isNotBlank() != true) { - return@flatMapLatest flowOf(it) - } - val messages = - socialRepository.retrieveInboxMessages(recipientID ?: "", 0) - ?: return@flatMapLatest emptyFlow() - if (messages.size < 10) { - lastFetchWasEnd = true - } - flowOf(messages) - } else { - flowOf(it) - } - } - .collect { - if (it.size < 10 && footer != null) { - callback.onResult(it.plusElement(footer!!), 0) - } else { - callback.onResult(it, 0) - } - } + val page = params.key ?: 0 + val messages = + socialRepository.retrieveInboxMessages(recipientID ?: "", page) ?: return LoadResult.Error( + Exception("Failed to retrieve messages") + ) + val nextPage = if (messages.size < 10) { + null + } else { + page + 1 } - } -} - -class MessagesDataSourceFactory( - val socialRepository: SocialRepository, - var recipientID: String?, - val footer: ChatMessage?, -) : - DataSource.Factory() { - val sourceLiveData = MutableLiveData() - var latestSource: MessagesDataSource = MessagesDataSource(socialRepository, recipientID, footer) - - fun updateRecipientID(newID: String?) { - recipientID = newID - latestSource.recipientID = newID - } - - override fun create(): DataSource { - latestSource = MessagesDataSource(socialRepository, recipientID, footer) - sourceLiveData.postValue(latestSource) - return latestSource + return LoadResult.Page(messages, if (page > 0) page - 1 else null, nextPage) } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/NotificationsViewModel.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/NotificationsViewModel.kt index 3fb25a29b..8c753bf98 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/NotificationsViewModel.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/NotificationsViewModel.kt @@ -158,7 +158,7 @@ open class NotificationsViewModel ) val quest = user.party?.quest - if (quest != null && quest.RSVPNeeded) { + if (quest != null && quest.rsvpNeeded) { val notification = Notification() notification.id = "custom-quest-invitation-" + user.party?.id notification.type = Notification.Type.QUEST_INVITATION.type diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/PartyViewModel.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/PartyViewModel.kt index 57a5a6039..990e709de 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/PartyViewModel.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/PartyViewModel.kt @@ -78,7 +78,7 @@ class PartyViewModel fun showParticipantButtons(): Boolean { val user = user.value - return !(user?.party == null || user.party?.quest == null) && !isQuestActive && user.party?.quest?.RSVPNeeded == true + return !(user?.party == null || user.party?.quest == null) && !isQuestActive && user.party?.quest?.rsvpNeeded == true } fun loadPartyID() { diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/utils/MemberSerialization.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/utils/MemberSerialization.kt index d88a70c4f..031f724ec 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/utils/MemberSerialization.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/utils/MemberSerialization.kt @@ -66,7 +66,7 @@ class MemberSerialization : JsonDeserializer { if (!obj.get("party").asJsonObject.get("quest").asJsonObject.has("RSVPNeeded")) { val quest = realm.where(Quest::class.java).equalTo("id", member.id).findFirst() if (quest != null && quest.isValid) { - member.party?.quest?.RSVPNeeded = quest.RSVPNeeded + member.party?.quest?.rsvpNeeded = quest.rsvpNeeded } } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/utils/QuestDeserializer.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/utils/QuestDeserializer.kt index e88d830a7..3348cb6e6 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/utils/QuestDeserializer.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/utils/QuestDeserializer.kt @@ -64,7 +64,7 @@ class QuestDeserializer : JsonDeserializer { quest.leader = obj.get("leader").asString } if (obj.has("RSVPNeeded")) { - quest.RSVPNeeded = obj.get("RSVPNeeded").asBoolean + quest.rsvpNeeded = obj.get("RSVPNeeded").asBoolean } if (obj.has("members")) { diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/utils/UserDeserializer.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/utils/UserDeserializer.kt index 3050345cd..c102ef94f 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/utils/UserDeserializer.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/utils/UserDeserializer.kt @@ -81,7 +81,7 @@ class UserDeserializer : JsonDeserializer { val realm = Realm.getDefaultInstance() val quest = realm.where(Quest::class.java).equalTo("id", user.id).findFirst() if (quest != null && quest.isValid) { - user.party?.quest?.RSVPNeeded = quest.RSVPNeeded + user.party?.quest?.rsvpNeeded = quest.rsvpNeeded } } if (partyObj.getAsJsonObject("quest").has("completed")) { diff --git a/build.gradle b/build.gradle index 7625297a8..1dcc79fbd 100644 --- a/build.gradle +++ b/build.gradle @@ -5,7 +5,7 @@ import org.jetbrains.kotlin.gradle.tasks.KotlinCompile buildscript { ext { min_sdk = 21 - target_sdk = 33 + target_sdk = 34 app_version_name = '' app_version_code = 0 @@ -13,13 +13,14 @@ buildscript { amplitude_version = '1.6.1' appcompat_version = '1.6.1' coil_version = '2.4.0' - compose_version = '1.6.2' - core_ktx_version = '1.12.0' + compose_version = '1.6.6' + compose_compiler = '1.5.12' + core_ktx_version = '1.13.0' coroutines_version = '1.7.3' daggerhilt_version = '2.51.1' firebase_bom = '31.3.0' kotest_version = '5.6.2' - kotlin_version = '1.9.10' + kotlin_version = '1.9.23' ktlint_version = '1.2.1' lifecycle_version = '2.7.0' markwon_version = '4.6.2' @@ -42,7 +43,7 @@ buildscript { mavenCentral() } dependencies { - classpath 'com.android.tools.build:gradle:8.3.1' + classpath 'com.android.tools.build:gradle:8.3.2' classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8' classpath 'com.google.gms:google-services:4.4.1' classpath 'com.google.firebase:firebase-crashlytics-gradle:2.9.9' diff --git a/common/build.gradle.kts b/common/build.gradle.kts index cce98b322..01afbaff6 100644 --- a/common/build.gradle.kts +++ b/common/build.gradle.kts @@ -40,10 +40,11 @@ android { buildFeatures { viewBinding = true compose = true + buildConfig = true } composeOptions { - kotlinCompilerExtensionVersion = "1.5.3" + kotlinCompilerExtensionVersion = rootProject.extra.get("compose_compiler") as String } compileOptions { diff --git a/common/src/main/java/com/habitrpg/common/habitica/helpers/KeyHelper.kt b/common/src/main/java/com/habitrpg/common/habitica/helpers/KeyHelper.kt index 60f96a04c..68d91e5bc 100644 --- a/common/src/main/java/com/habitrpg/common/habitica/helpers/KeyHelper.kt +++ b/common/src/main/java/com/habitrpg/common/habitica/helpers/KeyHelper.kt @@ -67,7 +67,7 @@ class KeyHelper if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { if (keyStore?.containsAlias(KEY_ALIAS) == false) { - val keyGenerator = KeyGenerator.getInstance(KeyProperties.KEY_ALGORITHM_AES, AndroidKeyStore) + val keyGenerator = KeyGenerator.getInstance(KeyProperties.KEY_ALGORITHM_AES, ANDROID_KEY_STORE) keyGenerator.init( KeyGenParameterSpec.Builder( KEY_ALIAS, @@ -94,7 +94,7 @@ class KeyHelper .setStartDate(start.time) .setEndDate(end.time) .build() - val kpg = KeyPairGenerator.getInstance("RSA", AndroidKeyStore) + val kpg = KeyPairGenerator.getInstance("RSA", ANDROID_KEY_STORE) kpg.initialize(spec) kpg.generateKeyPair() } diff --git a/gradle.properties b/gradle.properties index 89a88b55d..404e79491 100644 --- a/gradle.properties +++ b/gradle.properties @@ -7,7 +7,6 @@ org.gradle.jvmargs=-Xmx6656M org.gradle.warning.mode=all kotlin.mpp.stability.nowarn=true kotlin.mpp.androidSourceSetLayoutVersion=2 -android.defaults.buildfeatures.buildconfig=true android.nonTransitiveRClass=false android.nonFinalResIds=false android.enableR8.fullMode=false diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 794c53dee..81443c430 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Sun May 08 23:57:52 EDT 2022 +#Mon Apr 22 16:17:19 CEST 2024 distributionBase=GRADLE_USER_HOME -distributionUrl=https\://services.gradle.org/distributions/gradle-8.6-bin.zip distributionPath=wrapper/dists -zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-bin.zip zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/shared/build.gradle.kts b/shared/build.gradle.kts index 51b56a961..273cbefab 100644 --- a/shared/build.gradle.kts +++ b/shared/build.gradle.kts @@ -15,7 +15,9 @@ allprojects { kotlin { android() - ios() + iosX64() + iosArm64() + iosSimulatorArm64() js(IR) { browser() @@ -24,25 +26,21 @@ kotlin { } sourceSets { - val commonMain by getting { + commonMain { dependencies { implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:${rootProject.extra.get("coroutines_version")}") } } - val commonTest by getting { + commonTest { dependencies { implementation(kotlin("test")) // This brings all the platform dependencies automatically } } - val androidMain by getting - val androidUnitTest by getting - val iosMain by getting - val iosTest by getting } } android { - compileSdk = 33 + compileSdk = rootProject.extra.get("target_sdk") as Int sourceSets["main"].manifest.srcFile("src/androidMain/AndroidManifest.xml") defaultConfig { minSdk = 21 diff --git a/version.properties b/version.properties index 0c298b135..b7158f88c 100644 --- a/version.properties +++ b/version.properties @@ -1,2 +1,2 @@ -NAME=4.3.6 -CODE=7221 \ No newline at end of file +NAME=4.3.7 +CODE=7221