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> </option>
</JavaCodeStyleSettings> </JavaCodeStyleSettings>
<JetCodeStyleSettings> <JetCodeStyleSettings>
<option name="ALLOW_TRAILING_COMMA" value="true" />
<option name="CODE_STYLE_DEFAULTS" value="KOTLIN_OFFICIAL" /> <option name="CODE_STYLE_DEFAULTS" value="KOTLIN_OFFICIAL" />
</JetCodeStyleSettings> </JetCodeStyleSettings>
<codeStyleSettings language="XML"> <codeStyleSettings language="XML">

2
.idea/gradle.xml generated
View File

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

View File

@@ -13,7 +13,7 @@ android {
defaultConfig { defaultConfig {
applicationId = "com.cherret.zaprett" applicationId = "com.cherret.zaprett"
minSdk = 29 minSdk = 30
targetSdk = 35 targetSdk = 35
versionCode = 14 versionCode = 14
versionName = "2.2" versionName = "2.2"
@@ -50,7 +50,6 @@ android {
compose = true compose = true
buildConfig = true buildConfig = true
} }
buildToolsVersion = "36.0.0"
} }
tasks.register<Exec>("runNdkBuild") { 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" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_SPECIAL_USE" /> <uses-permission android:name="android.permission.FOREGROUND_SERVICE_SPECIAL_USE" />
<application <application
android:requestLegacyExternalStorage="true"
android:allowBackup="true" android:allowBackup="true"
android:dataExtractionRules="@xml/data_extraction_rules" android:dataExtractionRules="@xml/data_extraction_rules"
android:fullBackupContent="@xml/backup_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( mutableStateOf(
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU &&
!Environment.isExternalStorageManager() ContextCompat.checkSelfPermission(this, Manifest.permission.POST_NOTIFICATIONS) != PackageManager.PERMISSION_GRANTED
} else {
ContextCompat.checkSelfPermission(
this,
Manifest.permission.WRITE_EXTERNAL_STORAGE
) != PackageManager.PERMISSION_GRANTED
}
) )
} }
var showWelcomeDialog by remember {
mutableStateOf(sharedPreferences.getBoolean("welcome_dialog", true))
}
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)) firebaseAnalytics.setAnalyticsCollectionEnabled(sharedPreferences.getBoolean("send_firebase_analytics", true))
BottomBar() BottomBar()
@@ -237,34 +228,11 @@ class MainActivity : ComponentActivity() {
text = { Text(message) }, text = { Text(message) },
onDismissRequest = onDismiss, onDismissRequest = onDismiss,
confirmButton = { confirmButton = {
TextButton( TextButton(onClick = onConfirm) {
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()
}
) {
Text(stringResource(R.string.btn_continue)) 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.app.Application
import android.content.Context import android.content.Context
import android.net.Uri import android.net.Uri
import android.os.Build
import android.os.Environment import android.os.Environment
import android.provider.OpenableColumns import android.provider.OpenableColumns
import androidx.compose.material3.SnackbarHostState import androidx.compose.material3.SnackbarHostState
@@ -47,7 +46,7 @@ abstract class BaseListsViewModel(application: Application) : AndroidViewModel(a
} }
isRefreshing = false isRefreshing = false
} }
fun showRestartSnackbar(context: Context, snackbarHostState: SnackbarHostState, scope: CoroutineScope) { fun showRestartSnackbar(context: Context, snackbarHostState: SnackbarHostState, scope: CoroutineScope) {
scope.launch { scope.launch {
val result = snackbarHostState.showSnackbar( val result = snackbarHostState.showSnackbar(
@@ -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 contentResolver = context.contentResolver
val fileName = contentResolver.query(uri, null, null, null, null)?.use { cursor -> val fileName = contentResolver.query(uri, null, null, null, null)?.use { cursor ->
val nameIndex = cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME) val nameIndex = cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME)
if (cursor.moveToFirst() && nameIndex != -1) cursor.getString(nameIndex) else "copied_file" if (cursor.moveToFirst() && nameIndex != -1) cursor.getString(nameIndex) else "copied_file"
} ?: "copied_file" } ?: "copied_file"
try { val directory = File(getZaprettPath() + path)
val outputFile = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { if (!directory.exists()) {
if (Environment.isExternalStorageManager()) { directory.mkdirs()
val outputDir = File(getZaprettPath() + path) }
if (!outputDir.exists()) { val outputFile = File(getZaprettPath() + path, fileName)
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)
}
try {
contentResolver.openInputStream(uri)?.use { inputStream -> contentResolver.openInputStream(uri)?.use { inputStream ->
FileOutputStream(outputFile).use { outputStream -> FileOutputStream(outputFile).use { outputStream ->
inputStream.copyTo(outputStream) inputStream.copyTo(outputStream)
@@ -99,12 +83,6 @@ abstract class BaseListsViewModel(application: Application) : AndroidViewModel(a
refresh() refresh()
} catch (e: IOException) { } catch (e: IOException) {
e.printStackTrace() 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.annotation.SuppressLint
import android.app.DownloadManager import android.app.DownloadManager
import android.content.BroadcastReceiver import android.content.BroadcastReceiver
import android.content.ContentValues
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent
import android.content.IntentFilter import android.content.IntentFilter
import android.net.Uri import android.net.Uri
import android.os.Build import android.os.Build
import android.os.Environment import android.os.Environment
import android.provider.MediaStore
import android.provider.Settings import android.provider.Settings
import android.util.Log
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import androidx.core.content.FileProvider import androidx.core.content.FileProvider
import androidx.core.net.toUri import androidx.core.net.toUri
@@ -75,48 +72,16 @@ fun getChangelog(changelogUrl: String, callback: (String?) -> Unit) {
} }
fun download(context: Context, url: String): Long { 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("/") val fileName = url.substringAfterLast("/")
if (fileName.isEmpty()) { val downloadManager = context.getSystemService(Context.DOWNLOAD_SERVICE) as DownloadManager
Log.e("Updater", "Invalid file name derived from URL: $url")
return -1L
}
val request = DownloadManager.Request(url.toUri()).apply { val request = DownloadManager.Request(url.toUri()).apply {
setTitle(fileName) setTitle(fileName)
setDescription(fileName) setDescription(fileName)
setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED) setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, fileName)
// 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)
}
setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI or DownloadManager.Request.NETWORK_MOBILE) setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI or DownloadManager.Request.NETWORK_MOBILE)
} }
return try { return downloadManager.enqueue(request)
downloadManager.enqueue(request)
} catch (e: Exception) {
Log.e("Updater", "Failed to enqueue download: ${e.message}", e)
-1L
}
} }
fun installApk(context: Context, uri: Uri) { fun installApk(context: Context, uri: Uri) {

View File

@@ -5,6 +5,8 @@
<string name="title_strategies">Стратегии</string> <string name="title_strategies">Стратегии</string>
<string name="title_repo">Репозиторий</string> <string name="title_repo">Репозиторий</string>
<string name="title_settings">Настройки</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_continue">Продолжить</string>
<string name="btn_update">Обновить</string> <string name="btn_update">Обновить</string>
<string name="btn_dismiss">Отмена</string> <string name="btn_dismiss">Отмена</string>
@@ -26,6 +28,8 @@
<string name="btn_start_service">Запустить сервис</string> <string name="btn_start_service">Запустить сервис</string>
<string name="btn_stop_service">Остановить сервис</string> <string name="btn_stop_service">Остановить сервис</string>
<string name="btn_restart_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_remove_host">Удалить</string>
<string name="btn_download_host">Скачать</string> <string name="btn_download_host">Скачать</string>
<string name="btn_add_host">Добавить</string> <string name="btn_add_host">Добавить</string>
@@ -40,12 +44,25 @@
<string name="btn_autorestart">Переодически перезапускать сервис</string> <string name="btn_autorestart">Переодически перезапускать сервис</string>
<string name="btn_autoupdate">Авто обновление</string> <string name="btn_autoupdate">Авто обновление</string>
<string name="btn_send_firebase_analytics">Отправлять аналитику Firebase</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="alert_version">Версия: %1$s → %2$s\nСписок изменений:\n%3$s</string>
<string name="snack_already_started">Сервис уже запущен.</string> <string name="snack_already_started">Сервис уже запущен.</string>
<string name="snack_starting_service">Запускаем сервис…</string> <string name="snack_starting_service">Запускаем сервис…</string>
<string name="snack_no_service">Сервис не запущен</string> <string name="snack_no_service">Сервис не запущен</string>
<string name="snack_stopping_service">Останавливаем сервис…</string> <string name="snack_stopping_service">Останавливаем сервис…</string>
<string name="error_no_storage_title">Нет разрешения</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="error_no_storage_message">Для правильной работы приложения необходимо разрешение на доступ к хранилищу</string>
<string name="btn_show_full_path">Показывать полный путь к листу</string> <string name="btn_show_full_path">Показывать полный путь к листу</string>
<string name="pls_reboot_snack">Перезагрузите устройство для вступления изменений в силу</string> <string name="pls_reboot_snack">Перезагрузите устройство для вступления изменений в силу</string>
@@ -53,10 +70,14 @@
<string name="qs_name">Zaprett</string> <string name="qs_name">Zaprett</string>
<string name="qs_starting">Запуск…</string> <string name="qs_starting">Запуск…</string>
<string name="qs_stopping">Остановка…</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_not_available">Не доступно</string>
<string name="qs_working">Работает</string> <string name="qs_working">Работает</string>
<string name="qs_not_working">Не работает</string> <string name="qs_not_working">Не работает</string>
<string name="about_title">О приложении</string> <string name="about_title">О приложении</string>
<string name="about_text">Zaprett app от Cherret\nВерсия: %1$s</string> <string name="about_text">Zaprett app от Cherret, egor-white\nВерсия: %1$s</string>
<string name="error_copying_file">Ошибка при копировании файла</string>
</resources> </resources>

View File

@@ -5,6 +5,8 @@
<string name="title_strategies">Strategies</string> <string name="title_strategies">Strategies</string>
<string name="title_repo">Repository</string> <string name="title_repo">Repository</string>
<string name="title_settings">Settings</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_continue">Continue</string>
<string name="btn_update">Update</string> <string name="btn_update">Update</string>
<string name="btn_dismiss">Dismiss</string> <string name="btn_dismiss">Dismiss</string>
@@ -26,6 +28,9 @@
<string name="btn_start_service">Start service</string> <string name="btn_start_service">Start service</string>
<string name="btn_stop_service">Stop service</string> <string name="btn_stop_service">Stop service</string>
<string name="btn_restart_service">Restart 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_remove_host">Remove</string>
<string name="btn_download_host">Download</string> <string name="btn_download_host">Download</string>
<string name="btn_add_host">Add</string> <string name="btn_add_host">Add</string>
@@ -37,9 +42,20 @@
<string name="btn_installing_host">Installing</string> <string name="btn_installing_host">Installing</string>
<string name="btn_updating_host">Updating</string> <string name="btn_updating_host">Updating</string>
<string name="btn_installed_host">Installed</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_autoupdate">Autoupdate</string>
<string name="btn_send_firebase_analytics">Send Firebase Analytics</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="alert_version">Version: %1$s → %2$s\nChangelog:\n%3$s</string>
<string name="snack_already_started">Service already started.</string> <string name="snack_already_started">Service already started.</string>
<string name="snack_starting_service">Starting service…</string> <string name="snack_starting_service">Starting service…</string>
@@ -47,16 +63,24 @@
<string name="snack_stopping_service">Stopping service…</string> <string name="snack_stopping_service">Stopping service…</string>
<string name="error_no_storage_title">No permission</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="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="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_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="pls_restart_snack">Restart zaprett service for the changes to take effects</string>
<string name="qs_name">Zaprett</string> <string name="qs_name">Zaprett</string>
<string name="qs_starting">Starting…</string> <string name="qs_starting">Starting…</string>
<string name="qs_stopping">Stopping…</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_not_available">Not available</string>
<string name="qs_working">Working</string> <string name="qs_working">Working</string>
<string name="qs_not_working">Not working</string> <string name="qs_not_working">Not working</string>
<string name="about_title">About app</string> <string name="about_title">About app</string>
<string name="about_text">Zaprett App by Cherret\nVersion: %1$s</string> <string name="about_text">Zaprett App by Cherret, egor-white\nVersion: %1$s</string>
<string name="error_copying_file">Error while copying file</string>
</resources> </resources>

View File

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

View File

@@ -1,32 +1,17 @@
[versions] [versions]
agp = "8.11.0" agp = "8.10.1"
core = "6.0.0" kotlin = "2.0.21"
firebaseBom = "33.16.0" coreKtx = "1.10.1"
kotlin = "2.2.0"
coreKtx = "1.16.0"
junit = "4.13.2" junit = "4.13.2"
junitVersion = "1.2.1" junitVersion = "1.1.5"
espressoCore = "3.6.1" espressoCore = "3.5.1"
kotlinxSerializationJson = "1.9.0" lifecycleRuntimeKtx = "2.6.1"
lifecycleRuntimeKtx = "2.9.1" activityCompose = "1.8.0"
activityCompose = "1.10.1" composeBom = "2024.09.00"
composeBom = "2025.06.01" lifecycleService = "2.9.1"
material3AdaptiveNavigationSuite = "1.4.0-alpha16"
material3WindowSizeClass = "1.3.2"
materialIconsExtended = "1.7.8"
navigationCompose = "2.9.0"
okhttp = "5.0.0-alpha.16"
[libraries] [libraries]
androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" } 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" } junit = { group = "junit", name = "junit", version.ref = "junit" }
androidx-junit = { group = "androidx.test.ext", name = "junit", version.ref = "junitVersion" } androidx-junit = { group = "androidx.test.ext", name = "junit", version.ref = "junitVersion" }
androidx-espresso-core = { group = "androidx.test.espresso", name = "espresso-core", version.ref = "espressoCore" } 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-manifest = { group = "androidx.compose.ui", name = "ui-test-manifest" }
androidx-ui-test-junit4 = { group = "androidx.compose.ui", name = "ui-test-junit4" } androidx-ui-test-junit4 = { group = "androidx.compose.ui", name = "ui-test-junit4" }
androidx-material3 = { group = "androidx.compose.material3", name = "material3" } 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] [plugins]
android-application = { id = "com.android.application", version.ref = "agp" } 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 #Sat Mar 22 14:00:49 GMT+07:00 2025
distributionBase=GRADLE_USER_HOME distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists 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 zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists zipStorePath=wrapper/dists