diff --git a/app/build.gradle b/app/build.gradle index 9c7b1619..272480a0 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,12 +1,11 @@ plugins { - id 'kotlin-kapt' + id 'com.google.devtools.ksp' id 'com.google.dagger.hilt.android' } apply plugin: 'com.android.application' apply plugin: 'com.google.gms.google-services' apply plugin: 'com.google.firebase.crashlytics' -apply plugin: 'kotlin-android' apply plugin: 'kotlin-parcelize' repositories { @@ -20,9 +19,9 @@ android { defaultConfig { applicationId "tech.salroid.filmy" minSdkVersion 24 - targetSdkVersion 35 - versionCode 23 - versionName "3.0.0" + targetSdkVersion 36 + versionCode 24 + versionName "3.1.0" multiDexEnabled true resourceConfigurations += ['en', 'de', 'es-rES', 'hi-rIN', 'nl-rNL'] } @@ -49,10 +48,6 @@ android { targetCompatibility JavaVersion.VERSION_21 } - kotlinOptions { - jvmTarget = '21' - } - buildFeatures { viewBinding = true buildConfig = true @@ -60,10 +55,6 @@ android { namespace 'tech.salroid.filmy' } -kapt { - correctErrorTypes true -} - static def getTMDBApiKey() { Properties props = new Properties() props.load(new FileInputStream(new File('secrets.properties'))) @@ -109,11 +100,11 @@ dependencies { def roomVersion = "2.8.1" implementation "androidx.room:room-runtime:$roomVersion" - kapt "androidx.room:room-compiler:$roomVersion" + ksp "androidx.room:room-compiler:$roomVersion" // Dagger Hilt - implementation "com.google.dagger:hilt-android:2.57.2" - kapt "com.google.dagger:hilt-compiler:2.57.2" + implementation "com.google.dagger:hilt-android:2.60.1" + ksp "com.google.dagger:hilt-compiler:2.60.1" // Navigation def nav_version = "2.9.5" diff --git a/app/src/main/java/tech/salroid/filmy/data/local/db/Converters.kt b/app/src/main/java/tech/salroid/filmy/data/local/db/Converters.kt index 80d51a75..e6d52574 100644 --- a/app/src/main/java/tech/salroid/filmy/data/local/db/Converters.kt +++ b/app/src/main/java/tech/salroid/filmy/data/local/db/Converters.kt @@ -35,51 +35,51 @@ class Converters { } @TypeConverter - fun fromStringOfArrayListOfGenres(value: String?): ArrayList? { - val listType: Type = object : TypeToken?>() {}.type - return Gson().fromJson(value, listType) + fun fromStringOfArrayListOfGenres(value: String?): ArrayList { + if (value.isNullOrEmpty()) return arrayListOf() + val listType: Type = object : TypeToken>() {}.type + return Gson().fromJson(value, listType) ?: arrayListOf() } @TypeConverter - fun fromArrayListOfGenres(genres: ArrayList?): String? { - val gson = Gson() - return gson.toJson(genres) + fun fromArrayListOfGenres(genres: ArrayList): String { + return Gson().toJson(genres) } @TypeConverter - fun fromStringOfArrayListOfProductionCompanies(value: String?): ArrayList? { - val listType: Type = object : TypeToken?>() {}.type - return Gson().fromJson(value, listType) + fun fromStringOfArrayListOfProductionCompanies(value: String?): ArrayList { + if (value.isNullOrEmpty()) return arrayListOf() + val listType: Type = object : TypeToken>() {}.type + return Gson().fromJson(value, listType) ?: arrayListOf() } @TypeConverter - fun fromArrayListOfProductionCompanies(genres: ArrayList?): String? { - val gson = Gson() - return gson.toJson(genres) + fun fromArrayListOfProductionCompanies(genres: ArrayList): String { + return Gson().toJson(genres) } @TypeConverter - fun fromStringOfArrayListOfProductionCountries(value: String?): ArrayList? { - val listType: Type = object : TypeToken?>() {}.type - return Gson().fromJson(value, listType) + fun fromStringOfArrayListOfProductionCountries(value: String?): ArrayList { + if (value.isNullOrEmpty()) return arrayListOf() + val listType: Type = object : TypeToken>() {}.type + return Gson().fromJson(value, listType) ?: arrayListOf() } @TypeConverter - fun fromArrayListOfProductionCountries(genres: ArrayList?): String? { - val gson = Gson() - return gson.toJson(genres) + fun fromArrayListOfProductionCountries(genres: ArrayList): String { + return Gson().toJson(genres) } @TypeConverter - fun fromStringOfArrayListOfSpokenLanguages(value: String?): ArrayList? { - val listType: Type = object : TypeToken?>() {}.type - return Gson().fromJson(value, listType) + fun fromStringOfArrayListOfSpokenLanguages(value: String?): ArrayList { + if (value.isNullOrEmpty()) return arrayListOf() + val listType: Type = object : TypeToken>() {}.type + return Gson().fromJson(value, listType) ?: arrayListOf() } @TypeConverter - fun fromArrayListOfSpokenLanguages(genres: ArrayList?): String? { - val gson = Gson() - return gson.toJson(genres) + fun fromArrayListOfSpokenLanguages(genres: ArrayList): String { + return Gson().toJson(genres) } @TypeConverter diff --git a/app/src/main/java/tech/salroid/filmy/ui/cast_crew/CastCrewDetailsActivity.kt b/app/src/main/java/tech/salroid/filmy/ui/cast_crew/CastCrewDetailsActivity.kt index 34edeac0..ba36ec6d 100644 --- a/app/src/main/java/tech/salroid/filmy/ui/cast_crew/CastCrewDetailsActivity.kt +++ b/app/src/main/java/tech/salroid/filmy/ui/cast_crew/CastCrewDetailsActivity.kt @@ -7,6 +7,7 @@ import android.os.Bundle import android.text.Html import android.view.MenuItem import android.view.View +import androidx.activity.addCallback import androidx.activity.viewModels import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.lifecycleScope @@ -83,6 +84,20 @@ class CastCrewDetailsActivity : AppCompatActivity() { viewModel.getCastCrewDetails(it) viewModel.getCastCrewMovies(it) } + + addBackPressListener() + } + + private fun addBackPressListener() { + onBackPressedDispatcher.addCallback(this) { + val fragment = supportFragmentManager.findFragmentByTag(DESCRIPTION) as FullReadFragment? + if (fragment != null && fragment.isVisible) { + fragment.dismiss() + } else { + isEnabled = false + onBackPressedDispatcher.onBackPressed() + } + } } private fun observeUiState() { @@ -177,12 +192,4 @@ class CastCrewDetailsActivity : AppCompatActivity() { return super.onOptionsItemSelected(item) } - override fun onBackPressed() { - val fragment = supportFragmentManager.findFragmentByTag(DESCRIPTION) as FullReadFragment? - if (fragment != null && fragment.isVisible) { - fragment.dismiss() - } else { - super.onBackPressed() - } - } } \ No newline at end of file diff --git a/app/src/main/java/tech/salroid/filmy/ui/home/MainActivity.kt b/app/src/main/java/tech/salroid/filmy/ui/home/MainActivity.kt index 7e829ef9..d194ee97 100644 --- a/app/src/main/java/tech/salroid/filmy/ui/home/MainActivity.kt +++ b/app/src/main/java/tech/salroid/filmy/ui/home/MainActivity.kt @@ -9,6 +9,7 @@ import android.os.Build import android.os.Bundle import android.view.animation.Animation import android.view.animation.Transformation +import androidx.activity.addCallback import androidx.activity.enableEdgeToEdge import androidx.activity.viewModels import androidx.appcompat.app.AppCompatActivity @@ -64,6 +65,20 @@ class MainActivity : AppCompatActivity() { introLogic() setupNavigation() observerUiStates() + addBackPressListener() + } + + private fun addBackPressListener() { + onBackPressedDispatcher.addCallback(this) { + lifecycleScope.launch { + if (viewModelSearch.isSearchOpen.value) { + viewModelSearch.closeSearch() + } else { + isEnabled = false + onBackPressedDispatcher.onBackPressed() + } + } + } } private fun isDarkMode(): Boolean { @@ -155,16 +170,6 @@ class MainActivity : AppCompatActivity() { //trendingFragment?.retryLoading() } - override fun onBackPressed() { - lifecycleScope.launch { - if (viewModelSearch.isSearchOpen.value) { - viewModelSearch.closeSearch() - } else { - super.onBackPressed() - } - } - } - override fun onResume() { super.onResume() if (darkMode != isDarkMode()) recreate() diff --git a/app/src/main/res/xml/preference.xml b/app/src/main/res/xml/preference.xml index 1144d673..a38cb77a 100644 --- a/app/src/main/res/xml/preference.xml +++ b/app/src/main/res/xml/preference.xml @@ -32,7 +32,7 @@ android:icon="@drawable/ic_document" android:key="Version" android:selectable="true" - android:summary="3.0.0" + android:summary="3.1.0" android:title="@string/version" />