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