[Android] [PATCH] Add subtitle font preference

Abir Viqar nitsrite at gmail.com
Mon Jan 20 19:45:48 CET 2014


---
 vlc-android/jni/libvlcjni.c                        |  7 +++
 vlc-android/res/values/strings.xml                 |  1 +
 vlc-android/res/xml/preferences.xml                |  3 ++
 vlc-android/src/org/videolan/libvlc/LibVLC.java    |  9 ++++
 vlc-android/src/org/videolan/vlc/Util.java         |  1 +
 .../org/videolan/vlc/gui/PreferencesActivity.java  | 61 ++++++++++++++++++++++
 6 files changed, 82 insertions(+)

diff --git a/vlc-android/jni/libvlcjni.c b/vlc-android/jni/libvlcjni.c
index cba3bc0..b8b5253 100644
--- a/vlc-android/jni/libvlcjni.c
+++ b/vlc-android/jni/libvlcjni.c
@@ -240,6 +240,11 @@ void Java_org_videolan_libvlc_LibVLC_nativeInit(JNIEnv *env, jobject thiz)
     const char *chromastr = (*env)->GetStringUTFChars(env, chroma, 0);
     LOGD("Chroma set to \"%s\"", chromastr);
 
+    methodId = (*env)->GetMethodID(env, cls, "getSubtitleFont", "()Ljava/lang/String;");
+    jstring subfont = (*env)->CallObjectMethod(env, thiz, methodId);
+    const char *subfontstr = (*env)->GetStringUTFChars(env, subfont, 0);
+    LOGD("Subtitle font set to \"%s\"", subfontstr);
+
     methodId = (*env)->GetMethodID(env, cls, "getSubtitlesEncoding", "()Ljava/lang/String;");
     jstring subsencoding = (*env)->CallObjectMethod(env, thiz, methodId);
     const char *subsencodingstr = (*env)->GetStringUTFChars(env, subsencoding, 0);
@@ -262,6 +267,7 @@ void Java_org_videolan_libvlc_LibVLC_nativeInit(JNIEnv *env, jobject thiz)
         "--preferred-resolution", "360",
         "--avcodec-fast",
         "--avcodec-threads=0",
+        "--freetype-font", subfontstr,
         "--subsdec-encoding", subsencodingstr,
         enable_time_stretch ? "--audio-time-stretch" : "--no-audio-time-stretch",
         "--avcodec-skiploopfilter", deblockstr,
@@ -277,6 +283,7 @@ void Java_org_videolan_libvlc_LibVLC_nativeInit(JNIEnv *env, jobject thiz)
     setLong(env, thiz, "mLibVlcInstance", (jlong)(intptr_t) instance);
 
     (*env)->ReleaseStringUTFChars(env, chroma, chromastr);
+    (*env)->ReleaseStringUTFChars(env, subfont, subfontstr);
     (*env)->ReleaseStringUTFChars(env, subsencoding, subsencodingstr);
 
     if (!instance)
diff --git a/vlc-android/res/values/strings.xml b/vlc-android/res/values/strings.xml
index e7182e2..2e976d0 100644
--- a/vlc-android/res/values/strings.xml
+++ b/vlc-android/res/values/strings.xml
@@ -210,6 +210,7 @@
     <string name="clear_media_db">Clear media database</string>
     <string name="media_db_cleared">Media database cleared!</string>
     <string name="subtitles_text_encoding">Subtitle text encoding</string>
+    <string name="subtitle_font">Subtitle font</string>
 
     <string name="debug_logs">Debug logs</string>
     <string name="start_logging">Start logging</string>
diff --git a/vlc-android/res/xml/preferences.xml b/vlc-android/res/xml/preferences.xml
index 0c7b564..5479c30 100644
--- a/vlc-android/res/xml/preferences.xml
+++ b/vlc-android/res/xml/preferences.xml
@@ -69,6 +69,9 @@
     </PreferenceCategory>
 
     <PreferenceCategory android:title="@string/other_prefs_category" >
+        <PreferenceScreen
+            android:key="subtitle_font"
+            android:title="@string/subtitle_font" />
         <ListPreference
             android:defaultValue=""
             android:entries="@array/subtitles_encoding_list"
diff --git a/vlc-android/src/org/videolan/libvlc/LibVLC.java b/vlc-android/src/org/videolan/libvlc/LibVLC.java
index bcde3a5..e9bf33b 100644
--- a/vlc-android/src/org/videolan/libvlc/LibVLC.java
+++ b/vlc-android/src/org/videolan/libvlc/LibVLC.java
@@ -59,6 +59,7 @@ public class LibVLC {
 
     /** Settings */
     private boolean iomx = false;
+    private String subtitleFont = "";
     private String subtitlesEncoding = "";
     private int aout = LibVlcUtil.isGingerbreadOrLater() ? AOUT_OPENSLES : AOUT_AUDIOTRACK_JAVA;
     private int vout = VOUT_ANDROID_SURFACE;
@@ -224,6 +225,14 @@ public class LibVLC {
         this.iomx = iomx;
     }
 
+    public String getSubtitleFont() {
+        return subtitleFont;
+    }
+
+    public void setSubtitleFont(String subtitleFont) {
+        this.subtitleFont = subtitleFont;
+    }
+
     public String getSubtitlesEncoding() {
         return subtitlesEncoding;
     }
diff --git a/vlc-android/src/org/videolan/vlc/Util.java b/vlc-android/src/org/videolan/vlc/Util.java
index db19fb8..b9c1a45 100644
--- a/vlc-android/src/org/videolan/vlc/Util.java
+++ b/vlc-android/src/org/videolan/vlc/Util.java
@@ -116,6 +116,7 @@ public class Util {
             return;
 
         instance.setIomx(pref.getBoolean("enable_iomx", false));
+        instance.setSubtitleFont(pref.getString("subtitle_font", ""));
         instance.setSubtitlesEncoding(pref.getString("subtitles_text_encoding", ""));
         instance.setTimeStretching(pref.getBoolean("enable_time_stretching_audio", false));
         instance.setFrameSkip(pref.getBoolean("enable_frame_skip", false));
diff --git a/vlc-android/src/org/videolan/vlc/gui/PreferencesActivity.java b/vlc-android/src/org/videolan/vlc/gui/PreferencesActivity.java
index 20e6ae0..294a595 100644
--- a/vlc-android/src/org/videolan/vlc/gui/PreferencesActivity.java
+++ b/vlc-android/src/org/videolan/vlc/gui/PreferencesActivity.java
@@ -20,6 +20,8 @@
 
 package org.videolan.vlc.gui;
 
+import java.io.File;
+
 import org.videolan.libvlc.LibVLC;
 import org.videolan.vlc.AudioService;
 import org.videolan.vlc.AudioServiceController;
@@ -30,11 +32,14 @@ import org.videolan.vlc.Util;
 import org.videolan.vlc.gui.audio.AudioUtil;
 
 import android.app.AlertDialog;
+import android.content.ActivityNotFoundException;
 import android.content.Context;
 import android.content.DialogInterface;
 import android.content.Intent;
+import android.content.pm.PackageManager;
 import android.content.SharedPreferences;
 import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
+import android.net.Uri;
 import android.os.Bundle;
 import android.preference.CheckBoxPreference;
 import android.preference.EditTextPreference;
@@ -44,6 +49,7 @@ import android.preference.Preference.OnPreferenceChangeListener;
 import android.preference.Preference.OnPreferenceClickListener;
 import android.preference.PreferenceActivity;
 import android.preference.PreferenceManager;
+import android.util.Log;
 import android.widget.Toast;
 
 @SuppressWarnings("deprecation")
@@ -55,6 +61,7 @@ public class PreferencesActivity extends PreferenceActivity implements OnSharedP
     public final static String VIDEO_RESUME_TIME = "VideoResumeTime";
     public final static String VIDEO_SUBTITLE_FILES = "VideoSubtitleFiles";
     public final static int RESULT_RESCAN = RESULT_FIRST_USER + 1;
+    public final static int PICK_FONT = 0;
 
     @Override
     protected void onCreate(Bundle savedInstanceState) {
@@ -111,6 +118,40 @@ public class PreferencesActivity extends PreferenceActivity implements OnSharedP
                     }
                 });
 
+        // Subtitle Font
+        Preference subtitleFontPref = findPreference("subtitle_font");
+        subtitleFontPref.setOnPreferenceClickListener(
+                new OnPreferenceClickListener() {
+                    @Override
+                    public boolean onPreferenceClick(Preference preference) {
+                        Intent intent = new Intent("org.openintents.action.PICK_FILE");
+
+                        File file = new File(android.os.Environment.getExternalStorageDirectory().getPath());
+                        intent.setData(Uri.fromFile(file));
+
+                        if (PreferencesActivity.this.getPackageManager()
+                                .queryIntentActivities(intent,
+                                        PackageManager.MATCH_DEFAULT_ONLY).size() > 0) {
+                            PreferencesActivity.this.startActivityForResult(intent, PICK_FONT);
+                        } else {
+                            // OI intent not found, trying anything
+                            Intent intent2 = new Intent(Intent.ACTION_GET_CONTENT);
+                            intent2.setType("*/*");
+                            intent2.addCategory(Intent.CATEGORY_OPENABLE);
+                            try {
+                                PreferencesActivity.this.startActivityForResult(intent2, PICK_FONT);
+                            } catch(ActivityNotFoundException e) {
+                                Log.i(TAG, "No file picker found on system");
+                                Toast.makeText(PreferencesActivity.this,
+                                        R.string.no_file_picker_found,
+                                        Toast.LENGTH_SHORT).show();
+                            }
+                        }
+
+                        return true;
+                    }
+                });
+
         // Clear search history
         Preference clearHistoryPref = findPreference("clear_history");
         clearHistoryPref.setOnPreferenceClickListener(
@@ -228,6 +269,7 @@ public class PreferencesActivity extends PreferenceActivity implements OnSharedP
     @Override
     public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
         if(key.equalsIgnoreCase("enable_iomx")
+                || key.equalsIgnoreCase("subtitle_font")
                 || key.equalsIgnoreCase("subtitles_text_encoding")
                 || key.equalsIgnoreCase("aout")
                 || key.equalsIgnoreCase("vout")
@@ -254,6 +296,25 @@ public class PreferencesActivity extends PreferenceActivity implements OnSharedP
         AudioServiceController.getInstance().unbindAudioService(this);
     }
 
+    @Override
+    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
+        if(requestCode == PICK_FONT) {
+            if(data == null) return;
+
+            if(data.getDataString() == null) {
+                Log.d(TAG, "Subtitle font selection was cancelled");
+            }
+            if(data.getData() == null) return;
+
+            String uri = data.getData().getPath();
+
+            final SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(this);
+            SharedPreferences.Editor editor = sharedPrefs.edit();
+            editor.putString("subtitle_font", uri);
+            editor.commit();
+        }
+    }
+
     private void restartService(Context context) {
         Intent service = new Intent(context, AudioService.class);
 
-- 
1.8.4.rc3



More information about the Android mailing list