Skip to content
This repository was archived by the owner on May 15, 2024. It is now read-only.

Commit 2bcb47d

Browse files
GH-1180 ; Don't launch new task on custom tabs. (#1183)
* Don't launch new task on custom tabs. * Android Set custom tabs flags for appcontext * Added BrowserLaunchFlags This can be a place to expose some platform specific isms. For now on Android we have a `PrefereAdjacent` and on iOS a `PreferModal`. * Added present sheet options, sample * Use flags in sample * Cleanup API a little bit and add docs Co-authored-by: Jonathan Dick <[email protected]> Co-authored-by: Jonathan Dick <[email protected]>
1 parent 351d96d commit 2bcb47d

15 files changed

+283
-26
lines changed

Samples/Samples/View/BrowserPage.xaml

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,25 @@
4242
ItemsSource="{Binding AllColors}"
4343
SelectedIndex="{Binding ControlColor, Mode=TwoWay}" />
4444

45+
<Label Text="Flags:" />
46+
47+
<Grid>
48+
<Grid.ColumnDefinitions>
49+
<ColumnDefinition Width="*" />
50+
<ColumnDefinition Width="Auto" />
51+
</Grid.ColumnDefinitions>
52+
53+
<Label Text="Launch Adjacent (Android)" Grid.Column="0" Grid.Row="0" />
54+
<Switch IsToggled="{Binding LaunchAdjacent, Mode=TwoWay}" Grid.Column="1" Grid.Row="0" />
55+
56+
<Label Text="Present as Form Sheet (iOS)" Grid.Column="0" Grid.Row="1" />
57+
<Switch IsToggled="{Binding PresentAsFormSheet, Mode=TwoWay}" Grid.Column="1" Grid.Row="1" />
58+
59+
<Label Text="Present as Page Sheet (iOS)" Grid.Column="0" Grid.Row="2" />
60+
<Switch IsToggled="{Binding PresentAsPageSheet, Mode=TwoWay}" Grid.Column="1" Grid.Row="2" />
61+
62+
</Grid>
63+
4564
<Label Text="{Binding BrowserStatus}" />
4665
</StackLayout>
4766
</ScrollView>

Samples/Samples/ViewModel/BrowserViewModel.cs

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,9 @@ public class BrowserViewModel : BaseViewModel
1616
int browserTitleType = (int)BrowserTitleMode.Default;
1717
int controlColor = 0;
1818
int toolbarColor = 0;
19+
bool presentAsFormSheet = false;
20+
bool presentAsPageSheet = false;
21+
bool launchAdjacent = false;
1922

2023
Dictionary<string, Color> colorDictionary;
2124

@@ -89,6 +92,24 @@ public int ControlColor
8992
set => SetProperty(ref controlColor, value);
9093
}
9194

95+
public bool PresentAsFormSheet
96+
{
97+
get => presentAsFormSheet;
98+
set => SetProperty(ref presentAsFormSheet, value);
99+
}
100+
101+
public bool PresentAsPageSheet
102+
{
103+
get => presentAsPageSheet;
104+
set => SetProperty(ref presentAsPageSheet, value);
105+
}
106+
107+
public bool LaunchAdjacent
108+
{
109+
get => launchAdjacent;
110+
set => SetProperty(ref launchAdjacent, value);
111+
}
112+
92113
async void OpenUri()
93114
{
94115
if (IsBusy)
@@ -97,12 +118,21 @@ async void OpenUri()
97118
IsBusy = true;
98119
try
99120
{
121+
var flags = BrowserLaunchFlags.None;
122+
if (PresentAsPageSheet)
123+
flags |= BrowserLaunchFlags.PresentAsPageSheet;
124+
if (PresentAsFormSheet)
125+
flags |= BrowserLaunchFlags.PresentAsFormSheet;
126+
if (LaunchAdjacent)
127+
flags |= BrowserLaunchFlags.LaunchAdjacent;
128+
100129
await Browser.OpenAsync(uri, new BrowserLaunchOptions
101130
{
102131
LaunchMode = (BrowserLaunchMode)BrowserType,
103132
TitleMode = (BrowserTitleMode)BrowserTitleType,
104133
PreferredToolbarColor = GetColor(ToolbarColor),
105-
PreferredControlColor = GetColor(ControlColor)
134+
PreferredControlColor = GetColor(ControlColor),
135+
Flags = flags
106136
});
107137
}
108138
catch (Exception e)

Xamarin.Essentials/Browser/Browser.android.cs

Lines changed: 27 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -27,24 +27,40 @@ static Task<bool> PlatformOpenAsync(Uri uri, BrowserLaunchOptions options)
2727
tabsBuilder.SetShowTitle(options.TitleMode == BrowserTitleMode.Show);
2828

2929
var tabsIntent = tabsBuilder.Build();
30-
var flags = ActivityFlags.ClearTop | ActivityFlags.NewTask;
30+
ActivityFlags? tabsFlags = null;
31+
32+
Context context = Platform.GetCurrentActivity(false);
33+
34+
if (context == null)
35+
{
36+
context = Platform.AppContext;
37+
38+
// If using ApplicationContext we need to set ClearTop/NewTask (See #225)
39+
tabsFlags = ActivityFlags.ClearTop | ActivityFlags.NewTask;
40+
}
41+
3142
#if __ANDROID_24__
32-
if (Platform.HasApiLevelN)
33-
flags |= ActivityFlags.LaunchAdjacent;
43+
if (Platform.HasApiLevelN && options.HasFlag(BrowserLaunchFlags.LaunchAdjacent))
44+
{
45+
if (tabsFlags.HasValue)
46+
tabsFlags |= ActivityFlags.LaunchAdjacent | ActivityFlags.NewTask;
47+
else
48+
tabsFlags = ActivityFlags.LaunchAdjacent | ActivityFlags.NewTask;
49+
}
3450
#endif
35-
tabsIntent.Intent.SetFlags(flags);
3651

37-
#if __ANDROID_25__
38-
tabsIntent.LaunchUrl(Platform.AppContext, nativeUri);
39-
#else
40-
tabsIntent.LaunchUrl(Platform.GetCurrentActivity(true), nativeUri);
41-
#endif
52+
// Check if there's flags specified to use
53+
if (tabsFlags.HasValue)
54+
tabsIntent.Intent.SetFlags(tabsFlags.Value);
55+
56+
tabsIntent.LaunchUrl(context, nativeUri);
57+
4258
break;
4359
case BrowserLaunchMode.External:
4460
var intent = new Intent(Intent.ActionView, nativeUri);
45-
flags = ActivityFlags.ClearTop | ActivityFlags.NewTask;
61+
var flags = ActivityFlags.ClearTop | ActivityFlags.NewTask;
4662
#if __ANDROID_24__
47-
if (Platform.HasApiLevelN)
63+
if (Platform.HasApiLevelN && options.HasFlag(BrowserLaunchFlags.LaunchAdjacent))
4864
flags |= ActivityFlags.LaunchAdjacent;
4965
#endif
5066
intent.SetFlags(flags);

Xamarin.Essentials/Browser/Browser.ios.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,12 @@ static async Task<bool> PlatformOpenAsync(Uri uri, BrowserLaunchOptions options)
2828
{
2929
sfViewController.PopoverPresentationController.SourceView = vc.View;
3030
}
31+
32+
if (options.HasFlag(BrowserLaunchFlags.PresentAsFormSheet))
33+
sfViewController.ModalPresentationStyle = UIModalPresentationStyle.FormSheet;
34+
else if (options.HasFlag(BrowserLaunchFlags.PresentAsPageSheet))
35+
sfViewController.ModalPresentationStyle = UIModalPresentationStyle.PageSheet;
36+
3137
await vc.PresentViewControllerAsync(sfViewController, true);
3238
break;
3339
case BrowserLaunchMode.External:

Xamarin.Essentials/Browser/BrowserLaunchOptions.shared.cs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
using System.Drawing;
33
#endif
44

5+
using System;
6+
57
namespace Xamarin.Essentials
68
{
79
public class BrowserLaunchOptions
@@ -15,5 +17,19 @@ public class BrowserLaunchOptions
1517
public BrowserLaunchMode LaunchMode { get; set; } = BrowserLaunchMode.SystemPreferred;
1618

1719
public BrowserTitleMode TitleMode { get; set; } = BrowserTitleMode.Default;
20+
21+
public BrowserLaunchFlags Flags { get; set; } = BrowserLaunchFlags.None;
22+
23+
internal bool HasFlag(BrowserLaunchFlags flag)
24+
=> Flags.HasFlag(flag);
25+
}
26+
27+
[Flags]
28+
public enum BrowserLaunchFlags
29+
{
30+
None = 0,
31+
LaunchAdjacent = 1,
32+
PresentAsPageSheet = 2,
33+
PresentAsFormSheet = 4
1834
}
1935
}

docs/en/FrameworksIndex/xamarin-essentials-android.xml

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,12 +118,19 @@
118118
<Member Id="M:Xamarin.Essentials.Browser.OpenAsync(System.Uri,Xamarin.Essentials.BrowserLaunchMode)" />
119119
<Member Id="M:Xamarin.Essentials.Browser.OpenAsync(System.Uri,Xamarin.Essentials.BrowserLaunchOptions)" />
120120
</Type>
121+
<Type Name="Xamarin.Essentials.BrowserLaunchFlags" Id="T:Xamarin.Essentials.BrowserLaunchFlags">
122+
<Member Id="F:Xamarin.Essentials.BrowserLaunchFlags.LaunchAdjacent" />
123+
<Member Id="F:Xamarin.Essentials.BrowserLaunchFlags.None" />
124+
<Member Id="F:Xamarin.Essentials.BrowserLaunchFlags.PresentAsFormSheet" />
125+
<Member Id="F:Xamarin.Essentials.BrowserLaunchFlags.PresentAsPageSheet" />
126+
</Type>
121127
<Type Name="Xamarin.Essentials.BrowserLaunchMode" Id="T:Xamarin.Essentials.BrowserLaunchMode">
122128
<Member Id="F:Xamarin.Essentials.BrowserLaunchMode.External" />
123129
<Member Id="F:Xamarin.Essentials.BrowserLaunchMode.SystemPreferred" />
124130
</Type>
125131
<Type Name="Xamarin.Essentials.BrowserLaunchOptions" Id="T:Xamarin.Essentials.BrowserLaunchOptions">
126132
<Member Id="M:Xamarin.Essentials.BrowserLaunchOptions.#ctor" />
133+
<Member Id="P:Xamarin.Essentials.BrowserLaunchOptions.Flags" />
127134
<Member Id="P:Xamarin.Essentials.BrowserLaunchOptions.LaunchMode" />
128135
<Member Id="P:Xamarin.Essentials.BrowserLaunchOptions.PreferredControlColor" />
129136
<Member Id="P:Xamarin.Essentials.BrowserLaunchOptions.PreferredToolbarColor" />
@@ -557,6 +564,7 @@
557564
</Type>
558565
<Type Name="Xamarin.Essentials.Permissions/Battery" Id="T:Xamarin.Essentials.Permissions.Battery">
559566
<Member Id="M:Xamarin.Essentials.Permissions.Battery.#ctor" />
567+
<Member Id="M:Xamarin.Essentials.Permissions.Battery.CheckStatusAsync" />
560568
<Member Id="P:Xamarin.Essentials.Permissions.Battery.RequiredPermissions" />
561569
</Type>
562570
<Type Name="Xamarin.Essentials.Permissions/CalendarRead" Id="T:Xamarin.Essentials.Permissions.CalendarRead">
@@ -875,7 +883,6 @@
875883
<Member Id="P:Xamarin.Essentials.WebAuthenticatorResult.RefreshToken" />
876884
<Member Id="P:Xamarin.Essentials.WebAuthenticatorResult.RefreshTokenExpiresIn" />
877885
<Member Id="P:Xamarin.Essentials.WebAuthenticatorResult.Timestamp" />
878-
<Member Id="P:Xamarin.Essentials.WebAuthenticatorResult.TokenType" />
879886
</Type>
880887
</Namespace>
881888
</Framework>

docs/en/FrameworksIndex/xamarin-essentials-ios.xml

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,12 +105,19 @@
105105
<Member Id="M:Xamarin.Essentials.Browser.OpenAsync(System.Uri,Xamarin.Essentials.BrowserLaunchMode)" />
106106
<Member Id="M:Xamarin.Essentials.Browser.OpenAsync(System.Uri,Xamarin.Essentials.BrowserLaunchOptions)" />
107107
</Type>
108+
<Type Name="Xamarin.Essentials.BrowserLaunchFlags" Id="T:Xamarin.Essentials.BrowserLaunchFlags">
109+
<Member Id="F:Xamarin.Essentials.BrowserLaunchFlags.LaunchAdjacent" />
110+
<Member Id="F:Xamarin.Essentials.BrowserLaunchFlags.None" />
111+
<Member Id="F:Xamarin.Essentials.BrowserLaunchFlags.PresentAsFormSheet" />
112+
<Member Id="F:Xamarin.Essentials.BrowserLaunchFlags.PresentAsPageSheet" />
113+
</Type>
108114
<Type Name="Xamarin.Essentials.BrowserLaunchMode" Id="T:Xamarin.Essentials.BrowserLaunchMode">
109115
<Member Id="F:Xamarin.Essentials.BrowserLaunchMode.External" />
110116
<Member Id="F:Xamarin.Essentials.BrowserLaunchMode.SystemPreferred" />
111117
</Type>
112118
<Type Name="Xamarin.Essentials.BrowserLaunchOptions" Id="T:Xamarin.Essentials.BrowserLaunchOptions">
113119
<Member Id="M:Xamarin.Essentials.BrowserLaunchOptions.#ctor" />
120+
<Member Id="P:Xamarin.Essentials.BrowserLaunchOptions.Flags" />
114121
<Member Id="P:Xamarin.Essentials.BrowserLaunchOptions.LaunchMode" />
115122
<Member Id="P:Xamarin.Essentials.BrowserLaunchOptions.PreferredControlColor" />
116123
<Member Id="P:Xamarin.Essentials.BrowserLaunchOptions.PreferredToolbarColor" />
@@ -871,7 +878,6 @@
871878
<Member Id="P:Xamarin.Essentials.WebAuthenticatorResult.RefreshToken" />
872879
<Member Id="P:Xamarin.Essentials.WebAuthenticatorResult.RefreshTokenExpiresIn" />
873880
<Member Id="P:Xamarin.Essentials.WebAuthenticatorResult.Timestamp" />
874-
<Member Id="P:Xamarin.Essentials.WebAuthenticatorResult.TokenType" />
875881
</Type>
876882
</Namespace>
877883
</Framework>

docs/en/FrameworksIndex/xamarin-essentials-tvos.xml

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,12 +105,19 @@
105105
<Member Id="M:Xamarin.Essentials.Browser.OpenAsync(System.Uri,Xamarin.Essentials.BrowserLaunchMode)" />
106106
<Member Id="M:Xamarin.Essentials.Browser.OpenAsync(System.Uri,Xamarin.Essentials.BrowserLaunchOptions)" />
107107
</Type>
108+
<Type Name="Xamarin.Essentials.BrowserLaunchFlags" Id="T:Xamarin.Essentials.BrowserLaunchFlags">
109+
<Member Id="F:Xamarin.Essentials.BrowserLaunchFlags.LaunchAdjacent" />
110+
<Member Id="F:Xamarin.Essentials.BrowserLaunchFlags.None" />
111+
<Member Id="F:Xamarin.Essentials.BrowserLaunchFlags.PresentAsFormSheet" />
112+
<Member Id="F:Xamarin.Essentials.BrowserLaunchFlags.PresentAsPageSheet" />
113+
</Type>
108114
<Type Name="Xamarin.Essentials.BrowserLaunchMode" Id="T:Xamarin.Essentials.BrowserLaunchMode">
109115
<Member Id="F:Xamarin.Essentials.BrowserLaunchMode.External" />
110116
<Member Id="F:Xamarin.Essentials.BrowserLaunchMode.SystemPreferred" />
111117
</Type>
112118
<Type Name="Xamarin.Essentials.BrowserLaunchOptions" Id="T:Xamarin.Essentials.BrowserLaunchOptions">
113119
<Member Id="M:Xamarin.Essentials.BrowserLaunchOptions.#ctor" />
120+
<Member Id="P:Xamarin.Essentials.BrowserLaunchOptions.Flags" />
114121
<Member Id="P:Xamarin.Essentials.BrowserLaunchOptions.LaunchMode" />
115122
<Member Id="P:Xamarin.Essentials.BrowserLaunchOptions.PreferredControlColor" />
116123
<Member Id="P:Xamarin.Essentials.BrowserLaunchOptions.PreferredToolbarColor" />
@@ -833,7 +840,6 @@
833840
<Member Id="P:Xamarin.Essentials.WebAuthenticatorResult.RefreshToken" />
834841
<Member Id="P:Xamarin.Essentials.WebAuthenticatorResult.RefreshTokenExpiresIn" />
835842
<Member Id="P:Xamarin.Essentials.WebAuthenticatorResult.Timestamp" />
836-
<Member Id="P:Xamarin.Essentials.WebAuthenticatorResult.TokenType" />
837843
</Type>
838844
</Namespace>
839845
</Framework>

docs/en/FrameworksIndex/xamarin-essentials-uwp.xml

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,12 +105,19 @@
105105
<Member Id="M:Xamarin.Essentials.Browser.OpenAsync(System.Uri,Xamarin.Essentials.BrowserLaunchMode)" />
106106
<Member Id="M:Xamarin.Essentials.Browser.OpenAsync(System.Uri,Xamarin.Essentials.BrowserLaunchOptions)" />
107107
</Type>
108+
<Type Name="Xamarin.Essentials.BrowserLaunchFlags" Id="T:Xamarin.Essentials.BrowserLaunchFlags">
109+
<Member Id="F:Xamarin.Essentials.BrowserLaunchFlags.LaunchAdjacent" />
110+
<Member Id="F:Xamarin.Essentials.BrowserLaunchFlags.None" />
111+
<Member Id="F:Xamarin.Essentials.BrowserLaunchFlags.PresentAsFormSheet" />
112+
<Member Id="F:Xamarin.Essentials.BrowserLaunchFlags.PresentAsPageSheet" />
113+
</Type>
108114
<Type Name="Xamarin.Essentials.BrowserLaunchMode" Id="T:Xamarin.Essentials.BrowserLaunchMode">
109115
<Member Id="F:Xamarin.Essentials.BrowserLaunchMode.External" />
110116
<Member Id="F:Xamarin.Essentials.BrowserLaunchMode.SystemPreferred" />
111117
</Type>
112118
<Type Name="Xamarin.Essentials.BrowserLaunchOptions" Id="T:Xamarin.Essentials.BrowserLaunchOptions">
113119
<Member Id="M:Xamarin.Essentials.BrowserLaunchOptions.#ctor" />
120+
<Member Id="P:Xamarin.Essentials.BrowserLaunchOptions.Flags" />
114121
<Member Id="P:Xamarin.Essentials.BrowserLaunchOptions.LaunchMode" />
115122
<Member Id="P:Xamarin.Essentials.BrowserLaunchOptions.PreferredControlColor" />
116123
<Member Id="P:Xamarin.Essentials.BrowserLaunchOptions.PreferredToolbarColor" />
@@ -832,7 +839,6 @@
832839
<Member Id="P:Xamarin.Essentials.WebAuthenticatorResult.RefreshToken" />
833840
<Member Id="P:Xamarin.Essentials.WebAuthenticatorResult.RefreshTokenExpiresIn" />
834841
<Member Id="P:Xamarin.Essentials.WebAuthenticatorResult.Timestamp" />
835-
<Member Id="P:Xamarin.Essentials.WebAuthenticatorResult.TokenType" />
836842
</Type>
837843
</Namespace>
838844
</Framework>

docs/en/FrameworksIndex/xamarin-essentials-watchos.xml

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,12 +105,19 @@
105105
<Member Id="M:Xamarin.Essentials.Browser.OpenAsync(System.Uri,Xamarin.Essentials.BrowserLaunchMode)" />
106106
<Member Id="M:Xamarin.Essentials.Browser.OpenAsync(System.Uri,Xamarin.Essentials.BrowserLaunchOptions)" />
107107
</Type>
108+
<Type Name="Xamarin.Essentials.BrowserLaunchFlags" Id="T:Xamarin.Essentials.BrowserLaunchFlags">
109+
<Member Id="F:Xamarin.Essentials.BrowserLaunchFlags.LaunchAdjacent" />
110+
<Member Id="F:Xamarin.Essentials.BrowserLaunchFlags.None" />
111+
<Member Id="F:Xamarin.Essentials.BrowserLaunchFlags.PresentAsFormSheet" />
112+
<Member Id="F:Xamarin.Essentials.BrowserLaunchFlags.PresentAsPageSheet" />
113+
</Type>
108114
<Type Name="Xamarin.Essentials.BrowserLaunchMode" Id="T:Xamarin.Essentials.BrowserLaunchMode">
109115
<Member Id="F:Xamarin.Essentials.BrowserLaunchMode.External" />
110116
<Member Id="F:Xamarin.Essentials.BrowserLaunchMode.SystemPreferred" />
111117
</Type>
112118
<Type Name="Xamarin.Essentials.BrowserLaunchOptions" Id="T:Xamarin.Essentials.BrowserLaunchOptions">
113119
<Member Id="M:Xamarin.Essentials.BrowserLaunchOptions.#ctor" />
120+
<Member Id="P:Xamarin.Essentials.BrowserLaunchOptions.Flags" />
114121
<Member Id="P:Xamarin.Essentials.BrowserLaunchOptions.LaunchMode" />
115122
<Member Id="P:Xamarin.Essentials.BrowserLaunchOptions.PreferredControlColor" />
116123
<Member Id="P:Xamarin.Essentials.BrowserLaunchOptions.PreferredToolbarColor" />
@@ -842,7 +849,6 @@
842849
<Member Id="P:Xamarin.Essentials.WebAuthenticatorResult.RefreshToken" />
843850
<Member Id="P:Xamarin.Essentials.WebAuthenticatorResult.RefreshTokenExpiresIn" />
844851
<Member Id="P:Xamarin.Essentials.WebAuthenticatorResult.Timestamp" />
845-
<Member Id="P:Xamarin.Essentials.WebAuthenticatorResult.TokenType" />
846852
</Type>
847853
</Namespace>
848854
</Framework>

0 commit comments

Comments
 (0)