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