@@ -2,10 +2,14 @@ package remix.myplayer.ui.misc
2
2
3
3
import android.annotation.SuppressLint
4
4
import android.app.Activity
5
+ import android.graphics.Color
6
+ import android.graphics.drawable.ColorDrawable
7
+ import android.graphics.drawable.GradientDrawable
5
8
import android.text.TextUtils
9
+ import android.view.Gravity
6
10
import android.view.View
7
- import android.widget.PopupMenu
8
- import com.tencent.bugly.crashreport.CrashReport
11
+ import android.widget.PopupWindow
12
+ import androidx.appcompat.widget.AppCompatTextView
9
13
import io.reactivex.Single
10
14
import io.reactivex.android.schedulers.AndroidSchedulers
11
15
import io.reactivex.disposables.CompositeDisposable
@@ -23,11 +27,23 @@ import remix.myplayer.db.room.model.PlayList
23
27
import remix.myplayer.misc.getSongIds
24
28
import remix.myplayer.theme.Theme
25
29
import remix.myplayer.theme.Theme.getBaseDialog
30
+ import remix.myplayer.theme.ThemeStore
26
31
import remix.myplayer.ui.activity.base.BaseActivity
27
- import remix.myplayer.ui.adapter.*
32
+ import remix.myplayer.ui.adapter.AlbumAdapter
33
+ import remix.myplayer.ui.adapter.ArtistAdapter
34
+ import remix.myplayer.ui.adapter.BaseAdapter
35
+ import remix.myplayer.ui.adapter.ChildHolderAdapter
36
+ import remix.myplayer.ui.adapter.GenreAdapter
37
+ import remix.myplayer.ui.adapter.PlayListAdapter
38
+ import remix.myplayer.ui.adapter.SongAdapter
28
39
import remix.myplayer.ui.widget.MultiPopupWindow
29
- import remix.myplayer.util.*
40
+ import remix.myplayer.util.Constants
41
+ import remix.myplayer.util.DensityUtil
42
+ import remix.myplayer.util.MediaStoreUtil
30
43
import remix.myplayer.util.RxUtil.applySingleScheduler
44
+ import remix.myplayer.util.SPUtil
45
+ import remix.myplayer.util.ToastUtil
46
+ import remix.myplayer.util.Util
31
47
import java.lang.ref.WeakReference
32
48
33
49
class MultipleChoice <T >(activity : Activity , val type : Int ) {
@@ -46,6 +62,7 @@ class MultipleChoice<T>(activity: Activity, val type: Int) {
46
62
var isActive: Boolean = false
47
63
var adapter: BaseAdapter <T , * >? = null
48
64
private var popup: MultiPopupWindow ? = null
65
+ private var menuPopup: MenuPopup ? = null
49
66
var extra: Long = 0
50
67
51
68
private fun getSongsSingle (ids : List <Long >): Single <List <Song >> {
@@ -71,26 +88,31 @@ class MultipleChoice<T>(activity: Activity, val type: Int) {
71
88
ids.add((it as Song ).id)
72
89
}
73
90
}
91
+
74
92
Constants .ALBUM -> {
75
93
checkParam.forEach {
76
94
ids.addAll((it as Album ).getSongIds())
77
95
}
78
96
}
97
+
79
98
Constants .ARTIST -> {
80
99
checkParam.forEach {
81
100
ids.addAll((it as Artist ).getSongIds())
82
101
}
83
102
}
103
+
84
104
Constants .PLAYLIST -> {
85
105
checkParam.forEach {
86
106
ids.addAll((it as PlayList ).audioIds)
87
107
}
88
108
}
109
+
89
110
Constants .FOLDER -> {
90
111
checkParam.forEach {
91
112
ids.addAll((it as Folder ).getSongIds())
92
113
}
93
114
}
115
+
94
116
Constants .GENRE -> {
95
117
checkParam.forEach {
96
118
ids.addAll((it as Genre ).getSongIds())
@@ -111,26 +133,31 @@ class MultipleChoice<T>(activity: Activity, val type: Int) {
111
133
ids.add((it as Song ).id)
112
134
}
113
135
}
136
+
114
137
Constants .ALBUM -> {
115
138
checkParam.forEach {
116
139
ids.addAll((it as Album ).getSongIds())
117
140
}
118
141
}
142
+
119
143
Constants .ARTIST -> {
120
144
checkParam.forEach {
121
145
ids.addAll((it as Artist ).getSongIds())
122
146
}
123
147
}
148
+
124
149
Constants .PLAYLIST -> {
125
150
checkParam.forEach {
126
151
ids.addAll((it as PlayList ).audioIds.toList())
127
152
}
128
153
}
154
+
129
155
Constants .FOLDER -> {
130
156
checkParam.forEach {
131
157
ids.addAll((it as Folder ).getSongIds())
132
158
}
133
159
}
160
+
134
161
Constants .GENRE -> {
135
162
checkParam.forEach {
136
163
ids.addAll((it as Genre ).getSongIds())
@@ -200,13 +227,15 @@ class MultipleChoice<T>(activity: Activity, val type: Int) {
200
227
201
228
songs.size
202
229
}
230
+
203
231
Constants .PLAYLISTSONG -> { // 删除播放列表内歌曲
204
232
if (deleteSource) {
205
233
MediaStoreUtil .delete(activityRef.get() as BaseActivity , songs, true )
206
234
} else {
207
235
databaseRepository.deleteFromPlayList(songs.map { it.id }, extra).blockingGet()
208
236
}
209
237
}
238
+
210
239
else -> {
211
240
MediaStoreUtil .delete(activityRef.get() as BaseActivity , songs, deleteSource)
212
241
}
@@ -396,6 +425,8 @@ class MultipleChoice<T>(activity: Activity, val type: Int) {
396
425
if (activity.isDestroyed || activity.isFinishing || ! activity.hasWindowFocus()) {
397
426
return
398
427
}
428
+ val anchor = View (activity)
429
+
399
430
popup = MultiPopupWindow (activity)
400
431
popup!! .binding.multiClose.setOnClickListener { close() }
401
432
popup!! .binding.multiPlaylist.setOnClickListener { addToPlayList() }
@@ -405,27 +436,26 @@ class MultipleChoice<T>(activity: Activity, val type: Int) {
405
436
}
406
437
popup!! .binding.multiDelete.setOnClickListener { delete() }
407
438
popup!! .binding.multiMore.setOnClickListener {
408
- PopupMenu (activity, popup!! .binding.multiMore).run {
409
- inflate(R .menu.menu_multi_select_more)
410
- setOnMenuItemClickListener {
411
- when (it.itemId) {
412
- R .id.select_all -> selectAll()
413
- }
414
- true
415
- }
416
- if (! activity.isFinishing && ! activity.isDestroyed && activity.hasWindowFocus()) {
417
- try {
418
- show()
419
- } catch (e: Exception ) {
420
- CrashReport .postCatchedException(Exception (" ac: $activity " , e))
421
- }
439
+ menuPopup?.dismiss()
440
+ menuPopup = MenuPopup (activity).apply {
441
+ contentView?.setOnClickListener {
442
+ selectAll()
443
+ dismiss()
422
444
}
445
+ contentView.measure(0 , 0 )
446
+ showAsDropDown(anchor, activity.window.decorView.measuredWidth - contentView.measuredWidth, popup!! .contentView.measuredHeight - DensityUtil .dip2px(8f ))
423
447
}
424
448
}
425
- popup!! .show(View (activity) )
449
+ popup!! .show(anchor )
426
450
}
427
451
428
452
fun close () {
453
+ if (menuPopup?.isShowing == true ) {
454
+ menuPopup?.dismiss()
455
+ menuPopup = null
456
+ return
457
+ }
458
+
429
459
disposableContainer.clear()
430
460
isActive = false
431
461
isActiveSomeWhere = false
@@ -442,6 +472,35 @@ class MultipleChoice<T>(activity: Activity, val type: Int) {
442
472
return " MultipleChoice(activity=${activityRef.get()} , type=$type , checkPos=$checkPos , checkParam=$checkParam , isActive=$isActive , adapter=$adapter , popup=$popup , extra=$extra )"
443
473
}
444
474
475
+ private class MenuPopup (activity : Activity ) : PopupWindow(activity) {
476
+
477
+ init {
478
+ val textView = AppCompatTextView (activity)
479
+ textView.setText(R .string.select_all)
480
+ textView.setPadding(DensityUtil .dip2px(16f ),
481
+ DensityUtil .dip2px(16f ),
482
+ DensityUtil .dip2px(128f ),
483
+ DensityUtil .dip2px(16f ))
484
+ textView.textSize = 16f
485
+ textView.gravity = Gravity .CENTER_VERTICAL or Gravity .START
486
+ textView.setTextColor(if (ThemeStore .isLightTheme) Color .BLACK else Color .WHITE )
487
+ textView.setBackgroundDrawable(GradientDrawable ().apply {
488
+ setColor(ThemeStore .getBackgroundColorMain(activity))
489
+ val corner = DensityUtil .dip2px(2f ).toFloat()
490
+ cornerRadii = floatArrayOf(
491
+ corner, corner,
492
+ 0f , 0f ,
493
+ 0f , 0f ,
494
+ corner, corner
495
+ )
496
+ })
497
+
498
+ setContentView(textView)
499
+
500
+ setBackgroundDrawable(ColorDrawable (Color .TRANSPARENT ))
501
+ }
502
+ }
503
+
445
504
446
505
companion object {
447
506
@JvmStatic
0 commit comments