diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml new file mode 100644 index 00000000..f84bd2f4 --- /dev/null +++ b/.gitlab-ci.yml @@ -0,0 +1,44 @@ +image: openjdk:8-jdk + +variables: + ANDROID_COMPILE_SDK: "28" + ANDROID_BUILD_TOOLS: "28.0.3" + ANDROID_SDK_TOOLS: "4333796" + +before_script: + - apt-get --quiet update --yes + - apt-get --quiet install --yes wget tar unzip lib32stdc++6 lib32z1 + - wget --quiet --output-document=android-sdk.zip https://dl.google.com/android/repository/sdk-tools-linux-${ANDROID_SDK_TOOLS}.zip + - unzip -d android-sdk-linux android-sdk.zip + - echo y | android-sdk-linux/tools/bin/sdkmanager "platforms;android-${ANDROID_COMPILE_SDK}" >/dev/null + - echo y | android-sdk-linux/tools/bin/sdkmanager "platform-tools" >/dev/null + - echo y | android-sdk-linux/tools/bin/sdkmanager "build-tools;${ANDROID_BUILD_TOOLS}" >/dev/null + - export ANDROID_HOME=$PWD/android-sdk-linux + - export PATH=$PATH:$PWD/android-sdk-linux/platform-tools/ + - chmod +x ./gradlew + # temporarily disable checking for EPIPE error and use yes to accept all licenses + - set +o pipefail + - yes | android-sdk-linux/tools/bin/sdkmanager --licenses + - set -o pipefail + +stages: + - build + - test + +lintDebug: + stage: build + script: + - ./gradlew -Pci --console=plain :app:lintDebug -PbuildDir=lint + +assembleDebug: + stage: build + script: + - ./gradlew assembleDebug + artifacts: + paths: + - app/build/outputs/ + +#debugTests: +# stage: test +# script: +# - ./gradlew -Pci --console=plain :app:testDebug diff --git a/app/build.gradle b/app/build.gradle index 9e4dc5e1..097c8efd 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -12,12 +12,17 @@ repositories { android { compileSdkVersion 28 + buildToolsVersion "28.0.3" compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } + lintOptions { + disable 'MissingTranslation' + } + defaultConfig { applicationId "net.pokeranalytics.android" minSdkVersion 23 @@ -29,7 +34,7 @@ android { buildTypes { release { - minifyEnabled false + minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } diff --git a/app/src/main/java/net/pokeranalytics/android/exceptions/Exceptions.kt b/app/src/main/java/net/pokeranalytics/android/exceptions/Exceptions.kt index 2f391884..ac0e2564 100644 --- a/app/src/main/java/net/pokeranalytics/android/exceptions/Exceptions.kt +++ b/app/src/main/java/net/pokeranalytics/android/exceptions/Exceptions.kt @@ -7,3 +7,7 @@ class ModelException(message: String) : Exception(message) { class FormattingException(message: String) : Exception(message) { } + +class RowRepresentableEditDescriptorException(message: String) : Exception(message) { + +} \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/Bankroll.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/Bankroll.kt index fc2463e3..39d2be16 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/Bankroll.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/Bankroll.kt @@ -11,7 +11,6 @@ import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.RowRepresentableEditDescriptor import net.pokeranalytics.android.ui.view.rowrepresentable.BankrollRow import net.pokeranalytics.android.ui.view.rowrepresentable.SimpleRow -import timber.log.Timber import java.util.* import kotlin.collections.ArrayList @@ -70,7 +69,7 @@ open class Bankroll(name: String = "") : RealmObject(), Manageable, } } - override fun editDescriptors(row: RowRepresentable): ArrayList { + override fun editDescriptors(row: RowRepresentable): ArrayList? { val data = java.util.ArrayList() when (row) { SimpleRow.NAME -> data.add( diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/Game.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/Game.kt index b69e5c95..cae77e5f 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/Game.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/Game.kt @@ -1,9 +1,6 @@ package net.pokeranalytics.android.model.realm -import io.realm.Realm import io.realm.RealmObject -import io.realm.RealmResults -import io.realm.Sort import io.realm.annotations.PrimaryKey import net.pokeranalytics.android.R import net.pokeranalytics.android.model.interfaces.CountableUsage @@ -55,23 +52,12 @@ open class Game : RealmObject(), Manageable, StaticRowRepresentableDataSource, R } } - override fun editDescriptors(row: RowRepresentable): ArrayList { - val data = java.util.ArrayList() - when (row) { - SimpleRow.NAME -> data.add( - RowRepresentableEditDescriptor( - this.name, - SimpleRow.NAME.resId - ) - ) - GameRow.SHORT_NAME -> data.add( - RowRepresentableEditDescriptor( - this.shortName, - GameRow.SHORT_NAME.resId - ) - ) + override fun editDescriptors(row: RowRepresentable): ArrayList? { + return when (row) { + SimpleRow.NAME -> row.editingDescriptors(mapOf("defaultValue" to this.name)) + GameRow.SHORT_NAME -> row.editingDescriptors(mapOf("defaultValue" to this.shortName)) + else -> null } - return data } override fun updateValue(value: Any?, row: RowRepresentable) { diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/Session.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/Session.kt index 25193159..e1a93915 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/Session.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/Session.kt @@ -5,7 +5,6 @@ import android.text.InputType import io.realm.Realm import io.realm.RealmList import io.realm.RealmObject -import io.realm.Sort import io.realm.annotations.Ignore import io.realm.annotations.PrimaryKey import io.realm.kotlin.where @@ -36,8 +35,6 @@ import net.pokeranalytics.android.util.extensions.* import java.util.* import java.util.Currency import kotlin.collections.ArrayList -import kotlin.properties.Delegates -import kotlin.reflect.KProperty open class Session : RealmObject(), SessionInterface, Manageable, StaticRowRepresentableDataSource, RowRepresentable, Timed { @@ -137,6 +134,11 @@ open class Session : RealmObject(), SessionInterface, Manageable, StaticRowRepre // The bankroll hosting the results var bankroll: Bankroll? = null + set(value) { + field = value + this.updateRowRepresentation() + } + // The limit type: NL, PL... var limit: Int? = null @@ -585,7 +587,7 @@ open class Session : RealmObject(), SessionInterface, Manageable, StaticRowRepre } } - override fun editDescriptors(row: RowRepresentable): ArrayList { + override fun editDescriptors(row: RowRepresentable): ArrayList? { val data = ArrayList() diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/TournamentFeature.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/TournamentFeature.kt index e5774dc8..46f406e3 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/TournamentFeature.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/TournamentFeature.kt @@ -50,7 +50,7 @@ open class TournamentFeature : RealmObject(), Manageable, StaticRowRepresentable } - override fun editDescriptors(row: RowRepresentable): ArrayList { + override fun editDescriptors(row: RowRepresentable): ArrayList? { val data = java.util.ArrayList() when (row) { SimpleRow.NAME -> data.add( diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/TournamentName.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/TournamentName.kt index 7d149a82..b6f484f6 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/TournamentName.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/TournamentName.kt @@ -4,7 +4,6 @@ import io.realm.RealmObject import io.realm.annotations.PrimaryKey import net.pokeranalytics.android.R import net.pokeranalytics.android.model.interfaces.Manageable -import net.pokeranalytics.android.model.interfaces.Savable import net.pokeranalytics.android.ui.adapter.StaticRowRepresentableDataSource import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.RowRepresentableEditDescriptor @@ -51,7 +50,7 @@ open class TournamentName : RealmObject(), Manageable, StaticRowRepresentableDat } } - override fun editDescriptors(row: RowRepresentable): ArrayList { + override fun editDescriptors(row: RowRepresentable): ArrayList? { val data = java.util.ArrayList() when (row) { SimpleRow.NAME -> data.add( diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/TransactionType.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/TransactionType.kt index 91a17662..971cce30 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/TransactionType.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/TransactionType.kt @@ -4,7 +4,6 @@ import android.text.InputType import io.realm.RealmObject import io.realm.annotations.PrimaryKey import net.pokeranalytics.android.model.interfaces.Manageable -import net.pokeranalytics.android.model.interfaces.Savable import net.pokeranalytics.android.ui.adapter.StaticRowRepresentableDataSource import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.ui.view.RowRepresentableEditDescriptor @@ -54,7 +53,7 @@ open class TransactionType : RealmObject(), Manageable, StaticRowRepresentableDa } } - override fun editDescriptors(row: RowRepresentable): ArrayList { + override fun editDescriptors(row: RowRepresentable): ArrayList? { val data = java.util.ArrayList() when (row) { SimpleRow.NAME -> data.add( diff --git a/app/src/main/java/net/pokeranalytics/android/ui/activity/components/PokerAnalyticsActivity.kt b/app/src/main/java/net/pokeranalytics/android/ui/activity/components/PokerAnalyticsActivity.kt index e02ebd15..22febecc 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/activity/components/PokerAnalyticsActivity.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/activity/components/PokerAnalyticsActivity.kt @@ -18,6 +18,7 @@ open class PokerAnalyticsActivity : AppCompatActivity() { companion object { const val PERMISSION_REQUEST_ACCESS_FINE_LOCATION = 1000 + const val PLAY_SERVICES_RESOLUTION_REQUEST = 2000 } private val realm = Realm.getDefaultInstance() @@ -71,7 +72,7 @@ open class PokerAnalyticsActivity : AppCompatActivity() { /** * Return if the location permission has been granted by the user */ - fun hasLocationPermissionGranted() : Boolean { + fun hasLocationPermissionGranted(): Boolean { return ContextCompat.checkSelfPermission(this, ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED } @@ -127,21 +128,17 @@ open class PokerAnalyticsActivity : AppCompatActivity() { /** * Find the current location */ - fun findCurrentLocation(callback: ((location: Location?) -> Unit)?) { - if (LocationManager(this).databaseContainsLocationsWithCoordinates()) { - if (ContextCompat.checkSelfPermission(this, ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) { - LocationManager(this).findNearestLocationFromUser(callback) - } else { - askForLocationPermission { granted -> - if (granted) { - LocationManager(this).findNearestLocationFromUser(callback) - } else { - callback?.invoke(null) - } + fun findCurrentLocation(callback: ((location: android.location.Location?) -> Unit)?) { + if (ContextCompat.checkSelfPermission(this, ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) { + LocationManager(this).findCurrentLocation(callback) + } else { + askForLocationPermission { granted -> + if (granted) { + LocationManager(this).findCurrentLocation(callback) + } else { + callback?.invoke(null) } } - } else { - callback?.invoke(null) } } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/adapter/RowRepresentableDataSource.kt b/app/src/main/java/net/pokeranalytics/android/ui/adapter/RowRepresentableDataSource.kt index 1aadf238..e313e0cd 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/adapter/RowRepresentableDataSource.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/adapter/RowRepresentableDataSource.kt @@ -154,8 +154,8 @@ interface EditableDataSource { /** * A list of [RowRepresentableEditDescriptor] object specifying the way the edition will be handled */ - fun editDescriptors(row: RowRepresentable): ArrayList { - return ArrayList() + fun editDescriptors(row: RowRepresentable): ArrayList? { + return null } } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/LocationDataFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/LocationDataFragment.kt index 6f2254b0..0213d3ba 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/LocationDataFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/LocationDataFragment.kt @@ -14,7 +14,6 @@ import net.pokeranalytics.android.ui.view.rowrepresentable.CustomizableRowRepres import net.pokeranalytics.android.ui.view.rowrepresentable.LocationRow import net.pokeranalytics.android.ui.view.rowrepresentable.SimpleRow import net.pokeranalytics.android.util.NULL_TEXT -import timber.log.Timber /** * Custom EditableDataFragment to manage the LOCATE_ME case @@ -79,7 +78,7 @@ class LocationDataFragment : EditableDataFragment(), StaticRowRepresentableDataS } } - override fun editDescriptors(row: RowRepresentable): ArrayList { + override fun editDescriptors(row: RowRepresentable): ArrayList? { val data = java.util.ArrayList() when (row) { SimpleRow.NAME -> data.add( @@ -181,7 +180,6 @@ class LocationDataFragment : EditableDataFragment(), StaticRowRepresentableDataS // Try to get the location of the user parentActivity.findCurrentLocation {currentLocation -> currentLocation?.let { - Timber.d("Current location: ${it.latitude}, ${it.longitude}") location.latitude = currentLocation.latitude location.longitude = currentLocation.longitude } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetDoubleEditTextFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetDoubleEditTextFragment.kt index c7ab6d4f..fe22230f 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetDoubleEditTextFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetDoubleEditTextFragment.kt @@ -9,6 +9,7 @@ import androidx.core.widget.addTextChangedListener import kotlinx.android.synthetic.main.bottom_sheet_double_edit_text.* import kotlinx.android.synthetic.main.fragment_bottom_sheet.view.* import net.pokeranalytics.android.R +import net.pokeranalytics.android.exceptions.RowRepresentableEditDescriptorException import net.pokeranalytics.android.ui.view.rowrepresentable.SessionRow import net.pokeranalytics.android.util.extensions.round @@ -49,57 +50,55 @@ class BottomSheetDoubleEditTextFragment : BottomSheetFragment() { * Init UI */ private fun initUI() { + val data = getData()?:throw RowRepresentableEditDescriptorException("RowRepresentableEditDescriptor not found") + if (data.size != 2) { + throw RowRepresentableEditDescriptorException("RowRepresentableEditDescriptor inconsistency") + } setAddButtonVisible(false) - val data = getData() - values.add(0, "") values.add(1, "") LayoutInflater.from(requireContext()) .inflate(R.layout.bottom_sheet_double_edit_text, view?.bottomSheetContainer, true) - if (data.size == 2) { + values[0] = (data[0].defaultValue ?: "").toString() + values[1] = (data[1].defaultValue ?: "").toString() - values[0] = (data[0].defaultValue ?: "").toString() - values[1] = (data[1].defaultValue ?: "").toString() + editText1.setText(values[0]) + editText2.setText(values[1]) - editText1.setText(values[0]) - editText2.setText(values[1]) - - data[0].hint?.let { editText1.hint = getString(it) } - editText1.inputType = data[0].inputType ?: InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_FLAG_CAP_SENTENCES - editText1.addTextChangedListener { - values[0] = it?.toString() ?: "" - } + data[0].hint?.let { editText1.hint = getString(it) } + editText1.inputType = data[0].inputType ?: InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_FLAG_CAP_SENTENCES + editText1.addTextChangedListener { + values[0] = it?.toString() ?: "" + } - data[1].hint?.let { editText2.hint = getString(it) } - editText2.inputType = data[1].inputType ?: InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_FLAG_CAP_SENTENCES - editText2.addTextChangedListener { - values[1] = it?.toString() ?: "" - if (isEditingBlinds) { - try { - val bigBlind = values[1].toDouble() - editText1.setText((bigBlind / 2.0).round()) - } catch (e: Exception) { - editText1.setText("") - } + data[1].hint?.let { editText2.hint = getString(it) } + editText2.inputType = data[1].inputType ?: InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_FLAG_CAP_SENTENCES + editText2.addTextChangedListener { + values[1] = it?.toString() ?: "" + if (isEditingBlinds) { + try { + val bigBlind = values[1].toDouble() + editText1.setText((bigBlind / 2.0).round()) + } catch (e: Exception) { + editText1.setText("") } } + } - editText2.setOnEditorActionListener { v, actionId, _ -> - if (actionId == EditorInfo.IME_ACTION_DONE) { - this.delegate.onRowValueChanged(values, row) - dismiss() - true - } else { - false - } + editText2.setOnEditorActionListener { v, actionId, _ -> + if (actionId == EditorInfo.IME_ACTION_DONE) { + this.delegate.onRowValueChanged(values, row) + dismiss() + true + } else { + false } } - } } \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetEditTextFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetEditTextFragment.kt index a6027e34..7cfd287d 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetEditTextFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetEditTextFragment.kt @@ -9,6 +9,7 @@ import androidx.core.widget.addTextChangedListener import kotlinx.android.synthetic.main.bottom_sheet_edit_text.* import kotlinx.android.synthetic.main.fragment_bottom_sheet.view.* import net.pokeranalytics.android.R +import net.pokeranalytics.android.exceptions.RowRepresentableEditDescriptorException class BottomSheetEditTextFragment : BottomSheetFragment() { @@ -40,28 +41,26 @@ class BottomSheetEditTextFragment : BottomSheetFragment() { * Init UI */ private fun initUI() { + val data = getData()?:throw RowRepresentableEditDescriptorException("RowRepresentableEditDescriptor not found") + if (data.size != 1) { + throw RowRepresentableEditDescriptorException("RowRepresentableEditDescriptor inconsistency") + } setAddButtonVisible(false) - LayoutInflater.from(requireContext()).inflate(R.layout.bottom_sheet_edit_text, view?.bottomSheetContainer, true) - val data = getData() - - if (data.size == 1) { - - data[0].hint?.let { editText1.hint = getString(it) } - editText1.inputType = data[0].inputType ?: InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_FLAG_CAP_SENTENCES - editText1.addTextChangedListener { value = it?.toString() ?: "" } - editText1.setText((data[0].defaultValue ?: "").toString()) - - editText1.setOnEditorActionListener { v, actionId, _ -> - if (actionId == EditorInfo.IME_ACTION_DONE) { - delegate.onRowValueChanged(getValue(), row) - dismiss() - true - } else { - false - } + data[0].hint?.let { editText1.hint = getString(it) } + editText1.inputType = data[0].inputType ?: InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_FLAG_CAP_SENTENCES + editText1.addTextChangedListener { value = it?.toString() ?: "" } + editText1.setText((data[0].defaultValue ?: "").toString()) + + editText1.setOnEditorActionListener { v, actionId, _ -> + if (actionId == EditorInfo.IME_ACTION_DONE) { + delegate.onRowValueChanged(getValue(), row) + dismiss() + true + } else { + false } } } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetEditTextMultiLinesFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetEditTextMultiLinesFragment.kt index 3787218f..4014198d 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetEditTextMultiLinesFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetEditTextMultiLinesFragment.kt @@ -7,6 +7,8 @@ import android.view.View import androidx.core.widget.addTextChangedListener import kotlinx.android.synthetic.main.bottom_sheet_edit_text_multi_lines.* import kotlinx.android.synthetic.main.fragment_bottom_sheet.view.* +import net.pokeranalytics.android.exceptions.RowRepresentableEditDescriptorException +import java.lang.AssertionError class BottomSheetEditTextMultiLinesFragment : BottomSheetFragment() { @@ -38,19 +40,19 @@ class BottomSheetEditTextMultiLinesFragment : BottomSheetFragment() { * Init UI */ private fun initUI() { + val data = getData()?:throw RowRepresentableEditDescriptorException("RowRepresentableEditDescriptor not found") + if (data.size != 1) { + throw RowRepresentableEditDescriptorException("RowRepresentableEditDescriptor inconsistency") + } setAddButtonVisible(false) LayoutInflater.from(requireContext()).inflate(net.pokeranalytics.android.R.layout.bottom_sheet_edit_text_multi_lines, view?.bottomSheetContainer, true) - val data = getData() - - if (data.size == 1) { - data[0].hint?.let { editText1.hint = getString(it) } - editText1.inputType = data[0].inputType ?: InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_FLAG_MULTI_LINE or InputType.TYPE_TEXT_FLAG_CAP_SENTENCES - editText1.addTextChangedListener { value = it?.toString() ?: "" } - editText1.setText((data[0].defaultValue ?: "").toString()) - } + data[0].hint?.let { editText1.hint = getString(it) } + editText1.inputType = data[0].inputType ?: InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_FLAG_MULTI_LINE or InputType.TYPE_TEXT_FLAG_CAP_SENTENCES + editText1.addTextChangedListener { value = it?.toString() ?: "" } + editText1.setText((data[0].defaultValue ?: "").toString()) } } \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetFragment.kt index 698b72e3..675c21de 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetFragment.kt @@ -23,17 +23,18 @@ import net.pokeranalytics.android.ui.view.RowRepresentableEditDescriptor import net.pokeranalytics.android.ui.view.rowrepresentable.SessionRow enum class BottomSheetType { - NONE, - LIST, - LIST_STATIC, - LIST_GAME, - DOUBLE_LIST, - MULTI_SELECTION, - GRID, - EDIT_TEXT, - EDIT_TEXT_MULTI_LINES, - DOUBLE_EDIT_TEXT, - SUM + NONE { override fun newInstance() = BottomSheetFragment()}, + LIST { override fun newInstance() = BottomSheetListFragment()}, + LIST_STATIC { override fun newInstance() = BottomSheetStaticListFragment()}, + LIST_GAME { override fun newInstance() = BottomSheetListGameFragment()}, + DOUBLE_LIST { override fun newInstance() = BottomSheetListGameFragment()}, + MULTI_SELECTION { override fun newInstance() = BottomSheetMultiSelectionFragment()}, + GRID { override fun newInstance() = BottomSheetTableSizeGridFragment()}, + EDIT_TEXT { override fun newInstance() = BottomSheetEditTextFragment()}, + EDIT_TEXT_MULTI_LINES { override fun newInstance() = BottomSheetEditTextMultiLinesFragment()}, + DOUBLE_EDIT_TEXT { override fun newInstance() = BottomSheetDoubleEditTextFragment()}, + SUM { override fun newInstance() = BottomSheetSumFragment()}; + abstract fun newInstance(): BottomSheetFragment } open class BottomSheetFragment : BottomSheetDialogFragment() { @@ -42,7 +43,7 @@ open class BottomSheetFragment : BottomSheetDialogFragment() { lateinit var delegate: RowRepresentableDelegate private var isClearable: Boolean = true - private var rowRepresentableEditDescriptors: ArrayList = ArrayList() + private var rowRepresentableEditDescriptors: ArrayList? = null companion object { @@ -52,24 +53,10 @@ open class BottomSheetFragment : BottomSheetDialogFragment() { fragmentManager: FragmentManager?, row: RowRepresentable, delegate: RowRepresentableDelegate, - rowRepresentableEditDescriptors: ArrayList, + rowRepresentableEditDescriptors: ArrayList?, isClearable: Boolean? = true ): BottomSheetFragment { - - val bottomSheetFragment = when (row.bottomSheetType) { - BottomSheetType.LIST -> BottomSheetListFragment() - BottomSheetType.LIST_GAME -> BottomSheetListGameFragment() - BottomSheetType.LIST_STATIC -> BottomSheetStaticListFragment() - BottomSheetType.MULTI_SELECTION -> BottomSheetMultiSelectionFragment() - BottomSheetType.GRID -> BottomSheetTableSizeGridFragment() - BottomSheetType.DOUBLE_LIST -> BottomSheetListGameFragment() - BottomSheetType.EDIT_TEXT -> BottomSheetEditTextFragment() - BottomSheetType.EDIT_TEXT_MULTI_LINES -> BottomSheetEditTextMultiLinesFragment() - BottomSheetType.DOUBLE_EDIT_TEXT -> BottomSheetDoubleEditTextFragment() - BottomSheetType.SUM -> BottomSheetSumFragment() - else -> BottomSheetFragment() - } - + val bottomSheetFragment = row.bottomSheetType.newInstance() bottomSheetFragment.show(fragmentManager, "bottomSheet") bottomSheetFragment.row = row bottomSheetFragment.delegate = delegate @@ -173,7 +160,7 @@ open class BottomSheetFragment : BottomSheetDialogFragment() { /** * Return the data list */ - fun getData(): ArrayList { + fun getData(): ArrayList? { return this.rowRepresentableEditDescriptors } diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetListFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetListFragment.kt index fa7145d1..409e5041 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetListFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetListFragment.kt @@ -8,6 +8,7 @@ import io.realm.RealmResults import kotlinx.android.synthetic.main.bottom_sheet_list.* import kotlinx.android.synthetic.main.fragment_bottom_sheet.view.* import net.pokeranalytics.android.R +import net.pokeranalytics.android.exceptions.RowRepresentableEditDescriptorException import net.pokeranalytics.android.ui.adapter.LiveRowRepresentableDataSource import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate @@ -70,10 +71,14 @@ open class BottomSheetListFragment : BottomSheetFragment(), LiveRowRepresentable * Init data */ open fun initData() { - val bottomSheetData = getData() - if (bottomSheetData.isNotEmpty() && bottomSheetData.first().data != null) { - this.realmData = bottomSheetData.first().data as RealmResults<*> + val bottomSheetData = getData()?:throw RowRepresentableEditDescriptorException("RowRepresentableEditDescriptor not found") + if (bottomSheetData.size != 1) { + throw RowRepresentableEditDescriptorException("RowRepresentableEditDescriptor inconsistency") } + if (bottomSheetData.first().data == null) { + throw RowRepresentableEditDescriptorException("RowRepresentableEditDescriptor inconsistency") + } + this.realmData = bottomSheetData.first().data as RealmResults<*> } /** diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetListGameFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetListGameFragment.kt index 4f4c12f3..acdeb87b 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetListGameFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetListGameFragment.kt @@ -9,6 +9,7 @@ import io.realm.RealmResults import kotlinx.android.synthetic.main.bottom_sheet_game_list.* import kotlinx.android.synthetic.main.fragment_bottom_sheet.view.* import net.pokeranalytics.android.R +import net.pokeranalytics.android.exceptions.RowRepresentableEditDescriptorException import net.pokeranalytics.android.model.Limit import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter import net.pokeranalytics.android.ui.view.RowRepresentable @@ -47,11 +48,15 @@ class BottomSheetListGameFragment : BottomSheetListFragment() { * Init data */ override fun initData() { - val bottomSheetData = getData() - if (bottomSheetData.isNotEmpty() && bottomSheetData.size >= 2 && bottomSheetData[1].data != null) { - this.limit = bottomSheetData[0].defaultValue as Int? - this.realmData = bottomSheetData[1].data as RealmResults<*> + val bottomSheetData = getData()?:throw RowRepresentableEditDescriptorException("RowRepresentableEditDescriptor not found") + if (bottomSheetData.size != 2) { + throw RowRepresentableEditDescriptorException("RowRepresentableEditDescriptor inconsistency") } + if (bottomSheetData[1].data == null) { + throw RowRepresentableEditDescriptorException("RowRepresentableEditDescriptor inconsistency") + } + this.limit = bottomSheetData[0].defaultValue as Int? + this.realmData = bottomSheetData[1].data as RealmResults<*> } /** diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetMultiSelectionFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetMultiSelectionFragment.kt index 717a7654..b9e08e4c 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetMultiSelectionFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetMultiSelectionFragment.kt @@ -6,6 +6,8 @@ import android.os.Bundle import android.view.View import io.realm.RealmList import io.realm.RealmObject +import io.realm.RealmResults +import net.pokeranalytics.android.exceptions.RowRepresentableEditDescriptorException import net.pokeranalytics.android.model.LiveData import net.pokeranalytics.android.ui.activity.EditableDataActivity import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity @@ -65,13 +67,14 @@ open class BottomSheetMultiSelectionFragment : BottomSheetListFragment() { } override fun initData() { - super.initData() - getData().first().defaultValue?.let { - + val bottomSheetData = getData()?:throw RowRepresentableEditDescriptorException("RowRepresentableEditDescriptor not found") + if (bottomSheetData.size != 1) { + throw RowRepresentableEditDescriptorException("RowRepresentableEditDescriptor inconsistency") + } + bottomSheetData.first().defaultValue?.let { (it as RealmList<*>).forEach{row -> - selectedRows.add(row as RowRepresentable) + this.selectedRows.add(row as RowRepresentable) } } } - } \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetStaticListFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetStaticListFragment.kt index 8164a19e..ca857d71 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetStaticListFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetStaticListFragment.kt @@ -7,6 +7,7 @@ import androidx.recyclerview.widget.LinearLayoutManager import kotlinx.android.synthetic.main.bottom_sheet_list.* import kotlinx.android.synthetic.main.fragment_bottom_sheet.view.* import net.pokeranalytics.android.R +import net.pokeranalytics.android.exceptions.RowRepresentableEditDescriptorException import net.pokeranalytics.android.model.TournamentType import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate @@ -44,10 +45,14 @@ class BottomSheetStaticListFragment : BottomSheetFragment(), StaticRowRepresenta * Init data */ private fun initData() { - val bottomSheetData = this.getData() - if (bottomSheetData.isNotEmpty() && bottomSheetData.first().staticData != null) { - this.staticRows = bottomSheetData.first().staticData as List + val bottomSheetData = getData()?:throw RowRepresentableEditDescriptorException("RowRepresentableEditDescriptor not found") + if (bottomSheetData.size != 1) { + throw RowRepresentableEditDescriptorException("RowRepresentableEditDescriptor inconsistency") } + if (bottomSheetData.first().staticData == null) { + throw RowRepresentableEditDescriptorException("RowRepresentableEditDescriptor inconsistency") + } + this.staticRows = bottomSheetData.first().staticData as List } /** diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetSumFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetSumFragment.kt index 3f81b1b2..e9ff13fd 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetSumFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetSumFragment.kt @@ -9,6 +9,7 @@ import androidx.core.widget.addTextChangedListener import kotlinx.android.synthetic.main.bottom_sheet_sum.* import kotlinx.android.synthetic.main.fragment_bottom_sheet.view.* import net.pokeranalytics.android.R +import net.pokeranalytics.android.exceptions.RowRepresentableEditDescriptorException import net.pokeranalytics.android.util.extensions.round import net.pokeranalytics.android.util.extensions.toCurrency @@ -47,8 +48,10 @@ class BottomSheetSumFragment : BottomSheetFragment() { * Init UI */ private fun initUI() { - - val data = getData() + val data = getData()?:throw RowRepresentableEditDescriptorException("RowRepresentableEditDescriptor not found") + if (data.size != 5) { + throw RowRepresentableEditDescriptorException("RowRepresentableEditDescriptor inconsistency") + } setAddButtonVisible(false) diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetTableSizeGridFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetTableSizeGridFragment.kt index 171390d8..f1b079d6 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetTableSizeGridFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/components/bottomsheet/BottomSheetTableSizeGridFragment.kt @@ -6,6 +6,7 @@ import android.view.View import androidx.recyclerview.widget.GridLayoutManager import kotlinx.android.synthetic.main.bottom_sheet_grid.* import kotlinx.android.synthetic.main.fragment_bottom_sheet.view.* +import net.pokeranalytics.android.exceptions.RowRepresentableEditDescriptorException import net.pokeranalytics.android.model.TableSize import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate @@ -38,11 +39,11 @@ class BottomSheetTableSizeGridFragment : BottomSheetFragment(), StaticRowReprese * Init data */ private fun initData() { - - val bottomSheetData = getData() - if (bottomSheetData.isNotEmpty() && bottomSheetData.first().defaultValue != null) { - defaultSize = bottomSheetData.first().defaultValue as Int? + val bottomSheetData = getData()?:throw RowRepresentableEditDescriptorException("RowRepresentableEditDescriptor not found") + if (bottomSheetData.size != 1) { + throw RowRepresentableEditDescriptorException("RowRepresentableEditDescriptor inconsistency") } + defaultSize = bottomSheetData.first().defaultValue as Int? } /** diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/RowRepresentable.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/RowRepresentable.kt index a8298de4..8437a1ed 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/view/RowRepresentable.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/RowRepresentable.kt @@ -1,6 +1,7 @@ package net.pokeranalytics.android.ui.view import android.content.Context +import io.realm.RealmResults import net.pokeranalytics.android.model.LiveData import net.pokeranalytics.android.ui.fragment.components.bottomsheet.BottomSheetType import net.pokeranalytics.android.util.NULL_TEXT @@ -14,14 +15,9 @@ interface RowRepresentable : Displayable { return NULL_TEXT } - var isSelected: Boolean - get() { - return false - } - set(value) { - - } - + fun editingDescriptors(map:Map): ArrayList? { + return null + } } /** diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/SimpleRow.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/SimpleRow.kt index 95c0c1df..6f8610d4 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/SimpleRow.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/rowrepresentable/SimpleRow.kt @@ -3,6 +3,7 @@ package net.pokeranalytics.android.ui.view.rowrepresentable import net.pokeranalytics.android.R import net.pokeranalytics.android.ui.fragment.components.bottomsheet.BottomSheetType import net.pokeranalytics.android.ui.view.RowRepresentable +import net.pokeranalytics.android.ui.view.RowRepresentableEditDescriptor import net.pokeranalytics.android.ui.view.RowViewType @@ -12,4 +13,9 @@ enum class SimpleRow : RowRepresentable { override val resId: Int? = R.string.name override val viewType: Int = RowViewType.TITLE_VALUE.ordinal override val bottomSheetType: BottomSheetType = BottomSheetType.EDIT_TEXT + + override fun editingDescriptors(map: Map): ArrayList? { + val defaultValue by map + return arrayListOf(RowRepresentableEditDescriptor(defaultValue, this.resId)) + } } \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/util/FormatUtils.kt b/app/src/main/java/net/pokeranalytics/android/util/FormatUtils.kt index 9c9b27ad..29fbb799 100644 --- a/app/src/main/java/net/pokeranalytics/android/util/FormatUtils.kt +++ b/app/src/main/java/net/pokeranalytics/android/util/FormatUtils.kt @@ -17,5 +17,4 @@ class FormatUtils { } - } \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/util/ModelUtils.kt b/app/src/main/java/net/pokeranalytics/android/util/ModelUtils.kt new file mode 100644 index 00000000..e7446319 --- /dev/null +++ b/app/src/main/java/net/pokeranalytics/android/util/ModelUtils.kt @@ -0,0 +1,26 @@ +package net.pokeranalytics.android.util + +import android.os.Build + + +/** + * Helper to get the device model + */ +class ModelUtils { + + companion object { + /** + * Get the device name + */ + fun getDeviceName(): String { + val manufacturer = Build.MANUFACTURER + val model = Build.MODEL + return if (model.toLowerCase().startsWith(manufacturer.toLowerCase())) { + model.capitalize() + } else { + manufacturer.capitalize() + " " + model + } + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/util/extensions/DateExtension.kt b/app/src/main/java/net/pokeranalytics/android/util/extensions/DateExtension.kt index 3b098126..d24c1712 100644 --- a/app/src/main/java/net/pokeranalytics/android/util/extensions/DateExtension.kt +++ b/app/src/main/java/net/pokeranalytics/android/util/extensions/DateExtension.kt @@ -81,7 +81,7 @@ fun Date.getShortDayName() : String { } // Return the month & year of the date fun Date.getMonthAndYear(): String { - return SimpleDateFormat("MMMM YYYY", Locale.getDefault()).format(this).capitalize() + return SimpleDateFormat("MMMM yyyy", Locale.getDefault()).format(this).capitalize() } // Return the netDuration between two dates diff --git a/app/src/main/java/net/pokeranalytics/android/util/extensions/UIExtensions.kt b/app/src/main/java/net/pokeranalytics/android/util/extensions/UIExtensions.kt index 2ac3093f..6406ca79 100644 --- a/app/src/main/java/net/pokeranalytics/android/util/extensions/UIExtensions.kt +++ b/app/src/main/java/net/pokeranalytics/android/util/extensions/UIExtensions.kt @@ -13,6 +13,7 @@ import net.pokeranalytics.android.BuildConfig import net.pokeranalytics.android.R import net.pokeranalytics.android.ui.activity.components.PokerAnalyticsActivity import net.pokeranalytics.android.ui.fragment.components.PokerAnalyticsFragment +import net.pokeranalytics.android.util.ModelUtils import net.pokeranalytics.android.util.URL @@ -59,7 +60,7 @@ fun PokerAnalyticsActivity.openPlayStorePage() { // Open email for "Contact us" fun PokerAnalyticsActivity.openContactMail(subjectStringRes: Int) { - val info = "v${BuildConfig.VERSION_NAME}(${BuildConfig.VERSION_CODE}), Android ${android.os.Build.VERSION.SDK_INT}" + val info = "v${BuildConfig.VERSION_NAME}(${BuildConfig.VERSION_CODE}), Android ${android.os.Build.VERSION.SDK_INT}, ${ModelUtils.getDeviceName()}" val intent = Intent(Intent.ACTION_SENDTO) intent.data = Uri.parse("mailto:${URL.SUPPORT_EMAIL.value}") intent.putExtra(Intent.EXTRA_SUBJECT, getString(subjectStringRes)) diff --git a/app/src/main/res/values-zh/strings.xml b/app/src/main/res/values-zh/strings.xml index 490f9b03..3ca1afe3 100644 --- a/app/src/main/res/values-zh/strings.xml +++ b/app/src/main/res/values-zh/strings.xml @@ -2,8 +2,8 @@ Poker Analytics - %@前 - %@不能访问你的联系人且不能检索你的现有好友姓名。通过iPhone首选项可授权防止任何\'陌生用户\'名访问。 + %s前 + %s不能访问你的联系人且不能检索你的现有好友姓名。通过iPhone首选项可授权防止任何\'陌生用户\'名访问。 一颗星表示一个文件存储在你的iCloud帐户上。 启用 iCloud在你的所有设备上保存你的数据并保持最新。启用时,你的数据被移至iCloud,在其它设备访问你的数据前,这可能要花费一段时间。 @@ -137,7 +137,7 @@ 结束 你要结束所有游戏? 结束日期 - 未设置结束日期!该格式可能不正确。这里是用于分析的值:%@ + 未设置结束日期!该格式可能不正确。这里是用于分析的值:%s 重新购买周期结束,盲注增加 一分钟内重新购买周期结束 进程结束已关闭,触按详情停止你的进程并设置结果 @@ -156,7 +156,7 @@ 选择类型 此功能已锁定,很遗憾你已禁用应用内购买。请核查设置。 导入失败。某些用来导入的文件无法创建,这可能由于空间不够 - 名为%@的文件已成功保存在你的iCloud帐户上。 + 名为%s的文件已成功保存在你的iCloud帐户上。 筛选 筛选启用 此筛选无法删除,因为它链接1个或多个报告。 @@ -203,7 +203,7 @@ 导入 使用通讯录 识别出问题 - 保存进程时出错:%@ + 保存进程时出错:%s 导入成功 导入进程 @@ -230,7 +230,7 @@ 在线/房间 打开… 位置 - 位置:%@, + 位置:%s, 你需要命名此位置。 未追踪的位置 追踪的位置 @@ -324,7 +324,7 @@ 玩家 玩家 请检查你的值是否有效 - 请确认导入\'%@\'? + 请确认导入\'%s\'? 请选择相应的字段: 请输入你的PIN码 @@ -364,11 +364,11 @@ 重新开始定时器 结果 房间 - 房间:%@ + 房间:%s 你需要命名此房间 房间 运行中 - 自定义字段\'%@\'已存在于你的数据库中,但类型不同。此字段和它的所有值将被忽略。若你真要保留此值,请取消此导入,重命名自定义字段并重试该导入。 + 自定义字段\'%s\'已存在于你的数据库中,但类型不同。此字段和它的所有值将被忽略。若你真要保留此值,请取消此导入,重命名自定义字段并重试该导入。 你需要命名它并选择至少一个统计保存此报告 正在保存导入数据,请等待… 安全 @@ -379,7 +379,7 @@ 设置 进程 进程时长 - 未设置进程获胜数量!这是被用来分析的值:%@ + 未设置进程获胜数量!这是被用来分析的值:%s 进程的评论已更新 进程 分享图表 @@ -398,7 +398,7 @@ 标准偏差 开始 开始日期 - 未设置开始日期,格式可能错误。这是导入时使用的值:%@ + 未设置开始日期,格式可能错误。这是导入时使用的值:%s 统计 统计 @@ -417,11 +417,11 @@ 点击或滑动 恭喜,该内容现在可用。 %1$@,%2$@ - 名为%@的位置已有这些坐标。 + 名为%s的位置已有这些坐标。 当前评分无法检索。默认将使用的评分为1。你仍能单独编辑该评分。 该进程已存在!开始日期:%1$@,结束日期:%2$@,获胜数量 :%3$@ 该进程已存在!开始日期:%1$@,结束日期:%2$@,净结果:%3$@ - 你的进程已开始:%@ + 你的进程已开始:%s 本月 本周 今年 @@ -451,14 +451,14 @@ Twitter 类型 限制类型 - 无法从雅虎获得评分- %@ + 无法从雅虎获得评分- %s 已取消关注! 文件格式无法识别 未知用户 你需要命名你的好友 验证 - 游戏:%@, + 游戏:%s, 你需要命名该游戏 你需要为该游戏进行简短命名 版本 @@ -470,7 +470,7 @@ 工作日 工作日或周末 周末 - 欢迎使用%@ + 欢迎使用%s 获胜率 利用 提款 @@ -488,7 +488,7 @@ 昨天 今天和昨天 - 你能检索iTunes内生成的名为%@的文件。 + 你能检索iTunes内生成的名为%s的文件。 抱歉,你不能同时启用超过%i个的比较密匙! 你要对所有导入的进程指定以下值。请检查以下项目: 警告 @@ -561,7 +561,7 @@ 来自 最大值 - %@有何新功能? + %s有何新功能? 喜欢Poker Analytics? 请反馈本应用如何 在App Store给我们评分 @@ -569,12 +569,12 @@ 时间到! 根据你的历史记录,好像你开始累了。可能该停止了! 停止通知 - 在%@中已设置停止通知 + 在%s中已设置停止通知 保存和授权 选择颜色 聚焦索引 - 未授权%@访问摄像头。若修改隐私设置,请注意自动关闭应用将失去未保存的数据。 - 未授权%@访问照片库。若修改隐私设置,请注意自动关闭应用将失去未保存的数据。 + 未授权%s访问摄像头。若修改隐私设置,请注意自动关闭应用将失去未保存的数据。 + 未授权%s访问照片库。若修改隐私设置,请注意自动关闭应用将失去未保存的数据。 新手 新备注 触按一个项目了解详情 @@ -594,9 +594,9 @@ 自动续订订阅 条件 Poker Analytics尝试估算您的最佳进程时长并在你到达该时长时发送通知。需要约50局。 - 不能启动iCloud同步。也许你在iCloud上有旧%@数据。 + 不能启动iCloud同步。也许你在iCloud上有旧%s数据。 清牌后重试 - 你将重置iCloud上%@的数据,你的本地数据不会更改,但你必需中止所有其它设备上的iCloud同步。确定这么做? + 你将重置iCloud上%s的数据,你的本地数据不会更改,但你必需中止所有其它设备上的iCloud同步。确定这么做? 删除图片 同步中 错误 @@ -607,7 +607,7 @@ 由于数据库出现重要变更,出于安全考虑已在应用上禁用iCloud,你的数据已被移回你的本地设备。请在所有其它设备上禁用iCloud同步。若要重新启动iCloud,必须提前删除iCloud数据。 不能禁用iCloud同步。 - 当前有%@个筹码 + 当前有%s个筹码 iCloud请求超时。 对战 打开隐私设置 diff --git a/app/src/test/java/net/pokeranalytics/android/ExampleUnitTest.kt b/app/src/test/java/net/pokeranalytics/android/ExampleUnitTest.kt index 9ae7c2fa..39180592 100644 --- a/app/src/test/java/net/pokeranalytics/android/ExampleUnitTest.kt +++ b/app/src/test/java/net/pokeranalytics/android/ExampleUnitTest.kt @@ -15,6 +15,8 @@ class ExampleUnitTest : RealmUnitTest() { class Grade(someValue: Double) : SessionInterface { + override var bbPer100Hands: Double = 0.0 + override var ratedNet: Double = 0.0 override var value: Double = someValue override var sessionSet: SessionSet? = SessionSet()