How to get results from requesting permissions in GoogleSignIn in Jetpack Compose?

Viewed 153

I have a problem with getting results from GoogleSignIn.requestPermissions() method. I am asking user for hydration data permission. This code is inside button onClick scope.

    val fitnessOptions = FitnessOptions.builder()
    .addDataType(DataType.TYPE_HYDRATION, FitnessOptions.ACCESS_READ)
    .addDataType(DataType.TYPE_HYDRATION, FitnessOptions.ACCESS_WRITE)
    .addDataType(DataType.AGGREGATE_HYDRATION, FitnessOptions.ACCESS_READ)
    .addDataType(DataType.AGGREGATE_HYDRATION, FitnessOptions.ACCESS_WRITE)
    .build()

val account = GoogleSignIn.getAccountForExtension(context, fitnessOptions)

if (!GoogleSignIn.hasPermissions(account, fitnessOptions)) {
    GoogleSignIn.requestPermissions(
        activity,
        GOOGLE_FIT_PERMISSIONS_REQUEST_CODE,
        account,
        fitnessOptions)
} else {
    // we have access ...
}

So I found the way, that in compose we have to use rememberLauncherForActivityResult in order to get results for our activity.

val resultLauncher = rememberLauncherForActivityResult(
    contract = ActivityResultContracts.StartIntentSenderForResult()) { activityResult->
    if (activityResult.resultCode == RESULT_OK)
        Log.d("appDebug", "Accepted")
    else {
        Log.d("appDebug", "Denied")
    }
}

Unfortunetly this isn't working with google permissions, because I can't create an intent. How should I handle this in jetpack compose? Documentation mentions only old deprecated onActivityResult for UI toolkit.

1 Answers

I have same use case. I solve it via this approach -

val startForResult =
                    rememberLauncherForActivityResult(ActivityResultContracts.StartActivityForResult()) { result: ActivityResult ->
                        if (result.resultCode == Activity.RESULT_OK) {
                            viewModel.uiState.value.isGoogleFitConnected=true
                        }
                    }

val googleSignIn =
                   GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
                   .addExtension(fitnessOptions)
                   .build()

val intent = GoogleSignIn.getClient(context, googleSignIn)
                        startForResult.launch(intent.signInIntent)

Check this tutorial code snippet for more details.

Related