diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/MainActivity.kt b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/MainActivity.kt index 5a7b1f5fe..ecbbec167 100644 --- a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/MainActivity.kt +++ b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/MainActivity.kt @@ -17,6 +17,7 @@ import android.view.KeyEvent import android.view.Menu import android.view.MenuItem import android.widget.Toast +import androidx.activity.result.contract.ActivityResultContracts import com.tbruyelle.rxpermissions.RxPermissions import com.tencent.mmkv.MMKV import com.v2ray.ang.AppConfig @@ -43,17 +44,16 @@ import java.net.URL import java.util.concurrent.TimeUnit class MainActivity : BaseActivity(), NavigationView.OnNavigationItemSelectedListener { - companion object { - private const val REQUEST_CODE_VPN_PREPARE = 0 - private const val REQUEST_SCAN = 1 - private const val REQUEST_FILE_CHOOSER = 2 - private const val REQUEST_SCAN_URL = 3 - } private lateinit var binding: ActivityMainBinding private val adapter by lazy { MainRecyclerAdapter(this) } private val mainStorage by lazy { MMKV.mmkvWithID(MmkvManager.ID_MAIN, MMKV.MULTI_PROCESS_MODE) } private val settingsStorage by lazy { MMKV.mmkvWithID(MmkvManager.ID_SETTING, MMKV.MULTI_PROCESS_MODE) } + private val requestVpnPermission = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { + if (it.resultCode == RESULT_OK) { + startV2Ray() + } + } private var mItemTouchHelper: ItemTouchHelper? = null val mainViewModel: MainViewModel by lazy { ViewModelProviders.of(this).get(MainViewModel::class.java) } @@ -73,7 +73,7 @@ class MainActivity : BaseActivity(), NavigationView.OnNavigationItemSelectedList if (intent == null) { startV2Ray() } else { - startActivityForResult(intent, REQUEST_CODE_VPN_PREPARE) + requestVpnPermission.launch(intent) } } else { startV2Ray() @@ -170,30 +170,6 @@ class MainActivity : BaseActivity(), NavigationView.OnNavigationItemSelectedList super.onPause() } - override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { - super.onActivityResult(requestCode, resultCode, data) - when (requestCode) { - REQUEST_CODE_VPN_PREPARE -> - if (resultCode == RESULT_OK) { - startV2Ray() - } - REQUEST_SCAN -> - if (resultCode == RESULT_OK) { - importBatchConfig(data?.getStringExtra("SCAN_RESULT")) - } - REQUEST_FILE_CHOOSER -> { - val uri = data?.data - if (resultCode == RESULT_OK && uri != null) { - readContentFromUri(uri) - } - } - REQUEST_SCAN_URL -> - if (resultCode == RESULT_OK) { - importConfigCustomUrl(data?.getStringExtra("SCAN_RESULT")) - } - } - } - override fun onCreateOptionsMenu(menu: Menu?): Boolean { menuInflater.inflate(R.menu.menu_main, menu) return true @@ -201,7 +177,7 @@ class MainActivity : BaseActivity(), NavigationView.OnNavigationItemSelectedList override fun onOptionsItemSelected(item: MenuItem) = when (item.itemId) { R.id.import_qrcode -> { - importQRcode(REQUEST_SCAN) + importQRcode(true) true } R.id.import_clipboard -> { @@ -236,7 +212,7 @@ class MainActivity : BaseActivity(), NavigationView.OnNavigationItemSelectedList true } R.id.import_config_custom_url_scan -> { - importQRcode(REQUEST_SCAN_URL) + importQRcode(false) true } @@ -279,7 +255,7 @@ class MainActivity : BaseActivity(), NavigationView.OnNavigationItemSelectedList /** * import config from qrcode */ - fun importQRcode(requestCode: Int): Boolean { + fun importQRcode(forConfig: Boolean): Boolean { // try { // startActivityForResult(Intent("com.google.zxing.client.android.SCAN") // .addCategory(Intent.CATEGORY_DEFAULT) @@ -289,7 +265,10 @@ class MainActivity : BaseActivity(), NavigationView.OnNavigationItemSelectedList .request(Manifest.permission.CAMERA) .subscribe { if (it) - startActivityForResult(Intent(this, ScannerActivity::class.java), requestCode) + if (forConfig) + scanQRCodeForConfig.launch(Intent(this, ScannerActivity::class.java)) + else + scanQRCodeForUrlToCustomConfig.launch(Intent(this, ScannerActivity::class.java)) else toast(R.string.toast_permission_denied) } @@ -297,6 +276,18 @@ class MainActivity : BaseActivity(), NavigationView.OnNavigationItemSelectedList return true } + private val scanQRCodeForConfig = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { + if (it.resultCode == RESULT_OK) { + importBatchConfig(it.data?.getStringExtra("SCAN_RESULT")) + } + } + + private val scanQRCodeForUrlToCustomConfig = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { + if (it.resultCode == RESULT_OK) { + importConfigCustomUrl(it.data?.getStringExtra("SCAN_RESULT")) + } + } + /** * import config from clipboard */ @@ -443,14 +434,19 @@ class MainActivity : BaseActivity(), NavigationView.OnNavigationItemSelectedList intent.addCategory(Intent.CATEGORY_OPENABLE) try { - startActivityForResult( - Intent.createChooser(intent, getString(R.string.title_file_chooser)), - REQUEST_FILE_CHOOSER) + chooseFileForCustomConfig.launch(Intent.createChooser(intent, getString(R.string.title_file_chooser))) } catch (ex: android.content.ActivityNotFoundException) { toast(R.string.toast_require_file_manager) } } + private val chooseFileForCustomConfig = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { + val uri = it.data?.data + if (it.resultCode == RESULT_OK && uri != null) { + readContentFromUri(uri) + } + } + /** * read content from uri */ diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/RoutingSettingsFragment.kt b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/RoutingSettingsFragment.kt index b798edd26..37d1788a4 100644 --- a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/RoutingSettingsFragment.kt +++ b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/RoutingSettingsFragment.kt @@ -11,6 +11,7 @@ import com.v2ray.ang.R import com.v2ray.ang.util.Utils import kotlinx.android.synthetic.main.fragment_routing_settings.* import android.view.MenuInflater +import androidx.activity.result.contract.ActivityResultContracts import com.tbruyelle.rxpermissions.RxPermissions import com.v2ray.ang.AppConfig import com.v2ray.ang.extension.toast @@ -22,8 +23,6 @@ import java.net.URL class RoutingSettingsFragment : Fragment() { companion object { private const val routing_arg = "routing_arg" - private const val REQUEST_SCAN_REPLACE = 11 - private const val REQUEST_SCAN_APPEND = 12 } val defaultSharedPreferences by lazy { PreferenceManager.getDefaultSharedPreferences(context) } @@ -68,11 +67,11 @@ class RoutingSettingsFragment : Fragment() { true } R.id.scan_replace -> { - scanQRcode(REQUEST_SCAN_REPLACE) + scanQRcode(true) true } R.id.scan_append -> { - scanQRcode(REQUEST_SCAN_APPEND) + scanQRcode(false) true } R.id.default_rules -> { @@ -82,7 +81,7 @@ class RoutingSettingsFragment : Fragment() { else -> super.onOptionsItemSelected(item) } - fun scanQRcode(requestCode: Int): Boolean { + fun scanQRcode(forReplace: Boolean): Boolean { // try { // startActivityForResult(Intent("com.google.zxing.client.android.SCAN") // .addCategory(Intent.CATEGORY_DEFAULT) @@ -92,7 +91,10 @@ class RoutingSettingsFragment : Fragment() { .request(Manifest.permission.CAMERA) .subscribe { if (it) - startActivityForResult(Intent(activity, ScannerActivity::class.java), requestCode) + if (forReplace) + scanQRCodeForReplace.launch(Intent(activity, ScannerActivity::class.java)) + else + scanQRCodeForAppend.launch(Intent(activity, ScannerActivity::class.java)) else activity?.toast(R.string.toast_permission_denied) } @@ -100,6 +102,20 @@ class RoutingSettingsFragment : Fragment() { return true } + private val scanQRCodeForReplace = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { + if (it.resultCode == RESULT_OK) { + val content = it.data?.getStringExtra("SCAN_RESULT") + et_routing_content.text = Utils.getEditable(content!!) + } + } + + private val scanQRCodeForAppend = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { + if (it.resultCode == RESULT_OK) { + val content = it.data?.getStringExtra("SCAN_RESULT") + et_routing_content.text = Utils.getEditable("${et_routing_content.text},$content") + } + } + fun setDefaultRules(): Boolean { var url = AppConfig.v2rayCustomRoutingListUrl when (requireArguments().getString(routing_arg)) { @@ -129,22 +145,4 @@ class RoutingSettingsFragment : Fragment() { } return true } - - override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { - super.onActivityResult(requestCode, resultCode, data) - when (requestCode) { - REQUEST_SCAN_REPLACE -> - if (resultCode == RESULT_OK) { - val content = data?.getStringExtra("SCAN_RESULT") - et_routing_content.text = Utils.getEditable(content!!) - } - REQUEST_SCAN_APPEND -> - if (resultCode == RESULT_OK) { - val content = data?.getStringExtra("SCAN_RESULT") - et_routing_content.text = Utils.getEditable("${et_routing_content.text},$content") - } - } - } - - } diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/ScScannerActivity.kt b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/ScScannerActivity.kt index 23297e767..c0e6563d3 100644 --- a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/ScScannerActivity.kt +++ b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/ScScannerActivity.kt @@ -6,25 +6,23 @@ import com.tbruyelle.rxpermissions.RxPermissions import com.v2ray.ang.R import com.v2ray.ang.util.AngConfigManager import android.os.Bundle +import androidx.activity.result.contract.ActivityResultContracts import com.v2ray.ang.extension.toast class ScScannerActivity : BaseActivity() { - companion object { - private const val REQUEST_SCAN = 1 - } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_none) - importQRcode(REQUEST_SCAN) + importQRcode() } - fun importQRcode(requestCode: Int): Boolean { + fun importQRcode(): Boolean { RxPermissions(this) .request(Manifest.permission.CAMERA) .subscribe { if (it) - startActivityForResult(Intent(this, ScannerActivity::class.java), requestCode) + scanQRCode.launch(Intent(this, ScannerActivity::class.java)) else toast(R.string.toast_permission_denied) } @@ -32,21 +30,16 @@ class ScScannerActivity : BaseActivity() { return true } - override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { - super.onActivityResult(requestCode, resultCode, data) - when (requestCode) { - REQUEST_SCAN -> - if (resultCode == RESULT_OK) { - val count = AngConfigManager.importBatchConfig(data?.getStringExtra("SCAN_RESULT"), "") - if (count > 0) { - toast(R.string.toast_success) - } else { - toast(R.string.toast_failure) - } - startActivity(Intent(this, MainActivity::class.java)) - } + private val scanQRCode = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { + if (it.resultCode == RESULT_OK) { + val count = AngConfigManager.importBatchConfig(it.data?.getStringExtra("SCAN_RESULT"), "") + if (count > 0) { + toast(R.string.toast_success) + } else { + toast(R.string.toast_failure) + } + startActivity(Intent(this, MainActivity::class.java)) } finish() } - } diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/ScannerActivity.kt b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/ScannerActivity.kt index 5e973cb85..03fb791ef 100644 --- a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/ScannerActivity.kt +++ b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/ScannerActivity.kt @@ -9,6 +9,7 @@ import android.content.Intent import android.graphics.BitmapFactory import android.view.Menu import android.view.MenuItem +import androidx.activity.result.contract.ActivityResultContracts import com.google.zxing.BarcodeFormat import com.tbruyelle.rxpermissions.RxPermissions import com.v2ray.ang.R @@ -16,10 +17,6 @@ import com.v2ray.ang.extension.toast import com.v2ray.ang.util.QRCodeDecoder class ScannerActivity : BaseActivity(), ZXingScannerView.ResultHandler { - companion object { - private const val REQUEST_FILE_CHOOSER = 2 - } - private var mScannerView: ZXingScannerView? = null @@ -59,7 +56,7 @@ class ScannerActivity : BaseActivity(), ZXingScannerView.ResultHandler { // mScannerView!!.resumeCameraPreview(this) } - fun finished(text: String) { + private fun finished(text: String) { val intent = Intent() intent.putExtra("SCAN_RESULT", text) setResult(Activity.RESULT_OK, intent) @@ -97,30 +94,22 @@ class ScannerActivity : BaseActivity(), ZXingScannerView.ResultHandler { //intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true) try { - startActivityForResult( - Intent.createChooser(intent, getString(R.string.title_file_chooser)), - REQUEST_FILE_CHOOSER) + chooseFile.launch(Intent.createChooser(intent, getString(R.string.title_file_chooser))) } catch (ex: android.content.ActivityNotFoundException) { toast(R.string.toast_require_file_manager) } } - - override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { - super.onActivityResult(requestCode, resultCode, data) - when (requestCode) { - REQUEST_FILE_CHOOSER -> { - val uri = data?.data - if (resultCode == RESULT_OK && uri != null) { - try { - val bitmap = BitmapFactory.decodeStream(contentResolver.openInputStream(uri)) - val text = QRCodeDecoder.syncDecodeQRCode(bitmap) - finished(text) - } catch (e: Exception) { - e.printStackTrace() - toast(e.message.toString()) - } - } + private val chooseFile = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { + val uri = it.data?.data + if (it.resultCode == RESULT_OK && uri != null) { + try { + val bitmap = BitmapFactory.decodeStream(contentResolver.openInputStream(uri)) + val text = QRCodeDecoder.syncDecodeQRCode(bitmap) + finished(text) + } catch (e: Exception) { + e.printStackTrace() + toast(e.message.toString()) } } }