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>
|
</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
2
.idea/gradle.xml
generated
@@ -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$" />
|
||||||
|
|||||||
@@ -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") {
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
@@ -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
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
@@ -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
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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>
|
||||||
@@ -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>
|
||||||
@@ -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
|
||||||
}
|
}
|
||||||
@@ -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" }
|
||||||
|
|||||||
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
|
#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
|
||||||
|
|||||||
Reference in New Issue
Block a user