From 60a1a9620d78c8907df50d537903d59466660e5c Mon Sep 17 00:00:00 2001 From: Daniel VH Date: Tue, 6 Jan 2026 15:31:12 +0100 Subject: [PATCH 1/4] feat(sdk): Add support for custom audiences --- .../com/strivacity/demoapp/LoginFragment.java | 119 ++++++++++----- app/src/main/res/drawable/ic_help.xml | 7 + app/src/main/res/layout/fragment_login.xml | 17 ++- app/src/main/res/values/strings.xml | 3 + build.gradle | 2 +- .../strivacity/android/sdk/AuthProvider.java | 135 +++++++++++------- 6 files changed, 194 insertions(+), 89 deletions(-) create mode 100644 app/src/main/res/drawable/ic_help.xml diff --git a/app/src/main/java/com/strivacity/demoapp/LoginFragment.java b/app/src/main/java/com/strivacity/demoapp/LoginFragment.java index 1db25f7..e124fd5 100644 --- a/app/src/main/java/com/strivacity/demoapp/LoginFragment.java +++ b/app/src/main/java/com/strivacity/demoapp/LoginFragment.java @@ -1,11 +1,15 @@ package com.strivacity.demoapp; +import android.content.Context; +import android.content.Intent; +import android.net.Uri; import android.os.Bundle; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; +import android.widget.Toast; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -13,10 +17,14 @@ import androidx.lifecycle.ViewModelProvider; import androidx.navigation.Navigation; +import com.google.android.material.textfield.TextInputEditText; +import com.google.android.material.textfield.TextInputLayout; import com.strivacity.android.sdk.AuthFlowException; import com.strivacity.android.sdk.FlowResponseCallback; +import java.util.Collections; import java.util.Map; +import java.util.Objects; public class LoginFragment extends Fragment { @@ -38,11 +46,43 @@ public void onViewCreated( ) { super.onViewCreated(view, savedInstanceState); + final Context context = view.getContext(); + final Uri docsPage = Uri.parse( + getString(R.string.docs_url_custom_audiences) + ); + final Intent openActionsDocs = new Intent(Intent.ACTION_VIEW, docsPage); + + TextInputLayout textInputLayout = view.findViewById( + R.id.text_input_layout_audiences + ); + textInputLayout.setEndIconOnClickListener(v -> { + try { + context.startActivity(openActionsDocs); + } catch (IllegalArgumentException ex) { + Log.e( + "FirstFragment", + "Could not open Docs page for custom audiences", + ex + ); + Toast + .makeText( + context, + R.string.toast_error_failed_open_intent, + Toast.LENGTH_SHORT + ) + .show(); + } + }); + TextView errorText = view.findViewById(R.id.errortext); if (savedInstanceState != null) { errorText.setText(savedInstanceState.getString("EXTRA_ERROR_TEXT")); } + TextInputEditText audiencesInput = view.findViewById( + R.id.text_input_audiences + ); + SharedViewModel viewModel = new ViewModelProvider(requireActivity()) .get(SharedViewModel.class); viewModel @@ -67,39 +107,54 @@ public void onViewCreated( view .findViewById(R.id.startFlow) - .setOnClickListener(v -> - authProvider.startFlow( - requireContext(), - new FlowResponseCallback() { - @Override - public void success( - @Nullable String accessToken, - @Nullable Map claims - ) { - Log.d(TAG, "start flow success"); - Navigation - .findNavController( - requireActivity(), - R.id.nav_host_fragment - ) - .navigate( - R.id.action_loginFragment_to_mainFragment + .setOnClickListener(v -> { + String inputText = Objects + .requireNonNull(audiencesInput.getText()) + .toString(); + String[] audiences = inputText.isBlank() + ? null + : inputText.split("\\s+"); + + authProvider + .withAudiences(audiences) + .startFlow( + requireContext(), + new FlowResponseCallback() { + @Override + public void success( + @Nullable String accessToken, + @Nullable Map claims + ) { + Log.d( + TAG, + "start flow success" ); - } - - @Override - public void failure( - @NonNull AuthFlowException exception - ) { - Log.d(TAG, "start flow failure"); - errorText.setText( - exception.toString() - ); - } - }, - Map.of("testKey", "testValue") - ) - ); + Navigation + .findNavController( + requireActivity(), + R.id.nav_host_fragment + ) + .navigate( + R.id.action_loginFragment_to_mainFragment + ); + } + + @Override + public void failure( + @NonNull AuthFlowException exception + ) { + Log.d( + TAG, + "start flow failure" + ); + errorText.setText( + exception.toString() + ); + } + }, + Collections.emptyMap() + ); + }); }) ); } diff --git a/app/src/main/res/drawable/ic_help.xml b/app/src/main/res/drawable/ic_help.xml new file mode 100644 index 0000000..aa74194 --- /dev/null +++ b/app/src/main/res/drawable/ic_help.xml @@ -0,0 +1,7 @@ + + + diff --git a/app/src/main/res/layout/fragment_login.xml b/app/src/main/res/layout/fragment_login.xml index e042dd1..9d956a0 100644 --- a/app/src/main/res/layout/fragment_login.xml +++ b/app/src/main/res/layout/fragment_login.xml @@ -1,15 +1,30 @@ + + + + +