Skip to content

Commit c35091f

Browse files
committed
Add back built-in QRCode Scanner
1 parent d2fd561 commit c35091f

File tree

4 files changed

+101
-3
lines changed

4 files changed

+101
-3
lines changed

build.sbt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ libraryDependencies ++=
5555
"com.twofortyfouram" % "android-plugin-api-for-locale" % "1.0.2" ::
5656
"dnsjava" % "dnsjava" % "2.1.7" ::
5757
"eu.chainfire" % "libsuperuser" % "1.0.0.+" ::
58+
"me.dm7.barcodescanner" % "zxing" % "1.9.8" ::
5859
"net.glxn.qrgen" % "android" % "2.0" ::
5960
"com.squareup.okhttp3" % "okhttp" % "3.8.0" ::
6061
"com.google.code.findbugs" % "jsr305" % "1.3.+" ::

src/main/AndroidManifest.xml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
22
xmlns:tools="http://schemas.android.com/tools" package="com.github.shadowsocks"
3-
android:versionCode="317"
3+
android:versionCode="319"
44
android:versionName="3.4.0.7">
55

66
<uses-permission android:name="android.permission.INTERNET"/>
77
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
88
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
99
<uses-permission android:name="android.permission.NFC" />
10+
<uses-permission android:name="android.permission.CAMERA" />
1011

1112
<uses-feature android:name="android.hardware.touchscreen"
1213
android:required="false"/>
@@ -16,6 +17,8 @@
1617
android:required="false"/>
1718
<uses-feature android:name="android.software.leanback"
1819
android:required="false"/>
20+
<uses-feature android:name="android.hardware.camera"
21+
android:required="false"/>
1922

2023
<uses-sdk
2124
android:minSdkVersion="16"

src/main/scala/com/github/shadowsocks/ProfileManagerActivity.scala

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -569,7 +569,7 @@ final class ProfileManagerActivity extends AppCompatActivity with OnMenuItemClic
569569
startActivityForResult(intent, 0)
570570
} catch {
571571
case _ : Throwable =>
572-
val dialog = new AlertDialog.Builder(this, R.style.Theme_Material_Dialog_Alert)
572+
/*val dialog = new AlertDialog.Builder(this, R.style.Theme_Material_Dialog_Alert)
573573
.setTitle(R.string.scan_qrcode_install_title)
574574
.setPositiveButton(android.R.string.yes, ((_, _) => {
575575
val marketUri = Uri.parse("market://details?id=com.google.zxing.client.android")
@@ -586,7 +586,9 @@ final class ProfileManagerActivity extends AppCompatActivity with OnMenuItemClic
586586
.setNegativeButton(android.R.string.no, ((_, _) => finish()): DialogInterface.OnClickListener)
587587
.setMessage(R.string.scan_qrcode_install_text)
588588
.create()
589-
dialog.show()
589+
dialog.show()*/
590+
menu.toggle(false)
591+
startActivity(new Intent(this, classOf[ScannerActivity]))
590592
}
591593
}
592594

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
2+
package com.github.shadowsocks
3+
4+
import android.app.{Activity, TaskStackBuilder}
5+
import android.content.Intent
6+
import android.content.pm.{PackageManager, ShortcutManager}
7+
import android.os.{Build, Bundle}
8+
import android.support.v4.app.ActivityCompat
9+
import android.support.v4.content.ContextCompat
10+
import android.support.v7.app.AppCompatActivity
11+
import android.support.v7.widget.Toolbar
12+
import android.text.TextUtils
13+
import android.widget.Toast
14+
import com.google.zxing.Result
15+
import com.github.shadowsocks.ShadowsocksApplication.app
16+
import com.github.shadowsocks.utils.Parser
17+
import me.dm7.barcodescanner.zxing.ZXingScannerView
18+
19+
object ScannerActivity {
20+
private final val MY_PERMISSIONS_REQUEST_CAMERA = 1
21+
}
22+
23+
class ScannerActivity extends AppCompatActivity with ZXingScannerView.ResultHandler {
24+
import ScannerActivity._
25+
26+
private var scannerView: ZXingScannerView = _
27+
28+
override def onRequestPermissionsResult(requestCode: Int, permissions: Array[String],
29+
grantResults: Array[Int]) {
30+
if (requestCode == MY_PERMISSIONS_REQUEST_CAMERA) {
31+
// If request is cancelled, the result arrays are empty.
32+
if (grantResults.length > 0
33+
&& grantResults(0) == PackageManager.PERMISSION_GRANTED) {
34+
scannerView.setResultHandler(this)
35+
scannerView.startCamera()
36+
} else {
37+
Toast.makeText(this, R.string.add_profile_scanner_permission_required, Toast.LENGTH_SHORT).show()
38+
finish()
39+
}
40+
}
41+
}
42+
43+
def navigateUp() {
44+
val intent = getParentActivityIntent
45+
if (shouldUpRecreateTask(intent) || isTaskRoot)
46+
{
47+
TaskStackBuilder.create(this).addNextIntentWithParentStack(intent).startActivities()
48+
}
49+
else finish()
50+
}
51+
52+
override def onCreate(state: Bundle) {
53+
super.onCreate(state)
54+
setContentView(R.layout.layout_scanner)
55+
val toolbar = findViewById(R.id.toolbar).asInstanceOf[Toolbar]
56+
toolbar.setTitle(getTitle)
57+
toolbar.setNavigationIcon(R.drawable.abc_ic_ab_back_material)
58+
toolbar.setNavigationOnClickListener(_ => navigateUp())
59+
scannerView = findViewById(R.id.scanner).asInstanceOf[ZXingScannerView]
60+
if (Build.VERSION.SDK_INT >= 25) getSystemService(classOf[ShortcutManager]).reportShortcutUsed("scan")
61+
}
62+
63+
override def onResume() {
64+
super.onResume()
65+
val permissionCheck = ContextCompat.checkSelfPermission(this,
66+
android.Manifest.permission.CAMERA)
67+
if (permissionCheck == PackageManager.PERMISSION_GRANTED) {
68+
scannerView.setResultHandler(this) // Register ourselves as a handler for scan results.
69+
scannerView.setAutoFocus(true)
70+
scannerView.startCamera() // Start camera on resume
71+
} else {
72+
ActivityCompat.requestPermissions(this,
73+
Array(android.Manifest.permission.CAMERA), MY_PERMISSIONS_REQUEST_CAMERA)
74+
}
75+
}
76+
77+
override def onPause() {
78+
super.onPause()
79+
scannerView.stopCamera() // Stop camera on pause
80+
}
81+
82+
override def handleResult(rawResult: Result) = {
83+
val uri = rawResult.getText
84+
if (!TextUtils.isEmpty(uri))
85+
{
86+
Parser.findAll(uri).foreach(app.profileManager.createProfile)
87+
Parser.findAll_ssr(uri).foreach(app.profileManager.createProfile)
88+
}
89+
navigateUp()
90+
}
91+
}
92+

0 commit comments

Comments
 (0)