summaryrefslogtreecommitdiffstats
path: root/AriesParts/src/com/cyanogenmod/settings/device/TvOutService.java
blob: bb2797e53c813e186a7da8ad603be4322ec2c680 (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
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
package com.cyanogenmod.settings.device;

import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.SharedPreferences;
import android.hardware.TvOut;
import android.os.IBinder;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.os.SystemProperties;
import android.preference.PreferenceManager;
import android.view.Display;
import android.view.IRotationWatcher;
import android.view.IWindowManager;
import android.view.WindowManager;

public class TvOutService extends Service {

    public static final String EXTRA_COMMAND = "command";
    public static final String EXTRA_SYSTEM = "system";
    public static final String COMMAND_ENABLE = "enable";
    public static final String COMMAND_DISABLE = "disable";
    public static final String COMMAND_CHANGE_SYSTEM = "system";

    private TvOut mTvOut;
    private SharedPreferences mPref;
    private int mSystem;
    private boolean mWasOn = false; // For enabling on screen on

    private BroadcastReceiver mReceiver = new BroadcastReceiver() {

        @Override
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            if (Intent.ACTION_HEADSET_PLUG.equals(action)) {
                int state = intent.getIntExtra("state", 0);
                if (state == 0 && mTvOut._isEnabled()) {
                    // Disable when cable is unplugged
                    mWasOn = false;
                    disable();
                    stopSelf();
                }
            }
            else if (Intent.ACTION_SCREEN_ON.equals(action)) {
                if (mWasOn) {
                    SystemProperties.set("ctl.start", "tvouthack");
                    mWasOn = false;
                }
            }
            else if (Intent.ACTION_SCREEN_OFF.equals(action)) {
                if (mTvOut._isEnabled()) {
                    mWasOn = true;
                    SystemProperties.set("ctl.stop", "tvouthack");
                }
            }
        }

    };

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public void onCreate() {
        mTvOut = new TvOut();
        mPref = PreferenceManager.getDefaultSharedPreferences(this);

        IWindowManager wm = IWindowManager.Stub.asInterface(ServiceManager.getService("window"));
        try {
            wm.watchRotation(new IRotationWatcher.Stub() {
                @Override
                public void onRotationChanged(int rotation) {
                    TvOutService.this.onRotationChanged(rotation);
                }
            });
        }
        catch (RemoteException e) { }

        IntentFilter filter = new IntentFilter(Intent.ACTION_HEADSET_PLUG);
        filter.addAction(Intent.ACTION_SCREEN_OFF);
        filter.addAction(Intent.ACTION_SCREEN_ON);
        registerReceiver(mReceiver, filter);
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        if (intent != null) {
            String command = intent.getStringExtra("command");
            if (COMMAND_ENABLE.equals(command)) {
                mSystem = Integer.parseInt(mPref.getString(DeviceSettings.KEY_TVOUT_SYSTEM, "2")); // Default = PAL
                enable();
            }
            else if (COMMAND_DISABLE.equals(command)) {
                disable();
                stopSelf();
            }
            else if (COMMAND_CHANGE_SYSTEM.equals(command)) {
                if (mTvOut._isEnabled()) {
                    mSystem = intent.getIntExtra(EXTRA_SYSTEM, 2);
                    disable();
                    enable();
                }
            }
        }

        return START_STICKY;
    }

    @Override
    public void onDestroy() {
        unregisterReceiver(mReceiver);
        mTvOut.finalize();
        super.onDestroy();
    }

    public void onRotationChanged(int rotation) {
        mTvOut._SetOrientation(rotation);
    }

    private void enable() {
        mTvOut._SetTvSystem(mSystem);
        mTvOut._TvOutSetImageString("TV-out not supported while application running. Phone display only");

        Display display = ((WindowManager) getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
        mTvOut._SetOrientation(display.getRotation());

        mTvOut._EnableTvOut();
        mTvOut._setTvoutCableConnected(1);

        // Start tvouthack service used to bombard screen refresh messages
        SystemProperties.set("ctl.start", "tvouthack");
    }

    private void disable() {
        SystemProperties.set("ctl.stop", "tvouthack");

        mTvOut._DisableTvOut();
        mTvOut._setTvoutCableConnected(0);
    }

}