Example #1
0
        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);
        }
Example #2
0
        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);
            }
        }
Example #3
0
        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)));
        }
Example #4
0
        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"));
        }
Example #5
0
        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;
                }
            }
        }
Example #6
0
 protected Task CheckFlyoutState(ShellRenderer renderer, bool result) =>
 throw new NotImplementedException();
Example #7
0
 void Initialize()
 {
     SetEGLContextClientVersion(2);
     shellRenderer = new ShellRenderer();
     SetRenderer(shellRenderer);
 }
Example #8
0
        ShellFlyoutRenderer GetDrawerLayout(ShellRenderer shellRenderer)
        {
            IShellContext shellContext = shellRenderer;

            return((ShellFlyoutRenderer)shellContext.CurrentDrawerLayout);
        }
Example #9
0
        internal Graphics.Rect GetFrameRelativeToFlyout(ShellRenderer shellRenderer, IView view)
        {
            var platformView = (view.Handler as IPlatformViewHandler).PlatformView;

            return(platformView.GetFrameRelativeTo(GetFlyoutPlatformView(shellRenderer)));
        }
Example #10
0
        protected AView GetFlyoutPlatformView(ShellRenderer shellRenderer)
        {
            var drawerLayout = GetDrawerLayout(shellRenderer);

            return(drawerLayout.GetChildrenOfType <ShellFlyoutLayout>().First());
        }