77import android .net .Uri ;
88import android .os .Parcel ;
99import android .os .Parcelable ;
10+
1011import androidx .annotation .ColorRes ;
1112import androidx .annotation .NonNull ;
1213import androidx .annotation .Nullable ;
1314import androidx .browser .customtabs .CustomTabColorSchemeParams ;
1415import androidx .browser .customtabs .CustomTabsIntent ;
1516import androidx .browser .customtabs .CustomTabsSession ;
16- import androidx .browser .trusted .TrustedWebActivityIntent ;
1717import androidx .browser .trusted .TrustedWebActivityIntentBuilder ;
1818import androidx .core .content .ContextCompat ;
1919
2020import com .auth0 .android .authentication .AuthenticationException ;
2121
22+ import java .util .List ;
23+
2224/**
2325 * Holder for Custom Tabs customization options. Use {@link CustomTabsOptions#newBuilder()} to begin.
2426 */
@@ -29,10 +31,14 @@ public class CustomTabsOptions implements Parcelable {
2931 private final int toolbarColor ;
3032 private final BrowserPicker browserPicker ;
3133
32- private CustomTabsOptions (boolean showTitle , @ ColorRes int toolbarColor , @ NonNull BrowserPicker browserPicker ) {
34+ @ Nullable
35+ private final List <String > disabledCustomTabsPackages ;
36+
37+ private CustomTabsOptions (boolean showTitle , @ ColorRes int toolbarColor , @ NonNull BrowserPicker browserPicker , @ Nullable List <String > disabledCustomTabsPackages ) {
3338 this .showTitle = showTitle ;
3439 this .toolbarColor = toolbarColor ;
3540 this .browserPicker = browserPicker ;
41+ this .disabledCustomTabsPackages = disabledCustomTabsPackages ;
3642 }
3743
3844 @ Nullable
@@ -44,6 +50,16 @@ boolean hasCompatibleBrowser(@NonNull PackageManager pm) {
4450 return getPreferredPackage (pm ) != null ;
4551 }
4652
53+ /**
54+ * Returns whether the browser preferred package has custom tab disabled or not.
55+ *
56+ * @param preferredPackage the preferred browser package name.
57+ * @return whether the browser preferred package has custom tab disabled or not.
58+ */
59+ boolean isDisabledCustomTabBrowser (@ NonNull String preferredPackage ) {
60+ return disabledCustomTabsPackages != null && disabledCustomTabsPackages .contains (preferredPackage );
61+ }
62+
4763 /**
4864 * Create a new CustomTabsOptions.Builder instance.
4965 *
@@ -57,6 +73,12 @@ public static Builder newBuilder() {
5773
5874 @ SuppressLint ("ResourceType" )
5975 Intent toIntent (@ NonNull Context context , @ Nullable CustomTabsSession session ) {
76+ String preferredPackage = this .getPreferredPackage (context .getPackageManager ());
77+
78+ if (preferredPackage != null && this .isDisabledCustomTabBrowser (preferredPackage )) {
79+ return new Intent (Intent .ACTION_VIEW );
80+ }
81+
6082 final CustomTabsIntent .Builder builder = new CustomTabsIntent .Builder (session )
6183 .setShowTitle (showTitle )
6284 .setShareState (CustomTabsIntent .SHARE_STATE_OFF );
@@ -85,13 +107,15 @@ protected CustomTabsOptions(@NonNull Parcel in) {
85107 showTitle = in .readByte () != 0 ;
86108 toolbarColor = in .readInt ();
87109 browserPicker = in .readParcelable (BrowserPicker .class .getClassLoader ());
110+ disabledCustomTabsPackages = in .createStringArrayList ();
88111 }
89112
90113 @ Override
91114 public void writeToParcel (@ NonNull Parcel dest , int flags ) {
92115 dest .writeByte ((byte ) (showTitle ? 1 : 0 ));
93116 dest .writeInt (toolbarColor );
94117 dest .writeParcelable (browserPicker , flags );
118+ dest .writeStringList (disabledCustomTabsPackages );
95119 }
96120
97121 @ Override
@@ -120,10 +144,14 @@ public static class Builder {
120144 @ NonNull
121145 private BrowserPicker browserPicker ;
122146
147+ @ Nullable
148+ private List <String > disabledCustomTabsPackages ;
149+
123150 Builder () {
124151 this .showTitle = false ;
125152 this .toolbarColor = 0 ;
126153 this .browserPicker = BrowserPicker .newBuilder ().build ();
154+ this .disabledCustomTabsPackages = null ;
127155 }
128156
129157 /**
@@ -171,14 +199,27 @@ public Builder withBrowserPicker(@NonNull BrowserPicker browserPicker) {
171199 return this ;
172200 }
173201
202+ /**
203+ * Define a list of browser packages that disables the launching of authentication on custom tabs.
204+ * The authentication url will launch on the preferred package external browser.
205+ *
206+ * @param disabledCustomTabsPackages list of browser packages.
207+ * @return the current builder instance
208+ */
209+ @ NonNull
210+ public Builder withDisabledCustomTabsPackages (List <String > disabledCustomTabsPackages ) {
211+ this .disabledCustomTabsPackages = disabledCustomTabsPackages ;
212+ return this ;
213+ }
214+
174215 /**
175216 * Create a new CustomTabsOptions instance with the customization settings.
176217 *
177218 * @return an instance of CustomTabsOptions with the customization settings.
178219 */
179220 @ NonNull
180221 public CustomTabsOptions build () {
181- return new CustomTabsOptions (showTitle , toolbarColor , browserPicker );
222+ return new CustomTabsOptions (showTitle , toolbarColor , browserPicker , disabledCustomTabsPackages );
182223 }
183224 }
184225
0 commit comments