From 469fbdb4ff2d8706bbb6ad008164a491c7e1f853 Mon Sep 17 00:00:00 2001 From: Sergey Bobrenok Date: Sun, 4 Oct 2026 16:21:32 +0300 Subject: [PATCH 1/8] Upgrade AGP to 8.13.2 AGP 8.13.0 is the minimum version required to use 36.1 target SDK. --- app/build.gradle | 2 +- app/gradle/wrapper/gradle-wrapper.properties | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index c4c2f0d..728bb16 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -7,7 +7,7 @@ buildscript { mavenCentral() } dependencies { - classpath 'com.android.tools.build:gradle:8.6.0' + classpath 'com.android.tools.build:gradle:8.13.2' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" } } diff --git a/app/gradle/wrapper/gradle-wrapper.properties b/app/gradle/wrapper/gradle-wrapper.properties index 20db9ad..c6f0030 100644 --- a/app/gradle/wrapper/gradle-wrapper.properties +++ b/app/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-bin.zip networkTimeout=10000 zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists From b4f16e756b22e106c9916c4ec92f469faad5b679 Mon Sep 17 00:00:00 2001 From: Sergey Bobrenok Date: Sun, 4 Oct 2026 16:21:32 +0300 Subject: [PATCH 2/8] Fix gradle 9 deprecation warnings https://docs.gradle.org/8.13/userguide/upgrading_version_8.html#groovy_space_assignment_syntax --- app/build.gradle | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 728bb16..ae4472a 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -16,7 +16,7 @@ allprojects { repositories { google() mavenCentral() - maven { url "https://jitpack.io" } + maven { url = "https://jitpack.io" } } } @@ -26,7 +26,7 @@ apply plugin: 'kotlin-android' android { defaultConfig { applicationId "ru.nsu.bobrofon.easysshfs" - compileSdk 35 + compileSdk = 35 minSdkVersion 21 targetSdkVersion 35 versionCode 104 @@ -45,12 +45,12 @@ android { buildTypes { release { minifyEnabled true - shrinkResources true + shrinkResources = true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' - signingConfig signingConfigs.release + signingConfig = signingConfigs.release } debug { - signingConfig signingConfigs.debug + signingConfig = signingConfigs.debug } } externalNativeBuild { @@ -59,8 +59,8 @@ android { } } buildFeatures { - viewBinding true - buildConfig true + viewBinding = true + buildConfig = true } compileOptions { sourceCompatibility JavaVersion.VERSION_17 @@ -69,10 +69,10 @@ android { kotlinOptions { jvmTarget = "17" } - namespace 'ru.nsu.bobrofon.easysshfs' + namespace = 'ru.nsu.bobrofon.easysshfs' packagingOptions { jniLibs { - useLegacyPackaging true + useLegacyPackaging = true } } } From fefe3548f222ed333d0efe624e3a50dd0662c1c0 Mon Sep 17 00:00:00 2001 From: Sergey Bobrenok Date: Sun, 4 Oct 2026 16:21:32 +0300 Subject: [PATCH 3/8] Switch to target SDK 36 (Android 16) --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index ae4472a..6560fa4 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -26,9 +26,9 @@ apply plugin: 'kotlin-android' android { defaultConfig { applicationId "ru.nsu.bobrofon.easysshfs" - compileSdk = 35 + compileSdk = 36 minSdkVersion 21 - targetSdkVersion 35 + targetSdkVersion 36 versionCode 104 versionName "0.5.19-dev" From 94de9e0082e523e7721118be777412e0826d831b Mon Sep 17 00:00:00 2001 From: Sergey Bobrenok Date: Sun, 4 Oct 2026 16:21:32 +0300 Subject: [PATCH 4/8] Update androidx dependencies --- app/build.gradle | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 6560fa4..fa7f877 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,7 +1,7 @@ // SPDX-License-Identifier: MIT buildscript { - ext.kotlin_version = '1.8.20' - ext.nav_version = '2.9.7' + ext.kotlin_version = '2.2.20' + ext.nav_version = '2.9.8' repositories { google() mavenCentral() @@ -79,15 +79,15 @@ android { dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) - implementation 'androidx.appcompat:appcompat:1.6.1' + implementation 'androidx.appcompat:appcompat:1.7.1' implementation 'androidx.legacy:legacy-support-v4:1.0.0' - implementation "androidx.datastore:datastore-preferences:1.0.0" + implementation "androidx.datastore:datastore-preferences:1.1.7" implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4' - implementation 'androidx.preference:preference-ktx:1.2.0' - implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1' - implementation "androidx.fragment:fragment-ktx:1.6.0" - implementation "androidx.core:core-ktx:1.10.1" + implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.11.0' + implementation 'androidx.preference:preference-ktx:1.2.1' + implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.9.4' + implementation "androidx.fragment:fragment-ktx:1.8.9" + implementation "androidx.core:core-ktx:1.17.0" implementation "androidx.navigation:navigation-fragment-ktx:$nav_version" implementation "androidx.navigation:navigation-ui-ktx:$nav_version" From dd5c68056ff2a587d359df78bb7ce5065789f901 Mon Sep 17 00:00:00 2001 From: Sergey Bobrenok Date: Sun, 4 Oct 2026 16:21:32 +0300 Subject: [PATCH 5/8] Update libsu to 6.0.0 --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index fa7f877..5d3e3ff 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -91,7 +91,7 @@ dependencies { implementation "androidx.navigation:navigation-fragment-ktx:$nav_version" implementation "androidx.navigation:navigation-ui-ktx:$nav_version" - def libsuVersion = '3.2.1' + def libsuVersion = '6.0.0' // The core module is used by all other components implementation "com.github.topjohnwu.libsu:core:${libsuVersion}" // Optional: APIs for creating root services From 1d119af62f3f8c97bc2254e941a240c5f2d10340 Mon Sep 17 00:00:00 2001 From: Sergey Bobrenok Date: Sun, 4 Oct 2026 16:21:32 +0300 Subject: [PATCH 6/8] Use proguard-android-optimize --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 5d3e3ff..cd4b1bd 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -46,7 +46,7 @@ android { release { minifyEnabled true shrinkResources = true - proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' signingConfig = signingConfigs.release } debug { From 75432c43871b6a88847e7e6ab972a58c8c383af7 Mon Sep 17 00:00:00 2001 From: Sergey Bobrenok Date: Sun, 4 Oct 2026 16:21:32 +0300 Subject: [PATCH 7/8] Replace deprecated kitlinOptions --- app/build.gradle | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index cd4b1bd..2b12754 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,4 +1,6 @@ // SPDX-License-Identifier: MIT +import org.jetbrains.kotlin.gradle.dsl.JvmTarget + buildscript { ext.kotlin_version = '2.2.20' ext.nav_version = '2.9.8' @@ -66,8 +68,10 @@ android { sourceCompatibility JavaVersion.VERSION_17 targetCompatibility JavaVersion.VERSION_17 } - kotlinOptions { - jvmTarget = "17" + kotlin { + compilerOptions { + jvmTarget = JvmTarget.JVM_17 + } } namespace = 'ru.nsu.bobrofon.easysshfs' packagingOptions { From 9a6e889b8c93240f394ea69143c1d63902ccac82 Mon Sep 17 00:00:00 2001 From: Sergey Bobrenok Date: Sun, 4 Oct 2026 17:44:21 +0300 Subject: [PATCH 8/8] Close the navigation drawer on "back". DrawerLayout 1.1.x closes the drawer only on KEYCODE_BACK, which is not dispatched to apps with predictive back enabled (default since target SDK 36). Without this callback "back" would finish the activity while the drawer is open. --- .../bobrofon/easysshfs/EasySSHFSActivity.kt | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/app/src/main/java/ru/nsu/bobrofon/easysshfs/EasySSHFSActivity.kt b/app/src/main/java/ru/nsu/bobrofon/easysshfs/EasySSHFSActivity.kt index a319f26..801cccb 100644 --- a/app/src/main/java/ru/nsu/bobrofon/easysshfs/EasySSHFSActivity.kt +++ b/app/src/main/java/ru/nsu/bobrofon/easysshfs/EasySSHFSActivity.kt @@ -8,11 +8,14 @@ import android.content.pm.PackageManager import android.os.Build import android.os.Bundle import android.util.Log +import android.view.View import android.widget.Toast +import androidx.activity.OnBackPressedCallback import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatDelegate import androidx.appcompat.widget.Toolbar import androidx.core.content.ContextCompat +import androidx.core.view.GravityCompat import androidx.drawerlayout.widget.DrawerLayout import androidx.lifecycle.ViewModelProvider import androidx.navigation.fragment.NavHostFragment @@ -70,6 +73,7 @@ class EasySSHFSActivity : AppCompatActivity() { setSupportActionBar(toolbar) val drawerLayout = findViewById(R.id.drawer_layout) + setupDrawerBackHandling(drawerLayout) val appBarConfiguration = AppBarConfiguration( setOf( R.id.mountpointFragment, @@ -103,6 +107,29 @@ class EasySSHFSActivity : AppCompatActivity() { } } + private fun setupDrawerBackHandling(drawerLayout: DrawerLayout) { + val closeDrawerCallback = object : OnBackPressedCallback(false) { + override fun handleOnBackPressed() { + drawerLayout.closeDrawer(GravityCompat.START) + } + } + onBackPressedDispatcher.addCallback(this, closeDrawerCallback) + + drawerLayout.addDrawerListener(object : DrawerLayout.SimpleDrawerListener() { + override fun onDrawerOpened(drawerView: View) { + closeDrawerCallback.isEnabled = true + } + + override fun onDrawerClosed(drawerView: View) { + closeDrawerCallback.isEnabled = false + } + }) + // The drawer may be restored in the open state (e.g. after a configuration change). + drawerLayout.post { + closeDrawerCallback.isEnabled = drawerLayout.isDrawerOpen(GravityCompat.START) + } + } + private fun updateThemeMode(mode: ThemeMode) { Log.i(TAG, "change app theme mode to '$mode'")