Merge pull request #223 from lucasnlm/add-recycler-padding

Add recycler padding
This commit is contained in:
Lucas Nunes 2020-12-28 11:04:49 -03:00 committed by GitHub
commit 6a9da20c20
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
18 changed files with 274 additions and 106 deletions

View file

@ -15,8 +15,8 @@ android {
defaultConfig { defaultConfig {
// versionCode and versionName must be hardcoded to support F-droid // versionCode and versionName must be hardcoded to support F-droid
versionCode 805021 versionCode 805041
versionName '8.5.2' versionName '8.5.4'
minSdkVersion 21 minSdkVersion 21
targetSdkVersion 30 targetSdkVersion 30
multiDexEnabled true multiDexEnabled true

View file

@ -47,41 +47,11 @@
<tools:validation testUrl="https://www.lucasnlm.dev/" /> <tools:validation testUrl="https://www.lucasnlm.dev/" />
<tools:validation testUrl="http://www.lucasnlm.dev/" /> <tools:validation testUrl="http://www.lucasnlm.dev/" />
<meta-data <intent-filter>
android:name="default-url"
android:value="https://www.lucasnlm.dev/antimine" />
<intent-filter
android:order="0">
<action android:name="android.intent.action.MAIN" /> <action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" /> <category android:name="android.intent.category.LAUNCHER" />
</intent-filter> </intent-filter>
<intent-filter
android:order="1"
android:autoVerify="true"
tools:targetApi="m">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="http" />
<data android:scheme="https" />
<data
android:host="www.lucasnlm.dev" />
<data
android:host="www.lucasnlm.dev"
android:path="/" />
<data
android:host="www.lucasnlm.dev"
android:path="/antimine" />
</intent-filter>
<meta-data <meta-data
android:name="android.app.shortcuts" android:name="android.app.shortcuts"
android:resource="@xml/shortcuts" /> android:resource="@xml/shortcuts" />

View file

@ -659,7 +659,7 @@ class GameActivity : ThematicActivity(R.layout.activity_game), DialogInterface.O
score?.rightMines ?: 0, score?.rightMines ?: 0,
score?.totalMines ?: 0, score?.totalMines ?: 0,
currentGameStatus.time, currentGameStatus.time,
if (gameResult == GameResult.Victory) 1 else 0 if (gameResult == GameResult.Victory) 2 else 1
).apply { ).apply {
showAllowingStateLoss(supportFragmentManager, EndGameDialogFragment.TAG) showAllowingStateLoss(supportFragmentManager, EndGameDialogFragment.TAG)
} }
@ -930,15 +930,19 @@ class GameActivity : ThematicActivity(R.layout.activity_game), DialogInterface.O
} }
private fun refreshAds() { private fun refreshAds() {
val isTutorialComplete = preferencesRepository.isTutorialCompleted() if (featureFlagManager.isInAppAdsEnabled()) {
if (isTutorialComplete && !preferencesRepository.isPremiumEnabled() && billingManager.isEnabled()) { val isTutorialComplete = preferencesRepository.isTutorialCompleted()
if (!instantAppManager.isEnabled(this)) { if (isTutorialComplete && !preferencesRepository.isPremiumEnabled() && billingManager.isEnabled()) {
navigationView.menu.setGroupVisible(R.id.remove_ads_group, true) if (!instantAppManager.isEnabled(this)) {
ad_placeholder.visibility = View.VISIBLE navigationView.menu.setGroupVisible(R.id.remove_ads_group, true)
ad_placeholder.loadAd() ad_placeholder.visibility = View.VISIBLE
ad_placeholder.loadAd()
}
} else {
navigationView.menu.setGroupVisible(R.id.remove_ads_group, false)
ad_placeholder.visibility = View.GONE
} }
} else { } else {
navigationView.menu.setGroupVisible(R.id.remove_ads_group, false)
ad_placeholder.visibility = View.GONE ad_placeholder.visibility = View.GONE
} }
} }

View file

@ -3,13 +3,16 @@ package dev.lucasnlm.antimine.gameover
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.app.Dialog import android.app.Dialog
import android.content.DialogInterface import android.content.DialogInterface
import android.content.Intent
import android.os.Bundle import android.os.Bundle
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.widget.ImageView import android.widget.ImageView
import android.widget.TextView import android.widget.TextView
import android.widget.Toast
import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AlertDialog
import androidx.appcompat.app.AppCompatDialogFragment import androidx.appcompat.app.AppCompatDialogFragment
import androidx.appcompat.widget.AppCompatButton
import androidx.fragment.app.FragmentManager import androidx.fragment.app.FragmentManager
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import androidx.lifecycle.viewModelScope import androidx.lifecycle.viewModelScope
@ -19,24 +22,37 @@ import dev.lucasnlm.antimine.core.preferences.IPreferencesRepository
import dev.lucasnlm.antimine.gameover.model.GameResult import dev.lucasnlm.antimine.gameover.model.GameResult
import dev.lucasnlm.antimine.gameover.viewmodel.EndGameDialogEvent import dev.lucasnlm.antimine.gameover.viewmodel.EndGameDialogEvent
import dev.lucasnlm.antimine.gameover.viewmodel.EndGameDialogViewModel import dev.lucasnlm.antimine.gameover.viewmodel.EndGameDialogViewModel
import dev.lucasnlm.antimine.preferences.PreferencesActivity
import dev.lucasnlm.external.Ads
import dev.lucasnlm.external.IAdsManager
import dev.lucasnlm.external.IBillingManager
import dev.lucasnlm.external.IInstantAppManager import dev.lucasnlm.external.IInstantAppManager
import dev.lucasnlm.external.view.AdPlaceHolderView
import kotlinx.android.synthetic.main.view_play_games_button.view.*
import kotlinx.android.synthetic.main.view_stats.* import kotlinx.android.synthetic.main.view_stats.*
import kotlinx.coroutines.flow.collect import kotlinx.coroutines.flow.collect
import kotlinx.coroutines.flow.singleOrNull
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import org.koin.android.ext.android.inject import org.koin.android.ext.android.inject
import org.koin.androidx.viewmodel.ext.android.sharedViewModel import org.koin.androidx.viewmodel.ext.android.sharedViewModel
import org.koin.androidx.viewmodel.ext.android.viewModel import org.koin.androidx.viewmodel.ext.android.viewModel
class EndGameDialogFragment : AppCompatDialogFragment() { class EndGameDialogFragment : AppCompatDialogFragment() {
private val adsManager: IAdsManager by inject()
private val instantAppManager: IInstantAppManager by inject() private val instantAppManager: IInstantAppManager by inject()
private val endGameViewModel by viewModel<EndGameDialogViewModel>() private val endGameViewModel by viewModel<EndGameDialogViewModel>()
private val gameViewModel by sharedViewModel<GameViewModel>() private val gameViewModel by sharedViewModel<GameViewModel>()
private val preferencesRepository: IPreferencesRepository by inject() private val preferencesRepository: IPreferencesRepository by inject()
private val billingManager: IBillingManager by inject()
private var revealMinesOnDismiss = true private var revealMinesOnDismiss = true
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
if (!preferencesRepository.isPremiumEnabled()) {
billingManager.start()
}
arguments?.run { arguments?.run {
endGameViewModel.sendEvent( endGameViewModel.sendEvent(
EndGameDialogEvent.BuildCustomEndGame( EndGameDialogEvent.BuildCustomEndGame(
@ -61,8 +77,12 @@ class EndGameDialogFragment : AppCompatDialogFragment() {
override fun onDismiss(dialog: DialogInterface) { override fun onDismiss(dialog: DialogInterface) {
if (revealMinesOnDismiss) { if (revealMinesOnDismiss) {
gameViewModel.viewModelScope.launch { activity?.let {
gameViewModel.revealMines() if (!it.isFinishing) {
gameViewModel.viewModelScope.launch {
gameViewModel.revealMines()
}
}
} }
} }
super.onDismiss(dialog) super.onDismiss(dialog)
@ -88,7 +108,85 @@ class EndGameDialogFragment : AppCompatDialogFragment() {
} }
} }
findViewById<TextView>(R.id.received_message).apply { val adsView: AdPlaceHolderView = findViewById(R.id.ads)
val shareButton: AppCompatButton = findViewById(R.id.share)
val newGameButton: AppCompatButton = findViewById(R.id.new_game)
val continueButton: AppCompatButton = findViewById(R.id.continue_game)
val removeAdsButton: AppCompatButton = findViewById(R.id.remove_ads)
val settingsButton: View = findViewById(R.id.settings)
val closeButton: View = findViewById(R.id.close)
val receivedMessage: TextView = findViewById(R.id.received_message)
shareButton.setOnClickListener {
revealMinesOnDismiss = false
gameViewModel.shareObserver.postValue(Unit)
}
newGameButton.setOnClickListener {
revealMinesOnDismiss = false
gameViewModel.startNewGame()
dismissAllowingStateLoss()
}
continueButton.setOnClickListener {
revealMinesOnDismiss = false
if (preferencesRepository.isPremiumEnabled()) {
gameViewModel.continueObserver.postValue(Unit)
dismissAllowingStateLoss()
} else {
showAdsAndContinue()
}
}
settingsButton.setOnClickListener {
showSettings()
}
closeButton.setOnClickListener {
dismissAllowingStateLoss()
}
if (state.gameResult == GameResult.Victory) {
if (!instantAppManager.isEnabled(context)) {
shareButton.visibility = View.GONE
}
shareButton.visibility = View.VISIBLE
continueButton.visibility = View.GONE
} else {
shareButton.visibility = View.GONE
if (state.showContinueButton) {
continueButton.visibility = View.VISIBLE
if (!preferencesRepository.isPremiumEnabled()) {
continueButton.compoundDrawablePadding = 0
continueButton.setCompoundDrawablesWithIntrinsicBounds(
R.drawable.watch_ads_icon, 0, 0, 0
)
}
} else {
continueButton.visibility = View.GONE
}
}
if (!preferencesRepository.isPremiumEnabled() && !instantAppManager.isEnabled(context)) {
activity?.let { activity ->
adsView.visibility = View.VISIBLE
removeAdsButton.visibility = View.VISIBLE
val label = context.getString(R.string.remove_ad)
val price = billingManager.getPrice().singleOrNull()
val unlockLabel = price?.let { "$label - $it" } ?: label
removeAdsButton.text = unlockLabel
removeAdsButton.setOnClickListener {
lifecycleScope.launch {
billingManager.charge(activity)
adsView.visibility = View.GONE
}
}
}
}
receivedMessage.apply {
if (state.received > 0 && if (state.received > 0 &&
state.gameResult == GameResult.Victory && state.gameResult == GameResult.Victory &&
preferencesRepository.useHelp() preferencesRepository.useHelp()
@ -99,47 +197,39 @@ class EndGameDialogFragment : AppCompatDialogFragment() {
visibility = View.GONE visibility = View.GONE
} }
} }
findViewById<View>(R.id.close).setOnClickListener {
dismissAllowingStateLoss()
}
if (state.gameResult == GameResult.Victory) {
revealMinesOnDismiss = false
if (!instantAppManager.isEnabled(context)) {
setNeutralButton(R.string.share) { _, _ ->
gameViewModel.shareObserver.postValue(Unit)
}
}
} else {
if (state.showContinueButton) {
setNegativeButton(R.string.retry) { _, _ ->
revealMinesOnDismiss = false
gameViewModel.retryObserver.postValue(Unit)
}
setNeutralButton(R.string.continue_game) { _, _ ->
revealMinesOnDismiss = false
gameViewModel.continueObserver.postValue(Unit)
}
} else {
setNeutralButton(R.string.retry) { _, _ ->
revealMinesOnDismiss = false
gameViewModel.retryObserver.postValue(Unit)
}
}
}
} }
} }
} }
setView(view) setView(view)
setPositiveButton(R.string.new_game) { _, _ ->
gameViewModel.startNewGame()
}
}.create() }.create()
private fun showSettings() {
startActivity(Intent(requireContext(), PreferencesActivity::class.java))
}
private fun showAdsAndContinue() {
activity?.let {
if (!it.isFinishing) {
adsManager.requestRewarded(
it,
Ads.RewardsAds,
onRewarded = {
gameViewModel.continueObserver.postValue(Unit)
dismissAllowingStateLoss()
},
onFail = {
Toast.makeText(
it.applicationContext,
R.string.unknown_error,
Toast.LENGTH_SHORT
).show()
}
)
}
}
}
companion object { companion object {
fun newInstance( fun newInstance(
gameResult: GameResult, gameResult: GameResult,

View file

@ -2,7 +2,8 @@
android:width="24dp" android:width="24dp"
android:height="24dp" android:height="24dp"
android:viewportWidth="24" android:viewportWidth="24"
android:viewportHeight="24"> android:viewportHeight="24"
android:tint="?attr/colorControlNormal">
<path <path
android:fillColor="#FF000000" android:fillColor="#FF000000"
android:pathData="M12,5V2.21c0,-0.45 -0.54,-0.67 -0.85,-0.35l-3.8,3.79c-0.2,0.2 -0.2,0.51 0,0.71l3.79,3.79c0.32,0.31 0.86,0.09 0.86,-0.36V7c3.73,0 6.68,3.42 5.86,7.29 -0.47,2.27 -2.31,4.1 -4.57,4.57 -3.57,0.75 -6.75,-1.7 -7.23,-5.01 -0.07,-0.48 -0.49,-0.85 -0.98,-0.85 -0.6,0 -1.08,0.53 -1,1.13 0.62,4.39 4.8,7.64 9.53,6.72 3.12,-0.61 5.63,-3.12 6.24,-6.24C20.84,9.48 16.94,5 12,5z"/> android:pathData="M12,5V2.21c0,-0.45 -0.54,-0.67 -0.85,-0.35l-3.8,3.79c-0.2,0.2 -0.2,0.51 0,0.71l3.79,3.79c0.32,0.31 0.86,0.09 0.86,-0.36V7c3.73,0 6.68,3.42 5.86,7.29 -0.47,2.27 -2.31,4.1 -4.57,4.57 -3.57,0.75 -6.75,-1.7 -7.23,-5.01 -0.07,-0.48 -0.49,-0.85 -0.98,-0.85 -0.6,0 -1.08,0.53 -1,1.13 0.62,4.39 4.8,7.64 9.53,6.72 3.12,-0.61 5.63,-3.12 6.24,-6.24C20.84,9.48 16.94,5 12,5z"/>

View file

@ -1,5 +1,10 @@
<vector android:height="24dp" android:tint="#FFFFFF" <vector xmlns:android="http://schemas.android.com/apk/res/android"
android:viewportHeight="24" android:viewportWidth="24" android:width="24dp"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android"> android:height="24dp"
<path android:fillColor="@android:color/white" android:pathData="M12.65,15.67c0.14,-0.36 0.05,-0.77 -0.23,-1.05l-2.09,-2.06 0.03,-0.03c1.74,-1.94 2.98,-4.17 3.71,-6.53h1.94c0.54,0 0.99,-0.45 0.99,-0.99v-0.02c0,-0.54 -0.45,-0.99 -0.99,-0.99L10,4L10,3c0,-0.55 -0.45,-1 -1,-1s-1,0.45 -1,1v1L1.99,4c-0.54,0 -0.99,0.45 -0.99,0.99 0,0.55 0.45,0.99 0.99,0.99h10.18C11.5,7.92 10.44,9.75 9,11.35c-0.81,-0.89 -1.49,-1.86 -2.06,-2.88 -0.16,-0.29 -0.45,-0.47 -0.78,-0.47 -0.69,0 -1.13,0.75 -0.79,1.35 0.63,1.13 1.4,2.21 2.3,3.21L3.3,16.87c-0.4,0.39 -0.4,1.03 0,1.42 0.39,0.39 1.02,0.39 1.42,0L9,14l2.02,2.02c0.51,0.51 1.38,0.32 1.63,-0.35zM17.5,10c-0.6,0 -1.14,0.37 -1.35,0.94l-3.67,9.8c-0.24,0.61 0.22,1.26 0.87,1.26 0.39,0 0.74,-0.24 0.88,-0.61l0.89,-2.39h4.75l0.9,2.39c0.14,0.36 0.49,0.61 0.88,0.61 0.65,0 1.11,-0.65 0.88,-1.26l-3.67,-9.8c-0.22,-0.57 -0.76,-0.94 -1.36,-0.94zM15.88,17l1.62,-4.33L19.12,17h-3.24z"/> android:tint="?attr/colorControlNormal"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="@android:color/white"
android:pathData="M12.65,15.67c0.14,-0.36 0.05,-0.77 -0.23,-1.05l-2.09,-2.06 0.03,-0.03c1.74,-1.94 2.98,-4.17 3.71,-6.53h1.94c0.54,0 0.99,-0.45 0.99,-0.99v-0.02c0,-0.54 -0.45,-0.99 -0.99,-0.99L10,4L10,3c0,-0.55 -0.45,-1 -1,-1s-1,0.45 -1,1v1L1.99,4c-0.54,0 -0.99,0.45 -0.99,0.99 0,0.55 0.45,0.99 0.99,0.99h10.18C11.5,7.92 10.44,9.75 9,11.35c-0.81,-0.89 -1.49,-1.86 -2.06,-2.88 -0.16,-0.29 -0.45,-0.47 -0.78,-0.47 -0.69,0 -1.13,0.75 -0.79,1.35 0.63,1.13 1.4,2.21 2.3,3.21L3.3,16.87c-0.4,0.39 -0.4,1.03 0,1.42 0.39,0.39 1.02,0.39 1.42,0L9,14l2.02,2.02c0.51,0.51 1.38,0.32 1.63,-0.35zM17.5,10c-0.6,0 -1.14,0.37 -1.35,0.94l-3.67,9.8c-0.24,0.61 0.22,1.26 0.87,1.26 0.39,0 0.74,-0.24 0.88,-0.61l0.89,-2.39h4.75l0.9,2.39c0.14,0.36 0.49,0.61 0.88,0.61 0.65,0 1.11,-0.65 0.88,-1.26l-3.67,-9.8c-0.22,-0.57 -0.76,-0.94 -1.36,-0.94zM15.88,17l1.62,-4.33L19.12,17h-3.24z" />
</vector> </vector>

View file

@ -1,5 +1,10 @@
<vector android:height="24dp" android:tint="#FFFFFF" <vector xmlns:android="http://schemas.android.com/apk/res/android"
android:viewportHeight="24" android:viewportWidth="24" android:width="24dp"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android"> android:height="24dp"
<path android:fillColor="@android:color/white" android:pathData="M5,13.18v2.81c0,0.73 0.4,1.41 1.04,1.76l5,2.73c0.6,0.33 1.32,0.33 1.92,0l5,-2.73c0.64,-0.35 1.04,-1.03 1.04,-1.76v-2.81l-6.04,3.3c-0.6,0.33 -1.32,0.33 -1.92,0L5,13.18zM11.04,3.52l-8.43,4.6c-0.69,0.38 -0.69,1.38 0,1.76l8.43,4.6c0.6,0.33 1.32,0.33 1.92,0L21,10.09L21,16c0,0.55 0.45,1 1,1s1,-0.45 1,-1L23,9.59c0,-0.37 -0.2,-0.7 -0.52,-0.88l-9.52,-5.19c-0.6,-0.32 -1.32,-0.32 -1.92,0z"/> android:tint="?attr/colorControlNormal"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="@android:color/white"
android:pathData="M5,13.18v2.81c0,0.73 0.4,1.41 1.04,1.76l5,2.73c0.6,0.33 1.32,0.33 1.92,0l5,-2.73c0.64,-0.35 1.04,-1.03 1.04,-1.76v-2.81l-6.04,3.3c-0.6,0.33 -1.32,0.33 -1.92,0L5,13.18zM11.04,3.52l-8.43,4.6c-0.69,0.38 -0.69,1.38 0,1.76l8.43,4.6c0.6,0.33 1.32,0.33 1.92,0L21,10.09L21,16c0,0.55 0.45,1 1,1s1,-0.45 1,-1L23,9.59c0,-0.37 -0.2,-0.7 -0.52,-0.88l-9.52,-5.19c-0.6,-0.32 -1.32,-0.32 -1.92,0z" />
</vector> </vector>

View file

@ -0,0 +1,10 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:tint="?attr/colorControlNormal"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="@android:color/white"
android:pathData="M18,3v2h-2L16,3L8,3v2L6,5L6,3L4,3v18h2v-2h2v2h8v-2h2v2h2L20,3h-2zM8,17L6,17v-2h2v2zM8,13L6,13v-2h2v2zM8,9L6,9L6,7h2v2zM18,17h-2v-2h2v2zM18,13h-2v-2h2v2zM18,9h-2L16,7h2v2z" />
</vector>

View file

@ -31,6 +31,7 @@
android:textAlignment="center" android:textAlignment="center"
android:gravity="center_horizontal" android:gravity="center_horizontal"
android:textAllCaps="true" android:textAllCaps="true"
android:textColor="@color/accent"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/title_emoji" app:layout_constraintTop_toBottomOf="@+id/title_emoji"
@ -54,14 +55,16 @@
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="@string/you_have_received" android:text="@string/you_have_received"
android:layout_marginTop="4dp" android:layout_marginVertical="4dp"
android:textAlignment="center" android:textAlignment="center"
android:gravity="center" android:gravity="center"
android:visibility="gone"
app:drawableEndCompat="@drawable/tip" app:drawableEndCompat="@drawable/tip"
app:drawableTint="@color/accent" app:drawableTint="@color/accent"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/subtitle"/> app:layout_constraintTop_toBottomOf="@+id/subtitle"
tools:visibility="visible"/>
<ImageView <ImageView
android:id="@+id/close" android:id="@+id/close"
@ -69,9 +72,85 @@
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:background="?selectableItemBackgroundBorderless" android:background="?selectableItemBackgroundBorderless"
android:contentDescription="@string/cancel"
android:src="@drawable/close" android:src="@drawable/close"
android:padding="8dp" android:padding="8dp"
app:layout_constraintTop_toTopOf="parent" app:layout_constraintTop_toTopOf="parent"
app:layout_constraintEnd_toEndOf="parent"/> app:layout_constraintEnd_toEndOf="parent"/>
<ImageView
android:id="@+id/settings"
android:importantForAccessibility="no"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="?selectableItemBackgroundBorderless"
android:src="@drawable/settings"
android:contentDescription="@string/settings"
android:padding="8dp"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"/>
<dev.lucasnlm.external.view.AdPlaceHolderView
android:id="@+id/ads"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingVertical="8dp"
android:minHeight="66dp"
android:visibility="gone"
tools:visibility="visible"
tools:background="@color/accent"
app:layout_constraintTop_toBottomOf="@+id/received_message"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintBottom_toTopOf="@+id/actions"/>
<LinearLayout
android:id="@+id/actions"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintTop_toBottomOf="@+id/ads"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintBottom_toBottomOf="parent">
<androidx.appcompat.widget.AppCompatButton
style="@style/Widget.AppCompat.Button.Borderless.Colored"
android:id="@+id/new_game"
android:textAllCaps="true"
android:text="@string/new_game"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<requestFocus/>
</androidx.appcompat.widget.AppCompatButton>
<androidx.appcompat.widget.AppCompatButton
style="@style/Widget.AppCompat.Button.Borderless.Colored"
android:id="@+id/continue_game"
android:textAllCaps="true"
android:text="@string/continue_game"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<androidx.appcompat.widget.AppCompatButton
style="@style/Widget.AppCompat.Button.Borderless.Colored"
android:id="@+id/share"
android:textAllCaps="true"
android:text="@string/share"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:visibility="gone"
tools:visibility="visible"/>
<androidx.appcompat.widget.AppCompatButton
style="@style/Widget.AppCompat.Button.Borderless.Colored"
android:id="@+id/remove_ads"
android:textAllCaps="true"
android:text="@string/remove_ad"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:visibility="gone"
tools:visibility="visible"/>
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>

View file

@ -10,8 +10,8 @@ android {
defaultConfig { defaultConfig {
// versionCode and versionName must be hardcoded to support F-droid // versionCode and versionName must be hardcoded to support F-droid
versionCode 805021 versionCode 805041
versionName '8.5.2' versionName '8.5.4'
minSdkVersion 21 minSdkVersion 21
targetSdkVersion 30 targetSdkVersion 30
testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner' testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner'

View file

@ -79,7 +79,7 @@
<string name="open_tile">Open</string> <string name="open_tile">Open</string>
<string name="flag_tile">Flag</string> <string name="flag_tile">Flag</string>
<string name="retry">Retry</string> <string name="retry">Retry</string>
<string name="continue_game">Continue</string> <string name="continue_game">Continue this game</string>
<string name="empty">Empty</string> <string name="empty">Empty</string>
<string name="cant_do_it_now">Impossible to do that now</string> <string name="cant_do_it_now">Impossible to do that now</string>
<string name="you_have_received">You have received: %1$d</string> <string name="you_have_received">You have received: %1$d</string>

View file

@ -3,4 +3,5 @@ package dev.lucasnlm.external
interface IFeatureFlagManager { interface IFeatureFlagManager {
fun isGameHistoryEnabled(): Boolean fun isGameHistoryEnabled(): Boolean
fun isRateUsEnabled(): Boolean fun isRateUsEnabled(): Boolean
fun isInAppAdsEnabled(): Boolean
} }

View file

@ -8,8 +8,8 @@ android {
compileSdkVersion 30 compileSdkVersion 30
defaultConfig { defaultConfig {
versionCode 805021 versionCode 805041
versionName '8.5.2' versionName '8.5.4'
minSdkVersion 21 minSdkVersion 21
targetSdkVersion 30 targetSdkVersion 30
} }

View file

@ -3,4 +3,5 @@ package dev.lucasnlm.external
class FeatureFlagManager : IFeatureFlagManager { class FeatureFlagManager : IFeatureFlagManager {
override fun isGameHistoryEnabled(): Boolean = true override fun isGameHistoryEnabled(): Boolean = true
override fun isRateUsEnabled(): Boolean = false override fun isRateUsEnabled(): Boolean = false
override fun isInAppAdsEnabled(): Boolean = false
} }

View file

@ -12,8 +12,8 @@ android {
compileSdkVersion 30 compileSdkVersion 30
defaultConfig { defaultConfig {
versionCode 805021 versionCode 805041
versionName '8.5.2' versionName '8.5.4'
minSdkVersion 21 minSdkVersion 21
targetSdkVersion 30 targetSdkVersion 30
} }

View file

@ -3,4 +3,5 @@ package dev.lucasnlm.external
class FeatureFlagManager : IFeatureFlagManager { class FeatureFlagManager : IFeatureFlagManager {
override fun isGameHistoryEnabled(): Boolean = false override fun isGameHistoryEnabled(): Boolean = false
override fun isRateUsEnabled(): Boolean = true override fun isRateUsEnabled(): Boolean = true
override fun isInAppAdsEnabled(): Boolean = false
} }

View file

@ -2,7 +2,6 @@ package dev.lucasnlm.external.view
import android.content.Context import android.content.Context
import android.util.AttributeSet import android.util.AttributeSet
import android.view.View
import android.widget.FrameLayout import android.widget.FrameLayout
import com.google.android.gms.ads.AdRequest import com.google.android.gms.ads.AdRequest
import com.google.android.gms.ads.AdSize import com.google.android.gms.ads.AdSize
@ -21,17 +20,19 @@ class AdPlaceHolderView : FrameLayout {
init { init {
addView(adView) addView(adView)
setOnClickListener { // setOnClickListener {
adView.performClick() // adView.performClick()
this.visibility = View.GONE // this.visibility = View.GONE
} // }
loadAd()
} }
fun loadAd() { fun loadAd() {
adView.loadAd(AdRequest.Builder().build()) adView.loadAd(AdRequest.Builder().build())
if (!adView.isLoading) { // if (!adView.isLoading) {
this.visibility = View.GONE // this.visibility = View.GONE
} // }
} }
} }

View file

@ -10,8 +10,8 @@ android {
defaultConfig { defaultConfig {
// versionCode and versionName must be hardcoded to support F-droid // versionCode and versionName must be hardcoded to support F-droid
versionCode 805021 versionCode 805041
versionName '8.5.2' versionName '8.5.4'
applicationId 'dev.lucasnlm.antimine' applicationId 'dev.lucasnlm.antimine'
minSdkVersion 23 minSdkVersion 23
targetSdkVersion 30 targetSdkVersion 30