diff --git a/res/drawable/refresh_24px.xml b/res/drawable/refresh_24px.xml
new file mode 100644
index 000000000..793139cdb
--- /dev/null
+++ b/res/drawable/refresh_24px.xml
@@ -0,0 +1,10 @@
+
+
+
diff --git a/res/layout/beatmap_downloader_fragment.xml b/res/layout/beatmap_downloader_fragment.xml
index e226d0de6..2908dcabc 100644
--- a/res/layout/beatmap_downloader_fragment.xml
+++ b/res/layout/beatmap_downloader_fragment.xml
@@ -47,23 +47,40 @@
android:id="@+id/logo"
android:layout_width="100dp"
android:layout_height="36dp"
- android:layout_marginRight="12dp"
- android:src="@drawable/powered_by_osudirect"
+ android:layout_alignParentRight="true"
android:layout_centerVertical="true"
- android:layout_alignParentRight="true"/>
+ android:layout_marginRight="12dp"
+ android:src="@drawable/powered_by_osudirect" />
+ app:indicatorSize="20dp"
+ app:trackCornerRadius="2dp"
+ app:trackThickness="3dp" />
+
+
diff --git a/src/com/reco1l/osu/beatmaplisting/BeatmapListing.kt b/src/com/reco1l/osu/beatmaplisting/BeatmapListing.kt
index 51970a382..548e0dbf9 100644
--- a/src/com/reco1l/osu/beatmaplisting/BeatmapListing.kt
+++ b/src/com/reco1l/osu/beatmaplisting/BeatmapListing.kt
@@ -2,10 +2,22 @@ package com.reco1l.osu.beatmaplisting
import android.graphics.BitmapFactory
import android.util.Log
-import android.view.*
-import android.view.View.*
+import android.view.ContextThemeWrapper
+import android.view.KeyEvent
+import android.view.LayoutInflater
+import android.view.View
+import android.view.View.GONE
+import android.view.View.OnKeyListener
+import android.view.View.VISIBLE
+import android.view.ViewGroup
+import android.view.ViewOutlineProvider
import android.view.inputmethod.EditorInfo
-import android.widget.*
+import android.widget.Button
+import android.widget.EditText
+import android.widget.ImageButton
+import android.widget.ImageView
+import android.widget.LinearLayout
+import android.widget.TextView
import android.widget.TextView.OnEditorActionListener
import androidx.core.text.buildSpannedString
import androidx.core.text.color
@@ -21,7 +33,12 @@ import com.reco1l.framework.net.IDownloaderObserver
import com.reco1l.framework.net.JsonArrayRequest
import com.reco1l.osu.OsuColors
import com.reco1l.osu.mainThread
-import kotlinx.coroutines.*
+import kotlinx.coroutines.CoroutineExceptionHandler
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.Job
+import kotlinx.coroutines.launch
+import kotlinx.coroutines.SupervisorJob
import ru.nsu.ccfit.zuev.audio.Status
import ru.nsu.ccfit.zuev.osu.Config
import ru.nsu.ccfit.zuev.osu.GlobalManager
@@ -30,27 +47,21 @@ import ru.nsu.ccfit.zuev.osu.ToastLogger
import ru.nsu.ccfit.zuev.osuplus.R
import java.net.URL
import java.text.SimpleDateFormat
-import java.util.*
+import java.util.TimeZone
-object BeatmapListing : BaseFragment(),
+class BeatmapListing : BaseFragment(),
IDownloaderObserver,
OnEditorActionListener,
OnKeyListener {
- var mirror = BeatmapMirror.OSU_DIRECT
-
- var isPlayingMusic = false
- private set
-
-
override val layoutID = R.layout.beatmap_downloader_fragment
private val adapter = BeatmapSetAdapter()
- private val searchScope = CoroutineScope(Dispatchers.IO)
+ private val searchScope = CoroutineScope(Dispatchers.IO + SupervisorJob())
private val scrollListener = object : OnScrollListener() {
@@ -76,9 +87,20 @@ object BeatmapListing : BaseFragment(),
private lateinit var recyclerView: RecyclerView
+ private lateinit var retryButton: Button
+
private lateinit var searchBox: EditText
+ init {
+ current?.dismiss()
+
+ mainThread {
+ current = this
+ }
+ }
+
+
override fun onLoadView() {
val itemWidth = resources.getDimension(R.dimen.beatmap_downloader_item_width)
@@ -91,14 +113,16 @@ object BeatmapListing : BaseFragment(),
recyclerView.addOnScrollListener(scrollListener)
recyclerView.adapter = adapter
+ retryButton = findViewById(R.id.refresh)!!
+ retryButton.setOnClickListener { search(true) }
+
searchBox = findViewById(R.id.search)!!
searchBox.setOnEditorActionListener(this)
searchBox.setOnKeyListener(this)
indicator = findViewById(R.id.indicator)!!
- val close = findViewById(R.id.close)!!
- close.setOnClickListener {
+ findViewById(R.id.close)!!.setOnClickListener {
dismiss()
}
@@ -108,7 +132,10 @@ object BeatmapListing : BaseFragment(),
fun search(keepData: Boolean) {
- mainThread { indicator.visibility = VISIBLE }
+ mainThread {
+ indicator.visibility = VISIBLE
+ retryButton.visibility = GONE
+ }
pendingRequest?.cancel()
pendingRequest = searchScope.launch(CoroutineExceptionHandler { _, throwable ->
@@ -119,10 +146,7 @@ object BeatmapListing : BaseFragment(),
mainThread {
indicator.visibility = GONE
-
- if (adapter.data.isEmpty()) {
- dismiss()
- }
+ retryButton.visibility = VISIBLE
}
}) {
@@ -164,7 +188,7 @@ object BeatmapListing : BaseFragment(),
}
fun stopPreviews(shouldResumeMusic: Boolean) {
- if (!BeatmapListing::recyclerView.isInitialized) {
+ if (!::recyclerView.isInitialized) {
return
}
@@ -207,17 +231,25 @@ object BeatmapListing : BaseFragment(),
stopPreviews(true)
pendingRequest?.cancel()
- pendingRequest = null
-
- offset = 0
- adapter.data.clear()
mainThread {
- searchBox.text = null
- adapter.notifyDataSetChanged()
super.dismiss()
+ current = null
}
}
+
+
+ companion object {
+
+ var current: BeatmapListing? = null
+
+ var mirror = BeatmapMirror.OSU_DIRECT
+
+ var isPlayingMusic = false
+ private set
+
+ }
+
}
@@ -297,7 +329,7 @@ class BeatmapSetDetails(val beatmapSet: BeatmapSetModel, val holder: BeatmapSetV
previewButton.setOnClickListener {
if (holder.previewStream == null) {
- BeatmapListing.stopPreviews(false)
+ BeatmapListing.current!!.stopPreviews(false)
holder.playPreview(beatmapSet)
} else {
holder.stopPreview(true)
@@ -496,7 +528,7 @@ class BeatmapSetViewHolder(itemView: View, private val mediaScope: CoroutineScop
previewButton.setOnClickListener {
if (previewStream == null) {
- BeatmapListing.stopPreviews(false)
+ BeatmapListing.current!!.stopPreviews(false)
playPreview(beatmapSet)
} else {
stopPreview(true)
@@ -518,7 +550,7 @@ class BeatmapSetViewHolder(itemView: View, private val mediaScope: CoroutineScop
fun playPreview(beatmapSet: BeatmapSetModel) {
previewJob = mediaScope.launch {
- BeatmapListing.stopPreviews(true)
+ BeatmapListing.current!!.stopPreviews(true)
try {
previewStream = URLBassStream(BeatmapListing.mirror.previewEndpoint(beatmapSet.beatmaps[0].id)) {
diff --git a/src/com/reco1l/osu/ui/BeatmapButton.kt b/src/com/reco1l/osu/ui/BeatmapButton.kt
index 828c00097..72ac91919 100644
--- a/src/com/reco1l/osu/ui/BeatmapButton.kt
+++ b/src/com/reco1l/osu/ui/BeatmapButton.kt
@@ -86,7 +86,7 @@ class BeatmapButton : Sprite(0f, 0f, getResources().getTexture("menu-button-back
if (libraryManager.library.isEmpty())
{
getGlobal().songService.pause()
- BeatmapListing.show()
+ BeatmapListing().show()
return true
}
diff --git a/src/com/reco1l/osu/ui/MainMenu.kt b/src/com/reco1l/osu/ui/MainMenu.kt
index b16ca2d33..0c6b46dfa 100644
--- a/src/com/reco1l/osu/ui/MainMenu.kt
+++ b/src/com/reco1l/osu/ui/MainMenu.kt
@@ -77,7 +77,7 @@ class MainMenu(val main: MainScene)
getGlobal().songService.isGaming = false
getGlobal().engine.scene = main.scene
- BeatmapListing.show()
+ BeatmapListing().show()
} else {
main.musicControl(MusicOption.PLAY)
diff --git a/src/ru/nsu/ccfit/zuev/osu/MainScene.java b/src/ru/nsu/ccfit/zuev/osu/MainScene.java
index 745f5387b..773803794 100644
--- a/src/ru/nsu/ccfit/zuev/osu/MainScene.java
+++ b/src/ru/nsu/ccfit/zuev/osu/MainScene.java
@@ -428,7 +428,7 @@ public boolean onAreaTouched(TouchEvent pSceneTouchEvent, float pTouchAreaLocalX
if (pSceneTouchEvent.isActionUp()) {
setColor(1, 1, 1);
- BeatmapListing.INSTANCE.show();
+ new BeatmapListing().show();
return true;
}