Skip to content

Commit bb00d34

Browse files
[google_sign_in] Update Pigeon for non-nullable generics (#7785)
Updates the Pigeon definition to uses non-nullable generics now that it's possible. In practice for this plugin it's currently a no-op: the only affected collection is passed from Dart to native, on the Dart side the source was already a `List<String>`, and on the native side we are using languages without nullability support in generics (Java and Obj-C). However, to do this now eliminates tech debt, and will avoid problems if/when the native side switches to Kotlin/Swift. The Android implementation required some non-trivial changes to adapt to an earlier Pigeon change that we hadn't picked up yet, which was the change from `Result<Void>` (which turned out to be incompatible with Kotlin) to the separate `VoidResult` class. Part of flutter/flutter#155891
1 parent e784c3e commit bb00d34

File tree

10 files changed

+461
-263
lines changed

10 files changed

+461
-263
lines changed

packages/google_sign_in/google_sign_in_android/CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
## 6.1.33
2+
3+
* Updates Pigeon for non-nullable collection type support.
4+
15
## 6.1.32
26

37
* Updates Java compatibility version to 11.

packages/google_sign_in/google_sign_in_android/android/src/main/java/io/flutter/plugins/googlesignin/GoogleSignInPlugin.java

Lines changed: 50 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -56,13 +56,13 @@ public void initInstance(
5656
@NonNull GoogleSignInWrapper googleSignInWrapper) {
5757
this.messenger = messenger;
5858
delegate = new Delegate(context, googleSignInWrapper);
59-
GoogleSignInApi.setup(messenger, delegate);
59+
GoogleSignInApi.setUp(messenger, delegate);
6060
}
6161

6262
private void dispose() {
6363
delegate = null;
6464
if (messenger != null) {
65-
GoogleSignInApi.setup(messenger, null);
65+
GoogleSignInApi.setUp(messenger, null);
6666
messenger = null;
6767
}
6868
}
@@ -241,6 +241,30 @@ void requestScopes(
241241
final @NonNull MethodChannel.Result result, final @NonNull List<String> scopes);
242242
}
243243

244+
/**
245+
* Helper class for supporting the legacy IDelegate interface based on raw method channels, which
246+
* handles converting any FlutterErrors (or other {@code Throwable}s in case any non- FlutterError
247+
* exceptions slip through) thrown by the new code paths into {@code error} callbacks.
248+
*/
249+
private abstract static class ErrorConvertingMethodChannelVoidResult
250+
implements Messages.VoidResult {
251+
final @NonNull MethodChannel.Result result;
252+
253+
public ErrorConvertingMethodChannelVoidResult(@NonNull MethodChannel.Result result) {
254+
this.result = result;
255+
}
256+
257+
@Override
258+
public void error(@NonNull Throwable error) {
259+
if (error instanceof FlutterError) {
260+
FlutterError flutterError = (FlutterError) error;
261+
result.error(flutterError.code, flutterError.getMessage(), flutterError.details);
262+
} else {
263+
result.error("exception", error.getMessage(), null);
264+
}
265+
}
266+
}
267+
244268
/**
245269
* Helper class for supporting the legacy IDelegate interface based on raw method channels, which
246270
* handles converting any FlutterErrors (or other {@code Throwable}s in case any non- FlutterError
@@ -296,13 +320,13 @@ public void success(Messages.UserData data) {
296320
* Helper class for supporting the legacy IDelegate interface based on raw method channels, which
297321
* handles converting responses from methods that return {@code Void}.
298322
*/
299-
private static class VoidMethodChannelResult extends ErrorConvertingMethodChannelResult<Void> {
323+
private static class VoidMethodChannelResult extends ErrorConvertingMethodChannelVoidResult {
300324
public VoidMethodChannelResult(MethodChannel.Result result) {
301325
super(result);
302326
}
303327

304328
@Override
305-
public void success(Void unused) {
329+
public void success() {
306330
result.success(null);
307331
}
308332
}
@@ -367,7 +391,7 @@ public void setActivity(@Nullable Activity activity) {
367391
private void checkAndSetPendingOperation(
368392
String method,
369393
Messages.Result<Messages.UserData> userDataResult,
370-
Messages.Result<Void> voidResult,
394+
Messages.VoidResult voidResult,
371395
Messages.Result<Boolean> boolResult,
372396
Messages.Result<String> stringResult,
373397
Object data) {
@@ -385,7 +409,7 @@ private void checkAndSetPendingSignInOperation(
385409
}
386410

387411
private void checkAndSetPendingVoidOperation(
388-
String method, @NonNull Messages.Result<Void> result) {
412+
String method, @NonNull Messages.VoidResult result) {
389413
checkAndSetPendingOperation(method, null, result, null, null, null);
390414
}
391415

@@ -557,7 +581,7 @@ public void signIn(@NonNull MethodChannel.Result result) {
557581
* sign back in.
558582
*/
559583
@Override
560-
public void signOut(@NonNull Messages.Result<Void> result) {
584+
public void signOut(@NonNull Messages.VoidResult result) {
561585
checkAndSetPendingVoidOperation("signOut", result);
562586

563587
signInClient
@@ -580,7 +604,7 @@ public void signOut(@NonNull MethodChannel.Result result) {
580604

581605
/** Signs the user out, and revokes their credentials. */
582606
@Override
583-
public void disconnect(@NonNull Messages.Result<Void> result) {
607+
public void disconnect(@NonNull Messages.VoidResult result) {
584608
checkAndSetPendingVoidOperation("disconnect", result);
585609

586610
signInClient
@@ -705,7 +729,7 @@ private String errorCodeForStatus(int statusCode) {
705729
}
706730

707731
private void finishWithSuccess() {
708-
Objects.requireNonNull(pendingOperation.voidResult).success(null);
732+
Objects.requireNonNull(pendingOperation.voidResult).success();
709733
pendingOperation = null;
710734
}
711735

@@ -720,32 +744,35 @@ private void finishWithUserData(Messages.UserData data) {
720744
}
721745

722746
private void finishWithError(String errorCode, String errorMessage) {
723-
Messages.Result<?> result;
724-
if (pendingOperation.userDataResult != null) {
725-
result = pendingOperation.userDataResult;
726-
} else if (pendingOperation.boolResult != null) {
727-
result = pendingOperation.boolResult;
728-
} else if (pendingOperation.stringResult != null) {
729-
result = pendingOperation.stringResult;
747+
if (pendingOperation.voidResult != null) {
748+
Objects.requireNonNull(pendingOperation.voidResult)
749+
.error(new FlutterError(errorCode, errorMessage, null));
730750
} else {
731-
result = pendingOperation.voidResult;
751+
Messages.Result<?> result;
752+
if (pendingOperation.userDataResult != null) {
753+
result = pendingOperation.userDataResult;
754+
} else if (pendingOperation.boolResult != null) {
755+
result = pendingOperation.boolResult;
756+
} else {
757+
result = pendingOperation.stringResult;
758+
}
759+
Objects.requireNonNull(result).error(new FlutterError(errorCode, errorMessage, null));
732760
}
733-
Objects.requireNonNull(result).error(new FlutterError(errorCode, errorMessage, null));
734761
pendingOperation = null;
735762
}
736763

737764
private static class PendingOperation {
738765
final @NonNull String method;
739766
final @Nullable Messages.Result<Messages.UserData> userDataResult;
740-
final @Nullable Messages.Result<Void> voidResult;
767+
final @Nullable Messages.VoidResult voidResult;
741768
final @Nullable Messages.Result<Boolean> boolResult;
742769
final @Nullable Messages.Result<String> stringResult;
743770
final @Nullable Object data;
744771

745772
PendingOperation(
746773
@NonNull String method,
747774
@Nullable Messages.Result<Messages.UserData> userDataResult,
748-
@Nullable Messages.Result<Void> voidResult,
775+
@Nullable Messages.VoidResult voidResult,
749776
@Nullable Messages.Result<Boolean> boolResult,
750777
@Nullable Messages.Result<String> stringResult,
751778
@Nullable Object data) {
@@ -764,7 +791,7 @@ private static class PendingOperation {
764791

765792
/** Clears the token kept in the client side cache. */
766793
@Override
767-
public void clearAuthCache(@NonNull String token, @NonNull Messages.Result<Void> result) {
794+
public void clearAuthCache(@NonNull String token, @NonNull Messages.VoidResult result) {
768795
Callable<Void> clearTokenTask =
769796
() -> {
770797
GoogleAuthUtil.clearToken(context, token);
@@ -775,7 +802,8 @@ public void clearAuthCache(@NonNull String token, @NonNull Messages.Result<Void>
775802
clearTokenTask,
776803
clearTokenFuture -> {
777804
try {
778-
result.success(clearTokenFuture.get());
805+
clearTokenFuture.get();
806+
result.success();
779807
} catch (ExecutionException e) {
780808
@Nullable Throwable cause = e.getCause();
781809
result.error(

0 commit comments

Comments
 (0)