10ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam/* 20ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam * Copyright (C) 2017 The Android Open Source Project 30ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam * 40ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam * Licensed under the Apache License, Version 2.0 (the "License"); 50ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam * you may not use this file except in compliance with the License. 60ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam * You may obtain a copy of the License at 70ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam * 80ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam * http://www.apache.org/licenses/LICENSE-2.0 90ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam * 100ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam * Unless required by applicable law or agreed to in writing, software 110ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam * distributed under the License is distributed on an "AS IS" BASIS, 120ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 130ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam * See the License for the specific language governing permissions and 140ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam * limitations under the License. 150ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam */ 160ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam 170ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lampackage com.android.setupwizardlib.template; 180ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam 190ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lamimport android.support.annotation.NonNull; 200ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lamimport android.support.annotation.Nullable; 210ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lamimport android.util.Log; 220ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lamimport android.widget.ScrollView; 230ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam 240ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lamimport com.android.setupwizardlib.template.RequireScrollMixin.ScrollHandlingDelegate; 250ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lamimport com.android.setupwizardlib.view.BottomScrollView; 260ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lamimport com.android.setupwizardlib.view.BottomScrollView.BottomScrollListener; 270ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam 280ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam/** 290ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam * {@link ScrollHandlingDelegate} which analyzes scroll events from {@link BottomScrollView} and 300ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam * notifies {@link RequireScrollMixin} about scrollability changes. 310ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam */ 320ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lampublic class ScrollViewScrollHandlingDelegate 330ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam implements ScrollHandlingDelegate, BottomScrollListener { 340ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam 350ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam private static final String TAG = "ScrollViewDelegate"; 360ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam 370ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam @NonNull 380ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam private final RequireScrollMixin mRequireScrollMixin; 390ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam 400ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam @Nullable 410ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam private final BottomScrollView mScrollView; 420ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam 430ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam public ScrollViewScrollHandlingDelegate( 440ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam @NonNull RequireScrollMixin requireScrollMixin, 450ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam @Nullable ScrollView scrollView) { 460ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam mRequireScrollMixin = requireScrollMixin; 470ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam if (scrollView instanceof BottomScrollView) { 480ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam mScrollView = (BottomScrollView) scrollView; 490ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam } else { 500ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam Log.w(TAG, "Cannot set non-BottomScrollView. Found=" + scrollView); 510ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam mScrollView = null; 520ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam } 530ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam } 540ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam 550ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam @Override 560ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam public void onScrolledToBottom() { 570ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam mRequireScrollMixin.notifyScrollabilityChange(false); 580ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam } 590ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam 600ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam @Override 610ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam public void onRequiresScroll() { 620ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam mRequireScrollMixin.notifyScrollabilityChange(true); 630ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam } 640ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam 650ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam @Override 660ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam public void startListening() { 670ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam if (mScrollView != null) { 680ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam mScrollView.setBottomScrollListener(this); 690ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam } else { 700ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam Log.w(TAG, "Cannot require scroll. Scroll view is null."); 710ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam } 720ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam } 730ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam 740ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam @Override 750ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam public void pageScrollDown() { 760ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam if (mScrollView != null) { 770ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam mScrollView.pageScroll(ScrollView.FOCUS_DOWN); 780ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam } 790ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam } 800ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam} 81