diff --git a/.github/workflows/android.yml b/.github/workflows/android.yml index b8a433035..60db0036b 100644 --- a/.github/workflows/android.yml +++ b/.github/workflows/android.yml @@ -1,6 +1,10 @@ name: Android CI -on: [push] +on: + push: + branches: [ "master" ] + pull_request: + branches: [ "master" ] jobs: build: @@ -8,16 +12,20 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 - - name: set up JDK 1.8 - uses: actions/setup-java@v1 - with: - java-version: 1.8 - - name: Build with Gradle - run: sudo ./gradlew assemble - - name: Upload APK - uses: actions/upload-artifact@v2 - with: - path: ./**/*.apk - if-no-files-found: warn - + - uses: actions/checkout@v4 + - name: set up JDK 17 + uses: actions/setup-java@v4 + with: + java-version: 17 + distribution: 'temurin' + cache: gradle + + - name: Grant execute permission for gradlew + run: chmod +x gradlew + - name: Build with Gradle + run: ./gradlew assemble + - name: Upload APK + uses: actions/upload-artifact@v4 + with: + path: ./**/*.apk + if-no-files-found: warn diff --git a/android/build.gradle b/android/build.gradle index d897d1337..f7b04d996 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -1,7 +1,7 @@ -apply plugin: 'com.android.application' +import org.jetbrains.kotlin.gradle.tasks.KotlinCompile +apply plugin: 'com.android.application' apply plugin: 'kotlin-android' -apply plugin: 'kotlin-android-extensions' apply plugin: 'kotlin-kapt' apply plugin: 'de.mobilej.unmock' apply plugin: 'com.getkeepsafe.dexcount' @@ -11,12 +11,16 @@ composer { } repositories { + maven {url 'https://repo1.maven.org/maven2/' } + mavenCentral() google() - jcenter() maven { url 'https://jitpack.io' } + maven { url 'https://repo.clojars.org' } + maven { url 'https://linkedin.jfrog.io/artifactory/open-source/' } } android { + namespace "org.ligi.gobandroid_hd" flavorDimensions "analytics", "cloud", "autostart" productFlavors { @@ -45,7 +49,7 @@ android { targetCompatibility JavaVersion.VERSION_1_8 } - tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).all { + tasks.withType(KotlinCompile).configureEach { kotlinOptions { jvmTarget = "1.8" } @@ -61,14 +65,13 @@ android { } - compileSdkVersion 30 - buildToolsVersion '29.0.3' + compileSdkVersion 36 defaultConfig { versionCode 260 versionName "2.6.0" minSdkVersion 21 - targetSdkVersion 30 + targetSdkVersion 34 applicationId "org.ligi.gobandroid_hd" testInstrumentationRunner "org.ligi.gobandroid_hd.AppReplacingRunner" archivesBaseName = "Gobandroid-$versionName" @@ -114,58 +117,64 @@ android { minifyEnabled false } } + buildFeatures { + viewBinding true + buildConfig true + aidl true + } } // android configurations { all { exclude module: 'commons-logging' exclude module: 'httpclient' + exclude group: 'com.google.guava', module: 'listenablefuture' } } dependencies { - implementation "org.permissionsdispatcher:permissionsdispatcher:4.8.0" - kapt "org.permissionsdispatcher:permissionsdispatcher-processor:4.8.0" + implementation "com.github.permissions-dispatcher:permissionsdispatcher:4.9.2" + kapt "com.github.permissions-dispatcher:permissionsdispatcher-processor:4.9.2" implementation 'com.github.salomonbrys.kodein:kodein:4.1.0' - implementation 'androidx.appcompat:appcompat:1.2.0' - implementation 'androidx.recyclerview:recyclerview:1.1.0' + implementation 'androidx.appcompat:appcompat:1.6.1' + implementation 'androidx.recyclerview:recyclerview:1.3.0' implementation 'androidx.cardview:cardview:1.0.0' - implementation 'com.google.android.material:material:1.3.0' - implementation 'androidx.preference:preference-ktx:1.1.1' + implementation 'com.google.android.material:material:1.10.0' + implementation 'androidx.preference:preference-ktx:1.2.0' implementation 'com.github.ligi:KAXT:1.0' implementation 'com.github.ligi:tracedroid:4.1' - implementation 'com.jakewharton.timber:timber:4.7.1' + implementation 'com.jakewharton.timber:timber:5.0.1' implementation 'com.github.ligi.snackengage:snackengage-playrate:0.27' implementation 'com.github.ligi:ExtraCompats:1.0' implementation 'jchardet:jchardet:1.1.0' - implementation 'com.squareup.okhttp3:okhttp:3.10.0' + implementation 'com.squareup.okhttp3:okhttp:4.12.0' implementation 'com.n3twork.druid:alphanum:1.0.3' - implementation 'androidx.annotation:annotation:1.1.0' + implementation 'androidx.annotation:annotation:1.9.1' implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" implementation "com.chibatching.kotpref:kotpref:$kotpref_version" implementation "com.chibatching.kotpref:initializer:$kotpref_version" - withAnalyticsImplementation "com.google.android.gms:play-services-analytics:17.0.0" + withAnalyticsImplementation "com.google.android.gms:play-services-analytics:18.0.2" withCloudImplementation "com.google.android.gms:play-services-games:19.0.0" withCloudImplementation "com.google.android.gms:play-services-plus:17.0.0" withCloudImplementation "com.google.android.gms:play-services-gcm:17.0.0" withCloudImplementation('com.google.apis:google-api-services-games:v1-rev98-1.20.0') { exclude module: 'jsr305' } - androidTestImplementation 'androidx.test:runner:1.5.1' - androidTestImplementation 'androidx.test:rules:1.3.0' - androidTestImplementation 'org.hamcrest:hamcrest-library:2.2' - androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0' + androidTestImplementation 'androidx.test:runner:1.5.2' + androidTestImplementation 'androidx.test:rules:1.5.0' + androidTestImplementation 'org.hamcrest:hamcrest-library:3.0' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1' androidTestImplementation 'androidx.test.uiautomator:uiautomator:2.2.0' - androidTestImplementation 'com.github.ligi:trulesk:4.0' - androidTestImplementation 'androidx.annotation:annotation:1.1.0' + androidTestImplementation 'com.github.ligi:trulesk:4.3' + androidTestImplementation 'androidx.annotation:annotation:1.9.1' androidTestImplementation 'com.squareup.assertj:assertj-android:1.2.0' - androidTestImplementation 'androidx.test.ext:junit:1.1.3' + androidTestImplementation 'androidx.test.ext:junit:1.1.5' testImplementation 'com.squareup.assertj:assertj-android:1.2.0' - testImplementation 'androidx.annotation:annotation:1.1.0' + testImplementation 'androidx.annotation:annotation:1.9.1' testImplementation 'junit:junit:4.13.2' - implementation 'com.google.android:flexbox:2.0.1' - implementation 'org.greenrobot:eventbus:3.0.0' + implementation 'com.google.android.flexbox:flexbox:3.0.0' + implementation 'org.greenrobot:eventbus:3.3.1' } diff --git a/android/proguard-project.txt b/android/proguard-project.txt index 43a54e8e0..550ac36d7 100644 --- a/android/proguard-project.txt +++ b/android/proguard-project.txt @@ -138,3 +138,5 @@ -dontwarn org.conscrypt.** # A resource is loaded with a relative path so the package of this class must be preserved. -keepnames class okhttp3.internal.publicsuffix.PublicSuffixDatabase + +-dontwarn com.google.protobuf.java_com_google_android_gmscore_sdk* \ No newline at end of file diff --git a/android/src/androidTest/AndroidManifest.xml b/android/src/androidTest/AndroidManifest.xml index 032395c63..7b19e0010 100644 --- a/android/src/androidTest/AndroidManifest.xml +++ b/android/src/androidTest/AndroidManifest.xml @@ -1,6 +1,5 @@ - + diff --git a/android/src/main/AndroidManifest.xml b/android/src/main/AndroidManifest.xml index 9c15d7a55..c38f2ba89 100644 --- a/android/src/main/AndroidManifest.xml +++ b/android/src/main/AndroidManifest.xml @@ -1,8 +1,6 @@ + @@ -38,7 +37,8 @@ android:name="com.sec.android.app.multiwindow" android:required="false" /> - + @@ -49,7 +49,8 @@ @@ -63,7 +64,8 @@ - + @@ -73,7 +75,8 @@ android:name="org.ligi.gobandroid_hd.ui.go_terminology.GoTerminologyViewActivity" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:theme="@style/TransparentTheme"> + android:exported="true" + android:theme="@style/TransparentTheme"> @@ -96,7 +99,8 @@ android:exported="true" android:launchMode="singleInstance" /> - + @@ -218,7 +222,8 @@ - + diff --git a/android/src/main/java/org/ligi/gobandroid_hd/ui/BaseProfileActivity.kt b/android/src/main/java/org/ligi/gobandroid_hd/ui/BaseProfileActivity.kt index 9ba8a6515..477f07105 100644 --- a/android/src/main/java/org/ligi/gobandroid_hd/ui/BaseProfileActivity.kt +++ b/android/src/main/java/org/ligi/gobandroid_hd/ui/BaseProfileActivity.kt @@ -1,27 +1,28 @@ package org.ligi.gobandroid_hd.ui import android.os.Bundle -import kotlinx.android.synthetic.withCloud.profile.* import org.ligi.gobandroid_hd.R +import org.ligi.gobandroid_hd.databinding.ProfileBinding import org.ligi.gobandroid_hd.ui.application.GobandroidFragmentActivity class BaseProfileActivity : GobandroidFragmentActivity() { - + private lateinit var binding: ProfileBinding override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.profile) + binding = ProfileBinding.bind(pbinding.contentFrame.getChildAt(0)) + setTitle(R.string.profile) supportActionBar?.setDisplayShowTitleEnabled(true) - rank_edit.setText(GoPrefs.rank) - username_edit.setText(GoPrefs.username) + binding.rankEdit.setText(GoPrefs.rank) + binding.usernameEdit.setText(GoPrefs.username) } - override fun onPause() { - GoPrefs.rank = rank_edit.text.toString() - GoPrefs.username = username_edit.text.toString() + GoPrefs.rank = binding.rankEdit.text.toString() + GoPrefs.username = binding.usernameEdit.text.toString() super.onPause() } diff --git a/android/src/main/java/org/ligi/gobandroid_hd/ui/CustomActionBar.kt b/android/src/main/java/org/ligi/gobandroid_hd/ui/CustomActionBar.kt index 53e6509e8..5b3303714 100644 --- a/android/src/main/java/org/ligi/gobandroid_hd/ui/CustomActionBar.kt +++ b/android/src/main/java/org/ligi/gobandroid_hd/ui/CustomActionBar.kt @@ -12,14 +12,21 @@ import androidx.appcompat.app.AlertDialog import androidx.core.content.res.ResourcesCompat import com.github.salomonbrys.kodein.instance import com.github.salomonbrys.kodein.lazy -import kotlinx.android.synthetic.main.dropdown_item.view.* -import kotlinx.android.synthetic.main.top_nav_and_extras.view.* import org.greenrobot.eventbus.EventBus import org.greenrobot.eventbus.Subscribe import org.ligi.gobandroid_hd.App import org.ligi.gobandroid_hd.InteractionScope -import org.ligi.gobandroid_hd.InteractionScope.Mode.* +import org.ligi.gobandroid_hd.InteractionScope.Mode.COUNT +import org.ligi.gobandroid_hd.InteractionScope.Mode.EDIT +import org.ligi.gobandroid_hd.InteractionScope.Mode.GNUGO +import org.ligi.gobandroid_hd.InteractionScope.Mode.RECORD +import org.ligi.gobandroid_hd.InteractionScope.Mode.REVIEW +import org.ligi.gobandroid_hd.InteractionScope.Mode.SETUP +import org.ligi.gobandroid_hd.InteractionScope.Mode.TELEVIZE +import org.ligi.gobandroid_hd.InteractionScope.Mode.TSUMEGO import org.ligi.gobandroid_hd.R +import org.ligi.gobandroid_hd.databinding.DropdownItemBinding +import org.ligi.gobandroid_hd.databinding.TopNavAndExtrasBinding import org.ligi.gobandroid_hd.events.GameChangedEvent import org.ligi.gobandroid_hd.model.GameProvider import org.ligi.gobandroid_hd.ui.gnugo.GnuGoHelper @@ -27,6 +34,7 @@ import org.ligi.gobandroid_hd.ui.ingame_common.SwitchModeHelper import timber.log.Timber class CustomActionBar(private val activity: Activity) : LinearLayout(activity) { + private var binding: TopNavAndExtrasBinding private val GooglePlayStorePackageNameOld = "com.google.market" private val GooglePlayStorePackageNameNew = "com.android.vending" @@ -40,6 +48,7 @@ class CustomActionBar(private val activity: Activity) : LinearLayout(activity) { private val highlightColor: Int = ResourcesCompat.getColor(resources, R.color.dividing_color, null) private val transparent: Int = ResourcesCompat.getColor(resources, android.R.color.transparent, null) + override fun onAttachedToWindow() { super.onAttachedToWindow() EventBus.getDefault().register(this) @@ -51,29 +60,23 @@ class CustomActionBar(private val activity: Activity) : LinearLayout(activity) { } init { - - inflater.inflate(R.layout.top_nav_and_extras, this) + binding = TopNavAndExtrasBinding.inflate(inflater,this,true) refresh() - - mode_tv.setOnClickListener { + binding.modeTv.setOnClickListener { showModePopup(activity) } - - move_tv.setOnClickListener { + binding.moveTv.setOnClickListener { showModePopup(activity) } - - } private fun addItem(container: LinearLayout, image_resId: Int, str_resid: Int, listener: Runnable) { - - val v = inflater.inflate(R.layout.dropdown_item, container, false) - v.text.setText(str_resid) - v.image.setImageResource(image_resId) - v.click_container.setOnClickListener { listener.run() } - container.addView(v) + val bd = DropdownItemBinding.inflate(inflater,container,false) + bd.text.setText(str_resid) + bd.image.setImageResource(image_resId) + bd.clickContainer.setOnClickListener { listener.run() } + container.addView(bd.root) } private fun addModeItem(container: LinearLayout, mode: InteractionScope.Mode, string_res: Int, icon_res: Int, pop: BetterPopupWindow) { @@ -106,7 +109,7 @@ class CustomActionBar(private val activity: Activity) : LinearLayout(activity) { private fun showModePopup(ctx: Context) { - val pop = BetterPopupWindow(mode_tv) + val pop = BetterPopupWindow(binding.modeTv) val scrollView = ScrollView(ctx) val contentView = LinearLayout(ctx) @@ -153,22 +156,22 @@ class CustomActionBar(private val activity: Activity) : LinearLayout(activity) { post { val actMode = interactionScope.mode - mode_tv.setText(actMode.getStringRes()) + binding.modeTv.setText(actMode.getStringRes()) val game = gameProvider.get() - white_captures_tv.text = game.capturesWhite.toString() - black_captures_tv.text = game.capturesBlack.toString() + binding.whiteCapturesTv.text = game.capturesWhite.toString() + binding.blackCapturesTv.text = game.capturesBlack.toString() val isWhitesMove = !game.isBlackToMove && !game.isFinished - white_info_container.setBackgroundColor(if (isWhitesMove) highlightColor else transparent) - white_captures_tv.setBackgroundColor(if (isWhitesMove) highlightColor else transparent) + binding.whiteInfoContainer.setBackgroundColor(if (isWhitesMove) highlightColor else transparent) + binding.whiteCapturesTv.setBackgroundColor(if (isWhitesMove) highlightColor else transparent) val isBlacksMove = game.isBlackToMove || game.isFinished - blackStoneImageView.setBackgroundColor(if (isBlacksMove) highlightColor else transparent) - black_captures_tv.setBackgroundColor(if (isBlacksMove) highlightColor else transparent) + binding.blackStoneImageView.setBackgroundColor(if (isBlacksMove) highlightColor else transparent) + binding.blackCapturesTv.setBackgroundColor(if (isBlacksMove) highlightColor else transparent) - move_tv.text = app.resources.getString(R.string.move) + game.actMove.movePos + binding.moveTv.text = app.resources.getString(R.string.move) + game.actMove.movePos } } diff --git a/android/src/main/java/org/ligi/gobandroid_hd/ui/GoActivity.kt b/android/src/main/java/org/ligi/gobandroid_hd/ui/GoActivity.kt index 2c249071c..564504848 100644 --- a/android/src/main/java/org/ligi/gobandroid_hd/ui/GoActivity.kt +++ b/android/src/main/java/org/ligi/gobandroid_hd/ui/GoActivity.kt @@ -28,27 +28,38 @@ import android.content.Intent import android.os.Build import android.os.Bundle import android.print.PrintManager -import android.view.* +import android.view.KeyEvent +import android.view.Menu +import android.view.MenuItem +import android.view.MotionEvent +import android.view.View import android.view.View.OnKeyListener import android.view.View.OnTouchListener +import android.view.ViewGroup +import android.view.WindowManager import android.widget.Toast import androidx.annotation.StringRes import androidx.appcompat.app.AlertDialog import androidx.fragment.app.Fragment -import kotlinx.android.synthetic.main.game.* import org.greenrobot.eventbus.EventBus import org.greenrobot.eventbus.Subscribe import org.ligi.gobandroid_hd.BuildConfig import org.ligi.gobandroid_hd.InteractionScope import org.ligi.gobandroid_hd.R +import org.ligi.gobandroid_hd.databinding.GameBinding import org.ligi.gobandroid_hd.events.GameChangedEvent import org.ligi.gobandroid_hd.events.OptionsItemClickedEvent import org.ligi.gobandroid_hd.logic.Cell import org.ligi.gobandroid_hd.logic.GoGame -import org.ligi.gobandroid_hd.logic.GoGame.MoveStatus.* +import org.ligi.gobandroid_hd.logic.GoGame.MoveStatus.INVALID_CELL_NO_LIBERTIES +import org.ligi.gobandroid_hd.logic.GoGame.MoveStatus.INVALID_IS_KO +import org.ligi.gobandroid_hd.logic.GoGame.MoveStatus.INVALID_NOT_ON_BOARD import org.ligi.gobandroid_hd.logic.sgf.SGFWriter import org.ligi.gobandroid_hd.print.GoGamePrintDocumentAdapter -import org.ligi.gobandroid_hd.ui.GoSoundManager.Sound.* +import org.ligi.gobandroid_hd.ui.GoSoundManager.Sound.PICKUP1 +import org.ligi.gobandroid_hd.ui.GoSoundManager.Sound.PICKUP2 +import org.ligi.gobandroid_hd.ui.GoSoundManager.Sound.PLACE1 +import org.ligi.gobandroid_hd.ui.GoSoundManager.Sound.PLACE2 import org.ligi.gobandroid_hd.ui.alerts.GameInfoDialog import org.ligi.gobandroid_hd.ui.application.GobandroidFragmentActivity import org.ligi.gobandroid_hd.ui.fragments.DefaultGameExtrasFragment @@ -71,14 +82,14 @@ import java.io.BufferedWriter import java.io.File import java.io.FileWriter import java.io.IOException -import java.util.* +import java.util.Locale + /** * Activity for a Go Game */ @RuntimePermissions open class GoActivity : GobandroidFragmentActivity(), OnTouchListener, OnKeyListener { - var sound_man: GoSoundManager? = null private var info_toast: Toast? = null @@ -87,6 +98,7 @@ open class GoActivity : GobandroidFragmentActivity(), OnTouchListener, OnKeyList open val isBoardFocusWanted = true open val gameExtraFragment: Fragment = DefaultGameExtrasFragment() protected val bus = EventBus.getDefault() + lateinit var binding: GameBinding /** @@ -94,23 +106,34 @@ open class GoActivity : GobandroidFragmentActivity(), OnTouchListener, OnKeyList */ open fun isAsk4QuitEnabled() = true + @SuppressLint("MissingInflatedId") override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - setContentView(R.layout.game) - + binding = GameBinding.bind(pbinding.contentFrame.getChildAt(0)) if (!BuildConfig.DEBUG) { // if there where stacktraces collected -> give the user the option to send them if (!sendTraceDroidStackTracesIfExist("ligi@ligi.de", this)) { - SnackEngage.from(go_board) - .withSnack(RateSnack().withConditions(NeverAgainWhenClickedOnce(), AfterNumberOfOpportunities(42))) - .withSnack(TranslateSnack("https://www.transifex.com/ligi/gobandroid/").withConditions(AfterNumberOfOpportunities(4), - IsOneOfTheseLocales(Locale.KOREA, - Locale.KOREAN), - NeverAgainWhenClickedOnce())) - .build() - .engageWhenAppropriate() + SnackEngage.from(binding.goBoard) + .withSnack( + RateSnack().withConditions( + NeverAgainWhenClickedOnce(), + AfterNumberOfOpportunities(42) + ) + ) + .withSnack( + TranslateSnack("https://www.transifex.com/ligi/gobandroid/").withConditions( + AfterNumberOfOpportunities(4), + IsOneOfTheseLocales( + Locale.KOREA, + Locale.KOREAN + ), + NeverAgainWhenClickedOnce() + ) + ) + .build() + .engageWhenAppropriate() } } @@ -154,9 +177,9 @@ open class GoActivity : GobandroidFragmentActivity(), OnTouchListener, OnKeyList * find the go board widget and set up some properties */ private fun setupBoard() { - go_board.setOnTouchListener(this) - go_board.setOnKeyListener(this) - go_board.move_stone_mode = false + binding.goBoard.setOnTouchListener(this) + binding.goBoard.setOnKeyListener(this) + binding.goBoard.move_stone_mode = false } @@ -164,26 +187,21 @@ open class GoActivity : GobandroidFragmentActivity(), OnTouchListener, OnKeyList * set some preferences on the go board - intended to be called in onResume */ private fun setBoardPreferences() { - if (go_board == null) { - Timber.w("setBoardPreferences() called with go_board==null - means setupBoard() was propably not called - skipping to not FC") - return - } - - go_board.do_legend = GoPrefs.isLegendEnabled - go_board.legend_sgf_mode = GoPrefs.isSGFLegendEnabled - go_board.setLineSize(GoPrefs.boardLineWidth.toFloat()) + binding.goBoard.do_legend = GoPrefs.isLegendEnabled + binding.goBoard.legend_sgf_mode = GoPrefs.isSGFLegendEnabled + binding.goBoard.setLineSize(GoPrefs.boardLineWidth.toFloat()) } override fun onResume() { super.onResume() if (isBoardFocusWanted) { - go_board.isFocusableInTouchMode = true - go_board.isFocusable = true - go_board.requestFocus() + binding.goBoard.isFocusableInTouchMode = true + binding.goBoard.isFocusable = true + binding.goBoard.requestFocus() } else { - go_board.isFocusableInTouchMode = false - go_board.isFocusable = false + binding.goBoard.isFocusableInTouchMode = false + binding.goBoard.isFocusable = false } setBoardPreferences() @@ -191,7 +209,8 @@ open class GoActivity : GobandroidFragmentActivity(), OnTouchListener, OnKeyList bus.register(this) } - override fun doFullScreen() = GoPrefs.isFullscreenEnabled or resources.getBoolean(R.bool.force_fullscreen) + override fun doFullScreen() = + GoPrefs.isFullscreenEnabled or resources.getBoolean(R.bool.force_fullscreen) override fun onCreateOptionsMenu(menu: Menu) = super.onCreateOptionsMenu(menu.apply { menuInflater.inflate(R.menu.ingame_common, this) @@ -257,7 +276,10 @@ open class GoActivity : GobandroidFragmentActivity(), OnTouchListener, OnKeyList return super.onOptionsItemSelected(item) } - @NeedsPermission(android.Manifest.permission.READ_EXTERNAL_STORAGE, android.Manifest.permission.WRITE_EXTERNAL_STORAGE) + @NeedsPermission( + android.Manifest.permission.READ_EXTERNAL_STORAGE, + android.Manifest.permission.WRITE_EXTERNAL_STORAGE + ) fun prepareSave() { SaveSGFDialog(this).show() } @@ -281,11 +303,11 @@ open class GoActivity : GobandroidFragmentActivity(), OnTouchListener, OnKeyList finish() } else { AlertDialog.Builder(this).setTitle(R.string.end_game_quesstion_title) - .setMessage(R.string.quit_confirm) - .setPositiveButton(R.string.yes) { _, _ -> finish() } - .setCancelable(true) - .setNegativeButton(R.string.no, null) - .show() + .setMessage(R.string.quit_confirm) + .setPositiveButton(R.string.yes) { _, _ -> finish() } + .setCancelable(true) + .setNegativeButton(R.string.no, null) + .show() } } @@ -315,7 +337,7 @@ open class GoActivity : GobandroidFragmentActivity(), OnTouchListener, OnKeyList val res = game.do_move(cell) - if (res== INVALID_IS_KO || res == INVALID_CELL_NO_LIBERTIES) { + if (res == INVALID_IS_KO || res == INVALID_CELL_NO_LIBERTIES) { showInfoToast(getToastForResult(res)) } @@ -331,20 +353,20 @@ open class GoActivity : GobandroidFragmentActivity(), OnTouchListener, OnKeyList fun game2ui() { - go_board.postInvalidate() + binding.goBoard.postInvalidate() refreshZoomFragment() } protected fun eventForZoomBoard(event: MotionEvent) { - interactionScope.touchCell = go_board.pixel2cell(event.x, event.y) + interactionScope.touchCell = binding.goBoard.pixel2cell(event.x, event.y) if (!app.isTesting) { if (event.action == MotionEvent.ACTION_UP) { - game_extra_container.visibility = View.VISIBLE - zoom_board!!.visibility = View.GONE + binding.gameExtraContainer.visibility = View.VISIBLE + binding.zoomBoard.visibility = View.GONE } else if (event.action == MotionEvent.ACTION_DOWN) { - game_extra_container.visibility = View.GONE - zoom_board!!.visibility = View.VISIBLE + binding.gameExtraContainer.visibility = View.GONE + binding.zoomBoard.visibility = View.VISIBLE } } refreshZoomFragment() @@ -381,7 +403,7 @@ open class GoActivity : GobandroidFragmentActivity(), OnTouchListener, OnKeyList public override fun onPause() { - go_board.move_stone_mode = false + binding.goBoard.move_stone_mode = false if (doAutoSave()) { try { @@ -405,26 +427,30 @@ open class GoActivity : GobandroidFragmentActivity(), OnTouchListener, OnKeyList super.onPause() } - open fun doAutoSave()= false + open fun doAutoSave() = false open fun doTouch(event: MotionEvent) { // calculate position on the field by position on the touchscreen when (event.action) { - MotionEvent.ACTION_DOWN, MotionEvent.ACTION_MOVE -> interactionScope.touchCell = go_board.pixel2cell(event.x, event.y) + MotionEvent.ACTION_DOWN, MotionEvent.ACTION_MOVE -> interactionScope.touchCell = + binding.goBoard.pixel2cell(event.x, event.y) MotionEvent.ACTION_OUTSIDE -> interactionScope.touchCell = null MotionEvent.ACTION_UP -> { - if (go_board.move_stone_mode) { + if (binding.goBoard.move_stone_mode) { // TODO check if this is an illegal move ( e.g. in variants ) - if (interactionScope.touchCell != null && game.visualBoard.isCellFree(interactionScope.touchCell!!)) { + if (interactionScope.touchCell != null && game.visualBoard.isCellFree( + interactionScope.touchCell!! + ) + ) { game.repositionActMove(interactionScope.touchCell!!) } - go_board.move_stone_mode = false // moving of stone done + binding.goBoard.move_stone_mode = false // moving of stone done } else if (game.actMove.isOnCell(interactionScope.touchCell)) { initializeStoneMove() } else { @@ -441,16 +467,17 @@ open class GoActivity : GobandroidFragmentActivity(), OnTouchListener, OnKeyList open fun initializeStoneMove() { - if (go_board.move_stone_mode) { // already in the mode + if (binding.goBoard.move_stone_mode) { // already in the mode return // -> do nothing } - go_board.move_stone_mode = true + binding.goBoard.move_stone_mode = true // TODO check if we only want this in certain modes if (GoPrefs.isAnnounceMoveActive) { - AlertDialog.Builder(this).setMessage(R.string.hint_stone_move).setPositiveButton(R.string.ok + AlertDialog.Builder(this).setMessage(R.string.hint_stone_move).setPositiveButton( + R.string.ok ) { _, _ -> GoPrefs.isAnnounceMoveActive = false }.show() } @@ -458,7 +485,8 @@ open class GoActivity : GobandroidFragmentActivity(), OnTouchListener, OnKeyList override fun onKey(v: View, keyCode: Int, event: KeyEvent): Boolean { if (event.action == KeyEvent.ACTION_DOWN) { - val ensuredTouchPosition = interactionScope.touchCell ?: game.statelessGoBoard.getCell(0, 0) + val ensuredTouchPosition = + interactionScope.touchCell ?: game.statelessGoBoard.getCell(0, 0) val boardCell = game.statelessGoBoard.getCell(ensuredTouchPosition) when (keyCode) { KeyEvent.KEYCODE_DPAD_UP -> if (boardCell.up != null) { @@ -490,7 +518,7 @@ open class GoActivity : GobandroidFragmentActivity(), OnTouchListener, OnKeyList else -> return false } - go_board.postInvalidate() + binding.goBoard.postInvalidate() refreshZoomFragment() return true } @@ -498,12 +526,12 @@ open class GoActivity : GobandroidFragmentActivity(), OnTouchListener, OnKeyList } fun refreshZoomFragment() { - zoom_board!!.postInvalidate() + binding.zoomBoard.postInvalidate() } open fun requestUndo() { - go_board.move_stone_mode = false + binding.goBoard.move_stone_mode = false UndoWithVariationDialog.userInvokedUndo(this, interactionScope, game) } diff --git a/android/src/main/java/org/ligi/gobandroid_hd/ui/GoPrefsFragment.kt b/android/src/main/java/org/ligi/gobandroid_hd/ui/GoPrefsFragment.kt index 615738694..172db45a7 100644 --- a/android/src/main/java/org/ligi/gobandroid_hd/ui/GoPrefsFragment.kt +++ b/android/src/main/java/org/ligi/gobandroid_hd/ui/GoPrefsFragment.kt @@ -24,7 +24,7 @@ class GoPrefsFragment : PreferenceFragmentCompat(), SharedPreferences.OnSharedPr preferenceScreen = null addPreferencesFromResource(R.xml.preferences) - preferenceScreen.sharedPreferences.registerOnSharedPreferenceChangeListener(this) + preferenceScreen.sharedPreferences?.registerOnSharedPreferenceChangeListener(this) // fullscreen setting is not useful when fullscreen is forced for small devices val isFullscreenUseful = !resources.getBoolean(R.bool.force_fullscreen) @@ -35,10 +35,10 @@ class GoPrefsFragment : PreferenceFragmentCompat(), SharedPreferences.OnSharedPr override fun onPause() { super.onPause() - preferenceScreen.sharedPreferences.unregisterOnSharedPreferenceChangeListener(this) + preferenceScreen.sharedPreferences?.unregisterOnSharedPreferenceChangeListener(this) } - override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences, key: String) { + override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences, key: String?) { if (key == getString(R.string.prefs_daynight)) { AppCompatDelegate.setDefaultNightMode(GoPrefs.getThemeInt()) requireActivity().recreate() diff --git a/android/src/main/java/org/ligi/gobandroid_hd/ui/GobandroidDialog.kt b/android/src/main/java/org/ligi/gobandroid_hd/ui/GobandroidDialog.kt index 0d672adde..1f1f5754e 100644 --- a/android/src/main/java/org/ligi/gobandroid_hd/ui/GobandroidDialog.kt +++ b/android/src/main/java/org/ligi/gobandroid_hd/ui/GobandroidDialog.kt @@ -7,17 +7,18 @@ import androidx.annotation.DrawableRes import androidx.annotation.LayoutRes import androidx.annotation.StringRes import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup import android.view.Window import android.view.WindowManager import android.widget.Button -import android.widget.LinearLayout import android.widget.LinearLayout.LayoutParams -import android.widget.TextView import com.github.salomonbrys.kodein.instance import com.github.salomonbrys.kodein.lazy import org.ligi.gobandroid_hd.App import org.ligi.gobandroid_hd.InteractionScope import org.ligi.gobandroid_hd.R +import org.ligi.gobandroid_hd.databinding.DialogGobandroidBinding import org.ligi.gobandroid_hd.model.GameProvider import org.ligi.gobandroid_hd.ui.application.GoAndroidEnvironment @@ -25,21 +26,19 @@ import org.ligi.gobandroid_hd.ui.application.GoAndroidEnvironment * A styled Dialog fit in the gobandroid style */ open class GobandroidDialog(context: Context) : Dialog(context, R.style.dialog_theme) { + lateinit var pbinding: DialogGobandroidBinding ; - private val inflater: LayoutInflater - private val button_container by lazy { findViewById(R.id.button_container) as LinearLayout } - val container by lazy { findViewById(R.id.dialog_content) as LinearLayout } + private val inflater: LayoutInflater = LayoutInflater.from(context) val positive_btn: Button by lazy { createButton().apply { - button_container.addView(this) + pbinding.buttonContainer.addView(this) } } - val negative_btn: Button by lazy { createButton().apply { - button_container.addView(this) + pbinding.buttonContainer.addView(this) } } @@ -48,9 +47,9 @@ open class GobandroidDialog(context: Context) : Dialog(context, R.style.dialog_t val interactionScope: InteractionScope by App.kodein.lazy.instance() init { - inflater = LayoutInflater.from(context) requestWindowFeature(Window.FEATURE_NO_TITLE) - super.setContentView(R.layout.dialog_gobandroid) + pbinding = DialogGobandroidBinding.inflate(inflater) + super.setContentView(pbinding.root) // this sounds misleading but behaves right - we just do not want to start with keyboard open window!!.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN) @@ -58,16 +57,15 @@ open class GobandroidDialog(context: Context) : Dialog(context, R.style.dialog_t } fun setIconResource(@DrawableRes icon: Int) { - (findViewById(R.id.dialog_title) as TextView).setCompoundDrawablesWithIntrinsicBounds(icon, 0, 0, 0) + pbinding.dialogTitle.setCompoundDrawablesWithIntrinsicBounds(icon, 0, 0, 0) } override fun setContentView(@LayoutRes content: Int) { - container.addView(inflater.inflate(content, container, false)) + pbinding.dialogContent.addView(inflater.inflate(content, pbinding.dialogContent, false)) } - override fun setTitle(title: CharSequence?) { - (this.findViewById(R.id.dialog_title) as TextView).text = title + pbinding.dialogTitle.text = title } fun setPositiveButton(@StringRes text: Int, listener: (dialog: Dialog) -> Unit = { dismiss() }) { @@ -81,7 +79,6 @@ open class GobandroidDialog(context: Context) : Dialog(context, R.style.dialog_t negative_btn.setOnClickListener{ listener(this) } } - private fun createButton(): Button { val res = Button(context) val lp = LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT, 1f) diff --git a/android/src/main/java/org/ligi/gobandroid_hd/ui/GobandroidNotifications.kt b/android/src/main/java/org/ligi/gobandroid_hd/ui/GobandroidNotifications.kt index e0abb62da..0ba43fe75 100644 --- a/android/src/main/java/org/ligi/gobandroid_hd/ui/GobandroidNotifications.kt +++ b/android/src/main/java/org/ligi/gobandroid_hd/ui/GobandroidNotifications.kt @@ -94,7 +94,8 @@ class GobandroidNotifications(context: Context) { } private fun doNotify(id: Int) { - val pendingIntent = PendingIntent.getActivity(app, 0, notificationIntent, 0) + val pendingIntent = PendingIntent.getActivity(app, 0, notificationIntent, + PendingIntent.FLAG_IMMUTABLE) notificationBuilder.setContentIntent(pendingIntent) notificationManager.notify(id, notificationBuilder.build()) } diff --git a/android/src/main/java/org/ligi/gobandroid_hd/ui/SGFLoadActivity.kt b/android/src/main/java/org/ligi/gobandroid_hd/ui/SGFLoadActivity.kt index f47e345f4..ada9b9605 100644 --- a/android/src/main/java/org/ligi/gobandroid_hd/ui/SGFLoadActivity.kt +++ b/android/src/main/java/org/ligi/gobandroid_hd/ui/SGFLoadActivity.kt @@ -245,9 +245,9 @@ class SGFLoadActivity : GobandroidFragmentActivity(), Runnable, SGFReader.ISGFLo act_message = resources.getString(R.string.move) + " " + progress_val runOnUiThread { - dlg.progress.progress = act_progress - dlg.progress.max = max_progress - dlg.message.text = act_message + dlg.binding.progressBar.progress = act_progress + dlg.binding.progressBar.max = max_progress + dlg.binding.message.text = act_message } } diff --git a/android/src/main/java/org/ligi/gobandroid_hd/ui/UnzipSGFsDialog.kt b/android/src/main/java/org/ligi/gobandroid_hd/ui/UnzipSGFsDialog.kt index 3d8c475e9..edcf6a7c2 100644 --- a/android/src/main/java/org/ligi/gobandroid_hd/ui/UnzipSGFsDialog.kt +++ b/android/src/main/java/org/ligi/gobandroid_hd/ui/UnzipSGFsDialog.kt @@ -13,10 +13,10 @@ class UnzipSGFsDialog(val activity: Activity, val intent_after_finish: Intent, s init { setTitle("Copying") - progress.isIndeterminate = true + binding.progressBar.isIndeterminate = true Thread({ - val callback: (String) -> Unit = { activity.runOnUiThread { message.text = it } } + val callback: (String) -> Unit = { activity.runOnUiThread { binding.message.text = it } } decompress(activity.assets, arrayOf("sgf_init"), settings.SGFBasePath, callback) activity.runOnUiThread { diff --git a/android/src/main/java/org/ligi/gobandroid_hd/ui/alerts/GameForwardAlert.kt b/android/src/main/java/org/ligi/gobandroid_hd/ui/alerts/GameForwardAlert.kt index 9d06a824a..654370dab 100644 --- a/android/src/main/java/org/ligi/gobandroid_hd/ui/alerts/GameForwardAlert.kt +++ b/android/src/main/java/org/ligi/gobandroid_hd/ui/alerts/GameForwardAlert.kt @@ -17,11 +17,12 @@ package org.ligi.gobandroid_hd.ui.alerts import android.content.Context +import android.view.LayoutInflater import android.view.View import android.widget.Button import android.widget.LinearLayout -import kotlinx.android.synthetic.main.dialog_game_forward.view.* import org.ligi.gobandroid_hd.R +import org.ligi.gobandroid_hd.databinding.DialogGameForwardBinding import org.ligi.gobandroid_hd.logic.GoGame import org.ligi.gobandroid_hd.logic.markers.TextMarker import org.ligi.gobandroid_hd.ui.GoPrefs @@ -38,14 +39,16 @@ import org.ligi.gobandroid_hd.ui.GobandroidDialog * * License: This software is licensed with GPLv3 */ class GameForwardAlert(context: Context, game: GoGame) : GobandroidDialog(context) { + private val binding: DialogGameForwardBinding init { setContentView(R.layout.dialog_game_forward) + binding = DialogGameForwardBinding.bind(pbinding.dialogContent.getChildAt(0)) // show the comment when there is one - useful for SGF game problems val variationCount = game.possibleVariationCount - container.message.text = if (game.actMove.hasComment()) { + binding.message.text = if (game.actMove.hasComment()) { game.actMove.comment } else { "$variationCount " + context.getString(R.string.variations_found) @@ -58,7 +61,7 @@ class GameForwardAlert(context: Context, game: GoGame) : GobandroidDialog(contex game.redo(it.tag as Int) } - if (container.variant_promote_tips.isChecked) { + if (binding.variantPromoteTips.isChecked) { GoPrefs.isShowForwardAlertWanted = false } } @@ -80,7 +83,7 @@ class GameForwardAlert(context: Context, game: GoGame) : GobandroidDialog(contex var_btn.text = i.toString() } - container.buttonContainer.addView(var_btn) + binding.buttonContainer.addView(var_btn) var_btn.layoutParams = LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT, 1f) } diff --git a/android/src/main/java/org/ligi/gobandroid_hd/ui/alerts/GameInfoDialog.kt b/android/src/main/java/org/ligi/gobandroid_hd/ui/alerts/GameInfoDialog.kt index c61344a90..222fa05ff 100644 --- a/android/src/main/java/org/ligi/gobandroid_hd/ui/alerts/GameInfoDialog.kt +++ b/android/src/main/java/org/ligi/gobandroid_hd/ui/alerts/GameInfoDialog.kt @@ -22,11 +22,11 @@ package org.ligi.gobandroid_hd.ui.alerts import android.content.Context +import android.view.LayoutInflater +import android.view.ViewGroup import androidx.appcompat.app.AlertDialog -import android.view.View -import kotlinx.android.synthetic.main.dialog_gobandroid.view.* -import kotlinx.android.synthetic.main.game_info.view.* import org.ligi.gobandroid_hd.R +import org.ligi.gobandroid_hd.databinding.GameInfoBinding import org.ligi.gobandroid_hd.logic.GoGame import org.ligi.gobandroid_hd.ui.BaseProfileActivity import org.ligi.gobandroid_hd.ui.GoPrefs @@ -39,6 +39,7 @@ import org.ligi.kaxt.startActivityFromClass * Class to show an Alert with the Game Info ( who plays / rank / game name .. ) */ class GameInfoDialog(context: Context, game: GoGame) : GobandroidDialog(context) { + private val binding: GameInfoBinding private fun checkUserNamePresent(): Boolean { if (GoPrefs.username.isEmpty()) { @@ -52,63 +53,64 @@ class GameInfoDialog(context: Context, game: GoGame) : GobandroidDialog(context) setTitle(R.string.game_info) setIconResource(R.drawable.ic_action_info_outline) setContentView(R.layout.game_info) + binding = GameInfoBinding.bind(pbinding.dialogContent.getChildAt(0)) - container.dialog_content.black_name_et.doAfterEdit { - updateItsMeButtonVisibility(container.dialog_content) + binding.blackNameEt.doAfterEdit { + updateItsMeButtonVisibility() } - container.white_name_et.doAfterEdit { - updateItsMeButtonVisibility(container.dialog_content) + binding.whiteNameEt.doAfterEdit { + updateItsMeButtonVisibility() } - container.dialog_content.user_is_white_btn.setOnClickListener { + binding.userIsWhiteBtn.setOnClickListener { if (checkUserNamePresent()) { - container.dialog_content.white_name_et.setText(GoPrefs.username) - container.white_rank_et.setText(GoPrefs.rank) + binding.whiteNameEt.setText(GoPrefs.username) + binding.whiteRankEt.setText(GoPrefs.rank) } } - container.dialog_content.user_is_black_btn.setOnClickListener { + binding.userIsBlackBtn.setOnClickListener { if (checkUserNamePresent()) { - container.dialog_content.black_name_et.setText(GoPrefs.username) - container.dialog_content.black_rank_et.setText(GoPrefs.rank) + binding.blackNameEt.setText(GoPrefs.username) + binding.blackRankEt.setText(GoPrefs.rank) } } - container.button_komi_seven.setOnClickListener { - container.komi_et.setText("7.5") + binding.buttonKomiSeven.setOnClickListener { + binding.komiEt.setText("7.5") } - container.button_komi_six.setOnClickListener { - container.komi_et.setText("6.5") + binding.buttonKomiSix.setOnClickListener { + binding.komiEt.setText("6.5") } - container.button_komi_five.setOnClickListener { - container.komi_et.setText("5.5") + binding.buttonKomiFive.setOnClickListener { + binding.komiEt.setText("5.5") } - container.game_name_et.setText(game.metaData.name) - container.black_name_et.setText(game.metaData.blackName) - container.black_rank_et.setText(game.metaData.blackRank) - container.white_name_et.setText(game.metaData.whiteName) - container.white_rank_et.setText(game.metaData.whiteRank) - container.komi_et.setText(game.komi.toString()) - container.game_result_et.setText(game.metaData.result) - container.game_difficulty_et.setText(game.metaData.difficulty) - container.game_date_et.setText(game.metaData.date) - - updateItsMeButtonVisibility(container) + binding.gameNameEt.setText(game.metaData.name) + binding.blackNameEt.setText(game.metaData.blackName) + binding.blackRankEt.setText(game.metaData.blackRank) + binding.whiteNameEt.setText(game.metaData.whiteName) + binding.whiteRankEt.setText(game.metaData.whiteRank) + binding.komiEt.setText(game.komi.toString()) + binding.gameResultEt.setText(game.metaData.result) + binding.gameDifficultyEt.setText(game.metaData.difficulty) + binding.gameDateEt.setText(game.metaData.date) + + updateItsMeButtonVisibility() setPositiveButton(android.R.string.ok, { dialog -> - game.metaData.name = container.game_name_et.text.toString() - game.metaData.blackName = container.black_name_et.text.toString() - game.metaData.blackRank = container.black_rank_et.text.toString() - game.metaData.whiteName = container.white_name_et.text.toString() - game.metaData.whiteRank = container.white_rank_et.text.toString() - game.metaData.date = container.game_date_et.text.toString() + game.metaData.name = binding.gameNameEt.text.toString() + game.metaData.blackName = binding.blackNameEt.text.toString() + game.metaData.blackRank = binding.blackRankEt.text.toString() + game.metaData.whiteName = binding.whiteNameEt.text.toString() + game.metaData.whiteRank = binding.whiteRankEt.text.toString() + game.metaData.date = binding.gameDateEt.text.toString() try { - game.komi = java.lang.Float.valueOf(container.komi_et.text.toString()) + game.komi = java.lang.Float.valueOf(binding.komiEt.text.toString()) } catch (ne: NumberFormatException) { AlertDialog.Builder(context).setMessage(R.string.komi_must_be_a_number) .setPositiveButton(android.R.string.ok, null) @@ -116,13 +118,13 @@ class GameInfoDialog(context: Context, game: GoGame) : GobandroidDialog(context) .show() } - game.metaData.result = container.game_result_et.text.toString() + game.metaData.result = binding.gameResultEt.text.toString() dialog.dismiss() }) } - private fun updateItsMeButtonVisibility(content: View) { - content.user_is_white_btn.setVisibility(content.white_name_et.text.toString().isEmpty()) - content.user_is_black_btn.setVisibility(content.black_name_et.text.toString().isEmpty()) + private fun updateItsMeButtonVisibility() { + binding.userIsWhiteBtn.setVisibility(binding.whiteNameEt.text.toString().isEmpty()) + binding.userIsBlackBtn.setVisibility(binding.blackNameEt.text.toString().isEmpty()) } } \ No newline at end of file diff --git a/android/src/main/java/org/ligi/gobandroid_hd/ui/alerts/ProgressDialog.kt b/android/src/main/java/org/ligi/gobandroid_hd/ui/alerts/ProgressDialog.kt index c3034411f..a05427dcd 100644 --- a/android/src/main/java/org/ligi/gobandroid_hd/ui/alerts/ProgressDialog.kt +++ b/android/src/main/java/org/ligi/gobandroid_hd/ui/alerts/ProgressDialog.kt @@ -17,17 +17,17 @@ package org.ligi.gobandroid_hd.ui.alerts import android.content.Context -import kotlinx.android.synthetic.main.dialog_game_load.view.* +import android.view.LayoutInflater import org.ligi.gobandroid_hd.R +import org.ligi.gobandroid_hd.databinding.DialogGameLoadBinding import org.ligi.gobandroid_hd.ui.GobandroidDialog open class ProgressDialog(context: Context) : GobandroidDialog(context) { - - val message by lazy { container.message} - val progress by lazy { container.progressBar} + val binding: DialogGameLoadBinding init { setContentView(R.layout.dialog_game_load) + binding = DialogGameLoadBinding.bind(pbinding.dialogContent.getChildAt(0)) setCancelable(false) } diff --git a/android/src/main/java/org/ligi/gobandroid_hd/ui/application/GobandroidFragmentActivity.kt b/android/src/main/java/org/ligi/gobandroid_hd/ui/application/GobandroidFragmentActivity.kt index 62fb01709..ce629e950 100644 --- a/android/src/main/java/org/ligi/gobandroid_hd/ui/application/GobandroidFragmentActivity.kt +++ b/android/src/main/java/org/ligi/gobandroid_hd/ui/application/GobandroidFragmentActivity.kt @@ -1,22 +1,27 @@ package org.ligi.gobandroid_hd.ui.application +import android.annotation.SuppressLint import android.app.Activity import android.content.Intent import android.content.res.Configuration import android.net.Uri import android.os.Bundle -import android.view.* +import android.view.KeyEvent +import android.view.MenuItem +import android.view.ViewConfiguration +import android.view.ViewGroup +import android.view.WindowManager import androidx.appcompat.app.ActionBarDrawerToggle import androidx.appcompat.app.AppCompatActivity import androidx.drawerlayout.widget.DrawerLayout import com.github.salomonbrys.kodein.instance import com.github.salomonbrys.kodein.lazy import com.google.android.material.navigation.NavigationView -import kotlinx.android.synthetic.main.navigation_drawer_container.* import org.greenrobot.eventbus.EventBus import org.ligi.gobandroid_hd.App import org.ligi.gobandroid_hd.InteractionScope import org.ligi.gobandroid_hd.R +import org.ligi.gobandroid_hd.databinding.NavigationDrawerContainerBinding import org.ligi.gobandroid_hd.events.GameChangedEvent import org.ligi.gobandroid_hd.logic.GoGame import org.ligi.gobandroid_hd.model.GameProvider @@ -36,18 +41,20 @@ import java.io.File open class GobandroidFragmentActivity : AppCompatActivity() { val env: GoAndroidEnvironment by App.kodein.lazy.instance() - val interactionScope: InteractionScope by App.kodein.lazy.instance() - val gameProvider: GameProvider by App.kodein.lazy.instance() + val interactionScope: InteractionScope by App.kodein.lazy.instance() + val gameProvider: GameProvider by App.kodein.lazy.instance() private var drawerToggle: ActionBarDrawerToggle? = null - private var drawerLayout: DrawerLayout? = null + //private var drawerLayout: DrawerLayout? = null + lateinit var pbinding: NavigationDrawerContainerBinding + @SuppressLint("SoonBlockedPrivateApi") public override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) + pbinding = NavigationDrawerContainerBinding.inflate(layoutInflater) + setContentView(pbinding.root) - if (supportActionBar != null) {// yes this happens - e.g. - supportActionBar!!.setDisplayHomeAsUpEnabled(true) - } + supportActionBar?.setDisplayHomeAsUpEnabled(true) // a little hack because I strongly disagree with the style guide here // ;-) // not having the Actionbar overflow menu also with devices with hardware @@ -55,11 +62,10 @@ open class GobandroidFragmentActivity : AppCompatActivity() { // http://stackoverflow.com/questions/9286822/how-to-force-use-of-overflow-menu-on-devices-with-menu-button try { val config = ViewConfiguration.get(this) - val menuKeyField = ViewConfiguration::class.java.getDeclaredField("sHasPermanentMenuKey") - if (menuKeyField != null) { - menuKeyField.isAccessible = true - menuKeyField.setBoolean(config, false) - } + val menuKeyField = + ViewConfiguration::class.java.getDeclaredField("sHasPermanentMenuKey") + menuKeyField.isAccessible = true + menuKeyField.setBoolean(config, false) } catch (ignored: Exception) { // Ignore - but at least we tried ;-) } @@ -68,18 +74,18 @@ open class GobandroidFragmentActivity : AppCompatActivity() { if (supportActionBar != null && supportActionBar!!.customView != null) { this.supportActionBar!!.customView.isFocusable = false } + + } - fun closeDrawers() { - drawerLayout!!.closeDrawers() + private fun closeDrawers() { + pbinding.drawerLayout.closeDrawers() } override fun setContentView(layoutResId: Int) { - super.setContentView(R.layout.navigation_drawer_container) - - layoutInflater.inflate(layoutResId, findViewById(R.id.content_frame)) + layoutInflater.inflate(layoutResId, pbinding.contentFrame) - left_drawer.setNavigationItemSelectedListener(NavigationView.OnNavigationItemSelectedListener { item -> + pbinding.leftDrawer.setNavigationItemSelectedListener(NavigationView.OnNavigationItemSelectedListener { item -> val function = actionMap[item.itemId] if (function != null) { closeDrawers() @@ -89,15 +95,15 @@ open class GobandroidFragmentActivity : AppCompatActivity() { return@OnNavigationItemSelectedListener false }) - drawerLayout = findViewById(R.id.drawer_layout) as DrawerLayout - - drawerToggle = object : ActionBarDrawerToggle(this, /* host Activity */ - drawerLayout, /* DrawerLayout object */ - R.string.drawer_open, /* "open drawer" description */ - R.string.drawer_close /* "close drawer" description */) { + drawerToggle = object : ActionBarDrawerToggle( + this, /* host Activity */ + pbinding.drawerLayout, /* DrawerLayout object */ + R.string.drawer_open, /* "open drawer" description */ + R.string.drawer_close /* "close drawer" description */ + ) { } - drawerLayout!!.setDrawerListener(drawerToggle) + pbinding.drawerLayout.setDrawerListener(drawerToggle) } override fun onOptionsItemSelected(item: MenuItem): Boolean { @@ -131,7 +137,10 @@ open class GobandroidFragmentActivity : AppCompatActivity() { //NaDra mMenuDrawer.refresh(); if (doFullScreen()) { - window.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN) + window.setFlags( + WindowManager.LayoutParams.FLAG_FULLSCREEN, + WindowManager.LayoutParams.FLAG_FULLSCREEN + ) } else { window.clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN) } @@ -154,47 +163,52 @@ open class GobandroidFragmentActivity : AppCompatActivity() { val actionMap by lazy { mapOf( - R.id.menu_drawer_empty to { - val act_game = gameProvider.get() - gameProvider.set(GoGame(act_game.size.toByte().toInt(), act_game.handicap.toByte().toInt())) - EventBus.getDefault().post(GameChangedEvent) - startForClass(GameRecordActivity::class.java) - }, - - R.id.menu_drawer_links to { - startForClass(LinksActivity::class.java) - }, - - R.id.menu_drawer_settings to { - startForClass(GoPrefsActivity::class.java) - }, - - R.id.menu_drawer_tsumego to { - startForPathWithPermissionCheck(env.tsumegoPath) - }, - - R.id.menu_drawer_review to { - val path = env.reviewPath - startForPathWithPermissionCheck(path) - - }, - - R.id.menu_drawer_bookmark to { - startActivity(startSGFListForPath(env.bookmarkPath)) - }, - - - R.id.menu_drawer_profile to { - startActivity(Intent(this, BaseProfileActivity::class.java)) - }, - - R.id.menu_drawer_beta to { - startActivityFromURL("https://play.google.com/apps/testing/org.ligi.gobandroid_hd") - }, - - R.id.menu_drawer_translation to { - startActivityFromURL("https://www.transifex.com/ligi/gobandroid") - } + R.id.menu_drawer_empty to { + val act_game = gameProvider.get() + gameProvider.set( + GoGame( + act_game.size.toByte().toInt(), + act_game.handicap.toByte().toInt() + ) + ) + EventBus.getDefault().post(GameChangedEvent) + startForClass(GameRecordActivity::class.java) + }, + + R.id.menu_drawer_links to { + startForClass(LinksActivity::class.java) + }, + + R.id.menu_drawer_settings to { + startForClass(GoPrefsActivity::class.java) + }, + + R.id.menu_drawer_tsumego to { + startForPathWithPermissionCheck(env.tsumegoPath) + }, + + R.id.menu_drawer_review to { + val path = env.reviewPath + startForPathWithPermissionCheck(path) + + }, + + R.id.menu_drawer_bookmark to { + startActivity(startSGFListForPath(env.bookmarkPath)) + }, + + + R.id.menu_drawer_profile to { + startActivity(Intent(this, BaseProfileActivity::class.java)) + }, + + R.id.menu_drawer_beta to { + startActivityFromURL("https://play.google.com/apps/testing/org.ligi.gobandroid_hd") + }, + + R.id.menu_drawer_translation to { + startActivityFromURL("https://www.transifex.com/ligi/gobandroid") + } ) } @@ -202,7 +216,10 @@ open class GobandroidFragmentActivity : AppCompatActivity() { startActivity(Intent(this, java).setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP)) } - @NeedsPermission(android.Manifest.permission.READ_EXTERNAL_STORAGE, android.Manifest.permission.WRITE_EXTERNAL_STORAGE) + @NeedsPermission( + android.Manifest.permission.READ_EXTERNAL_STORAGE, + android.Manifest.permission.WRITE_EXTERNAL_STORAGE + ) fun startForPath(path: File) { val next = startSGFListForPath(path) @@ -212,9 +229,10 @@ open class GobandroidFragmentActivity : AppCompatActivity() { } - private fun startSGFListForPath(path: File) = Intent(this, SGFFileSystemListActivity::class.java).apply { - data = Uri.parse("file://" + path.absolutePath) - } + private fun startSGFListForPath(path: File) = + Intent(this, SGFFileSystemListActivity::class.java).apply { + data = Uri.parse("file://" + path.absolutePath) + } /** * Downloads SGFs and shows a ProgressDialog when needed @@ -234,7 +252,11 @@ open class GobandroidFragmentActivity : AppCompatActivity() { } - override fun onRequestPermissionsResult(requestCode: Int, permissions: Array, grantResults: IntArray) { + override fun onRequestPermissionsResult( + requestCode: Int, + permissions: Array, + grantResults: IntArray + ) { super.onRequestPermissionsResult(requestCode, permissions, grantResults) onRequestPermissionsResult(requestCode, grantResults) } diff --git a/android/src/main/java/org/ligi/gobandroid_hd/ui/editing/EditGameExtrasFragment.kt b/android/src/main/java/org/ligi/gobandroid_hd/ui/editing/EditGameExtrasFragment.kt index 555aef28d..81d74ae7d 100644 --- a/android/src/main/java/org/ligi/gobandroid_hd/ui/editing/EditGameExtrasFragment.kt +++ b/android/src/main/java/org/ligi/gobandroid_hd/ui/editing/EditGameExtrasFragment.kt @@ -8,52 +8,56 @@ import android.view.View import android.view.ViewGroup import android.widget.AdapterView.OnItemClickListener import android.widget.BaseAdapter -import kotlinx.android.synthetic.main.edit_extras.* -import kotlinx.android.synthetic.main.edit_extras.view.* import org.ligi.gobandroid_hd.R +import org.ligi.gobandroid_hd.databinding.EditExtrasBinding import org.ligi.gobandroid_hd.events.GameChangedEvent import org.ligi.gobandroid_hd.ui.editing.model.EditGameMode import org.ligi.gobandroid_hd.ui.fragments.GobandroidGameAwareFragment import org.ligi.kaxt.doAfterEdit class EditGameExtrasFragment : GobandroidGameAwareFragment() { - + private var _binding: EditExtrasBinding? = null + private val binding get() = _binding!! override fun createView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View { val editModePool = (activity as EditGameActivity).statefulEditModeItems - val view = inflater.inflate(R.layout.edit_extras, container, false) + _binding = EditExtrasBinding.inflate(inflater, container, false) val editModeAdapter = EditModeButtonsAdapter(editModePool) - view.gridView.adapter = editModeAdapter + binding.gridView.adapter = editModeAdapter - view.gridView.onItemClickListener = OnItemClickListener { adapter, _, position, _ -> + binding.gridView.onItemClickListener = OnItemClickListener { adapter, _, position, _ -> editModePool.setModeByPosition(position) (adapter.adapter as BaseAdapter).notifyDataSetChanged() } - view.editSwitch.isChecked = true + binding.editSwitch.isChecked = true - view.editSwitch.setOnCheckedChangeListener { _, isChecked -> - view.gridView.visibility = if (isChecked) View.VISIBLE else View.GONE + binding.editSwitch.setOnCheckedChangeListener { _, isChecked -> + binding.gridView.visibility = if (isChecked) View.VISIBLE else View.GONE editModePool.mode = if (isChecked) EditGameMode.BLACK else EditGameMode.PLAY editModeAdapter.notifyDataSetChanged() } - view.comment_et.setText(gameProvider.get().actMove.comment) - view.comment_et.setHint(R.string.enter_your_comments_here) - view.comment_et.gravity = Gravity.TOP - view.comment_et.setTextColor(ContextCompat.getColor(requireContext(), R.color.text_color_on_board_bg)) + binding.commentEt.setText(gameProvider.get().actMove.comment) + binding.commentEt.setHint(R.string.enter_your_comments_here) + binding.commentEt.gravity = Gravity.TOP + binding.commentEt.setTextColor(ContextCompat.getColor(requireContext(), R.color.text_color_on_board_bg)) - view.comment_et.doAfterEdit { + binding.commentEt.doAfterEdit { gameProvider.get().actMove.comment = it.toString() } - return view + return binding.root + } + override fun onDestroyView() { + super.onDestroyView() + _binding = null } override fun onGoGameChanged(gameChangedEvent: GameChangedEvent?) { super.onGoGameChanged(gameChangedEvent) - activity?.runOnUiThread { comment_et.setText(gameProvider.get().actMove.comment) } + activity?.runOnUiThread { binding.commentEt.setText(gameProvider.get().actMove.comment) } } } diff --git a/android/src/main/java/org/ligi/gobandroid_hd/ui/fragments/CommentAndNowPlayingFragment.kt b/android/src/main/java/org/ligi/gobandroid_hd/ui/fragments/CommentAndNowPlayingFragment.kt index cd54ddff3..7efe70ab8 100644 --- a/android/src/main/java/org/ligi/gobandroid_hd/ui/fragments/CommentAndNowPlayingFragment.kt +++ b/android/src/main/java/org/ligi/gobandroid_hd/ui/fragments/CommentAndNowPlayingFragment.kt @@ -4,23 +4,29 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import kotlinx.android.synthetic.main.comment_textview.* import org.ligi.gobandroid_hd.R +import org.ligi.gobandroid_hd.databinding.GameExtraReviewBinding import org.ligi.gobandroid_hd.events.GameChangedEvent import org.ligi.gobandroid_hd.ui.go_terminology.GoTerminologyViewActivity class CommentAndNowPlayingFragment : GobandroidGameAwareFragment() { + private var _binding: GameExtraReviewBinding? = null + private val binding get() = _binding!! override fun createView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View { - val res = inflater.inflate(R.layout.game_extra_review, container, false) + _binding = GameExtraReviewBinding.inflate(inflater, container, false) onGoGameChanged(null) - return res + return binding.root + } + override fun onDestroyView() { + super.onDestroyView() + _binding = null } override fun onGoGameChanged(gameChangedEvent: GameChangedEvent?) { super.onGoGameChanged(gameChangedEvent) requireActivity().runOnUiThread { - comments_textview?.let { + binding.includeComment.commentsTextview.let { it.text = game.actMove.comment GoTerminologyViewActivity.linkifyTextView(it) } diff --git a/android/src/main/java/org/ligi/gobandroid_hd/ui/fragments/NavigationAndCommentFragment.kt b/android/src/main/java/org/ligi/gobandroid_hd/ui/fragments/NavigationAndCommentFragment.kt index caffabb18..2206f525d 100644 --- a/android/src/main/java/org/ligi/gobandroid_hd/ui/fragments/NavigationAndCommentFragment.kt +++ b/android/src/main/java/org/ligi/gobandroid_hd/ui/fragments/NavigationAndCommentFragment.kt @@ -5,34 +5,35 @@ import android.os.Handler import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import kotlinx.android.synthetic.main.comment_textview.* -import kotlinx.android.synthetic.main.comment_textview.view.* -import kotlinx.android.synthetic.main.game_extra_review.view.* import org.ligi.gobandroid_hd.R +import org.ligi.gobandroid_hd.databinding.GameExtraReviewBinding import org.ligi.gobandroid_hd.events.GameChangedEvent import org.ligi.gobandroid_hd.ui.go_terminology.GoTerminologyViewActivity class NavigationAndCommentFragment : GobandroidGameAwareFragment() { - + private var _binding: GameExtraReviewBinding? = null + private val binding get() = _binding!! private val gameChangeHandler by lazy { Handler() } override fun createView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View { + _binding = GameExtraReviewBinding.inflate(inflater, container, false) - val res = inflater.inflate(R.layout.game_extra_review, container, false) - - res.comments_textview.isFocusable = false - - res.scrollview.isFocusable = false + binding.includeComment.commentsTextview.isFocusable = false + binding.scrollview.isFocusable = false onGoGameChanged(null) - return res + return binding.root + } + override fun onDestroyView() { + super.onDestroyView() + _binding = null } override fun onGoGameChanged(gameChangedEvent: GameChangedEvent?) { super.onGoGameChanged(gameChangedEvent) gameChangeHandler.post { - comments_textview?.let { + binding.includeComment.commentsTextview.let { it.text = game.actMove.comment GoTerminologyViewActivity.linkifyTextView(it) } diff --git a/android/src/main/java/org/ligi/gobandroid_hd/ui/fragments/NavigationFragment.kt b/android/src/main/java/org/ligi/gobandroid_hd/ui/fragments/NavigationFragment.kt index 12cd74d73..7850d6093 100644 --- a/android/src/main/java/org/ligi/gobandroid_hd/ui/fragments/NavigationFragment.kt +++ b/android/src/main/java/org/ligi/gobandroid_hd/ui/fragments/NavigationFragment.kt @@ -7,24 +7,32 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.ImageView -import kotlinx.android.synthetic.main.nav_button_container.* import org.ligi.gobandroid_hd.R +import org.ligi.gobandroid_hd.databinding.NavButtonContainerBinding import org.ligi.gobandroid_hd.events.GameChangedEvent import org.ligi.gobandroid_hd.logic.GoMove import org.ligi.gobandroid_hd.ui.GoPrefs import org.ligi.gobandroid_hd.ui.alerts.GameForwardAlert class NavigationFragment : GobandroidGameAwareFragment() { + private var _binding: NavButtonContainerBinding? = null + private val binding get() = _binding!! override fun createView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View - = inflater.inflate(R.layout.nav_button_container, container, false) - + { + _binding = NavButtonContainerBinding.inflate(inflater, container, false) + return binding.root + } + override fun onDestroyView() { + super.onDestroyView() + _binding = null + } override fun onStart() { super.onStart() updateButtonStates() - btn_next.setOnClickListener { + binding.btnNext.setOnClickListener { if (GoPrefs.isShowForwardAlertWanted) { GameForwardAlert.showIfNeeded(requireActivity(), game) } else { @@ -32,13 +40,13 @@ class NavigationFragment : GobandroidGameAwareFragment() { } } - btn_prev.setOnClickListener { + binding.btnPrev.setOnClickListener { if (game.canUndo()) { game.undo() } } - btn_first.setOnClickListener { + binding.btnFirst.setOnClickListener { val nextJunction = game.findPrevJunction() if (nextJunction!!.isFirstMove) { game.jump(nextJunction) @@ -48,12 +56,12 @@ class NavigationFragment : GobandroidGameAwareFragment() { } } - btn_first.setOnLongClickListener { + binding.btnFirst.setOnLongClickListener { game.jump(game.findFirstMove()) true } - btn_last.setOnClickListener { + binding.btnLast.setOnClickListener { val nextJunction = game.findNextJunction() if (nextJunction!!.hasNextMove()) { showJunctionInfoSnack(R.string.found_junction_snack_for_last) @@ -63,7 +71,7 @@ class NavigationFragment : GobandroidGameAwareFragment() { } } - btn_last.setOnLongClickListener { + binding.btnLast.setOnLongClickListener { game.jump(game.findLastMove()) true } @@ -75,10 +83,10 @@ class NavigationFragment : GobandroidGameAwareFragment() { } private fun updateButtonStates() { - setImageViewState(game.canUndo(), btn_first, btn_prev) - setImageViewState(game.canRedo(), btn_next, btn_last) - bindButtonToMove(game.nextVariationWithOffset(-1), btn_previous_var) - bindButtonToMove(game.nextVariationWithOffset(1), btn_next_var) + setImageViewState(game.canUndo(), binding.btnFirst, binding.btnPrev) + setImageViewState(game.canRedo(), binding.btnNext, binding.btnLast) + bindButtonToMove(game.nextVariationWithOffset(-1), binding.btnPreviousVar) + bindButtonToMove(game.nextVariationWithOffset(1), binding.btnNextVar) } private fun bindButtonToMove(move: GoMove?, button: ImageView) { @@ -95,7 +103,7 @@ class NavigationFragment : GobandroidGameAwareFragment() { private fun showJunctionInfoSnack(found_junction_snack_for_last: Int) { if (!GoPrefs.hasAcknowledgedJunctionInfo) { - Snackbar.make(btn_last!!, found_junction_snack_for_last, Snackbar.LENGTH_LONG).setAction(android.R.string.ok) { GoPrefs.hasAcknowledgedJunctionInfo = true }.show() + Snackbar.make(binding.btnLast, found_junction_snack_for_last, Snackbar.LENGTH_LONG).setAction(android.R.string.ok) { GoPrefs.hasAcknowledgedJunctionInfo = true }.show() } } diff --git a/android/src/main/java/org/ligi/gobandroid_hd/ui/game_setup/GameSetupFragment.kt b/android/src/main/java/org/ligi/gobandroid_hd/ui/game_setup/GameSetupFragment.kt index a3305e2b3..f440b9ebe 100644 --- a/android/src/main/java/org/ligi/gobandroid_hd/ui/game_setup/GameSetupFragment.kt +++ b/android/src/main/java/org/ligi/gobandroid_hd/ui/game_setup/GameSetupFragment.kt @@ -8,19 +8,19 @@ import android.view.ViewGroup import android.widget.SeekBar import android.widget.SeekBar.OnSeekBarChangeListener import com.chibatching.kotpref.bulk -import kotlinx.android.synthetic.main.game.* -import kotlinx.android.synthetic.main.game_setup_inner.* import org.ligi.gobandroid_hd.InteractionScope import org.ligi.gobandroid_hd.R +import org.ligi.gobandroid_hd.databinding.GameSetupInnerBinding import org.ligi.gobandroid_hd.logic.GoGame import org.ligi.gobandroid_hd.ui.GoActivity import org.ligi.gobandroid_hd.ui.GoPrefs import org.ligi.gobandroid_hd.ui.fragments.GobandroidFragment class GameSetupFragment : GobandroidFragment(), OnSeekBarChangeListener { + private var _binding: GameSetupInnerBinding? = null + private val binding get() = _binding!! val size_offset = 2 - var act_size = GoPrefs.lastBoardSize var act_handicap = GoPrefs.lastHandicap var act_lineWidth = GoPrefs.boardLineWidth @@ -47,21 +47,25 @@ class GameSetupFragment : GobandroidFragment(), OnSeekBarChangeListener { } - override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { - val view = inflater.inflate(R.layout.game_setup_inner, container, false) - return view + _binding = GameSetupInnerBinding.inflate(inflater, container, false) + return binding.root + } + + override fun onDestroyView() { + super.onDestroyView() + _binding = null } override fun onStart() { - size_seek.setOnSeekBarChangeListener(this) - handicap_seek.setOnSeekBarChangeListener(this) - line_width_seek.setOnSeekBarChangeListener(this) + binding.sizeSeek.setOnSeekBarChangeListener(this) + binding.handicapSeek.setOnSeekBarChangeListener(this) + binding.lineWidthSeek.setOnSeekBarChangeListener(this) - size_button9x9.setOnClickListener { setSize(9) } - size_button13x13.setOnClickListener { setSize(13) } - size_button19x19.setOnClickListener { setSize(19) } + binding.sizeButton9x9.setOnClickListener { setSize(9) } + binding.sizeButton13x13.setOnClickListener { setSize(13) } + binding.sizeButton19x19.setOnClickListener { setSize(19) } refresh_ui() super.onStart() @@ -69,11 +73,11 @@ class GameSetupFragment : GobandroidFragment(), OnSeekBarChangeListener { override fun onProgressChanged(seekBar: SeekBar, progress: Int, fromUser: Boolean) { - if (seekBar === size_seek && act_size != (progress + size_offset)) { + if (seekBar === binding.sizeSeek && act_size != (progress + size_offset)) { setSize(progress + size_offset) - } else if (seekBar === handicap_seek) { + } else if (seekBar === binding.handicapSeek) { act_handicap = progress.toByte().toInt() - } else if (seekBar === line_width_seek) { + } else if (seekBar === binding.lineWidthSeek) { act_lineWidth = progress.toByte().toInt() } @@ -87,13 +91,13 @@ class GameSetupFragment : GobandroidFragment(), OnSeekBarChangeListener { */ fun refresh_ui() { - game_size_label.text = getString(R.string.size) + " " + act_size + "x" + act_size + binding.gameSizeLabel.text = getString(R.string.size) + " " + act_size + "x" + act_size if (!isAnimating()) { // only enable handicap seeker when the size is 9x9 or 13x13 or 19x19 - handicap_seek.isEnabled = act_size == 9 || act_size == 13 || act_size == 19 + binding.handicapSeek.isEnabled = act_size == 9 || act_size == 13 || act_size == 19 - handicap_label.text = if (handicap_seek.isEnabled) { + binding.handicapLabel.text = if (binding.handicapSeek.isEnabled) { getString(R.string.handicap) + " " + act_handicap } else { getString(R.string.handicap_only_for) @@ -102,14 +106,14 @@ class GameSetupFragment : GobandroidFragment(), OnSeekBarChangeListener { // the checks for change here are important - otherwise samsung moment // will die here with stack overflow - if (act_size - size_offset != size_seek.progress) size_seek.progress = act_size - size_offset + if (act_size - size_offset != binding.sizeSeek.progress) binding.sizeSeek.progress = act_size - size_offset - if (act_handicap != handicap_seek.progress) handicap_seek.progress = act_handicap + if (act_handicap != binding.handicapSeek.progress) binding.handicapSeek.progress = act_handicap - if (act_lineWidth != line_width_seek.progress) line_width_seek.progress = act_lineWidth + if (act_lineWidth != binding.lineWidthSeek.progress) binding.lineWidthSeek.progress = act_lineWidth if (interactionScope.mode === InteractionScope.Mode.GNUGO) - size_seek.max = 19 - size_offset + binding.sizeSeek.max = 19 - size_offset GoPrefs.bulk { lastBoardSize = act_size @@ -122,13 +126,13 @@ class GameSetupFragment : GobandroidFragment(), OnSeekBarChangeListener { } if (activity is GoActivity) { - val board = (activity as GoActivity).go_board + val board = (activity as GoActivity).binding.goBoard if (board != null) { board.regenerateStoneImagesWithNewSize() board.invalidate() - board.setLineSize(line_width_seek.progress.toFloat()) + board.setLineSize(binding.lineWidthSeek.progress.toFloat()) } } } diff --git a/android/src/main/java/org/ligi/gobandroid_hd/ui/gnugo/GnuGoSetupDialog.kt b/android/src/main/java/org/ligi/gobandroid_hd/ui/gnugo/GnuGoSetupDialog.kt index c92605acf..d3cd2eacd 100644 --- a/android/src/main/java/org/ligi/gobandroid_hd/ui/gnugo/GnuGoSetupDialog.kt +++ b/android/src/main/java/org/ligi/gobandroid_hd/ui/gnugo/GnuGoSetupDialog.kt @@ -2,54 +2,54 @@ package org.ligi.gobandroid_hd.ui.gnugo import android.content.Context import android.preference.PreferenceManager -import kotlinx.android.synthetic.main.setup_gnugo.view.* import org.ligi.gobandroid_hd.R +import org.ligi.gobandroid_hd.databinding.SetupGnugoBinding import org.ligi.gobandroid_hd.ui.GobandroidDialog import org.ligi.kaxt.doOnProgressChanged class GnuGoSetupDialog(context: Context) : GobandroidDialog(context) { - + private val binding: SetupGnugoBinding private val shared_prefs by lazy { PreferenceManager.getDefaultSharedPreferences(context) } init { - setTitle(R.string.gnugo) setIconResource(R.drawable.ic_action_settings) setContentView(R.layout.setup_gnugo) + binding = SetupGnugoBinding.bind(pbinding.dialogContent.getChildAt(0)) if (shared_prefs.getBoolean(SP_KEY_PLAYS_BOTH, false)) { - container.gnugo_plays_both_radio.isChecked = true + binding.gnugoPlaysBothRadio.isChecked = true } else if (shared_prefs.getBoolean(SP_KEY_PLAYS_WHITE, false)) { - container.gnugo_plays_white_radio.isChecked = true + binding.gnugoPlaysWhiteRadio.isChecked = true } else if (shared_prefs.getBoolean(SP_KEY_PLAYS_BLACK, false)) { - container.gnugo_plays_black_radio.isChecked = true + binding.gnugoPlaysBlackRadio.isChecked = true } else { // no former selection - default to black - container.gnugo_plays_black_radio.isChecked = true + binding.gnugoPlaysBlackRadio.isChecked = true } var level = shared_prefs.getInt(SP_KEY_STRENGTH, 0) - if (level > container.gnugo_strength_seek.max) { - level = container.gnugo_strength_seek.max + if (level > binding.gnugoStrengthSeek.max) { + level = binding.gnugoStrengthSeek.max } - container.gnugo_strength_seek.progress = level + binding.gnugoStrengthSeek.progress = level - container.gnugo_strength.text = getContext().getString(R.string.gnugo_strength) + " " + level.toString() + binding.gnugoStrength.text = getContext().getString(R.string.gnugo_strength) + " " + level.toString() - container.gnugo_strength_seek.doOnProgressChanged { progress, fromUser -> + binding.gnugoStrengthSeek.doOnProgressChanged { progress, fromUser -> if (fromUser) { - container.gnugo_strength.text = getContext().getString(R.string.gnugo_strength) + progress.toString() + binding.gnugoStrength.text = getContext().getString(R.string.gnugo_strength) + progress.toString() } } } - fun isWhiteActive() = container.gnugo_plays_white_radio.isChecked - fun isBlackActive() = container.gnugo_plays_black_radio.isChecked - fun isBothActive() = container.gnugo_plays_both_radio.isChecked - fun strength() = container.gnugo_strength_seek.progress + fun isWhiteActive() = binding.gnugoPlaysWhiteRadio.isChecked + fun isBlackActive() = binding.gnugoPlaysBlackRadio.isChecked + fun isBothActive() = binding.gnugoPlaysBothRadio.isChecked + fun strength() = binding.gnugoStrengthSeek.progress fun saveRecentAsDefault() { val edit = shared_prefs.edit() diff --git a/android/src/main/java/org/ligi/gobandroid_hd/ui/gnugo/PlayAgainstGnuGoActivity.kt b/android/src/main/java/org/ligi/gobandroid_hd/ui/gnugo/PlayAgainstGnuGoActivity.kt index 48e6c871a..1e3585064 100644 --- a/android/src/main/java/org/ligi/gobandroid_hd/ui/gnugo/PlayAgainstGnuGoActivity.kt +++ b/android/src/main/java/org/ligi/gobandroid_hd/ui/gnugo/PlayAgainstGnuGoActivity.kt @@ -107,7 +107,7 @@ class PlayAgainstGnuGoActivity : GoActivity(), Runnable { intent.component = name - app.bindService(intent, connection!!, Context.BIND_AUTO_CREATE) + app.bindService(intent, connection!!, BIND_AUTO_CREATE) Thread(this).start() diff --git a/android/src/main/java/org/ligi/gobandroid_hd/ui/go_terminology/GoTerminologyDialog.kt b/android/src/main/java/org/ligi/gobandroid_hd/ui/go_terminology/GoTerminologyDialog.kt index 23f563706..bdddc078c 100644 --- a/android/src/main/java/org/ligi/gobandroid_hd/ui/go_terminology/GoTerminologyDialog.kt +++ b/android/src/main/java/org/ligi/gobandroid_hd/ui/go_terminology/GoTerminologyDialog.kt @@ -2,32 +2,32 @@ package org.ligi.gobandroid_hd.ui.go_terminology import android.app.Activity import android.text.util.Linkify +import android.view.LayoutInflater import android.widget.TextView import org.ligi.gobandroid_hd.R +import org.ligi.gobandroid_hd.databinding.GoTermsViewBinding import org.ligi.gobandroid_hd.ui.GobandroidDialog import timber.log.Timber class GoTerminologyDialog(context: Activity, term: String) : GobandroidDialog(context) { - + private val binding: GoTermsViewBinding init { - setTitle(term) setIconResource(R.drawable.ic_action_info_outline_wrapped) setContentView(R.layout.go_terms_view) - - val tv = this.findViewById(R.id.go_terms_text) as TextView + binding = GoTermsViewBinding.bind(pbinding.dialogContent.getChildAt(0)) val termMap = GoTerminologyViewActivity.Term2resMap if (termMap.containsKey(term)) { - tv.setText(termMap[term]!!) + binding.goTermsText.setText(termMap[term]!!) } else { - tv.setText(R.string.no_definition_found) + binding.goTermsText.setText(R.string.no_definition_found) Timber.w("no definition found for " + term) } - Linkify.addLinks(tv, Linkify.ALL) + Linkify.addLinks(binding.goTermsText, Linkify.ALL) } diff --git a/android/src/main/java/org/ligi/gobandroid_hd/ui/go_terminology/GoTerminologyViewActivity.kt b/android/src/main/java/org/ligi/gobandroid_hd/ui/go_terminology/GoTerminologyViewActivity.kt index 6ab73e9e9..5cfc58af0 100644 --- a/android/src/main/java/org/ligi/gobandroid_hd/ui/go_terminology/GoTerminologyViewActivity.kt +++ b/android/src/main/java/org/ligi/gobandroid_hd/ui/go_terminology/GoTerminologyViewActivity.kt @@ -5,6 +5,7 @@ import androidx.appcompat.app.AppCompatActivity import android.text.util.Linkify import android.widget.TextView import org.ligi.gobandroid_hd.R +import java.util.Locale import java.util.regex.Pattern class GoTerminologyViewActivity : AppCompatActivity() { @@ -42,7 +43,7 @@ class GoTerminologyViewActivity : AppCompatActivity() { Linkify.addLinks(myTextView, Linkify.ALL) val mentionFilter: Linkify.TransformFilter = Linkify.TransformFilter { matcher, _ -> - matcher.group(1)?.toLowerCase() + matcher.group(1).lowercase(Locale.getDefault()) } Term2resMap.keys.forEach { diff --git a/android/src/main/java/org/ligi/gobandroid_hd/ui/links/LinksActivity.kt b/android/src/main/java/org/ligi/gobandroid_hd/ui/links/LinksActivity.kt index d8f260aa1..33bddece5 100644 --- a/android/src/main/java/org/ligi/gobandroid_hd/ui/links/LinksActivity.kt +++ b/android/src/main/java/org/ligi/gobandroid_hd/ui/links/LinksActivity.kt @@ -25,9 +25,9 @@ import android.os.Bundle import androidx.fragment.app.Fragment import androidx.fragment.app.FragmentManager import androidx.fragment.app.FragmentPagerAdapter -import kotlinx.android.synthetic.main.links_view_pager.* import org.ligi.gobandroid_hd.App import org.ligi.gobandroid_hd.R +import org.ligi.gobandroid_hd.databinding.LinksViewPagerBinding import org.ligi.gobandroid_hd.ui.application.GobandroidFragmentActivity /** @@ -37,11 +37,12 @@ import org.ligi.gobandroid_hd.ui.application.GobandroidFragmentActivity */ class LinksActivity : GobandroidFragmentActivity() { - + private lateinit var binding: LinksViewPagerBinding class LinkFragmentItem(val title: String, val tag: String, val fragmentGetter: () -> Fragment) - class LinkListFragmentPager(fm: FragmentManager, val items: Array) : FragmentPagerAdapter(fm) { + class LinkListFragmentPager(fm: FragmentManager, val items: Array) : + FragmentPagerAdapter(fm) { override fun getPageTitle(position: Int): CharSequence { return items[position].title @@ -61,6 +62,7 @@ class LinksActivity : GobandroidFragmentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) this.setContentView(R.layout.links_view_pager) + binding = LinksViewPagerBinding.bind(pbinding.contentFrame.getChildAt(0)) if (supportActionBar != null) { supportActionBar!!.setDisplayHomeAsUpEnabled(true) @@ -74,8 +76,8 @@ class LinksActivity : GobandroidFragmentActivity() { LinkFragmentItem(getString(R.string.link_tab_credits), "credits", { CreditsListFragment() })) - view_pager.adapter = LinkListFragmentPager(supportFragmentManager, items) - sliding_tabs.setupWithViewPager(view_pager) + binding.viewPager.adapter = LinkListFragmentPager(supportFragmentManager, items) + binding.slidingTabs.setupWithViewPager(binding.viewPager) } diff --git a/android/src/main/java/org/ligi/gobandroid_hd/ui/links/TwoLineRecyclerAdapter.kt b/android/src/main/java/org/ligi/gobandroid_hd/ui/links/TwoLineRecyclerAdapter.kt index 410b2df28..481fa551a 100644 --- a/android/src/main/java/org/ligi/gobandroid_hd/ui/links/TwoLineRecyclerAdapter.kt +++ b/android/src/main/java/org/ligi/gobandroid_hd/ui/links/TwoLineRecyclerAdapter.kt @@ -3,13 +3,15 @@ package org.ligi.gobandroid_hd.ui.links import androidx.recyclerview.widget.RecyclerView import android.view.LayoutInflater import android.view.ViewGroup +import androidx.recyclerview.widget.RecyclerView.ViewHolder import org.ligi.gobandroid_hd.R +import org.ligi.gobandroid_hd.databinding.TwoLineListItemBinding internal class TwoLineRecyclerAdapter(private val twoLinedWithLinkContent: Array) : RecyclerView.Adapter() { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): TwoLineRecyclerViewHolder { - val from = LayoutInflater.from(parent.context) - return TwoLineRecyclerViewHolder(from.inflate(R.layout.two_line_list_item, parent, false)) + val inflatedView = TwoLineListItemBinding.inflate(LayoutInflater.from(parent.context)) + return TwoLineRecyclerViewHolder(inflatedView) } override fun onBindViewHolder(holder: TwoLineRecyclerViewHolder, position: Int) { diff --git a/android/src/main/java/org/ligi/gobandroid_hd/ui/links/TwoLineRecyclerViewHolder.kt b/android/src/main/java/org/ligi/gobandroid_hd/ui/links/TwoLineRecyclerViewHolder.kt index 6d150b8ca..8adebb843 100644 --- a/android/src/main/java/org/ligi/gobandroid_hd/ui/links/TwoLineRecyclerViewHolder.kt +++ b/android/src/main/java/org/ligi/gobandroid_hd/ui/links/TwoLineRecyclerViewHolder.kt @@ -3,14 +3,14 @@ package org.ligi.gobandroid_hd.ui.links import android.content.Intent import android.net.Uri import androidx.recyclerview.widget.RecyclerView -import android.view.View -import kotlinx.android.synthetic.main.two_line_list_item.view.* +import org.ligi.gobandroid_hd.databinding.TwoLineListItemBinding -class TwoLineRecyclerViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { +class TwoLineRecyclerViewHolder(_binding: TwoLineListItemBinding) : RecyclerView.ViewHolder(_binding.root) { + private val binding = _binding fun bind(twoLinedWithLink: LinkWithDescription) { - itemView.text1.text = twoLinedWithLink.line1 - itemView.text2.text = twoLinedWithLink.line2 + binding.text1.text = twoLinedWithLink.line1 + binding.text2.text = twoLinedWithLink.line2 itemView.setOnClickListener { v -> v.context.startActivity(Intent("android.intent.action.VIEW", Uri.parse(twoLinedWithLink.link))) } } } diff --git a/android/src/main/java/org/ligi/gobandroid_hd/ui/recording/SaveSGFDialog.kt b/android/src/main/java/org/ligi/gobandroid_hd/ui/recording/SaveSGFDialog.kt index 98081565d..44272a331 100644 --- a/android/src/main/java/org/ligi/gobandroid_hd/ui/recording/SaveSGFDialog.kt +++ b/android/src/main/java/org/ligi/gobandroid_hd/ui/recording/SaveSGFDialog.kt @@ -1,10 +1,11 @@ package org.ligi.gobandroid_hd.ui.recording +import android.view.LayoutInflater import android.view.View import android.widget.Button import android.widget.Toast -import kotlinx.android.synthetic.main.dialog_save_sgf.* import org.ligi.gobandroid_hd.R +import org.ligi.gobandroid_hd.databinding.DialogSaveSgfBinding import org.ligi.gobandroid_hd.logic.sgf.SGFWriter import org.ligi.gobandroid_hd.ui.GobandroidDialog import org.ligi.gobandroid_hd.ui.application.GobandroidFragmentActivity @@ -23,14 +24,15 @@ import java.util.* * @author ligi */ class SaveSGFDialog(private val context: GobandroidFragmentActivity) : GobandroidDialog(context) { + private val binding: DialogSaveSgfBinding init { - setContentView(R.layout.dialog_save_sgf) + binding = DialogSaveSgfBinding.bind(pbinding.dialogContent.getChildAt(0)) setIconResource(R.drawable.ic_content_save) - intro_txt.text = String.format(context.resources.getString(R.string.save_sgf_question), settings.SGFSavePath) + binding.introTxt.text = String.format(context.resources.getString(R.string.save_sgf_question), settings.SGFSavePath) setPositiveButton(android.R.string.ok, { _ -> val file = completeFileName() @@ -40,11 +42,11 @@ class SaveSGFDialog(private val context: GobandroidFragmentActivity) : Gobandroi Toast.makeText(context, String.format(context.getString(toastText), file.absolutePath), Toast.LENGTH_SHORT).show() }) - sgf_name_edittext.doAfterEdit { + binding.sgfNameEdittext.doAfterEdit { setPositiveButtonAndOverrideCheckboxEnabledByExistenceOfFile() } - override_checkbox.setOnCheckedChangeListener { _, _ -> setPositiveButtonAndOverrideCheckboxEnabledByExistenceOfFile() } + binding.overrideCheckbox.setOnCheckedChangeListener { _, _ -> setPositiveButtonAndOverrideCheckboxEnabledByExistenceOfFile() } // get the old filename from the metadata val oldFileName = gameProvider.get().metaData.fileName @@ -55,7 +57,7 @@ class SaveSGFDialog(private val context: GobandroidFragmentActivity) : Gobandroi if (suggested_name.startsWith(absolutePath)) { suggested_name = suggested_name.substring(absolutePath.length + 1) } - sgf_name_edittext.setText(suggested_name) + binding.sgfNameEdittext.setText(suggested_name) } val (name, _, _, _, blackName, _, whiteName) = gameProvider.get().metaData @@ -85,12 +87,12 @@ class SaveSGFDialog(private val context: GobandroidFragmentActivity) : Gobandroi override fun onClick(v: View) { val toAdd = getTextByButtonId(v.id) if (toAdd != null) { - val text = sgf_name_edittext.text.toString() - val cursorPos = sgf_name_edittext.selectionStart + val text = binding.sgfNameEdittext.text.toString() + val cursorPos = binding.sgfNameEdittext.selectionStart val sb = StringBuilder() - sb.append(text.substring(0, cursorPos)).append(toAdd).append(text.substring(cursorPos, sgf_name_edittext.length())) - sgf_name_edittext.setText(sb.toString()) - sgf_name_edittext.setSelection(cursorPos + toAdd.length) + sb.append(text.substring(0, cursorPos)).append(toAdd).append(text.substring(cursorPos, binding.sgfNameEdittext.length())) + binding.sgfNameEdittext.setText(sb.toString()) + binding.sgfNameEdittext.setSelection(cursorPos + toAdd.length) } } @@ -98,11 +100,11 @@ class SaveSGFDialog(private val context: GobandroidFragmentActivity) : Gobandroi val adder = FileNameAdder() - button_add_date.setOnClickListener(adder) - button_add_time.setOnClickListener(adder) + binding.buttonAddDate.setOnClickListener(adder) + binding.buttonAddTime.setOnClickListener(adder) - button_add_gamename.prepareButton(name.isBlank(), adder) - button_add_players.prepareButton(blackName.isBlank() && whiteName.isBlank(), adder) + binding.buttonAddGamename.prepareButton(name.isBlank(), adder) + binding.buttonAddPlayers.prepareButton(blackName.isBlank() && whiteName.isBlank(), adder) setTitle(R.string.save_sgf) @@ -120,7 +122,7 @@ class SaveSGFDialog(private val context: GobandroidFragmentActivity) : Gobandroi if (wanted_file == null) { // we got no filename from user - override_checkbox.visibility = View.GONE // no overwrite without + binding.overrideCheckbox.visibility = View.GONE // no overwrite without // filename positive_btn.isEnabled = false // should not save without a @@ -129,8 +131,8 @@ class SaveSGFDialog(private val context: GobandroidFragmentActivity) : Gobandroi } val target_file_exist = wanted_file.exists() - override_checkbox.visibility = if (target_file_exist && !wanted_file.isDirectory) View.VISIBLE else View.GONE - positive_btn.isEnabled = !target_file_exist || override_checkbox.isChecked + binding.overrideCheckbox.visibility = if (target_file_exist && !wanted_file.isDirectory) View.VISIBLE else View.GONE + positive_btn.isEnabled = !target_file_exist || binding.overrideCheckbox.isChecked } /** @@ -138,7 +140,7 @@ class SaveSGFDialog(private val context: GobandroidFragmentActivity) : Gobandroi * or null when there is no filename given */ private fun completeFileName(): File? { - var fileName = sgf_name_edittext.text.toString() + var fileName = binding.sgfNameEdittext.text.toString() if (fileName.isEmpty()) return null diff --git a/android/src/main/java/org/ligi/gobandroid_hd/ui/review/BookmarkDialog.kt b/android/src/main/java/org/ligi/gobandroid_hd/ui/review/BookmarkDialog.kt index 2cbaabd08..93e6277f7 100644 --- a/android/src/main/java/org/ligi/gobandroid_hd/ui/review/BookmarkDialog.kt +++ b/android/src/main/java/org/ligi/gobandroid_hd/ui/review/BookmarkDialog.kt @@ -17,8 +17,8 @@ package org.ligi.gobandroid_hd.ui.review import android.text.TextUtils -import kotlinx.android.synthetic.main.save_bookmark.view.* import org.ligi.gobandroid_hd.R +import org.ligi.gobandroid_hd.databinding.SaveBookmarkBinding import org.ligi.gobandroid_hd.logic.GoGame import org.ligi.gobandroid_hd.logic.sgf.SGFWriter import org.ligi.gobandroid_hd.ui.GobandroidDialog @@ -39,20 +39,22 @@ import java.util.* * * License: This software is licensed with GPLv3 */ class BookmarkDialog(context: GobandroidFragmentActivity) : GobandroidDialog(context) { + private val binding: SaveBookmarkBinding init { setTitle(R.string.bookmark) setIconResource(R.drawable.ic_toggle_star_border) setContentView(R.layout.save_bookmark) + binding = SaveBookmarkBinding.bind(pbinding.dialogContent.getChildAt(0)) val innerFileName = getCleanEnsuredFilename(settings, gameProvider.get()) - container.message.text = context.resources.getString(R.string.bookmark_to_write_into) + " " + settings.bookmarkPath - container.bookmark_name.setText(innerFileName) + binding.message.text = context.resources.getString(R.string.bookmark_to_write_into) + " " + settings.bookmarkPath + binding.bookmarkName.setText(innerFileName) setPositiveButton(android.R.string.ok, { - GoLink.saveGameToGoLink(gameProvider.get(), settings.bookmarkPath, container.bookmark_name.text.toString() + ".golink") + GoLink.saveGameToGoLink(gameProvider.get(), settings.bookmarkPath, binding.bookmarkName.text.toString() + ".golink") it.dismiss() }) } diff --git a/android/src/main/java/org/ligi/gobandroid_hd/ui/review/EndReviewDialog.kt b/android/src/main/java/org/ligi/gobandroid_hd/ui/review/EndReviewDialog.kt index f072b385e..3b7036810 100644 --- a/android/src/main/java/org/ligi/gobandroid_hd/ui/review/EndReviewDialog.kt +++ b/android/src/main/java/org/ligi/gobandroid_hd/ui/review/EndReviewDialog.kt @@ -16,8 +16,9 @@ package org.ligi.gobandroid_hd.ui.review -import kotlinx.android.synthetic.main.end_review_dialog.view.* + import org.ligi.gobandroid_hd.R +import org.ligi.gobandroid_hd.databinding.EndReviewDialogBinding import org.ligi.gobandroid_hd.ui.GobandroidDialog import org.ligi.gobandroid_hd.ui.GobandroidNotifications import org.ligi.gobandroid_hd.ui.application.GobandroidFragmentActivity @@ -33,36 +34,38 @@ import org.ligi.gobandroid_hd.ui.sgf_listing.GoLink * * License: This software is licensed with GPLv3 */ class EndReviewDialog(context: GobandroidFragmentActivity) : GobandroidDialog(context) { + private val binding: EndReviewDialogBinding private val meta by lazy { SGFMetaData(gameProvider.get()) } init { setContentView(R.layout.end_review_dialog) + binding = EndReviewDialogBinding.bind(pbinding.dialogContent.getChildAt(0)) setTitle(R.string.end_review) setIconResource(R.drawable.ic_action_help_outline) - container.save_bookmark_cp.isChecked = true + binding.saveBookmarkCp.isChecked = true - container.bookmark_name_et.setText(BookmarkDialog.getCleanEnsuredFilename(settings, gameProvider.get())) + binding.bookmarkNameEt.setText(BookmarkDialog.getCleanEnsuredFilename(settings, gameProvider.get())) if (meta.rating != null) { - container.game_rating.rating = .5f * meta.rating!! + binding.gameRating.rating = .5f * meta.rating!! } - container.save_bookmark_cp.setOnCheckedChangeListener { _, isChecked -> - container.bookmark_notification_cb.isEnabled = isChecked - container.bookmark_name_et.isEnabled = isChecked + binding.saveBookmarkCp.setOnCheckedChangeListener { _, isChecked -> + binding.bookmarkNotificationCb.isEnabled = isChecked + binding.bookmarkNameEt.isEnabled = isChecked } setPositiveButton(R.string.end_review_ok_button, { dialog -> - if (container.save_bookmark_cp.isChecked) { - GoLink.saveGameToGoLink(gameProvider.get(), settings.bookmarkPath, container.bookmark_name_et.text.toString() + ".golink") + if (binding.saveBookmarkCp.isChecked) { + GoLink.saveGameToGoLink(gameProvider.get(), settings.bookmarkPath, binding.bookmarkNameEt.text.toString() + ".golink") } - if (container.bookmark_notification_cb.isChecked) { - GobandroidNotifications(context).addGoLinkNotification(settings.bookmarkPath.toString() + "/" + container.bookmark_name_et.text.toString() + ".golink") + if (binding.bookmarkNotificationCb.isChecked) { + GobandroidNotifications(context).addGoLinkNotification(settings.bookmarkPath.toString() + "/" + binding.bookmarkNameEt.text.toString() + ".golink") } saveSGFMeta() @@ -77,7 +80,7 @@ class EndReviewDialog(context: GobandroidFragmentActivity) : GobandroidDialog(co } fun saveSGFMeta() { - meta.rating = (container.game_rating.rating * 2).toInt() + meta.rating = (binding.gameRating.rating * 2).toInt() meta.persist() } } diff --git a/android/src/main/java/org/ligi/gobandroid_hd/ui/review/GameReviewActivity.kt b/android/src/main/java/org/ligi/gobandroid_hd/ui/review/GameReviewActivity.kt index a3fe1be44..a421b661f 100644 --- a/android/src/main/java/org/ligi/gobandroid_hd/ui/review/GameReviewActivity.kt +++ b/android/src/main/java/org/ligi/gobandroid_hd/ui/review/GameReviewActivity.kt @@ -4,7 +4,7 @@ import android.os.Bundle import android.view.KeyEvent import android.view.Menu import android.view.MotionEvent -import kotlinx.android.synthetic.main.game.* + import org.ligi.gobandroid_hd.InteractionScope import org.ligi.gobandroid_hd.R import org.ligi.gobandroid_hd.logic.Cell @@ -23,7 +23,7 @@ class GameReviewActivity : GoActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - go_board.do_actpos_highlight = false + binding.goBoard.do_actpos_highlight = false } override val isBoardFocusWanted = false diff --git a/android/src/main/java/org/ligi/gobandroid_hd/ui/review/GoGamePlayerActivity.kt b/android/src/main/java/org/ligi/gobandroid_hd/ui/review/GoGamePlayerActivity.kt index 55b500ccb..a61e9ce72 100644 --- a/android/src/main/java/org/ligi/gobandroid_hd/ui/review/GoGamePlayerActivity.kt +++ b/android/src/main/java/org/ligi/gobandroid_hd/ui/review/GoGamePlayerActivity.kt @@ -5,7 +5,7 @@ import android.content.Intent import android.os.Bundle import android.os.SystemClock import android.view.* -import kotlinx.android.synthetic.main.game.* + import org.ligi.gobandroid_hd.InteractionScope import org.ligi.gobandroid_hd.R import org.ligi.gobandroid_hd.logic.Cell @@ -57,8 +57,8 @@ class GoGamePlayerActivity : GoActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - go_board.setOnKeyListener(this) - go_board.do_actpos_highlight = false + binding.goBoard.setOnKeyListener(this) + binding.goBoard.do_actpos_highlight = false } diff --git a/android/src/main/java/org/ligi/gobandroid_hd/ui/scoring/GameScoringActivity.kt b/android/src/main/java/org/ligi/gobandroid_hd/ui/scoring/GameScoringActivity.kt index bb47cb64b..e9479e95b 100644 --- a/android/src/main/java/org/ligi/gobandroid_hd/ui/scoring/GameScoringActivity.kt +++ b/android/src/main/java/org/ligi/gobandroid_hd/ui/scoring/GameScoringActivity.kt @@ -6,7 +6,7 @@ import android.view.Menu import android.view.MenuItem import android.view.MotionEvent import android.view.WindowManager -import kotlinx.android.synthetic.main.game.* + import org.ligi.gobandroid_hd.R import org.ligi.gobandroid_hd.events.GameChangedEvent import org.ligi.gobandroid_hd.logic.Cell @@ -82,7 +82,7 @@ class GameScoringActivity : GoActivity() { //super.doTouch(event); - Do not call! Not needed and breaks marking dead stones eventForZoomBoard(event) - val touchCell = go_board.pixel2cell(event.x, event.y) + val touchCell = binding.goBoard.pixel2cell(event.x, event.y) interactionScope.touchCell = touchCell // calculate position on the field by position on the touchscreen diff --git a/android/src/main/java/org/ligi/gobandroid_hd/ui/scoring/GameScoringExtrasFragment.kt b/android/src/main/java/org/ligi/gobandroid_hd/ui/scoring/GameScoringExtrasFragment.kt index 9dd99ac1e..cab6e9f37 100644 --- a/android/src/main/java/org/ligi/gobandroid_hd/ui/scoring/GameScoringExtrasFragment.kt +++ b/android/src/main/java/org/ligi/gobandroid_hd/ui/scoring/GameScoringExtrasFragment.kt @@ -4,20 +4,28 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import kotlinx.android.synthetic.main.game_result.view.* + import org.ligi.gobandroid_hd.R +import org.ligi.gobandroid_hd.databinding.GameResultBinding import org.ligi.gobandroid_hd.events.GameChangedEvent import org.ligi.gobandroid_hd.logic.GoGameScorer import org.ligi.gobandroid_hd.ui.fragments.GobandroidGameAwareFragment class GameScoringExtrasFragment : GobandroidGameAwareFragment() { - - lateinit var myView: View + private var _binding: GameResultBinding? = null + // This property is only valid between onCreateView and + // onDestroyView. + private val binding get() = _binding!! override fun createView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View { - myView = inflater.inflate(R.layout.game_result, container, false) - refresh() - return myView + _binding = GameResultBinding.inflate(inflater, container, false) + val view = binding.root + return view + } + + override fun onDestroyView() { + super.onDestroyView() + _binding = null } override fun onGoGameChanged(gameChangedEvent: GameChangedEvent?) { @@ -42,18 +50,18 @@ class GameScoringExtrasFragment : GobandroidGameAwareFragment() { val game = gameProvider.get() val scorer = game.scorer ?: return - myView.result_txt.text = getFinTXT(scorer) + binding.resultTxt.text = getFinTXT(scorer) - myView.territory_black.text = String.format("%d", scorer.territory_black) - myView.territory_white.text = String.format("%d", scorer.territory_white) + binding.territoryBlack.text = String.format("%d", scorer.territory_black) + binding.territoryWhite.text = String.format("%d", scorer.territory_white) - myView.captures_black.text = getCapturesString(game.capturesBlack, scorer.dead_white) - myView.captures_white.text = getCapturesString(game.capturesWhite, scorer.dead_black) + binding.capturesBlack.text = getCapturesString(game.capturesBlack, scorer.dead_white) + binding.capturesWhite.text = getCapturesString(game.capturesWhite, scorer.dead_black) - myView.komi.text = String.format("%.1f", game.komi) + binding.komi.text = String.format("%.1f", game.komi) - myView.final_black.text = String.format("%.1f", scorer.pointsBlack) - myView.final_white.text = String.format("%.1f", scorer.pointsWhite) + binding.finalBlack.text = String.format("%.1f", scorer.pointsBlack) + binding.finalWhite.text = String.format("%.1f", scorer.pointsWhite) } private fun getFinTXT(scorer: GoGameScorer): String { diff --git a/android/src/main/java/org/ligi/gobandroid_hd/ui/sgf_listing/SGFListFragment.kt b/android/src/main/java/org/ligi/gobandroid_hd/ui/sgf_listing/SGFListFragment.kt index 87e0ef7a3..37629bc9a 100644 --- a/android/src/main/java/org/ligi/gobandroid_hd/ui/sgf_listing/SGFListFragment.kt +++ b/android/src/main/java/org/ligi/gobandroid_hd/ui/sgf_listing/SGFListFragment.kt @@ -19,6 +19,9 @@ import androidx.recyclerview.widget.StaggeredGridLayoutManager import com.davekoelle.alphanum.AlphanumComparator import org.ligi.gobandroid_hd.InteractionScope.Mode.TSUMEGO import org.ligi.gobandroid_hd.R +import org.ligi.gobandroid_hd.databinding.SgfDirListItemBinding +import org.ligi.gobandroid_hd.databinding.SgfReviewGameDetailsListItemBinding +import org.ligi.gobandroid_hd.databinding.SgfTsumegoListItemBinding import org.ligi.gobandroid_hd.helper.SGFFileNameFilter import org.ligi.gobandroid_hd.logic.sgf.SGFReader import org.ligi.gobandroid_hd.ui.GoLinkLoadActivity @@ -252,10 +255,11 @@ class SGFListFragment : GobandroidFragment(), Refreshable { val inflator = LayoutInflater.from(parent.context) when (viewType) { - TYPE_PATH -> return PathViewHolder(inflator.inflate(R.layout.sgf_dir_list_item, parent, false)) - TYPE_TSUMEGO -> return TsumegoViewHolder(inflator.inflate(R.layout.sgf_tsumego_list_item, parent, false)) + TYPE_PATH -> return PathViewHolder(SgfDirListItemBinding.inflate(inflator, parent, false)) + TYPE_TSUMEGO -> return TsumegoViewHolder(SgfTsumegoListItemBinding.inflate(inflator, parent, false)) - TYPE_GOLINK, TYPE_REVIEW -> return ReviewViewHolder(inflator.inflate(R.layout.sgf_review_game_details_list_item, parent, false)) + TYPE_GOLINK, TYPE_REVIEW -> return ReviewViewHolder( + SgfReviewGameDetailsListItemBinding.inflate(inflator, parent, false)) else -> throw IllegalStateException("unknown view-type " + viewType) } @@ -273,7 +277,8 @@ class SGFListFragment : GobandroidFragment(), Refreshable { return@OnTouchListener false } when (event.action) { - MotionEvent.ACTION_CANCEL, MotionEvent.ACTION_UP -> cardView.cardElevation = resources.getDimension(R.dimen.cardview_default_elevation) + MotionEvent.ACTION_CANCEL, MotionEvent.ACTION_UP -> cardView.cardElevation = resources.getDimension( + androidx.cardview.R.dimen.cardview_default_elevation) MotionEvent.ACTION_DOWN -> cardView.cardElevation = resources.getDimension(R.dimen.cardview_unelevated_elevation) } @@ -331,7 +336,7 @@ class SGFListFragment : GobandroidFragment(), Refreshable { return object : SGFListActionMode(this@SGFListFragment.requireActivity(), fileName, this@SGFListFragment, menuResource) { override fun onDestroyActionMode(mode: ActionMode) { actionMode = null - cardView.cardElevation = resources.getDimension(R.dimen.cardview_default_elevation) + cardView.cardElevation = resources.getDimension(androidx.cardview.R.dimen.cardview_default_elevation) cardView.setTag(R.id.tag_actionmode, null) super.onDestroyActionMode(mode) } diff --git a/android/src/main/java/org/ligi/gobandroid_hd/ui/sgf_listing/item_view_holder/PathViewHolder.kt b/android/src/main/java/org/ligi/gobandroid_hd/ui/sgf_listing/item_view_holder/PathViewHolder.kt index 0c031025e..6fc5a0d6d 100644 --- a/android/src/main/java/org/ligi/gobandroid_hd/ui/sgf_listing/item_view_holder/PathViewHolder.kt +++ b/android/src/main/java/org/ligi/gobandroid_hd/ui/sgf_listing/item_view_holder/PathViewHolder.kt @@ -2,12 +2,13 @@ package org.ligi.gobandroid_hd.ui.sgf_listing.item_view_holder import androidx.recyclerview.widget.RecyclerView import android.view.View -import kotlinx.android.synthetic.main.sgf_dir_list_item.view.* +import org.ligi.gobandroid_hd.databinding.SgfDirListItemBinding import java.io.File -class PathViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), ViewHolderInterface { +class PathViewHolder(_binding: SgfDirListItemBinding) : RecyclerView.ViewHolder(_binding.root), ViewHolderInterface { + private val binding = _binding override fun apply(file: File) { - itemView.pathName.text = file.name + binding.pathName.text = file.name } } diff --git a/android/src/main/java/org/ligi/gobandroid_hd/ui/sgf_listing/item_view_holder/ReviewViewHolder.kt b/android/src/main/java/org/ligi/gobandroid_hd/ui/sgf_listing/item_view_holder/ReviewViewHolder.kt index 57911b479..ba62b2be2 100644 --- a/android/src/main/java/org/ligi/gobandroid_hd/ui/sgf_listing/item_view_holder/ReviewViewHolder.kt +++ b/android/src/main/java/org/ligi/gobandroid_hd/ui/sgf_listing/item_view_holder/ReviewViewHolder.kt @@ -2,8 +2,8 @@ package org.ligi.gobandroid_hd.ui.sgf_listing.item_view_holder import androidx.recyclerview.widget.RecyclerView import android.view.View -import kotlinx.android.synthetic.main.sgf_review_game_details_list_item.view.* import org.ligi.gobandroid_hd.FileEncodeDetector +import org.ligi.gobandroid_hd.databinding.SgfReviewGameDetailsListItemBinding import org.ligi.gobandroid_hd.logic.MetaDataFormatter import org.ligi.gobandroid_hd.logic.sgf.SGFReader import org.ligi.gobandroid_hd.ui.review.SGFMetaData @@ -11,20 +11,21 @@ import org.ligi.gobandroid_hd.ui.sgf_listing.GoLink import java.io.File import java.io.IOException -class ReviewViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), ViewHolderInterface { +class ReviewViewHolder(_binding: SgfReviewGameDetailsListItemBinding) : RecyclerView.ViewHolder(_binding.root), ViewHolderInterface { + private val binding = _binding override fun apply(fileToApply: File) { var file = fileToApply - itemView.title.text = file.name.replace(".sgf", "") + binding.title.text = file.name.replace(".sgf", "") try { if (GoLink.isGoLink(file)) { val gl = GoLink(file) file = File(gl.fileName) - itemView.game_link_extra_infos.text = "Move #" + gl.moveDepth + binding.gameLinkExtraInfos.text = "Move #" + gl.moveDepth } else { - itemView.game_link_extra_infos.visibility = View.GONE + binding.gameLinkExtraInfos.visibility = View.GONE } val sgf_str = file.bufferedReader(FileEncodeDetector.detect(file)).readText() @@ -35,26 +36,26 @@ class ReviewViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), View val metaFormatter = MetaDataFormatter(game) if (metaFormatter.getWhitePlayerString().isEmpty()) { - itemView.player_white_stone_img.visibility = View.GONE - itemView.player_white.visibility = View.GONE + binding.playerWhiteStoneImg.visibility = View.GONE + binding.playerWhite.visibility = View.GONE } else { - itemView.player_white.text = metaFormatter.getWhitePlayerString() + binding.playerWhite.text = metaFormatter.getWhitePlayerString() } if (metaFormatter.getBlackPlayerString().isEmpty()) { - itemView.player_black_stone_img.visibility = View.GONE - itemView.player_black.visibility = View.GONE + binding.playerBlackStoneImg.visibility = View.GONE + binding.playerBlack.visibility = View.GONE } else { - itemView.player_black.text = metaFormatter.getBlackPlayerString() + binding.playerBlack.text = metaFormatter.getBlackPlayerString() } - itemView.game_extra_infos.text = metaFormatter.extrasString + binding.gameExtraInfos.text = metaFormatter.extrasString if (!sgf_meta.hasData()) { - itemView.game_rating.visibility = View.GONE + binding.gameRating.visibility = View.GONE } else if (sgf_meta.rating != null) { - itemView.game_rating.visibility = View.VISIBLE - itemView.game_rating.rating = .5f * sgf_meta.rating!! + binding.gameRating.visibility = View.VISIBLE + binding.gameRating.rating = .5f * sgf_meta.rating!! } } diff --git a/android/src/main/java/org/ligi/gobandroid_hd/ui/sgf_listing/item_view_holder/TsumegoViewHolder.kt b/android/src/main/java/org/ligi/gobandroid_hd/ui/sgf_listing/item_view_holder/TsumegoViewHolder.kt index 00f8622b9..fa5b57592 100644 --- a/android/src/main/java/org/ligi/gobandroid_hd/ui/sgf_listing/item_view_holder/TsumegoViewHolder.kt +++ b/android/src/main/java/org/ligi/gobandroid_hd/ui/sgf_listing/item_view_holder/TsumegoViewHolder.kt @@ -2,9 +2,11 @@ package org.ligi.gobandroid_hd.ui.sgf_listing.item_view_holder import androidx.recyclerview.widget.RecyclerView import android.view.View -import kotlinx.android.synthetic.main.sgf_tsumego_list_item.view.* + import org.ligi.gobandroid_hd.FileEncodeDetector import org.ligi.gobandroid_hd.R +import org.ligi.gobandroid_hd.databinding.SgfTsumegoListItemBinding +import org.ligi.gobandroid_hd.databinding.TwoLineListItemBinding import org.ligi.gobandroid_hd.logic.GoGame import org.ligi.gobandroid_hd.logic.sgf.SGFReader import org.ligi.gobandroid_hd.ui.review.SGFMetaData @@ -13,11 +15,12 @@ import org.ligi.gobandroid_hd.ui.tsumego.TsumegoHelper import java.io.File import java.io.IOException -class TsumegoViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), ViewHolderInterface { +class TsumegoViewHolder(_binding: SgfTsumegoListItemBinding) : RecyclerView.ViewHolder(_binding.root), ViewHolderInterface { + private val binding = _binding override fun apply(file: File) { - itemView.title.text = file.name.replace(".sgf", "") + binding.title.text = file.name.replace(".sgf", "") var sgf_str = "" @@ -32,13 +35,13 @@ class TsumegoViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), Vie } - val hints_used_fmt = itemView.hints_tv.context.getString(R.string.hints_used) + val hints_used_fmt = binding.hintsTv.context.getString(R.string.hints_used) var game: GoGame? = SGFReader.sgf2game(sgf_str, null, SGFReader.BREAKON_FIRSTMOVE) if (game != null) { val meta = SGFMetaData(file.absolutePath) - itemView.hints_tv.text = String.format(hints_used_fmt, meta.hintsUsed) + binding.hintsTv.text = String.format(hints_used_fmt, meta.hintsUsed) val transform = TsumegoHelper.calcTransform(game) @@ -47,14 +50,14 @@ class TsumegoViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), Vie } game!!.jump(game.findFirstMove()) - itemView.previewView?.game = game + binding.previewView?.game = game } if (SGFMetaData(file.absolutePath).isSolved) { - itemView.solve_status_image.setImageResource(R.drawable.ic_social_school) + binding.solveStatusImage.setImageResource(R.drawable.ic_social_school) } else { - itemView.solve_status_image.setImageResource(R.drawable.ic_action_extension) + binding.solveStatusImage.setImageResource(R.drawable.ic_action_extension) } } } diff --git a/android/src/main/java/org/ligi/gobandroid_hd/ui/share/ShareSGFDialog.kt b/android/src/main/java/org/ligi/gobandroid_hd/ui/share/ShareSGFDialog.kt index eb3ae2b1e..fa0dea85f 100644 --- a/android/src/main/java/org/ligi/gobandroid_hd/ui/share/ShareSGFDialog.kt +++ b/android/src/main/java/org/ligi/gobandroid_hd/ui/share/ShareSGFDialog.kt @@ -5,8 +5,8 @@ import android.content.Intent import android.graphics.Bitmap import android.graphics.BitmapFactory import android.net.Uri -import kotlinx.android.synthetic.main.share_options.view.* import org.ligi.gobandroid_hd.R +import org.ligi.gobandroid_hd.databinding.ShareOptionsBinding import org.ligi.gobandroid_hd.ui.GoBoardView import org.ligi.gobandroid_hd.ui.GobandroidDialog import java.io.File @@ -20,17 +20,18 @@ import java.io.File * * License: This software is licensed with GPLv3 */ class ShareSGFDialog(context: Context) : GobandroidDialog(context) { + private val binding: ShareOptionsBinding init { - setContentView(R.layout.share_options) + binding = ShareOptionsBinding.bind(pbinding.dialogContent.getChildAt(0)) setTitle(R.string.share) setIconResource(R.drawable.ic_social_share) setNegativeButton(R.string.cancel) setPositiveButton(R.string.ok, { _ -> - when (container.shareTypeRadioGroup.checkedRadioButtonId) { + when (binding.shareTypeRadioGroup.checkedRadioButtonId) { R.id.radioButtonAsUnicode -> { val intent = Intent(Intent.ACTION_SEND) intent.putExtra(Intent.EXTRA_TEXT, gameProvider.get().visualBoard.toString(true)) diff --git a/android/src/main/java/org/ligi/gobandroid_hd/ui/tsumego/TsumegoActivity.kt b/android/src/main/java/org/ligi/gobandroid_hd/ui/tsumego/TsumegoActivity.kt index 9e48de1e8..2cc3122a1 100644 --- a/android/src/main/java/org/ligi/gobandroid_hd/ui/tsumego/TsumegoActivity.kt +++ b/android/src/main/java/org/ligi/gobandroid_hd/ui/tsumego/TsumegoActivity.kt @@ -4,7 +4,7 @@ import android.content.DialogInterface import android.view.Menu import android.view.MenuItem import androidx.appcompat.app.AlertDialog -import kotlinx.android.synthetic.main.game.* + import org.ligi.gobandroid_hd.R import org.ligi.gobandroid_hd.events.GameChangedEvent import org.ligi.gobandroid_hd.events.TsumegoSolved @@ -55,7 +55,7 @@ class TsumegoActivity : GoActivity() { } override fun requestUndo() { - go_board.move_stone_mode = false + binding.goBoard.move_stone_mode = false // we do not want to keep user-variations in tsumego mode- but we want // to keep tsumego variation game.undo(tsumegoController.isOnPath()) @@ -89,8 +89,8 @@ class TsumegoActivity : GoActivity() { val myZoom = TsumegoHelper.calcZoom(game, true) - go_board.zoom = myZoom - go_board.setZoomPOI(TsumegoHelper.calcPOI(game, true)) + binding.goBoard.zoom = myZoom + binding.goBoard.setZoomPOI(TsumegoHelper.calcPOI(game, true)) onGameChanged(GameChangedEvent) } diff --git a/android/src/main/java/org/ligi/gobandroid_hd/ui/tsumego/TsumegoController.kt b/android/src/main/java/org/ligi/gobandroid_hd/ui/tsumego/TsumegoController.kt index 802908c18..3b8112848 100644 --- a/android/src/main/java/org/ligi/gobandroid_hd/ui/tsumego/TsumegoController.kt +++ b/android/src/main/java/org/ligi/gobandroid_hd/ui/tsumego/TsumegoController.kt @@ -2,6 +2,7 @@ package org.ligi.gobandroid_hd.ui.tsumego import org.ligi.gobandroid_hd.logic.GoGame import org.ligi.gobandroid_hd.logic.GoMove +import java.util.Locale class TsumegoController(val game: GoGame) { @@ -20,8 +21,8 @@ class TsumegoController(val game: GoGame) { fun isOnPath() = on_path_moves.contains(game.actMove) fun isCorrectMove(move: GoMove): Boolean { - return move.comment.trim { it <= ' ' }.toUpperCase().startsWith("CORRECT") || // gogameguru style - move.comment.toUpperCase().contains("RIGHT") + return move.comment.trim { it <= ' ' }.uppercase(Locale.getDefault()).startsWith("CORRECT") || // gogameguru style + move.comment.uppercase(Locale.getDefault()).contains("RIGHT") } } \ No newline at end of file diff --git a/android/src/main/java/org/ligi/gobandroid_hd/ui/tsumego/TsumegoGameExtrasFragment.kt b/android/src/main/java/org/ligi/gobandroid_hd/ui/tsumego/TsumegoGameExtrasFragment.kt index cb348fdcc..a28d17765 100644 --- a/android/src/main/java/org/ligi/gobandroid_hd/ui/tsumego/TsumegoGameExtrasFragment.kt +++ b/android/src/main/java/org/ligi/gobandroid_hd/ui/tsumego/TsumegoGameExtrasFragment.kt @@ -10,14 +10,16 @@ import android.view.ViewGroup import android.widget.TextView import com.github.salomonbrys.kodein.instance import com.github.salomonbrys.kodein.lazy -import kotlinx.android.synthetic.main.game_extra_tsumego.* import org.ligi.compat.HtmlCompat import org.ligi.gobandroid_hd.App import org.ligi.gobandroid_hd.R +import org.ligi.gobandroid_hd.databinding.GameExtraTsumegoBinding import org.ligi.gobandroid_hd.model.GameProvider import org.ligi.gobandroid_hd.ui.go_terminology.GoTerminologyViewActivity class TsumegoGameExtrasFragment : Fragment() { + private var _binding: GameExtraTsumegoBinding? = null + private val binding get() = _binding!! internal val gameProvider: GameProvider by App.kodein.lazy.instance() @@ -26,24 +28,24 @@ class TsumegoGameExtrasFragment : Fragment() { private var correct_visible = false private fun updateUI() { - if (tsumego_off_path_view == null || tsumego_correct_view == null || activity == null) { // views not yet created + if (activity == null) { // views not yet created return // will come back later } val game = gameProvider.get() requireActivity().runOnUiThread { - tsumego_off_path_view.visibility = if (off_path_visible) TextView.VISIBLE else TextView.GONE + binding.tsumegoOffPathView.visibility = if (off_path_visible) TextView.VISIBLE else TextView.GONE if (correct_visible) { - tsumego_correct_view!!.visibility = View.VISIBLE + binding.tsumegoCorrectView.visibility = View.VISIBLE val optionalNextTsumegoURLString = NextTsumegoFileFinder.calcNextTsumego(game.metaData .fileName .replaceFirst("file://".toRegex(), "")) if (optionalNextTsumegoURLString != null) { - tsumego_correct_view!!.movementMethod = LinkMovementMethod.getInstance() + binding.tsumegoCorrectView.movementMethod = LinkMovementMethod.getInstance() val text = getString(R.string.tsumego_correct) + " " + getString(R.string.next_tsumego) + "" - tsumego_correct_view!!.text = HtmlCompat.fromHtml(text) + binding.tsumegoCorrectView.text = HtmlCompat.fromHtml(text) } else { - tsumego_correct_view.text = getString(R.string.correct_but_no_more_tsumegos) + binding.tsumegoCorrectView.text = getString(R.string.correct_but_no_more_tsumegos) } } else { - tsumego_correct_view.visibility = View.GONE + binding.tsumegoCorrectView.visibility = View.GONE } // the 10 is a bit of a magic number - just want to show comments that // have extras here to prevent double commentView written - but sometimes // there is more info in the commentView if (!correct_visible && game.actMove.comment.length > 10) { - game_comment!!.visibility = View.VISIBLE - game_comment!!.text = game.actMove.comment + binding.gameComment.visibility = View.VISIBLE + binding.gameComment.text = game.actMove.comment if (!TextUtils.isEmpty(game.actMove.comment)) { - GoTerminologyViewActivity.linkifyTextView(game_comment!!) + GoTerminologyViewActivity.linkifyTextView(binding.gameComment) } } else { - game_comment!!.visibility = View.GONE + binding.gameComment.visibility = View.GONE } } } override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { - val res = inflater.inflate(R.layout.game_extra_tsumego, container, false) - + _binding = GameExtraTsumegoBinding.inflate(inflater, container, false) updateUI() - return res + return binding.root + } + override fun onDestroyView() { + super.onDestroyView() + _binding = null } fun setOffPathVisibility(visible: Boolean) { diff --git a/android/src/main/java/org/ligi/gobandroid_hd/ui/tsumego/fetch/DownloadProblemsDialog.kt b/android/src/main/java/org/ligi/gobandroid_hd/ui/tsumego/fetch/DownloadProblemsDialog.kt index 0f4f2711a..e15b034a4 100644 --- a/android/src/main/java/org/ligi/gobandroid_hd/ui/tsumego/fetch/DownloadProblemsDialog.kt +++ b/android/src/main/java/org/ligi/gobandroid_hd/ui/tsumego/fetch/DownloadProblemsDialog.kt @@ -14,14 +14,14 @@ class DownloadProblemsDialog(context: Activity, refreshable: Refreshable?) : Pro setIconResource(R.drawable.ic_navigation_refresh) setTitle(R.string.please_stay_patient) - progress.isIndeterminate = true - message.setText(R.string.downloading_tsumegos_please_wait) + binding.progressBar.isIndeterminate = true + binding.message.setText(R.string.downloading_tsumegos_please_wait) Thread(Runnable { val initList = TsumegoDownloadHelper.getDefaultList(App.env) val result = TsumegoDownloadHelper.doDownload(context, initList, { context.runOnUiThread { - message.text = it + binding.message.text = it } }) @@ -35,8 +35,8 @@ class DownloadProblemsDialog(context: Activity, refreshable: Refreshable?) : Pro } setPositiveButton(android.R.string.ok) - message.text = msg - progress.visibility = View.GONE + binding.message.text = msg + binding.progressBar.visibility = View.GONE } }).start() } diff --git a/android/src/main/java/org/ligi/gobandroid_hd/ui/tsumego/fetch/TsumegoDownloadHelper.kt b/android/src/main/java/org/ligi/gobandroid_hd/ui/tsumego/fetch/TsumegoDownloadHelper.kt index a1cd2000f..465041442 100644 --- a/android/src/main/java/org/ligi/gobandroid_hd/ui/tsumego/fetch/TsumegoDownloadHelper.kt +++ b/android/src/main/java/org/ligi/gobandroid_hd/ui/tsumego/fetch/TsumegoDownloadHelper.kt @@ -3,7 +3,8 @@ package org.ligi.gobandroid_hd.ui.tsumego.fetch import android.content.Context import okhttp3.OkHttpClient import okhttp3.Request -import okio.Okio +import okio.buffer +import okio.sink import org.ligi.gobandroid_hd.App import org.ligi.gobandroid_hd.backend.GobandroidBackend import org.ligi.gobandroid_hd.ui.application.GoAndroidEnvironment @@ -58,11 +59,11 @@ object TsumegoDownloadHelper { val build = Request.Builder().url(src.remote_path + fileNameByPos).build() - val responseBody = client.newCall(build).execute().body() + val responseBody = client.newCall(build).execute().body val downloadedFile = File(src.local_path, fileNameByPos) responseBody?.use { body -> - Okio.buffer(Okio.sink(downloadedFile))?.use { sink -> + downloadedFile.sink().buffer().use { sink -> sink.writeAll(body.source()) } } diff --git a/android/src/main/res/layout/game_extra_review.xml b/android/src/main/res/layout/game_extra_review.xml index f9f4d3eda..472cbb284 100644 --- a/android/src/main/res/layout/game_extra_review.xml +++ b/android/src/main/res/layout/game_extra_review.xml @@ -24,6 +24,7 @@ android:id="@+id/scrollview" android:layout_above="@id/container_for_nav"> - + diff --git a/android/src/withAutostart/AndroidManifest.xml b/android/src/withAutostart/AndroidManifest.xml index 580bb91d0..ad7e27aa8 100644 --- a/android/src/withAutostart/AndroidManifest.xml +++ b/android/src/withAutostart/AndroidManifest.xml @@ -1,12 +1,11 @@ - - + diff --git a/android/src/withCloud/AndroidManifest.xml b/android/src/withCloud/AndroidManifest.xml index 92283dceb..161c00439 100644 --- a/android/src/withCloud/AndroidManifest.xml +++ b/android/src/withCloud/AndroidManifest.xml @@ -1,7 +1,5 @@ - - + + android:permission="com.google.android.c2dm.permission.SEND" + android:exported="true"> @@ -45,7 +44,8 @@ - + diff --git a/build.gradle b/build.gradle index befae0525..03791ee7b 100644 --- a/build.gradle +++ b/build.gradle @@ -1,24 +1,25 @@ buildscript { ext { - kotlin_version = '1.4.31' - kotpref_version = '2.13.0' + kotlin_version = '2.2.0' + kotpref_version = '2.13.2' support_version = '28.0.0' play_version = '17.0.0' } repositories { + maven {url 'https://repo1.maven.org/maven2/' } + mavenCentral() google() - jcenter() gradlePluginPortal() maven { url 'https://jitpack.io' } } dependencies { - classpath 'com.android.tools.build:gradle:4.1.2' + classpath 'com.android.tools.build:gradle:8.10.1' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" - classpath 'de.mobilej.unmock:UnMockPlugin:0.7.6' + classpath 'com.github.bjoernq:unmockplugin:0.9.0' classpath 'com.github.ben-manes:gradle-versions-plugin:0.38.0' - classpath 'com.getkeepsafe.dexcount:dexcount-gradle-plugin:2.0.0' + classpath 'com.getkeepsafe.dexcount:dexcount-gradle-plugin:4.0.0' classpath 'com.trevjonez.composer:plugin:1.0.0-rc08' } } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 8cf6eb5ad..3ae1e2f12 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.8.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.3-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists