18ec226e8c778a3d1b4268edc33cd7c515d88ab31Dianne Hackborn/*
28ec226e8c778a3d1b4268edc33cd7c515d88ab31Dianne Hackborn**
38ec226e8c778a3d1b4268edc33cd7c515d88ab31Dianne Hackborn** Copyright 2012, The Android Open Source Project
48ec226e8c778a3d1b4268edc33cd7c515d88ab31Dianne Hackborn**
58ec226e8c778a3d1b4268edc33cd7c515d88ab31Dianne Hackborn** Licensed under the Apache License, Version 2.0 (the "License");
68ec226e8c778a3d1b4268edc33cd7c515d88ab31Dianne Hackborn** you may not use this file except in compliance with the License.
78ec226e8c778a3d1b4268edc33cd7c515d88ab31Dianne Hackborn** You may obtain a copy of the License at
88ec226e8c778a3d1b4268edc33cd7c515d88ab31Dianne Hackborn**
98ec226e8c778a3d1b4268edc33cd7c515d88ab31Dianne Hackborn**     http://www.apache.org/licenses/LICENSE-2.0
108ec226e8c778a3d1b4268edc33cd7c515d88ab31Dianne Hackborn**
118ec226e8c778a3d1b4268edc33cd7c515d88ab31Dianne Hackborn** Unless required by applicable law or agreed to in writing, software
128ec226e8c778a3d1b4268edc33cd7c515d88ab31Dianne Hackborn** distributed under the License is distributed on an "AS IS" BASIS,
138ec226e8c778a3d1b4268edc33cd7c515d88ab31Dianne Hackborn** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
148ec226e8c778a3d1b4268edc33cd7c515d88ab31Dianne Hackborn** See the License for the specific language governing permissions and
158ec226e8c778a3d1b4268edc33cd7c515d88ab31Dianne Hackborn** limitations under the License.
168ec226e8c778a3d1b4268edc33cd7c515d88ab31Dianne Hackborn*/
178ec226e8c778a3d1b4268edc33cd7c515d88ab31Dianne Hackborn
188ec226e8c778a3d1b4268edc33cd7c515d88ab31Dianne Hackbornpackage com.android.packageinstaller;
198ec226e8c778a3d1b4268edc33cd7c515d88ab31Dianne Hackborn
208ec226e8c778a3d1b4268edc33cd7c515d88ab31Dianne Hackbornimport android.content.Context;
218ec226e8c778a3d1b4268edc33cd7c515d88ab31Dianne Hackbornimport android.graphics.Canvas;
228ec226e8c778a3d1b4268edc33cd7c515d88ab31Dianne Hackbornimport android.util.AttributeSet;
238ec226e8c778a3d1b4268edc33cd7c515d88ab31Dianne Hackbornimport android.widget.ScrollView;
248ec226e8c778a3d1b4268edc33cd7c515d88ab31Dianne Hackborn
258ec226e8c778a3d1b4268edc33cd7c515d88ab31Dianne Hackborn/**
268ec226e8c778a3d1b4268edc33cd7c515d88ab31Dianne Hackborn * It's a ScrollView that knows how to stay awake.
278ec226e8c778a3d1b4268edc33cd7c515d88ab31Dianne Hackborn */
288ec226e8c778a3d1b4268edc33cd7c515d88ab31Dianne Hackbornclass CaffeinatedScrollView extends ScrollView {
298ec226e8c778a3d1b4268edc33cd7c515d88ab31Dianne Hackborn    private Runnable mFullScrollAction;
308ec226e8c778a3d1b4268edc33cd7c515d88ab31Dianne Hackborn    private int mBottomSlop;
318ec226e8c778a3d1b4268edc33cd7c515d88ab31Dianne Hackborn
328ec226e8c778a3d1b4268edc33cd7c515d88ab31Dianne Hackborn    public CaffeinatedScrollView(Context context) {
338ec226e8c778a3d1b4268edc33cd7c515d88ab31Dianne Hackborn        super(context);
348ec226e8c778a3d1b4268edc33cd7c515d88ab31Dianne Hackborn    }
358ec226e8c778a3d1b4268edc33cd7c515d88ab31Dianne Hackborn
368ec226e8c778a3d1b4268edc33cd7c515d88ab31Dianne Hackborn    public CaffeinatedScrollView(Context context, AttributeSet attrs) {
378ec226e8c778a3d1b4268edc33cd7c515d88ab31Dianne Hackborn        super(context, attrs);
388ec226e8c778a3d1b4268edc33cd7c515d88ab31Dianne Hackborn    }
398ec226e8c778a3d1b4268edc33cd7c515d88ab31Dianne Hackborn
408ec226e8c778a3d1b4268edc33cd7c515d88ab31Dianne Hackborn    /**
418ec226e8c778a3d1b4268edc33cd7c515d88ab31Dianne Hackborn     * Make this visible so we can call it
428ec226e8c778a3d1b4268edc33cd7c515d88ab31Dianne Hackborn     */
438ec226e8c778a3d1b4268edc33cd7c515d88ab31Dianne Hackborn    @Override
448ec226e8c778a3d1b4268edc33cd7c515d88ab31Dianne Hackborn    public boolean awakenScrollBars() {
458ec226e8c778a3d1b4268edc33cd7c515d88ab31Dianne Hackborn        return super.awakenScrollBars();
468ec226e8c778a3d1b4268edc33cd7c515d88ab31Dianne Hackborn    }
478ec226e8c778a3d1b4268edc33cd7c515d88ab31Dianne Hackborn
488ec226e8c778a3d1b4268edc33cd7c515d88ab31Dianne Hackborn    public void setFullScrollAction(Runnable action) {
498ec226e8c778a3d1b4268edc33cd7c515d88ab31Dianne Hackborn        mFullScrollAction = action;
508ec226e8c778a3d1b4268edc33cd7c515d88ab31Dianne Hackborn        mBottomSlop = (int)(4 * getResources().getDisplayMetrics().density);
518ec226e8c778a3d1b4268edc33cd7c515d88ab31Dianne Hackborn    }
528ec226e8c778a3d1b4268edc33cd7c515d88ab31Dianne Hackborn
538ec226e8c778a3d1b4268edc33cd7c515d88ab31Dianne Hackborn    @Override
548ec226e8c778a3d1b4268edc33cd7c515d88ab31Dianne Hackborn    protected void onDraw(Canvas canvas) {
558ec226e8c778a3d1b4268edc33cd7c515d88ab31Dianne Hackborn        super.onDraw(canvas);
568ec226e8c778a3d1b4268edc33cd7c515d88ab31Dianne Hackborn        checkFullScrollAction();
578ec226e8c778a3d1b4268edc33cd7c515d88ab31Dianne Hackborn    }
588ec226e8c778a3d1b4268edc33cd7c515d88ab31Dianne Hackborn
598ec226e8c778a3d1b4268edc33cd7c515d88ab31Dianne Hackborn    @Override
608ec226e8c778a3d1b4268edc33cd7c515d88ab31Dianne Hackborn    protected void onScrollChanged(int l, int t, int oldl, int oldt) {
618ec226e8c778a3d1b4268edc33cd7c515d88ab31Dianne Hackborn        super.onScrollChanged(l, t, oldl, oldt);
628ec226e8c778a3d1b4268edc33cd7c515d88ab31Dianne Hackborn        checkFullScrollAction();
638ec226e8c778a3d1b4268edc33cd7c515d88ab31Dianne Hackborn    }
648ec226e8c778a3d1b4268edc33cd7c515d88ab31Dianne Hackborn
658ec226e8c778a3d1b4268edc33cd7c515d88ab31Dianne Hackborn    private void checkFullScrollAction() {
668ec226e8c778a3d1b4268edc33cd7c515d88ab31Dianne Hackborn        if (mFullScrollAction != null) {
678ec226e8c778a3d1b4268edc33cd7c515d88ab31Dianne Hackborn            int daBottom = getChildAt(0).getBottom();
688ec226e8c778a3d1b4268edc33cd7c515d88ab31Dianne Hackborn            int screenBottom = getScrollY() + getHeight() - getPaddingBottom();
698ec226e8c778a3d1b4268edc33cd7c515d88ab31Dianne Hackborn            if ((daBottom - screenBottom) < mBottomSlop) {
708ec226e8c778a3d1b4268edc33cd7c515d88ab31Dianne Hackborn                mFullScrollAction.run();
718ec226e8c778a3d1b4268edc33cd7c515d88ab31Dianne Hackborn                mFullScrollAction = null;
728ec226e8c778a3d1b4268edc33cd7c515d88ab31Dianne Hackborn            }
738ec226e8c778a3d1b4268edc33cd7c515d88ab31Dianne Hackborn        }
748ec226e8c778a3d1b4268edc33cd7c515d88ab31Dianne Hackborn    }
758ec226e8c778a3d1b4268edc33cd7c515d88ab31Dianne Hackborn}
76