diff options
author | Pawit Pornkitprasan <p.pawit@gmail.com> | 2011-12-06 14:45:41 +0700 |
---|---|---|
committer | Pawit Pornkitprasan <p.pawit@gmail.com> | 2011-12-06 14:45:54 +0700 |
commit | cdf27513762c3313f8ef8e606bb31533e5f25087 (patch) | |
tree | 56fcffba956b8305ded2e104758a2f744cfb2285 /AriesParts/src | |
parent | 71012e283db265ba0d4b93400ea802e2a84c46bf (diff) | |
download | device_samsung_aries-common-cdf27513762c3313f8ef8e606bb31533e5f25087.zip device_samsung_aries-common-cdf27513762c3313f8ef8e606bb31533e5f25087.tar.gz device_samsung_aries-common-cdf27513762c3313f8ef8e606bb31533e5f25087.tar.bz2 |
Add TV Out support
Diffstat (limited to 'AriesParts/src')
-rw-r--r-- | AriesParts/src/android/hardware/TvOut.java | 70 | ||||
-rw-r--r-- | AriesParts/src/com/cyanogenmod/AriesParts/AriesParts.java | 84 | ||||
-rw-r--r-- | AriesParts/src/com/cyanogenmod/AriesParts/TvOutService.java | 146 |
3 files changed, 300 insertions, 0 deletions
diff --git a/AriesParts/src/android/hardware/TvOut.java b/AriesParts/src/android/hardware/TvOut.java new file mode 100644 index 0000000..6c0936e --- /dev/null +++ b/AriesParts/src/android/hardware/TvOut.java @@ -0,0 +1,70 @@ +package android.hardware; + +import java.lang.ref.WeakReference; + +import android.graphics.Bitmap; +import android.util.Log; + +public class TvOut { + private static final String TAG = "TvOut"; + + private int mListenerContext; + private int mNativeContext; + + public native void _DisableTvOut(); + + public native void _EnableTvOut(); + + public native void _SetOrientation(int paramInt); + + public native void _SetTvScreenSize(int paramInt); + + public native void _SetTvSystem(int paramInt); + + public native void _TvOutResume(int paramInt); + + public native void _TvOutSetImageString(String paramString); + + public native void _TvOutSuspend(String paramString); + + public native boolean _TvoutSubtitleIsEnable(); + + public native boolean _TvoutSubtitlePostBitmap(Bitmap paramBitmap, int paramInt); + + public native boolean _TvoutSubtitleSetStatus(int paramInt); + + public native int _getSubtitleHDMIHeight(); + + public native int _getSubtitleHDMIWidth(); + + public native boolean _isEnabled(); + + public native boolean _isSuspended(); + + public native boolean _isTvoutCableConnected(); + + private final native void _native_setup(Object paramObject); + + private final native void _release(); + + public native void _setTvoutCableConnected(int paramInt); + + static { + System.loadLibrary("tvout_jni"); + } + + public TvOut() { + _native_setup(new WeakReference<TvOut>(this)); + } + + public void finalize() { + _release(); + } + + private static void postEventFromNative(Object tvOutRef, int what, int arg1, int arg2, Object obj) { + TvOut tvOut = (TvOut)((WeakReference<TvOut>)tvOutRef).get(); + + Log.d(TAG, "Native Event: " + what + " " + arg1 + " " + arg2); + } + +}
\ No newline at end of file diff --git a/AriesParts/src/com/cyanogenmod/AriesParts/AriesParts.java b/AriesParts/src/com/cyanogenmod/AriesParts/AriesParts.java index 103e91b..3d6a68f 100644 --- a/AriesParts/src/com/cyanogenmod/AriesParts/AriesParts.java +++ b/AriesParts/src/com/cyanogenmod/AriesParts/AriesParts.java @@ -1,7 +1,14 @@ package com.cyanogenmod.AriesParts; +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.hardware.TvOut; import android.os.Bundle; +import android.preference.CheckBoxPreference; import android.preference.ListPreference; +import android.preference.Preference; import android.preference.PreferenceActivity; public class AriesParts extends PreferenceActivity { @@ -9,10 +16,25 @@ public class AriesParts extends PreferenceActivity { public static final String KEY_COLOR_TUNING = "color_tuning"; public static final String KEY_BACKLIGHT_TIMEOUT = "backlight_timeout"; public static final String KEY_HSPA = "hspa"; + public static final String KEY_TVOUT_ENABLE = "tvout_enable"; + public static final String KEY_TVOUT_SYSTEM = "tvout_system"; private ColorTuningPreference mColorTuning; private ListPreference mBacklightTimeout; private ListPreference mHspa; + private CheckBoxPreference mTvOutEnable; + private ListPreference mTvOutSystem; + private TvOut mTvOut; + + private BroadcastReceiver mHeadsetReceiver = new BroadcastReceiver() { + + @Override + public void onReceive(Context context, Intent intent) { + int state = intent.getIntExtra("state", 0); + updateTvOutEnable(state != 0); + } + + }; @Override public void onCreate(Bundle savedInstanceState) { @@ -29,6 +51,68 @@ public class AriesParts extends PreferenceActivity { mHspa = (ListPreference) findPreference(KEY_HSPA); mHspa.setEnabled(Hspa.isSupported()); mHspa.setOnPreferenceChangeListener(new Hspa(this)); + + mTvOut = new TvOut(); + mTvOutEnable = (CheckBoxPreference) findPreference(KEY_TVOUT_ENABLE); + mTvOutEnable.setChecked(mTvOut._isEnabled()); + + mTvOutEnable.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { + + @Override + public boolean onPreferenceChange(Preference preference, Object newValue) { + boolean enable = (Boolean) newValue; + Intent i = new Intent(AriesParts.this, TvOutService.class); + i.putExtra(TvOutService.EXTRA_COMMAND, enable ? TvOutService.COMMAND_ENABLE : TvOutService.COMMAND_DISABLE); + startService(i); + return true; + } + + }); + + mTvOutSystem = (ListPreference) findPreference(KEY_TVOUT_SYSTEM); + mTvOutSystem.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { + + @Override + public boolean onPreferenceChange(Preference preference, Object newValue) { + if (mTvOut._isEnabled()) { + int newSystem = Integer.valueOf((String) newValue); + Intent i = new Intent(AriesParts.this, TvOutService.class); + i.putExtra(TvOutService.EXTRA_COMMAND, TvOutService.COMMAND_CHANGE_SYSTEM); + i.putExtra(TvOutService.EXTRA_SYSTEM, newSystem); + startService(i); + } + return true; + } + + }); + } + + @Override + protected void onResume() { + super.onResume(); + registerReceiver(mHeadsetReceiver, new IntentFilter(Intent.ACTION_HEADSET_PLUG)); + } + + @Override + protected void onPause() { + super.onPause(); + unregisterReceiver(mHeadsetReceiver); + } + + private void updateTvOutEnable(boolean connected) { + mTvOutEnable.setEnabled(connected); + mTvOutEnable.setSummaryOff(connected ? R.string.tvout_enable_summary : R.string.tvout_enable_summary_nocable); + + if (!connected && mTvOutEnable.isChecked()) { + // Disable on unplug (UI) + mTvOutEnable.setChecked(false); + } + } + + @Override + protected void onDestroy() { + mTvOut.finalize(); + super.onDestroy(); } } diff --git a/AriesParts/src/com/cyanogenmod/AriesParts/TvOutService.java b/AriesParts/src/com/cyanogenmod/AriesParts/TvOutService.java new file mode 100644 index 0000000..5812ac6 --- /dev/null +++ b/AriesParts/src/com/cyanogenmod/AriesParts/TvOutService.java @@ -0,0 +1,146 @@ +package com.cyanogenmod.AriesParts; + +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) { + enable(); + mWasOn = false; + } + } + else if (Intent.ACTION_SCREEN_OFF.equals(action)) { + if (mTvOut._isEnabled()) { + mWasOn = true; + disable(); + } + } + } + + }; + + @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(AriesParts.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); + } + +} |