Skip to content

Commit 2a394e5

Browse files
committed
show action dialog for supported actionable qr codes
1 parent 7e80019 commit 2a394e5

File tree

3 files changed

+126
-0
lines changed

3 files changed

+126
-0
lines changed

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

+5
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@ import app.grapheneos.camera.ui.CustomGrid
8787
import app.grapheneos.camera.ui.QROverlay
8888
import app.grapheneos.camera.ui.QRToggle
8989
import app.grapheneos.camera.ui.SettingsDialog
90+
import app.grapheneos.camera.ui.dialog.showActionableDialog
9091
import app.grapheneos.camera.ui.seekbar.ExposureBar
9192
import app.grapheneos.camera.ui.seekbar.ZoomBar
9293
import app.grapheneos.camera.util.CameraControl
@@ -1127,6 +1128,10 @@ open class MainActivity : AppCompatActivity(),
11271128

11281129
isQRDialogShowing = true
11291130

1131+
if (showActionableDialog(this, rawText) { isQRDialogShowing = false }) {
1132+
return
1133+
}
1134+
11301135
val hString = bytesToHex(
11311136
rawText.toByteArray(StandardCharsets.UTF_8)
11321137
)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
package app.grapheneos.camera.ui.dialog
2+
3+
import android.app.Activity
4+
import androidx.annotation.StringRes
5+
import androidx.appcompat.view.ContextThemeWrapper
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.data.Wifi
14+
import app.grapheneos.camera.qr.parser.parseGeo
15+
import app.grapheneos.camera.qr.parser.parseMail
16+
import app.grapheneos.camera.qr.parser.parseMeCard
17+
import app.grapheneos.camera.qr.parser.parsePhoneOrFacetime
18+
import app.grapheneos.camera.qr.parser.parseSMS
19+
import app.grapheneos.camera.qr.parser.parseVCard
20+
import app.grapheneos.camera.qr.parser.parseWifi
21+
import com.google.android.material.dialog.MaterialAlertDialogBuilder
22+
23+
private data class DialogContent(
24+
@StringRes val title: Int,
25+
val message: String,
26+
@StringRes val action: Int
27+
)
28+
29+
fun showActionableDialog(activity: Activity, rawContent: String, onDismiss: () -> Unit): Boolean {
30+
31+
val card = parsePhoneOrFacetime(rawContent)
32+
?: parseSMS(rawContent)
33+
?: parseGeo(rawContent)
34+
?: parseMeCard(rawContent)
35+
?: parseMail(rawContent)
36+
?: parseVCard(rawContent)
37+
?: parseWifi(rawContent)
38+
?: return false
39+
40+
val (title, message, action) = when (card) {
41+
is GEO -> DialogContent(
42+
R.string.address,
43+
activity.getString(R.string.address_message, card.long, card.lat),
44+
R.string.open_in_maps
45+
)
46+
47+
is MeCard -> DialogContent(
48+
R.string.contact_card_me_card,
49+
activity.getString(R.string.mecard_message),
50+
R.string.add_to_contacts
51+
)
52+
53+
is Phone -> DialogContent(
54+
R.string.phone,
55+
activity.getString(R.string.call_message, "${card.number}"),
56+
R.string.call
57+
)
58+
59+
is SMS -> DialogContent(
60+
R.string.message,
61+
activity.getString(R.string.sms_message, card.number),
62+
R.string.message
63+
)
64+
65+
is Mail -> DialogContent(
66+
R.string.mail,
67+
activity.getString(R.string.mail_message, card.mailTo.to),
68+
R.string.mail,
69+
)
70+
71+
is VCard -> DialogContent(
72+
R.string.contact_card_vcard,
73+
activity.getString(R.string.vcard_message),
74+
R.string.add_to_contacts
75+
)
76+
77+
is Wifi -> DialogContent(
78+
R.string.connect_to_wifi,
79+
activity.getString(R.string.wifi_message, card.ssid),
80+
R.string.connect
81+
)
82+
}
83+
84+
activity.runOnUiThread {
85+
val dialogContext = ContextThemeWrapper(
86+
activity,
87+
com.google.android.material.R.style.Theme_MaterialComponents_DayNight
88+
)
89+
MaterialAlertDialogBuilder(dialogContext)
90+
.setTitle(title)
91+
.setMessage(message)
92+
.setOnDismissListener { onDismiss() }
93+
.setNegativeButton(R.string.cancel, null)
94+
.setPositiveButton(action) { _, _ ->
95+
card.startIntent(activity)
96+
}.show()
97+
}
98+
99+
return true
100+
}

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

+21
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,27 @@
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>
187187

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="connect_to_wifi">Connect To Network (Wi-Fi)</string>
192+
<string name="phone">Phone</string>
193+
<string name="message">Message</string>
194+
<string name="mail">Email</string>
195+
196+
<string name="open_in_maps">Navigate</string>
197+
<string name="call">Call</string>
198+
<string name="add_to_contacts">Add to contacts</string>
199+
<string name="connect">Connect</string>
200+
201+
<string name="address_message">Do you want to navigate to longitude %s and latitude %s?</string>
202+
<string name="mecard_message">Do you want to save this contact info?</string>
203+
<string name="vcard_message">Do you want to import this contact info?</string>
204+
<string name="wifi_message">Do you want to connect to %s Wi-Fi network?</string>
205+
<string name="call_message">Do you want to call %s?</string>
206+
<string name="sms_message">Do you want to chat with %s?</string>
207+
<string name="mail_message">Do you want to send email to %s?</string>
208+
188209
<string name="wifi_dialog_title">Wifi Details</string>
189210
<string name="wifi_dialog_message">You can connect to %s Wi-Fi network from settings.</string>
190211
<string name="wifi_dialog_button_positive">Copy Password</string>

0 commit comments

Comments
 (0)