summaryrefslogtreecommitdiffstats
path: root/src/org/codeaurora/gallery3d/video/ScreenModeManager.java
blob: a1c04c69f86460d50ba190ffbd1b1bd535149886 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
package org.codeaurora.gallery3d.video;

import android.util.Log;

import java.util.ArrayList;

public class ScreenModeManager {
    private static final String TAG = "ScreenModeManager";
    private static final boolean LOG = false;
    //support screen mode.
    public static final int SCREENMODE_BIGSCREEN = 1;
    public static final int SCREENMODE_FULLSCREEN = 2;
    public static final int SCREENMODE_CROPSCREEN = 4;
    public static final int SCREENMODE_ALL = 7;
    
    private int mScreenMode = SCREENMODE_BIGSCREEN;
    private int mScreenModes = SCREENMODE_ALL;
    
    /**
     * Enable specified screen mode list. 
     * The screen mode's value determines the order of being shown. 
     * <br>you can enable three screen modes by setting screenModes = 
     * {@link #SCREENMODE_BIGSCREEN} | 
     * {@link #SCREENMODE_FULLSCREEN} |
     * {@link #SCREENMODE_CROPSCREEN} or 
     * just enable two screen modes by setting screenModes = 
     * {@link #SCREENMODE_BIGSCREEN} | 
     * {@link #SCREENMODE_CROPSCREEN}.
     * <br>If current screen mode is the last one of the ordered list, 
     * then the next screen mode will be the first one of the ordered list.
     * @param screenModes enabled screen mode list.
     */
    public void setScreenModes(final int screenModes) {
        mScreenModes = (SCREENMODE_BIGSCREEN & screenModes)
            | (SCREENMODE_FULLSCREEN & screenModes)
            | (SCREENMODE_CROPSCREEN & screenModes);
        if ((screenModes & SCREENMODE_ALL) == 0) {
            mScreenModes = SCREENMODE_ALL;
            Log.w(TAG, "wrong screenModes=" + screenModes + ". use default value " + SCREENMODE_ALL);
        }
        if (LOG) {
            Log.v(TAG, "enableScreenMode(" + screenModes + ") mScreenModes=" + mScreenModes);
        }
    }
    
    /**
     * Get the all screen modes of media controller.
     * <br><b>Note:</b> it is not the video's current screen mode.
     * @return the current screen modes.
     */
    public int getScreenModes() {
        return mScreenModes;
    }
    
    public void setScreenMode(final int curScreenMode) {
        if (LOG) {
            Log.v(TAG, "setScreenMode(" + curScreenMode + ")");
        }
        mScreenMode = curScreenMode;
        for (final ScreenModeListener listener : mListeners) {
            listener.onScreenModeChanged(curScreenMode);
        }
    }
    
    public int getScreenMode() {
        if (LOG) {
            Log.v(TAG, "getScreenMode() return " + mScreenMode);
        }
        return mScreenMode;
    }
    
    public int getNextScreenMode() {
        int mode = getScreenMode();
        mode <<= 1;
        if ((mode & mScreenModes) == 0) {
            //not exist, find the right one
            if (mode > mScreenModes) {
                mode = 1;
            }
            while ((mode & mScreenModes) == 0) {
                mode <<= 1;
                if (mode > mScreenModes) {
                    throw new RuntimeException("wrong screen mode = " + mScreenModes);
                }
            }
        }
        if (LOG) {
            Log.v(TAG, "getNextScreenMode() = " + mode);
        }
        return mode;
    }
    
    private final ArrayList<ScreenModeListener> mListeners = new ArrayList<ScreenModeListener>();
    public void addListener(final ScreenModeListener l) {
        if (!mListeners.contains(l)) {
            mListeners.add(l);
        }
        if (LOG) {
            Log.v(TAG, "addListener(" + l + ")");
        }
    }
    
    public void removeListener(final ScreenModeListener l) {
        mListeners.remove(l);
        if (LOG) {
            Log.v(TAG, "removeListener(" + l + ")");
        }
    }
    
    public void clear() {
        mListeners.clear();
    }
    
    public interface ScreenModeListener {
        void onScreenModeChanged(int newMode);
    }
}