1f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin/*
2f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * Copyright (C) 2010 The Android Open Source Project
3f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin *
4f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * Licensed under the Apache License, Version 2.0 (the "License");
5f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * you may not use this file except in compliance with the License.
6f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * You may obtain a copy of the License at
7f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin *
8f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin *      http://www.apache.org/licenses/LICENSE-2.0
9f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin *
10f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * Unless required by applicable law or agreed to in writing, software
11f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * distributed under the License is distributed on an "AS IS" BASIS,
12f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * See the License for the specific language governing permissions and
14f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * limitations under the License.
15f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin */
16f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
17f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linpackage com.android.gallery3d.ui;
18f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
19f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport android.content.Context;
20f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
212b3ee0ea07246b859a5b75d8a6102a7cce7ec838Owen Linimport com.android.gallery3d.R;
222b3ee0ea07246b859a5b75d8a6102a7cce7ec838Owen Lin
23f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linpublic class ProgressSpinner {
24f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private static float ROTATE_SPEED_OUTER = 1080f / 3500f;
25f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private static float ROTATE_SPEED_INNER = -720f / 3500f;
26f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private final ResourceTexture mOuter;
27f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private final ResourceTexture mInner;
28f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private final int mWidth;
29f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private final int mHeight;
30f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
31f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private float mInnerDegree = 0f;
32f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private float mOuterDegree = 0f;
33f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private long mAnimationTimestamp = -1;
34f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
35f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public ProgressSpinner(Context context) {
36f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mOuter = new ResourceTexture(context, R.drawable.spinner_76_outer_holo);
37f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mInner = new ResourceTexture(context, R.drawable.spinner_76_inner_holo);
38f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
39f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mWidth = Math.max(mOuter.getWidth(), mInner.getWidth());
40f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mHeight = Math.max(mOuter.getHeight(), mInner.getHeight());
41f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
42f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
43f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public int getWidth() {
44f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        return mWidth;
45f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
46f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
47f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public int getHeight() {
48f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        return mHeight;
49f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
50f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
51f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public void startAnimation() {
52f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mAnimationTimestamp = -1;
53f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mOuterDegree = 0;
54f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mInnerDegree = 0;
55f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
56f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
57f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public void draw(GLCanvas canvas, int x, int y) {
587d19f7f4281f232b9dceee4a5df390c03e2bd16bChih-Chung Chang        long now = AnimationTime.get();
59f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (mAnimationTimestamp == -1) mAnimationTimestamp = now;
60f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mOuterDegree += (now - mAnimationTimestamp) * ROTATE_SPEED_OUTER;
61f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mInnerDegree += (now - mAnimationTimestamp) * ROTATE_SPEED_INNER;
62f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
63f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mAnimationTimestamp = now;
64f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
65f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        // just preventing overflow
66f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (mOuterDegree > 360) mOuterDegree -= 360f;
67f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (mInnerDegree < 0) mInnerDegree += 360f;
68f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
69f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        canvas.save(GLCanvas.SAVE_FLAG_MATRIX);
70f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
71174cac8f92029fc2829c94f274e70793ae948931Chih-Chung Chang        canvas.translate(x + mWidth / 2, y + mHeight / 2);
72f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        canvas.rotate(mInnerDegree, 0, 0, 1);
73f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mOuter.draw(canvas, -mOuter.getWidth() / 2, -mOuter.getHeight() / 2);
74f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        canvas.rotate(mOuterDegree - mInnerDegree, 0, 0, 1);
75f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mInner.draw(canvas, -mInner.getWidth() / 2, -mInner.getHeight() / 2);
76f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        canvas.restore();
77f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
78f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin}
79