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.AbsListView;
230ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lamimport android.widget.ListAdapter;
240ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lamimport android.widget.ListView;
250ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam
260ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lamimport com.android.setupwizardlib.template.RequireScrollMixin.ScrollHandlingDelegate;
270ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam
280ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam/**
290ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam * {@link ScrollHandlingDelegate} which analyzes scroll events from {@link ListView} and
300ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam * notifies {@link RequireScrollMixin} about scrollability changes.
310ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam */
320ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lampublic class ListViewScrollHandlingDelegate implements ScrollHandlingDelegate,
330ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam        AbsListView.OnScrollListener {
340ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam
350ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam    private static final String TAG = "ListViewDelegate";
360ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam
370ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam    private static final int SCROLL_DURATION = 500;
380ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam
390ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam    @NonNull
400ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam    private final RequireScrollMixin mRequireScrollMixin;
410ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam
420ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam    @Nullable
430ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam    private final ListView mListView;
440ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam
450ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam    public ListViewScrollHandlingDelegate(
460ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam            @NonNull RequireScrollMixin requireScrollMixin,
470ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam            @Nullable ListView listView) {
480ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam        mRequireScrollMixin = requireScrollMixin;
490ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam        mListView = listView;
500ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam    }
510ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam
520ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam    @Override
530ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam    public void startListening() {
540ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam        if (mListView != null) {
550ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam            mListView.setOnScrollListener(this);
560ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam
570ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam            final ListAdapter adapter = mListView.getAdapter();
580ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam            if (mListView.getLastVisiblePosition() < adapter.getCount()) {
590ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam                mRequireScrollMixin.notifyScrollabilityChange(true);
600ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam            }
610ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam        } else {
620ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam            Log.w(TAG, "Cannot require scroll. List view is null");
630ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam        }
640ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam    }
650ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam
660ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam    @Override
670ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam    public void pageScrollDown() {
680ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam        if (mListView != null) {
690ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam            final int height = mListView.getHeight();
700ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam            mListView.smoothScrollBy(height, SCROLL_DURATION);
710ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam        }
720ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam    }
730ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam
740ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam    @Override
750ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam    public void onScrollStateChanged(AbsListView view, int scrollState) {
760ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam    }
770ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam
780ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam    @Override
790ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam    public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount,
800ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam            int totalItemCount) {
810ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam        if (firstVisibleItem + visibleItemCount >= totalItemCount) {
820ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam            mRequireScrollMixin.notifyScrollabilityChange(false);
830ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam        } else {
840ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam            mRequireScrollMixin.notifyScrollabilityChange(true);
850ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam        }
860ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam    }
870ceb8d53e39ebb5bc103863787afb39ec5c41ad8Maurice Lam}
88