1c7485ae06c6d5d33c57a03d02bbeed54edb3c66fMichael Kolb 2c7485ae06c6d5d33c57a03d02bbeed54edb3c66fMichael Kolb/* 3c7485ae06c6d5d33c57a03d02bbeed54edb3c66fMichael Kolb * Copyright (C) 2010 The Android Open Source Project 4c7485ae06c6d5d33c57a03d02bbeed54edb3c66fMichael Kolb * 5c7485ae06c6d5d33c57a03d02bbeed54edb3c66fMichael Kolb * Licensed under the Apache License, Version 2.0 (the "License"); 6c7485ae06c6d5d33c57a03d02bbeed54edb3c66fMichael Kolb * you may not use this file except in compliance with the License. 7c7485ae06c6d5d33c57a03d02bbeed54edb3c66fMichael Kolb * You may obtain a copy of the License at 8c7485ae06c6d5d33c57a03d02bbeed54edb3c66fMichael Kolb * 9c7485ae06c6d5d33c57a03d02bbeed54edb3c66fMichael Kolb * http://www.apache.org/licenses/LICENSE-2.0 10c7485ae06c6d5d33c57a03d02bbeed54edb3c66fMichael Kolb * 11c7485ae06c6d5d33c57a03d02bbeed54edb3c66fMichael Kolb * Unless required by applicable law or agreed to in writing, software 12c7485ae06c6d5d33c57a03d02bbeed54edb3c66fMichael Kolb * distributed under the License is distributed on an "AS IS" BASIS, 13c7485ae06c6d5d33c57a03d02bbeed54edb3c66fMichael Kolb * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14c7485ae06c6d5d33c57a03d02bbeed54edb3c66fMichael Kolb * See the License for the specific language governing permissions and 15c7485ae06c6d5d33c57a03d02bbeed54edb3c66fMichael Kolb * limitations under the License. 16c7485ae06c6d5d33c57a03d02bbeed54edb3c66fMichael Kolb */ 17c7485ae06c6d5d33c57a03d02bbeed54edb3c66fMichael Kolbpackage com.android.browser; 18c7485ae06c6d5d33c57a03d02bbeed54edb3c66fMichael Kolb 19c7485ae06c6d5d33c57a03d02bbeed54edb3c66fMichael Kolbimport android.content.Context; 20c7485ae06c6d5d33c57a03d02bbeed54edb3c66fMichael Kolbimport android.graphics.Canvas; 21c7485ae06c6d5d33c57a03d02bbeed54edb3c66fMichael Kolbimport android.graphics.Rect; 22c7485ae06c6d5d33c57a03d02bbeed54edb3c66fMichael Kolbimport android.graphics.drawable.Drawable; 23b7b115e301334f813275aa13e7a2cc27bf15fe6aMichael Kolbimport android.os.Handler; 24b7b115e301334f813275aa13e7a2cc27bf15fe6aMichael Kolbimport android.os.Message; 25c7485ae06c6d5d33c57a03d02bbeed54edb3c66fMichael Kolbimport android.util.AttributeSet; 26c7485ae06c6d5d33c57a03d02bbeed54edb3c66fMichael Kolbimport android.widget.ImageView; 27c7485ae06c6d5d33c57a03d02bbeed54edb3c66fMichael Kolb 28c7485ae06c6d5d33c57a03d02bbeed54edb3c66fMichael Kolb/** 29c7485ae06c6d5d33c57a03d02bbeed54edb3c66fMichael Kolb * 30c7485ae06c6d5d33c57a03d02bbeed54edb3c66fMichael Kolb */ 31c7485ae06c6d5d33c57a03d02bbeed54edb3c66fMichael Kolbpublic class PageProgressView extends ImageView { 32c7485ae06c6d5d33c57a03d02bbeed54edb3c66fMichael Kolb 33b7b115e301334f813275aa13e7a2cc27bf15fe6aMichael Kolb public static final int MAX_PROGRESS = 10000; 34b7b115e301334f813275aa13e7a2cc27bf15fe6aMichael Kolb private static final int MSG_UPDATE = 42; 35b7b115e301334f813275aa13e7a2cc27bf15fe6aMichael Kolb private static final int STEPS = 10; 36b7b115e301334f813275aa13e7a2cc27bf15fe6aMichael Kolb private static final int DELAY = 40; 37b7b115e301334f813275aa13e7a2cc27bf15fe6aMichael Kolb 38b7b115e301334f813275aa13e7a2cc27bf15fe6aMichael Kolb private int mCurrentProgress; 39b7b115e301334f813275aa13e7a2cc27bf15fe6aMichael Kolb private int mTargetProgress; 40b7b115e301334f813275aa13e7a2cc27bf15fe6aMichael Kolb private int mIncrement; 41c7485ae06c6d5d33c57a03d02bbeed54edb3c66fMichael Kolb private Rect mBounds; 42b7b115e301334f813275aa13e7a2cc27bf15fe6aMichael Kolb private Handler mHandler; 43c7485ae06c6d5d33c57a03d02bbeed54edb3c66fMichael Kolb 44c7485ae06c6d5d33c57a03d02bbeed54edb3c66fMichael Kolb /** 45c7485ae06c6d5d33c57a03d02bbeed54edb3c66fMichael Kolb * @param context 46c7485ae06c6d5d33c57a03d02bbeed54edb3c66fMichael Kolb * @param attrs 47c7485ae06c6d5d33c57a03d02bbeed54edb3c66fMichael Kolb * @param defStyle 48c7485ae06c6d5d33c57a03d02bbeed54edb3c66fMichael Kolb */ 49c7485ae06c6d5d33c57a03d02bbeed54edb3c66fMichael Kolb public PageProgressView(Context context, AttributeSet attrs, int defStyle) { 50c7485ae06c6d5d33c57a03d02bbeed54edb3c66fMichael Kolb super(context, attrs, defStyle); 51c7485ae06c6d5d33c57a03d02bbeed54edb3c66fMichael Kolb init(context); 52c7485ae06c6d5d33c57a03d02bbeed54edb3c66fMichael Kolb } 53c7485ae06c6d5d33c57a03d02bbeed54edb3c66fMichael Kolb 54c7485ae06c6d5d33c57a03d02bbeed54edb3c66fMichael Kolb /** 55c7485ae06c6d5d33c57a03d02bbeed54edb3c66fMichael Kolb * @param context 56c7485ae06c6d5d33c57a03d02bbeed54edb3c66fMichael Kolb * @param attrs 57c7485ae06c6d5d33c57a03d02bbeed54edb3c66fMichael Kolb */ 58c7485ae06c6d5d33c57a03d02bbeed54edb3c66fMichael Kolb public PageProgressView(Context context, AttributeSet attrs) { 59c7485ae06c6d5d33c57a03d02bbeed54edb3c66fMichael Kolb super(context, attrs); 60c7485ae06c6d5d33c57a03d02bbeed54edb3c66fMichael Kolb init(context); 61c7485ae06c6d5d33c57a03d02bbeed54edb3c66fMichael Kolb } 62c7485ae06c6d5d33c57a03d02bbeed54edb3c66fMichael Kolb 63c7485ae06c6d5d33c57a03d02bbeed54edb3c66fMichael Kolb /** 64c7485ae06c6d5d33c57a03d02bbeed54edb3c66fMichael Kolb * @param context 65c7485ae06c6d5d33c57a03d02bbeed54edb3c66fMichael Kolb */ 66c7485ae06c6d5d33c57a03d02bbeed54edb3c66fMichael Kolb public PageProgressView(Context context) { 67c7485ae06c6d5d33c57a03d02bbeed54edb3c66fMichael Kolb super(context); 68c7485ae06c6d5d33c57a03d02bbeed54edb3c66fMichael Kolb init(context); 69c7485ae06c6d5d33c57a03d02bbeed54edb3c66fMichael Kolb } 70c7485ae06c6d5d33c57a03d02bbeed54edb3c66fMichael Kolb 71c7485ae06c6d5d33c57a03d02bbeed54edb3c66fMichael Kolb private void init(Context ctx) { 72c7485ae06c6d5d33c57a03d02bbeed54edb3c66fMichael Kolb mBounds = new Rect(0,0,0,0); 73b7b115e301334f813275aa13e7a2cc27bf15fe6aMichael Kolb mCurrentProgress = 0; 74b7b115e301334f813275aa13e7a2cc27bf15fe6aMichael Kolb mTargetProgress = 0; 75b7b115e301334f813275aa13e7a2cc27bf15fe6aMichael Kolb mHandler = new Handler() { 76b7b115e301334f813275aa13e7a2cc27bf15fe6aMichael Kolb 77b7b115e301334f813275aa13e7a2cc27bf15fe6aMichael Kolb @Override 78b7b115e301334f813275aa13e7a2cc27bf15fe6aMichael Kolb public void handleMessage(Message msg) { 79b7b115e301334f813275aa13e7a2cc27bf15fe6aMichael Kolb if (msg.what == MSG_UPDATE) { 80b7b115e301334f813275aa13e7a2cc27bf15fe6aMichael Kolb mCurrentProgress = Math.min(mTargetProgress, 81b7b115e301334f813275aa13e7a2cc27bf15fe6aMichael Kolb mCurrentProgress + mIncrement); 82b7b115e301334f813275aa13e7a2cc27bf15fe6aMichael Kolb mBounds.right = getWidth() * mCurrentProgress / MAX_PROGRESS; 83b7b115e301334f813275aa13e7a2cc27bf15fe6aMichael Kolb invalidate(); 84b7b115e301334f813275aa13e7a2cc27bf15fe6aMichael Kolb if (mCurrentProgress < mTargetProgress) { 85b7b115e301334f813275aa13e7a2cc27bf15fe6aMichael Kolb sendMessageDelayed(mHandler.obtainMessage(MSG_UPDATE), DELAY); 86b7b115e301334f813275aa13e7a2cc27bf15fe6aMichael Kolb } 87b7b115e301334f813275aa13e7a2cc27bf15fe6aMichael Kolb } 88b7b115e301334f813275aa13e7a2cc27bf15fe6aMichael Kolb } 89b7b115e301334f813275aa13e7a2cc27bf15fe6aMichael Kolb 90b7b115e301334f813275aa13e7a2cc27bf15fe6aMichael Kolb }; 91c7485ae06c6d5d33c57a03d02bbeed54edb3c66fMichael Kolb } 92c7485ae06c6d5d33c57a03d02bbeed54edb3c66fMichael Kolb 93c7485ae06c6d5d33c57a03d02bbeed54edb3c66fMichael Kolb @Override 94c7485ae06c6d5d33c57a03d02bbeed54edb3c66fMichael Kolb public void onLayout(boolean f, int l, int t, int r, int b) { 95c7485ae06c6d5d33c57a03d02bbeed54edb3c66fMichael Kolb mBounds.left = 0; 96b7b115e301334f813275aa13e7a2cc27bf15fe6aMichael Kolb mBounds.right = (r - l) * mCurrentProgress / MAX_PROGRESS; 97c7485ae06c6d5d33c57a03d02bbeed54edb3c66fMichael Kolb mBounds.top = 0; 98c7485ae06c6d5d33c57a03d02bbeed54edb3c66fMichael Kolb mBounds.bottom = b-t; 99c7485ae06c6d5d33c57a03d02bbeed54edb3c66fMichael Kolb } 100c7485ae06c6d5d33c57a03d02bbeed54edb3c66fMichael Kolb 101c7485ae06c6d5d33c57a03d02bbeed54edb3c66fMichael Kolb void setProgress(int progress) { 102b7b115e301334f813275aa13e7a2cc27bf15fe6aMichael Kolb mCurrentProgress = mTargetProgress; 103b7b115e301334f813275aa13e7a2cc27bf15fe6aMichael Kolb mTargetProgress = progress; 104b7b115e301334f813275aa13e7a2cc27bf15fe6aMichael Kolb mIncrement = (mTargetProgress - mCurrentProgress) / STEPS; 105b7b115e301334f813275aa13e7a2cc27bf15fe6aMichael Kolb mHandler.removeMessages(MSG_UPDATE); 106b7b115e301334f813275aa13e7a2cc27bf15fe6aMichael Kolb mHandler.sendEmptyMessage(MSG_UPDATE); 107c7485ae06c6d5d33c57a03d02bbeed54edb3c66fMichael Kolb } 108c7485ae06c6d5d33c57a03d02bbeed54edb3c66fMichael Kolb 109c7485ae06c6d5d33c57a03d02bbeed54edb3c66fMichael Kolb @Override 110c7485ae06c6d5d33c57a03d02bbeed54edb3c66fMichael Kolb public void onDraw(Canvas canvas) { 111c7485ae06c6d5d33c57a03d02bbeed54edb3c66fMichael Kolb// super.onDraw(canvas); 112c7485ae06c6d5d33c57a03d02bbeed54edb3c66fMichael Kolb Drawable d = getDrawable(); 113c7485ae06c6d5d33c57a03d02bbeed54edb3c66fMichael Kolb d.setBounds(mBounds); 114c7485ae06c6d5d33c57a03d02bbeed54edb3c66fMichael Kolb d.draw(canvas); 115c7485ae06c6d5d33c57a03d02bbeed54edb3c66fMichael Kolb } 116c7485ae06c6d5d33c57a03d02bbeed54edb3c66fMichael Kolb 117c7485ae06c6d5d33c57a03d02bbeed54edb3c66fMichael Kolb} 118