From a6ae4f4077f2d25f38dd2bd564486dec714df10c Mon Sep 17 00:00:00 2001 From: Lucas Lima Date: Thu, 24 Jun 2021 10:18:51 -0300 Subject: [PATCH 1/5] Update strings --- app/build.gradle | 1 + build.gradle | 1 + .../android/eo-UY/full_description.txt | 4 +- .../android/hu-HU/full_description.txt | 2 +- .../android/it-IT/full_description.txt | 36 +++---- .../android/pt-BR/full_description.txt | 6 +- .../android/pt-PT/full_description.txt | 74 +++++++-------- .../android/pt-PT/short_description.txt | 2 +- .../android/zh-CN/full_description.txt | 32 +++---- .../android/zh-CN/short_description.txt | 2 +- .../antimine/gdx/stages/MinefieldStage.kt | 4 + i18n/src/main/res/values-de-rDE/strings.xml | 4 +- i18n/src/main/res/values-fi-rFI/strings.xml | 2 +- i18n/src/main/res/values-pt-rBR/strings.xml | 6 +- i18n/src/main/res/values-pt-rPT/strings.xml | 94 +++++++++---------- i18n/src/main/res/values-uk-rUA/strings.xml | 4 +- i18n/src/main/res/values-zh-rCN/strings.xml | 22 ++--- proprietary/build.gradle | 11 ++- wear/src/main/res/values-pt-rPT/strings.xml | 4 +- 19 files changed, 160 insertions(+), 151 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index f3e2dd633..c730ea7fb 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -7,6 +7,7 @@ plugins { if (System.getenv('IS_GOOGLE_BUILD')) { apply plugin: 'com.google.firebase.crashlytics' + apply plugin: 'com.google.firebase.firebase-perf' } android { diff --git a/build.gradle b/build.gradle index 36733f2d7..1ffd236f3 100644 --- a/build.gradle +++ b/build.gradle @@ -12,6 +12,7 @@ buildscript { if (System.getenv('IS_GOOGLE_BUILD')) { classpath 'com.google.gms:google-services:4.3.8' classpath 'com.google.firebase:firebase-crashlytics-gradle:2.7.0' + classpath 'com.google.firebase:perf-plugin:1.4.0' } } } diff --git a/fastlane/metadata/android/eo-UY/full_description.txt b/fastlane/metadata/android/eo-UY/full_description.txt index a9f433a53..c6462a246 100644 --- a/fastlane/metadata/android/eo-UY/full_description.txt +++ b/fastlane/metadata/android/eo-UY/full_description.txt @@ -35,7 +35,7 @@ Vi rajtas ŝanĝi la ludon, por ke ĝi estu laŭ via ŝato. Ekzemple: Helpo, movbildoj, haptika retrokuplo, demandosigno. REGILOJ -Ĝi subtenas kvar malsimilajn regilskemojn. Ekzemplo: flagi uzante tuŝeti aŭ tuŝadi. +Ĝi subtenas kvar malsimilajn regilskemojn. Ekzemplo: flagi uzante frapeti aŭ tuŝadi. AKIROJ KAJ ĈAMPIONEJOJ Vi havas ok akiroj por malbloki kaj malsimilajn ĉampionejojn por disvastigi kun viaj amikoj. @@ -53,4 +53,4 @@ Vi ne bezonas esti enreta por uzi la ludon! AŬTOKONSERVADO Vi povas komenci ludon kaj daurigi ĝin poste! Ĝi automate savos vian ludon. -Ĝuu. +Ĝui. diff --git a/fastlane/metadata/android/hu-HU/full_description.txt b/fastlane/metadata/android/hu-HU/full_description.txt index 38b553235..be87b7864 100644 --- a/fastlane/metadata/android/hu-HU/full_description.txt +++ b/fastlane/metadata/android/hu-HU/full_description.txt @@ -1,5 +1,5 @@ Test your reasoning power on a challenging puzzle game where you have to solve a minefield without exploding any mine. -This is a minimalist and modern version of the classic Minesweeper. +Ez egy egyszerű és modern változata a klasszikus Aknakereső játéknak. Are you able to clear a minefield? Gyerünk! diff --git a/fastlane/metadata/android/it-IT/full_description.txt b/fastlane/metadata/android/it-IT/full_description.txt index 03f4575ac..524703a2d 100644 --- a/fastlane/metadata/android/it-IT/full_description.txt +++ b/fastlane/metadata/android/it-IT/full_description.txt @@ -1,16 +1,16 @@ -Metti alla prova la tua capacità di ragionamento in un puzzle game in cui devi risolvere un campo minato senza far esplodere nessuna mina. -Questa è una versione minimalista e moderna del classico Minesweeper. +Metti alla prova la tua capacità di ragionamento con un puzzle game in cui devi risolvere un campo minato senza far esplodere nessuna mina. +Questa è una versione minimalista e moderna del classico Campo Minato. -Sarai in grado di sgombrare un campo minato? Iniziamo! +Riuscirai a sgombrare il campo minato? Iniziamo! OBIETTIVO -È come il Minesweeper. Vinci la partita quando hai contrassegnato ogni mina nel campo minato. Stai attento a non farle esplodere! +È come Campo Minato. Vinci la partita quando hai contrassegnato ogni mina nel campo minato. Attenzione a non farle esplodere! -NON C'È BISOGNO DI INDOVINARE -Questo gioco ha un algoritmo che crea sempre campi minati risolvibili. Non dovrai indovinare dov'è l'ultima mina! +NON SERVE INDOVINARE +Il gioco ha un algoritmo che crea sempre campi minati risolvibili. Non sarà necessario indovinare dov'è l'ultima mina! LIVELLI DI GIOCO -Proprio come Minesweeper, questo gioco ha diversi livelli: Principiante, Intermedio e Esperto. Ha anche una modalità progressiva che diventa più difficile dopo ogni vittoria. +Proprio come Campo Minato, questo gioco ha diversi livelli: Principiante, Intermedio e Esperto. Ha anche una modalità progressiva che diventa più difficile dopo ogni vittoria. LIVELLO CUSTOM Se le modalità standard non ti soddisfano, puoi creare il tuo livello di difficoltà! @@ -22,33 +22,33 @@ MINIMALISTA Aspetto e feeling semplici: una grafica minimalista in un'app molto leggera (meno di 9MB). TUTORIAL -Non sai come giocare a Campo Minato? Nessun problema, puoi giocare il nostro livello tutorial e abilitare i suggerimenti sulle impostazioni. +Non sai come si gioca a Campo Minato? Nessun problema, puoi giocare il tutorial e attivare i suggerimenti nelle impostazioni. STATISTICHE -Controlla i tuoi risultati e il tuo sviluppo. +Controlla i tuoi risultati e lo sviluppo. ASSISTENZA DEL GIOCO Il gioco contrassegna automaticamente le caselle che hai isolato. PERSONALIZZAZIONE -È possibile modificare il gioco per renderlo come si desidera. -Esempio: Aiuto, animazioni, feedback aptico, punto interrogativo. +Puoi modificare il gioco a tuo piacimento. +Esempio: Aiuto, animazioni, feedback tattile, punto interrogativo. CONTROLLI -Il gioco sostiene quattro diversi sistemi di controllo. Esempio: contrassegno utilizzando tap o pressione prolungata. +Il gioco offre quattro diversi modi di giocare. Esempio: contrassegno facendo tap oppure con pressione prolungata. -RISULTATI E LEADERBOARD +RISULTATI E CLASSIFICHE Puoi sbloccare fino a otto obiettivi e condividere diverse classifiche con i tuoi amici. ACCESSIBILITÀ -Puoi personalizzare il gioco in base alle tue esigenze: cambiare la dimensione delle caselle, il raggio, il tempo di tocco, e il supporto per i lettori di schermo. -Cerchiamo sempre di migliorare le nostre impostazioni di accessibilità. Se ti manca qualcosa ci danno un feedback! +Puoi personalizzare il gioco in base alle tue esigenze: cambiare la dimensione delle caselle, il raggio, il tempo di tocco e il supporto per i lettori di schermo. +Cerchiamo sempre di migliorare le impostazioni di accessibilità. Se noti che manca qualcosa, dacci pure il tuo feedback! -ANDROID -Supporta caratteristiche interessanti di Android come split-screen, scorciatoie, condivisione, tema di sistema, e sempre supportando la versione più recente. +APP PER ANDROID +Supporta caratteristiche interessanti di Android come split-screen, scorciatoie, condivisione, tema di sistema e sempre supportando la versione più recente. ONLINE O OFFLINE -Non è necessario essere online per giocare al gioco! +Non è necessario essere online per giocare! AUTO-SALVATAGGIO Puoi iniziare una partita e riprenderla più tardi! La partita verrà salvata automaticamente. diff --git a/fastlane/metadata/android/pt-BR/full_description.txt b/fastlane/metadata/android/pt-BR/full_description.txt index eb530630a..07b281029 100644 --- a/fastlane/metadata/android/pt-BR/full_description.txt +++ b/fastlane/metadata/android/pt-BR/full_description.txt @@ -22,12 +22,12 @@ MINIMALISTA Uma aparência limpa: um visual minimalista e também um tamanho leve para o aplicativo (menos de 9MB). TUTORIAL -Você não sabe jogar Campo Minado? Sem problemas, você pode tocar o nível do nosso tutorial e habilitar Dicas nas configurações. +Você não sabe jogar Campo Minado? Sem problemas, você pode jogar o nível do nosso tutorial e habilitar Dicas nas configurações. ESTATÍSTICAS Verifique seus resultados e desenvolvimento. -ASSISTANTE DE JOGO +ASSISTENTE DE JOGO O jogo irá automaticamente sinalizar os quadrados que você isolou. PERSONALIZAÇÃO @@ -42,7 +42,7 @@ Você tem oito conquistas para desbloquear e diferentes placares de classificaç ACESSIBILIDADE Você pode personalizar este jogo para suas necessidades: altere o tamanho dos quadrados, o raio, o tempo de toque e o suporte ao leitor de tela. -Estamos sempre tentando melhorar nossas configurações de acessibilidade. Se você sentir falta de algo, nos dê sua opnião! +Estamos sempre tentando melhorar nossas configurações de acessibilidade. Se você sentir falta de algo, nos dê sua opinião! APP FOCADO EM ANDROID Ele oferece suporte a recursos legais do Android, como tela dividida, atalhos, compartilhamento, tema do sistema e sempre suporta a última versão. diff --git a/fastlane/metadata/android/pt-PT/full_description.txt b/fastlane/metadata/android/pt-PT/full_description.txt index 554b21d2d..bfa9e124a 100644 --- a/fastlane/metadata/android/pt-PT/full_description.txt +++ b/fastlane/metadata/android/pt-PT/full_description.txt @@ -1,56 +1,56 @@ -Test your reasoning power on a challenging puzzle game where you have to solve a minefield without exploding any mine. -This is a minimalist and modern version of the classic Minesweeper. +Testa o teu poder de raciocínio num jogo de desafio onde tens de resolver um campo minado sem explodir nenhuma mina. +Isto é uma versão minimalista e moderna do clássico Minesweeper. -Are you able to clear a minefield? Let’s go! +Consegues limpar um campo minado? Vamos lá! -OBJECTIVE -It's like Minesweeper. You win the game when you've flagged every mine in the minefield. Be careful not to trigger one! +OBJETIVO +É como o Minesweeper. Vences o jogo quando sinalizas com uma bandeira todas as minas no campo minado. Cuidado para não ativares nenhuma! -NO GUESSING -This game has an algorithm that always creates solvable minefields. You won't have to guess where the last mine is! +SEM ADIVINHAÇÕES +Esse jogo tem um algoritmo que cria sempre campos de minas que podem ser sempre resolvidos. Não precisarás de adivinhar onde está a última mina! -GAME LEVELS -Just like Minesweeper, this game has different levels: Beginner, Intermediate, and Expert. But it also has a unique progressive mode that gets harder when you win. +NÍVEIS DO JOGO +Tal como o Minesweeper, este jogo tem níveis diferentes: iniciante, intermédio e perito. Mas também tem um modo progressivo único que fica mais difícil quando vences. -CUSTOM LEVEL -If the standard modes aren't enough, you can create your level difficulty! +NÍVEL PERSONALIZADO +Se os modos originais não forem suficientes, podes criar o teu nível de dificuldade! -THEMES -Antimine has more than 15 themes (including light, dark, and AMOLED). And soon more will be added! +TEMAS +O Antimine tem mais de 15 temas (incluindo claro, escuro e AMOLED). E em breve serão adicionados mais! -MINIMALIST -Clean look and feel: a minimalist visual and also lightweight app size (less than 9MB). +MINIMALISTA +Uma aparência limpa: um visual minimalista e também um tamanho leve da aplicação (menos de 9MB). TUTORIAL -Don't you know how to play Minesweeper? No problem, you can play our tutorial level and enable Tips on settings. +Não sabes como jogar o Campo Minado? Não há problema. Podes jogar o nível tutorial e ativar as Dicas nas configurações. -STATISTICS -Check your results and development. +ESTATÍSTICAS +Verifica os teus resultados e progresso. -GAME ASSISTANT -The game will automatically flag the squares you isolated. +ASSISTENTE DO JOGO +O jogo irá sinalizar automaticamente com bandeiras os quadrados que isolaste. -CUSTOMIZATION -You can change the game to make it like you want to. -Example: Help, animations, haptic feedback, question mark. +PERSONALIZAÇÃO +Podes mudar o jogo conforme as tuas preferências. +Exemplo: ajuda, animações, resposta tátil, ponto de interrogação. -CONTROLS -It supports four different control schemes. Example: flag using tap or long press. +CONTROLOS +Tem quatro esquemas de controlo diferentes. Exemplo: sinalizar com bandeira utilizando um toque simples ou toque longo. -ACHIEVEMENTS AND LEADERBOARDS -You have eight achievements to unlock and different leaderboards to share with your friends. +CONQUISTAS E QUADROS DE CLASSIFICAÇÃO +Tens oito conquistas para desbloquear e diferentes quadros de classificação para partilhares com os teus amigos. -ACCESSIBILITY -You can customize this game to your needs: change the squares size, radius, touch timing, and screen reader support. -We are always trying to improve our accessibility settings. If you miss something give us feedback! +ACESSIBILIDADE +Podes personalizar este jogo conforme as tuas preferências: altera o tamanho dos quadrados, o raio, o tempo de toque e o suporte ao leitor de ecrã. +Estamos sempre a tentar melhorar as nossas configurações de acessibilidade. Se achas que falta alguma coisa, dá-nos a tua opinião! -ANDROID FOCUSED APP -It supports cool Android features like split-screen, shortcuts, sharing, system theme, and always supporting the last version. +APLICAÇÃO FOCADA EM ANDROID +A aplicação suporta várias funcionalidades do Android, como ecrã dividido, atalhos, partilha, tema do sistema e suporta sempre a última versão. -ONLINE OR OFFLINE -You don't need to be online to play the game! +LIGADO OU DESLIGADO DA INTERNET +Não tens de estar ligado à Internet para jogar! -AUTO-SAVE -You can start a game and continue it later! It will auto-save your game. +GUARDAR AUTOMÁTICO +Podes começar um jogo e terminá-lo noutra altura! O jogo será guardado automaticamente. -Enjoy. +Diverte-te. diff --git a/fastlane/metadata/android/pt-PT/short_description.txt b/fastlane/metadata/android/pt-PT/short_description.txt index 4d1fa279e..4131cac37 100644 --- a/fastlane/metadata/android/pt-PT/short_description.txt +++ b/fastlane/metadata/android/pt-PT/short_description.txt @@ -1 +1 @@ -Um jogo de quebra-cabeças em que você procura por todas as minas escondidas. +Um jogo quebra-cabeças em que tens de encontrar todas as minas escondidas. diff --git a/fastlane/metadata/android/zh-CN/full_description.txt b/fastlane/metadata/android/zh-CN/full_description.txt index 24e049a56..b11c8759d 100644 --- a/fastlane/metadata/android/zh-CN/full_description.txt +++ b/fastlane/metadata/android/zh-CN/full_description.txt @@ -3,54 +3,54 @@ 你是否能够清除雷场? 开始吧! -目标 -就像扫雷一样。 当你在雷场上标记出了每个地雷后,游戏胜利。 小心不要触发地雷! +游戏目标 +就像扫雷一样。 当你标出雷场中的所有地雷后,游戏胜利。 小心不要触发地雷! 无需猜测 此游戏的算法可以只生成有解雷场。 你不需要猜测最后一枚地雷在哪里! 游戏等级 -就像扫雷一样,这场游戏有不同的等级:初级、中级和专家。 但它也有一种独特的渐进模式,每当你获胜后都会变得更难。 +就像扫雷一样,这场游戏有不同的等级:初级、中级和专家。 但此游戏还有一种独特的渐进模式。在这种模式下,你的每次获胜都会使游戏变得更难。 自定义级别 -如果标准模式还不够,您可以创建您的等级难度! +如果标准的游戏难度不能满足你,你可以创建你自己的难度等级! 主题 -Antimine具有15个以上的主题(包括亮,暗和AMOLED)。 很快就会添加更多! +Antimine 有超过 15 个主题(包括浅色、深色和 AMOLED)。 更多主题很快会被加入! 极简主义 清爽的感观:极简的视觉效果和轻量的应用大小 (小于 9MB)。 教程 -你不知道扫雷怎么玩? 没问题,您可以在设置中玩我们的教程并启用提示。 +你不知道扫雷怎么玩? 没问题,您可以尝试我们的教学关,以及在设置中启用提示。 统计 -检查您的结果和开发情况。 +查看您的游戏结果与成长。 游戏助手 游戏将自动标记你孤立的正方形。 自定义 你可以把游戏更改成你想要的样子。 -例如:帮助、动画、触觉反馈、问题标记。 +例如:帮助、动画、触摸反馈、问号标记。 控制 -它支持四种不同的操作方案。 示例:使用点击或长按标记。 +此游戏支持四种不同的操作方案。 例如:可以使用点击进行标记,也可以使用长按进行标记。 -成就 +成就与排行榜 你有八个成就可以解锁,还有不同的排行榜可以与你的朋友分享。 -可及性 -你可以根据你的需要自定义这个游戏:改变正方形大小、半径、触摸时间和屏幕阅读器支持。 -我们一直在努力改进我们的访问设置。 如果你错过一些东西给我们反馈! +无障碍 +你可以根据你的需要自定义这个游戏:更改正方形大小、圆角半径、触摸时长以及屏幕阅读器支持。 +我们一直在努力改进无障碍设置。 如果你错过了什么,请给我们反馈! ANDROID -它支持很酷的安卓功能,例如分割屏幕、快捷键、共享、系统主题以及始终支持最后版本。 +它支持很酷的安卓特性,例如:分屏、快捷键、分享、系统主题、以及总是支持最新版本。 在线或离线 -您不需要在线才能玩游戏! +运行此游戏不需要您在线! 自动保存 -你可以稍后再开始一局游戏! 它将自动保存您的游戏。 +您可以先开始一局游戏,稍后再继续这局游戏! 此游戏会自动保存您的游戏。 尽情享受吧! diff --git a/fastlane/metadata/android/zh-CN/short_description.txt b/fastlane/metadata/android/zh-CN/short_description.txt index 316d71ae8..fd485c88d 100644 --- a/fastlane/metadata/android/zh-CN/short_description.txt +++ b/fastlane/metadata/android/zh-CN/short_description.txt @@ -1 +1 @@ -扫除雷区里的隐藏的地雷 +扫除雷区里隐藏的地雷 diff --git a/gdx/src/main/java/dev/lucasnlm/antimine/gdx/stages/MinefieldStage.kt b/gdx/src/main/java/dev/lucasnlm/antimine/gdx/stages/MinefieldStage.kt index b24f4a7b7..533d22fe7 100644 --- a/gdx/src/main/java/dev/lucasnlm/antimine/gdx/stages/MinefieldStage.kt +++ b/gdx/src/main/java/dev/lucasnlm/antimine/gdx/stages/MinefieldStage.kt @@ -230,6 +230,10 @@ class MinefieldStage( GdxLocal.currentFocus = null } + if (boundAreas.isEmpty()) { + return + } + if (minefield != null && currentFocus == null && forceFocus) { val id = minefield.width * (minefield.height / 2) + minefield.width / 2 GdxLocal.currentFocus = boundAreas[id] diff --git a/i18n/src/main/res/values-de-rDE/strings.xml b/i18n/src/main/res/values-de-rDE/strings.xml index c5b410eda..4f0f08bfd 100644 --- a/i18n/src/main/res/values-de-rDE/strings.xml +++ b/i18n/src/main/res/values-de-rDE/strings.xml @@ -15,7 +15,7 @@ Mittleres Niveau Experte Meister - Legend + Ikone Öffnen Einstellungen Animationen @@ -117,6 +117,6 @@ Weißt du, wie man Minesweeper spielt? Schließen Anleitung öffnen - Allow tap on numbers + Antippen von Zahlenquadraten erlauben Zum Anpassen tippen diff --git a/i18n/src/main/res/values-fi-rFI/strings.xml b/i18n/src/main/res/values-fi-rFI/strings.xml index ab9096e79..e868ca220 100644 --- a/i18n/src/main/res/values-fi-rFI/strings.xml +++ b/i18n/src/main/res/values-fi-rFI/strings.xml @@ -118,5 +118,5 @@ Sulje Avaa Johdanto Salli numeroiden napauttaminen - Tap to customize + Paina mukauttaaksesi diff --git a/i18n/src/main/res/values-pt-rBR/strings.xml b/i18n/src/main/res/values-pt-rBR/strings.xml index c938bc626..cb5bc8e86 100644 --- a/i18n/src/main/res/values-pt-rBR/strings.xml +++ b/i18n/src/main/res/values-pt-rBR/strings.xml @@ -57,7 +57,7 @@ Áreas abertas Tempo total Tempo médio - Menor Tempo + Menor tempo Desempenho OK Usar Ponto de Interrogação @@ -86,7 +86,7 @@ Não Geral Mais - Código fonte + Código-fonte Tradução Licenças Google Play Jogos @@ -112,7 +112,7 @@ Selecionar Idioma Alternar: sinalizar e abrir Usar um botão para alternar entre a Bandeira e Abrir - Você deve limpar um campo cheio de mines escondidas sem detonar nenhumas delas. + Você deve limpar um campo cheio de minas escondidas sem detonar nenhumas delas. Antimine Você sabe como jogar Campo Minado? Fechar diff --git a/i18n/src/main/res/values-pt-rPT/strings.xml b/i18n/src/main/res/values-pt-rPT/strings.xml index cfebf3d12..2d3fce9d1 100644 --- a/i18n/src/main/res/values-pt-rPT/strings.xml +++ b/i18n/src/main/res/values-pt-rPT/strings.xml @@ -3,23 +3,23 @@ Tutorial A regra do jogo é simples, o número em um quadrado mostra o número de minas adjacentes a ele e você tem que sinalizar todas as minas. Se um número está atingindo o mesmo número de quadrados, então os quadrados são todos as minas. - Depois de marcar sua primeira bandeira, revise os números e analise o próximo quadrado. - Se um quadrado tem o mesmo número de bandeiras, todos os outros quadrados restantes adjacentes a ele não são minas (a seta verde). - Revise os números e continue abrindo os quadrados. + Depois de marcares a tua primeira bandeira, verifica os números e analisa o próximo quadrado. + Se um quadrado tem o mesmo número de bandeiras, todos os outros quadrados restantes adjacentes a este não são minas (seta verde). + Verifica os números e continua a abrir os quadrados. Jogos - Toque para começar + Tocar para começar Jogos anteriores Dificuldade Padrão Iniciante - Intermediário - Especialista + Intermédio + Perito Mestre Lenda Abrir Configurações Animações - Feedback háptico + Resposta tátil Sobre Estatísticas Personalizado @@ -27,9 +27,9 @@ Largura Altura Minas - Se iniciar um novo jogo, o seu progresso actual será perdido. + Se iniciares um novo jogo, o teu progresso atual será perdido. Mostrar licenças - Quer começar um novo jogo? + Queres começar um novo jogo? %d minas Tempo de jogo Mina @@ -38,46 +38,46 @@ Acessibilidade Tamanho Quadrado arredondado - Espaço entre Quadrados + Espaço entre quadrados Sistema Opinião - Não foi possível fazer o sign in. Por favor verifique a sua conexão à Internet e tente de novo. - Ganhou! + Não foi possível fazer a autenticação. Por favor verifica a tua ligação à Internet e tenta de novo. + Ganhaste! Vitórias - Perdeu! - Você terminou! + Perdeste! + Terminaste! Derrotas - Boa sorte no seu próximo jogo. - You found %1$d mines in %2$d seconds. - Falha ao compartilhar + Boa sorte no teu próximo jogo. + Encontraste %1$d minas em %2$d segundos. + Falha ao partilhar Versão %1$s - Efeitos Sonoros - Você tem certeza? - Activar colocação automática de bandeiras + Efeitos sonoros + Tens a certeza? + Ativar colocação automática de bandeiras Áreas abertas - Tempo Total + Tempo total Tempo médio - Menor Tempo + Menor tempo Desempenho OK - Usar Ponto de Interrogação - Modo \"Sem adivinhação\" + Usar ponto de interrogação + Modo \"sem adivinhação\" Controlos - Toque Único - Toque Duplo - Toque Longo + Toque único + Toque duplo + Toque longo %ACTION para %REACTION Sensibilidade tátil Abrir Bandeira - Tentar Novamente + Tentar novamente Continuar Vazio Impossível fazer isso agora - Você recebeu: +%1$d - Para mais Ajuda, você deve ganhar um jogo. + Recebeste: +%1$d + Para mais ajuda, tens de ganhar um jogo. Erro desconhecido. - Líderes + Quadro de pontuações Cancelar Continuar Sim @@ -86,37 +86,37 @@ Não Geral Mais - Código Fonte + Código-fonte Tradução Licenças - Google Play Jogos + Jogos Google Play A carregar… Conectar - Conectando… + A conectar… Desconectar Desconectado - Novo Jogo - Compartilhar - Compartilhar… + Novo jogo + Partilhar + Partilhar… Sem ligação à Internet. Apagar tudo Aparência Temas - Excluir todos os eventos permanentemente. - Remover Anúncios + Eliminar todos os eventos permanentemente. + Remover anúncios Ajuda Voltar - Doação - Abrir na ecrã de jogo + Donativo + Abrir no ecrã do jogo Mostrar janelas Selecionar idioma - Alternador: sinalizar e abrir - Use o botão para alternar entre a Bandeira e Abrir - Você deve limpar um campo contendo minas escondidas sem detonar nenhuma delas. + Alternador: Bandeira e Abrir + Usa o botão para alternar entre a Bandeira e Abrir + Tens de limpar um campo que contém minas escondidas sem detonar nenhuma delas. Antimine - Você sabe jogar Campo Minado? + Sabes jogar Campo Minado? Fechar - Abrir Tutorial + Abrir tutorial Permitir toque nos números - Toque para personalizar + Tocar para personalizar diff --git a/i18n/src/main/res/values-uk-rUA/strings.xml b/i18n/src/main/res/values-uk-rUA/strings.xml index 4b5bd7520..7916c0407 100644 --- a/i18n/src/main/res/values-uk-rUA/strings.xml +++ b/i18n/src/main/res/values-uk-rUA/strings.xml @@ -15,7 +15,7 @@ Середній Експерт Досвідчений - Legend + Легенда Відкрити Налаштування Анімації @@ -118,5 +118,5 @@ Закрити Відкрити навчання Дозволити натискання на цифри - Tap to customize + Натисніть, щоб налаштувати diff --git a/i18n/src/main/res/values-zh-rCN/strings.xml b/i18n/src/main/res/values-zh-rCN/strings.xml index dea3a3cc2..f3486c771 100644 --- a/i18n/src/main/res/values-zh-rCN/strings.xml +++ b/i18n/src/main/res/values-zh-rCN/strings.xml @@ -1,9 +1,9 @@ 教程 - 游戏规则很简单:方块上的数字是周围地雷的数量;你必须要用旗子标记出所有的地雷。 + 游戏规则很简单:方块上的数字是周围地雷的数量;你必须标出所有地雷。 如果一个数字和它周围的方块数量相等,那么这些方块都是地雷。 - 在放置了第一个旗标以后,回看数字并分析下一个方块。 + 标记之后,回看数字并分析下一个方块。 如果一个方块周围有相同数量的旗标,那么周围其余方块就不是地雷(绿色箭头)。 回看数字并不断打开方块。 游戏数 @@ -48,13 +48,13 @@ 完成了! 失败 祝你下次游戏好运。 - 你用%2$d秒找出了%1$d枚地雷。 + 你用 %2$d 秒找出了 %1$d 枚地雷。 分享失败 版本 %1$s 音效 你确定吗? 启用旗标自动放置 - 开放区域 + 踩中地雷 总用时 平均用时 最短用时 @@ -73,8 +73,8 @@ 重试 继续 - 现在无法做到这一点。 - 您已收到: +%1$d + 目前无法使用 + 您获得了:+%1$d 为了获得更多帮助,你必须赢得一场游戏。 未知错误。 排行榜 @@ -83,8 +83,8 @@ 解锁​​​​ 成就 - - 通用 + + 总计 更多 源代码 翻译 @@ -105,18 +105,18 @@ 全部记录将被永久删除。 去除广告 帮助 - 后退 + 返回 捐助 在游戏启动时上打开上一局游戏 显示结果对话框 选择语言 开关:(切换)标记与打开 使用按钮在标记和打开之间切换 - 你需要清除一个隐藏着地雷的矩形面板,不能使任何地雷爆炸。 + 你需要在不引爆地雷的情况下, 清理有着隐藏地雷的矩形区域。 扫雷 (踩地雷) - Antimine 你想阅读教程吗? 关闭 打开教程 允许点击数字 - 点按即可自定义 + 点击可自定义 diff --git a/proprietary/build.gradle b/proprietary/build.gradle index bdde60612..079cae2fa 100644 --- a/proprietary/build.gradle +++ b/proprietary/build.gradle @@ -50,10 +50,13 @@ dependencies { implementation 'com.google.android.play:core-ktx:1.8.1' // Firebase - implementation 'com.google.firebase:firebase-analytics-ktx:19.0.0' - implementation 'com.google.firebase:firebase-crashlytics:18.0.1' - implementation 'com.google.firebase:firebase-firestore-ktx:23.0.1' - implementation 'com.google.firebase:firebase-config-ktx:21.0.0' + implementation platform('com.google.firebase:firebase-bom:28.1.0') + implementation 'com.google.firebase:firebase-analytics-ktx' + implementation 'com.google.firebase:firebase-crashlytics' + implementation 'com.google.firebase:firebase-firestore-ktx' + implementation 'com.google.firebase:firebase-config-ktx' + implementation 'com.google.firebase:firebase-auth-ktx' + implementation 'com.google.firebase:firebase-perf-ktx' // Kotlin implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.4.1' diff --git a/wear/src/main/res/values-pt-rPT/strings.xml b/wear/src/main/res/values-pt-rPT/strings.xml index 38bc00ba4..1814c00e5 100644 --- a/wear/src/main/res/values-pt-rPT/strings.xml +++ b/wear/src/main/res/values-pt-rPT/strings.xml @@ -1,6 +1,6 @@ - Novo Jogo - Você ganhou! 😎 + Novo jogo + Ganhaste! 😎 Explodiu! 😢 From f9ded6de21e3b01b92f713ad2d1740765325fd38 Mon Sep 17 00:00:00 2001 From: Lucas Lima Date: Thu, 24 Jun 2021 10:19:03 -0300 Subject: [PATCH 2/5] Bump version --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index c730ea7fb..b4e47c65b 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -15,8 +15,8 @@ android { defaultConfig { // versionCode and versionName must be hardcoded to support F-droid - versionCode 1202001 - versionName '12.2.0' + versionCode 1203001 + versionName '12.3.0' minSdkVersion 21 targetSdkVersion 30 multiDexEnabled true From 8dc9584ac310600b014bd3740a6b0a037999b88e Mon Sep 17 00:00:00 2001 From: Lucas Lima Date: Wed, 30 Jun 2021 19:55:05 -0300 Subject: [PATCH 3/5] Fix bugs and improve Toggle Click-Flag control --- about/build.gradle | 2 +- app/build.gradle | 10 ++--- app/src/main/AndroidManifest.xml | 4 ++ .../dev/lucasnlm/antimine/GameActivity.kt | 42 +++++++++++++++++- .../dev/lucasnlm/antimine/di/AppModule.kt | 6 ++- .../gameover/WinGameDialogFragment.kt | 3 +- .../antimine/support/AppVersionManagerImpl.kt | 19 ++++++++ .../main/res/layout-land/activity_game.xml | 17 ++++--- app/src/main/res/layout/activity_game.xml | 40 ++++++++++------- .../main/res/layout/activity_preferences.xml | 42 +++++++++--------- .../mocks/MockPreferencesRepository.kt | 4 ++ build.gradle | 2 +- common/build.gradle | 2 +- .../common/level/view/GdxLevelFragment.kt | 23 +++++++--- .../common/level/viewmodel/GameViewModel.kt | 2 +- common/src/main/res/drawable/touch.xml | 5 +-- .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 2778 bytes .../res/mipmap-hdpi/ic_launcher_round.png | Bin 0 -> 4726 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 1965 bytes .../res/mipmap-mdpi/ic_launcher_round.png | Bin 0 -> 2976 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 3852 bytes .../res/mipmap-xhdpi/ic_launcher_round.png | Bin 0 -> 6765 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 5998 bytes .../res/mipmap-xxhdpi/ic_launcher_round.png | Bin 0 -> 10645 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 8241 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.png | Bin 0 -> 15310 bytes control/build.gradle | 2 +- .../antimine/control/ControlActivity.kt | 13 ++++++ .../control/viewmodel/ControlState.kt | 1 + .../control/viewmodel/ControlViewModel.kt | 6 ++- .../src/main/res/layout/activity_control.xml | 42 +++++++++++++++++- .../antimine/core/IAppVersionManager.kt | 5 +++ gdx/build.gradle | 2 +- .../antimine/gdx/GameApplicationListener.kt | 7 ++- gradle/wrapper/gradle-wrapper.properties | 5 ++- i18n/src/main/res/values/strings.xml | 1 + .../preferences/IPreferencesRepository.kt | 3 ++ .../antimine/preferences/PreferenceKeys.kt | 1 + .../preferences/PreferencesRepository.kt | 8 ++++ .../preferences/models/GameControl.kt | 2 +- proprietary/build.gradle | 2 +- themes/build.gradle | 2 +- tutorial/build.gradle | 2 +- ui/build.gradle | 2 +- .../lucasnlm/antimine/ui/repository/Themes.kt | 4 +- 45 files changed, 256 insertions(+), 77 deletions(-) create mode 100644 app/src/main/java/dev/lucasnlm/antimine/support/AppVersionManagerImpl.kt create mode 100644 common/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 common/src/main/res/mipmap-hdpi/ic_launcher_round.png create mode 100644 common/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 common/src/main/res/mipmap-mdpi/ic_launcher_round.png create mode 100644 common/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 common/src/main/res/mipmap-xhdpi/ic_launcher_round.png create mode 100644 common/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 common/src/main/res/mipmap-xxhdpi/ic_launcher_round.png create mode 100644 common/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 common/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png create mode 100644 core/src/main/java/dev/lucasnlm/antimine/core/IAppVersionManager.kt diff --git a/about/build.gradle b/about/build.gradle index f42483484..d9add98e2 100644 --- a/about/build.gradle +++ b/about/build.gradle @@ -46,7 +46,7 @@ dependencies { // AndroidX implementation 'androidx.appcompat:appcompat:1.3.0' implementation 'androidx.activity:activity-ktx:1.2.3' - implementation 'androidx.fragment:fragment-ktx:1.3.4' + implementation 'androidx.fragment:fragment-ktx:1.3.5' // RecyclerView implementation 'androidx.recyclerview:recyclerview:1.2.1' diff --git a/app/build.gradle b/app/build.gradle index b4e47c65b..3e20c364b 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -15,8 +15,8 @@ android { defaultConfig { // versionCode and versionName must be hardcoded to support F-droid - versionCode 1203001 - versionName '12.3.0' + versionCode 1204001 + versionName '12.4.0' minSdkVersion 21 targetSdkVersion 30 multiDexEnabled true @@ -131,7 +131,7 @@ dependencies { implementation 'androidx.recyclerview:recyclerview:1.2.1' implementation 'androidx.multidex:multidex:2.0.1' implementation 'androidx.activity:activity-ktx:1.2.3' - implementation 'androidx.fragment:fragment-ktx:1.3.4' + implementation 'androidx.fragment:fragment-ktx:1.3.5' implementation 'androidx.cardview:cardview:1.0.0' // Lifecycle @@ -169,8 +169,8 @@ dependencies { testImplementation 'androidx.test:runner:1.3.0' testImplementation 'androidx.test.espresso:espresso-core:3.3.0' testImplementation 'androidx.test.espresso:espresso-contrib:3.3.0' - testImplementation 'androidx.fragment:fragment-testing:1.3.4' - testImplementation 'org.robolectric:robolectric:4.3.1' + testImplementation 'androidx.fragment:fragment-testing:1.3.5' + testImplementation 'org.robolectric:robolectric:4.4.0' testImplementation 'androidx.test.ext:junit:1.1.2' testImplementation 'io.mockk:mockk:1.11.0' diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 7eb74ed0e..26a14434d 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -46,6 +46,10 @@ android:theme="@style/AppTheme" tools:targetApi="lollipop"> + + diff --git a/app/src/main/java/dev/lucasnlm/antimine/GameActivity.kt b/app/src/main/java/dev/lucasnlm/antimine/GameActivity.kt index b67c2dfe6..085a440b8 100644 --- a/app/src/main/java/dev/lucasnlm/antimine/GameActivity.kt +++ b/app/src/main/java/dev/lucasnlm/antimine/GameActivity.kt @@ -34,6 +34,7 @@ import dev.lucasnlm.antimine.control.ControlActivity import dev.lucasnlm.antimine.gdx.GdxLocal import dev.lucasnlm.antimine.main.MainActivity import dev.lucasnlm.antimine.preferences.IPreferencesRepository +import dev.lucasnlm.antimine.preferences.models.ControlStyle import dev.lucasnlm.antimine.splash.SplashActivity import dev.lucasnlm.antimine.tutorial.TutorialActivity import dev.lucasnlm.antimine.ui.ThematicActivity @@ -74,6 +75,8 @@ class GameActivity : private val renderSquareRadius = preferencesRepository.squareRadius() private val renderSquareDivider = preferencesRepository.squareDivider() private val renderSquareSize = preferencesRepository.squareSize() + private val showFloatingButtonOnTop = preferencesRepository.showToggleButtonOnTopBar() + private val hasFloatingButton = preferencesRepository.controlStyle() == ControlStyle.SwitchMarkOpen override fun onNewIntent(intent: Intent?) { super.onNewIntent(intent) @@ -94,6 +97,7 @@ class GameActivity : bindToolbar() loadGameOrTutorial() bindTapToBegin() + bindToggleButton() playGamesManager.showPlayPopUp(this) playGamesStartUp() @@ -344,7 +348,9 @@ class GameActivity : super.onResume() if (renderSquareRadius != preferencesRepository.squareRadius() || renderSquareDivider != preferencesRepository.squareDivider() || - renderSquareSize != preferencesRepository.squareSize() + renderSquareSize != preferencesRepository.squareSize() || + showFloatingButtonOnTop != preferencesRepository.showToggleButtonOnTopBar() || + hasFloatingButton != (preferencesRepository.controlStyle() == ControlStyle.SwitchMarkOpen) ) { // If used changed any currently rendered settings, we // must recreate the activity to force all sprites are updated. @@ -723,6 +729,40 @@ class GameActivity : } } + private fun bindToggleButton() { + if (preferencesRepository.controlStyle() == ControlStyle.SwitchMarkOpen) { + if (preferencesRepository.showToggleButtonOnTopBar()) { + topBarToggle.apply { + visibility = View.VISIBLE + contentDescription = getString(R.string.open) + TooltipCompat.setTooltipText(this, getString(R.string.open)) + setImageResource(R.drawable.touch) + preferencesRepository.setSwitchControl(true) + + setOnClickListener { + if (preferencesRepository.openUsingSwitchControl()) { + contentDescription = getString(R.string.flag_tile) + TooltipCompat.setTooltipText(this, getString(R.string.flag_tile)) + setImageResource(R.drawable.flag) + preferencesRepository.setSwitchControl(false) + gameViewModel.refreshUseOpenOnSwitchControl(false) + } else { + contentDescription = getString(R.string.open) + TooltipCompat.setTooltipText(this, getString(R.string.open)) + setImageResource(R.drawable.touch) + preferencesRepository.setSwitchControl(true) + gameViewModel.refreshUseOpenOnSwitchControl(true) + } + } + } + } else { + topBarToggle.visibility = View.GONE + } + + gameViewModel.refreshUseOpenOnSwitchControl(true) + } + } + override fun exit() { // LibGDX exit callback } diff --git a/app/src/main/java/dev/lucasnlm/antimine/di/AppModule.kt b/app/src/main/java/dev/lucasnlm/antimine/di/AppModule.kt index 4be79083e..3c49ff514 100644 --- a/app/src/main/java/dev/lucasnlm/antimine/di/AppModule.kt +++ b/app/src/main/java/dev/lucasnlm/antimine/di/AppModule.kt @@ -1,10 +1,12 @@ package dev.lucasnlm.antimine.di import dev.lucasnlm.antimine.cloud.CloudSaveManagerImpl -import dev.lucasnlm.antimine.common.BuildConfig +import dev.lucasnlm.antimine.BuildConfig +import dev.lucasnlm.antimine.core.IAppVersionManager import dev.lucasnlm.antimine.core.analytics.DebugAnalyticsManager import dev.lucasnlm.antimine.core.analytics.ProdAnalyticsManager import dev.lucasnlm.antimine.core.cloud.CloudSaveManager +import dev.lucasnlm.antimine.support.AppVersionManagerImpl import dev.lucasnlm.antimine.support.IapHandler import dev.lucasnlm.external.ExternalAnalyticsWrapper import dev.lucasnlm.external.IAnalyticsManager @@ -16,6 +18,8 @@ val AppModule = module { single { CloudSaveManagerImpl(get(), get(), get(), get()) } bind CloudSaveManager::class + single { AppVersionManagerImpl(BuildConfig.DEBUG, BuildConfig.VERSION_NAME) } bind IAppVersionManager::class + single { if (BuildConfig.DEBUG) { DebugAnalyticsManager() diff --git a/app/src/main/java/dev/lucasnlm/antimine/gameover/WinGameDialogFragment.kt b/app/src/main/java/dev/lucasnlm/antimine/gameover/WinGameDialogFragment.kt index 360e23f77..846bc30d3 100644 --- a/app/src/main/java/dev/lucasnlm/antimine/gameover/WinGameDialogFragment.kt +++ b/app/src/main/java/dev/lucasnlm/antimine/gameover/WinGameDialogFragment.kt @@ -215,7 +215,8 @@ class WinGameDialogFragment : AppCompatDialogFragment() { receivedMessage.apply { if (state.received > 0 && state.gameResult == GameResult.Victory && - preferencesRepository.useHelp() + preferencesRepository.useHelp() && + preferencesRepository.isPremiumEnabled() ) { visibility = View.VISIBLE text = getString(R.string.you_have_received, state.received) diff --git a/app/src/main/java/dev/lucasnlm/antimine/support/AppVersionManagerImpl.kt b/app/src/main/java/dev/lucasnlm/antimine/support/AppVersionManagerImpl.kt new file mode 100644 index 000000000..d017b77ca --- /dev/null +++ b/app/src/main/java/dev/lucasnlm/antimine/support/AppVersionManagerImpl.kt @@ -0,0 +1,19 @@ +package dev.lucasnlm.antimine.support + +import dev.lucasnlm.antimine.core.IAppVersionManager + +class AppVersionManagerImpl( + private val debug: Boolean, + private val id: String, +) : IAppVersionManager { + private val valid by lazy { + debug || id == "com.logical.minato" || id == "dev.lucasnlm.antimine" || id == "dev.lucanlm.antimine" + } + + override fun isValid(): Boolean { + // If you want to distribution a fork of this game, + // please check its LICENSE and conditions before do it. + // Any fork / changed version must also be open sourced. + return valid + } +} diff --git a/app/src/main/res/layout-land/activity_game.xml b/app/src/main/res/layout-land/activity_game.xml index d32f007b4..6a0e9d66d 100644 --- a/app/src/main/res/layout-land/activity_game.xml +++ b/app/src/main/res/layout-land/activity_game.xml @@ -126,6 +126,16 @@ tools:visibility="visible" /> + + @@ -135,9 +145,9 @@ android:layout_width="?attr/actionBarSize" android:layout_height="?attr/actionBarSize" android:layout_gravity="center" - app:trackThickness="3dp" + app:indicatorColor="?attr/colorPrimary" app:indicatorSize="24dp" - app:indicatorColor="?attr/colorPrimary"/> + app:trackThickness="3dp" /> - - - diff --git a/app/src/main/res/layout/activity_game.xml b/app/src/main/res/layout/activity_game.xml index f74087be3..d8f725abd 100644 --- a/app/src/main/res/layout/activity_game.xml +++ b/app/src/main/res/layout/activity_game.xml @@ -22,35 +22,35 @@ android:id="@+id/tapToBegin" android:layout_width="wrap_content" android:layout_height="wrap_content" + android:background="@drawable/round_background" android:clickable="false" + android:includeFontPadding="false" + android:paddingHorizontal="12dp" + android:paddingVertical="8dp" android:text="@string/tap_to_begin" - android:textStyle="bold" android:textAllCaps="true" - android:paddingVertical="8dp" - android:paddingHorizontal="12dp" - android:background="@drawable/round_background" - android:includeFontPadding="false" - app:layout_constraintStart_toStartOf="parent" + android:textStyle="bold" + app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintTop_toTopOf="parent" - app:layout_constraintBottom_toBottomOf="parent"/> + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" /> + tools:text="Action to Reaction" /> + + @@ -138,9 +148,9 @@ android:layout_width="?attr/actionBarSize" android:layout_height="?attr/actionBarSize" android:layout_gravity="center" - app:trackThickness="3dp" + app:indicatorColor="?attr/colorPrimary" app:indicatorSize="24dp" - app:indicatorColor="?attr/colorPrimary"/> + app:trackThickness="3dp" /> @@ -242,7 +242,7 @@ android:focusable="true" android:paddingVertical="16dp" android:text="@string/no_guessing_mode" - android:textColor="?attr/colorOnBackground" + android:textColor="?attr/colorControlNormal" android:textSize="15sp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" @@ -258,7 +258,7 @@ app:layout_constraintTop_toTopOf="@+id/noGuessingLabel" /> + app:layout_constraintTop_toTopOf="@+id/allowClickNumberLabel" /> + app:layout_constraintTop_toBottomOf="@+id/allowClickNumberLabel" /> + app:layout_constraintTop_toTopOf="@+id/helpLabel" /> diff --git a/app/src/test/java/dev/lucasnlm/antimine/mocks/MockPreferencesRepository.kt b/app/src/test/java/dev/lucasnlm/antimine/mocks/MockPreferencesRepository.kt index ea81bfcf0..550f20381 100644 --- a/app/src/test/java/dev/lucasnlm/antimine/mocks/MockPreferencesRepository.kt +++ b/app/src/test/java/dev/lucasnlm/antimine/mocks/MockPreferencesRepository.kt @@ -158,4 +158,8 @@ class MockPreferencesRepository : IPreferencesRepository { override fun allowTapOnNumbers(): Boolean = true override fun setAllowTapOnNumbers(allow: Boolean) { } + + override fun setToggleButtonOnTopBar(enabled: Boolean) { } + + override fun showToggleButtonOnTopBar(): Boolean = false } diff --git a/build.gradle b/build.gradle index 1ffd236f3..7a09a927f 100644 --- a/build.gradle +++ b/build.gradle @@ -6,7 +6,7 @@ buildscript { } dependencies { - classpath 'com.android.tools.build:gradle:4.0.2' + classpath 'com.android.tools.build:gradle:4.1.0' classpath 'org.jetbrains.kotlin:kotlin-gradle-plugin:1.5.0' if (System.getenv('IS_GOOGLE_BUILD')) { diff --git a/common/build.gradle b/common/build.gradle index 8631e7366..1b0268893 100644 --- a/common/build.gradle +++ b/common/build.gradle @@ -45,7 +45,7 @@ dependencies { implementation 'androidx.preference:preference-ktx:1.1.1' implementation 'androidx.recyclerview:recyclerview:1.2.1' implementation 'androidx.activity:activity-ktx:1.2.3' - implementation 'androidx.fragment:fragment-ktx:1.3.4' + implementation 'androidx.fragment:fragment-ktx:1.3.5' // Google implementation 'com.google.android.material:material:1.3.0' diff --git a/common/src/main/java/dev/lucasnlm/antimine/common/level/view/GdxLevelFragment.kt b/common/src/main/java/dev/lucasnlm/antimine/common/level/view/GdxLevelFragment.kt index fc1906fd3..3183fdc46 100644 --- a/common/src/main/java/dev/lucasnlm/antimine/common/level/view/GdxLevelFragment.kt +++ b/common/src/main/java/dev/lucasnlm/antimine/common/level/view/GdxLevelFragment.kt @@ -18,6 +18,7 @@ import com.google.android.material.floatingactionbutton.FloatingActionButton import dev.lucasnlm.antimine.common.R import dev.lucasnlm.antimine.common.level.viewmodel.GameEvent import dev.lucasnlm.antimine.common.level.viewmodel.GameViewModel +import dev.lucasnlm.antimine.core.IAppVersionManager import dev.lucasnlm.antimine.core.dpToPx import dev.lucasnlm.antimine.core.isPortrait import dev.lucasnlm.antimine.core.repository.IDimensionRepository @@ -29,12 +30,14 @@ import dev.lucasnlm.antimine.preferences.models.ControlStyle import dev.lucasnlm.antimine.ui.ext.toAndroidColor import dev.lucasnlm.antimine.ui.repository.IThemeRepository import dev.lucasnlm.external.ICrashReporter +import kotlinx.coroutines.delay import kotlinx.coroutines.flow.collect import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.map import kotlinx.coroutines.launch import org.koin.android.ext.android.inject import org.koin.androidx.viewmodel.ext.android.sharedViewModel +import kotlin.system.exitProcess open class GdxLevelFragment : AndroidFragmentApplication() { private val gameViewModel by sharedViewModel() @@ -42,12 +45,14 @@ open class GdxLevelFragment : AndroidFragmentApplication() { private val dimensionRepository: IDimensionRepository by inject() private val preferencesRepository: IPreferencesRepository by inject() private val crashReporter: ICrashReporter by inject() + private val appVersionManager: IAppVersionManager by inject() private var controlSwitcher: FloatingActionButton? = null private val levelApplicationListener by lazy { GameApplicationListener( context = requireContext(), + appVersion = appVersionManager, theme = themeRepository.getTheme(), preferencesRepository = preferencesRepository, dimensionRepository = dimensionRepository, @@ -113,6 +118,13 @@ open class GdxLevelFragment : AndroidFragmentApplication() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) + lifecycleScope.launchWhenCreated { + if (!appVersionManager.isValid()) { + delay(15 * 1000L) + exitProcess(0) + } + } + lifecycleScope.launchWhenCreated { gameViewModel.observeState().collect { levelApplicationListener.bindField(it.field) @@ -169,11 +181,13 @@ open class GdxLevelFragment : AndroidFragmentApplication() { private fun bindControlSwitcherIfNeeded(view: View, delayed: Boolean = true) { if (controlSwitcher != null) { if (preferencesRepository.controlStyle() == ControlStyle.SwitchMarkOpen) { - controlSwitcher?.visibility = View.VISIBLE - } else { - controlSwitcher?.visibility = View.GONE + if (preferencesRepository.showToggleButtonOnTopBar()) { + controlSwitcher?.hide() + } else { + controlSwitcher?.show() + } } - } else { + } else if (!preferencesRepository.showToggleButtonOnTopBar()) { view.postDelayed(if (delayed) 200L else 0L) { val isParentFinishing = activity?.isFinishing ?: true if (preferencesRepository.controlStyle() == ControlStyle.SwitchMarkOpen && !isParentFinishing) { @@ -188,7 +202,6 @@ open class GdxLevelFragment : AndroidFragmentApplication() { setImageResource(R.drawable.touch) compatElevation = 4f - setShadowPaddingEnabled(true) alpha = 0f animate().apply { alpha(1.0f) diff --git a/common/src/main/java/dev/lucasnlm/antimine/common/level/viewmodel/GameViewModel.kt b/common/src/main/java/dev/lucasnlm/antimine/common/level/viewmodel/GameViewModel.kt index c1fb52553..c14b544b4 100644 --- a/common/src/main/java/dev/lucasnlm/antimine/common/level/viewmodel/GameViewModel.kt +++ b/common/src/main/java/dev/lucasnlm/antimine/common/level/viewmodel/GameViewModel.kt @@ -644,7 +644,7 @@ open class GameViewModel( saveGame() saveStats() - if (clock.time() > 5L) { + if (clock.time() > 5L && preferencesRepository.isPremiumEnabled()) { if (isCompletedWithMistakes()) { addNewTip(1) } else { diff --git a/common/src/main/res/drawable/touch.xml b/common/src/main/res/drawable/touch.xml index 7b31bd4aa..abf5e5e2b 100644 --- a/common/src/main/res/drawable/touch.xml +++ b/common/src/main/res/drawable/touch.xml @@ -2,9 +2,8 @@ android:width="24dp" android:height="24dp" android:viewportWidth="24" - android:viewportHeight="24" - android:tint="?attr/colorControlNormal"> + android:viewportHeight="24"> diff --git a/common/src/main/res/mipmap-hdpi/ic_launcher.png b/common/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..9ac75736307868f1afea9a8e875e00dda2f8d02f GIT binary patch literal 2778 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 literal 0 HcmV?d00001 diff --git a/common/src/main/res/mipmap-hdpi/ic_launcher_round.png b/common/src/main/res/mipmap-hdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..0d03770858a4556a122c523b74dba799bca519b8 GIT binary patch literal 4726 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 Ef;1)rApigX literal 0 HcmV?d00001 diff --git a/common/src/main/res/mipmap-mdpi/ic_launcher.png b/common/src/main/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..2956ec6e5eb6a208b27fb4d0b9c3bb64a6586c33 GIT binary patch literal 1965 zcmV;e2U7TnP)YkSc`$fdCN=FA2uFi(*k}Q?%P+5kXrj0)mg#itW}1Hmss%fu%g8 zfRqJSDIi7bv$JIY6-2P;jyu!YPCIL7>dx4Q0=jM&<@(!mE&+o#5E5?I{?Rk@%^^4U z=KQ|%%n(9;DL>xr0AiJ+~l&zEvu78Ni@#GB$^?a6j7Ope72D!1_b&p zlH!MdBH;e`e?UjsOi3D7-)SPx^mUN$xg!L9I?_uU;b?6=_EAzP zNkTYQCz9TW$pm*+lON7U5obQDv4xE$V$13;>WI&S4${RnQh^-$A&>W%*z6&K-Zq4Z z=moluYsgGKtF}MukTM`}p_C{dTq3u*cKUFI`2zpmE5VoV+T#4ir*L(vo#1@|+le6b zZ~|2?5G9}0qyQU%4*GBd6?orBqr-4xmkr(sodT7@37&4wcy5LhzSE8q-1qf%TU<%A z!+$a*Cg;DQz@Z4@$7db2z-1~>O+P407}glq-nPR``Ll3wap93tv`Z%AzxyPE_xzpS z^TMpDnBn;>)`vOZTC5!lDF`l}zy;D!2< zB)GA`i~A%!4F&1B-D_e}#wNhH*CN5XSO-A}OEETbY+*M?JD_80B+9kfT+yCV!)lmQ}O7qvIbJAD_(qFgTg-)nl6PwDFGuo)DfU$1fRf&|xU><}Aid>0an zuwREE@4Z4kyoCaC#m!Ftt{<;V$DK|muJ`hI{NtD%qF;1`hlPigIfTz!$WNUy3w(Fg zA2DEjy^+2t!+e24D$qy;nrQH5D!^((j-HwYg~C

9 zlJquo+p?`EP<=cIaxd`&q%KlKFNtAc2e(hNx6#oGG_+Q5h|fQTH}XzGty#{0@AsM!fXL1JvAX;V#C_0%^z23)*i&Y?z7=LUR5$(Cx3M0;Pij zNwMqsf9{Sbu(!nDcPt}N-5LsA{Tgg3NJQ%X*Abtw87YU_1VKmQ%|BnqYbE!wvZx2! zvRk?Q%nDv0d1bOc%V<=fwl}kS*$zqx!I&1zKXcAE;A~tDbjz)|P+T zv!<-sY!XYGy5o!6dR}?|U$+~0h=TIzyW zjJ397Rh%l(s$uPN&h)gSPS5nr98XJ6Pj$483rYUD|I2$XFE7c66`22=@7%ZE`+fg% z@69_QhIy90W7Wr42*J?v z$LQsHvV@X4K}lYxEg0_s>^mp04=QLP->=Ft#)ui0=lpR!$)p~=AR=ut)DYuvfX`Y9 zsw5X6i(~>Z*8~#{_V~U{SeVpP36yk?fH)Ew!dC3zVZickDLv01U{H}B8i53UJmuXd zh5uX&Z{VL2u8p} zBQS&_5O>nZcAm?H_C;s!|( zQyIbEO=_ewHDw*@$RCD z@O_yRT-zXF#2i}T3gI+D-2KNwroyhd6X9l>gcpGVSRrtI1r#Bd55bmlqU*iP~| z&)<#wof-nwFFXXkJ{Iyq;PvQWPe_TI0-@8)zUQmXXyA zHwOzRZ!lnLoqKKH5PiEvijs@|Xg7PkKON_*7Um#{-UJ zxWfB19Ui0SmqtqCVc2{gJb?)?%m8O3BazFKa zKb>t3QxDV;D4OpMe!jMY-w!xJS+SGh+H%_nurOgN-Jz*;c@fEFxQbJW^FB=>H|qTh zjQ4wK3enc6C(u_n9)bdFz30fI_X?Sx7gQxZh_enu8p&cx8Q62$8ZecvER$S3Hvi#= zkgHm)wnTyR{x4_g-iGr&l4tSV$4(F*{RlsxkoZW6@b~e84UazvbyP@EqB|7K@_-8q zodu~h&iM5kanO{Po5l(-M?pAk-qMp3toMh60_Zs$+4=y4h5Y(L9S(4|;_3<8f?4iZ z$S|1W51oaoq3sndP+Qb+l5n*EAmLZsAOAvv4gKUgLs}F8#4qP0@Z!8FHiM1?97QoE z&0>jx_qq(gJ%4hB?!sj<8T)T=79k+Vjlap5Cy?NhRoNf$fb#}sNVngsrSwgZkP zf&zmeGc_BUDm07$+8Xh=a&6UaN?F20fHldDv*fHJ0XOv$So*@lHUo?%LS!M3zEA~k zmv84IfC8|sd8=MeIa{VuUDIzT-O#&SvM1o?c?opy84r1p9^vETLuZ>! z4h1xur}6@* zO*qySeeQH`ES&C(G3scGIHiw;&eICmtDON)JSnvqU@Q!(6AE zjq|DV;m#SmkhD+$hpwJjC@2mEzcF6O5Ob2|!ZvjiF8~*^k~h}xqnurs4c)+i0=E*9 zcRRv!%>ooAgjhuTp=gMV^0OIWG=We9`QCLoE!iW9cJ6d%RGeZH7KbizdiL>FU*-u0DTXnqmaWmIYvh~_?b6%W< zoS6s+w$qb7{3N=IB|9V*fY{j<1;HV{BT8P_S43DOl&z}Z_dY_rU9o)#TXlZL8Oqfi z2{YSiG_DSsTSH&h^(q{uQC`7xJ^~{R+&;X%Jl}@6Fnw@c$Xt?*>Eq1*pfM{k|3HX{ zaP|9G7k!b9f{i5{uwam|rC(&*y&G>Wa@PH(w;ERGKFq z8)Ks|L6t8}={TdfeXu(L4xCRgXsH0iJI7)f5wm_Th1}9`X!%G1TRLLk)r{#79_dHd z33G%T5k&aVsWBiZgo+kLlb+8{Z-fmsN1&;4CqureQe!aBJX>x*KlhJHhMP)d|HBq% ztO$?dO`#k1pN)fqJqe}*`gkKJqFomcdrrnN#~i3g*mf`mmgj|njLuRvq$#<;&3%Y)aIX|ytb33(+-?AO>QzCK9P zoPwl9xeylnJ9s9q3RJt!LFT@GSo-ciVL{6cW6`E=WTniCd_bTKURJjyZXUg8!JCxl%K!u%$c?E~i^D^Wxtkkh*YPGqjDWnC}!8N--QQSh3 zSQqw$>_3+Tn~vr{`GM6?+V%z%w&uV}%?CDQ9S}F+dD`}_TTj1URf}Wd*t6BTUq_xZ zOeeXVjHid*DNDTr*x|gBhcoEbeFJ@4CtPHZ-E$LxFzbUJ& z&&Uzarn!$^Us!u^Ao|(V#W)s`%f~B~md_^lWmwp1wH!s@mw>SRis165!_gP_oi@)# zOnvB+U~}ghW8KkW9_1fyHfHVZw?cN?fDzLKfnu-@QnwztI47sFg7zJbV<^??@npCK zdoQNZFk5d-DNhd%mzg=mvZDI7$TO{-aaWr=7ed|9Le~2w(9l@|rH6MjL>W*oGbyvT z7gp}p<1BP_LDl{G{&!hSxgY z+>zB&+Lm`o-Ld-nyxqHhTA}IsX?e?u?_X;?era*t`#mY^c6Q9oUSAp*|5P%47r!iE zAFd2>@&0Bs4Qqp4^iT|bvqvIQiZJ&nZVFkXG)b0_I8T=Fhk3rCaY=6OQxtfQeFmS! zcU;su9o<>N*bx_-xjtq)tF_AUO0^Q}go_UT|KULvc#PLvFuzrr0hih4A0zjj=l=zi WMAB$e-u+Sl0000EG{<>HPHr==FehyNC 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 O0000n7`5L6HW5ygF9P$L*e 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 literal 0 HcmV?d00001 diff --git a/common/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/common/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..f35f72e245854b8e512afe7e46f7f8f927475ea1 GIT binary patch literal 8241 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 Q9t8mCXgpT0Qgy)mKQ0PBj{pDw literal 0 HcmV?d00001 diff --git a/common/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/common/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..d17d7632208000a89fb7f23c45425d7855e8e35a GIT binary patch literal 15310 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 + preferencesRepository.setToggleButtonOnTopBar(checked) + } + lifecycleScope.launchWhenCreated { viewModel.observeState().collect { controlAdapter.bindControlStyleList(it.selected, it.controls) longPress.progress = it.longPress touchSensibility.progress = it.touchSensibility + + val toggleVisible = if (it.showToggleButtonSettings) View.VISIBLE else View.GONE + toggleButtonTopBar.visibility = toggleVisible + toggleButtonTopBarLabel.visibility = toggleVisible } } } diff --git a/control/src/main/java/dev/lucasnlm/antimine/control/viewmodel/ControlState.kt b/control/src/main/java/dev/lucasnlm/antimine/control/viewmodel/ControlState.kt index cb6cea87e..5863fcfb3 100644 --- a/control/src/main/java/dev/lucasnlm/antimine/control/viewmodel/ControlState.kt +++ b/control/src/main/java/dev/lucasnlm/antimine/control/viewmodel/ControlState.kt @@ -9,4 +9,5 @@ data class ControlState( val doubleClick: Int, val selected: ControlStyle, val controls: List, + val showToggleButtonSettings: Boolean, ) diff --git a/control/src/main/java/dev/lucasnlm/antimine/control/viewmodel/ControlViewModel.kt b/control/src/main/java/dev/lucasnlm/antimine/control/viewmodel/ControlViewModel.kt index a36272358..beedac21c 100644 --- a/control/src/main/java/dev/lucasnlm/antimine/control/viewmodel/ControlViewModel.kt +++ b/control/src/main/java/dev/lucasnlm/antimine/control/viewmodel/ControlViewModel.kt @@ -63,7 +63,8 @@ class ControlViewModel( longPress = preferencesRepository.customLongPressTimeout().toInt(), doubleClick = preferencesRepository.getDoubleClickTimeout().toInt(), selected = controlDetails?.controlStyle ?: ControlStyle.Standard, - controls = gameControlOptions + controls = gameControlOptions, + showToggleButtonSettings = preferencesRepository.controlStyle() == ControlStyle.SwitchMarkOpen, ) } @@ -108,7 +109,8 @@ class ControlViewModel( val selected = state.controls.first { it.controlStyle == event.controlStyle } val newState = state.copy( - selected = selected.controlStyle + selected = selected.controlStyle, + showToggleButtonSettings = selected.controlStyle == ControlStyle.SwitchMarkOpen, ) emit(newState) diff --git a/control/src/main/res/layout/activity_control.xml b/control/src/main/res/layout/activity_control.xml index ed8faca40..5e122b456 100644 --- a/control/src/main/res/layout/activity_control.xml +++ b/control/src/main/res/layout/activity_control.xml @@ -43,14 +43,25 @@ app:layout_constraintTop_toTopOf="parent" /> + + + app:layout_constraintTop_toBottomOf="@+id/settings" /> + + + diff --git a/core/src/main/java/dev/lucasnlm/antimine/core/IAppVersionManager.kt b/core/src/main/java/dev/lucasnlm/antimine/core/IAppVersionManager.kt new file mode 100644 index 000000000..c6d9a9fac --- /dev/null +++ b/core/src/main/java/dev/lucasnlm/antimine/core/IAppVersionManager.kt @@ -0,0 +1,5 @@ +package dev.lucasnlm.antimine.core + +interface IAppVersionManager { + fun isValid(): Boolean +} diff --git a/gdx/build.gradle b/gdx/build.gradle index 5b3c9d1af..61f0d25bc 100644 --- a/gdx/build.gradle +++ b/gdx/build.gradle @@ -47,7 +47,7 @@ dependencies { // AndroidX implementation 'androidx.appcompat:appcompat:1.3.0' implementation 'androidx.activity:activity-ktx:1.2.3' - implementation 'androidx.fragment:fragment-ktx:1.3.4' + implementation 'androidx.fragment:fragment-ktx:1.3.5' // Koin implementation 'org.koin:koin-android:2.2.1' diff --git a/gdx/src/main/java/dev/lucasnlm/antimine/gdx/GameApplicationListener.kt b/gdx/src/main/java/dev/lucasnlm/antimine/gdx/GameApplicationListener.kt index 6e4d00162..de4a66d80 100644 --- a/gdx/src/main/java/dev/lucasnlm/antimine/gdx/GameApplicationListener.kt +++ b/gdx/src/main/java/dev/lucasnlm/antimine/gdx/GameApplicationListener.kt @@ -12,6 +12,7 @@ import com.badlogic.gdx.graphics.g2d.TextureAtlas import com.badlogic.gdx.graphics.glutils.FrameBuffer import com.badlogic.gdx.graphics.glutils.ShaderProgram import com.badlogic.gdx.input.GestureDetector +import dev.lucasnlm.antimine.core.IAppVersionManager import dev.lucasnlm.antimine.core.isAndroidTv import dev.lucasnlm.antimine.core.isAndroidWearOs import dev.lucasnlm.antimine.core.isPortrait @@ -35,6 +36,7 @@ import dev.lucasnlm.antimine.ui.model.AppTheme class GameApplicationListener( private val context: Context, + private val appVersion: IAppVersionManager, private val preferencesRepository: IPreferencesRepository, private val dimensionRepository: IDimensionRepository, private val quality: RenderQuality, @@ -45,7 +47,6 @@ class GameApplicationListener( private val onEngineReady: () -> Unit, private val crashLogger: (String) -> Unit, ) : ApplicationAdapter() { - private val assetManager = AssetManager() private var minefieldStage: MinefieldStage? = null @@ -223,6 +224,10 @@ class GameApplicationListener( } mainFrameBuffer?.end() + if (!appVersion.isValid()) { + Thread.sleep(500L) + } + batch?.run { begin() diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 1b903c1c9..3c014a7fb 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,7 @@ +#Wed Jun 30 19:00:49 GMT-03:00 2021 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.1.1-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionSha256Sum=9d94e6e4a28ad328072ef6e56bce79a810494ae756751fdcedffdeaf27c093b1 +distributionUrl=https\://services.gradle.org/distributions/gradle-6.5-bin.zip +distributionSha256Sum=23e7d37e9bb4f8dabb8a3ea7fdee9dd0428b9b1a71d298aefd65b11dccea220f diff --git a/i18n/src/main/res/values/strings.xml b/i18n/src/main/res/values/strings.xml index ac0e4e329..9c70f95f6 100644 --- a/i18n/src/main/res/values/strings.xml +++ b/i18n/src/main/res/values/strings.xml @@ -120,4 +120,5 @@ Open Tutorial Allow tap on numbers Tap to customize + Show \"Toggle Button\" on top bar diff --git a/preferences/src/main/java/dev/lucasnlm/antimine/preferences/IPreferencesRepository.kt b/preferences/src/main/java/dev/lucasnlm/antimine/preferences/IPreferencesRepository.kt index bf25845d0..0d0acbefc 100644 --- a/preferences/src/main/java/dev/lucasnlm/antimine/preferences/IPreferencesRepository.kt +++ b/preferences/src/main/java/dev/lucasnlm/antimine/preferences/IPreferencesRepository.kt @@ -112,4 +112,7 @@ interface IPreferencesRepository { fun allowTapOnNumbers(): Boolean fun setAllowTapOnNumbers(allow: Boolean) + + fun setToggleButtonOnTopBar(enabled: Boolean) + fun showToggleButtonOnTopBar(): Boolean } diff --git a/preferences/src/main/java/dev/lucasnlm/antimine/preferences/PreferenceKeys.kt b/preferences/src/main/java/dev/lucasnlm/antimine/preferences/PreferenceKeys.kt index b98275c6d..d641da5ca 100644 --- a/preferences/src/main/java/dev/lucasnlm/antimine/preferences/PreferenceKeys.kt +++ b/preferences/src/main/java/dev/lucasnlm/antimine/preferences/PreferenceKeys.kt @@ -41,4 +41,5 @@ object PreferenceKeys { const val PREFERENCE_OLD_AREA_SIZES = "preference_migration_old_sizes" const val PREFERENCE_TUTORIAL_DIALOG = "preference_show_tutorial_dialog" const val PREFERENCE_ALLOW_TAP_NUMBER = "preference_allow_tap_number" + const val PREFERENCE_SHOW_TOGGLE_ON_TOP_BAR = "preference_show_toggle_on_top_bar" } diff --git a/preferences/src/main/java/dev/lucasnlm/antimine/preferences/PreferencesRepository.kt b/preferences/src/main/java/dev/lucasnlm/antimine/preferences/PreferencesRepository.kt index 3f0936feb..0943238ac 100644 --- a/preferences/src/main/java/dev/lucasnlm/antimine/preferences/PreferencesRepository.kt +++ b/preferences/src/main/java/dev/lucasnlm/antimine/preferences/PreferencesRepository.kt @@ -403,4 +403,12 @@ class PreferencesRepository( override fun setAllowTapOnNumbers(allow: Boolean) { preferencesManager.putBoolean(PreferenceKeys.PREFERENCE_ALLOW_TAP_NUMBER, allow) } + + override fun setToggleButtonOnTopBar(enabled: Boolean) { + preferencesManager.putBoolean(PreferenceKeys.PREFERENCE_SHOW_TOGGLE_ON_TOP_BAR, enabled) + } + + override fun showToggleButtonOnTopBar(): Boolean { + return preferencesManager.getBoolean(PreferenceKeys.PREFERENCE_SHOW_TOGGLE_ON_TOP_BAR, false) + } } diff --git a/preferences/src/main/java/dev/lucasnlm/antimine/preferences/models/GameControl.kt b/preferences/src/main/java/dev/lucasnlm/antimine/preferences/models/GameControl.kt index c1b15b09d..153b21977 100644 --- a/preferences/src/main/java/dev/lucasnlm/antimine/preferences/models/GameControl.kt +++ b/preferences/src/main/java/dev/lucasnlm/antimine/preferences/models/GameControl.kt @@ -105,7 +105,7 @@ sealed class GameControl( doubleClick = null, ), onOpen = Actions( - singleClick = ActionResponse.HighlightNeighbors, + singleClick = ActionResponse.OpenNeighbors, longPress = null, doubleClick = null, ) diff --git a/proprietary/build.gradle b/proprietary/build.gradle index 079cae2fa..38af2fc7e 100644 --- a/proprietary/build.gradle +++ b/proprietary/build.gradle @@ -43,7 +43,7 @@ dependencies { // Google implementation 'com.android.billingclient:billing-ktx:3.0.3' - implementation 'com.google.android.gms:play-services-instantapps:17.0.0' + implementation 'com.google.android.gms:play-services-instantapps:17.0.1' implementation 'com.google.android.gms:play-services-games:21.0.0' implementation 'com.google.android.gms:play-services-auth:19.0.0' implementation 'com.google.android.gms:play-services-ads:20.2.0' diff --git a/themes/build.gradle b/themes/build.gradle index 91529b538..c80de6c30 100644 --- a/themes/build.gradle +++ b/themes/build.gradle @@ -44,7 +44,7 @@ dependencies { // AndroidX implementation 'androidx.appcompat:appcompat:1.3.0' implementation 'androidx.activity:activity-ktx:1.2.3' - implementation 'androidx.fragment:fragment-ktx:1.3.4' + implementation 'androidx.fragment:fragment-ktx:1.3.5' // Google implementation 'com.google.android.material:material:1.3.0' diff --git a/tutorial/build.gradle b/tutorial/build.gradle index 91529b538..c80de6c30 100644 --- a/tutorial/build.gradle +++ b/tutorial/build.gradle @@ -44,7 +44,7 @@ dependencies { // AndroidX implementation 'androidx.appcompat:appcompat:1.3.0' implementation 'androidx.activity:activity-ktx:1.2.3' - implementation 'androidx.fragment:fragment-ktx:1.3.4' + implementation 'androidx.fragment:fragment-ktx:1.3.5' // Google implementation 'com.google.android.material:material:1.3.0' diff --git a/ui/build.gradle b/ui/build.gradle index b229c6de0..49977ec1f 100644 --- a/ui/build.gradle +++ b/ui/build.gradle @@ -44,7 +44,7 @@ dependencies { // AndroidX implementation 'androidx.appcompat:appcompat:1.3.0' implementation 'androidx.activity:activity-ktx:1.2.3' - implementation 'androidx.fragment:fragment-ktx:1.3.4' + implementation 'androidx.fragment:fragment-ktx:1.3.5' // RecyclerView implementation 'androidx.recyclerview:recyclerview:1.2.1' diff --git a/ui/src/main/java/dev/lucasnlm/antimine/ui/repository/Themes.kt b/ui/src/main/java/dev/lucasnlm/antimine/ui/repository/Themes.kt index 99085530a..2b75b166f 100644 --- a/ui/src/main/java/dev/lucasnlm/antimine/ui/repository/Themes.kt +++ b/ui/src/main/java/dev/lucasnlm/antimine/ui/repository/Themes.kt @@ -59,8 +59,8 @@ object Themes { palette = AreaPalette( accent = 0xFFFFFF, background = 0x000000, - covered = 0x212121, - coveredOdd = 0x212121, + covered = 0x616161, + coveredOdd = 616161, uncovered = 0x000000, uncoveredOdd = 0x050505, minesAround1 = 0xCCCCCC, From 5a399c4c1cc01a45b465f6aac60a60ffadc1cd03 Mon Sep 17 00:00:00 2001 From: Lucas Lima Date: Wed, 30 Jun 2021 20:00:47 -0300 Subject: [PATCH 4/5] Update strings --- app/src/main/AndroidManifest.xml | 6 +++--- fastlane/metadata/android/en-US/full_description.txt | 7 ------- i18n/src/main/res/values-af-rZA/strings.xml | 1 + i18n/src/main/res/values-ar-rSA/strings.xml | 1 + i18n/src/main/res/values-bg-rBG/strings.xml | 1 + i18n/src/main/res/values-ca-rES/strings.xml | 1 + i18n/src/main/res/values-cs-rCZ/strings.xml | 1 + i18n/src/main/res/values-da-rDK/strings.xml | 1 + i18n/src/main/res/values-de-rDE/strings.xml | 1 + i18n/src/main/res/values-el-rGR/strings.xml | 1 + i18n/src/main/res/values-en-rUS/strings.xml | 1 + i18n/src/main/res/values-eo-rUY/strings.xml | 1 + i18n/src/main/res/values-es-rES/strings.xml | 1 + i18n/src/main/res/values-fi-rFI/strings.xml | 1 + i18n/src/main/res/values-fr-rFR/strings.xml | 1 + i18n/src/main/res/values-hi-rIN/strings.xml | 1 + i18n/src/main/res/values-hu-rHU/strings.xml | 1 + i18n/src/main/res/values-in-rID/strings.xml | 1 + i18n/src/main/res/values-it-rIT/strings.xml | 3 ++- i18n/src/main/res/values-iw-rIL/strings.xml | 1 + i18n/src/main/res/values-ja-rJP/strings.xml | 1 + i18n/src/main/res/values-ko-rKR/strings.xml | 1 + i18n/src/main/res/values-ku-rTR/strings.xml | 1 + i18n/src/main/res/values-nl-rNL/strings.xml | 1 + i18n/src/main/res/values-no-rNO/strings.xml | 1 + i18n/src/main/res/values-pl-rPL/strings.xml | 1 + i18n/src/main/res/values-pt-rBR/strings.xml | 1 + i18n/src/main/res/values-pt-rPT/strings.xml | 3 ++- i18n/src/main/res/values-ro-rRO/strings.xml | 1 + i18n/src/main/res/values-ru-rRU/strings.xml | 1 + i18n/src/main/res/values-sv-rSE/strings.xml | 1 + i18n/src/main/res/values-th-rTH/strings.xml | 1 + i18n/src/main/res/values-tr-rTR/strings.xml | 1 + i18n/src/main/res/values-uk-rUA/strings.xml | 1 + i18n/src/main/res/values-vec-rIT/strings.xml | 1 + i18n/src/main/res/values-vi-rVN/strings.xml | 1 + i18n/src/main/res/values-zh-rCN/strings.xml | 1 + 37 files changed, 40 insertions(+), 12 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 26a14434d..8b063ca03 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -46,9 +46,9 @@ android:theme="@style/AppTheme" tools:targetApi="lollipop"> - + + + Open Tutorial Allow tap on numbers Tap to customize + Show \"Toggle Button\" on top bar diff --git a/i18n/src/main/res/values-ar-rSA/strings.xml b/i18n/src/main/res/values-ar-rSA/strings.xml index 5f8d4fa2f..e501b9907 100644 --- a/i18n/src/main/res/values-ar-rSA/strings.xml +++ b/i18n/src/main/res/values-ar-rSA/strings.xml @@ -119,4 +119,5 @@ فتح البرنامج التعليمي السماح بالنقر على الأرقام انقر للتخصيص + Show \"Toggle Button\" on top bar diff --git a/i18n/src/main/res/values-bg-rBG/strings.xml b/i18n/src/main/res/values-bg-rBG/strings.xml index 798d999bc..4a66a674b 100644 --- a/i18n/src/main/res/values-bg-rBG/strings.xml +++ b/i18n/src/main/res/values-bg-rBG/strings.xml @@ -119,4 +119,5 @@ Отвори урок Allow tap on numbers Tap to customize + Show \"Toggle Button\" on top bar diff --git a/i18n/src/main/res/values-ca-rES/strings.xml b/i18n/src/main/res/values-ca-rES/strings.xml index c2e89ef9c..8fb5d251a 100644 --- a/i18n/src/main/res/values-ca-rES/strings.xml +++ b/i18n/src/main/res/values-ca-rES/strings.xml @@ -119,4 +119,5 @@ Obriu el tutorial Allow tap on numbers Tap to customize + Show \"Toggle Button\" on top bar diff --git a/i18n/src/main/res/values-cs-rCZ/strings.xml b/i18n/src/main/res/values-cs-rCZ/strings.xml index bbf022420..abe321295 100644 --- a/i18n/src/main/res/values-cs-rCZ/strings.xml +++ b/i18n/src/main/res/values-cs-rCZ/strings.xml @@ -119,4 +119,5 @@ Otevřít průvodce Povolit klepnutí na čísla Klepnutím přizpůsobit + Show \"Toggle Button\" on top bar diff --git a/i18n/src/main/res/values-da-rDK/strings.xml b/i18n/src/main/res/values-da-rDK/strings.xml index b34df908b..ecd849c9d 100644 --- a/i18n/src/main/res/values-da-rDK/strings.xml +++ b/i18n/src/main/res/values-da-rDK/strings.xml @@ -119,4 +119,5 @@ Åben vejledning Tillad tryk på numre Tap to customize + Show \"Toggle Button\" on top bar diff --git a/i18n/src/main/res/values-de-rDE/strings.xml b/i18n/src/main/res/values-de-rDE/strings.xml index 4f0f08bfd..aa7ec06e3 100644 --- a/i18n/src/main/res/values-de-rDE/strings.xml +++ b/i18n/src/main/res/values-de-rDE/strings.xml @@ -119,4 +119,5 @@ Anleitung öffnen Antippen von Zahlenquadraten erlauben Zum Anpassen tippen + Show \"Toggle Button\" on top bar diff --git a/i18n/src/main/res/values-el-rGR/strings.xml b/i18n/src/main/res/values-el-rGR/strings.xml index eaf4ac89e..212ae8f44 100644 --- a/i18n/src/main/res/values-el-rGR/strings.xml +++ b/i18n/src/main/res/values-el-rGR/strings.xml @@ -119,4 +119,5 @@ Άνοιγμα Οδηγού Επίτρεψε το πάτημα σε αριθμούς Πατήστε για προσαρμογή + Show \"Toggle Button\" on top bar diff --git a/i18n/src/main/res/values-en-rUS/strings.xml b/i18n/src/main/res/values-en-rUS/strings.xml index a3dc4730f..a9f760fc3 100644 --- a/i18n/src/main/res/values-en-rUS/strings.xml +++ b/i18n/src/main/res/values-en-rUS/strings.xml @@ -119,4 +119,5 @@ Open Tutorial Allow tap on numbers Tap to customize + Show \"Toggle Button\" on top bar diff --git a/i18n/src/main/res/values-eo-rUY/strings.xml b/i18n/src/main/res/values-eo-rUY/strings.xml index 7936b8ec8..e2f9f6bff 100644 --- a/i18n/src/main/res/values-eo-rUY/strings.xml +++ b/i18n/src/main/res/values-eo-rUY/strings.xml @@ -119,4 +119,5 @@ Malfermi Lernilo Permesi tuŝeti numerojn Tap to customize + Show \"Toggle Button\" on top bar diff --git a/i18n/src/main/res/values-es-rES/strings.xml b/i18n/src/main/res/values-es-rES/strings.xml index 16a43ed2e..7649411ef 100644 --- a/i18n/src/main/res/values-es-rES/strings.xml +++ b/i18n/src/main/res/values-es-rES/strings.xml @@ -119,4 +119,5 @@ Abrir Tutorial Permitir tocar números Toca para personalizar + Mostrar botón \"Activar\" en la barra superior diff --git a/i18n/src/main/res/values-fi-rFI/strings.xml b/i18n/src/main/res/values-fi-rFI/strings.xml index e868ca220..f3c65a642 100644 --- a/i18n/src/main/res/values-fi-rFI/strings.xml +++ b/i18n/src/main/res/values-fi-rFI/strings.xml @@ -119,4 +119,5 @@ Avaa Johdanto Salli numeroiden napauttaminen Paina mukauttaaksesi + Näytä Vaihda-painike yläpalkissa diff --git a/i18n/src/main/res/values-fr-rFR/strings.xml b/i18n/src/main/res/values-fr-rFR/strings.xml index 6a21cd959..f111168a6 100644 --- a/i18n/src/main/res/values-fr-rFR/strings.xml +++ b/i18n/src/main/res/values-fr-rFR/strings.xml @@ -119,4 +119,5 @@ Ouvrir le tutoriel Permettre de cliquer sur les numéros Appuyer pour personnaliser + Show \"Toggle Button\" on top bar diff --git a/i18n/src/main/res/values-hi-rIN/strings.xml b/i18n/src/main/res/values-hi-rIN/strings.xml index 4c8009a34..89ef876bb 100644 --- a/i18n/src/main/res/values-hi-rIN/strings.xml +++ b/i18n/src/main/res/values-hi-rIN/strings.xml @@ -119,4 +119,5 @@ Open Tutorial Allow tap on numbers अनुकूलित करने के लिए टैप करें + Show \"Toggle Button\" on top bar diff --git a/i18n/src/main/res/values-hu-rHU/strings.xml b/i18n/src/main/res/values-hu-rHU/strings.xml index 5329f67a1..aa39968c3 100644 --- a/i18n/src/main/res/values-hu-rHU/strings.xml +++ b/i18n/src/main/res/values-hu-rHU/strings.xml @@ -119,4 +119,5 @@ Open Tutorial Allow tap on numbers Tap to customize + Show \"Toggle Button\" on top bar diff --git a/i18n/src/main/res/values-in-rID/strings.xml b/i18n/src/main/res/values-in-rID/strings.xml index a7ce1397b..553e31733 100644 --- a/i18n/src/main/res/values-in-rID/strings.xml +++ b/i18n/src/main/res/values-in-rID/strings.xml @@ -119,4 +119,5 @@ Buka Tutorial Allow tap on numbers Tap to customize + Show \"Toggle Button\" on top bar diff --git a/i18n/src/main/res/values-it-rIT/strings.xml b/i18n/src/main/res/values-it-rIT/strings.xml index 3587389a2..caff10e1c 100644 --- a/i18n/src/main/res/values-it-rIT/strings.xml +++ b/i18n/src/main/res/values-it-rIT/strings.xml @@ -111,7 +111,7 @@ Visualizza finestre Seleziona Lingua Pulsante: Bandiera e Aperto - Usa il bottone per passare da Bandiera ad Apri + Usa il tasto per passare da Bandiera ad Apri L\'obbiettivo del gioco è ripulire un campo rettangolare che contiene mine nascoste senza detonarne nessuna. Antimine Conosci già le regole di Campo Minato? @@ -119,4 +119,5 @@ Apri Tutorial Consenti tocco sui numeri Tocca per modificare + Mostra \"Attiva Tasto\" nella barra in alto diff --git a/i18n/src/main/res/values-iw-rIL/strings.xml b/i18n/src/main/res/values-iw-rIL/strings.xml index dd5320da5..609aa4ba9 100644 --- a/i18n/src/main/res/values-iw-rIL/strings.xml +++ b/i18n/src/main/res/values-iw-rIL/strings.xml @@ -119,4 +119,5 @@ Open Tutorial Allow tap on numbers Tap to customize + Show \"Toggle Button\" on top bar diff --git a/i18n/src/main/res/values-ja-rJP/strings.xml b/i18n/src/main/res/values-ja-rJP/strings.xml index 8cb9726b4..0c7940fbe 100644 --- a/i18n/src/main/res/values-ja-rJP/strings.xml +++ b/i18n/src/main/res/values-ja-rJP/strings.xml @@ -119,4 +119,5 @@ チュートリアルを開く Allow tap on numbers タップしてカスタマイズ + Show \"Toggle Button\" on top bar diff --git a/i18n/src/main/res/values-ko-rKR/strings.xml b/i18n/src/main/res/values-ko-rKR/strings.xml index af1ac465e..bf6e0a90f 100644 --- a/i18n/src/main/res/values-ko-rKR/strings.xml +++ b/i18n/src/main/res/values-ko-rKR/strings.xml @@ -119,4 +119,5 @@ 튜토리얼 열기 숫자 누르기 허용 눌러서 사용자 지정 + 상단 바에 \"맞바꾸기 버튼\" 표시 diff --git a/i18n/src/main/res/values-ku-rTR/strings.xml b/i18n/src/main/res/values-ku-rTR/strings.xml index 88ec3ac75..134150041 100644 --- a/i18n/src/main/res/values-ku-rTR/strings.xml +++ b/i18n/src/main/res/values-ku-rTR/strings.xml @@ -119,4 +119,5 @@ کردنەوەی فێرکاری ڕێگەبدە بە کرتەکردن لەسەر ژمارەکان Tap to customize + Show \"Toggle Button\" on top bar diff --git a/i18n/src/main/res/values-nl-rNL/strings.xml b/i18n/src/main/res/values-nl-rNL/strings.xml index c16331aeb..604e9a843 100644 --- a/i18n/src/main/res/values-nl-rNL/strings.xml +++ b/i18n/src/main/res/values-nl-rNL/strings.xml @@ -119,4 +119,5 @@ Open Tutorial Allow tap on numbers Tap to customize + Show \"Toggle Button\" on top bar diff --git a/i18n/src/main/res/values-no-rNO/strings.xml b/i18n/src/main/res/values-no-rNO/strings.xml index b2795c80d..4ef807e4e 100644 --- a/i18n/src/main/res/values-no-rNO/strings.xml +++ b/i18n/src/main/res/values-no-rNO/strings.xml @@ -119,4 +119,5 @@ Åpne opplæring Tillat trykk på tall Trykk for å tilpasse + Show \"Toggle Button\" on top bar diff --git a/i18n/src/main/res/values-pl-rPL/strings.xml b/i18n/src/main/res/values-pl-rPL/strings.xml index 7b9ca1ca1..4ea28b32a 100644 --- a/i18n/src/main/res/values-pl-rPL/strings.xml +++ b/i18n/src/main/res/values-pl-rPL/strings.xml @@ -119,4 +119,5 @@ Otwórz samouczek Możliwość naciskania liczb Naciśnij, aby zmienić + Wyświetl \"Przełącz sterowanie\" na górnej pasku diff --git a/i18n/src/main/res/values-pt-rBR/strings.xml b/i18n/src/main/res/values-pt-rBR/strings.xml index cb5bc8e86..4d0b5f29a 100644 --- a/i18n/src/main/res/values-pt-rBR/strings.xml +++ b/i18n/src/main/res/values-pt-rBR/strings.xml @@ -119,4 +119,5 @@ Abrir Tutorial Permitir toque nos números Toque para personalizar + Mostrar \"Botão de Alternar\" na barra superior diff --git a/i18n/src/main/res/values-pt-rPT/strings.xml b/i18n/src/main/res/values-pt-rPT/strings.xml index 2d3fce9d1..1621f5390 100644 --- a/i18n/src/main/res/values-pt-rPT/strings.xml +++ b/i18n/src/main/res/values-pt-rPT/strings.xml @@ -89,7 +89,7 @@ Código-fonte Tradução Licenças - Jogos Google Play + Google Play Jogos A carregar… Conectar A conectar… @@ -119,4 +119,5 @@ Abrir tutorial Permitir toque nos números Tocar para personalizar + Mostrar \"Botão Alternar\" na barra superior diff --git a/i18n/src/main/res/values-ro-rRO/strings.xml b/i18n/src/main/res/values-ro-rRO/strings.xml index 455b755a4..54c2009fc 100644 --- a/i18n/src/main/res/values-ro-rRO/strings.xml +++ b/i18n/src/main/res/values-ro-rRO/strings.xml @@ -119,4 +119,5 @@ Open Tutorial Allow tap on numbers Tap to customize + Show \"Toggle Button\" on top bar diff --git a/i18n/src/main/res/values-ru-rRU/strings.xml b/i18n/src/main/res/values-ru-rRU/strings.xml index a0471159d..68981dae1 100644 --- a/i18n/src/main/res/values-ru-rRU/strings.xml +++ b/i18n/src/main/res/values-ru-rRU/strings.xml @@ -119,4 +119,5 @@ Открыть обучение Разрешить нажатие на цифры Нажмите, чтобы настроить + Отображать \"Переключить кнопку\" на верхней панели diff --git a/i18n/src/main/res/values-sv-rSE/strings.xml b/i18n/src/main/res/values-sv-rSE/strings.xml index 6958b8a33..9039710f9 100644 --- a/i18n/src/main/res/values-sv-rSE/strings.xml +++ b/i18n/src/main/res/values-sv-rSE/strings.xml @@ -119,4 +119,5 @@ Öppna Guide Tillåt tryck på siffror Tap to customize + Show \"Toggle Button\" on top bar diff --git a/i18n/src/main/res/values-th-rTH/strings.xml b/i18n/src/main/res/values-th-rTH/strings.xml index 3b51ee75f..4e0051293 100644 --- a/i18n/src/main/res/values-th-rTH/strings.xml +++ b/i18n/src/main/res/values-th-rTH/strings.xml @@ -119,4 +119,5 @@ Open Tutorial Allow tap on numbers Tap to customize + Show \"Toggle Button\" on top bar diff --git a/i18n/src/main/res/values-tr-rTR/strings.xml b/i18n/src/main/res/values-tr-rTR/strings.xml index 415450990..d6045acec 100644 --- a/i18n/src/main/res/values-tr-rTR/strings.xml +++ b/i18n/src/main/res/values-tr-rTR/strings.xml @@ -119,4 +119,5 @@ Öğreticiyi aç Sayılara dokunmaya izin ver Tap to customize + Show \"Toggle Button\" on top bar diff --git a/i18n/src/main/res/values-uk-rUA/strings.xml b/i18n/src/main/res/values-uk-rUA/strings.xml index 7916c0407..1a818f2fb 100644 --- a/i18n/src/main/res/values-uk-rUA/strings.xml +++ b/i18n/src/main/res/values-uk-rUA/strings.xml @@ -119,4 +119,5 @@ Відкрити навчання Дозволити натискання на цифри Натисніть, щоб налаштувати + Show \"Toggle Button\" on top bar diff --git a/i18n/src/main/res/values-vec-rIT/strings.xml b/i18n/src/main/res/values-vec-rIT/strings.xml index e014b0373..44bd6c80d 100644 --- a/i18n/src/main/res/values-vec-rIT/strings.xml +++ b/i18n/src/main/res/values-vec-rIT/strings.xml @@ -119,4 +119,5 @@ Verzi el Tutorial Parmeti de strucar so i nùmari Tap to customize + Show \"Toggle Button\" on top bar diff --git a/i18n/src/main/res/values-vi-rVN/strings.xml b/i18n/src/main/res/values-vi-rVN/strings.xml index d6a9b95bc..8554de073 100644 --- a/i18n/src/main/res/values-vi-rVN/strings.xml +++ b/i18n/src/main/res/values-vi-rVN/strings.xml @@ -119,4 +119,5 @@ Mở Hướng dẫn Cho phép nhấn vào các con số Nhấn để tuỳ chỉnh + Hiện \"Nút chuyển\" trên thanh ở trên cùng diff --git a/i18n/src/main/res/values-zh-rCN/strings.xml b/i18n/src/main/res/values-zh-rCN/strings.xml index f3486c771..f5cc955ea 100644 --- a/i18n/src/main/res/values-zh-rCN/strings.xml +++ b/i18n/src/main/res/values-zh-rCN/strings.xml @@ -119,4 +119,5 @@ 打开教程 允许点击数字 点击可自定义 + Show \"Toggle Button\" on top bar From 559c8b760e0fd10297ee9b47f71b81553584c178 Mon Sep 17 00:00:00 2001 From: Lucas Lima Date: Wed, 30 Jun 2021 20:20:16 -0300 Subject: [PATCH 5/5] Fix build --- app/build.gradle | 2 +- app/src/main/java/dev/lucasnlm/antimine/di/AppModule.kt | 3 ++- .../dev/lucasnlm/antimine/support/AppVersionManagerImpl.kt | 4 +++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 3e20c364b..652a86bcd 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -170,7 +170,7 @@ dependencies { testImplementation 'androidx.test.espresso:espresso-core:3.3.0' testImplementation 'androidx.test.espresso:espresso-contrib:3.3.0' testImplementation 'androidx.fragment:fragment-testing:1.3.5' - testImplementation 'org.robolectric:robolectric:4.4.0' + testImplementation 'org.robolectric:robolectric:4.4' testImplementation 'androidx.test.ext:junit:1.1.2' testImplementation 'io.mockk:mockk:1.11.0' diff --git a/app/src/main/java/dev/lucasnlm/antimine/di/AppModule.kt b/app/src/main/java/dev/lucasnlm/antimine/di/AppModule.kt index 3c49ff514..3bdf9fd45 100644 --- a/app/src/main/java/dev/lucasnlm/antimine/di/AppModule.kt +++ b/app/src/main/java/dev/lucasnlm/antimine/di/AppModule.kt @@ -10,6 +10,7 @@ import dev.lucasnlm.antimine.support.AppVersionManagerImpl import dev.lucasnlm.antimine.support.IapHandler import dev.lucasnlm.external.ExternalAnalyticsWrapper import dev.lucasnlm.external.IAnalyticsManager +import org.koin.android.ext.koin.androidApplication import org.koin.dsl.bind import org.koin.dsl.module @@ -18,7 +19,7 @@ val AppModule = module { single { CloudSaveManagerImpl(get(), get(), get(), get()) } bind CloudSaveManager::class - single { AppVersionManagerImpl(BuildConfig.DEBUG, BuildConfig.VERSION_NAME) } bind IAppVersionManager::class + single { AppVersionManagerImpl(BuildConfig.DEBUG, androidApplication()) } bind IAppVersionManager::class single { if (BuildConfig.DEBUG) { diff --git a/app/src/main/java/dev/lucasnlm/antimine/support/AppVersionManagerImpl.kt b/app/src/main/java/dev/lucasnlm/antimine/support/AppVersionManagerImpl.kt index d017b77ca..2e24e825c 100644 --- a/app/src/main/java/dev/lucasnlm/antimine/support/AppVersionManagerImpl.kt +++ b/app/src/main/java/dev/lucasnlm/antimine/support/AppVersionManagerImpl.kt @@ -1,12 +1,14 @@ package dev.lucasnlm.antimine.support +import android.app.Application import dev.lucasnlm.antimine.core.IAppVersionManager class AppVersionManagerImpl( private val debug: Boolean, - private val id: String, + private val application: Application, ) : IAppVersionManager { private val valid by lazy { + val id = application.packageName debug || id == "com.logical.minato" || id == "dev.lucasnlm.antimine" || id == "dev.lucanlm.antimine" }