protected async Task ScrollFlyoutToBottom(ShellRenderer shellRenderer) { var flyoutItems = GetFlyoutMenuReyclerView(shellRenderer); TaskCompletionSource <object> result = new TaskCompletionSource <object>(); flyoutItems.ScrollChange += OnFlyoutItemsScrollChange; flyoutItems.ScrollToPosition(flyoutItems.GetAdapter().ItemCount - 1); await result.Task.WaitAsync(TimeSpan.FromSeconds(2)); await Task.Delay(10); void OnFlyoutItemsScrollChange(object sender, AView.ScrollChangeEventArgs e) { flyoutItems.ScrollChange -= OnFlyoutItemsScrollChange; result.TrySetResult(true); } // The appbar layout won't offset if you programmatically scroll the RecyclerView // I haven't found a way to match the exact behavior when you touch and scroll // I think we'd have to actually send touch events through adb var coordinatorLayout = flyoutItems.Parent.GetParentOfType <CoordinatorLayout>(); var appbarLayout = coordinatorLayout.GetFirstChildOfType <AppBarLayout>(); var clLayoutParams = appbarLayout.LayoutParameters as CoordinatorLayout.LayoutParams; var behavior = clLayoutParams.Behavior as AppBarLayout.Behavior; var headerContainer = appbarLayout.GetFirstChildOfType <HeaderContainer>(); var verticalOffset = flyoutItems.ComputeVerticalScrollOffset(); behavior.OnNestedPreScroll(coordinatorLayout, appbarLayout, flyoutItems, 0, verticalOffset, new int[2], ViewCompat.TypeTouch); await Task.Delay(10); }
protected async Task OpenFlyout(ShellRenderer shellRenderer, TimeSpan?timeOut = null) { var flyoutView = GetFlyoutPlatformView(shellRenderer); var drawerLayout = GetDrawerLayout(shellRenderer); if (!drawerLayout.FlyoutFirstDrawPassFinished) { await Task.Delay(10); } var hamburger = GetPlatformToolbar((IPlatformViewHandler)shellRenderer).GetChildrenOfType <AppCompatImageButton>().FirstOrDefault() ?? throw new InvalidOperationException("Unable to find Drawer Button"); timeOut = timeOut ?? TimeSpan.FromSeconds(2); TaskCompletionSource <object> taskCompletionSource = new TaskCompletionSource <object>(); drawerLayout.DrawerOpened += OnDrawerOpened; hamburger.PerformClick(); await taskCompletionSource.Task.WaitAsync(timeOut.Value); void OnDrawerOpened(object sender, DrawerLayout.DrawerOpenedEventArgs e) { drawerLayout.DrawerOpened -= OnDrawerOpened; taskCompletionSource.SetResult(true); } }
internal Graphics.Rect GetFlyoutFrame(ShellRenderer shellRenderer) { var platformView = GetFlyoutPlatformView(shellRenderer); var context = platformView.Context; return(new Graphics.Rect(0, 0, context.FromPixels(platformView.MeasuredWidth), context.FromPixels(platformView.MeasuredHeight))); }
RecyclerViewContainer GetFlyoutMenuReyclerView(ShellRenderer shellRenderer) { IShellContext shellContext = shellRenderer; DrawerLayout dl = shellContext.CurrentDrawerLayout; var flyout = dl.GetChildAt(0); RecyclerViewContainer flyoutContainer = null; if (dl.GetChildAt(1) is ViewGroup vg1 && vg1.GetChildAt(0) is RecyclerViewContainer rvc) { flyoutContainer = rvc; } return(flyoutContainer ?? throw new Exception("RecyclerView not found")); }
protected async Task CheckFlyoutState(ShellRenderer handler, bool desiredState) { var drawerLayout = GetDrawerLayout(handler); var flyout = drawerLayout.GetChildAt(1); if (drawerLayout.IsDrawerOpen(flyout) == desiredState) { Assert.Equal(desiredState, drawerLayout.IsDrawerOpen(flyout)); return; } var taskCompletionSource = new TaskCompletionSource <bool>(); flyout.LayoutChange += OnLayoutChanged; try { await taskCompletionSource.Task.WaitAsync(TimeSpan.FromSeconds(2)); } catch (TimeoutException) { } flyout.LayoutChange -= OnLayoutChanged; Assert.Equal(desiredState, drawerLayout.IsDrawerOpen(flyout)); return; void OnLayoutChanged(object sender, Android.Views.View.LayoutChangeEventArgs e) { if (drawerLayout.IsDrawerOpen(flyout) == desiredState) { taskCompletionSource.SetResult(true); flyout.LayoutChange -= OnLayoutChanged; } } }
protected Task CheckFlyoutState(ShellRenderer renderer, bool result) => throw new NotImplementedException();
void Initialize() { SetEGLContextClientVersion(2); shellRenderer = new ShellRenderer(); SetRenderer(shellRenderer); }
ShellFlyoutRenderer GetDrawerLayout(ShellRenderer shellRenderer) { IShellContext shellContext = shellRenderer; return((ShellFlyoutRenderer)shellContext.CurrentDrawerLayout); }
internal Graphics.Rect GetFrameRelativeToFlyout(ShellRenderer shellRenderer, IView view) { var platformView = (view.Handler as IPlatformViewHandler).PlatformView; return(platformView.GetFrameRelativeTo(GetFlyoutPlatformView(shellRenderer))); }
protected AView GetFlyoutPlatformView(ShellRenderer shellRenderer) { var drawerLayout = GetDrawerLayout(shellRenderer); return(drawerLayout.GetChildrenOfType <ShellFlyoutLayout>().First()); }