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