Skip to content

Commit

Permalink
[url_launcher] Update Android Pigeon (#7744)
Browse files Browse the repository at this point in the history
Updates the version of Pigeon used for `url_launcher_android` to pick up non-nullable collection support, and updates the Pigeon definition file accordingly.

This has no effect on the native code since Java doesn't enforce generic non-nullability, but it extends the type safety on the Dart side until the Pigeon layer, rather than the Dart plugin code.

Part of flutter/flutter#155891
  • Loading branch information
stuartmorgan authored Oct 4, 2024
1 parent b339722 commit 6dd7f6b
Show file tree
Hide file tree
Showing 7 changed files with 254 additions and 163 deletions.
4 changes: 4 additions & 0 deletions packages/url_launcher/url_launcher_android/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
## 6.3.11

* Updates Pigeon for non-nullable collection type support.

## 6.3.10

* Removes dependency on org.jetbrains.kotlin:kotlin-bom.
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,14 @@
// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// Autogenerated from Pigeon (v10.1.6), do not edit directly.
// Autogenerated from Pigeon (v22.4.1), do not edit directly.
// See also: https://pub.dev/packages/pigeon

package io.flutter.plugins.urllauncher;

import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.RetentionPolicy.CLASS;

import android.util.Log;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
Expand All @@ -14,9 +17,12 @@
import io.flutter.plugin.common.MessageCodec;
import io.flutter.plugin.common.StandardMessageCodec;
import java.io.ByteArrayOutputStream;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.Map;
import java.util.Objects;

/** Generated class from Pigeon. */
@SuppressWarnings({"unused", "unchecked", "CodeBlock2Expr", "RedundantSuppression", "serial"})
Expand All @@ -40,7 +46,7 @@ public FlutterError(@NonNull String code, @Nullable String message, @Nullable Ob

@NonNull
protected static ArrayList<Object> wrapError(@NonNull Throwable exception) {
ArrayList<Object> errorList = new ArrayList<Object>(3);
ArrayList<Object> errorList = new ArrayList<>(3);
if (exception instanceof FlutterError) {
FlutterError error = (FlutterError) exception;
errorList.add(error.code);
Expand All @@ -55,6 +61,10 @@ protected static ArrayList<Object> wrapError(@NonNull Throwable exception) {
return errorList;
}

@Target(METHOD)
@Retention(CLASS)
@interface CanIgnoreReturnValue {}

/**
* Configuration options for an in-app WebView.
*
Expand Down Expand Up @@ -103,24 +113,46 @@ public void setHeaders(@NonNull Map<String, String> setterArg) {
/** Constructor is non-public to enforce null safety; use Builder. */
WebViewOptions() {}

@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
WebViewOptions that = (WebViewOptions) o;
return enableJavaScript.equals(that.enableJavaScript)
&& enableDomStorage.equals(that.enableDomStorage)
&& headers.equals(that.headers);
}

@Override
public int hashCode() {
return Objects.hash(enableJavaScript, enableDomStorage, headers);
}

public static final class Builder {

private @Nullable Boolean enableJavaScript;

@CanIgnoreReturnValue
public @NonNull Builder setEnableJavaScript(@NonNull Boolean setterArg) {
this.enableJavaScript = setterArg;
return this;
}

private @Nullable Boolean enableDomStorage;

@CanIgnoreReturnValue
public @NonNull Builder setEnableDomStorage(@NonNull Boolean setterArg) {
this.enableDomStorage = setterArg;
return this;
}

private @Nullable Map<String, String> headers;

@CanIgnoreReturnValue
public @NonNull Builder setHeaders(@NonNull Map<String, String> setterArg) {
this.headers = setterArg;
return this;
Expand All @@ -137,27 +169,32 @@ public static final class Builder {

@NonNull
ArrayList<Object> toList() {
ArrayList<Object> toListResult = new ArrayList<Object>(3);
ArrayList<Object> toListResult = new ArrayList<>(3);
toListResult.add(enableJavaScript);
toListResult.add(enableDomStorage);
toListResult.add(headers);
return toListResult;
}

static @NonNull WebViewOptions fromList(@NonNull ArrayList<Object> list) {
static @NonNull WebViewOptions fromList(@NonNull ArrayList<Object> pigeonVar_list) {
WebViewOptions pigeonResult = new WebViewOptions();
Object enableJavaScript = list.get(0);
Object enableJavaScript = pigeonVar_list.get(0);
pigeonResult.setEnableJavaScript((Boolean) enableJavaScript);
Object enableDomStorage = list.get(1);
Object enableDomStorage = pigeonVar_list.get(1);
pigeonResult.setEnableDomStorage((Boolean) enableDomStorage);
Object headers = list.get(2);
Object headers = pigeonVar_list.get(2);
pigeonResult.setHeaders((Map<String, String>) headers);
return pigeonResult;
}
}

/** Generated class from Pigeon that represents data sent in messages. */
/**
* Configuration options for in-app browser views.
*
* <p>Generated class from Pigeon that represents data sent in messages.
*/
public static final class BrowserOptions {
/** Whether or not to show the webpage title. */
private @NonNull Boolean showTitle;

public @NonNull Boolean getShowTitle() {
Expand All @@ -174,10 +211,28 @@ public void setShowTitle(@NonNull Boolean setterArg) {
/** Constructor is non-public to enforce null safety; use Builder. */
BrowserOptions() {}

@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
BrowserOptions that = (BrowserOptions) o;
return showTitle.equals(that.showTitle);
}

@Override
public int hashCode() {
return Objects.hash(showTitle);
}

public static final class Builder {

private @Nullable Boolean showTitle;

@CanIgnoreReturnValue
public @NonNull Builder setShowTitle(@NonNull Boolean setterArg) {
this.showTitle = setterArg;
return this;
Expand All @@ -192,44 +247,44 @@ public static final class Builder {

@NonNull
ArrayList<Object> toList() {
ArrayList<Object> toListResult = new ArrayList<Object>(1);
ArrayList<Object> toListResult = new ArrayList<>(1);
toListResult.add(showTitle);
return toListResult;
}

static @NonNull BrowserOptions fromList(@NonNull ArrayList<Object> list) {
static @NonNull BrowserOptions fromList(@NonNull ArrayList<Object> pigeonVar_list) {
BrowserOptions pigeonResult = new BrowserOptions();
Object showTitle = list.get(0);
Object showTitle = pigeonVar_list.get(0);
pigeonResult.setShowTitle((Boolean) showTitle);
return pigeonResult;
}
}

private static class UrlLauncherApiCodec extends StandardMessageCodec {
public static final UrlLauncherApiCodec INSTANCE = new UrlLauncherApiCodec();
private static class PigeonCodec extends StandardMessageCodec {
public static final PigeonCodec INSTANCE = new PigeonCodec();

private UrlLauncherApiCodec() {}
private PigeonCodec() {}

@Override
protected Object readValueOfType(byte type, @NonNull ByteBuffer buffer) {
switch (type) {
case (byte) 128:
return BrowserOptions.fromList((ArrayList<Object>) readValue(buffer));
case (byte) 129:
return WebViewOptions.fromList((ArrayList<Object>) readValue(buffer));
case (byte) 130:
return BrowserOptions.fromList((ArrayList<Object>) readValue(buffer));
default:
return super.readValueOfType(type, buffer);
}
}

@Override
protected void writeValue(@NonNull ByteArrayOutputStream stream, Object value) {
if (value instanceof BrowserOptions) {
stream.write(128);
writeValue(stream, ((BrowserOptions) value).toList());
} else if (value instanceof WebViewOptions) {
if (value instanceof WebViewOptions) {
stream.write(129);
writeValue(stream, ((WebViewOptions) value).toList());
} else if (value instanceof BrowserOptions) {
stream.write(130);
writeValue(stream, ((BrowserOptions) value).toList());
} else {
super.writeValue(stream, value);
}
Expand All @@ -244,7 +299,9 @@ public interface UrlLauncherApi {
/** Opens the URL externally, returning true if successful. */
@NonNull
Boolean launchUrl(@NonNull String url, @NonNull Map<String, String> headers);
/** Opens the URL in an in-app WebView, returning true if it opens successfully. */
/**
* Opens the URL in an in-app Custom Tab or WebView, returning true if it opens successfully.
*/
@NonNull
Boolean openUrlInApp(
@NonNull String url,
Expand All @@ -259,28 +316,36 @@ Boolean openUrlInApp(

/** The codec used by UrlLauncherApi. */
static @NonNull MessageCodec<Object> getCodec() {
return UrlLauncherApiCodec.INSTANCE;
return PigeonCodec.INSTANCE;
}
/** Sets up an instance of `UrlLauncherApi` to handle messages through the `binaryMessenger`. */
static void setup(@NonNull BinaryMessenger binaryMessenger, @Nullable UrlLauncherApi api) {
static void setUp(@NonNull BinaryMessenger binaryMessenger, @Nullable UrlLauncherApi api) {
setUp(binaryMessenger, "", api);
}

static void setUp(
@NonNull BinaryMessenger binaryMessenger,
@NonNull String messageChannelSuffix,
@Nullable UrlLauncherApi api) {
messageChannelSuffix = messageChannelSuffix.isEmpty() ? "" : "." + messageChannelSuffix;
{
BasicMessageChannel<Object> channel =
new BasicMessageChannel<>(
binaryMessenger,
"dev.flutter.pigeon.url_launcher_android.UrlLauncherApi.canLaunchUrl",
"dev.flutter.pigeon.url_launcher_android.UrlLauncherApi.canLaunchUrl"
+ messageChannelSuffix,
getCodec());
if (api != null) {
channel.setMessageHandler(
(message, reply) -> {
ArrayList<Object> wrapped = new ArrayList<Object>();
ArrayList<Object> wrapped = new ArrayList<>();
ArrayList<Object> args = (ArrayList<Object>) message;
String urlArg = (String) args.get(0);
try {
Boolean output = api.canLaunchUrl(urlArg);
wrapped.add(0, output);
} catch (Throwable exception) {
ArrayList<Object> wrappedError = wrapError(exception);
wrapped = wrappedError;
wrapped = wrapError(exception);
}
reply.reply(wrapped);
});
Expand All @@ -292,21 +357,21 @@ static void setup(@NonNull BinaryMessenger binaryMessenger, @Nullable UrlLaunche
BasicMessageChannel<Object> channel =
new BasicMessageChannel<>(
binaryMessenger,
"dev.flutter.pigeon.url_launcher_android.UrlLauncherApi.launchUrl",
"dev.flutter.pigeon.url_launcher_android.UrlLauncherApi.launchUrl"
+ messageChannelSuffix,
getCodec());
if (api != null) {
channel.setMessageHandler(
(message, reply) -> {
ArrayList<Object> wrapped = new ArrayList<Object>();
ArrayList<Object> wrapped = new ArrayList<>();
ArrayList<Object> args = (ArrayList<Object>) message;
String urlArg = (String) args.get(0);
Map<String, String> headersArg = (Map<String, String>) args.get(1);
try {
Boolean output = api.launchUrl(urlArg, headersArg);
wrapped.add(0, output);
} catch (Throwable exception) {
ArrayList<Object> wrappedError = wrapError(exception);
wrapped = wrappedError;
wrapped = wrapError(exception);
}
reply.reply(wrapped);
});
Expand All @@ -318,12 +383,13 @@ static void setup(@NonNull BinaryMessenger binaryMessenger, @Nullable UrlLaunche
BasicMessageChannel<Object> channel =
new BasicMessageChannel<>(
binaryMessenger,
"dev.flutter.pigeon.url_launcher_android.UrlLauncherApi.openUrlInApp",
"dev.flutter.pigeon.url_launcher_android.UrlLauncherApi.openUrlInApp"
+ messageChannelSuffix,
getCodec());
if (api != null) {
channel.setMessageHandler(
(message, reply) -> {
ArrayList<Object> wrapped = new ArrayList<Object>();
ArrayList<Object> wrapped = new ArrayList<>();
ArrayList<Object> args = (ArrayList<Object>) message;
String urlArg = (String) args.get(0);
Boolean allowCustomTabArg = (Boolean) args.get(1);
Expand All @@ -335,8 +401,7 @@ static void setup(@NonNull BinaryMessenger binaryMessenger, @Nullable UrlLaunche
urlArg, allowCustomTabArg, webViewOptionsArg, browserOptionsArg);
wrapped.add(0, output);
} catch (Throwable exception) {
ArrayList<Object> wrappedError = wrapError(exception);
wrapped = wrappedError;
wrapped = wrapError(exception);
}
reply.reply(wrapped);
});
Expand All @@ -348,18 +413,18 @@ static void setup(@NonNull BinaryMessenger binaryMessenger, @Nullable UrlLaunche
BasicMessageChannel<Object> channel =
new BasicMessageChannel<>(
binaryMessenger,
"dev.flutter.pigeon.url_launcher_android.UrlLauncherApi.supportsCustomTabs",
"dev.flutter.pigeon.url_launcher_android.UrlLauncherApi.supportsCustomTabs"
+ messageChannelSuffix,
getCodec());
if (api != null) {
channel.setMessageHandler(
(message, reply) -> {
ArrayList<Object> wrapped = new ArrayList<Object>();
ArrayList<Object> wrapped = new ArrayList<>();
try {
Boolean output = api.supportsCustomTabs();
wrapped.add(0, output);
} catch (Throwable exception) {
ArrayList<Object> wrappedError = wrapError(exception);
wrapped = wrappedError;
wrapped = wrapError(exception);
}
reply.reply(wrapped);
});
Expand All @@ -371,18 +436,18 @@ static void setup(@NonNull BinaryMessenger binaryMessenger, @Nullable UrlLaunche
BasicMessageChannel<Object> channel =
new BasicMessageChannel<>(
binaryMessenger,
"dev.flutter.pigeon.url_launcher_android.UrlLauncherApi.closeWebView",
"dev.flutter.pigeon.url_launcher_android.UrlLauncherApi.closeWebView"
+ messageChannelSuffix,
getCodec());
if (api != null) {
channel.setMessageHandler(
(message, reply) -> {
ArrayList<Object> wrapped = new ArrayList<Object>();
ArrayList<Object> wrapped = new ArrayList<>();
try {
api.closeWebView();
wrapped.add(0, null);
} catch (Throwable exception) {
ArrayList<Object> wrappedError = wrapError(exception);
wrapped = wrappedError;
wrapped = wrapError(exception);
}
reply.reply(wrapped);
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ public final class UrlLauncherPlugin implements FlutterPlugin, ActivityAware {
@Override
public void onAttachedToEngine(@NonNull FlutterPluginBinding binding) {
urlLauncher = new UrlLauncher(binding.getApplicationContext());
Messages.UrlLauncherApi.setup(binding.getBinaryMessenger(), urlLauncher);
Messages.UrlLauncherApi.setUp(binding.getBinaryMessenger(), urlLauncher);
}

@Override
Expand All @@ -33,7 +33,7 @@ public void onDetachedFromEngine(@NonNull FlutterPluginBinding binding) {
return;
}

Messages.UrlLauncherApi.setup(binding.getBinaryMessenger(), null);
Messages.UrlLauncherApi.setUp(binding.getBinaryMessenger(), null);
urlLauncher = null;
}

Expand Down
Loading

0 comments on commit 6dd7f6b

Please sign in to comment.