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