mirror of
https://github.com/CherretGit/zaprett-app.git
synced 2025-12-10 05:29:37 +05:00
Revert "Android 10 fix & update libs"
This commit is contained in:
1
.idea/codeStyles/Project.xml
generated
1
.idea/codeStyles/Project.xml
generated
@@ -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
2
.idea/gradle.xml
generated
@@ -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$" />
|
||||
|
||||
@@ -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") {
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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)
|
||||
}
|
||||
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) {
|
||||
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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
|
||||
}
|
||||
@@ -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" }
|
||||
|
||||
2
gradle/wrapper/gradle-wrapper.properties
vendored
2
gradle/wrapper/gradle-wrapper.properties
vendored
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user