161f26c2d1c1d3735cf883b58fe7e45550bb1a54cAndy Huang/* 261f26c2d1c1d3735cf883b58fe7e45550bb1a54cAndy Huang * Copyright (C) 2014 Google Inc. 361f26c2d1c1d3735cf883b58fe7e45550bb1a54cAndy Huang * Licensed to The Android Open Source Project. 461f26c2d1c1d3735cf883b58fe7e45550bb1a54cAndy Huang * 561f26c2d1c1d3735cf883b58fe7e45550bb1a54cAndy Huang * Licensed under the Apache License, Version 2.0 (the "License"); 661f26c2d1c1d3735cf883b58fe7e45550bb1a54cAndy Huang * you may not use this file except in compliance with the License. 761f26c2d1c1d3735cf883b58fe7e45550bb1a54cAndy Huang * You may obtain a copy of the License at 861f26c2d1c1d3735cf883b58fe7e45550bb1a54cAndy Huang * 961f26c2d1c1d3735cf883b58fe7e45550bb1a54cAndy Huang * http://www.apache.org/licenses/LICENSE-2.0 1061f26c2d1c1d3735cf883b58fe7e45550bb1a54cAndy Huang * 1161f26c2d1c1d3735cf883b58fe7e45550bb1a54cAndy Huang * Unless required by applicable law or agreed to in writing, software 1261f26c2d1c1d3735cf883b58fe7e45550bb1a54cAndy Huang * distributed under the License is distributed on an "AS IS" BASIS, 1361f26c2d1c1d3735cf883b58fe7e45550bb1a54cAndy Huang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1461f26c2d1c1d3735cf883b58fe7e45550bb1a54cAndy Huang * See the License for the specific language governing permissions and 1561f26c2d1c1d3735cf883b58fe7e45550bb1a54cAndy Huang * limitations under the License. 1661f26c2d1c1d3735cf883b58fe7e45550bb1a54cAndy Huang */ 1761f26c2d1c1d3735cf883b58fe7e45550bb1a54cAndy Huang 1861f26c2d1c1d3735cf883b58fe7e45550bb1a54cAndy Huangpackage com.android.mail.ui; 1961f26c2d1c1d3735cf883b58fe7e45550bb1a54cAndy Huang 2061f26c2d1c1d3735cf883b58fe7e45550bb1a54cAndy Huangimport android.content.Context; 2161f26c2d1c1d3735cf883b58fe7e45550bb1a54cAndy Huangimport android.database.Observable; 2261f26c2d1c1d3735cf883b58fe7e45550bb1a54cAndy Huangimport android.util.AttributeSet; 2361f26c2d1c1d3735cf883b58fe7e45550bb1a54cAndy Huangimport android.widget.ListView; 2461f26c2d1c1d3735cf883b58fe7e45550bb1a54cAndy Huang 2561f26c2d1c1d3735cf883b58fe7e45550bb1a54cAndy Huangimport com.android.mail.browse.ScrollNotifier; 2661f26c2d1c1d3735cf883b58fe7e45550bb1a54cAndy Huang 2761f26c2d1c1d3735cf883b58fe7e45550bb1a54cAndy Huang/** 2861f26c2d1c1d3735cf883b58fe7e45550bb1a54cAndy Huang * Ordinary list view with extra boilerplate to notify on scrollbar-related events (unrelated to 2961f26c2d1c1d3735cf883b58fe7e45550bb1a54cAndy Huang * {@link android.widget.AbsListView.OnScrollListener}!) 3061f26c2d1c1d3735cf883b58fe7e45550bb1a54cAndy Huang */ 3161f26c2d1c1d3735cf883b58fe7e45550bb1a54cAndy Huangpublic class ScrollNotifyingListView extends ListView implements ScrollNotifier { 3261f26c2d1c1d3735cf883b58fe7e45550bb1a54cAndy Huang 3361f26c2d1c1d3735cf883b58fe7e45550bb1a54cAndy Huang private final ScrollObservable mObservable = new ScrollObservable(); 3461f26c2d1c1d3735cf883b58fe7e45550bb1a54cAndy Huang 3561f26c2d1c1d3735cf883b58fe7e45550bb1a54cAndy Huang public ScrollNotifyingListView(Context c) { 3661f26c2d1c1d3735cf883b58fe7e45550bb1a54cAndy Huang this(c, null); 3761f26c2d1c1d3735cf883b58fe7e45550bb1a54cAndy Huang } 3861f26c2d1c1d3735cf883b58fe7e45550bb1a54cAndy Huang 3961f26c2d1c1d3735cf883b58fe7e45550bb1a54cAndy Huang public ScrollNotifyingListView(Context c, AttributeSet attrs) { 4061f26c2d1c1d3735cf883b58fe7e45550bb1a54cAndy Huang super(c, attrs); 4161f26c2d1c1d3735cf883b58fe7e45550bb1a54cAndy Huang } 4261f26c2d1c1d3735cf883b58fe7e45550bb1a54cAndy Huang 4361f26c2d1c1d3735cf883b58fe7e45550bb1a54cAndy Huang @Override 4461f26c2d1c1d3735cf883b58fe7e45550bb1a54cAndy Huang public void addScrollListener(ScrollListener l) { 4561f26c2d1c1d3735cf883b58fe7e45550bb1a54cAndy Huang mObservable.registerObserver(l); 4661f26c2d1c1d3735cf883b58fe7e45550bb1a54cAndy Huang } 4761f26c2d1c1d3735cf883b58fe7e45550bb1a54cAndy Huang 4861f26c2d1c1d3735cf883b58fe7e45550bb1a54cAndy Huang @Override 4961f26c2d1c1d3735cf883b58fe7e45550bb1a54cAndy Huang public void removeScrollListener(ScrollListener l) { 5061f26c2d1c1d3735cf883b58fe7e45550bb1a54cAndy Huang mObservable.unregisterObserver(l); 5161f26c2d1c1d3735cf883b58fe7e45550bb1a54cAndy Huang } 5261f26c2d1c1d3735cf883b58fe7e45550bb1a54cAndy Huang 5361f26c2d1c1d3735cf883b58fe7e45550bb1a54cAndy Huang @Override 5461f26c2d1c1d3735cf883b58fe7e45550bb1a54cAndy Huang protected void onScrollChanged(int l, int t, int oldl, int oldt) { 5561f26c2d1c1d3735cf883b58fe7e45550bb1a54cAndy Huang super.onScrollChanged(l, t, oldl, oldt); 5661f26c2d1c1d3735cf883b58fe7e45550bb1a54cAndy Huang mObservable.onScrollChanged(l, t, oldl, oldt); 5761f26c2d1c1d3735cf883b58fe7e45550bb1a54cAndy Huang } 5861f26c2d1c1d3735cf883b58fe7e45550bb1a54cAndy Huang 5961f26c2d1c1d3735cf883b58fe7e45550bb1a54cAndy Huang @Override 6061f26c2d1c1d3735cf883b58fe7e45550bb1a54cAndy Huang public int computeVerticalScrollRange() { 6161f26c2d1c1d3735cf883b58fe7e45550bb1a54cAndy Huang return super.computeVerticalScrollRange(); 6261f26c2d1c1d3735cf883b58fe7e45550bb1a54cAndy Huang } 6361f26c2d1c1d3735cf883b58fe7e45550bb1a54cAndy Huang 6461f26c2d1c1d3735cf883b58fe7e45550bb1a54cAndy Huang @Override 6561f26c2d1c1d3735cf883b58fe7e45550bb1a54cAndy Huang public int computeVerticalScrollOffset() { 6661f26c2d1c1d3735cf883b58fe7e45550bb1a54cAndy Huang return super.computeVerticalScrollOffset(); 6761f26c2d1c1d3735cf883b58fe7e45550bb1a54cAndy Huang } 6861f26c2d1c1d3735cf883b58fe7e45550bb1a54cAndy Huang 6961f26c2d1c1d3735cf883b58fe7e45550bb1a54cAndy Huang @Override 7061f26c2d1c1d3735cf883b58fe7e45550bb1a54cAndy Huang public int computeVerticalScrollExtent() { 7161f26c2d1c1d3735cf883b58fe7e45550bb1a54cAndy Huang return super.computeVerticalScrollExtent(); 7261f26c2d1c1d3735cf883b58fe7e45550bb1a54cAndy Huang } 7361f26c2d1c1d3735cf883b58fe7e45550bb1a54cAndy Huang 7461f26c2d1c1d3735cf883b58fe7e45550bb1a54cAndy Huang @Override 7561f26c2d1c1d3735cf883b58fe7e45550bb1a54cAndy Huang public int computeHorizontalScrollRange() { 7661f26c2d1c1d3735cf883b58fe7e45550bb1a54cAndy Huang return super.computeHorizontalScrollRange(); 7761f26c2d1c1d3735cf883b58fe7e45550bb1a54cAndy Huang } 7861f26c2d1c1d3735cf883b58fe7e45550bb1a54cAndy Huang 7961f26c2d1c1d3735cf883b58fe7e45550bb1a54cAndy Huang @Override 8061f26c2d1c1d3735cf883b58fe7e45550bb1a54cAndy Huang public int computeHorizontalScrollOffset() { 8161f26c2d1c1d3735cf883b58fe7e45550bb1a54cAndy Huang return super.computeHorizontalScrollOffset(); 8261f26c2d1c1d3735cf883b58fe7e45550bb1a54cAndy Huang } 8361f26c2d1c1d3735cf883b58fe7e45550bb1a54cAndy Huang 8461f26c2d1c1d3735cf883b58fe7e45550bb1a54cAndy Huang @Override 8561f26c2d1c1d3735cf883b58fe7e45550bb1a54cAndy Huang public int computeHorizontalScrollExtent() { 8661f26c2d1c1d3735cf883b58fe7e45550bb1a54cAndy Huang return super.computeHorizontalScrollExtent(); 8761f26c2d1c1d3735cf883b58fe7e45550bb1a54cAndy Huang } 8861f26c2d1c1d3735cf883b58fe7e45550bb1a54cAndy Huang 8961f26c2d1c1d3735cf883b58fe7e45550bb1a54cAndy Huang private static class ScrollObservable extends Observable<ScrollListener> { 9061f26c2d1c1d3735cf883b58fe7e45550bb1a54cAndy Huang 9161f26c2d1c1d3735cf883b58fe7e45550bb1a54cAndy Huang @SuppressWarnings("unused") 9261f26c2d1c1d3735cf883b58fe7e45550bb1a54cAndy Huang public void onScrollChanged(int l, int t, int oldl, int oldt) { 9361f26c2d1c1d3735cf883b58fe7e45550bb1a54cAndy Huang for (ScrollListener sl : mObservers) { 9461f26c2d1c1d3735cf883b58fe7e45550bb1a54cAndy Huang sl.onNotifierScroll(t); 9561f26c2d1c1d3735cf883b58fe7e45550bb1a54cAndy Huang } 9661f26c2d1c1d3735cf883b58fe7e45550bb1a54cAndy Huang } 9761f26c2d1c1d3735cf883b58fe7e45550bb1a54cAndy Huang 9861f26c2d1c1d3735cf883b58fe7e45550bb1a54cAndy Huang } 9961f26c2d1c1d3735cf883b58fe7e45550bb1a54cAndy Huang 10061f26c2d1c1d3735cf883b58fe7e45550bb1a54cAndy Huang} 101