diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 2b700abe..e2e0cca6 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -90,8 +90,6 @@ dependencies { implementation(libs.datastore.preferences) implementation(libs.appcompat) - implementation(libs.acra.dialog) - implementation(libs.acra.mail) implementation(libs.aboutLibraries) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 7f322e94..f2706a65 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -14,8 +14,12 @@ android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/Theme.LibreSudoku" - tools:targetApi="tiramisu" - > + tools:targetApi="tiramisu"> + + - diff --git a/app/src/main/java/com/kaajjo/libresudoku/LibreSudokuApp.kt b/app/src/main/java/com/kaajjo/libresudoku/LibreSudokuApp.kt index b4c23c44..e8c3a41c 100644 --- a/app/src/main/java/com/kaajjo/libresudoku/LibreSudokuApp.kt +++ b/app/src/main/java/com/kaajjo/libresudoku/LibreSudokuApp.kt @@ -4,43 +4,13 @@ import android.app.Application import android.content.Context import androidx.hilt.work.HiltWorkerFactory import androidx.work.Configuration -import com.kaajjo.libresudoku.di.ACRA_SHARED_PREFS_NAME import dagger.hilt.android.HiltAndroidApp -import org.acra.config.dialog -import org.acra.config.mailSender -import org.acra.data.StringFormat -import org.acra.ktx.initAcra -import java.time.LocalDate import javax.inject.Inject @HiltAndroidApp class LibreSudokuApp : Application(), Configuration.Provider { override fun attachBaseContext(base: Context?) { super.attachBaseContext(base) - - if (!BuildConfig.DEBUG) { - // Only user can send a crash report - initAcra { - buildConfigClass = BuildConfig::class.java - reportFormat = StringFormat.KEY_VALUE_LIST - - dialog { - title = getString(R.string.app_name) - text = getString(R.string.dialog_crash_report_text) - negativeButtonText = getString(R.string.dialog_no) - positiveButtonText = getString(R.string.dialog_yes) - resTheme = android.R.style.Theme_DeviceDefault_Dialog - } - - mailSender { - mailTo = "crashreport.libresudoku@gmail.com" - reportFileName = "Report_${LocalDate.now()}_v${BuildConfig.VERSION_NAME}.txt" - subject = "LibreSudoku crash report" - reportAsFile = true - } - sharedPreferencesName = ACRA_SHARED_PREFS_NAME - } - } } @Inject diff --git a/app/src/main/java/com/kaajjo/libresudoku/MainActivity.kt b/app/src/main/java/com/kaajjo/libresudoku/MainActivity.kt index b98162ae..c18484b2 100644 --- a/app/src/main/java/com/kaajjo/libresudoku/MainActivity.kt +++ b/app/src/main/java/com/kaajjo/libresudoku/MainActivity.kt @@ -29,6 +29,7 @@ import androidx.navigation.compose.currentBackStackEntryAsState import androidx.navigation.compose.rememberNavController import androidx.navigation.navOptions import com.kaajjo.libresudoku.core.PreferencesConstants +import com.kaajjo.libresudoku.core.utils.GlobalExceptionHandler import com.kaajjo.libresudoku.data.datastore.AppSettingsManager import com.kaajjo.libresudoku.data.datastore.ThemeSettingsManager import com.kaajjo.libresudoku.destinations.HomeScreenDestination @@ -36,6 +37,7 @@ import com.kaajjo.libresudoku.destinations.ImportFromFileScreenDestination import com.kaajjo.libresudoku.destinations.MoreScreenDestination import com.kaajjo.libresudoku.destinations.StatisticsScreenDestination import com.kaajjo.libresudoku.destinations.WelcomeScreenDestination +import com.kaajjo.libresudoku.ui.app_crash.CrashActivity import com.kaajjo.libresudoku.ui.components.navigation_bar.NavigationBarComponent import com.kaajjo.libresudoku.ui.theme.BoardColors import com.kaajjo.libresudoku.ui.theme.LibreSudokuTheme @@ -60,6 +62,9 @@ class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) WindowCompat.setDecorFitsSystemWindows(window, false) + if (!BuildConfig.DEBUG) { + GlobalExceptionHandler.initialize(applicationContext, CrashActivity::class.java) + } setContent { val mainViewModel: MainActivityViewModel = hiltViewModel() diff --git a/app/src/main/java/com/kaajjo/libresudoku/core/Constants.kt b/app/src/main/java/com/kaajjo/libresudoku/core/Constants.kt index 6efcb4f5..416f9f84 100644 --- a/app/src/main/java/com/kaajjo/libresudoku/core/Constants.kt +++ b/app/src/main/java/com/kaajjo/libresudoku/core/Constants.kt @@ -1,6 +1,7 @@ package com.kaajjo.libresudoku.core const val GITHUB_REPOSITORY = "https://github.com/kaajjo/Libre-Sudoku" +const val GITHUB_NEW_ISSUE = "https://github.com/kaajjo/Libre-Sudoku/issues/new" const val WEBLATE_ENGAGE = "https://hosted.weblate.org/engage/libresudoku/" const val TELEGRAM_CHANNEL = "https://t.me/libresudoku" const val CRYPTO_BTC = "bc1qhpx222kmk5v6tqrra524fezwjqr0lhjq77ee8q" diff --git a/app/src/main/java/com/kaajjo/libresudoku/core/qqwing/CageGenerator.kt b/app/src/main/java/com/kaajjo/libresudoku/core/qqwing/CageGenerator.kt index 674f47ab..8c55198f 100644 --- a/app/src/main/java/com/kaajjo/libresudoku/core/qqwing/CageGenerator.kt +++ b/app/src/main/java/com/kaajjo/libresudoku/core/qqwing/CageGenerator.kt @@ -1,6 +1,5 @@ package com.kaajjo.libresudoku.core.qqwing -import android.util.Log import com.kaajjo.libresudoku.core.Cell import kotlin.random.Random @@ -30,7 +29,6 @@ class CageGenerator( val cageCells = cage.cells.toMutableList() // searching for any cell with at lest 1 unused neighbor - println("Searching neighbors") for (i in cageCells.indices) { val cell = cageCells.random() cageCells.remove(cell) @@ -66,6 +64,7 @@ class CageGenerator( return cage } + fun generate(minSize: Int = 2, maxSize: Int = 6): List { val cages = mutableListOf() @@ -77,9 +76,14 @@ class CageGenerator( id = id ) if (cage != null) { - cages.add(cage.copy(sum = cage.cells.sumOf { it.value })) - } else { - Log.d("KillerSudokuCageGen", "Couldn't generate cage") + // calculating total sum + // sorting cells by min row and min col + cages.add( + cage.copy( + sum = cage.cells.sumOf { it.value }, + cells = cage.cells.sortedWith(compareBy { it.row }.thenBy { it.col }) + ) + ) } id += 1 } diff --git a/app/src/main/java/com/kaajjo/libresudoku/core/utils/GlobalExceptionHandler.kt b/app/src/main/java/com/kaajjo/libresudoku/core/utils/GlobalExceptionHandler.kt new file mode 100644 index 00000000..989e2f76 --- /dev/null +++ b/app/src/main/java/com/kaajjo/libresudoku/core/utils/GlobalExceptionHandler.kt @@ -0,0 +1,55 @@ +package com.kaajjo.libresudoku.core.utils + +import android.app.Activity +import android.content.Context +import android.content.Intent +import android.util.Log +import kotlin.system.exitProcess + +class GlobalExceptionHandler private constructor( + private val applicationContext: Context, + private val defaultHandler: Thread.UncaughtExceptionHandler, + private val activityToBeLaunched: Class +) : Thread.UncaughtExceptionHandler { + + override fun uncaughtException(p0: Thread, p1: Throwable) { + kotlin.runCatching { + Log.e(this.toString(), p1.stackTraceToString()) + applicationContext.launchActivity(activityToBeLaunched, p1) + exitProcess(0) + }.getOrElse { + defaultHandler.uncaughtException(p0, p1) + } + } + + private fun Context.launchActivity( + activity: Class, + exception: Throwable + ) { + val crashedIntent = Intent(applicationContext, activity).apply { + putExtra(INTENT_DATA_NAME, "$exception\n${Log.getStackTraceString(exception)}") + addFlags(defFlags) + } + applicationContext.startActivity(crashedIntent) + } + + companion object { + private const val INTENT_DATA_NAME = "GlobalExceptionHandler" + private const val defFlags = Intent.FLAG_ACTIVITY_CLEAR_TOP or + Intent.FLAG_ACTIVITY_NEW_TASK or + Intent.FLAG_ACTIVITY_CLEAR_TASK + + fun initialize( + applicationContext: Context, + activityToBeLaunched: Class + ) = Thread.setDefaultUncaughtExceptionHandler( + GlobalExceptionHandler( + applicationContext, + Thread.getDefaultUncaughtExceptionHandler() as Thread.UncaughtExceptionHandler, + activityToBeLaunched + ) + ) + + fun Activity.getExceptionString(): String = intent.getStringExtra(INTENT_DATA_NAME) ?: "" + } +} \ No newline at end of file diff --git a/app/src/main/java/com/kaajjo/libresudoku/data/datastore/AcraSharedPrefs.kt b/app/src/main/java/com/kaajjo/libresudoku/data/datastore/AcraSharedPrefs.kt deleted file mode 100644 index 22174abd..00000000 --- a/app/src/main/java/com/kaajjo/libresudoku/data/datastore/AcraSharedPrefs.kt +++ /dev/null @@ -1,26 +0,0 @@ -package com.kaajjo.libresudoku.data.datastore - -import android.content.Context -import com.kaajjo.libresudoku.di.ACRA_SHARED_PREFS_NAME -import dagger.hilt.android.qualifiers.ApplicationContext -import org.acra.ACRA -import javax.inject.Inject -import javax.inject.Singleton - -@Singleton -class AcraSharedPrefs @Inject constructor( - @ApplicationContext context: Context -) { - private val acraEnabledKey = ACRA.PREF_ENABLE_ACRA - - private var prefs = context.getSharedPreferences(ACRA_SHARED_PREFS_NAME, Context.MODE_PRIVATE) - - fun getAcraEnabled(): Boolean = prefs.getBoolean(acraEnabledKey, true) - - fun setAcraEnabled(enabled: Boolean) { - with(prefs.edit()) { - putBoolean(acraEnabledKey, enabled) - apply() - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/kaajjo/libresudoku/di/AppModule.kt b/app/src/main/java/com/kaajjo/libresudoku/di/AppModule.kt index a2e41b41..cd6821f8 100644 --- a/app/src/main/java/com/kaajjo/libresudoku/di/AppModule.kt +++ b/app/src/main/java/com/kaajjo/libresudoku/di/AppModule.kt @@ -2,7 +2,6 @@ package com.kaajjo.libresudoku.di import android.app.Application import android.content.Context -import android.content.SharedPreferences import com.kaajjo.libresudoku.data.database.AppDatabase import com.kaajjo.libresudoku.data.database.dao.BoardDao import com.kaajjo.libresudoku.data.database.dao.FolderDao @@ -37,11 +36,6 @@ class AppModule { fun provideDatabaseRepository(appDatabase: AppDatabase): DatabaseRepository = DatabaseRepositoryImpl(appDatabase) - @Provides - @Singleton - fun provideAcraSharedPrefs(@ApplicationContext context: Context): SharedPreferences - = context.getSharedPreferences(ACRA_SHARED_PREFS_NAME, Context.MODE_PRIVATE) - @Provides @Singleton fun provideFolderRepository(folderDao: FolderDao): FolderRepository diff --git a/app/src/main/java/com/kaajjo/libresudoku/ui/app_crash/CrashActivity.kt b/app/src/main/java/com/kaajjo/libresudoku/ui/app_crash/CrashActivity.kt new file mode 100644 index 00000000..2c10047d --- /dev/null +++ b/app/src/main/java/com/kaajjo/libresudoku/ui/app_crash/CrashActivity.kt @@ -0,0 +1,201 @@ +package com.kaajjo.libresudoku.ui.app_crash + +import android.content.Intent +import android.os.Bundle +import androidx.activity.ComponentActivity +import androidx.activity.compose.setContent +import androidx.activity.enableEdgeToEdge +import androidx.compose.foundation.background +import androidx.compose.foundation.clickable +import androidx.compose.foundation.isSystemInDarkTheme +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.width +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.rounded.BugReport +import androidx.compose.material.icons.rounded.RestartAlt +import androidx.compose.material3.Button +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.OutlinedButton +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Text +import androidx.compose.material3.surfaceColorAtElevation +import androidx.compose.runtime.getValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.platform.LocalClipboardManager +import androidx.compose.ui.platform.LocalUriHandler +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.AnnotatedString +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.unit.dp +import androidx.hilt.navigation.compose.hiltViewModel +import androidx.lifecycle.compose.collectAsStateWithLifecycle +import com.kaajjo.libresudoku.MainActivity +import com.kaajjo.libresudoku.R +import com.kaajjo.libresudoku.core.GITHUB_NEW_ISSUE +import com.kaajjo.libresudoku.core.GITHUB_REPOSITORY +import com.kaajjo.libresudoku.core.PreferencesConstants +import com.kaajjo.libresudoku.core.TELEGRAM_CHANNEL +import com.kaajjo.libresudoku.core.utils.GlobalExceptionHandler.Companion.getExceptionString +import com.kaajjo.libresudoku.ui.components.ScrollbarLazyColumn +import com.kaajjo.libresudoku.ui.theme.LibreSudokuTheme +import com.kaajjo.libresudoku.ui.theme.icons.ExteraGram +import com.materialkolor.PaletteStyle +import dagger.hilt.android.AndroidEntryPoint + +@AndroidEntryPoint +class CrashActivity : ComponentActivity() { + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + val crashReason = getExceptionString() + + enableEdgeToEdge() + setContent { + val viewModel: CrashViewModel = hiltViewModel() + val dynamicColors by viewModel.dc.collectAsStateWithLifecycle(isSystemInDarkTheme()) + val darkTheme by viewModel.darkTheme.collectAsStateWithLifecycle(PreferencesConstants.DEFAULT_DARK_THEME) + val amoledBlack by viewModel.amoledBlack.collectAsStateWithLifecycle( + PreferencesConstants.DEFAULT_AMOLED_BLACK + ) + val colorSeed by viewModel.colorSeed.collectAsStateWithLifecycle(initialValue = Color.Red) + val paletteStyle by viewModel.paletteStyle.collectAsStateWithLifecycle(initialValue = PaletteStyle.TonalSpot) + + LibreSudokuTheme( + darkTheme = when (darkTheme) { + 1 -> false + 2 -> true + else -> isSystemInDarkTheme() + }, + dynamicColor = dynamicColors, + amoled = amoledBlack, + colorSeed = colorSeed, + paletteStyle = paletteStyle + ) { + val clipboardManager = LocalClipboardManager.current + val uriHandler = LocalUriHandler.current + + Scaffold { innerPadding -> + Column( + modifier = Modifier + .fillMaxSize() + .padding(innerPadding), + horizontalAlignment = Alignment.CenterHorizontally + ) { + Icon( + imageVector = Icons.Rounded.BugReport, + contentDescription = null, + tint = MaterialTheme.colorScheme.primary, + modifier = Modifier.size(48.dp) + ) + + Text( + text = stringResource(R.string.crash_screen_title), + style = MaterialTheme.typography.headlineSmall + ) + + Spacer(Modifier.height(16.dp)) + + Box( + modifier = Modifier + .padding(horizontal = 12.dp) + .clip(MaterialTheme.shapes.large) + .clickable { + clipboardManager.setText( + AnnotatedString( + text = crashReason + ) + ) + } + .background(MaterialTheme.colorScheme.surfaceColorAtElevation(8.dp)) + .weight(1f) + ) { + ScrollbarLazyColumn { + item { + Text( + text = crashReason, + textAlign = TextAlign.Center, + style = MaterialTheme.typography.labelSmall, + modifier = Modifier.padding(12.dp) + ) + } + } + } + Column( + modifier = Modifier + .fillMaxWidth() + .padding(vertical = 16.dp), + horizontalAlignment = Alignment.CenterHorizontally + ) { + Button(onClick = { + clipboardManager.setText( + AnnotatedString( + text = crashReason + ) + ) + uriHandler.openUri(GITHUB_NEW_ISSUE) + }) { + Icon( + painterResource(R.drawable.ic_github_24dp), + contentDescription = null + ) + Spacer(Modifier.width(8.dp)) + Text(stringResource(R.string.action_share_crash_log)) + } + Spacer(Modifier.height(8.dp)) + OutlinedButton(onClick = { + startActivity( + Intent( + this@CrashActivity, + MainActivity::class.java, + ).apply { + flags = + Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK + } + ) + }) { + Icon(Icons.Rounded.RestartAlt, contentDescription = null) + Spacer(Modifier.width(8.dp)) + Text(stringResource(R.string.action_restart_app)) + } + Spacer(modifier = Modifier.height(8.dp)) + Row( + horizontalArrangement = Arrangement.spacedBy(8.dp) + ) { + IconButton(onClick = { + uriHandler.openUri(TELEGRAM_CHANNEL) + }) { + Icon( + imageVector = Icons.Rounded.ExteraGram, + contentDescription = null + ) + } + IconButton(onClick = { + uriHandler.openUri(GITHUB_REPOSITORY) + }) { + Icon( + painter = painterResource(R.drawable.ic_github_24dp), + contentDescription = null + ) + } + } + } + } + } + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/kaajjo/libresudoku/ui/app_crash/CrashViewModel.kt b/app/src/main/java/com/kaajjo/libresudoku/ui/app_crash/CrashViewModel.kt new file mode 100644 index 00000000..5f7f54cf --- /dev/null +++ b/app/src/main/java/com/kaajjo/libresudoku/ui/app_crash/CrashViewModel.kt @@ -0,0 +1,21 @@ +package com.kaajjo.libresudoku.ui.app_crash + +import androidx.lifecycle.ViewModel +import com.kaajjo.libresudoku.data.datastore.AppSettingsManager +import com.kaajjo.libresudoku.data.datastore.ThemeSettingsManager +import dagger.hilt.android.lifecycle.HiltViewModel +import javax.inject.Inject + +@HiltViewModel +class CrashViewModel @Inject constructor( + themeSettingsManager: ThemeSettingsManager, + appSettingsManager: AppSettingsManager +) : ViewModel() { + val dc = themeSettingsManager.dynamicColors + val darkTheme = themeSettingsManager.darkTheme + val amoledBlack = themeSettingsManager.amoledBlack + val firstLaunch = appSettingsManager.firstLaunch + val monetSudokuBoard = themeSettingsManager.monetSudokuBoard + val colorSeed = themeSettingsManager.themeColorSeed + val paletteStyle = themeSettingsManager.themePaletteStyle +} \ No newline at end of file diff --git a/app/src/main/java/com/kaajjo/libresudoku/ui/components/board/Board.kt b/app/src/main/java/com/kaajjo/libresudoku/ui/components/board/Board.kt index dd5faaad..30c22f51 100644 --- a/app/src/main/java/com/kaajjo/libresudoku/ui/components/board/Board.kt +++ b/app/src/main/java/com/kaajjo/libresudoku/ui/components/board/Board.kt @@ -421,10 +421,7 @@ fun Board( cages.forEach { cage -> val textToDraw = cage.sum.toString() killerSumPaint.getTextBounds(textToDraw, 0, textToDraw.length, killerSumBounds) - // get top left cell - val cellWithSum = cage.cells.minWith( - compareBy { it.row }.thenBy { it.col } - ) + val cellWithSum = cage.cells.first() drawIntoCanvas { canvas -> canvas.nativeCanvas.drawText( textToDraw, diff --git a/app/src/main/java/com/kaajjo/libresudoku/ui/game/GameScreen.kt b/app/src/main/java/com/kaajjo/libresudoku/ui/game/GameScreen.kt index 9c18d4cd..aaff9be2 100644 --- a/app/src/main/java/com/kaajjo/libresudoku/ui/game/GameScreen.kt +++ b/app/src/main/java/com/kaajjo/libresudoku/ui/game/GameScreen.kt @@ -117,8 +117,8 @@ fun GameScreen( LaunchedEffect(viewModel.gameCompleted) { if (viewModel.gameCompleted) { - viewModel.onGameComplete() viewModel.endGame = true + viewModel.onGameComplete() } } diff --git a/app/src/main/java/com/kaajjo/libresudoku/ui/game/GameViewModel.kt b/app/src/main/java/com/kaajjo/libresudoku/ui/game/GameViewModel.kt index 7cad774d..c540c4fb 100644 --- a/app/src/main/java/com/kaajjo/libresudoku/ui/game/GameViewModel.kt +++ b/app/src/main/java/com/kaajjo/libresudoku/ui/game/GameViewModel.kt @@ -672,6 +672,7 @@ class GameViewModel @Inject constructor( } fun onGameComplete() { + if (endGame) return viewModelScope.launch(Dispatchers.IO) { saveGame() recordRepository.insert( diff --git a/app/src/main/java/com/kaajjo/libresudoku/ui/theme/icons/ExteraGram.kt b/app/src/main/java/com/kaajjo/libresudoku/ui/theme/icons/ExteraGram.kt index 98ebde0c..1696f513 100644 --- a/app/src/main/java/com/kaajjo/libresudoku/ui/theme/icons/ExteraGram.kt +++ b/app/src/main/java/com/kaajjo/libresudoku/ui/theme/icons/ExteraGram.kt @@ -6,7 +6,7 @@ import com.kaajjo.libresudoku.ui.util.iconFromXmlPath val Icons.Rounded.ExteraGram by lazy { iconFromXmlPath( pathStr = "M 31.2 2.5 c 2.8 -0.9 4.5 0.6 3.6 3.4 c -2.3 7.1 -6.7 20.1 -9.5 28.2 c -0.7 2.1 -4.1 2.1 -5 0 c -1.5 -3.6 -3.6 -7.8 -6.6 -10.8 c -2.8 -2.9 -6.8 -5 -10.3 -6.5 c -2.1 -0.9 -2.2 -4.5 0 -5.2 l 27.7 -9.1 Z", - viewportHeight = 36f, - viewportWidth = 36f + viewportHeight = 40f, + viewportWidth = 40f ) } \ No newline at end of file diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 51a9884a..38e602f4 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -104,7 +104,7 @@ Mantener la pantalla despierta El número de usos restantes de un valor se muestra en el teclado Idioma de aplicación - Proyecto en GitHub + GitHub Se resaltan la fila y la columna de la celda seleccionada Líneas de posición Rendirse @@ -335,4 +335,13 @@ Últimos %1$d juegos Últimos %1$d juegos + Licencias + Código fuente en GitHub + Donación + Únase a nosotros en Telegram + Esta aplicación es gratuita y no tiene publicidad para siempre. Puedes apoyarme a continuación + Versión %1$s (%2$s) + Asesino 12x12 + Asesino 9x9 + Asesino 6x6 \ No newline at end of file diff --git a/app/src/main/res/values-hi/strings.xml b/app/src/main/res/values-hi/strings.xml index 19c80294..17683e4b 100644 --- a/app/src/main/res/values-hi/strings.xml +++ b/app/src/main/res/values-hi/strings.xml @@ -70,7 +70,7 @@ स्क्रीन को चालू रखें ऐप भाषा संस्करण - GitHub पर परियोजना + GitHub हार मान लें गेम रीसेट करें हाॅं @@ -330,4 +330,9 @@ अंतिम %1$d खेल अंतिम %1$d खेल + GitHub पर स्रोत कोड + अनुदान + यह ऐप हमेशा के लिए मुफ़्त और विज्ञापन-मुक्त है। आप नीचे मेरा समर्थन कर सकते हैं + लाइसेंस + टेलीग्राम पर हमसे जुड़ें \ No newline at end of file diff --git a/app/src/main/res/values-ru-rRU/strings.xml b/app/src/main/res/values-ru-rRU/strings.xml index a5b575f8..24cc4528 100644 --- a/app/src/main/res/values-ru-rRU/strings.xml +++ b/app/src/main/res/values-ru-rRU/strings.xml @@ -350,7 +350,7 @@ Telegram Присоединяйтесь в Telegram Пожертвование - Это приложение бесплатно и без реклам навсегда. Вы моежет поддержать меня ниже + Это приложение бесплатно и без реклам навсегда. Вы можете поддержать меня ниже Bitcoin TON USDT (TRC20) @@ -362,4 +362,8 @@ Проверка ошибок, подсветка одинаковых чисел, оставшиеся использования… Запоминать сложность и тип, не выключать экран, сброс статистики… Применять акцентные цвета, выделение позиции, размер шрифта… + + Поделиться логами + Перезапустить приложение + Упс, что-то пошло не так \ No newline at end of file diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index f554a7af..69afe830 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -61,7 +61,7 @@ Uygulama dili Varsayılan Sürüm - Proje GitHub\'da + GitHub Oyunu sıfırla Vazgeç Hoş geldin @@ -330,4 +330,13 @@ Son %1$d oyun Son %1$d oyun + Kaynak kodu GitHub\'da + Bu uygulama sonsuza kadar ücretsiz ve reklamsızdır. Beni aşağıdaki şekilde destekleyebilirsiniz + Lisanslar + Telegram\'da bize katılın + Bağış + Kazık 9x9 + Kazık 6x6 + Kazık 12x12 + Sürüm %1$s (%2$s) \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 35bedfdc..a75d493f 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -362,4 +362,7 @@ Apply accent colors, position lines, font size… + Share crash log + Restart the app + Whoops, something went wrong \ No newline at end of file diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index cc2642c4..19b90aad 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -15,7 +15,6 @@ material3 = "1.3.0-beta04" accompanist-pager = "0.28.0" accompanist-systemuicontroller = "0.28.0" navigation-compose = "2.7.7" -acra = "5.9.7" ksp = "1.9.0-1.0.12" compose-destinations = "1.9.51" serialization-json = "1.6.0" @@ -54,8 +53,6 @@ room-runtime = { group = "androidx.room", name = "room-runtime", version.ref = " room-ktx = { group = "androidx.room", name = "room-ktx", version.ref = "room" } room-compiler = { group = "androidx.room", name = "room-compiler", version.ref = "room" } aboutLibraries = { group = "com.mikepenz", name = "aboutlibraries-compose", version.ref = "aboutLibraries" } -acra-dialog = { group = "ch.acra", name = "acra-dialog", version.ref = "acra" } -acra-mail = { group = "ch.acra", name = "acra-mail", version.ref = "acra" } compose-destinations = { group = "io.github.raamcosta.compose-destinations", name = "animations-core", version.ref = "compose-destinations" } compose-destinations-ksp = { group = "io.github.raamcosta.compose-destinations", name = "ksp", version.ref = "compose-destinations" } serialization-json = { group = "org.jetbrains.kotlinx", name = "kotlinx-serialization-json", version.ref = "serialization-json" }