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