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 | |
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')
-rw-r--r-- | AriesParts/Android.mk | 3 | ||||
-rw-r--r-- | AriesParts/AndroidManifest.xml | 5 | ||||
-rw-r--r-- | AriesParts/res/values/arrays.xml | 10 | ||||
-rw-r--r-- | AriesParts/res/values/strings.xml | 8 | ||||
-rw-r--r-- | AriesParts/res/xml/main.xml | 16 | ||||
-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 |
8 files changed, 342 insertions, 0 deletions
diff --git a/AriesParts/Android.mk b/AriesParts/Android.mk index 29efe75..5db7396 100644 --- a/AriesParts/Android.mk +++ b/AriesParts/Android.mk @@ -8,6 +8,9 @@ LOCAL_SRC_FILES := $(call all-java-files-under, src) LOCAL_PACKAGE_NAME := AriesParts LOCAL_CERTIFICATE := platform +# Required so that symbols used by the jni library doesn't get stripped out +LOCAL_PROGUARD_ENABLED := disabled + include $(BUILD_PACKAGE) include $(call all-makefiles-under,$(LOCAL_PATH)) diff --git a/AriesParts/AndroidManifest.xml b/AriesParts/AndroidManifest.xml index d108fb8..a2213b4 100644 --- a/AriesParts/AndroidManifest.xml +++ b/AriesParts/AndroidManifest.xml @@ -9,11 +9,16 @@ <intent-filter> <action android:name="com.cyanogenmod.action.LAUNCH_DEVICE_SETTINGS" /> </intent-filter> + <intent-filter> + <action android:name="android.intent.action.MAIN" /> + <category android:name="android.intent.category.LAUNCHER" /> + </intent-filter> </activity> <receiver android:name=".Startup"> <intent-filter android:priority="100"> <action android:name="android.intent.action.BOOT_COMPLETED" /> </intent-filter> </receiver> + <service android:name=".TvOutService" /> </application> </manifest> diff --git a/AriesParts/res/values/arrays.xml b/AriesParts/res/values/arrays.xml index a5db723..5d32de2 100644 --- a/AriesParts/res/values/arrays.xml +++ b/AriesParts/res/values/arrays.xml @@ -32,4 +32,14 @@ <item>22</item> <item>23</item> </string-array> + + <string-array name="tvout_system_entries"> + <item>NTSC</item> + <item>PAL</item> + </string-array> + + <string-array name="tvout_system_entries_values" translatable="false"> + <item>1</item> + <item>2</item> + </string-array> </resources> diff --git a/AriesParts/res/values/strings.xml b/AriesParts/res/values/strings.xml index c69049d..735ffe7 100644 --- a/AriesParts/res/values/strings.xml +++ b/AriesParts/res/values/strings.xml @@ -16,4 +16,12 @@ <string name="category_radio_title">Radio</string> <string name="hspa_title_head">HSPA</string> <string name="hspa_summary_head">Enable HSDPA/HSUPA</string> + + <string name="category_tvout_title">TV Out</string> + <string name="tvout_enable_head">TV Out</string> + <string name="tvout_enable_summary_nocable">TV Out cable not connected</string> + <string name="tvout_enable_summary">TV Out cable connected, check to enable</string> + <string name="tvout_enable_summary_on">TV Out enabled</string> + <string name="tvout_system_head">TV System</string> + <string name="tvout_system_summary">Set your TV system for TV Out</string> </resources> diff --git a/AriesParts/res/xml/main.xml b/AriesParts/res/xml/main.xml index e74b599..9c5ff22 100644 --- a/AriesParts/res/xml/main.xml +++ b/AriesParts/res/xml/main.xml @@ -33,4 +33,20 @@ android:entryValues="@array/hspa_entries_values" android:defaultValue="23" /> </PreferenceCategory> + + <PreferenceCategory + android:title="@string/category_tvout_title"> + <CheckBoxPreference + android:key="tvout_enable" + android:title="@string/tvout_enable_head" + android:summaryOn="@string/tvout_enable_summary_on" + android:persistent="false" /> + <ListPreference + android:key="tvout_system" + android:title="@string/tvout_system_head" + android:summary="@string/tvout_system_summary" + android:entries="@array/tvout_system_entries" + android:entryValues="@array/tvout_system_entries_values" + android:defaultValue="2" /> + </PreferenceCategory> </PreferenceScreen> 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); + } + +} |