Skip to content

Commit 0c9e9a1

Browse files
committed
show action dialog for supported actionable qr codes
1 parent 663f549 commit 0c9e9a1

File tree

3 files changed

+110
-0
lines changed

3 files changed

+110
-0
lines changed

app/src/main/java/app/grapheneos/camera/ui/activities/MainActivity.kt

+5
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ import app.grapheneos.camera.ui.CustomGrid
8888
import app.grapheneos.camera.ui.QROverlay
8989
import app.grapheneos.camera.ui.QRToggle
9090
import app.grapheneos.camera.ui.SettingsDialog
91+
import app.grapheneos.camera.ui.dialog.showActionableDialog
9192
import app.grapheneos.camera.ui.seekbar.ExposureBar
9293
import app.grapheneos.camera.ui.seekbar.ZoomBar
9394
import app.grapheneos.camera.util.CameraControl
@@ -1126,6 +1127,10 @@ open class MainActivity : AppCompatActivity(),
11261127

11271128
isQRDialogShowing = true
11281129

1130+
if (showActionableDialog(this, rawText) { isQRDialogShowing = false }) {
1131+
return
1132+
}
1133+
11291134
val hString = bytesToHex(
11301135
rawText.toByteArray(StandardCharsets.UTF_8)
11311136
)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
package app.grapheneos.camera.ui.dialog
2+
3+
import android.app.Activity
4+
import androidx.annotation.StringRes
5+
import androidx.appcompat.app.AlertDialog
6+
import app.grapheneos.camera.R
7+
import app.grapheneos.camera.qr.data.GEO
8+
import app.grapheneos.camera.qr.data.Mail
9+
import app.grapheneos.camera.qr.data.MeCard
10+
import app.grapheneos.camera.qr.data.Phone
11+
import app.grapheneos.camera.qr.data.SMS
12+
import app.grapheneos.camera.qr.data.VCard
13+
import app.grapheneos.camera.qr.parser.parseGeo
14+
import app.grapheneos.camera.qr.parser.parseMail
15+
import app.grapheneos.camera.qr.parser.parseMeCard
16+
import app.grapheneos.camera.qr.parser.parsePhoneOrFacetime
17+
import app.grapheneos.camera.qr.parser.parseSMS
18+
import app.grapheneos.camera.qr.parser.parseVCard
19+
20+
private data class DialogContent(
21+
@StringRes val title: Int,
22+
val message: String,
23+
@StringRes val action: Int
24+
)
25+
26+
fun showActionableDialog(activity: Activity, rawContent: String, onDismiss: () -> Unit): Boolean {
27+
28+
val card = parsePhoneOrFacetime(rawContent)
29+
?: parseSMS(rawContent)
30+
?: parseGeo(rawContent)
31+
?: parseMeCard(rawContent)
32+
?: parseMail(rawContent)
33+
?: parseVCard(rawContent)
34+
?: return false
35+
36+
val (title, message, action) = when (card) {
37+
is GEO -> DialogContent(
38+
R.string.address,
39+
activity.getString(R.string.address_message, card.long, card.lat),
40+
R.string.open_in_maps
41+
)
42+
43+
is MeCard -> DialogContent(
44+
R.string.contact_card_me_card,
45+
activity.getString(R.string.mecard_message),
46+
R.string.add_to_contacts
47+
)
48+
49+
is Phone -> DialogContent(
50+
R.string.phone,
51+
activity.getString(R.string.call_message, "${card.number}"),
52+
R.string.call
53+
)
54+
55+
is SMS -> DialogContent(
56+
R.string.message,
57+
activity.getString(R.string.sms_message, card.number),
58+
R.string.message
59+
)
60+
61+
is Mail -> DialogContent(
62+
R.string.mail,
63+
activity.getString(R.string.mail_message, card.mailTo.to),
64+
R.string.mail,
65+
)
66+
67+
is VCard -> DialogContent(
68+
R.string.contact_card_vcard,
69+
activity.getString(R.string.vcard_message),
70+
R.string.add_to_contacts
71+
)
72+
}
73+
74+
activity.runOnUiThread {
75+
AlertDialog.Builder(activity)
76+
.setTitle(title)
77+
.setMessage(message)
78+
.setOnDismissListener { onDismiss() }
79+
.setNegativeButton(android.R.string.cancel, null)
80+
.setPositiveButton(action) { _, _ ->
81+
activity.startActivity(card.toActionIntent(activity))
82+
}.show()
83+
}
84+
85+
return true
86+
}

app/src/main/res/values/strings.xml

+19
Original file line numberDiff line numberDiff line change
@@ -184,4 +184,23 @@
184184

185185
<string name="zsl_setting_title">Use ZSL in Latency mode</string>
186186
<string name="zsl_setting_desc">Uses Zero Shutter Lag (ZSL) in Latency mode for faster capture. Certain devices may have a buggy implementation for this.</string>
187+
188+
<string name="address">Address</string>
189+
<string name="contact_card_me_card">Contact Card (MeCard)</string>
190+
<string name="contact_card_vcard">Contact Card (vCard)</string>
191+
<string name="phone">Phone</string>
192+
<string name="message">Message</string>
193+
<string name="mail">Email</string>
194+
195+
<string name="open_in_maps">Navigate</string>
196+
<string name="call">Call</string>
197+
<string name="add_to_contacts">Add to contacts</string>
198+
199+
<string name="address_message">Do you want to navigate to longitude %s and latitude %s?</string>
200+
<string name="mecard_message">Do you want to save this contact info?</string>
201+
<string name="vcard_message">Do you want to import this contact info?</string>
202+
<string name="call_message">Do you want to call %s?</string>
203+
<string name="sms_message">Do you want to chat with %s?</string>
204+
<string name="mail_message">Do you want to send email to %s?</string>
205+
187206
</resources>

0 commit comments

Comments
 (0)