Revert "Android 10 fix & update libs"

This commit is contained in:
egor-white
2025-07-08 14:57:06 +03:00
committed by GitHub
parent 2d1a25bbc3
commit 2e2b33ca55
12 changed files with 81 additions and 146 deletions

View File

@@ -36,7 +36,6 @@
</option>
</JavaCodeStyleSettings>
<JetCodeStyleSettings>
<option name="ALLOW_TRAILING_COMMA" value="true" />
<option name="CODE_STYLE_DEFAULTS" value="KOTLIN_OFFICIAL" />
</JetCodeStyleSettings>
<codeStyleSettings language="XML">

2
.idea/gradle.xml generated
View File

@@ -6,7 +6,7 @@
<GradleProjectSettings>
<option name="testRunner" value="CHOOSE_PER_TEST" />
<option name="externalProjectPath" value="$PROJECT_DIR$" />
<option name="gradleJvm" value="jbr-21" />
<option name="gradleJvm" value="#GRADLE_LOCAL_JAVA_HOME" />
<option name="modules">
<set>
<option value="$PROJECT_DIR$" />

View File

@@ -13,7 +13,7 @@ android {
defaultConfig {
applicationId = "com.cherret.zaprett"
minSdk = 29
minSdk = 30
targetSdk = 35
versionCode = 14
versionName = "2.2"
@@ -50,7 +50,6 @@ android {
compose = true
buildConfig = true
}
buildToolsVersion = "36.0.0"
}
tasks.register<Exec>("runNdkBuild") {

View File

@@ -14,7 +14,6 @@
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_SPECIAL_USE" />
<application
android:requestLegacyExternalStorage="true"
android:allowBackup="true"
android:dataExtractionRules="@xml/data_extraction_rules"
android:fullBackupContent="@xml/backup_rules"

View File

@@ -99,22 +99,13 @@ class MainActivity : ComponentActivity() {
}
}
}
var showStoragePermissionDialog by remember {
var showStoragePermissionDialog by remember { mutableStateOf(!Environment.isExternalStorageManager()) }
var showNotificationPermissionDialog by remember {
mutableStateOf(
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
!Environment.isExternalStorageManager()
} else {
ContextCompat.checkSelfPermission(
this,
Manifest.permission.WRITE_EXTERNAL_STORAGE
) != PackageManager.PERMISSION_GRANTED
}
Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU &&
ContextCompat.checkSelfPermission(this, Manifest.permission.POST_NOTIFICATIONS) != PackageManager.PERMISSION_GRANTED
)
}
var showWelcomeDialog by remember {
mutableStateOf(sharedPreferences.getBoolean("welcome_dialog", true))
}
var showWelcomeDialog by remember { mutableStateOf(sharedPreferences.getBoolean("welcome_dialog", true)) }
firebaseAnalytics.setAnalyticsCollectionEnabled(sharedPreferences.getBoolean("send_firebase_analytics", true))
BottomBar()
@@ -237,34 +228,11 @@ class MainActivity : ComponentActivity() {
text = { Text(message) },
onDismissRequest = onDismiss,
confirmButton = {
TextButton(
onClick = {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
// Android 11+: Request MANAGE_EXTERNAL_STORAGE
val intent = Intent(Settings.ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION)
val uri = Uri.fromParts("package", context.packageName, null)
intent.data = uri
context.startActivity(intent)
} else {
// Android 10: Request legacy storage permissions
requestPermissions(
arrayOf(
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE
),
STORAGE_PERMISSION_REQUEST_CODE
)
}
onDismiss()
}
) {
TextButton(onClick = onConfirm) {
Text(stringResource(R.string.btn_continue))
}
}
)
}
companion object {
private const val STORAGE_PERMISSION_REQUEST_CODE = 100
}
}

View File

@@ -3,7 +3,6 @@ package com.cherret.zaprett.ui.viewmodel
import android.app.Application
import android.content.Context
import android.net.Uri
import android.os.Build
import android.os.Environment
import android.provider.OpenableColumns
import androidx.compose.material3.SnackbarHostState
@@ -61,36 +60,21 @@ abstract class BaseListsViewModel(application: Application) : AndroidViewModel(a
}
}
fun copySelectedFile(context: Context, path: String, uri: Uri, snackbarHostState: SnackbarHostState, scope: CoroutineScope) {
fun copySelectedFile(context: Context, path: String, uri: Uri) {
if (!Environment.isExternalStorageManager()) return
val contentResolver = context.contentResolver
val fileName = contentResolver.query(uri, null, null, null, null)?.use { cursor ->
val nameIndex = cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME)
if (cursor.moveToFirst() && nameIndex != -1) cursor.getString(nameIndex) else "copied_file"
} ?: "copied_file"
try {
val outputFile = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
if (Environment.isExternalStorageManager()) {
val outputDir = File(getZaprettPath() + path)
if (!outputDir.exists()) {
outputDir.mkdirs()
}
File(outputDir, fileName)
} else {
val outputDir = File(context.filesDir, path)
if (!outputDir.exists()) {
outputDir.mkdirs()
}
File(outputDir, fileName)
}
} else {
val outputDir = File(context.filesDir, path)
if (!outputDir.exists()) {
outputDir.mkdirs()
}
File(outputDir, fileName)
}
val directory = File(getZaprettPath() + path)
if (!directory.exists()) {
directory.mkdirs()
}
val outputFile = File(getZaprettPath() + path, fileName)
try {
contentResolver.openInputStream(uri)?.use { inputStream ->
FileOutputStream(outputFile).use { outputStream ->
inputStream.copyTo(outputStream)
@@ -99,12 +83,6 @@ abstract class BaseListsViewModel(application: Application) : AndroidViewModel(a
refresh()
} catch (e: IOException) {
e.printStackTrace()
scope.launch {
snackbarHostState.showSnackbar(
context.getString(R.string.error_copying_file),
duration = androidx.compose.material3.SnackbarDuration.Short
)
}
}
}
}

View File

@@ -3,16 +3,13 @@ package com.cherret.zaprett.utils
import android.annotation.SuppressLint
import android.app.DownloadManager
import android.content.BroadcastReceiver
import android.content.ContentValues
import android.content.Context
import android.content.Intent
import android.content.IntentFilter
import android.net.Uri
import android.os.Build
import android.os.Environment
import android.provider.MediaStore
import android.provider.Settings
import android.util.Log
import androidx.core.content.ContextCompat
import androidx.core.content.FileProvider
import androidx.core.net.toUri
@@ -75,48 +72,16 @@ fun getChangelog(changelogUrl: String, callback: (String?) -> Unit) {
}
fun download(context: Context, url: String): Long {
if (url.isEmpty()) {
Log.e("Updater", "Download URL is empty")
return -1L
}
val downloadManager = context.getSystemService(Context.DOWNLOAD_SERVICE) as? DownloadManager
if (downloadManager == null) {
Log.e("Updater", "DownloadManager is unavailable")
return -1L
}
val fileName = url.substringAfterLast("/")
if (fileName.isEmpty()) {
Log.e("Updater", "Invalid file name derived from URL: $url")
return -1L
}
val downloadManager = context.getSystemService(Context.DOWNLOAD_SERVICE) as DownloadManager
val request = DownloadManager.Request(url.toUri()).apply {
setTitle(fileName)
setDescription(fileName)
setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
// Use MediaStore for Android 10+
val contentValues = ContentValues().apply {
put(MediaStore.Downloads.DISPLAY_NAME, fileName)
put(MediaStore.Downloads.RELATIVE_PATH, Environment.DIRECTORY_DOWNLOADS)
}
val uri = context.contentResolver.insert(MediaStore.Downloads.EXTERNAL_CONTENT_URI, contentValues)
if (uri != null) {
setDestinationUri(uri)
} else {
Log.e("Updater", "Failed to create MediaStore URI")
return -1L
}
} else {
setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, fileName)
}
setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, fileName)
setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI or DownloadManager.Request.NETWORK_MOBILE)
}
return try {
downloadManager.enqueue(request)
} catch (e: Exception) {
Log.e("Updater", "Failed to enqueue download: ${e.message}", e)
-1L
}
return downloadManager.enqueue(request)
}
fun installApk(context: Context, uri: Uri) {

View File

@@ -5,6 +5,8 @@
<string name="title_strategies">Стратегии</string>
<string name="title_repo">Репозиторий</string>
<string name="title_settings">Настройки</string>
<string name="general_section">Основные настройки</string>
<string name="byedpi_section">Настройки ByeDPI</string>
<string name="btn_continue">Продолжить</string>
<string name="btn_update">Обновить</string>
<string name="btn_dismiss">Отмена</string>
@@ -26,6 +28,8 @@
<string name="btn_start_service">Запустить сервис</string>
<string name="btn_stop_service">Остановить сервис</string>
<string name="btn_restart_service">Перезапустить сервис</string>
<string name="notification_zaprett_description">zaprett proxy запущен</string>
<string name="toast_no_strategy_selected">Стратегия не выбрана</string>
<string name="btn_remove_host">Удалить</string>
<string name="btn_download_host">Скачать</string>
<string name="btn_add_host">Добавить</string>
@@ -40,12 +44,25 @@
<string name="btn_autorestart">Переодически перезапускать сервис</string>
<string name="btn_autoupdate">Авто обновление</string>
<string name="btn_send_firebase_analytics">Отправлять аналитику Firebase</string>
<string name="btn_repository_url_lists">URL репозитория хостов</string>
<string name="hint_enter_repository_url_lists">Введите URL репозитория хостов</string>
<string name="btn_repository_url_strategies">URL репозитория стратегий</string>
<string name="hint_enter_repository_url_strategies">Введите URL репозитория стратегий</string>
<string name="btn_ipv6">IPv6</string>
<string name="btn_ip">IP-адрес</string>
<string name="hint_ip">Введите IP-адрес</string>
<string name="btn_port">Порт</string>
<string name="hint_port">Введите порт</string>
<string name="btn_dns">DNS</string>
<string name="hint_dns">Введите DNS</string>
<string name="alert_version">Версия: %1$s → %2$s\nСписок изменений:\n%3$s</string>
<string name="snack_already_started">Сервис уже запущен.</string>
<string name="snack_starting_service">Запускаем сервис…</string>
<string name="snack_no_service">Сервис не запущен</string>
<string name="snack_stopping_service">Останавливаем сервис…</string>
<string name="error_no_storage_title">Нет разрешения</string>
<string name="notification_permission_title">Разрешение на уведомления</string>
<string name="notification_permission_message">Приложению нужно разрешение на отправку уведомлений</string>
<string name="error_no_storage_message">Для правильной работы приложения необходимо разрешение на доступ к хранилищу</string>
<string name="btn_show_full_path">Показывать полный путь к листу</string>
<string name="pls_reboot_snack">Перезагрузите устройство для вступления изменений в силу</string>
@@ -53,10 +70,14 @@
<string name="qs_name">Zaprett</string>
<string name="qs_starting">Запуск…</string>
<string name="qs_stopping">Остановка…</string>
<string name="module_version">Версия модуля</string>
<string name="nfqws_version">Версия nfqws</string>
<string name="ciadpi_version">Версия ciadpi</string>
<string name="unknown_text">неизвестно</string>
<string name="service_mode">Режим работы</string>
<string name="qs_not_available">Не доступно</string>
<string name="qs_working">Работает</string>
<string name="qs_not_working">Не работает</string>
<string name="about_title">О приложении</string>
<string name="about_text">Zaprett app от Cherret\nВерсия: %1$s</string>
<string name="error_copying_file">Ошибка при копировании файла</string>
<string name="about_text">Zaprett app от Cherret, egor-white\nВерсия: %1$s</string>
</resources>

View File

@@ -5,6 +5,8 @@
<string name="title_strategies">Strategies</string>
<string name="title_repo">Repository</string>
<string name="title_settings">Settings</string>
<string name="general_section">General settings</string>
<string name="byedpi_section">ByeDPI settings</string>
<string name="btn_continue">Continue</string>
<string name="btn_update">Update</string>
<string name="btn_dismiss">Dismiss</string>
@@ -26,6 +28,9 @@
<string name="btn_start_service">Start service</string>
<string name="btn_stop_service">Stop service</string>
<string name="btn_restart_service">Restart service</string>
<string name="notification_zaprett_proxy" translatable="false">zaprett proxy</string>
<string name="notification_zaprett_description">zaprett proxy is running</string>
<string name="toast_no_strategy_selected">No strategy selected</string>
<string name="btn_remove_host">Remove</string>
<string name="btn_download_host">Download</string>
<string name="btn_add_host">Add</string>
@@ -37,9 +42,20 @@
<string name="btn_installing_host">Installing</string>
<string name="btn_updating_host">Updating</string>
<string name="btn_installed_host">Installed</string>
<string name="btn_autorestart">Restart service periodicaly</string>
<string name="btn_autorestart">Restart service periodically</string>
<string name="btn_autoupdate">Autoupdate</string>
<string name="btn_send_firebase_analytics">Send Firebase Analytics</string>
<string name="btn_repository_url_lists">Hosts repository URL</string>
<string name="hint_enter_repository_url_lists">Enter hosts repository URL</string>
<string name="btn_repository_url_strategies">Strategies repository URL</string>
<string name="hint_enter_repository_url_strategies">Enter strategies repository URL</string>
<string name="btn_ipv6">IPv6</string>
<string name="btn_ip">IP address</string>
<string name="hint_ip">Enter IP address</string>
<string name="btn_port">Port</string>
<string name="hint_port">Enter port</string>
<string name="btn_dns">DNS</string>
<string name="hint_dns">Enter DNS</string>
<string name="alert_version">Version: %1$s → %2$s\nChangelog:\n%3$s</string>
<string name="snack_already_started">Service already started.</string>
<string name="snack_starting_service">Starting service…</string>
@@ -47,16 +63,24 @@
<string name="snack_stopping_service">Stopping service…</string>
<string name="error_no_storage_title">No permission</string>
<string name="error_no_storage_message">The application requires permission to access the storage to work properly</string>
<string name="notification_permission_title">Notification Permission</string>
<string name="notification_permission_message">This app needs permission to send notifications</string>
<string name="btn_show_full_path">Show full list\'s path</string>
<string name="pls_reboot_snack">Reboot your device for the changes to take effect</string>
<string name="pls_restart_snack">Restart zaprett service for the changes to take effects</string>
<string name="qs_name">Zaprett</string>
<string name="qs_starting">Starting…</string>
<string name="qs_stopping">Stopping…</string>
<string name="module_version">Module version</string>
<string name="nfqws_version">nfqws version</string>
<string name="ciadpi_version">ciadpi version</string>
<string name="unknown_text">unknown</string>
<string name="service_mode">Service mode</string>
<string name="service_mode_nfqws" translatable="false">nfqws</string>
<string name="service_mode_ciadpi" translatable="false">ciadpi</string>
<string name="qs_not_available">Not available</string>
<string name="qs_working">Working</string>
<string name="qs_not_working">Not working</string>
<string name="about_title">About app</string>
<string name="about_text">Zaprett App by Cherret\nVersion: %1$s</string>
<string name="error_copying_file">Error while copying file</string>
<string name="about_text">Zaprett App by Cherret, egor-white\nVersion: %1$s</string>
</resources>

View File

@@ -3,6 +3,6 @@ plugins {
alias(libs.plugins.android.application) apply false
alias(libs.plugins.kotlin.android) apply false
alias(libs.plugins.kotlin.compose) apply false
id("com.google.gms.google-services") version "4.4.3" apply false
id("com.google.firebase.crashlytics") version "3.0.4" apply false
id("com.google.gms.google-services") version "4.4.2" apply false
id("com.google.firebase.crashlytics") version "3.0.3" apply false
}

View File

@@ -1,32 +1,17 @@
[versions]
agp = "8.11.0"
core = "6.0.0"
firebaseBom = "33.16.0"
kotlin = "2.2.0"
coreKtx = "1.16.0"
agp = "8.10.1"
kotlin = "2.0.21"
coreKtx = "1.10.1"
junit = "4.13.2"
junitVersion = "1.2.1"
espressoCore = "3.6.1"
kotlinxSerializationJson = "1.9.0"
lifecycleRuntimeKtx = "2.9.1"
activityCompose = "1.10.1"
composeBom = "2025.06.01"
material3AdaptiveNavigationSuite = "1.4.0-alpha16"
material3WindowSizeClass = "1.3.2"
materialIconsExtended = "1.7.8"
navigationCompose = "2.9.0"
okhttp = "5.0.0-alpha.16"
junitVersion = "1.1.5"
espressoCore = "3.5.1"
lifecycleRuntimeKtx = "2.6.1"
activityCompose = "1.8.0"
composeBom = "2024.09.00"
lifecycleService = "2.9.1"
[libraries]
androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" }
androidx-material-icons-extended = { module = "androidx.compose.material:material-icons-extended", version.ref = "materialIconsExtended" }
androidx-material3-window-size-class1 = { module = "androidx.compose.material3:material3-window-size-class", version.ref = "material3WindowSizeClass" }
androidx-material3-adaptive-navigation-suite = { module = "androidx.compose.material3:material3-adaptive-navigation-suite", version.ref = "material3AdaptiveNavigationSuite" }
androidx-navigation-compose = { module = "androidx.navigation:navigation-compose", version.ref = "navigationCompose" }
libsu-core = { module = "com.github.topjohnwu.libsu:core", version.ref = "core" }
firebase-analytics = { module = "com.google.firebase:firebase-analytics" }
firebase-bom = { module = "com.google.firebase:firebase-bom", version.ref = "firebaseBom" }
firebase-crashlytics = { module = "com.google.firebase:firebase-crashlytics" }
junit = { group = "junit", name = "junit", version.ref = "junit" }
androidx-junit = { group = "androidx.test.ext", name = "junit", version.ref = "junitVersion" }
androidx-espresso-core = { group = "androidx.test.espresso", name = "espresso-core", version.ref = "espressoCore" }
@@ -40,9 +25,6 @@ androidx-ui-tooling-preview = { group = "androidx.compose.ui", name = "ui-toolin
androidx-ui-test-manifest = { group = "androidx.compose.ui", name = "ui-test-manifest" }
androidx-ui-test-junit4 = { group = "androidx.compose.ui", name = "ui-test-junit4" }
androidx-material3 = { group = "androidx.compose.material3", name = "material3" }
material3 = { module = "androidx.compose.material3:material3", version.ref = "material3WindowSizeClass" }
okhttp = { module = "com.squareup.okhttp3:okhttp", version.ref = "okhttp" }
kotlinx-serialization-json = { module = "org.jetbrains.kotlinx:kotlinx-serialization-json", version.ref = "kotlinxSerializationJson" }
[plugins]
android-application = { id = "com.android.application", version.ref = "agp" }

View File

@@ -1,6 +1,6 @@
#Sat Mar 22 14:00:49 GMT+07:00 2025
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.2-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-8.11.1-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists