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 com.android.gallery3d.R;
20f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.common.Utils;
21f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.data.Path;
22f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
23f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport android.content.Context;
24f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
25f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linpublic class ManageCacheDrawer extends IconDrawer {
26f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private final ResourceTexture mCheckedItem;
27f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private final ResourceTexture mUnCheckedItem;
28f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private final SelectionManager mSelectionManager;
29f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
30f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private final ResourceTexture mLocalAlbumIcon;
31bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang    private final StringTexture mCachingText;
32f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
33fafa06467fd79a1cf525b861ae0372db0b85bf09Chih-Chung Chang    private final int mCachePinSize;
34fafa06467fd79a1cf525b861ae0372db0b85bf09Chih-Chung Chang    private final int mCachePinMargin;
35fafa06467fd79a1cf525b861ae0372db0b85bf09Chih-Chung Chang
36fafa06467fd79a1cf525b861ae0372db0b85bf09Chih-Chung Chang    public ManageCacheDrawer(Context context, SelectionManager selectionManager,
37fafa06467fd79a1cf525b861ae0372db0b85bf09Chih-Chung Chang            int cachePinSize, int cachePinMargin) {
38f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        super(context);
39f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mCheckedItem = new ResourceTexture(context, R.drawable.btn_make_offline_normal_on_holo_dark);
40f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mUnCheckedItem = new ResourceTexture(context, R.drawable.btn_make_offline_normal_off_holo_dark);
41f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mLocalAlbumIcon = new ResourceTexture(context, R.drawable.btn_make_offline_disabled_on_holo_dark);
42f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        String cachingLabel = context.getString(R.string.caching_label);
43bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang        mCachingText = StringTexture.newInstance(cachingLabel, 12, 0xffffffff);
44f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mSelectionManager = selectionManager;
45fafa06467fd79a1cf525b861ae0372db0b85bf09Chih-Chung Chang        mCachePinSize = cachePinSize;
46fafa06467fd79a1cf525b861ae0372db0b85bf09Chih-Chung Chang        mCachePinMargin = cachePinMargin;
47f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
48f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
49f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
50f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public void prepareDrawing() {
51f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
52f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
53f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private static boolean isLocal(int dataSourceType) {
54f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        return dataSourceType != DATASOURCE_TYPE_PICASA;
55f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
56f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
57f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
58bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang    public void draw(GLCanvas canvas, Texture content, int width,
59da071d27a1435cce080b5c609d0d833555e5a175Chih-Chung Chang            int height, int rotation, Path path,
60bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang            int dataSourceType, int mediaType, boolean isPanorama,
61bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang            int labelBackgroundHeight, boolean wantCache, boolean isCaching) {
62f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
6347c476d3102e15ec4c8307d424adf6c54982d5f3Chih-Chung Chang        boolean selected = mSelectionManager.isItemSelected(path);
6447c476d3102e15ec4c8307d424adf6c54982d5f3Chih-Chung Chang        boolean chooseToCache = wantCache ^ selected;
6547c476d3102e15ec4c8307d424adf6c54982d5f3Chih-Chung Chang        boolean available = isLocal(dataSourceType) || chooseToCache;
6647c476d3102e15ec4c8307d424adf6c54982d5f3Chih-Chung Chang
67f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        int x = -width / 2;
68f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        int y = -height / 2;
69f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
7047c476d3102e15ec4c8307d424adf6c54982d5f3Chih-Chung Chang        if (!available) {
7147c476d3102e15ec4c8307d424adf6c54982d5f3Chih-Chung Chang            canvas.save(GLCanvas.SAVE_FLAG_ALPHA);
7247c476d3102e15ec4c8307d424adf6c54982d5f3Chih-Chung Chang            canvas.multiplyAlpha(0.6f);
7347c476d3102e15ec4c8307d424adf6c54982d5f3Chih-Chung Chang        }
7447c476d3102e15ec4c8307d424adf6c54982d5f3Chih-Chung Chang
75da071d27a1435cce080b5c609d0d833555e5a175Chih-Chung Chang        drawWithRotation(canvas, content, x, y, width, height, rotation);
76f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
7747c476d3102e15ec4c8307d424adf6c54982d5f3Chih-Chung Chang        if (!available) {
7847c476d3102e15ec4c8307d424adf6c54982d5f3Chih-Chung Chang            canvas.restore();
7947c476d3102e15ec4c8307d424adf6c54982d5f3Chih-Chung Chang        }
8047c476d3102e15ec4c8307d424adf6c54982d5f3Chih-Chung Chang
81f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (((rotation / 90) & 0x01) == 1) {
82f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            int temp = width;
83f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            width = height;
84f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            height = temp;
85f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            x = -width / 2;
86f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            y = -height / 2;
87f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
88f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
89da071d27a1435cce080b5c609d0d833555e5a175Chih-Chung Chang        drawMediaTypeOverlay(canvas, mediaType, isPanorama, x, y, width, height);
90da071d27a1435cce080b5c609d0d833555e5a175Chih-Chung Chang        drawLabelBackground(canvas, width, height, labelBackgroundHeight);
91da071d27a1435cce080b5c609d0d833555e5a175Chih-Chung Chang        drawIcon(canvas, width, height, dataSourceType);
9247c476d3102e15ec4c8307d424adf6c54982d5f3Chih-Chung Chang        drawCachingPin(canvas, path, dataSourceType, isCaching, chooseToCache,
93da071d27a1435cce080b5c609d0d833555e5a175Chih-Chung Chang                width, height);
94bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang
95bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang        if (mSelectionManager.isPressedPath(path)) {
96bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang            drawPressedFrame(canvas, x, y, width, height);
97bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang        }
98bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang    }
99bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang
100fafa06467fd79a1cf525b861ae0372db0b85bf09Chih-Chung Chang    private void drawCachingPin(GLCanvas canvas, Path path, int dataSourceType,
10147c476d3102e15ec4c8307d424adf6c54982d5f3Chih-Chung Chang            boolean isCaching, boolean chooseToCache, int width, int height) {
102bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang
103bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang        ResourceTexture icon = null;
104bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang        if (isLocal(dataSourceType)) {
105bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang            icon = mLocalAlbumIcon;
106bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang        } else if (chooseToCache) {
107bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang            icon = mCheckedItem;
108bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang        } else {
109bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang            icon = mUnCheckedItem;
110bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang        }
111f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
112fafa06467fd79a1cf525b861ae0372db0b85bf09Chih-Chung Chang        int w = mCachePinSize;
113fafa06467fd79a1cf525b861ae0372db0b85bf09Chih-Chung Chang        int h = mCachePinSize;
114bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang        int right = (width + 1) / 2;
115bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang        int bottom = (height + 1) / 2;
116fafa06467fd79a1cf525b861ae0372db0b85bf09Chih-Chung Chang        int x = right - w - mCachePinMargin;
117fafa06467fd79a1cf525b861ae0372db0b85bf09Chih-Chung Chang        int y = bottom - h - mCachePinMargin;
118bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang
119bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang        icon.draw(canvas, x, y, w, h);
120bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang
121bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang        if (isCaching) {
122bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang            int textWidth = mCachingText.getWidth();
123bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang            int textHeight = mCachingText.getHeight();
124fafa06467fd79a1cf525b861ae0372db0b85bf09Chih-Chung Chang            // Align the center of the text to the center of the pin icon
125fafa06467fd79a1cf525b861ae0372db0b85bf09Chih-Chung Chang            x = right - mCachePinMargin - (textWidth + mCachePinSize) / 2;
126bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang            y = bottom - textHeight;
127bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang            mCachingText.draw(canvas, x, y);
128f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
129f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
130f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
131f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
132f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public void drawFocus(GLCanvas canvas, int width, int height) {
133f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
134f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin}
135