Skip to content

Commit 78c5f76

Browse files
2dustAnGgIt886
authored andcommitted
Add drag-and-drop sorting to grouping
1 parent ca16c22 commit 78c5f76

12 files changed

+151
-233
lines changed

app/src/main/java/com/neko/v2ray/helper/OnStartDragListener.java

Lines changed: 0 additions & 33 deletions
This file was deleted.

app/src/main/kotlin/com/neko/v2ray/ui/MainActivity.kt

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -164,11 +164,9 @@ class MainActivity : BaseActivity(), NavigationView.OnNavigationItemSelectedList
164164
binding.recyclerView.layoutManager = LinearLayoutManager(this)
165165
binding.recyclerView.adapter = adapter
166166

167-
val callback = SimpleItemTouchHelperCallback(adapter)
168-
mItemTouchHelper = ItemTouchHelper(callback)
167+
mItemTouchHelper = ItemTouchHelper(SimpleItemTouchHelperCallback(adapter))
169168
mItemTouchHelper?.attachToRecyclerView(binding.recyclerView)
170169

171-
172170
val toggle = ActionBarDrawerToggle(
173171
this, binding.drawerLayout, binding.toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close
174172
)

app/src/main/kotlin/com/neko/v2ray/ui/MainRecyclerAdapter.kt

Lines changed: 3 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -230,31 +230,16 @@ class MainRecyclerAdapter(val activity: MainActivity) : RecyclerView.Adapter<Mai
230230
class FooterViewHolder(val itemFooterBinding: ItemRecyclerFooterBinding) :
231231
BaseViewHolder(itemFooterBinding.root)
232232

233-
override fun onItemDismiss(position: Int) {
234-
val guid = mActivity.mainViewModel.serversCache.getOrNull(position)?.guid ?: return
235-
if (guid != MmkvManager.getSelectServer()) {
236-
// mActivity.alert(R.string.del_config_comfirm) {
237-
// positiveButton(android.R.string.ok) {
238-
mActivity.mainViewModel.removeServer(guid)
239-
notifyItemRemoved(position)
240-
// }
241-
// show()
242-
// }
243-
}
244-
}
245-
246233
override fun onItemMove(fromPosition: Int, toPosition: Int): Boolean {
247234
mActivity.mainViewModel.swapServer(fromPosition, toPosition)
248235
notifyItemMoved(fromPosition, toPosition)
249-
// position is changed, since position is used by click callbacks, need to update range
250-
if (toPosition > fromPosition)
251-
notifyItemRangeChanged(fromPosition, toPosition - fromPosition + 1)
252-
else
253-
notifyItemRangeChanged(toPosition, fromPosition - toPosition + 1)
254236
return true
255237
}
256238

257239
override fun onItemMoveCompleted() {
258240
// do nothing
259241
}
242+
243+
override fun onItemDismiss(position: Int) {
244+
}
260245
}

app/src/main/kotlin/com/neko/v2ray/ui/RoutingEditActivity.kt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,6 @@ class RoutingEditActivity : BaseActivity() {
126126
return false
127127
}
128128

129-
Log.d("====", Gson().toJson(rulesetItem))
130129
SettingsManager.saveRoutingRuleset(position, rulesetItem)
131130
toast(R.string.toast_success)
132131
finish()

app/src/main/kotlin/com/neko/v2ray/ui/RoutingSettingActivity.kt

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import android.view.View
88
import android.widget.AdapterView
99
import androidx.appcompat.app.AlertDialog
1010
import androidx.lifecycle.lifecycleScope
11+
import androidx.recyclerview.widget.ItemTouchHelper
1112
import androidx.recyclerview.widget.LinearLayoutManager
1213
import com.google.android.material.appbar.MaterialToolbar
1314
import com.google.android.material.appbar.CollapsingToolbarLayout
@@ -16,6 +17,7 @@ import com.neko.v2ray.R
1617
import com.neko.v2ray.databinding.ActivityRoutingSettingBinding
1718
import com.neko.v2ray.dto.RulesetItem
1819
import com.neko.v2ray.extension.toast
20+
import com.neko.v2ray.helper.SimpleItemTouchHelperCallback
1921
import com.neko.v2ray.util.MmkvManager
2022
import com.neko.v2ray.util.MmkvManager.settingsStorage
2123
import com.neko.v2ray.util.SettingsManager
@@ -28,6 +30,7 @@ class RoutingSettingActivity : BaseActivity() {
2830

2931
var rulesets: MutableList<RulesetItem> = mutableListOf()
3032
private val adapter by lazy { RoutingSettingRecyclerAdapter(this) }
33+
private var mItemTouchHelper: ItemTouchHelper? = null
3134
private val routing_domain_strategy: Array<out String> by lazy {
3235
resources.getStringArray(R.array.routing_domain_strategy)
3336
}
@@ -47,6 +50,9 @@ class RoutingSettingActivity : BaseActivity() {
4750
binding.recyclerView.layoutManager = LinearLayoutManager(this)
4851
binding.recyclerView.adapter = adapter
4952

53+
mItemTouchHelper = ItemTouchHelper(SimpleItemTouchHelperCallback(adapter))
54+
mItemTouchHelper?.attachToRecyclerView(binding.recyclerView)
55+
5056
val found = Utils.arrayFind(routing_domain_strategy, settingsStorage?.decodeString(AppConfig.PREF_ROUTING_DOMAIN_STRATEGY) ?: "")
5157
found.let { binding.spDomainStrategy.setSelection(if (it >= 0) it else 0) }
5258
binding.spDomainStrategy.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
@@ -109,7 +115,7 @@ class RoutingSettingActivity : BaseActivity() {
109115
else -> super.onOptionsItemSelected(item)
110116
}
111117

112-
private fun refreshData() {
118+
fun refreshData() {
113119
rulesets = MmkvManager.decodeRoutingRulesets() ?: mutableListOf()
114120
adapter.notifyDataSetChanged()
115121
}

app/src/main/kotlin/com/neko/v2ray/ui/RoutingSettingRecyclerAdapter.kt

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,17 @@ package com.neko.v2ray.ui
33
import android.content.Intent
44
import android.graphics.Color
55
import android.view.LayoutInflater
6+
import android.view.View
67
import android.view.ViewGroup
78
import androidx.recyclerview.widget.RecyclerView
89
import com.neko.v2ray.databinding.ItemRecyclerRoutingSettingBinding
10+
import com.neko.v2ray.helper.ItemTouchHelperAdapter
11+
import com.neko.v2ray.helper.ItemTouchHelperViewHolder
12+
import com.neko.v2ray.ui.MainRecyclerAdapter.BaseViewHolder
913
import com.neko.v2ray.util.SettingsManager
1014

11-
class RoutingSettingRecyclerAdapter(val activity: RoutingSettingActivity) :
12-
RecyclerView.Adapter<RoutingSettingRecyclerAdapter.MainViewHolder>() {
15+
class RoutingSettingRecyclerAdapter(val activity: RoutingSettingActivity) : RecyclerView.Adapter<RoutingSettingRecyclerAdapter.MainViewHolder>(),
16+
ItemTouchHelperAdapter {
1317

1418
private var mActivity: RoutingSettingActivity = activity
1519
override fun getItemCount() = mActivity.rulesets.size
@@ -47,5 +51,28 @@ class RoutingSettingRecyclerAdapter(val activity: RoutingSettingActivity) :
4751
}
4852

4953
class MainViewHolder(val itemRoutingSettingBinding: ItemRecyclerRoutingSettingBinding) :
50-
RecyclerView.ViewHolder(itemRoutingSettingBinding.root)
54+
BaseViewHolder(itemRoutingSettingBinding.root), ItemTouchHelperViewHolder
55+
56+
open class BaseViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
57+
fun onItemSelected() {
58+
itemView.setBackgroundColor(Color.LTGRAY)
59+
}
60+
61+
fun onItemClear() {
62+
itemView.setBackgroundColor(0)
63+
}
64+
}
65+
66+
override fun onItemMove(fromPosition: Int, toPosition: Int): Boolean {
67+
SettingsManager.swapRoutingRuleset(fromPosition, toPosition)
68+
notifyItemMoved(fromPosition, toPosition)
69+
return true
70+
}
71+
72+
override fun onItemMoveCompleted() {
73+
mActivity.refreshData()
74+
}
75+
76+
override fun onItemDismiss(position: Int) {
77+
}
5178
}

app/src/main/kotlin/com/neko/v2ray/ui/SubEditActivity.kt

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -123,11 +123,9 @@ class SubEditActivity : BaseActivity() {
123123
private fun saveServer(): Boolean {
124124
val subItem: SubscriptionItem
125125
val json = subStorage?.decodeString(editSubId)
126-
var subId = editSubId
127126
if (!json.isNullOrBlank()) {
128127
subItem = Gson().fromJson(json, SubscriptionItem::class.java)
129128
} else {
130-
subId = Utils.getUuid()
131129
subItem = SubscriptionItem()
132130
}
133131

@@ -147,7 +145,7 @@ class SubEditActivity : BaseActivity() {
147145
// return false
148146
// }
149147

150-
subStorage?.encode(subId, Gson().toJson(subItem))
148+
MmkvManager.encodeSubscription(editSubId, subItem)
151149
toast(R.string.toast_success)
152150
finish()
153151
return true

app/src/main/kotlin/com/neko/v2ray/ui/SubSettingActivity.kt

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,20 @@ package com.neko.v2ray.ui
22

33
import android.content.Intent
44
import android.os.Bundle
5-
import com.google.android.material.appbar.MaterialToolbar
65
import android.view.Menu
76
import android.view.MenuItem
7+
import com.google.android.material.appbar.MaterialToolbar
8+
import com.google.android.material.appbar.CollapsingToolbarLayout
89
import com.google.android.material.dialog.MaterialAlertDialogBuilder
910
import androidx.lifecycle.lifecycleScope
11+
import androidx.recyclerview.widget.ItemTouchHelper
1012
import androidx.recyclerview.widget.LinearLayoutManager
1113
import com.neko.v2ray.R
12-
import com.google.android.material.appbar.CollapsingToolbarLayout
1314
import com.neko.v2ray.databinding.ActivitySubSettingBinding
1415
import com.neko.v2ray.databinding.LayoutProgressBinding
1516
import com.neko.v2ray.dto.SubscriptionItem
1617
import com.neko.v2ray.extension.toast
18+
import com.neko.v2ray.helper.SimpleItemTouchHelperCallback
1719
import com.neko.v2ray.util.AngConfigManager
1820
import com.neko.v2ray.util.MmkvManager
1921
import com.neko.v2ray.util.SoftInputAssist
@@ -27,6 +29,7 @@ class SubSettingActivity : BaseActivity() {
2729

2830
var subscriptions: List<Pair<String, SubscriptionItem>> = listOf()
2931
private val adapter by lazy { SubSettingRecyclerAdapter(this) }
32+
private var mItemTouchHelper: ItemTouchHelper? = null
3033

3134
override fun onCreate(savedInstanceState: Bundle?) {
3235
super.onCreate(savedInstanceState)
@@ -36,19 +39,20 @@ class SubSettingActivity : BaseActivity() {
3639
val toolbarLayout = findViewById<CollapsingToolbarLayout>(R.id.collapsing_toolbar)
3740
setSupportActionBar(toolbar)
3841
supportActionBar?.setDisplayHomeAsUpEnabled(true)
42+
softInputAssist = SoftInputAssist(this)
3943

4044
binding.recyclerView.setHasFixedSize(true)
4145
binding.recyclerView.layoutManager = LinearLayoutManager(this)
4246
binding.recyclerView.adapter = adapter
4347

44-
softInputAssist = SoftInputAssist(this)
48+
mItemTouchHelper = ItemTouchHelper(SimpleItemTouchHelperCallback(adapter))
49+
mItemTouchHelper?.attachToRecyclerView(binding.recyclerView)
4550
}
4651

4752
override fun onResume() {
4853
softInputAssist.onResume()
4954
super.onResume()
50-
subscriptions = MmkvManager.decodeSubscriptions()
51-
adapter.notifyDataSetChanged()
55+
refreshData()
5256
}
5357

5458
override fun onPause() {
@@ -97,4 +101,9 @@ class SubSettingActivity : BaseActivity() {
97101
else -> super.onOptionsItemSelected(item)
98102

99103
}
104+
105+
fun refreshData() {
106+
subscriptions = MmkvManager.decodeSubscriptions()
107+
adapter.notifyDataSetChanged()
108+
}
100109
}

app/src/main/kotlin/com/neko/v2ray/ui/SubSettingRecyclerAdapter.kt

Lines changed: 31 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,17 +8,18 @@ import android.view.View
88
import android.view.ViewGroup
99
import com.google.android.material.dialog.MaterialAlertDialogBuilder
1010
import androidx.recyclerview.widget.RecyclerView
11-
import com.google.gson.Gson
1211
import com.neko.v2ray.R
1312
import com.neko.v2ray.databinding.ItemQrcodeBinding
1413
import com.neko.v2ray.databinding.ItemRecyclerSubSettingBinding
1514
import com.neko.v2ray.extension.toast
16-
import com.neko.v2ray.util.MmkvManager.subStorage
15+
import com.neko.v2ray.helper.ItemTouchHelperAdapter
16+
import com.neko.v2ray.helper.ItemTouchHelperViewHolder
17+
import com.neko.v2ray.util.MmkvManager
1718
import com.neko.v2ray.util.QRCodeDecoder
19+
import com.neko.v2ray.util.SettingsManager
1820
import com.neko.v2ray.util.Utils
1921

20-
class SubSettingRecyclerAdapter(val activity: SubSettingActivity) :
21-
RecyclerView.Adapter<SubSettingRecyclerAdapter.MainViewHolder>() {
22+
class SubSettingRecyclerAdapter(val activity: SubSettingActivity) : RecyclerView.Adapter<SubSettingRecyclerAdapter.MainViewHolder>(), ItemTouchHelperAdapter {
2223

2324
private var mActivity: SubSettingActivity = activity
2425

@@ -44,7 +45,8 @@ class SubSettingRecyclerAdapter(val activity: SubSettingActivity) :
4445
}
4546
holder.itemSubSettingBinding.chkEnable.setOnCheckedChangeListener { _, isChecked ->
4647
subItem.enabled = isChecked
47-
subStorage?.encode(subId, Gson().toJson(subItem))
48+
MmkvManager.encodeSubscription(subId, subItem)
49+
4850
}
4951

5052
if (TextUtils.isEmpty(subItem.url)) {
@@ -92,5 +94,28 @@ class SubSettingRecyclerAdapter(val activity: SubSettingActivity) :
9294
}
9395

9496
class MainViewHolder(val itemSubSettingBinding: ItemRecyclerSubSettingBinding) :
95-
RecyclerView.ViewHolder(itemSubSettingBinding.root)
97+
BaseViewHolder(itemSubSettingBinding.root), ItemTouchHelperViewHolder
98+
99+
open class BaseViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
100+
fun onItemSelected() {
101+
itemView.setBackgroundColor(Color.LTGRAY)
102+
}
103+
104+
fun onItemClear() {
105+
itemView.setBackgroundColor(0)
106+
}
107+
}
108+
109+
override fun onItemMove(fromPosition: Int, toPosition: Int): Boolean {
110+
SettingsManager.swapSubscriptions(fromPosition, toPosition)
111+
notifyItemMoved(fromPosition, toPosition)
112+
return true
113+
}
114+
115+
override fun onItemMoveCompleted() {
116+
mActivity.refreshData()
117+
}
118+
119+
override fun onItemDismiss(position: Int) {
120+
}
96121
}

0 commit comments

Comments
 (0)