Skip to content

Commit 684db4c

Browse files
committed
demo app: use Identity verification toggle to make requests
Cache the JWT token on login and updateUserJwt calls. When Identity Verification is enabled, include the Authorization Bearer header in the demo app's fetch user request.
1 parent d7b4b89 commit 684db4c

File tree

6 files changed

+79
-14
lines changed

6 files changed

+79
-14
lines changed

examples/demo/app/src/main/java/com/onesignal/sdktest/data/network/OneSignalService.kt

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -167,29 +167,33 @@ object OneSignalService {
167167
* Fetch user data from OneSignal API.
168168
* Note: This endpoint does not require authentication.
169169
*
170-
* @param onesignalId The OneSignal user ID
170+
* @param aliasLabel The alias type to look up by (e.g. "onesignal_id" or "external_id")
171+
* @param aliasValue The alias value
171172
* @return UserData object containing aliases, tags, emails, and SMS numbers, or null on error
172173
*/
173-
suspend fun fetchUser(onesignalId: String): UserData? = withContext(Dispatchers.IO) {
174-
if (onesignalId.isEmpty()) {
175-
LogManager.w(TAG, "Cannot fetch user - onesignalId is empty")
174+
suspend fun fetchUser(aliasLabel: String, aliasValue: String, jwt: String? = null): UserData? = withContext(Dispatchers.IO) {
175+
if (aliasValue.isEmpty()) {
176+
LogManager.w(TAG, "Cannot fetch user - aliasValue is empty")
176177
return@withContext null
177178
}
178179

179180
if (appId.isEmpty()) {
180181
LogManager.w(TAG, "Cannot fetch user - appId not set")
181182
return@withContext null
182183
}
183-
184+
184185
try {
185-
val url = "$ONESIGNAL_API_BASE_URL/apps/$appId/users/by/onesignal_id/$onesignalId"
186+
val url = "$ONESIGNAL_API_BASE_URL/apps/$appId/users/by/$aliasLabel/$aliasValue"
186187
LogManager.d(TAG, "Fetching user data from: $url")
187188

188189
val connection = (URL(url).openConnection() as HttpURLConnection).apply {
189190
useCaches = false
190191
connectTimeout = 30000
191192
readTimeout = 30000
192193
setRequestProperty("Accept", "application/json")
194+
if (jwt != null) {
195+
setRequestProperty("Authorization", "Bearer $jwt")
196+
}
193197
requestMethod = "GET"
194198
}
195199

examples/demo/app/src/main/java/com/onesignal/sdktest/data/repository/OneSignalRepository.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -241,8 +241,8 @@ class OneSignalRepository {
241241
}
242242

243243
// Fetch user data from API
244-
suspend fun fetchUser(onesignalId: String): UserData? = withContext(Dispatchers.IO) {
245-
Log.d(TAG, "Fetching user data for: $onesignalId")
246-
OneSignalService.fetchUser(onesignalId)
244+
suspend fun fetchUser(aliasLabel: String, aliasValue: String, jwt: String? = null): UserData? = withContext(Dispatchers.IO) {
245+
Log.d(TAG, "Fetching user data by $aliasLabel: $aliasValue")
246+
OneSignalService.fetchUser(aliasLabel, aliasValue, jwt)
247247
}
248248
}

examples/demo/app/src/main/java/com/onesignal/sdktest/ui/main/MainScreen.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ fun MainScreen(viewModel: MainViewModel) {
6969
val consentRequired by viewModel.consentRequired.observeAsState(false)
7070
val privacyConsentGiven by viewModel.privacyConsentGiven.observeAsState(false)
7171
val externalUserId by viewModel.externalUserId.observeAsState()
72+
val useIdentityVerification by viewModel.useIdentityVerification.observeAsState(false)
7273
val aliases by viewModel.aliases.observeAsState(emptyList())
7374
val emails by viewModel.emails.observeAsState(emptyList())
7475
val smsNumbers by viewModel.smsNumbers.observeAsState(emptyList())
@@ -160,6 +161,8 @@ fun MainScreen(viewModel: MainViewModel) {
160161
// === USER SECTION ===
161162
UserSection(
162163
externalUserId = externalUserId,
164+
useIdentityVerification = useIdentityVerification,
165+
onUseIdentityVerificationChange = { viewModel.setUseIdentityVerification(it) },
163166
onLoginClick = { showLoginDialog = true },
164167
onLogoutClick = { viewModel.logoutUser() },
165168
onUpdateJwtClick = { showUpdateJwtDialog = true }

examples/demo/app/src/main/java/com/onesignal/sdktest/ui/main/MainViewModel.kt

Lines changed: 36 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,10 @@ class MainViewModel(application: Application) : AndroidViewModel(application), I
7676
private val _locationShared = MutableLiveData<Boolean>()
7777
val locationShared: LiveData<Boolean> = _locationShared
7878

79+
// Identity Verification toggle (demo app only, controls alias used for API calls)
80+
private val _useIdentityVerification = MutableLiveData<Boolean>()
81+
val useIdentityVerification: LiveData<Boolean> = _useIdentityVerification
82+
7983
// Toast messages
8084
private val _toastMessage = MutableLiveData<String?>()
8185
val toastMessage: LiveData<String?> = _toastMessage
@@ -130,6 +134,7 @@ class MainViewModel(application: Application) : AndroidViewModel(application), I
130134
_privacyConsentGiven.value = repository.getPrivacyConsent()
131135
_inAppMessagesPaused.value = repository.isInAppMessagesPaused()
132136
_locationShared.value = repository.isLocationShared()
137+
_useIdentityVerification.value = SharedPreferenceUtil.getCachedIdentityVerification(context)
133138

134139
val externalId = OneSignal.User.externalId
135140
_externalUserId.value = if (externalId.isEmpty()) null else externalId
@@ -148,16 +153,34 @@ class MainViewModel(application: Application) : AndroidViewModel(application), I
148153
}
149154

150155
fun fetchUserDataFromApi() {
151-
val onesignalId = OneSignal.User.onesignalId
152-
if (onesignalId.isNullOrEmpty()) {
153-
_isLoading.value = false
154-
return
156+
val useIV = _useIdentityVerification.value == true
157+
val aliasLabel: String
158+
val aliasValue: String
159+
160+
if (useIV) {
161+
val externalId = _externalUserId.value
162+
if (externalId.isNullOrEmpty()) {
163+
_isLoading.value = false
164+
return
165+
}
166+
aliasLabel = "external_id"
167+
aliasValue = externalId
168+
} else {
169+
val onesignalId = OneSignal.User.onesignalId
170+
if (onesignalId.isNullOrEmpty()) {
171+
_isLoading.value = false
172+
return
173+
}
174+
aliasLabel = "onesignal_id"
175+
aliasValue = onesignalId
155176
}
156177

178+
val jwt = if (useIV) SharedPreferenceUtil.getCachedJwtToken(getApplication()) else null
179+
157180
_isLoading.value = true
158181
viewModelScope.launch(Dispatchers.IO) {
159182
try {
160-
val userData = repository.fetchUser(onesignalId)
183+
val userData = repository.fetchUser(aliasLabel, aliasValue, jwt)
161184
withContext(Dispatchers.Main) {
162185
if (userData != null) {
163186
aliasesList.clear()
@@ -226,6 +249,7 @@ class MainViewModel(application: Application) : AndroidViewModel(application), I
226249
repository.loginUser(externalUserId, jwtToken)
227250
withContext(Dispatchers.Main) {
228251
SharedPreferenceUtil.cacheUserExternalUserId(getApplication(), externalUserId)
252+
SharedPreferenceUtil.cacheJwtToken(getApplication(), jwtToken)
229253
_externalUserId.value = externalUserId
230254
showToast("Logged in as: $externalUserId")
231255
aliasesList.clear()
@@ -247,6 +271,7 @@ class MainViewModel(application: Application) : AndroidViewModel(application), I
247271
viewModelScope.launch(Dispatchers.IO) {
248272
repository.updateUserJwt(externalUserId, jwtToken)
249273
withContext(Dispatchers.Main) {
274+
SharedPreferenceUtil.cacheJwtToken(getApplication(), jwtToken)
250275
showToast("Updated JWT for: $externalUserId")
251276
}
252277
}
@@ -274,6 +299,12 @@ class MainViewModel(application: Application) : AndroidViewModel(application), I
274299
}
275300
}
276301

302+
fun setUseIdentityVerification(enabled: Boolean) {
303+
SharedPreferenceUtil.cacheIdentityVerification(getApplication(), enabled)
304+
_useIdentityVerification.value = enabled
305+
showToast(if (enabled) "Identity verification enabled" else "Identity verification disabled")
306+
}
307+
277308
// Consent required
278309
fun setConsentRequired(required: Boolean) {
279310
repository.setConsentRequired(required)

examples/demo/app/src/main/java/com/onesignal/sdktest/ui/main/Sections.kt

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,13 +137,22 @@ fun AppSection(
137137
@Composable
138138
fun UserSection(
139139
externalUserId: String?,
140+
useIdentityVerification: Boolean,
141+
onUseIdentityVerificationChange: (Boolean) -> Unit,
140142
onLoginClick: () -> Unit,
141143
onLogoutClick: () -> Unit,
142144
onUpdateJwtClick: () -> Unit
143145
) {
144146
val isLoggedIn = !externalUserId.isNullOrEmpty()
145147

146148
SectionCard(title = "User") {
149+
ToggleRow(
150+
label = "Identity Verification",
151+
description = "Use external_id for API calls",
152+
checked = useIdentityVerification,
153+
onCheckedChange = onUseIdentityVerificationChange
154+
)
155+
HorizontalDivider(modifier = Modifier.padding(horizontal = 16.dp))
147156
// Status
148157
Row(
149158
modifier = Modifier

examples/demo/app/src/main/java/com/onesignal/sdktest/util/SharedPreferenceUtil.kt

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ object SharedPreferenceUtil {
1212
private const val LOCATION_SHARED_PREF = "LOCATION_SHARED_PREF"
1313
private const val IN_APP_MESSAGING_PAUSED_PREF = "IN_APP_MESSAGING_PAUSED_PREF"
1414
private const val CONSENT_REQUIRED_PREF = "CONSENT_REQUIRED_PREF"
15+
private const val IDENTITY_VERIFICATION_PREF = "IDENTITY_VERIFICATION_PREF"
16+
private const val JWT_TOKEN_PREF = "JWT_TOKEN_PREF"
1517

1618
private fun getSharedPreference(context: Context): SharedPreferences {
1719
return context.getSharedPreferences(APP_SHARED_PREFS, Context.MODE_PRIVATE)
@@ -69,4 +71,20 @@ object SharedPreferenceUtil {
6971
fun cacheConsentRequired(context: Context, required: Boolean) {
7072
getSharedPreference(context).edit().putBoolean(CONSENT_REQUIRED_PREF, required).apply()
7173
}
74+
75+
fun getCachedIdentityVerification(context: Context): Boolean {
76+
return getSharedPreference(context).getBoolean(IDENTITY_VERIFICATION_PREF, false)
77+
}
78+
79+
fun cacheIdentityVerification(context: Context, enabled: Boolean) {
80+
getSharedPreference(context).edit().putBoolean(IDENTITY_VERIFICATION_PREF, enabled).apply()
81+
}
82+
83+
fun getCachedJwtToken(context: Context): String? {
84+
return getSharedPreference(context).getString(JWT_TOKEN_PREF, null)
85+
}
86+
87+
fun cacheJwtToken(context: Context, token: String?) {
88+
getSharedPreference(context).edit().putString(JWT_TOKEN_PREF, token).apply()
89+
}
7290
}

0 commit comments

Comments
 (0)