1
1
package com.v2ray.ang.ui
2
2
3
+ import android.Manifest
3
4
import android.content.Intent
4
5
import android.os.Bundle
5
6
import android.view.Menu
6
7
import android.view.MenuItem
7
8
import android.view.View
8
9
import android.widget.AdapterView
10
+ import androidx.activity.result.contract.ActivityResultContracts
9
11
import androidx.appcompat.app.AlertDialog
10
12
import androidx.lifecycle.lifecycleScope
11
13
import androidx.recyclerview.widget.ItemTouchHelper
12
14
import androidx.recyclerview.widget.LinearLayoutManager
15
+ import com.tbruyelle.rxpermissions3.RxPermissions
13
16
import com.v2ray.ang.AppConfig
14
17
import com.v2ray.ang.R
15
18
import com.v2ray.ang.databinding.ActivityRoutingSettingBinding
@@ -83,13 +86,13 @@ class RoutingSettingActivity : BaseActivity() {
83
86
true
84
87
}
85
88
86
- R .id.import_rulesets -> {
89
+ R .id.import_predefined_rulesets -> {
87
90
AlertDialog .Builder (this ).setMessage(R .string.routing_settings_import_rulesets_tip)
88
91
.setPositiveButton(android.R .string.ok) { _, _ ->
89
92
AlertDialog .Builder (this ).setItems(preset_rulesets.asList().toTypedArray()) { _, i ->
90
93
try {
91
94
lifecycleScope.launch(Dispatchers .IO ) {
92
- SettingsManager .resetRoutingRulesets (this @RoutingSettingActivity, i)
95
+ SettingsManager .resetRoutingRulesetsFromPresets (this @RoutingSettingActivity, i)
93
96
launch(Dispatchers .Main ) {
94
97
refreshData()
95
98
toast(R .string.toast_success)
@@ -120,7 +123,7 @@ class RoutingSettingActivity : BaseActivity() {
120
123
return @setPositiveButton
121
124
}
122
125
lifecycleScope.launch(Dispatchers .IO ) {
123
- val result = SettingsManager .resetRoutingRulesetsFromClipboard (clipboard)
126
+ val result = SettingsManager .resetRoutingRulesets (clipboard)
124
127
withContext(Dispatchers .Main ) {
125
128
if (result) {
126
129
refreshData()
@@ -138,6 +141,18 @@ class RoutingSettingActivity : BaseActivity() {
138
141
true
139
142
}
140
143
144
+ R .id.import_rulesets_from_qrcode -> {
145
+ RxPermissions (this )
146
+ .request(Manifest .permission.CAMERA )
147
+ .subscribe {
148
+ if (it)
149
+ scanQRcodeForRulesets.launch(Intent (this , ScannerActivity ::class .java))
150
+ else
151
+ toast(R .string.toast_permission_denied)
152
+ }
153
+ true
154
+ }
155
+
141
156
142
157
R .id.export_rulesets_to_clipboard -> {
143
158
val rulesetList = MmkvManager .decodeRoutingRulesets()
@@ -153,6 +168,34 @@ class RoutingSettingActivity : BaseActivity() {
153
168
else -> super .onOptionsItemSelected(item)
154
169
}
155
170
171
+ private val scanQRcodeForRulesets = registerForActivityResult(ActivityResultContracts .StartActivityForResult ()) {
172
+ if (it.resultCode == RESULT_OK ) {
173
+ importRulesetsFromQRcode(it.data?.getStringExtra(" SCAN_RESULT" ))
174
+ }
175
+ }
176
+
177
+ private fun importRulesetsFromQRcode (qrcode : String? ): Boolean {
178
+ AlertDialog .Builder (this ).setMessage(R .string.routing_settings_import_rulesets_tip)
179
+ .setPositiveButton(android.R .string.ok) { _, _ ->
180
+ lifecycleScope.launch(Dispatchers .IO ) {
181
+ val result = SettingsManager .resetRoutingRulesets(qrcode)
182
+ withContext(Dispatchers .Main ) {
183
+ if (result) {
184
+ refreshData()
185
+ toast(R .string.toast_success)
186
+ } else {
187
+ toast(R .string.toast_failure)
188
+ }
189
+ }
190
+ }
191
+ }
192
+ .setNegativeButton(android.R .string.no) { _, _ ->
193
+ // do nothing
194
+ }
195
+ .show()
196
+ return true
197
+ }
198
+
156
199
fun refreshData () {
157
200
rulesets.clear()
158
201
rulesets.addAll(MmkvManager .decodeRoutingRulesets() ? : mutableListOf ())
0 commit comments