diff --git a/Habitica/build.gradle b/Habitica/build.gradle index 6a554a9b9..8052f0b1b 100644 --- a/Habitica/build.gradle +++ b/Habitica/build.gradle @@ -168,7 +168,7 @@ android { } composeOptions { - kotlinCompilerExtensionVersion = "1.4.4" + kotlinCompilerExtensionVersion = "1.4.6" } signingConfigs { @@ -271,15 +271,14 @@ android { compileOptions { coreLibraryDesugaringEnabled true - sourceCompatibility JavaVersion.VERSION_1_8 - targetCompatibility JavaVersion.VERSION_1_8 + sourceCompatibility JavaVersion.VERSION_11 + targetCompatibility JavaVersion.VERSION_11 } kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8.toString() + jvmTarget = JavaVersion.VERSION_11.toString() } - bundle { language { // Specifies that the app bundle should not support diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/SimpleSpinnerAdapter.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/SimpleSpinnerAdapter.kt index aaf581734..c21f617a8 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/SimpleSpinnerAdapter.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/SimpleSpinnerAdapter.kt @@ -10,8 +10,8 @@ import com.habitrpg.android.habitica.extensions.inflate class SimpleSpinnerAdapter(context: Context, resource: Int) : ArrayAdapter(context, resource, R.id.textView, context.resources.getTextArray(resource)) { - override fun getDropDownView(position: Int, convertView: View?, parent: ViewGroup?): View { - val view = parent?.inflate(R.layout.spinner_item, false) ?: View(context) + override fun getDropDownView(position : Int, convertView : View?, parent : ViewGroup) : View? { + val view = parent.inflate(R.layout.spinner_item, false) ?: View(context) (view as? TextView)?.text = getItem(position) return view } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/social/PartyMemberRecyclerViewAdapter.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/social/PartyMemberRecyclerViewAdapter.kt index 7e8b4bf36..d1dc3267f 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/social/PartyMemberRecyclerViewAdapter.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/social/PartyMemberRecyclerViewAdapter.kt @@ -20,7 +20,7 @@ class PartyMemberRecyclerViewAdapter : BaseRecyclerViewAdapter() { } private val webviewClient = object : WebViewClient() { - - override fun shouldOverrideUrlLoading(view: WebView?, url: String?): Boolean { - if (url?.contains("/static/new-stuff") == true) { - view?.loadUrl(url) - } else if (url != null) { - MainNavigationController.navigate(url) - } - return true - } - override fun shouldOverrideUrlLoading( view: WebView?, request: WebResourceRequest? diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/HabiticaAccountDialog.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/HabiticaAccountDialog.kt index b607fa574..19eba4bb9 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/HabiticaAccountDialog.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/preferences/HabiticaAccountDialog.kt @@ -38,7 +38,7 @@ class HabiticaAccountDialog(private var thisContext: Context) : DialogFragment(R override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - activity?.let { activity -> + activity?.let { _ -> ViewCompat.getWindowInsetsController(view)?.isAppearanceLightStatusBars = true } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/ChatFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/ChatFragment.kt index 0d96cd835..c260a6d16 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/ChatFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/ChatFragment.kt @@ -8,7 +8,9 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import androidx.lifecycle.Lifecycle import androidx.lifecycle.lifecycleScope +import androidx.lifecycle.repeatOnLifecycle import androidx.recyclerview.widget.LinearLayoutManager import com.habitrpg.android.habitica.MainNavDirections import com.habitrpg.android.habitica.R @@ -28,9 +30,9 @@ import com.habitrpg.android.habitica.ui.viewmodels.GroupViewModel import com.habitrpg.android.habitica.ui.views.HabiticaSnackbar.Companion.showSnackbar import com.habitrpg.android.habitica.ui.views.HabiticaSnackbar.SnackbarDisplayType import com.habitrpg.android.habitica.ui.views.dialogs.HabiticaAlertDialog +import com.habitrpg.common.habitica.helpers.launchCatching import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.delay -import kotlinx.coroutines.launch import javax.inject.Inject import kotlin.time.DurationUnit import kotlin.time.toDuration @@ -119,10 +121,12 @@ class ChatFragment : BaseFragment() { it?.flags?.communityGuidelinesAccepted == true } - lifecycleScope.launchWhenResumed { - while (true) { - refresh() - delay(30.toDuration(DurationUnit.SECONDS)) + lifecycleScope.launchCatching { + repeatOnLifecycle(Lifecycle.State.RESUMED) { + while (true) { + refresh() + delay(30.toDuration(DurationUnit.SECONDS)) + } } } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/PartyDetailFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/PartyDetailFragment.kt index b5723a0cc..d6ee9757b 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/PartyDetailFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/PartyDetailFragment.kt @@ -276,7 +276,7 @@ class PartyDetailFragment : BaseFragment() { val viewHolder = GroupMemberViewHolder(memberView) viewHolder.bind(member, leaderID ?: "", viewModel?.user?.value?.id) viewHolder.onClickEvent = { - FullProfileActivity.open(member.id ?: "") + FullProfileActivity.open(member.id) } viewHolder.sendMessageEvent = { member.id.let { showSendMessageToUserDialog(it, member.displayName) } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/PartySeekingFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/PartySeekingFragment.kt index 193dd3656..374031986 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/PartySeekingFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/PartySeekingFragment.kt @@ -9,7 +9,6 @@ import androidx.compose.foundation.background import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.IntrinsicSize import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth @@ -93,7 +92,7 @@ class PartySeekingViewModel @Inject constructor( suspend fun inviteUser(member : Member) : InviteResponse? { return socialRepository.inviteToGroup( "party", mapOf( - "uuids" to listOf(member.id ?: "") + "uuids" to listOf(member.id) ) )?.firstOrNull() } 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 385812743..8838db30f 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 @@ -72,7 +72,7 @@ class AuthenticationViewModel @Inject constructor( ) { val scopesString = Scopes.PROFILE + " " + Scopes.EMAIL val scopes = "oauth2:$scopesString" - var newUser = false + var newUser : Boolean CoroutineScope(Dispatchers.IO).launchCatching({ throwable -> if (recoverFromPlayServicesErrorResult == null) return@launchCatching if (throwable is GoogleAuthException) { diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/StableViewModel.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/StableViewModel.kt index ca0d786f9..8f0880083 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/StableViewModel.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewmodels/StableViewModel.kt @@ -145,7 +145,7 @@ class StableViewModel @Inject constructor( } items.add(0, "header") - items.removeAll { it is StableSection && (it.key as? String) == "special" && it.ownedCount == 0 } + items.removeAll { it is StableSection && it.key == "special" && it.ownedCount == 0 } return items } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/GroupPlanMemberList.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/GroupPlanMemberList.kt index 95c38e75a..4c2dd9253 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/GroupPlanMemberList.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/GroupPlanMemberList.kt @@ -60,9 +60,9 @@ fun GroupPlanMemberList( ?: emptyList() ) { item { - val role = if (group?.isLeader(member.id ?: "") == true) { + val role = if (group?.isLeader(member.id) == true) { stringResource(R.string.owner) - } else if (group?.isManager(member.id ?: "") == true) { + } else if (group?.isManager(member.id) == true) { stringResource(R.string.manager) } else { stringResource(R.string.member) diff --git a/build.gradle b/build.gradle index 8cfb8e4df..50df0710f 100644 --- a/build.gradle +++ b/build.gradle @@ -117,3 +117,9 @@ tasks.named("detekt").configure { task allUnitTests(type: GradleBuild) { tasks = [':Habitica:testProdDebugUnitTest', ':wearos:testProdDebugUnitTest', ':common:testProdDebugUnitTest', ':shared:testDebugUnitTest'] } + +subprojects { + tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).configureEach { + kotlinOptions.jvmTarget = "11" + } +} diff --git a/common/build.gradle.kts b/common/build.gradle.kts index 455dc8c0d..06f79a85e 100644 --- a/common/build.gradle.kts +++ b/common/build.gradle.kts @@ -1,5 +1,5 @@ -import java.util.Properties import java.io.FileInputStream +import java.util.Properties plugins { id("com.android.library") @@ -13,7 +13,6 @@ android { defaultConfig { minSdk = rootExtra.get("min_sdk") as Int - targetSdkVersion(rootExtra.get("target_sdk") as Int) testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" consumerProguardFiles("consumer-rules.pro") @@ -35,12 +34,12 @@ android { } compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 } - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8.toString() + kotlin { + jvmToolchain(11) } namespace = "com.habitrpg.common.habitica" @@ -78,12 +77,12 @@ android { } } -val core_ktx_version = rootExtra.get("core_ktx_version") -val appcompat_version = rootExtra.get("appcompat_version") -val markwon_version = rootExtra.get("markwon_version") -val coil_version = rootExtra.get("coil_version") -val mockk_version = rootExtra.get("mockk_version") -val kotest_version = rootExtra.get("kotest_version") +val core_ktx_version: String by rootExtra +val appcompat_version: String by rootExtra +val markwon_version: String by rootExtra +val coil_version: String by rootExtra +val mockk_version: String by rootExtra +val kotest_version: String by rootExtra dependencies { implementation(fileTree(mapOf("include" to listOf("*.jar"), "dir" to "libs"))) @@ -122,17 +121,13 @@ android.testOptions { // Add Habitica Properties to buildConfigField val HRPG_PROPS_FILE = File(projectDir.absolutePath + "/../habitica.properties") if (HRPG_PROPS_FILE.canRead()) { - val HRPG_PROPS = Properties() - HRPG_PROPS.load(FileInputStream(HRPG_PROPS_FILE)) + val hrpgProps = Properties() + hrpgProps.load(FileInputStream(HRPG_PROPS_FILE)) - if (HRPG_PROPS != null) { - android.buildTypes.configureEach { - HRPG_PROPS.forEach { property -> - buildConfigField("String", property.key as String, "\"${property.value}\"") - } + android.buildTypes.configureEach { + hrpgProps.forEach { property -> + buildConfigField("String", property.key as String, "\"${property.value}\"") } - } else { - throw InvalidUserDataException("habitica.properties found but some entries are missing") } } else { throw MissingResourceException("habitica.properties not found") diff --git a/shared/build.gradle.kts b/shared/build.gradle.kts index e6d35b4cc..7c0bce154 100644 --- a/shared/build.gradle.kts +++ b/shared/build.gradle.kts @@ -20,7 +20,7 @@ kotlin { sourceSets { val commonMain by getting { dependencies { - implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4") + implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:${rootProject.extra.get("coroutines_version")}") } } val commonTest by getting { @@ -47,5 +47,10 @@ android { } } + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + namespace = "com.habitrpg.shared.habitica" }