summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorlado <herrlado@gmail.com>2017-11-03 00:25:44 +0100
committerlado <herrlado@gmail.com>2017-11-03 00:25:44 +0100
commit2692564bfe18978ceb2b5fa4e9237113ae300176 (patch)
tree77e010a23721481ee51143a7bf7393dd74d4a7d6
parente044aed11d8982398fa556eacde9af1003af1c5a (diff)
downloadvdr-manager-lado.tar.gz
vdr-manager-lado.tar.bz2
curretnlado
-rw-r--r--vdrmanager/de.bjusystems.vdrmanager/app-release.apkbin0 -> 2272288 bytes
-rw-r--r--vdrmanager/de.bjusystems.vdrmanager/build.gradle50
-rw-r--r--vdrmanager/de.bjusystems.vdrmanager/build/generated/source/buildConfig/debug/de/bjusystems/vdrmanager/BuildConfig.java4
-rw-r--r--vdrmanager/de.bjusystems.vdrmanager/build/generated/source/r/debug/android/support/v7/appcompat/R.java2
-rw-r--r--vdrmanager/de.bjusystems.vdrmanager/build/generated/source/r/debug/de/bjusystems/vdrmanager/R.java475
-rw-r--r--vdrmanager/de.bjusystems.vdrmanager/lint.xml5
-rw-r--r--vdrmanager/de.bjusystems.vdrmanager/release/de.bjusystems.vdrmanager-release.apkbin0 -> 2347012 bytes
-rw-r--r--vdrmanager/de.bjusystems.vdrmanager/release/output.json1
-rw-r--r--vdrmanager/de.bjusystems.vdrmanager/src/main/AndroidManifest.xml30
-rw-r--r--vdrmanager/de.bjusystems.vdrmanager/src/main/java/com/rajasharan/widget/BitmapDecorator.java90
-rw-r--r--vdrmanager/de.bjusystems.vdrmanager/src/main/java/com/rajasharan/widget/RecyclerDropdown.java172
-rw-r--r--vdrmanager/de.bjusystems.vdrmanager/src/main/java/com/rajasharan/widget/SearchableSpinner.java209
-rw-r--r--vdrmanager/de.bjusystems.vdrmanager/src/main/java/com/rajasharan/widget/ShadowDecorator.java103
-rw-r--r--vdrmanager/de.bjusystems.vdrmanager/src/main/java/de/bjusystems/vdrmanager/app/VdrManagerApp.java11
-rw-r--r--vdrmanager/de.bjusystems.vdrmanager/src/main/java/de/bjusystems/vdrmanager/backup/BackupActivity.java99
-rw-r--r--vdrmanager/de.bjusystems.vdrmanager/src/main/java/de/bjusystems/vdrmanager/backup/BackupSettingsActivity.java148
-rw-r--r--vdrmanager/de.bjusystems.vdrmanager/src/main/java/de/bjusystems/vdrmanager/gui/PreferencesActivity.java1
-rw-r--r--vdrmanager/de.bjusystems.vdrmanager/src/main/java/de/bjusystems/vdrmanager/gui/Utils.java1457
-rw-r--r--vdrmanager/de.bjusystems.vdrmanager/src/main/java/de/bjusystems/vdrmanager/gui/VdrManagerActivity.java617
-rw-r--r--vdrmanager/de.bjusystems.vdrmanager/src/main/java/de/bjusystems/vdrmanager/remote/RemoteActivity.java188
-rw-r--r--vdrmanager/de.bjusystems.vdrmanager/src/main/res/layout/dialog_dropdown.xml26
-rw-r--r--vdrmanager/de.bjusystems.vdrmanager/src/main/res/layout/recycler_buffer_item.xml7
-rw-r--r--vdrmanager/de.bjusystems.vdrmanager/src/main/res/layout/recycler_itemviews.xml7
-rw-r--r--vdrmanager/de.bjusystems.vdrmanager/src/main/res/layout/remote.xml2
-rw-r--r--vdrmanager/de.bjusystems.vdrmanager/src/main/res/values/dimens.xml7
-rw-r--r--vdrmanager/de.bjusystems.vdrmanager/src/main/res/values/font.xml13
-rw-r--r--vdrmanager/de.bjusystems.vdrmanager/src/main/res/values/strings.xml1035
27 files changed, 2844 insertions, 1915 deletions
diff --git a/vdrmanager/de.bjusystems.vdrmanager/app-release.apk b/vdrmanager/de.bjusystems.vdrmanager/app-release.apk
new file mode 100644
index 0000000..0f5cbfc
--- /dev/null
+++ b/vdrmanager/de.bjusystems.vdrmanager/app-release.apk
Binary files differ
diff --git a/vdrmanager/de.bjusystems.vdrmanager/build.gradle b/vdrmanager/de.bjusystems.vdrmanager/build.gradle
new file mode 100644
index 0000000..f759850
--- /dev/null
+++ b/vdrmanager/de.bjusystems.vdrmanager/build.gradle
@@ -0,0 +1,50 @@
+apply plugin: 'com.android.application'
+
+android {
+ lintOptions {
+ checkReleaseBuilds false
+ // Or, if you prefer, you can continue to check for errors in release builds,
+ // but continue the build even when errors are found:
+ abortOnError false
+ }
+
+
+ signingConfigs {
+ config {
+
+ }
+ }
+ compileSdkVersion 23
+ buildToolsVersion '26.0.2'
+ defaultConfig {
+ applicationId "de.bjusystems.vdrmanager"
+ minSdkVersion 8
+ targetSdkVersion 23
+ //vectorDrawables.useSupportLibrary = true
+
+ }
+
+
+ aaptOptions {
+ additionalParameters "--no-version-vectors"
+ }
+
+
+ buildTypes {
+ release {
+ minifyEnabled false
+ proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
+ zipAlignEnabled true
+ }
+ }
+}
+
+dependencies {
+ compile 'com.android.support:support-v4:23.4.0'
+ compile 'com.android.support:appcompat-v7:23.4.0'
+ compile 'com.j256.ormlite:ormlite-android:4.48'
+ compile 'com.j256.ormlite:ormlite-core:4.48'
+ compile 'org.slf4j:slf4j-android:1.7.19'
+ compile 'org.hampelratte:svdrp4j:1.1.0-SNAPSHOT'
+ compile 'com.android.support:recyclerview-v7:23.4.0'
+}
diff --git a/vdrmanager/de.bjusystems.vdrmanager/build/generated/source/buildConfig/debug/de/bjusystems/vdrmanager/BuildConfig.java b/vdrmanager/de.bjusystems.vdrmanager/build/generated/source/buildConfig/debug/de/bjusystems/vdrmanager/BuildConfig.java
index a762496..7ec5efc 100644
--- a/vdrmanager/de.bjusystems.vdrmanager/build/generated/source/buildConfig/debug/de/bjusystems/vdrmanager/BuildConfig.java
+++ b/vdrmanager/de.bjusystems.vdrmanager/build/generated/source/buildConfig/debug/de/bjusystems/vdrmanager/BuildConfig.java
@@ -8,6 +8,6 @@ public final class BuildConfig {
public static final String APPLICATION_ID = "de.bjusystems.vdrmanager";
public static final String BUILD_TYPE = "debug";
public static final String FLAVOR = "";
- public static final int VERSION_CODE = 12700;
- public static final String VERSION_NAME = "12.70";
+ public static final int VERSION_CODE = 12710;
+ public static final String VERSION_NAME = "12.71";
}
diff --git a/vdrmanager/de.bjusystems.vdrmanager/build/generated/source/r/debug/android/support/v7/appcompat/R.java b/vdrmanager/de.bjusystems.vdrmanager/build/generated/source/r/debug/android/support/v7/appcompat/R.java
index 0a5a5e0..7e11890 100644
--- a/vdrmanager/de.bjusystems.vdrmanager/build/generated/source/r/debug/android/support/v7/appcompat/R.java
+++ b/vdrmanager/de.bjusystems.vdrmanager/build/generated/source/r/debug/android/support/v7/appcompat/R.java
@@ -628,7 +628,7 @@ public final class R {
public static final int abc_shareactionprovider_share_with = 0x7f0d0060;
public static final int abc_shareactionprovider_share_with_application = 0x7f0d0061;
public static final int abc_toolbar_collapse_description = 0x7f0d0062;
- public static final int status_bar_notification_info_overflow = 0x7f0d016b;
+ public static final int status_bar_notification_info_overflow = 0x7f0d016e;
}
public static final class style {
public static final int AlertDialog_AppCompat = 0x7f0e0000;
diff --git a/vdrmanager/de.bjusystems.vdrmanager/build/generated/source/r/debug/de/bjusystems/vdrmanager/R.java b/vdrmanager/de.bjusystems.vdrmanager/build/generated/source/r/debug/de/bjusystems/vdrmanager/R.java
index bffcde8..046eeec 100644
--- a/vdrmanager/de.bjusystems.vdrmanager/build/generated/source/r/debug/de/bjusystems/vdrmanager/R.java
+++ b/vdrmanager/de.bjusystems.vdrmanager/build/generated/source/r/debug/de/bjusystems/vdrmanager/R.java
@@ -2763,242 +2763,245 @@ public final class R {
public static final int no_results=0x7f0d00f6;
public static final int no_vdr=0x7f0d00f7;
public static final int not_yet_implemented=0x7f0d00f8;
- public static final int prefs_current_value=0x7f0d00f9;
- public static final int prefs_current_value_not_set=0x7f0d00fa;
- public static final int prefs_current_value_template=0x7f0d00fb;
- public static final int probing=0x7f0d00fc;
- public static final int processing=0x7f0d00fd;
- public static final int progress_cache_hit=0x7f0d00fe;
- public static final int progress_channels_loading=0x7f0d00ff;
- public static final int progress_connect=0x7f0d0100;
- public static final int progress_connect_error=0x7f0d0101;
- public static final int progress_connect_finished_abnormal=0x7f0d0102;
- public static final int progress_connect_finished_abnormal_arg=0x7f0d0103;
- public static final int progress_connect_timeout=0x7f0d0104;
- public static final int progress_disconnect=0x7f0d0105;
- public static final int progress_loading=0x7f0d0106;
- public static final int progress_login=0x7f0d0107;
- public static final int progress_login_error=0x7f0d0108;
- public static final int progress_recording_delete=0x7f0d0109;
- public static final int progress_recordings_loading=0x7f0d010a;
- public static final int progress_switching=0x7f0d010b;
- public static final int progress_timer_delete=0x7f0d010c;
- public static final int progress_timer_disable=0x7f0d010d;
- public static final int progress_timer_enable=0x7f0d010e;
- public static final int progress_timer_modify=0x7f0d010f;
- public static final int progress_timer_save=0x7f0d0110;
- public static final int progress_timers_loading=0x7f0d0111;
- public static final int progress_wakeup_error=0x7f0d0112;
- public static final int progress_wakeup_sending=0x7f0d0113;
- public static final int progress_wakeup_sent=0x7f0d0114;
- public static final int progress_whatson_loading=0x7f0d0115;
- public static final int qui_imdb_url_key=0x7f0d0116;
- public static final int qui_imdb_url_summary=0x7f0d0117;
- public static final int qui_imdb_url_title=0x7f0d0118;
- public static final int qui_quit_on_back_key=0x7f0d0119;
- public static final int qui_show_imdb_button_key=0x7f0d011a;
- public static final int qui_show_imdb_button_summary_off=0x7f0d011b;
- public static final int qui_show_imdb_button_summary_on=0x7f0d011c;
- public static final int qui_show_imdb_button_title=0x7f0d011d;
- public static final int qui_show_omdb_button_key=0x7f0d011e;
- public static final int qui_show_omdb_button_summary_off=0x7f0d011f;
- public static final int qui_show_omdb_button_summary_on=0x7f0d0120;
- public static final int qui_show_omdb_button_title=0x7f0d0121;
- public static final int qui_show_tmdb_button_key=0x7f0d0122;
- public static final int qui_show_tmdb_button_summary_off=0x7f0d0123;
- public static final int qui_show_tmdb_button_summary_on=0x7f0d0124;
- public static final int qui_show_tmdb_button_title=0x7f0d0125;
- public static final int recent_channels=0x7f0d0126;
- public static final int recent_channels_no_history=0x7f0d0127;
- public static final int recording_item_menu_delete=0x7f0d0128;
- public static final int recording_item_menu_stream=0x7f0d0129;
- public static final int recording_started=0x7f0d012a;
- public static final int recstream=0x7f0d012b;
- public static final int recstream_enable_summary=0x7f0d012c;
- public static final int recstream_enable_title=0x7f0d012d;
- public static final int recstream_method_summary=0x7f0d012e;
- public static final int recstream_method_title=0x7f0d012f;
- public static final int recstream_smarttvweb_method_summary=0x7f0d0130;
- public static final int recstream_smarttvweb_method_title=0x7f0d0131;
- public static final int refresh=0x7f0d0132;
- public static final int remapback_hint=0x7f0d0133;
- public static final int remote=0x7f0d0134;
- public static final int remote_enable_summary=0x7f0d0135;
- public static final int remote_enable_title=0x7f0d0136;
- public static final int remux_command_summary=0x7f0d0137;
- public static final int remux_command_title=0x7f0d0138;
- public static final int remux_enable_summary=0x7f0d0139;
- public static final int remux_enable_title=0x7f0d013a;
- public static final int remux_parameter_summary=0x7f0d013b;
- public static final int remux_parameter_title=0x7f0d013c;
- public static final int remux_title=0x7f0d013d;
- public static final int sad_img=0x7f0d013e;
- public static final int sd_card_canceled=0x7f0d013f;
- public static final int sd_card_error_no_storage=0x7f0d0140;
- public static final int sd_card_import_error=0x7f0d0141;
- public static final int sd_card_import_error_no_file=0x7f0d0142;
- public static final int sd_card_import_progress_message=0x7f0d0143;
- public static final int sd_card_import_success=0x7f0d0144;
- public static final int sd_card_save_error=0x7f0d0145;
- public static final int sd_card_save_error_create_dir=0x7f0d0146;
- public static final int sd_card_save_progress_message=0x7f0d0147;
- public static final int sd_card_save_success=0x7f0d0148;
- public static final int search=0x7f0d0149;
- public static final int search_epg_hint=0x7f0d014a;
- public static final int search_reapt=0x7f0d014b;
- public static final int set_time=0x7f0d014c;
- public static final int settings_backup=0x7f0d014d;
- public static final int settings_backup_key=0x7f0d014e;
- public static final int settings_backup_now=0x7f0d014f;
- public static final int settings_backup_now_key=0x7f0d0150;
- public static final int settings_backup_now_progress_message=0x7f0d0151;
- public static final int settings_backup_now_summary=0x7f0d0152;
- public static final int settings_backup_restore=0x7f0d0153;
- public static final int settings_backup_restore_confirm_message=0x7f0d0154;
- public static final int settings_backup_restore_key=0x7f0d0155;
- public static final int settings_backup_restore_no_backup=0x7f0d0156;
- public static final int settings_backup_restore_progress_message=0x7f0d0157;
- public static final int settings_backup_restore_select_title=0x7f0d0158;
- public static final int settings_backup_restore_summary=0x7f0d0159;
- public static final int settings_backup_summary=0x7f0d015a;
- public static final int settings_live_port=0x7f0d015b;
- public static final int settings_live_port_summary=0x7f0d015c;
- public static final int settings_livetv_port=0x7f0d015d;
- public static final int settings_livetv_port_summary=0x7f0d015e;
- public static final int settings_livetv_streamformat=0x7f0d015f;
- public static final int settings_livetv_summary=0x7f0d0160;
- public static final int settings_smarttvweb_port=0x7f0d0161;
- public static final int settings_smarttvweb_port_summary=0x7f0d0162;
- public static final int share=0x7f0d0163;
- public static final int share_chooser=0x7f0d0164;
- public static final int sort=0x7f0d0165;
- public static final int sortby=0x7f0d0166;
- public static final int sortby_alphabet=0x7f0d0167;
- public static final int sortby_channel=0x7f0d0168;
- public static final int sortby_channellist=0x7f0d0169;
- public static final int sortby_time=0x7f0d016a;
- public static final int status_bar_notification_info_overflow=0x7f0d016b;
- public static final int stream_as=0x7f0d016c;
- public static final int stream_choose_audio=0x7f0d016d;
- public static final int stream_via=0x7f0d016e;
- public static final int stream_via_as=0x7f0d016f;
- public static final int streaming_password_key=0x7f0d0170;
- public static final int streaming_password_sum=0x7f0d0171;
- public static final int streaming_password_title=0x7f0d0172;
- public static final int streaming_username_key=0x7f0d0173;
- public static final int streaming_username_sum=0x7f0d0174;
- public static final int streaming_username_title=0x7f0d0175;
- public static final int svdrp_port_summary=0x7f0d0176;
- public static final int svdrp_port_title=0x7f0d0177;
- public static final int switch_to_channel=0x7f0d0178;
- public static final int switching_failed=0x7f0d0179;
- public static final int switching_success=0x7f0d017a;
- public static final int timer_already_exists=0x7f0d017b;
- public static final int timer_created=0x7f0d017c;
- public static final int timer_default_lifetime_key=0x7f0d017d;
- public static final int timer_default_lifetime_summary=0x7f0d017e;
- public static final int timer_default_lifetime_title=0x7f0d017f;
- public static final int timer_default_primary_limit_key=0x7f0d0180;
- public static final int timer_default_primary_limit_summary=0x7f0d0181;
- public static final int timer_default_primary_limit_title=0x7f0d0182;
- public static final int timer_default_priority_key=0x7f0d0183;
- public static final int timer_default_priority_summary=0x7f0d0184;
- public static final int timer_default_priority_title=0x7f0d0185;
- public static final int timer_detail_channel_title=0x7f0d0186;
- public static final int timer_detail_day_title=0x7f0d0187;
- public static final int timer_detail_end_title=0x7f0d0188;
- public static final int timer_detail_lifetime=0x7f0d0189;
- public static final int timer_detail_lifetime_hint=0x7f0d018a;
- public static final int timer_detail_priority=0x7f0d018b;
- public static final int timer_detail_priority_hint=0x7f0d018c;
- public static final int timer_detail_repeat_title=0x7f0d018d;
- public static final int timer_detail_start_title=0x7f0d018e;
- public static final int timer_detail_title_title=0x7f0d018f;
- public static final int timer_detail_title_vps=0x7f0d0190;
- public static final int timer_detail_use_vps=0x7f0d0191;
- public static final int timer_details_add_title=0x7f0d0192;
- public static final int timer_details_create_title=0x7f0d0193;
- public static final int timer_details_delete_title=0x7f0d0194;
- public static final int timer_details_modify_title=0x7f0d0195;
- public static final int timer_details_save_title=0x7f0d0196;
- public static final int timer_error=0x7f0d0197;
- public static final int timer_post_end_buffer_key=0x7f0d0198;
- public static final int timer_post_end_buffer_summary=0x7f0d0199;
- public static final int timer_post_end_buffer_title=0x7f0d019a;
- public static final int timer_pre_start_buffer_key=0x7f0d019b;
- public static final int timer_pre_start_buffer_summary=0x7f0d019c;
- public static final int timer_pre_start_buffer_title=0x7f0d019d;
- public static final int timer_preferences=0x7f0d019e;
- public static final int timezone_key=0x7f0d019f;
- public static final int type_to_filter=0x7f0d01a0;
- public static final int update_will_start_in=0x7f0d01a1;
- public static final int vdr_advanced_preferences=0x7f0d01a2;
- public static final int vdr_advanced_preferences_summary=0x7f0d01a3;
- public static final int vdr_conntimeout_key=0x7f0d01a4;
- public static final int vdr_conntimeout_sum=0x7f0d01a5;
- public static final int vdr_conntimeout_title=0x7f0d01a6;
- public static final int vdr_device_delete_qeustion=0x7f0d01a7;
- public static final int vdr_devices=0x7f0d01a8;
- public static final int vdr_devices_category=0x7f0d01a9;
- public static final int vdr_devices_summary=0x7f0d01aa;
- public static final int vdr_encoding_key=0x7f0d01ab;
- public static final int vdr_encoding_summary=0x7f0d01ac;
- public static final int vdr_encoding_title=0x7f0d01ad;
- public static final int vdr_error_text=0x7f0d01ae;
- public static final int vdr_host_key=0x7f0d01af;
- public static final int vdr_host_not_defined=0x7f0d01b0;
- public static final int vdr_host_summary=0x7f0d01b1;
- public static final int vdr_host_title=0x7f0d01b2;
- public static final int vdr_name_key=0x7f0d01b3;
- public static final int vdr_name_summary=0x7f0d01b4;
- public static final int vdr_name_title=0x7f0d01b5;
- public static final int vdr_password_key=0x7f0d01b6;
- public static final int vdr_password_summary=0x7f0d01b7;
- public static final int vdr_password_title=0x7f0d01b8;
- public static final int vdr_port_default=0x7f0d01b9;
- public static final int vdr_port_key=0x7f0d01ba;
- public static final int vdr_port_summary=0x7f0d01bb;
- public static final int vdr_port_title=0x7f0d01bc;
- public static final int vdr_preferences=0x7f0d01bd;
- public static final int vdr_prefs_category=0x7f0d01be;
- public static final int vdr_readtimeout_key=0x7f0d01bf;
- public static final int vdr_readtimeout_sum=0x7f0d01c0;
- public static final int vdr_readtimeout_title=0x7f0d01c1;
- public static final int vdr_ssl_key=0x7f0d01c2;
- public static final int vdr_ssl_summary=0x7f0d01c3;
- public static final int vdr_ssl_title=0x7f0d01c4;
- public static final int vdr_stream_format=0x7f0d01c5;
- public static final int vdr_stream_port=0x7f0d01c6;
- public static final int vdr_stream_proxy_key=0x7f0d01c7;
- public static final int vdr_timeout_key=0x7f0d01c8;
- public static final int vdr_timeout_sum=0x7f0d01c9;
- public static final int vdr_timeout_title=0x7f0d01ca;
- public static final int vdr_timezone_summary=0x7f0d01cb;
- public static final int vdr_timezone_title=0x7f0d01cc;
- public static final int wakeup_enabled_key=0x7f0d01cd;
- public static final int wakeup_enabled_summary=0x7f0d01ce;
- public static final int wakeup_enabled_title=0x7f0d01cf;
- public static final int wakeup_method_key=0x7f0d01d0;
- public static final int wakeup_method_summary=0x7f0d01d1;
- public static final int wakeup_method_title=0x7f0d01d2;
- public static final int wakeup_password_key=0x7f0d01d3;
- public static final int wakeup_password_summary=0x7f0d01d4;
- public static final int wakeup_password_title=0x7f0d01d5;
- public static final int wakeup_preferences=0x7f0d01d6;
- public static final int wakeup_url_key=0x7f0d01d7;
- public static final int wakeup_url_summary=0x7f0d01d8;
- public static final int wakeup_url_title=0x7f0d01d9;
- public static final int wakeup_user_key=0x7f0d01da;
- public static final int wakeup_user_summary=0x7f0d01db;
- public static final int wakeup_user_title=0x7f0d01dc;
- public static final int wakeup_wol_custom_boradcast_summary=0x7f0d01dd;
- public static final int wakeup_wol_custom_boradcast_title=0x7f0d01de;
- public static final int wakeup_wol_custom_broadcast_key=0x7f0d01df;
- public static final int wakeup_wol_mac_key=0x7f0d01e0;
- public static final int wakeup_wol_mac_summary=0x7f0d01e1;
- public static final int wakeup_wol_mac_title=0x7f0d01e2;
- public static final int zone_list_menu_sort_alphabetically=0x7f0d01e3;
- public static final int zone_list_menu_sort_by_timezone=0x7f0d01e4;
+ public static final int permission_rationale=0x7f0d00f9;
+ public static final int prefs_current_value=0x7f0d00fa;
+ public static final int prefs_current_value_not_set=0x7f0d00fb;
+ public static final int prefs_current_value_template=0x7f0d00fc;
+ public static final int probing=0x7f0d00fd;
+ public static final int processing=0x7f0d00fe;
+ public static final int progress_cache_hit=0x7f0d00ff;
+ public static final int progress_channels_loading=0x7f0d0100;
+ public static final int progress_connect=0x7f0d0101;
+ public static final int progress_connect_error=0x7f0d0102;
+ public static final int progress_connect_finished_abnormal=0x7f0d0103;
+ public static final int progress_connect_finished_abnormal_arg=0x7f0d0104;
+ public static final int progress_connect_timeout=0x7f0d0105;
+ public static final int progress_disconnect=0x7f0d0106;
+ public static final int progress_loading=0x7f0d0107;
+ public static final int progress_login=0x7f0d0108;
+ public static final int progress_login_error=0x7f0d0109;
+ public static final int progress_recording_delete=0x7f0d010a;
+ public static final int progress_recordings_loading=0x7f0d010b;
+ public static final int progress_switching=0x7f0d010c;
+ public static final int progress_timer_delete=0x7f0d010d;
+ public static final int progress_timer_disable=0x7f0d010e;
+ public static final int progress_timer_enable=0x7f0d010f;
+ public static final int progress_timer_modify=0x7f0d0110;
+ public static final int progress_timer_save=0x7f0d0111;
+ public static final int progress_timers_loading=0x7f0d0112;
+ public static final int progress_wakeup_error=0x7f0d0113;
+ public static final int progress_wakeup_sending=0x7f0d0114;
+ public static final int progress_wakeup_sent=0x7f0d0115;
+ public static final int progress_whatson_loading=0x7f0d0116;
+ public static final int qui_imdb_url_key=0x7f0d0117;
+ public static final int qui_imdb_url_summary=0x7f0d0118;
+ public static final int qui_imdb_url_title=0x7f0d0119;
+ public static final int qui_quit_on_back_key=0x7f0d011a;
+ public static final int qui_show_imdb_button_key=0x7f0d011b;
+ public static final int qui_show_imdb_button_summary_off=0x7f0d011c;
+ public static final int qui_show_imdb_button_summary_on=0x7f0d011d;
+ public static final int qui_show_imdb_button_title=0x7f0d011e;
+ public static final int qui_show_omdb_button_key=0x7f0d011f;
+ public static final int qui_show_omdb_button_summary_off=0x7f0d0120;
+ public static final int qui_show_omdb_button_summary_on=0x7f0d0121;
+ public static final int qui_show_omdb_button_title=0x7f0d0122;
+ public static final int qui_show_tmdb_button_key=0x7f0d0123;
+ public static final int qui_show_tmdb_button_summary_off=0x7f0d0124;
+ public static final int qui_show_tmdb_button_summary_on=0x7f0d0125;
+ public static final int qui_show_tmdb_button_title=0x7f0d0126;
+ public static final int recent_channels=0x7f0d0127;
+ public static final int recent_channels_no_history=0x7f0d0128;
+ public static final int recording_item_menu_delete=0x7f0d0129;
+ public static final int recording_item_menu_stream=0x7f0d012a;
+ public static final int recording_started=0x7f0d012b;
+ public static final int recstream=0x7f0d012c;
+ public static final int recstream_enable_summary=0x7f0d012d;
+ public static final int recstream_enable_title=0x7f0d012e;
+ public static final int recstream_method_summary=0x7f0d012f;
+ public static final int recstream_method_title=0x7f0d0130;
+ public static final int recstream_smarttvweb_method_summary=0x7f0d0131;
+ public static final int recstream_smarttvweb_method_title=0x7f0d0132;
+ public static final int refresh=0x7f0d0133;
+ public static final int remapback_hint=0x7f0d0134;
+ public static final int remote=0x7f0d0135;
+ public static final int remote_enable_summary=0x7f0d0136;
+ public static final int remote_enable_title=0x7f0d0137;
+ public static final int remote_keys_imported=0x7f0d0138;
+ public static final int remote_nothing_to_import=0x7f0d0139;
+ public static final int remux_command_summary=0x7f0d013a;
+ public static final int remux_command_title=0x7f0d013b;
+ public static final int remux_enable_summary=0x7f0d013c;
+ public static final int remux_enable_title=0x7f0d013d;
+ public static final int remux_parameter_summary=0x7f0d013e;
+ public static final int remux_parameter_title=0x7f0d013f;
+ public static final int remux_title=0x7f0d0140;
+ public static final int sad_img=0x7f0d0141;
+ public static final int sd_card_canceled=0x7f0d0142;
+ public static final int sd_card_error_no_storage=0x7f0d0143;
+ public static final int sd_card_import_error=0x7f0d0144;
+ public static final int sd_card_import_error_no_file=0x7f0d0145;
+ public static final int sd_card_import_progress_message=0x7f0d0146;
+ public static final int sd_card_import_success=0x7f0d0147;
+ public static final int sd_card_save_error=0x7f0d0148;
+ public static final int sd_card_save_error_create_dir=0x7f0d0149;
+ public static final int sd_card_save_progress_message=0x7f0d014a;
+ public static final int sd_card_save_success=0x7f0d014b;
+ public static final int search=0x7f0d014c;
+ public static final int search_epg_hint=0x7f0d014d;
+ public static final int search_reapt=0x7f0d014e;
+ public static final int set_time=0x7f0d014f;
+ public static final int settings_backup=0x7f0d0150;
+ public static final int settings_backup_key=0x7f0d0151;
+ public static final int settings_backup_now=0x7f0d0152;
+ public static final int settings_backup_now_key=0x7f0d0153;
+ public static final int settings_backup_now_progress_message=0x7f0d0154;
+ public static final int settings_backup_now_summary=0x7f0d0155;
+ public static final int settings_backup_restore=0x7f0d0156;
+ public static final int settings_backup_restore_confirm_message=0x7f0d0157;
+ public static final int settings_backup_restore_key=0x7f0d0158;
+ public static final int settings_backup_restore_no_backup=0x7f0d0159;
+ public static final int settings_backup_restore_progress_message=0x7f0d015a;
+ public static final int settings_backup_restore_select_title=0x7f0d015b;
+ public static final int settings_backup_restore_summary=0x7f0d015c;
+ public static final int settings_backup_summary=0x7f0d015d;
+ public static final int settings_live_port=0x7f0d015e;
+ public static final int settings_live_port_summary=0x7f0d015f;
+ public static final int settings_livetv_port=0x7f0d0160;
+ public static final int settings_livetv_port_summary=0x7f0d0161;
+ public static final int settings_livetv_streamformat=0x7f0d0162;
+ public static final int settings_livetv_summary=0x7f0d0163;
+ public static final int settings_smarttvweb_port=0x7f0d0164;
+ public static final int settings_smarttvweb_port_summary=0x7f0d0165;
+ public static final int share=0x7f0d0166;
+ public static final int share_chooser=0x7f0d0167;
+ public static final int sort=0x7f0d0168;
+ public static final int sortby=0x7f0d0169;
+ public static final int sortby_alphabet=0x7f0d016a;
+ public static final int sortby_channel=0x7f0d016b;
+ public static final int sortby_channellist=0x7f0d016c;
+ public static final int sortby_time=0x7f0d016d;
+ public static final int status_bar_notification_info_overflow=0x7f0d016e;
+ public static final int stream_as=0x7f0d016f;
+ public static final int stream_choose_audio=0x7f0d0170;
+ public static final int stream_via=0x7f0d0171;
+ public static final int stream_via_as=0x7f0d0172;
+ public static final int streaming_password_key=0x7f0d0173;
+ public static final int streaming_password_sum=0x7f0d0174;
+ public static final int streaming_password_title=0x7f0d0175;
+ public static final int streaming_username_key=0x7f0d0176;
+ public static final int streaming_username_sum=0x7f0d0177;
+ public static final int streaming_username_title=0x7f0d0178;
+ public static final int svdrp_port_summary=0x7f0d0179;
+ public static final int svdrp_port_title=0x7f0d017a;
+ public static final int switch_to_channel=0x7f0d017b;
+ public static final int switching_failed=0x7f0d017c;
+ public static final int switching_success=0x7f0d017d;
+ public static final int timer_already_exists=0x7f0d017e;
+ public static final int timer_created=0x7f0d017f;
+ public static final int timer_default_lifetime_key=0x7f0d0180;
+ public static final int timer_default_lifetime_summary=0x7f0d0181;
+ public static final int timer_default_lifetime_title=0x7f0d0182;
+ public static final int timer_default_primary_limit_key=0x7f0d0183;
+ public static final int timer_default_primary_limit_summary=0x7f0d0184;
+ public static final int timer_default_primary_limit_title=0x7f0d0185;
+ public static final int timer_default_priority_key=0x7f0d0186;
+ public static final int timer_default_priority_summary=0x7f0d0187;
+ public static final int timer_default_priority_title=0x7f0d0188;
+ public static final int timer_detail_channel_title=0x7f0d0189;
+ public static final int timer_detail_day_title=0x7f0d018a;
+ public static final int timer_detail_end_title=0x7f0d018b;
+ public static final int timer_detail_lifetime=0x7f0d018c;
+ public static final int timer_detail_lifetime_hint=0x7f0d018d;
+ public static final int timer_detail_priority=0x7f0d018e;
+ public static final int timer_detail_priority_hint=0x7f0d018f;
+ public static final int timer_detail_repeat_title=0x7f0d0190;
+ public static final int timer_detail_start_title=0x7f0d0191;
+ public static final int timer_detail_title_title=0x7f0d0192;
+ public static final int timer_detail_title_vps=0x7f0d0193;
+ public static final int timer_detail_use_vps=0x7f0d0194;
+ public static final int timer_details_add_title=0x7f0d0195;
+ public static final int timer_details_create_title=0x7f0d0196;
+ public static final int timer_details_delete_title=0x7f0d0197;
+ public static final int timer_details_modify_title=0x7f0d0198;
+ public static final int timer_details_save_title=0x7f0d0199;
+ public static final int timer_error=0x7f0d019a;
+ public static final int timer_post_end_buffer_key=0x7f0d019b;
+ public static final int timer_post_end_buffer_summary=0x7f0d019c;
+ public static final int timer_post_end_buffer_title=0x7f0d019d;
+ public static final int timer_pre_start_buffer_key=0x7f0d019e;
+ public static final int timer_pre_start_buffer_summary=0x7f0d019f;
+ public static final int timer_pre_start_buffer_title=0x7f0d01a0;
+ public static final int timer_preferences=0x7f0d01a1;
+ public static final int timezone_key=0x7f0d01a2;
+ public static final int type_to_filter=0x7f0d01a3;
+ public static final int update_will_start_in=0x7f0d01a4;
+ public static final int vdr_advanced_preferences=0x7f0d01a5;
+ public static final int vdr_advanced_preferences_summary=0x7f0d01a6;
+ public static final int vdr_conntimeout_key=0x7f0d01a7;
+ public static final int vdr_conntimeout_sum=0x7f0d01a8;
+ public static final int vdr_conntimeout_title=0x7f0d01a9;
+ public static final int vdr_device_delete_qeustion=0x7f0d01aa;
+ public static final int vdr_devices=0x7f0d01ab;
+ public static final int vdr_devices_category=0x7f0d01ac;
+ public static final int vdr_devices_summary=0x7f0d01ad;
+ public static final int vdr_encoding_key=0x7f0d01ae;
+ public static final int vdr_encoding_summary=0x7f0d01af;
+ public static final int vdr_encoding_title=0x7f0d01b0;
+ public static final int vdr_error_text=0x7f0d01b1;
+ public static final int vdr_host_key=0x7f0d01b2;
+ public static final int vdr_host_not_defined=0x7f0d01b3;
+ public static final int vdr_host_summary=0x7f0d01b4;
+ public static final int vdr_host_title=0x7f0d01b5;
+ public static final int vdr_name_key=0x7f0d01b6;
+ public static final int vdr_name_summary=0x7f0d01b7;
+ public static final int vdr_name_title=0x7f0d01b8;
+ public static final int vdr_password_key=0x7f0d01b9;
+ public static final int vdr_password_summary=0x7f0d01ba;
+ public static final int vdr_password_title=0x7f0d01bb;
+ public static final int vdr_port_default=0x7f0d01bc;
+ public static final int vdr_port_key=0x7f0d01bd;
+ public static final int vdr_port_summary=0x7f0d01be;
+ public static final int vdr_port_title=0x7f0d01bf;
+ public static final int vdr_preferences=0x7f0d01c0;
+ public static final int vdr_prefs_category=0x7f0d01c1;
+ public static final int vdr_readtimeout_key=0x7f0d01c2;
+ public static final int vdr_readtimeout_sum=0x7f0d01c3;
+ public static final int vdr_readtimeout_title=0x7f0d01c4;
+ public static final int vdr_ssl_key=0x7f0d01c5;
+ public static final int vdr_ssl_summary=0x7f0d01c6;
+ public static final int vdr_ssl_title=0x7f0d01c7;
+ public static final int vdr_stream_format=0x7f0d01c8;
+ public static final int vdr_stream_port=0x7f0d01c9;
+ public static final int vdr_stream_proxy_key=0x7f0d01ca;
+ public static final int vdr_timeout_key=0x7f0d01cb;
+ public static final int vdr_timeout_sum=0x7f0d01cc;
+ public static final int vdr_timeout_title=0x7f0d01cd;
+ public static final int vdr_timezone_summary=0x7f0d01ce;
+ public static final int vdr_timezone_title=0x7f0d01cf;
+ public static final int wakeup_enabled_key=0x7f0d01d0;
+ public static final int wakeup_enabled_summary=0x7f0d01d1;
+ public static final int wakeup_enabled_title=0x7f0d01d2;
+ public static final int wakeup_method_key=0x7f0d01d3;
+ public static final int wakeup_method_summary=0x7f0d01d4;
+ public static final int wakeup_method_title=0x7f0d01d5;
+ public static final int wakeup_password_key=0x7f0d01d6;
+ public static final int wakeup_password_summary=0x7f0d01d7;
+ public static final int wakeup_password_title=0x7f0d01d8;
+ public static final int wakeup_preferences=0x7f0d01d9;
+ public static final int wakeup_url_key=0x7f0d01da;
+ public static final int wakeup_url_summary=0x7f0d01db;
+ public static final int wakeup_url_title=0x7f0d01dc;
+ public static final int wakeup_user_key=0x7f0d01dd;
+ public static final int wakeup_user_summary=0x7f0d01de;
+ public static final int wakeup_user_title=0x7f0d01df;
+ public static final int wakeup_wol_custom_boradcast_summary=0x7f0d01e0;
+ public static final int wakeup_wol_custom_boradcast_title=0x7f0d01e1;
+ public static final int wakeup_wol_custom_broadcast_key=0x7f0d01e2;
+ public static final int wakeup_wol_mac_key=0x7f0d01e3;
+ public static final int wakeup_wol_mac_summary=0x7f0d01e4;
+ public static final int wakeup_wol_mac_title=0x7f0d01e5;
+ public static final int zone_list_menu_sort_alphabetically=0x7f0d01e6;
+ public static final int zone_list_menu_sort_by_timezone=0x7f0d01e7;
}
public static final class style {
public static final int AlertDialog_AppCompat=0x7f0e0000;
diff --git a/vdrmanager/de.bjusystems.vdrmanager/lint.xml b/vdrmanager/de.bjusystems.vdrmanager/lint.xml
new file mode 100644
index 0000000..ae17812
--- /dev/null
+++ b/vdrmanager/de.bjusystems.vdrmanager/lint.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<lint>
+ <issue id="ExtraTranslation" severity="warning" />
+ <issue id="MissingTranslation" severity="warning" />
+</lint> \ No newline at end of file
diff --git a/vdrmanager/de.bjusystems.vdrmanager/release/de.bjusystems.vdrmanager-release.apk b/vdrmanager/de.bjusystems.vdrmanager/release/de.bjusystems.vdrmanager-release.apk
new file mode 100644
index 0000000..68f48f9
--- /dev/null
+++ b/vdrmanager/de.bjusystems.vdrmanager/release/de.bjusystems.vdrmanager-release.apk
Binary files differ
diff --git a/vdrmanager/de.bjusystems.vdrmanager/release/output.json b/vdrmanager/de.bjusystems.vdrmanager/release/output.json
new file mode 100644
index 0000000..98f40ef
--- /dev/null
+++ b/vdrmanager/de.bjusystems.vdrmanager/release/output.json
@@ -0,0 +1 @@
+[{"outputType":{"type":"APK"},"apkInfo":{"type":"MAIN","splits":[],"versionCode":12710},"path":"de.bjusystems.vdrmanager-release.apk","properties":{"packageId":"de.bjusystems.vdrmanager","split":"","minSdkVersion":"8"}}] \ No newline at end of file
diff --git a/vdrmanager/de.bjusystems.vdrmanager/src/main/AndroidManifest.xml b/vdrmanager/de.bjusystems.vdrmanager/src/main/AndroidManifest.xml
index cfedf7f..ad02637 100644
--- a/vdrmanager/de.bjusystems.vdrmanager/src/main/AndroidManifest.xml
+++ b/vdrmanager/de.bjusystems.vdrmanager/src/main/AndroidManifest.xml
@@ -1,8 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="de.bjusystems.vdrmanager"
- android:versionCode="12700"
- android:versionName="12.70" >
+ android:versionCode="12710"
+ android:versionName="12.71">
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
@@ -20,11 +20,11 @@
android:hardwareAccelerated="true"
android:icon="@drawable/app_logo"
android:label="@string/app_name"
- android:theme="@style/AppTheme" >
+ android:theme="@style/AppTheme">
<activity
android:name=".gui.VdrManagerActivity"
android:configChanges="locale"
- android:label="@string/app_name" >
+ android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
@@ -43,7 +43,7 @@
android:configChanges="orientation|locale|screenSize" />
<activity
android:name=".gui.EventEpgListActivity"
- android:configChanges="orientation|locale|screenSize" >
+ android:configChanges="orientation|locale|screenSize">
<intent-filter>
<action android:name="android.intent.action.SEARCH" />
</intent-filter>
@@ -54,7 +54,7 @@
</activity>
<activity
android:name=".gui.TimerListActivity"
- android:configChanges="orientation|locale|screenSize" >
+ android:configChanges="orientation|locale|screenSize">
<intent-filter>
<action android:name="android.intent.action.SEARCH" />
</intent-filter>
@@ -68,7 +68,7 @@
android:configChanges="orientation|locale|screenSize" />
<activity
android:name=".gui.ChannelListActivity"
- android:configChanges="orientation|locale|screenSize" >
+ android:configChanges="orientation|locale|screenSize">
<intent-filter>
<action android:name="android.intent.action.SEARCH" />
</intent-filter>
@@ -79,7 +79,7 @@
</activity>
<activity
android:name=".gui.EpgDetailsActivity"
- android:configChanges="orientation|locale|screenSize" >
+ android:configChanges="orientation|locale|screenSize">
<intent-filter>
<action android:name="android.intent.action.SEARCH" />
</intent-filter>
@@ -91,7 +91,7 @@
<activity
android:name=".gui.TimerDetailsActivity"
android:configChanges="orientation|locale|keyboardHidden|screenSize"
- android:windowSoftInputMode="stateHidden" >
+ android:windowSoftInputMode="stateHidden">
<intent-filter>
<action android:name="android.intent.action.SEARCH" />
</intent-filter>
@@ -102,7 +102,7 @@
</activity>
<activity
android:name=".gui.RecordingListActivity"
- android:configChanges="orientation|locale|screenSize" >
+ android:configChanges="orientation|locale|screenSize">
<intent-filter>
<action android:name="android.intent.action.SEARCH" />
</intent-filter>
@@ -114,7 +114,7 @@
<activity
android:name=".gui.EpgSearchListActivity"
android:configChanges="orientation|locale|screenSize"
- android:launchMode="singleTask" >
+ android:launchMode="singleTask">
<intent-filter>
<action android:name="android.intent.action.SEARCH" />
</intent-filter>
@@ -156,7 +156,13 @@
<activity
android:name=".remote.RemoteActivity"
android:theme="@style/AppTheme"
- android:configChanges="orientation|locale|screenSize" />
+ android:configChanges="orientation|locale|screenSize">
+ <intent-filter>
+ <action android:name="android.intent.action.SEND" />
+ <category android:name="android.intent.category.DEFAULT" />
+ <data android:mimeType="application/json" />
+ </intent-filter>
+ </activity>
</application>
</manifest>
diff --git a/vdrmanager/de.bjusystems.vdrmanager/src/main/java/com/rajasharan/widget/BitmapDecorator.java b/vdrmanager/de.bjusystems.vdrmanager/src/main/java/com/rajasharan/widget/BitmapDecorator.java
new file mode 100644
index 0000000..4dedc32
--- /dev/null
+++ b/vdrmanager/de.bjusystems.vdrmanager/src/main/java/com/rajasharan/widget/BitmapDecorator.java
@@ -0,0 +1,90 @@
+package com.rajasharan.widget;
+
+import android.content.Context;
+import android.graphics.Bitmap;
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.Paint;
+import android.graphics.Rect;
+import android.graphics.drawable.GradientDrawable;
+import android.support.v7.widget.RecyclerView;
+import android.view.View;
+
+/**
+ * Created by rajasharan on 9/13/15.
+ */
+class BitmapDecorator extends RecyclerView.ItemDecoration {
+ private Paint mWhitePaint;
+ private GradientDrawable mD;
+
+ public BitmapDecorator(Context context) {
+ mWhitePaint = new Paint(Paint.ANTI_ALIAS_FLAG);
+ mWhitePaint.setStyle(Paint.Style.FILL);
+ mWhitePaint.setColor(Color.WHITE);
+ mD = new GradientDrawable(GradientDrawable.Orientation.BOTTOM_TOP, null);
+ mD.setColor(Color.argb(128, 128, 128, 128));
+ mD.setGradientType(GradientDrawable.SWEEP_GRADIENT);
+ }
+
+ @Override
+ public void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) {
+ transformChildren(c, parent);
+ }
+
+ private void transformChildren(Canvas canvas, RecyclerView parent) {
+ int childCount = parent.getChildCount();
+ int middlePos = (childCount - 1) / 2;
+
+ canvas.drawARGB(255, 255, 255, 255);
+
+ for (int i = 0; i < childCount; i++) {
+ if (i == middlePos) {
+ continue;
+ }
+ View child = parent.getChildAt(i);
+ if (child != null) {
+ Bitmap b = child.getDrawingCache();
+ if (b != null) {
+ canvas.drawBitmap(b, child.getLeft(), child.getTop(), null);
+ }
+ }
+ }
+
+ View child = parent.getChildAt(middlePos);
+ if (child != null) {
+ Rect r = new Rect();
+ child.getHitRect(r);
+ Bitmap b = child.getDrawingCache();
+ if (b != null) {
+ canvas.save();
+ mD.setColor(Color.argb(32, 128, 128, 128));
+ mD.setBounds(child.getLeft(), child.getTop() - 6, child.getRight(), child.getTop() - 4);
+ mD.draw(canvas);
+
+ mD.setColor(Color.argb(64, 128, 128, 128));
+ mD.setBounds(child.getLeft(), child.getTop() - 4, child.getRight(), child.getTop() - 2);
+ mD.draw(canvas);
+
+ mD.setColor(Color.argb(128, 128, 128, 128));
+ mD.setBounds(child.getLeft(), child.getTop() - 2, child.getRight(), child.getTop());
+ mD.draw(canvas);
+
+ canvas.scale(2.0f, 2.0f, r.centerX(), r.centerY());
+ canvas.drawBitmap(b, child.getLeft(), child.getTop(), null);
+
+ mD.setColor(Color.argb(128, 128, 128, 128));
+ mD.setBounds(child.getLeft(), child.getBottom(), child.getRight(), child.getBottom() + 2);
+ mD.draw(canvas);
+
+ mD.setColor(Color.argb(64, 128, 128, 128));
+ mD.setBounds(child.getLeft(), child.getBottom() + 2, child.getRight(), child.getBottom() + 4);
+ mD.draw(canvas);
+
+ mD.setColor(Color.argb(32, 128, 128, 128));
+ mD.setBounds(child.getLeft(), child.getBottom() + 4, child.getRight(), child.getBottom() + 6);
+ mD.draw(canvas);
+ canvas.restore();
+ }
+ }
+ }
+}
diff --git a/vdrmanager/de.bjusystems.vdrmanager/src/main/java/com/rajasharan/widget/RecyclerDropdown.java b/vdrmanager/de.bjusystems.vdrmanager/src/main/java/com/rajasharan/widget/RecyclerDropdown.java
new file mode 100644
index 0000000..d515809
--- /dev/null
+++ b/vdrmanager/de.bjusystems.vdrmanager/src/main/java/com/rajasharan/widget/RecyclerDropdown.java
@@ -0,0 +1,172 @@
+package com.rajasharan.widget;
+
+import android.content.Context;
+import android.support.v7.widget.LinearLayoutManager;
+import android.support.v7.widget.RecyclerView;
+import android.util.AttributeSet;
+import android.view.Gravity;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.TextView;
+import de.bjusystems.vdrmanager.R;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Created by rajasharan on 8/28/15.
+ */
+public class RecyclerDropdown extends RecyclerView {
+ private static final String TAG = "RecyclerDropdown";
+ private static final CharSequence [] EMPTY_LIST = new CharSequence[] {Adapter.EMPTY_TEXT};
+
+ private CharSequence [] mList;
+ private CharSequence [] mOriginalList;
+ private Adapter mAdapter;
+ private OnClickListener mListener;
+
+ public RecyclerDropdown(Context context) {
+ this(context, null);
+ }
+
+ public RecyclerDropdown(Context context, AttributeSet attrs) {
+ this(context, attrs, 0);
+ }
+
+ public RecyclerDropdown(Context context, AttributeSet attrs, int defStyle) {
+ super(context, attrs, defStyle);
+ mAdapter = new Adapter();
+ }
+
+ @Override
+ protected void onFinishInflate() {
+ super.onFinishInflate();
+ setDropdownList(null);
+ setAdapter(mAdapter);
+ setLayoutManager(new LinearLayoutManager(getContext(), LinearLayoutManager.VERTICAL, false));
+ //addItemDecoration(new BitmapDecorator(getContext()));
+ addItemDecoration(new ShadowDecorator(getContext()));
+ }
+
+ public void setDropdownList(CharSequence [] list) {
+ if (list == null) {
+ mList = EMPTY_LIST;
+ } else {
+ mList = list;
+ }
+ mAdapter.init(mList);
+ mAdapter.notifyDataSetChanged();
+ //scrollToPosition(mList.length / 2);
+ }
+
+ public void filter(String str) {
+ if (mOriginalList == null) {
+ mOriginalList = mList.clone();
+ }
+ if (str != null && str.trim().length() != 0) {
+ List<CharSequence> list = new ArrayList<>();
+ for (CharSequence cs : mOriginalList) {
+ if (cs.toString().toUpperCase().contains(str.toUpperCase())) {
+ list.add(cs);
+ }
+ }
+ if (list.size() == 0) {
+ mList = EMPTY_LIST;
+ } else {
+ mList = list.toArray(new CharSequence[list.size()]);
+ }
+ }
+ else {
+ mList = mOriginalList;
+ }
+ setDropdownList(mList);
+ }
+
+ private static class Adapter extends RecyclerView.Adapter<Holder> {
+ private static final int NORMAL_TYPE = 1;
+ private static final int EMPTY_TYPE = 2;
+ private static final int BUFFER_TYPE = 3;
+
+ private static final String EMPTY_TEXT = "NO ITEMS";
+ private static final String BUFFER_ITEM = "BUFFER ITEM";
+
+ private CharSequence [] mList;
+
+ public void init(CharSequence [] list) {
+ mList = new CharSequence[list.length+4];
+ mList[0] = BUFFER_ITEM;
+ mList[1] = BUFFER_ITEM;
+ System.arraycopy(list, 0, mList, 2, list.length);
+ mList[mList.length-1] = BUFFER_ITEM;
+ mList[mList.length-2] = BUFFER_ITEM;
+ }
+ @Override
+ public Holder onCreateViewHolder(ViewGroup viewGroup, int type) {
+ LayoutInflater inflater = (LayoutInflater) viewGroup.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
+ View view;
+ switch (type) {
+ case NORMAL_TYPE: {
+ view = inflater.inflate(R.layout.recycler_itemviews, viewGroup, false);
+ break;
+ }
+ case EMPTY_TYPE: {
+ view = inflater.inflate(R.layout.recycler_itemviews, viewGroup, false);
+ Holder holder = new Holder(view);
+ holder.mTextView.setGravity(Gravity.CENTER);
+ view.setTag(R.id.text, EMPTY_TEXT);
+ return holder;
+ }
+ default /*BUFFER_TYPE*/ : {
+ view = inflater.inflate(R.layout.recycler_buffer_item, viewGroup, false);
+ Holder holder = new Holder(view);
+ return holder;
+ }
+ }
+ Holder holder = new Holder(view);
+ holder.mTextView.setGravity(Gravity.CENTER);
+ return holder;
+ }
+ @Override
+ public void onBindViewHolder(Holder holder, int pos) {
+ if (mList[pos % mList.length].toString().equals(BUFFER_ITEM)) {
+ return;
+ }
+ holder.mTextView.setText(mList[pos % mList.length]);
+ }
+ @Override
+ public int getItemCount() {
+ return mList.length;
+ }
+
+ @Override
+ public int getItemViewType(int position) {
+ if (mList[position % mList.length].toString().equals(EMPTY_TEXT)) {
+ return EMPTY_TYPE;
+ }
+ if (mList[position % mList.length].toString().equals(BUFFER_ITEM)) {
+ return BUFFER_TYPE;
+ }
+ return NORMAL_TYPE;
+ }
+ }
+
+ private static class Holder extends ViewHolder {
+ private TextView mTextView;
+ public Holder(View itemView) {
+ super(itemView);
+ if (itemView instanceof TextView) {
+ mTextView = (TextView) itemView;
+ }
+ }
+ }
+
+ public void setOnClickListener(OnClickListener listener) {
+ mListener = listener;
+ }
+
+ public OnClickListener getOnClickListener() {
+ return mListener;
+ }
+
+}
diff --git a/vdrmanager/de.bjusystems.vdrmanager/src/main/java/com/rajasharan/widget/SearchableSpinner.java b/vdrmanager/de.bjusystems.vdrmanager/src/main/java/com/rajasharan/widget/SearchableSpinner.java
new file mode 100644
index 0000000..6ce336a
--- /dev/null
+++ b/vdrmanager/de.bjusystems.vdrmanager/src/main/java/com/rajasharan/widget/SearchableSpinner.java
@@ -0,0 +1,209 @@
+package com.rajasharan.widget;
+
+import android.app.AlertDialog;
+import android.content.Context;
+import android.content.res.TypedArray;
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.text.Editable;
+import android.text.TextWatcher;
+import android.util.AttributeSet;
+import android.view.LayoutInflater;
+import android.view.MotionEvent;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.EditText;
+import android.widget.TextView;
+import de.bjusystems.vdrmanager.R;
+
+/**
+ * Created by rajasharan on 8/28/15.
+ */
+public class SearchableSpinner extends ViewGroup implements TextWatcher, View.OnClickListener {
+ private static final String TAG = "Searchable_Spinner";
+
+ private CharSequence [] mList;
+ private TextView mText;
+ private TextView mDropdownArrow;
+ private AlertDialog mDialog;
+ private RecyclerDropdown mRecycler;
+ private OnSelectionChangeListener mListener;
+
+ public SearchableSpinner(Context context) {
+ this(context, null);
+ }
+
+ public SearchableSpinner(Context context, AttributeSet attrs) {
+ this(context, attrs, 0);
+ }
+
+ public SearchableSpinner(Context context, AttributeSet attrs, int defStyleAttr) {
+ super(context, attrs, defStyleAttr);
+ init(context, attrs);
+ }
+
+ private void init(Context context, AttributeSet attrs) {
+ mText = new TextView(context);
+ mText.setTextColor(Color.BLACK);
+ mText.setLayoutParams(generateDefaultLayoutParams());
+
+ mDropdownArrow = new TextView(context);
+ mDropdownArrow.setText("\u25BC");
+ mDropdownArrow.setLayoutParams(generateDefaultLayoutParams());
+
+ TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.SearchableSpinner);
+ setList(a.getTextArray(R.styleable.SearchableSpinner_list));
+ a.recycle();
+
+ int [] paddingAttrs = new int[] {
+ android.R.attr.padding,
+ android.R.attr.paddingLeft, android.R.attr.paddingTop,
+ android.R.attr.paddingRight, android.R.attr.paddingBottom};
+
+ a = context.obtainStyledAttributes(attrs, paddingAttrs);
+ for (int i=0; i<paddingAttrs.length; i++) {
+ int temp = a.hasValue(i) ? setPadding(a.getDimensionPixelSize(i, -1), i) : -1;
+ }
+ }
+
+ public void setList(CharSequence [] list) {
+ mList = list;
+ if (mList != null && mList.length > 0) {
+ mText.setText(mList[0]);
+ mDialog = createDialog(getContext());
+ }
+ }
+
+ private int setPadding(int p, int sideIndex) {
+ if (p != -1) {
+ switch (sideIndex) {
+ case 0:
+ mText.setPadding(p, p, p, p);
+ mDropdownArrow.setPadding(p, p, p, p);
+ break;
+ case 1:
+ mText.setPadding(p, getPaddingTop(), getPaddingRight(), getPaddingBottom());
+ mDropdownArrow.setPadding(p, getPaddingTop(), getPaddingRight(), getPaddingBottom());
+ break;
+ case 2:
+ mText.setPadding(getPaddingLeft(), p, getPaddingRight(), getPaddingBottom());
+ mDropdownArrow.setPadding(getPaddingLeft(), p, getPaddingRight(), getPaddingBottom());
+ break;
+ case 3:
+ mText.setPadding(getPaddingLeft(), getPaddingTop(), p, getPaddingBottom());
+ mDropdownArrow.setPadding(getPaddingLeft(), getPaddingTop(), p, getPaddingBottom());
+ break;
+ case 4:
+ mText.setPadding(getPaddingLeft(), getPaddingTop(), getPaddingRight(), p);
+ mDropdownArrow.setPadding(getPaddingLeft(), getPaddingTop(), getPaddingRight(), p);
+ break;
+ }
+ }
+ return -1;
+ }
+
+ private AlertDialog createDialog(Context context) {
+ AlertDialog.Builder builder = new AlertDialog.Builder(context);
+ LayoutInflater inflater = LayoutInflater.from(context);
+ View view = inflater.inflate(R.layout.dialog_dropdown, null);
+
+ EditText filter = (EditText) view.findViewById(R.id.filter);
+ filter.setHint("\uD83D\uDD0D search");
+ filter.addTextChangedListener(this);
+
+ mRecycler = (RecyclerDropdown) view.findViewById(R.id.list);
+ mRecycler.setOnClickListener(this);
+ mRecycler.setDropdownList(mList);
+ mRecycler.scrollToPosition(mList.length/2);
+
+ builder.setView(view);
+ return builder.create();
+ }
+
+ @Override
+ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+ mText.measure(0, 0);
+ mDropdownArrow.measure(0, 0);
+
+ int w = MeasureSpec.getSize(widthMeasureSpec);
+ int h = MeasureSpec.getSize(heightMeasureSpec);
+
+ int desiredWidth = Math.min(mText.getMeasuredWidth() + mDropdownArrow.getMeasuredWidth(), w);
+ int desiredHeight = Math.min(mText.getMeasuredHeight(), h);
+
+ //Log.d(TAG, String.format("onMeasure: (%s, %s)", desiredWidth, desiredHeight));
+
+ widthMeasureSpec = MeasureSpec.makeMeasureSpec(desiredWidth, MeasureSpec.EXACTLY);
+ heightMeasureSpec = MeasureSpec.makeMeasureSpec(desiredHeight, MeasureSpec.EXACTLY);
+ setMeasuredDimension(widthMeasureSpec, heightMeasureSpec);
+ }
+
+ @Override
+ protected void onLayout(boolean changed, int l, int t, int r, int b) {
+ mText.layout(l, t, l + mText.getMeasuredWidth(), b);
+ mDropdownArrow.layout(l + mText.getMeasuredWidth(), t, r, b);
+ }
+
+ @Override
+ protected void dispatchDraw(Canvas canvas) {
+ mText.draw(canvas);
+ int save = canvas.save();
+ canvas.translate(mText.getWidth(), 0);
+ mDropdownArrow.draw(canvas);
+ canvas.restoreToCount(save);
+ }
+
+ @Override
+ public boolean onTouchEvent(MotionEvent event) {
+ switch (event.getActionMasked()) {
+ case MotionEvent.ACTION_UP:
+ if (mDialog != null && !mDialog.isShowing()) {
+ mDialog.show();
+ }
+ }
+ return true;
+ }
+
+ private void updateSelection(CharSequence str) {
+ mText.setText(str);
+ requestLayout();
+ invalidate();
+ if (mListener != null) {
+ mListener.onSelectionChanged(str.toString());
+ }
+ }
+
+ public String getSelectedItem() {
+ if (mText != null) {
+ return mText.getText().toString();
+ }
+ return null;
+ }
+
+ @Override
+ public void onTextChanged(CharSequence s, int start, int before, int count) {
+ mRecycler.filter(s.toString());
+ }
+ @Override
+ public void beforeTextChanged(CharSequence s, int start, int count, int after) {
+ }
+ @Override
+ public void afterTextChanged(Editable s) {
+ }
+
+ @Override
+ public void onClick(View v) {
+ if (mDialog.isShowing()) {
+ mDialog.dismiss();
+ }
+ updateSelection(((TextView)v).getText());
+ }
+
+ public void setOnSelectionChangeListener(OnSelectionChangeListener listener) {
+ mListener = listener;
+ }
+
+ public interface OnSelectionChangeListener {
+ public void onSelectionChanged(String selection);
+ }
+}
diff --git a/vdrmanager/de.bjusystems.vdrmanager/src/main/java/com/rajasharan/widget/ShadowDecorator.java b/vdrmanager/de.bjusystems.vdrmanager/src/main/java/com/rajasharan/widget/ShadowDecorator.java
new file mode 100644
index 0000000..11abedc
--- /dev/null
+++ b/vdrmanager/de.bjusystems.vdrmanager/src/main/java/com/rajasharan/widget/ShadowDecorator.java
@@ -0,0 +1,103 @@
+package com.rajasharan.widget;
+
+import android.content.Context;
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.Paint;
+import android.support.v7.widget.RecyclerView;
+import android.view.View;
+import de.bjusystems.vdrmanager.R;
+
+/**
+ * Created by rajasharan on 9/13/15.
+ */
+public class ShadowDecorator extends RecyclerView.ItemDecoration {
+ private static final String TAG = "ShadowDecorator";
+ private static final int SHADOW_INSET = 2;
+
+ private Context mContext;
+ private Paint mCoreShadow;
+ private Paint mOvertone;
+ private Paint mHighlight;
+ private int mHeight;
+ private int mInset;
+
+ public ShadowDecorator(Context context) {
+ mContext = context;
+
+ mCoreShadow = new Paint(Paint.ANTI_ALIAS_FLAG);
+ mCoreShadow.setColor(Color.argb(128, 128, 128, 128));
+ mCoreShadow.setStyle(Paint.Style.FILL);
+
+ mOvertone = new Paint(Paint.ANTI_ALIAS_FLAG);
+ mOvertone.setColor(Color.argb(64, 128, 128, 128));
+ mOvertone.setStyle(Paint.Style.FILL);
+
+ mHighlight = new Paint(Paint.ANTI_ALIAS_FLAG);
+ mHighlight.setColor(Color.argb(32, 128, 128, 128));
+ mHighlight.setStyle(Paint.Style.FILL);
+
+ mHeight = (int) (mContext.getResources().getDimension(R.dimen.item_height));
+ mInset = (int) mContext.getResources().getDimension(R.dimen.item_inset);
+ }
+
+ @Override
+ public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {
+ int count = parent.getChildCount();
+ int middlePos = (count - 1)/2;
+
+ int t = 2 * mHeight - mInset;
+ int b = 3 * mHeight + mInset;
+
+ /* TOP SHADOW */
+ c.drawRect(parent.getLeft(), t, parent.getRight(), t + SHADOW_INSET, mHighlight);
+ c.drawRect(parent.getLeft(), t + SHADOW_INSET, parent.getRight(), t + 2 * SHADOW_INSET, mOvertone);
+ c.drawRect(parent.getLeft(), t + 2 * SHADOW_INSET, parent.getRight(), t + 3 * SHADOW_INSET, mCoreShadow);
+
+ /* BOTTOM SHADOW */
+ c.drawRect(parent.getLeft(), b - 3 * SHADOW_INSET, parent.getRight(), b - 2 * SHADOW_INSET, mCoreShadow);
+ c.drawRect(parent.getLeft(), b - 2 * SHADOW_INSET, parent.getRight(), b - SHADOW_INSET, mOvertone);
+ c.drawRect(parent.getLeft(), b - SHADOW_INSET, parent.getRight(), b, mHighlight);
+
+ for (int i=0; i<count; i++) {
+ View child = parent.getChildAt(i);
+ child.setScaleX(1.0f);
+ child.setScaleY(1.0f);
+ child.setRotationX(0);
+ child.setAlpha(1.0f);
+ child.setOnClickListener(null);
+ }
+
+ for (int i=middlePos-1, j=1; i>=0; i--,j++) {
+ View child = parent.getChildAt(i);
+ if (child != null) {
+ child.setRotationX(25 * j);
+ child.setAlpha(1.0f/(count - i));
+ }
+ }
+
+ {
+ View child = parent.getChildAt(middlePos);
+ if (child != null) {
+ child.setAlpha(0.5f);
+ int childMidPoint = (child.getTop() + child.getBottom())/2;
+ if (childMidPoint >= t && childMidPoint <= b) {
+ if (child.getTag(R.id.text) == null) {
+ child.setScaleX(2.2f);
+ child.setScaleY(2.2f);
+ child.setOnClickListener(((RecyclerDropdown) parent).getOnClickListener());
+ child.setAlpha(1.0f);
+ }
+ }
+ }
+ }
+
+ for (int i=middlePos+1, j=1; i<count; i++,j++) {
+ View child = parent.getChildAt(i);
+ if (child != null) {
+ child.setRotationX(-25 * j);
+ child.setAlpha(1.0f / i);
+ }
+ }
+ }
+}
diff --git a/vdrmanager/de.bjusystems.vdrmanager/src/main/java/de/bjusystems/vdrmanager/app/VdrManagerApp.java b/vdrmanager/de.bjusystems.vdrmanager/src/main/java/de/bjusystems/vdrmanager/app/VdrManagerApp.java
index 0d4f54c..ac0ff44 100644
--- a/vdrmanager/de.bjusystems.vdrmanager/src/main/java/de/bjusystems/vdrmanager/app/VdrManagerApp.java
+++ b/vdrmanager/de.bjusystems.vdrmanager/src/main/java/de/bjusystems/vdrmanager/app/VdrManagerApp.java
@@ -2,6 +2,12 @@ package de.bjusystems.vdrmanager.app;
import android.app.Activity;
import android.app.Application;
+
+import java.security.KeyStore;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Locale;
+
import de.bjusystems.vdrmanager.data.Channel;
import de.bjusystems.vdrmanager.data.EpgSearchParams;
import de.bjusystems.vdrmanager.data.Event;
@@ -9,11 +15,6 @@ import de.bjusystems.vdrmanager.data.Preferences;
import de.bjusystems.vdrmanager.data.Timer;
import de.bjusystems.vdrmanager.data.Vdr;
-import java.security.KeyStore;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Locale;
-
public class VdrManagerApp extends Application {
diff --git a/vdrmanager/de.bjusystems.vdrmanager/src/main/java/de/bjusystems/vdrmanager/backup/BackupActivity.java b/vdrmanager/de.bjusystems.vdrmanager/src/main/java/de/bjusystems/vdrmanager/backup/BackupActivity.java
index ed0da12..4358010 100644
--- a/vdrmanager/de.bjusystems.vdrmanager/src/main/java/de/bjusystems/vdrmanager/backup/BackupActivity.java
+++ b/vdrmanager/de.bjusystems.vdrmanager/src/main/java/de/bjusystems/vdrmanager/backup/BackupActivity.java
@@ -21,69 +21,72 @@ import android.app.Dialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.widget.Toast;
+
import de.bjusystems.vdrmanager.R;
/**
* Activity to backup data to the SD card.
- *
+ *
* @author Jimmy Shih
*/
public class BackupActivity extends Activity {
- private static final int DIALOG_PROGRESS_ID = 0;
+ private static final int DIALOG_PROGRESS_ID = 0;
+
+
+ private BackupAsyncTask backupAsyncTask;
- private BackupAsyncTask backupAsyncTask;
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
- Object retained = getLastNonConfigurationInstance();
- if (retained instanceof BackupAsyncTask) {
- backupAsyncTask = (BackupAsyncTask) retained;
- backupAsyncTask.setActivity(this);
- } else {
- backupAsyncTask = new BackupAsyncTask(this);
- backupAsyncTask.execute();
+ Object retained = getLastNonConfigurationInstance();
+ if (retained instanceof BackupAsyncTask) {
+ backupAsyncTask = (BackupAsyncTask) retained;
+ backupAsyncTask.setActivity(this);
+ } else {
+ backupAsyncTask = new BackupAsyncTask(this);
+ backupAsyncTask.execute();
+ }
}
- }
- @Override
- public Object onRetainNonConfigurationInstance() {
- backupAsyncTask.setActivity(null);
- return backupAsyncTask;
- }
+ @Override
+ public Object onRetainNonConfigurationInstance() {
+ backupAsyncTask.setActivity(null);
+ return backupAsyncTask;
+ }
- @Override
- protected Dialog onCreateDialog(int id) {
- if (id != DIALOG_PROGRESS_ID) {
- return null;
+ @Override
+ protected Dialog onCreateDialog(int id) {
+ if (id != DIALOG_PROGRESS_ID) {
+ return null;
+ }
+ return DialogUtils.createSpinnerProgressDialog(
+ this, R.string.settings_backup_now_progress_message, new DialogInterface.OnCancelListener() {
+ @Override
+ public void onCancel(DialogInterface dialog) {
+ finish();
+ }
+ });
}
- return DialogUtils.createSpinnerProgressDialog(
- this, R.string.settings_backup_now_progress_message, new DialogInterface.OnCancelListener() {
- @Override
- public void onCancel(DialogInterface dialog) {
- finish();
- }
- });
- }
- /**
- * Invokes when the associated AsyncTask completes.
- *
- * @param success true if the AsyncTask is successful
- * @param messageId message id to display to user
- */
- public void onAsyncTaskCompleted(boolean success, int messageId) {
- removeDialog(DIALOG_PROGRESS_ID);
- Toast.makeText(this, messageId, success ? Toast.LENGTH_SHORT : Toast.LENGTH_LONG).show();
- finish();
- }
+ /**
+ * Invokes when the associated AsyncTask completes.
+ *
+ * @param success true if the AsyncTask is successful
+ * @param messageId message id to display to user
+ */
+ public void onAsyncTaskCompleted(boolean success, int messageId) {
+ removeDialog(DIALOG_PROGRESS_ID);
+ Toast.makeText(this, messageId, success ? Toast.LENGTH_SHORT : Toast.LENGTH_LONG).show();
+ finish();
+ }
- /**
- * Shows the progress dialog.
- */
- public void showProgressDialog() {
- showDialog(DIALOG_PROGRESS_ID);
- }
+ /**
+ * Shows the progress dialog.
+ */
+ public void showProgressDialog() {
+ showDialog(DIALOG_PROGRESS_ID);
+ }
}
diff --git a/vdrmanager/de.bjusystems.vdrmanager/src/main/java/de/bjusystems/vdrmanager/backup/BackupSettingsActivity.java b/vdrmanager/de.bjusystems.vdrmanager/src/main/java/de/bjusystems/vdrmanager/backup/BackupSettingsActivity.java
index e906a20..680e58a 100644
--- a/vdrmanager/de.bjusystems.vdrmanager/src/main/java/de/bjusystems/vdrmanager/backup/BackupSettingsActivity.java
+++ b/vdrmanager/de.bjusystems.vdrmanager/src/main/java/de/bjusystems/vdrmanager/backup/BackupSettingsActivity.java
@@ -17,93 +17,119 @@
package de.bjusystems.vdrmanager.backup;
+import android.Manifest;
import android.app.Dialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
+import android.content.pm.PackageManager;
import android.os.Bundle;
import android.preference.Preference;
import android.preference.Preference.OnPreferenceClickListener;
import android.preference.PreferenceManager;
+import android.support.v4.content.ContextCompat;
+import android.widget.Toast;
+
import de.bjusystems.vdrmanager.R;
+import de.bjusystems.vdrmanager.gui.Utils;
/**
* An activity for accessing the backup settings.
- *
+ *
* @author Jimmy Shih
*/
public class BackupSettingsActivity extends AbstractSettingsActivity {
- private static final int DIALOG_CONFIRM_RESTORE_ID = 0;
+ private static final int DIALOG_CONFIRM_RESTORE_ID = 0;
+
- Preference backupPreference;
- Preference restorePreference;
+ /**
+ * The Backup preference.
+ */
+ Preference backupPreference;
+ /**
+ * The Restore preference.
+ */
+ Preference restorePreference;
- /*
- * Note that sharedPreferenceChangeListenr cannot be an anonymous inner class.
- * Anonymous inner class will get garbage collected.
- */
- private final OnSharedPreferenceChangeListener
- sharedPreferenceChangeListener = new OnSharedPreferenceChangeListener() {
+ /*
+ * Note that sharedPreferenceChangeListenr cannot be an anonymous inner class.
+ * Anonymous inner class will get garbage collected.
+ */
+ private final OnSharedPreferenceChangeListener
+ sharedPreferenceChangeListener = new OnSharedPreferenceChangeListener() {
@Override
public void onSharedPreferenceChanged(SharedPreferences preferences, String key) {
- // Note that key can be null
- //if (PreferencesUtils.getKey(BackupSettingsActivity.this, R.string.recording_track_id_key)
+ // Note that key can be null
+ //if (PreferencesUtils.getKey(BackupSettingsActivity.this, R.string.recording_track_id_key)
// .equals(key)) {
//updateUi();
- //}
+ //}
}
- };
-
- @SuppressWarnings("deprecation")
- @Override
- protected void onCreate(Bundle bundle) {
- super.onCreate(bundle);
- PreferenceManager.getDefaultSharedPreferences(this)
- .registerOnSharedPreferenceChangeListener(sharedPreferenceChangeListener);
-
- addPreferencesFromResource(R.xml.backup_settings);
- backupPreference = findPreference(getString(R.string.settings_backup_now_key));
- backupPreference.setOnPreferenceClickListener(new OnPreferenceClickListener() {
- @Override
- public boolean onPreferenceClick(Preference preference) {
- Intent intent = IntentUtils.newIntent(BackupSettingsActivity.this, BackupActivity.class);
- startActivity(intent);
- return true;
- }
- });
- restorePreference = findPreference(getString(R.string.settings_backup_restore_key));
- restorePreference.setOnPreferenceClickListener(new OnPreferenceClickListener() {
- @Override
- public boolean onPreferenceClick(Preference preference) {
- showDialog(DIALOG_CONFIRM_RESTORE_ID);
- return true;
- }
- });
- }
-
- @Override
- protected Dialog onCreateDialog(int id) {
- if (id != DIALOG_CONFIRM_RESTORE_ID) {
- return null;
- }
- return DialogUtils.createConfirmationDialog(this,
- R.string.settings_backup_restore_confirm_message, new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) {
- Intent intent = IntentUtils.newIntent(
- BackupSettingsActivity.this, RestoreChooserActivity.class);
- startActivity(intent);
- }
+ };
+
+ @SuppressWarnings("deprecation")
+ @Override
+ protected void onCreate(Bundle bundle) {
+ super.onCreate(bundle);
+
+ final boolean permissionGranted = ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED;
+
+ PreferenceManager.getDefaultSharedPreferences(this)
+ .registerOnSharedPreferenceChangeListener(sharedPreferenceChangeListener);
+
+ addPreferencesFromResource(R.xml.backup_settings);
+ backupPreference = findPreference(getString(R.string.settings_backup_now_key));
+ backupPreference.setOnPreferenceClickListener(new OnPreferenceClickListener() {
+ @Override
+ public boolean onPreferenceClick(Preference preference) {
+ if (permissionGranted == false) {
+ Utils.say(getApplication(), R.string.permission_rationale, Toast.LENGTH_LONG);
+ return false;
+ }
+ Intent intent = IntentUtils.newIntent(BackupSettingsActivity.this, BackupActivity.class);
+ startActivity(intent);
+ return true;
+ }
+ });
+ restorePreference = findPreference(getString(R.string.settings_backup_restore_key));
+ restorePreference.setOnPreferenceClickListener(new OnPreferenceClickListener() {
+ @Override
+ public boolean onPreferenceClick(Preference preference) {
+ if (permissionGranted == false) {
+ Utils.say(getApplication(), R.string.permission_rationale, Toast.LENGTH_LONG);
+ return false;
+ }
+ showDialog(DIALOG_CONFIRM_RESTORE_ID);
+ return true;
+ }
});
- }
- @Override
- protected void onResume() {
- super.onResume();
- //updateUi();
- }
+
+ }
+
+ @Override
+ protected Dialog onCreateDialog(int id) {
+ if (id != DIALOG_CONFIRM_RESTORE_ID) {
+ return null;
+ }
+ return DialogUtils.createConfirmationDialog(this,
+ R.string.settings_backup_restore_confirm_message, new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ Intent intent = IntentUtils.newIntent(
+ BackupSettingsActivity.this, RestoreChooserActivity.class);
+ startActivity(intent);
+ }
+ });
+ }
+
+ @Override
+ protected void onResume() {
+ super.onResume();
+ //updateUi();
+ }
// /**
// * Updates the UI based on the recording state.
diff --git a/vdrmanager/de.bjusystems.vdrmanager/src/main/java/de/bjusystems/vdrmanager/gui/PreferencesActivity.java b/vdrmanager/de.bjusystems.vdrmanager/src/main/java/de/bjusystems/vdrmanager/gui/PreferencesActivity.java
index e8ae690..4dce431 100644
--- a/vdrmanager/de.bjusystems.vdrmanager/src/main/java/de/bjusystems/vdrmanager/gui/PreferencesActivity.java
+++ b/vdrmanager/de.bjusystems.vdrmanager/src/main/java/de/bjusystems/vdrmanager/gui/PreferencesActivity.java
@@ -10,7 +10,6 @@ import android.preference.Preference.OnPreferenceChangeListener;
import android.preference.Preference.OnPreferenceClickListener;
import android.preference.PreferenceManager;
import de.bjusystems.vdrmanager.R;
-import de.bjusystems.vdrmanager.app.VdrManagerApp;
import de.bjusystems.vdrmanager.backup.BackupSettingsActivity;
import de.bjusystems.vdrmanager.data.Preferences;
diff --git a/vdrmanager/de.bjusystems.vdrmanager/src/main/java/de/bjusystems/vdrmanager/gui/Utils.java b/vdrmanager/de.bjusystems.vdrmanager/src/main/java/de/bjusystems/vdrmanager/gui/Utils.java
index d7e262b..a880fcf 100644
--- a/vdrmanager/de.bjusystems.vdrmanager/src/main/java/de/bjusystems/vdrmanager/gui/Utils.java
+++ b/vdrmanager/de.bjusystems.vdrmanager/src/main/java/de/bjusystems/vdrmanager/gui/Utils.java
@@ -26,6 +26,7 @@ import android.util.Log;
import android.util.Pair;
import android.view.Gravity;
import android.widget.Toast;
+
import de.bjusystems.vdrmanager.R;
import de.bjusystems.vdrmanager.StringUtils;
import de.bjusystems.vdrmanager.app.C;
@@ -46,731 +47,733 @@ import de.bjusystems.vdrmanager.utils.svdrp.SwitchChannelClient;
public class Utils {
- public static final String TAG = Utils.class.getName();
-
- public static final List EMPTY_LIST = new ArrayList(0);
- public static final String[] EMPTY = new String[] {};
- public static final ForegroundColorSpan HIGHLIGHT_TEXT = new ForegroundColorSpan(
-
- Color.RED);
-
- public static CharSequence highlight(final String where, String what) {
- if (TextUtils.isEmpty(what)) {
- return where;
- }
-
- final String str = where.toLowerCase();
- what = what.toLowerCase();
- final int idx = str.indexOf(what);
- if (idx == -1) {
- return where;
- }
- final SpannableString ss = new SpannableString(where);
- ss.setSpan(HIGHLIGHT_TEXT, idx, idx + what.length(),
- Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
- return ss;
- }
-
- public static Pair<Boolean, CharSequence> highlight2(final String where,
- String what) {
- if (TextUtils.isEmpty(what)) {
- return Pair.create(Boolean.FALSE, (CharSequence) where);
- }
-
- final String str = where.toLowerCase();
- what = what.toLowerCase();
- final int idx = str.indexOf(what);
- if (idx == -1) {
- return Pair.create(Boolean.FALSE, (CharSequence) where);
- }
- final SpannableString ss = new SpannableString(where);
- ss.setSpan(HIGHLIGHT_TEXT, idx, idx + what.length(),
- Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
- return Pair.create(Boolean.TRUE, (CharSequence) ss);
- }
-
- public static int getProgress(final Date start, final Date stop) {
- final long now = System.currentTimeMillis();
- return getProgress(now, start.getTime(), stop.getTime());
- }
-
- public static int getProgress(final Event e) {
- if (e instanceof Recording == false) {
- return getProgress(e.getStart(), e.getStop());
- }
- final Recording r = ((Recording) e);
- if (r.getTimerStopTime() == null) {
- return getProgress(e.getStart(), e.getStop());
- }
- return getProgress(r.getStart(), r.getTimerStopTime());
-
- }
-
- /**
- * @param now
- * @param time
- * @param time2
- * @return -1, is not not between start stop,
- */
- private static int getProgress(final long now, final long start,
- final long stop) {
- if (now >= start && now <= stop) {
- final long dura = stop - start;
- final long prog = now - start;
- return (int) (prog * 100 / dura);
- }
- return -1;
- }
-
- public static boolean isLive(final Event event) {
- final long now = System.currentTimeMillis();
- return now >= event.getStart().getTime()
- && now <= event.getStop().getTime();
- }
-
- private static String trimToEmpty(final String str) {
- if (str == null) {
- return "";
- }
- if (TextUtils.isEmpty(str)) {
- return "";
- }
- return str;
- }
-
- private static String getBaseUrl() {
- final StringBuilder sb = new StringBuilder();
- final Preferences p = Preferences.get();
- String auth = trimToEmpty(p.getStreamingUsername()) + ":"
- + trimToEmpty(p.getStreamingPassword());
- if (auth.length() == 1) {
- auth = "";
- } else {
- auth += "@";
- }
-
- sb.append("http://").append(auth).append(p.getHost()).append(":")
- .append(p.getStreamPort());
- return sb.toString();
- }
-
- private static String getStreamUrl(final String chn) {
- // "http://192.168.1.119:3000/TS/"
- final Preferences p = Preferences.get();
- final StringBuilder sb = new StringBuilder();
- sb.append(getBaseUrl()).append("/").append(p.getStreamFormat())
- .append("/").append(chn);
-
- return sb.toString();
- }
-
- private static String getRemuxStreamUrl(final String chn) {
- // "http://192.168.1.119:3000/TS/"
- final StringBuilder sb = new StringBuilder();
- final Preferences p = Preferences.get();
- sb.append(getBaseUrl()).append("/").append(p.getRemuxCommand())
- .append(";").append(p.getRemuxParameter()).append("/")
- .append(chn);
- return sb.toString();
- }
-
- public static void stream(final Activity activity, final Event event) {
- stream(activity, event.getStreamId());
- }
-
- public static void stream(final Activity activity, final Channel channel) {
- stream(activity, channel.getId());
- }
-
- public static void stream(final Activity activity, final String idornr) {
-
- if (Preferences.get().isEnableRemux() == false) {
- final String url = getStreamUrl(idornr);
- startStream(activity, url);
- return;
- }
-
- final String sf = Preferences.get().getStreamFormat();
- final String ext = activity.getString(R.string.remux_title);
- new AlertDialog.Builder(activity)
- .setTitle(R.string.stream_via_as)
- //
- .setItems(
- new String[] {
- activity.getString(R.string.stream_as, sf),
- activity.getString(R.string.stream_via, ext) },// TODO
- // add
- // here
- // what
- // will
- // be
- // used
- new DialogInterface.OnClickListener() {
- @Override
- public void onClick(final DialogInterface dialog,
- final int which) {
- String url = null;
- switch (which) {
- case 0:
- url = getStreamUrl(idornr);
- break;
- case 1:
- url = getRemuxStreamUrl(idornr);
- break;
- }
- startStream(activity, url);
- }
- }).create().show();
- }
-
- public static void startStream(final Activity activity, final String url) {
- try {
- final Intent intent = new Intent(Intent.ACTION_VIEW);
- intent.setDataAndType(Uri.parse(url.toString()), "video/*");
- activity.startActivityForResult(intent, 1);
- } catch (final ActivityNotFoundException anfe) {
- Log.w(TAG, anfe);
- Toast.makeText(activity, anfe.getLocalizedMessage(),
- Toast.LENGTH_SHORT).show();
- }
- }
-
- public static final String md5(final String s) {
- try {
- // Create MD5 Hash
- final MessageDigest digest = java.security.MessageDigest
- .getInstance("MD5");
- digest.update(s.getBytes());
- final byte messageDigest[] = digest.digest();
-
- // Create Hex String
- final StringBuffer hexString = new StringBuffer();
- for (int i = 0; i < messageDigest.length; i++) {
- String h = Integer.toHexString(0xFF & messageDigest[i]);
- while (h.length() < 2) {
- h = "0" + h;
- }
- hexString.append(h);
- }
- return hexString.toString();
-
- } catch (final NoSuchAlgorithmException e) {
- Log.w(TAG, e);
- }
- return "";
- }
-
- public static int getDuration(final Event event) {
- final long millis = event.getDuration();
- final int minuts = (int) (millis / 1000 / 60);
- return minuts;
- }
-
- public static void shareEvent(final Activity activity, final Event event) {
- final Intent share = new Intent(android.content.Intent.ACTION_SEND);
- share.setType("text/plain");
- StringBuilder sb = new StringBuilder();
- sb.append(event.getTitle());
- sb.append("\n");
- final EventFormatter ef = new EventFormatter(event, false);
- sb.append(ef.getDate()).append(" ").append(ef.getTime());
- final String title = sb.toString();
- share.putExtra(android.content.Intent.EXTRA_SUBJECT, sb.toString());
- sb = new StringBuilder();
- sb.append(title).append("\n\n");
- sb.append(event.getChannelNumber() + " " + event.getChannelName());
- sb.append("\n\n");
- sb.append(ef.getShortText());
- sb.append("\n\n");
- sb.append(ef.getDescription());
- sb.append("\n");
- share.putExtra(android.content.Intent.EXTRA_TEXT, sb.toString());
- activity.startActivity(Intent.createChooser(share,
- activity.getString(R.string.share_chooser)));
- }
-
- public static void addCalendarEvent(final Activity activity,
- final Event event) {
- final Intent intent = new Intent(Intent.ACTION_EDIT);
- intent.setType("vnd.android.cursor.item/event");
- intent.putExtra("title", event.getTitle());
- intent.putExtra("description", event.getShortText());
- intent.putExtra("beginTime", event.getStart().getTime());
- intent.putExtra("endTime", event.getStop().getTime());
- activity.startActivity(intent);
- }
-
- public static String mapSpecialChars(final String src) {
- if (src == null) {
- return "";
- }
- return src.replace("|##", C.DATA_SEPARATOR).replace("||#", "\n");
- }
-
- public static String unMapSpecialChars(final String src) {
- if (src == null) {
- return "";
- }
- return src.replace(C.DATA_SEPARATOR, "|##").replace("\n", "||#");
- }
-
- public static PackageInfo getPackageInfo(final Context ctx) {
- PackageInfo pi = null;
- try {
- pi = ctx.getPackageManager().getPackageInfo(ctx.getPackageName(),
- PackageManager.GET_ACTIVITIES);
- } catch (final PackageManager.NameNotFoundException e) {
- e.printStackTrace();
- }
- return pi;
- }
-
- public static boolean checkInternetConnection(final Context ctx) {
- final ConnectivityManager cm = (ConnectivityManager) ctx
- .getSystemService(Context.CONNECTIVITY_SERVICE);
- // test for connection
- if (cm.getActiveNetworkInfo() != null
- && cm.getActiveNetworkInfo().isConnectedOrConnecting()) {
- return true;
- }
- return false;
- }
-
- private static String getRecordingStream(final Activity ctx,
- final Recording rec) {
-
-
- Preferences prefs = Preferences.get();
-
- final String m = prefs.getRecStreamMethod();
-
- final StringBuilder url = new StringBuilder();
-
- if (StringUtils.equals(m, "vdr-live")) {
- url.append("http://")
- .append(prefs.getHost())
- //
- .append(":")
- .append(Integer.valueOf(prefs.getLivePort()))
- //
- .append("/recstream.html?recid=recording_")
- .append(Utils.md5(rec.getFileName()));
- // http://192.168.1.119:8008/b0cdedeed2d36508dfd924f0876a851b
- final String urlstring = url.toString();
- return urlstring;
- } else if (StringUtils.equals(m, "vdr-streamdev")) {
- url.append("http://").append(prefs.getHost())
- //
- .append(":")
- .append(Integer.valueOf(
- prefs.getStreamPort()))
- //
- .append("/").append(rec.getDevInode());
- } else if (StringUtils.equals(m, "vdr-smarttvweb")) {
-
- String type = prefs.getSmarttvewebType();
-
- url.append("http://")
- .append(prefs.getHost())
- //
- .append(":")
- .append(Integer.valueOf(prefs
- .getSmarttvewebPort()))
- //
- .append(Utils.encodeUrlPath(rec.getFileName()));
- if (StringUtils.equals(type, "has") == true) {
- url.append("/manifest-seg.mpd");
- } else if (StringUtils.equals(type, "hls")) {
- url.append("/manifest-seg.m3u8");
- }
- }
- return url.toString();
- }
-
- public static void streamRecording(final Activity ctx, final Recording rec) {
- final String urlstring = getRecordingStream(ctx, rec);
- Log.d(TAG, "try stream: " + urlstring);
- Utils.startStream(ctx, urlstring);
- }
-
- public static void switchTo(final Activity activity, final Channel channel) {
- switchTo(activity, channel.getId(), channel.getName());
- }
-
- /**
- * @param ctx
- * @param id
- * @param name
- * Optional für die Anzeige
- */
- public static void switchTo(final Activity activity, final String id,
- final String name) {
-
- final SwitchChannelClient scc = new SwitchChannelClient(id,
- new CertificateProblemDialog(activity));
- final SvdrpAsyncTask<String, SwitchChannelClient> task = new SvdrpAsyncTask<String, SwitchChannelClient>(
- scc);
- task.addSvdrpListener(new SvdrpListener() {
- @Override
- public void svdrpEvent(final SvdrpEvent event) {
- if (event == SvdrpEvent.FINISHED_SUCCESS) {
- Utils.say(activity, activity.getString(
- R.string.switching_success, (name != null ? name
- : id)));
- } else if (event == SvdrpEvent.CONNECT_ERROR
- || event == SvdrpEvent.FINISHED_ABNORMALY
- || event == SvdrpEvent.ABORTED
- || event == SvdrpEvent.ERROR
- || event == SvdrpEvent.CACHE_HIT) {
- Utils.say(activity, activity.getString(
- R.string.switching_failed, (name != null ? name
- : id), event.name()));
- }
- }
-
- public void svdrpException(final SvdrpException e) {
- Log.w(TAG, e.getMessage(), e);
- Utils.say(activity, e.getMessage());
- }
- });
- task.run();
- }
-
- public static void say(final Context ctx, final String msg) {
- final Toast t = Toast.makeText(ctx, msg, Toast.LENGTH_SHORT);
- t.setGravity(Gravity.CENTER, 0, 0);
- t.show();
- }
- public static String encodeUrlPath(String path){
- return path.replaceAll("%", "%25");
- }
-
- public static void say(final Context ctx, final int msg) {
- final Toast t = Toast.makeText(ctx, msg, Toast.LENGTH_SHORT);
- t.setGravity(Gravity.CENTER, 0, 0);
- t.show();
- }
-
- /**
- * Formats the date and time based on user's phone date/time preferences.
- *
- * @param context
- * the context
- * @param time
- * the time in milliseconds
- */
-
- public static String formatDateTime(final Context context, final long time) {
- return android.text.format.DateFormat.getDateFormat(context).format(
- time)
- + " "
- + DateUtils.formatDateTime(context, time,
- DateUtils.FORMAT_SHOW_TIME).toString();
- }
-
- public static int getTimerStateDrawable(final TimerMatch match,
- final int full, final int begin, final int end, final int conflict) {
-
- switch (match) {
- case Begin:
- return begin;
- case End:
- return end;
- case Conflict:
- return conflict;
- default:
- return full;
- }
- }
-
- public static String formatAudio(final Context context,
- final List<AudioTrack> tracks) {
-
- final StringBuilder sb = new StringBuilder();
-
- String sep = "";
- for (final AudioTrack a : tracks) {
- sb.append(sep).append(a.display);
- if (a.type.equals("d")) {
- sb.append(" (")
- .append(context.getString(R.string.audio_track_dolby))
- .append(")");
- }
- sep = ", ";
- }
- return sb.toString();
-
- }
-
- public static TimerMatch getTimerMatch(Event event, Timer timer) {
- if (timer == null) {
- return null;
- }
- TimerMatch timerMatch = null;
- Date start = event.getStart();
- Date stop = event.getStop();
- if (start.before(timer.getStart())) {
- timerMatch = TimerMatch.End;
- } else if (stop.after(timer.getStop())) {
- timerMatch = TimerMatch.Begin;
- } else {
- timerMatch = TimerMatch.Full;
- }
- return timerMatch;
- }
-
- public static int contentToString(int c) {
- ;
- switch (c & 0xF0) {
- case EventContentGroup.MovieDrama:
- switch (c & 0x0F) {
- default:
- case 0x00:
- return R.string.Content_Movie__Drama;
- case 0x01:
- return R.string.Content_Detective__Thriller;
- case 0x02:
- return R.string.Content_Adventure__Western__War;
- case 0x03:
- return R.string.Content_Science_Fiction__Fantasy__Horror;
- case 0x04:
- return R.string.Content_Comedy;
- case 0x05:
- return R.string.Content_Soap__Melodrama__Folkloric;
- case 0x06:
- return R.string.Content_Romance;
- case 0x07:
- return R.string.Content_Serious__Classical__Religious__Historical_Movie__Drama;
- case 0x08:
- return R.string.Content_Adult_Movie__Drama;
- }
- case EventContentGroup.NewsCurrentAffairs:
- switch (c & 0x0F) {
- default:
- case 0x00:
- return R.string.Content_News__Current_Affairs;
- case 0x01:
- return R.string.Content_News__Weather_Report;
- case 0x02:
- return R.string.Content_News_Magazine;
- case 0x03:
- return R.string.Content_Documentary;
- case 0x04:
- return R.string.Content_Discussion__Inverview__Debate;
- }
-
- case EventContentGroup.Show:
- switch (c & 0x0F) {
- default:
- case 0x00:
- return R.string.Content_Show__Game_Show;
- case 0x01:
- return R.string.Content_Game_Show__Quiz__Contest;
- case 0x02:
- return R.string.Content_Variety_Show;
- case 0x03:
- return R.string.Content_Talk_Show;
- }
-
- case EventContentGroup.Sports:
- switch (c & 0x0F) {
- default:
- case 0x00:
- return R.string.Content_Sports;
- case 0x01:
- return R.string.Content_Special_Event;
- case 0x02:
- return R.string.Content_Sport_Magazine;
- case 0x03:
- return R.string.Content_Football__Soccer;
- case 0x04:
- return R.string.Content_Tennis__Squash;
- case 0x05:
- return R.string.Content_Team_Sports;
- case 0x06:
- return R.string.Content_Athletics;
- case 0x07:
- return R.string.Content_Motor_Sport;
- case 0x08:
- return R.string.Content_Water_Sport;
- case 0x09:
- return R.string.Content_Winter_Sports;
- case 0x0A:
- return R.string.Content_Equestrian;
- case 0x0B:
- return R.string.Content_Martial_Sports;
- }
-
- case EventContentGroup.ChildrenYouth:
- switch (c & 0x0F) {
- default:
- case 0x00:
- return R.string.Content_Childrens__Youth_Programme;
- case 0x01:
- return R.string.Content_Preschool_Childrens_Programme;
- case 0x02:
- return R.string.Content_Entertainment_Programme_for_6_to_14;
- case 0x03:
- return R.string.Content_Entertainment_Programme_for_10_to_16;
- case 0x04:
- return R.string.Content_Informational__Educational__School_Programme;
- case 0x05:
- return R.string.Content_Cartoons__Puppets;
- }
-
- case EventContentGroup.MusicBalletDance:
- switch (c & 0x0F) {
- default:
- case 0x00:
- return R.string.Content_Music__Ballet__Dance;
- case 0x01:
- return R.string.Content_Rock__Pop;
- case 0x02:
- return R.string.Content_Serious__Classical_Music;
- case 0x03:
- return R.string.Content_Folk__Tradional_Music;
- case 0x04:
- return R.string.Content_Jazz;
- case 0x05:
- return R.string.Content_Musical__Opera;
- case 0x06:
- return R.string.Content_Ballet;
- }
-
- case EventContentGroup.ArtsCulture:
- switch (c & 0x0F) {
- default:
- case 0x00:
- return R.string.Content_Arts__Culture;
- case 0x01:
- return R.string.Content_Performing_Arts;
- case 0x02:
- return R.string.Content_Fine_Arts;
- case 0x03:
- return R.string.Content_Religion;
- case 0x04:
- return R.string.Content_Popular_Culture__Traditional_Arts;
- case 0x05:
- return R.string.Content_Literature;
- case 0x06:
- return R.string.Content_Film__Cinema;
- case 0x07:
- return R.string.Content_Experimental_Film__Video;
- case 0x08:
- return R.string.Content_Broadcasting__Press;
- case 0x09:
- return R.string.Content_New_Media;
- case 0x0A:
- return R.string.Content_Arts__Culture_Magazine;
- case 0x0B:
- return R.string.Content_Fashion;
- }
-
- case EventContentGroup.SocialPoliticalEconomics:
- switch (c & 0x0F) {
- default:
- case 0x00:
- return R.string.Content_Social__Political__Economics;
- case 0x01:
- return R.string.Content_Magazine__Report__Documentary;
- case 0x02:
- return R.string.Content_Economics__Social_Advisory;
- case 0x03:
- return R.string.Content_Remarkable_People;
- }
-
- case EventContentGroup.EducationalScience:
- switch (c & 0x0F) {
- default:
- case 0x00:
- return R.string.Content_Education__Science__Factual;
- case 0x01:
- return R.string.Content_Nature__Animals__Environment;
- case 0x02:
- return R.string.Content_Technology__Natural_Sciences;
- case 0x03:
- return R.string.Content_Medicine__Physiology__Psychology;
- case 0x04:
- return R.string.Content_Foreign_Countries__Expeditions;
- case 0x05:
- return R.string.Content_Social__Spiritual_Sciences;
- case 0x06:
- return R.string.Content_Further_Education;
- case 0x07:
- return R.string.Content_Languages;
- }
-
- case EventContentGroup.LeisureHobbies:
- switch (c & 0x0F) {
- default:
- case 0x00:
- return R.string.Content_Leisure__Hobbies;
- case 0x01:
- return R.string.Content_Tourism__Travel;
- case 0x02:
- return R.string.Content_Handicraft;
- case 0x03:
- return R.string.Content_Motoring;
- case 0x04:
- return R.string.Content_Fitness_and_Health;
- case 0x05:
- return R.string.Content_Cooking;
- case 0x06:
- return R.string.Content_Advertisement__Shopping;
- case 0x07:
- return R.string.Content_Gardening;
- }
- case EventContentGroup.Special:
- switch (c & 0x0F) {
- case 0x00:
- return R.string.Content_Original_Language;
- case 0x01:
- return R.string.Content_Black_and_White;
- case 0x02:
- return R.string.Content_Unpublished;
- case 0x03:
- return R.string.Content_Live_Broadcast;
- default:
- ;
- }
- break;
- default:
- ;
- }
- return R.string.Content_Unknown;
- }
-
- public static String getContenString(Context ctx, int[] contents) {
-
- if (contents.length == 0) {
- return "";
- }
-
- StringBuilder sb = new StringBuilder();
-
- String sep = "";
-
- for (int content : contents) {
-
- sb.append(sep).append(ctx.getString(contentToString(content)));
- sep = ", ";
- }
-
- return sb.toString();
- }
-
- public static boolean isSerie(int[] contents) {
- if (contents.length == 0) {
- return false;
- }
-
- for (int c : contents) {
- if (c == 21) {
- return true;
-
- }
- }
-
- return false;
- }
+ public static final String TAG = Utils.class.getName();
+
+ public static final List EMPTY_LIST = new ArrayList(0);
+ public static final String[] EMPTY = new String[]{};
+ public static final ForegroundColorSpan HIGHLIGHT_TEXT = new ForegroundColorSpan(
+
+ Color.RED);
+
+ public static CharSequence highlight(final String where, String what) {
+ if (TextUtils.isEmpty(what)) {
+ return where;
+ }
+
+ final String str = where.toLowerCase();
+ what = what.toLowerCase();
+ final int idx = str.indexOf(what);
+ if (idx == -1) {
+ return where;
+ }
+ final SpannableString ss = new SpannableString(where);
+ ss.setSpan(HIGHLIGHT_TEXT, idx, idx + what.length(),
+ Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
+ return ss;
+ }
+
+ public static Pair<Boolean, CharSequence> highlight2(final String where,
+ String what) {
+ if (TextUtils.isEmpty(what)) {
+ return Pair.create(Boolean.FALSE, (CharSequence) where);
+ }
+
+ final String str = where.toLowerCase();
+ what = what.toLowerCase();
+ final int idx = str.indexOf(what);
+ if (idx == -1) {
+ return Pair.create(Boolean.FALSE, (CharSequence) where);
+ }
+ final SpannableString ss = new SpannableString(where);
+ ss.setSpan(HIGHLIGHT_TEXT, idx, idx + what.length(),
+ Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
+ return Pair.create(Boolean.TRUE, (CharSequence) ss);
+ }
+
+ public static int getProgress(final Date start, final Date stop) {
+ final long now = System.currentTimeMillis();
+ return getProgress(now, start.getTime(), stop.getTime());
+ }
+
+ public static int getProgress(final Event e) {
+ if (e instanceof Recording == false) {
+ return getProgress(e.getStart(), e.getStop());
+ }
+ final Recording r = ((Recording) e);
+ if (r.getTimerStopTime() == null) {
+ return getProgress(e.getStart(), e.getStop());
+ }
+ return getProgress(r.getStart(), r.getTimerStopTime());
+
+ }
+
+ /**
+ * @param now
+ * @param time
+ * @param time2
+ * @return -1, is not not between start stop,
+ */
+ private static int getProgress(final long now, final long start,
+ final long stop) {
+ if (now >= start && now <= stop) {
+ final long dura = stop - start;
+ final long prog = now - start;
+ return (int) (prog * 100 / dura);
+ }
+ return -1;
+ }
+
+ public static boolean isLive(final Event event) {
+ final long now = System.currentTimeMillis();
+ return now >= event.getStart().getTime()
+ && now <= event.getStop().getTime();
+ }
+
+ private static String trimToEmpty(final String str) {
+ if (str == null) {
+ return "";
+ }
+ if (TextUtils.isEmpty(str)) {
+ return "";
+ }
+ return str;
+ }
+
+ private static String getBaseUrl() {
+ final StringBuilder sb = new StringBuilder();
+ final Preferences p = Preferences.get();
+ String auth = trimToEmpty(p.getStreamingUsername()) + ":"
+ + trimToEmpty(p.getStreamingPassword());
+ if (auth.length() == 1) {
+ auth = "";
+ } else {
+ auth += "@";
+ }
+
+ sb.append("http://").append(auth).append(p.getHost()).append(":")
+ .append(p.getStreamPort());
+ return sb.toString();
+ }
+
+ private static String getStreamUrl(final String chn) {
+ // "http://192.168.1.119:3000/TS/"
+ final Preferences p = Preferences.get();
+ final StringBuilder sb = new StringBuilder();
+ sb.append(getBaseUrl()).append("/").append(p.getStreamFormat())
+ .append("/").append(chn);
+
+ return sb.toString();
+ }
+
+ private static String getRemuxStreamUrl(final String chn) {
+ // "http://192.168.1.119:3000/TS/"
+ final StringBuilder sb = new StringBuilder();
+ final Preferences p = Preferences.get();
+ sb.append(getBaseUrl()).append("/").append(p.getRemuxCommand())
+ .append(";").append(p.getRemuxParameter()).append("/")
+ .append(chn);
+ return sb.toString();
+ }
+
+ public static void stream(final Activity activity, final Event event) {
+ stream(activity, event.getStreamId());
+ }
+
+ public static void stream(final Activity activity, final Channel channel) {
+ stream(activity, channel.getId());
+ }
+
+ public static void stream(final Activity activity, final String idornr) {
+
+ if (Preferences.get().isEnableRemux() == false) {
+ final String url = getStreamUrl(idornr);
+ startStream(activity, url);
+ return;
+ }
+
+ final String sf = Preferences.get().getStreamFormat();
+ final String ext = activity.getString(R.string.remux_title);
+ new AlertDialog.Builder(activity)
+ .setTitle(R.string.stream_via_as)
+ //
+ .setItems(
+ new String[]{
+ activity.getString(R.string.stream_as, sf),
+ activity.getString(R.string.stream_via, ext)},// TODO
+ // add
+ // here
+ // what
+ // will
+ // be
+ // used
+ new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(final DialogInterface dialog,
+ final int which) {
+ String url = null;
+ switch (which) {
+ case 0:
+ url = getStreamUrl(idornr);
+ break;
+ case 1:
+ url = getRemuxStreamUrl(idornr);
+ break;
+ }
+ startStream(activity, url);
+ }
+ }).create().show();
+ }
+
+ public static void startStream(final Activity activity, final String url) {
+ try {
+ final Intent intent = new Intent(Intent.ACTION_VIEW);
+ intent.setDataAndType(Uri.parse(url.toString()), "video/*");
+ activity.startActivityForResult(intent, 1);
+ } catch (final ActivityNotFoundException anfe) {
+ Log.w(TAG, anfe);
+ Toast.makeText(activity, anfe.getLocalizedMessage(),
+ Toast.LENGTH_SHORT).show();
+ }
+ }
+
+ public static final String md5(final String s) {
+ try {
+ // Create MD5 Hash
+ final MessageDigest digest = java.security.MessageDigest
+ .getInstance("MD5");
+ digest.update(s.getBytes());
+ final byte messageDigest[] = digest.digest();
+
+ // Create Hex String
+ final StringBuffer hexString = new StringBuffer();
+ for (int i = 0; i < messageDigest.length; i++) {
+ String h = Integer.toHexString(0xFF & messageDigest[i]);
+ while (h.length() < 2) {
+ h = "0" + h;
+ }
+ hexString.append(h);
+ }
+ return hexString.toString();
+
+ } catch (final NoSuchAlgorithmException e) {
+ Log.w(TAG, e);
+ }
+ return "";
+ }
+
+ public static int getDuration(final Event event) {
+ final long millis = event.getDuration();
+ final int minuts = (int) (millis / 1000 / 60);
+ return minuts;
+ }
+
+ public static void shareEvent(final Activity activity, final Event event) {
+ final Intent share = new Intent(android.content.Intent.ACTION_SEND);
+ share.setType("text/plain");
+ StringBuilder sb = new StringBuilder();
+ sb.append(event.getTitle());
+ sb.append("\n");
+ final EventFormatter ef = new EventFormatter(event, false);
+ sb.append(ef.getDate()).append(" ").append(ef.getTime());
+ final String title = sb.toString();
+ share.putExtra(android.content.Intent.EXTRA_SUBJECT, sb.toString());
+ sb = new StringBuilder();
+ sb.append(title).append("\n\n");
+ sb.append(event.getChannelNumber() + " " + event.getChannelName());
+ sb.append("\n\n");
+ sb.append(ef.getShortText());
+ sb.append("\n\n");
+ sb.append(ef.getDescription());
+ sb.append("\n");
+ share.putExtra(android.content.Intent.EXTRA_TEXT, sb.toString());
+ activity.startActivity(Intent.createChooser(share,
+ activity.getString(R.string.share_chooser)));
+ }
+
+ public static void addCalendarEvent(final Activity activity,
+ final Event event) {
+ final Intent intent = new Intent(Intent.ACTION_EDIT);
+ intent.setType("vnd.android.cursor.item/event");
+ intent.putExtra("title", event.getTitle());
+ intent.putExtra("description", event.getShortText());
+ intent.putExtra("beginTime", event.getStart().getTime());
+ intent.putExtra("endTime", event.getStop().getTime());
+ activity.startActivity(intent);
+ }
+
+ public static String mapSpecialChars(final String src) {
+ if (src == null) {
+ return "";
+ }
+ return src.replace("|##", C.DATA_SEPARATOR).replace("||#", "\n");
+ }
+
+ public static String unMapSpecialChars(final String src) {
+ if (src == null) {
+ return "";
+ }
+ return src.replace(C.DATA_SEPARATOR, "|##").replace("\n", "||#");
+ }
+
+ public static PackageInfo getPackageInfo(final Context ctx) {
+ PackageInfo pi = null;
+ try {
+ pi = ctx.getPackageManager().getPackageInfo(ctx.getPackageName(),
+ PackageManager.GET_ACTIVITIES);
+ } catch (final PackageManager.NameNotFoundException e) {
+ e.printStackTrace();
+ }
+ return pi;
+ }
+
+ public static boolean checkInternetConnection(final Context ctx) {
+ final ConnectivityManager cm = (ConnectivityManager) ctx
+ .getSystemService(Context.CONNECTIVITY_SERVICE);
+ // test for connection
+ if (cm.getActiveNetworkInfo() != null
+ && cm.getActiveNetworkInfo().isConnectedOrConnecting()) {
+ return true;
+ }
+ return false;
+ }
+
+ private static String getRecordingStream(final Activity ctx,
+ final Recording rec) {
+
+
+ Preferences prefs = Preferences.get();
+
+ final String m = prefs.getRecStreamMethod();
+
+ final StringBuilder url = new StringBuilder();
+
+ if (StringUtils.equals(m, "vdr-live")) {
+ url.append("http://")
+ .append(prefs.getHost())
+ //
+ .append(":")
+ .append(Integer.valueOf(prefs.getLivePort()))
+ //
+ .append("/recstream.html?recid=recording_")
+ .append(Utils.md5(rec.getFileName()));
+ // http://192.168.1.119:8008/b0cdedeed2d36508dfd924f0876a851b
+ final String urlstring = url.toString();
+ return urlstring;
+ } else if (StringUtils.equals(m, "vdr-streamdev")) {
+ url.append("http://").append(prefs.getHost())
+ //
+ .append(":")
+ .append(Integer.valueOf(
+ prefs.getStreamPort()))
+ //
+ .append("/").append(rec.getDevInode());
+ } else if (StringUtils.equals(m, "vdr-smarttvweb")) {
+
+ String type = prefs.getSmarttvewebType();
+
+ url.append("http://")
+ .append(prefs.getHost())
+ //
+ .append(":")
+ .append(Integer.valueOf(prefs
+ .getSmarttvewebPort()))
+ //
+ .append(Utils.encodeUrlPath(rec.getFileName()));
+ if (StringUtils.equals(type, "has") == true) {
+ url.append("/manifest-seg.mpd");
+ } else if (StringUtils.equals(type, "hls")) {
+ url.append("/manifest-seg.m3u8");
+ }
+ }
+ return url.toString();
+ }
+
+ public static void streamRecording(final Activity ctx, final Recording rec) {
+ final String urlstring = getRecordingStream(ctx, rec);
+ Log.d(TAG, "try stream: " + urlstring);
+ Utils.startStream(ctx, urlstring);
+ }
+
+ public static void switchTo(final Activity activity, final Channel channel) {
+ switchTo(activity, channel.getId(), channel.getName());
+ }
+
+ /**
+ * @param ctx
+ * @param id
+ * @param name Optional für die Anzeige
+ */
+ public static void switchTo(final Activity activity, final String id,
+ final String name) {
+
+ final SwitchChannelClient scc = new SwitchChannelClient(id,
+ new CertificateProblemDialog(activity));
+ final SvdrpAsyncTask<String, SwitchChannelClient> task = new SvdrpAsyncTask<String, SwitchChannelClient>(
+ scc);
+ task.addSvdrpListener(new SvdrpListener() {
+ @Override
+ public void svdrpEvent(final SvdrpEvent event) {
+ if (event == SvdrpEvent.FINISHED_SUCCESS) {
+ Utils.say(activity, activity.getString(
+ R.string.switching_success, (name != null ? name
+ : id)));
+ } else if (event == SvdrpEvent.CONNECT_ERROR
+ || event == SvdrpEvent.FINISHED_ABNORMALY
+ || event == SvdrpEvent.ABORTED
+ || event == SvdrpEvent.ERROR
+ || event == SvdrpEvent.CACHE_HIT) {
+ Utils.say(activity, activity.getString(
+ R.string.switching_failed, (name != null ? name
+ : id), event.name()));
+ }
+ }
+
+ public void svdrpException(final SvdrpException e) {
+ Log.w(TAG, e.getMessage(), e);
+ Utils.say(activity, e.getMessage());
+ }
+ });
+ task.run();
+ }
+
+ public static void say(final Context ctx, final String msg) {
+ final Toast t = Toast.makeText(ctx, msg, Toast.LENGTH_SHORT);
+ t.setGravity(Gravity.CENTER, 0, 0);
+ t.show();
+ }
+
+ public static String encodeUrlPath(String path) {
+ return path.replaceAll("%", "%25");
+ }
+
+ public static void say(final Context ctx, final int msg) {
+ say(ctx, msg, Toast.LENGTH_SHORT);
+ }
+
+ public static void say(final Context ctx, final int msg, final int duration) {
+ final Toast t = Toast.makeText(ctx, msg, duration);
+ t.setGravity(Gravity.CENTER, 0, 0);
+ t.show();
+ }
+
+ /**
+ * Formats the date and time based on user's phone date/time preferences.
+ *
+ * @param context the context
+ * @param time the time in milliseconds
+ */
+
+ public static String formatDateTime(final Context context, final long time) {
+ return android.text.format.DateFormat.getDateFormat(context).format(
+ time)
+ + " "
+ + DateUtils.formatDateTime(context, time,
+ DateUtils.FORMAT_SHOW_TIME).toString();
+ }
+
+ public static int getTimerStateDrawable(final TimerMatch match,
+ final int full, final int begin, final int end, final int conflict) {
+
+ switch (match) {
+ case Begin:
+ return begin;
+ case End:
+ return end;
+ case Conflict:
+ return conflict;
+ default:
+ return full;
+ }
+ }
+
+ public static String formatAudio(final Context context,
+ final List<AudioTrack> tracks) {
+
+ final StringBuilder sb = new StringBuilder();
+
+ String sep = "";
+ for (final AudioTrack a : tracks) {
+ sb.append(sep).append(a.display);
+ if (a.type.equals("d")) {
+ sb.append(" (")
+ .append(context.getString(R.string.audio_track_dolby))
+ .append(")");
+ }
+ sep = ", ";
+ }
+ return sb.toString();
+
+ }
+
+ public static TimerMatch getTimerMatch(Event event, Timer timer) {
+ if (timer == null) {
+ return null;
+ }
+ TimerMatch timerMatch = null;
+ Date start = event.getStart();
+ Date stop = event.getStop();
+ if (start.before(timer.getStart())) {
+ timerMatch = TimerMatch.End;
+ } else if (stop.after(timer.getStop())) {
+ timerMatch = TimerMatch.Begin;
+ } else {
+ timerMatch = TimerMatch.Full;
+ }
+ return timerMatch;
+ }
+
+ public static int contentToString(int c) {
+ ;
+ switch (c & 0xF0) {
+ case EventContentGroup.MovieDrama:
+ switch (c & 0x0F) {
+ default:
+ case 0x00:
+ return R.string.Content_Movie__Drama;
+ case 0x01:
+ return R.string.Content_Detective__Thriller;
+ case 0x02:
+ return R.string.Content_Adventure__Western__War;
+ case 0x03:
+ return R.string.Content_Science_Fiction__Fantasy__Horror;
+ case 0x04:
+ return R.string.Content_Comedy;
+ case 0x05:
+ return R.string.Content_Soap__Melodrama__Folkloric;
+ case 0x06:
+ return R.string.Content_Romance;
+ case 0x07:
+ return R.string.Content_Serious__Classical__Religious__Historical_Movie__Drama;
+ case 0x08:
+ return R.string.Content_Adult_Movie__Drama;
+ }
+ case EventContentGroup.NewsCurrentAffairs:
+ switch (c & 0x0F) {
+ default:
+ case 0x00:
+ return R.string.Content_News__Current_Affairs;
+ case 0x01:
+ return R.string.Content_News__Weather_Report;
+ case 0x02:
+ return R.string.Content_News_Magazine;
+ case 0x03:
+ return R.string.Content_Documentary;
+ case 0x04:
+ return R.string.Content_Discussion__Inverview__Debate;
+ }
+
+ case EventContentGroup.Show:
+ switch (c & 0x0F) {
+ default:
+ case 0x00:
+ return R.string.Content_Show__Game_Show;
+ case 0x01:
+ return R.string.Content_Game_Show__Quiz__Contest;
+ case 0x02:
+ return R.string.Content_Variety_Show;
+ case 0x03:
+ return R.string.Content_Talk_Show;
+ }
+
+ case EventContentGroup.Sports:
+ switch (c & 0x0F) {
+ default:
+ case 0x00:
+ return R.string.Content_Sports;
+ case 0x01:
+ return R.string.Content_Special_Event;
+ case 0x02:
+ return R.string.Content_Sport_Magazine;
+ case 0x03:
+ return R.string.Content_Football__Soccer;
+ case 0x04:
+ return R.string.Content_Tennis__Squash;
+ case 0x05:
+ return R.string.Content_Team_Sports;
+ case 0x06:
+ return R.string.Content_Athletics;
+ case 0x07:
+ return R.string.Content_Motor_Sport;
+ case 0x08:
+ return R.string.Content_Water_Sport;
+ case 0x09:
+ return R.string.Content_Winter_Sports;
+ case 0x0A:
+ return R.string.Content_Equestrian;
+ case 0x0B:
+ return R.string.Content_Martial_Sports;
+ }
+
+ case EventContentGroup.ChildrenYouth:
+ switch (c & 0x0F) {
+ default:
+ case 0x00:
+ return R.string.Content_Childrens__Youth_Programme;
+ case 0x01:
+ return R.string.Content_Preschool_Childrens_Programme;
+ case 0x02:
+ return R.string.Content_Entertainment_Programme_for_6_to_14;
+ case 0x03:
+ return R.string.Content_Entertainment_Programme_for_10_to_16;
+ case 0x04:
+ return R.string.Content_Informational__Educational__School_Programme;
+ case 0x05:
+ return R.string.Content_Cartoons__Puppets;
+ }
+
+ case EventContentGroup.MusicBalletDance:
+ switch (c & 0x0F) {
+ default:
+ case 0x00:
+ return R.string.Content_Music__Ballet__Dance;
+ case 0x01:
+ return R.string.Content_Rock__Pop;
+ case 0x02:
+ return R.string.Content_Serious__Classical_Music;
+ case 0x03:
+ return R.string.Content_Folk__Tradional_Music;
+ case 0x04:
+ return R.string.Content_Jazz;
+ case 0x05:
+ return R.string.Content_Musical__Opera;
+ case 0x06:
+ return R.string.Content_Ballet;
+ }
+
+ case EventContentGroup.ArtsCulture:
+ switch (c & 0x0F) {
+ default:
+ case 0x00:
+ return R.string.Content_Arts__Culture;
+ case 0x01:
+ return R.string.Content_Performing_Arts;
+ case 0x02:
+ return R.string.Content_Fine_Arts;
+ case 0x03:
+ return R.string.Content_Religion;
+ case 0x04:
+ return R.string.Content_Popular_Culture__Traditional_Arts;
+ case 0x05:
+ return R.string.Content_Literature;
+ case 0x06:
+ return R.string.Content_Film__Cinema;
+ case 0x07:
+ return R.string.Content_Experimental_Film__Video;
+ case 0x08:
+ return R.string.Content_Broadcasting__Press;
+ case 0x09:
+ return R.string.Content_New_Media;
+ case 0x0A:
+ return R.string.Content_Arts__Culture_Magazine;
+ case 0x0B:
+ return R.string.Content_Fashion;
+ }
+
+ case EventContentGroup.SocialPoliticalEconomics:
+ switch (c & 0x0F) {
+ default:
+ case 0x00:
+ return R.string.Content_Social__Political__Economics;
+ case 0x01:
+ return R.string.Content_Magazine__Report__Documentary;
+ case 0x02:
+ return R.string.Content_Economics__Social_Advisory;
+ case 0x03:
+ return R.string.Content_Remarkable_People;
+ }
+
+ case EventContentGroup.EducationalScience:
+ switch (c & 0x0F) {
+ default:
+ case 0x00:
+ return R.string.Content_Education__Science__Factual;
+ case 0x01:
+ return R.string.Content_Nature__Animals__Environment;
+ case 0x02:
+ return R.string.Content_Technology__Natural_Sciences;
+ case 0x03:
+ return R.string.Content_Medicine__Physiology__Psychology;
+ case 0x04:
+ return R.string.Content_Foreign_Countries__Expeditions;
+ case 0x05:
+ return R.string.Content_Social__Spiritual_Sciences;
+ case 0x06:
+ return R.string.Content_Further_Education;
+ case 0x07:
+ return R.string.Content_Languages;
+ }
+
+ case EventContentGroup.LeisureHobbies:
+ switch (c & 0x0F) {
+ default:
+ case 0x00:
+ return R.string.Content_Leisure__Hobbies;
+ case 0x01:
+ return R.string.Content_Tourism__Travel;
+ case 0x02:
+ return R.string.Content_Handicraft;
+ case 0x03:
+ return R.string.Content_Motoring;
+ case 0x04:
+ return R.string.Content_Fitness_and_Health;
+ case 0x05:
+ return R.string.Content_Cooking;
+ case 0x06:
+ return R.string.Content_Advertisement__Shopping;
+ case 0x07:
+ return R.string.Content_Gardening;
+ }
+ case EventContentGroup.Special:
+ switch (c & 0x0F) {
+ case 0x00:
+ return R.string.Content_Original_Language;
+ case 0x01:
+ return R.string.Content_Black_and_White;
+ case 0x02:
+ return R.string.Content_Unpublished;
+ case 0x03:
+ return R.string.Content_Live_Broadcast;
+ default:
+ ;
+ }
+ break;
+ default:
+ ;
+ }
+ return R.string.Content_Unknown;
+ }
+
+ public static String getContenString(Context ctx, int[] contents) {
+
+ if (contents.length == 0) {
+ return "";
+ }
+
+ StringBuilder sb = new StringBuilder();
+
+ String sep = "";
+
+ for (int content : contents) {
+
+ sb.append(sep).append(ctx.getString(contentToString(content)));
+ sep = ", ";
+ }
+
+ return sb.toString();
+ }
+
+ public static boolean isSerie(int[] contents) {
+ if (contents.length == 0) {
+ return false;
+ }
+
+ for (int c : contents) {
+ if (c == 21) {
+ return true;
+
+ }
+ }
+
+ return false;
+ }
}
diff --git a/vdrmanager/de.bjusystems.vdrmanager/src/main/java/de/bjusystems/vdrmanager/gui/VdrManagerActivity.java b/vdrmanager/de.bjusystems.vdrmanager/src/main/java/de/bjusystems/vdrmanager/gui/VdrManagerActivity.java
index 729d75c..8f3c68c 100644
--- a/vdrmanager/de.bjusystems.vdrmanager/src/main/java/de/bjusystems/vdrmanager/gui/VdrManagerActivity.java
+++ b/vdrmanager/de.bjusystems.vdrmanager/src/main/java/de/bjusystems/vdrmanager/gui/VdrManagerActivity.java
@@ -1,16 +1,22 @@
package de.bjusystems.vdrmanager.gui;
+import android.Manifest;
+import android.annotation.TargetApi;
import android.app.AlertDialog;
import android.app.SearchManager;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
+import android.content.pm.PackageManager;
import android.database.Cursor;
import android.net.Uri;
+import android.os.Build;
import android.os.Bundle;
import android.provider.SearchRecentSuggestions;
+import android.support.v4.app.ActivityCompat;
+import android.support.v4.content.ContextCompat;
import android.support.v4.view.MenuItemCompat;
-import android.support.v7.app.ActionBarActivity;
+import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.SearchView;
import android.support.v7.widget.SearchView.OnQueryTextListener;
import android.util.Log;
@@ -33,309 +39,350 @@ import de.bjusystems.vdrmanager.data.db.EPGSearchSuggestionsProvider;
import de.bjusystems.vdrmanager.remote.RemoteActivity;
import de.bjusystems.vdrmanager.utils.wakeup.AsyncWakeupTask;
-public class VdrManagerActivity extends ActionBarActivity implements
- OnClickListener, OnQueryTextListener {
+public class VdrManagerActivity extends AppCompatActivity implements
+ OnClickListener, OnQueryTextListener {
- public static final String TAG = "VdrManagerActivity";
+ public static final String TAG = "VdrManagerActivity";
- public static final String VDR_PORTAL = "http://www.vdr-portal.de";
+ public static final String VDR_PORTAL = "http://www.vdr-portal.de";
- private SearchView search;
+ private SearchView search;
- private View actionMenuWakup;
- private View actionMenuRemote;
+ private View actionMenuWakup;
+ private View actionMenuRemote;
- @Override
- protected void onCreate(final Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
+ private static final int MY_PERMISSIONS_REQUEST_EXTERNAL_STORAGE = 13;
- // Preferences.initVDR(this);
- // if(Preferences.get().getCurrentVdr() == null){
- // finish();
- // return;
- // } android.support.v7.appcompat.R
+ @TargetApi(Build.VERSION_CODES.M)
+ private void checkAndRequestPermission() {
+ if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
+ if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
+ Utils.say(getApplication(), R.string.permission_rationale, Toast.LENGTH_LONG);
+ } else {
+ ActivityCompat.requestPermissions(this,
+ new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE},
+ MY_PERMISSIONS_REQUEST_EXTERNAL_STORAGE);
+ }
+ }
+ }
+
+
+ @Override
+ public void onRequestPermissionsResult(int requestCode,
+ String permissions[], int[] grantResults) {
+ switch (requestCode) {
+ case MY_PERMISSIONS_REQUEST_EXTERNAL_STORAGE: {
+ // If request is cancelled, the result arrays are empty.
+ if (grantResults.length > 0
+ && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
+ // permission was granted, yay! Do the
+ } else {
+ // permission denied, boo! Disable the
+ // functionality that depends on this permission.
+ }
+ return;
+ }
+
+ // other 'case' lines to check for other
+ // permissions this app might request
+ }
+ }
+
+ @Override
+ protected void onCreate(final Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
- if (Preferences.initVDR(this) == false) {
- final Intent intent = new Intent();
- intent.setClass(this, VdrListActivity.class);
- intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- intent.putExtra(Intents.EMPTY_CONFIG, Boolean.TRUE);
- startActivity(intent);
- Toast.makeText(this, R.string.no_vdr, Toast.LENGTH_SHORT).show();
- finish();
- return;
- }
+ // Preferences.initVDR(this);
- Preferences.setLocale(this);
+ // if(Preferences.get().getCurrentVdr() == null){
+ // finish();
+ // return;
+ // } android.support.v7.appcompat.R
- // this.getActionBar().setDisplayShowCustomEnabled(true);
- // this.getActionBar().setDisplayShowTitleEnabled(false);
- // setTitle(getString(R.string.app_name));
- // attach view
- setContentView(R.layout.vdrmanager);
- // Preferences.loadPreferences(this);
+ if (Preferences.initVDR(this) == false) {
+ final Intent intent = new Intent();
+ intent.setClass(this, VdrListActivity.class);
+ intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ intent.putExtra(Intents.EMPTY_CONFIG, Boolean.TRUE);
+ startActivity(intent);
+ Toast.makeText(this, R.string.no_vdr, Toast.LENGTH_SHORT).show();
+ finish();
+ return;
+ }
- findViewById(R.id.action_menu_channels).setOnClickListener(this);
- findViewById(R.id.action_menu_recordings).setOnClickListener(this);
- findViewById(R.id.action_menu_timers).setOnClickListener(this);
- findViewById(R.id.action_menu_epg).setOnClickListener(this);
- findViewById(R.id.action_menu_remote).setOnClickListener(this);
+ Preferences.setLocale(this);
+
+ // this.getActionBar().setDisplayShowCustomEnabled(true);
+ // this.getActionBar().setDisplayShowTitleEnabled(false);
+ // setTitle(getString(R.string.app_name));
+ // attach view
+ setContentView(R.layout.vdrmanager);
+
+ // Preferences.loadPreferences(this);
+
+ findViewById(R.id.action_menu_channels).setOnClickListener(this);
+ findViewById(R.id.action_menu_recordings).setOnClickListener(this);
+ findViewById(R.id.action_menu_timers).setOnClickListener(this);
+ findViewById(R.id.action_menu_epg).setOnClickListener(this);
+ findViewById(R.id.action_menu_remote).setOnClickListener(this);
// View v = findViewById(R.id.action_menu_search);
// if (v != null) {
// v.setOnClickListener(this);
// }
- //findViewById(R.id.main_logo).setOnClickListener(this);
- actionMenuWakup = findViewById(R.id.action_menu_wakeup);
- actionMenuRemote = findViewById(R.id.action_menu_remote);
- // add and register buttons
- // createButtons();
- }
-
- public boolean onCreateOptionsMenu(Menu menu) {
- MenuInflater inflater = getMenuInflater();
- inflater.inflate(R.menu.main_menu, menu);
-
- // search = new SearchView(getSupportActionBar().getThemedContext());
- search = (SearchView) MenuItemCompat.getActionView( menu.findItem(R.id.menu_search));
-
- // search = (SearchView)
- // .getActionView();
- //
- // Object o = menu.findItem(R.id.menu_search);
-
- SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
- search.setSearchableInfo(searchManager
- .getSearchableInfo(getComponentName()));
-
- //search.setOnQueryTextListener(this);
- return true;
- }
-
- @Override
- protected void onResume() {
- Preferences.setLocale(this);
- if (Preferences.get().isWakeupEnabled() == false) {
- actionMenuWakup.setVisibility(View.GONE);
- actionMenuWakup.setOnClickListener(null);
- } else {
- actionMenuWakup.setVisibility(View.VISIBLE);
- actionMenuWakup.setOnClickListener(this);
- }
-
- if(Preferences.get().isRemoteEnabled() == false){
- actionMenuRemote.setVisibility(View.GONE);
- actionMenuRemote.setOnClickListener(null);
- } else {
- actionMenuRemote.setVisibility(View.VISIBLE);
- actionMenuRemote.setOnClickListener(this);
- }
-
-
- super.onResume();
- }
-
- @Override
- public boolean onOptionsItemSelected(
- final MenuItem item) {
-
- switch (item.getItemId()) {
- case R.id.main_menu_preferences: {
- Intent intent = new Intent(this, PreferencesActivity.class);
- int flags = Intent.FLAG_ACTIVITY_NEW_TASK
- | Intent.FLAG_ACTIVITY_SINGLE_TOP
- | Intent.FLAG_ACTIVITY_CLEAR_TOP;
- intent.setFlags(flags);
- startActivity(intent);
- finish();
- break;
- }
- case R.id.main_menu_info: {
- if(isFinishing()){
- break;
- }
- About.show(this);
- break;
- }
- case R.id.main_menu_exit: {
- finish();
- break;
- }
-
- case R.id.main_menu_clear_search: {
- SearchRecentSuggestions suggestions = new SearchRecentSuggestions(
- this, EPGSearchSuggestionsProvider.AUTHORITY,
- EPGSearchSuggestionsProvider.MODE);
- suggestions.clearHistory();
- break;
- }
-
- // case R.id.menu_search: {
- // if(Build.VERSION.SDK_INT <11){
- // onSearchRequested();
- // }
- // break;
- // }
- case R.id.main_menu_goto: {
- try {
- final Cursor cursor = ((AndroidDatabaseResults) DBAccess
- .get(this).getVdrDAO().iterator().getRawResults())
- .getRawCursor();
- startManagingCursor(cursor);
- final AlertDialog ad = new AlertDialog.Builder(this)
- .setSingleChoiceItems(cursor, findVdrCursor(cursor),
- "name", new DialogInterface.OnClickListener() {
-
- public void onClick(DialogInterface dialog,
- int which) {
- cursor.moveToPosition(which);
- int id = cursor.getInt(cursor
- .getColumnIndex("_id"));
- Vdr vdr = DBAccess
- .get(VdrManagerActivity.this)
- .getVdrDAO().queryForId(id);
- if (vdr == null) {
- Toast.makeText(
- VdrManagerActivity.this,
- R.string.main_menu_goto_no_vdr,
- Toast.LENGTH_SHORT).show();
- } else {
- Preferences.setCurrentVdr(
- VdrManagerActivity.this,
- vdr);
- Toast.makeText(
- VdrManagerActivity.this,
- getString(
- R.string.main_menu_switched_to,
- vdr.getName()),
- Toast.LENGTH_SHORT).show();
- Intent intent = getIntent();
- overridePendingTransition(0, 0);
- intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
- finish();
-
- overridePendingTransition(0, 0);
- startActivity(intent);
- }
- dialog.dismiss();
- }
- })//
- .setTitle(R.string.main_menu_goto_title)//
- .create();
- ad.show();
-
- } catch (Exception ex) {
- Log.w(TAG, ex);
- }
-
- break;
- }
- }
- return true;
- }
-
- private int findVdrCursor(Cursor c) {
- if (Preferences.get().getCurrentVdr() == null) {
- return -1;
- }
-
- int cid = Preferences.get().getCurrentVdr().getId();
-
- int position = 0;
- c.moveToPosition(-1);
- while (c.moveToNext()) {
- if (c.getInt(c.getColumnIndex("_id")) == cid) {
- break;
- }
- position++;
- }
- return position;
- }
-
- @Override
- public void onBackPressed() {
- if (Preferences.get().isQuiteOnBackButton()) {
- finish();
- } else {
- super.onBackPressed();
- }
-
- try {
- // reassign a new and empty key store
- ((VdrManagerApp)getApplication()).initSessionKeyStore();
- } catch (final Exception e) {
- Log.e(getClass().getName(), "Can't clear session key store");
+ //findViewById(R.id.main_logo).setOnClickListener(this);
+ actionMenuWakup = findViewById(R.id.action_menu_wakeup);
+ actionMenuRemote = findViewById(R.id.action_menu_remote);
+ // add and register buttons
+ // createButtons();
+ checkAndRequestPermission();
+
+ }
+
+ public boolean onCreateOptionsMenu(Menu menu) {
+ MenuInflater inflater = getMenuInflater();
+ inflater.inflate(R.menu.main_menu, menu);
+
+ // search = new SearchView(getSupportActionBar().getThemedContext());
+ search = (SearchView) MenuItemCompat.getActionView(menu.findItem(R.id.menu_search));
+
+ // search = (SearchView)
+ // .getActionView();
+ //
+ // Object o = menu.findItem(R.id.menu_search);
+
+ SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
+ search.setSearchableInfo(searchManager
+ .getSearchableInfo(getComponentName()));
+
+ //search.setOnQueryTextListener(this);
+ return true;
+ }
+
+ @Override
+ protected void onResume() {
+ Preferences.setLocale(this);
+ if (Preferences.get().isWakeupEnabled() == false) {
+ actionMenuWakup.setVisibility(View.GONE);
+ actionMenuWakup.setOnClickListener(null);
+ } else {
+ actionMenuWakup.setVisibility(View.VISIBLE);
+ actionMenuWakup.setOnClickListener(this);
+ }
+
+ if (Preferences.get().isRemoteEnabled() == false) {
+ actionMenuRemote.setVisibility(View.GONE);
+ actionMenuRemote.setOnClickListener(null);
+ } else {
+ actionMenuRemote.setVisibility(View.VISIBLE);
+ actionMenuRemote.setOnClickListener(this);
+ }
+
+
+ super.onResume();
+ }
+
+ @Override
+ public boolean onOptionsItemSelected(
+ final MenuItem item) {
+
+ switch (item.getItemId()) {
+ case R.id.main_menu_preferences: {
+ Intent intent = new Intent(this, PreferencesActivity.class);
+ int flags = Intent.FLAG_ACTIVITY_NEW_TASK
+ | Intent.FLAG_ACTIVITY_SINGLE_TOP
+ | Intent.FLAG_ACTIVITY_CLEAR_TOP;
+ intent.setFlags(flags);
+ startActivity(intent);
+ finish();
+ break;
+ }
+ case R.id.main_menu_info: {
+ if (isFinishing()) {
+ break;
+ }
+ About.show(this);
+ break;
+ }
+ case R.id.main_menu_exit: {
+ finish();
+ break;
+ }
+
+ case R.id.main_menu_clear_search: {
+ SearchRecentSuggestions suggestions = new SearchRecentSuggestions(
+ this, EPGSearchSuggestionsProvider.AUTHORITY,
+ EPGSearchSuggestionsProvider.MODE);
+ suggestions.clearHistory();
+ break;
+ }
+
+ // case R.id.menu_search: {
+ // if(Build.VERSION.SDK_INT <11){
+ // onSearchRequested();
+ // }
+ // break;
+ // }
+ case R.id.main_menu_goto: {
+ try {
+ final Cursor cursor = ((AndroidDatabaseResults) DBAccess
+ .get(this).getVdrDAO().iterator().getRawResults())
+ .getRawCursor();
+ startManagingCursor(cursor);
+ final AlertDialog ad = new AlertDialog.Builder(this)
+ .setSingleChoiceItems(cursor, findVdrCursor(cursor),
+ "name", new DialogInterface.OnClickListener() {
+
+ public void onClick(DialogInterface dialog,
+ int which) {
+ cursor.moveToPosition(which);
+ int id = cursor.getInt(cursor
+ .getColumnIndex("_id"));
+ Vdr vdr = DBAccess
+ .get(VdrManagerActivity.this)
+ .getVdrDAO().queryForId(id);
+ if (vdr == null) {
+ Toast.makeText(
+ VdrManagerActivity.this,
+ R.string.main_menu_goto_no_vdr,
+ Toast.LENGTH_SHORT).show();
+ } else {
+ Preferences.setCurrentVdr(
+ VdrManagerActivity.this,
+ vdr);
+ Toast.makeText(
+ VdrManagerActivity.this,
+ getString(
+ R.string.main_menu_switched_to,
+ vdr.getName()),
+ Toast.LENGTH_SHORT).show();
+ Intent intent = getIntent();
+ overridePendingTransition(0, 0);
+ intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
+ finish();
+
+ overridePendingTransition(0, 0);
+ startActivity(intent);
+ }
+ dialog.dismiss();
+ }
+ })//
+ .setTitle(R.string.main_menu_goto_title)//
+ .create();
+ ad.show();
+
+ } catch (Exception ex) {
+ Log.w(TAG, ex);
+ }
+
+ break;
+ }
+ }
+ return true;
+ }
+
+ private int findVdrCursor(Cursor c) {
+ if (Preferences.get().getCurrentVdr() == null) {
+ return -1;
+ }
+
+ int cid = Preferences.get().getCurrentVdr().getId();
+
+ int position = 0;
+ c.moveToPosition(-1);
+ while (c.moveToNext()) {
+ if (c.getInt(c.getColumnIndex("_id")) == cid) {
+ break;
+ }
+ position++;
+ }
+ return position;
}
- }
-
- public void startActivity(Class<?> clazz) {
- Intent intent = new Intent(Intent.ACTION_VIEW);
- intent.setClass(this, clazz);
- startActivity(intent);
- }
-
- public void onClick(View v) {
- int id = v.getId();
-
- switch (id) {
- case R.id.action_menu_channels:
- startActivity(ChannelListActivity.class);
- break;
- case R.id.action_menu_recordings:
- startActivity(RecordingListActivity.class);
- break;
- case R.id.action_menu_timers:
- startActivity(TimerListActivity.class);
- break;
- case R.id.action_menu_epg:
- startActivity(TimeEpgListActivity.class);
- break;
+ @Override
+ public void onBackPressed() {
+ if (Preferences.get().isQuiteOnBackButton()) {
+ finish();
+ } else {
+ super.onBackPressed();
+ }
+
+ try {
+ // reassign a new and empty key store
+ ((VdrManagerApp) getApplication()).initSessionKeyStore();
+ } catch (final Exception e) {
+ Log.e(getClass().getName(), "Can't clear session key store");
+ }
+
+ }
+
+ public void startActivity(Class<?> clazz) {
+ Intent intent = new Intent(Intent.ACTION_VIEW);
+ intent.setClass(this, clazz);
+ startActivity(intent);
+ }
+
+ public void onClick(View v) {
+ int id = v.getId();
+
+ switch (id) {
+ case R.id.action_menu_channels:
+ startActivity(ChannelListActivity.class);
+ break;
+ case R.id.action_menu_recordings:
+ startActivity(RecordingListActivity.class);
+ break;
+ case R.id.action_menu_timers:
+ startActivity(TimerListActivity.class);
+ break;
+ case R.id.action_menu_epg:
+ startActivity(TimeEpgListActivity.class);
+ break;
// case R.id.action_menu_search:
// onSearchRequested();
// break;
- case R.id.action_menu_wakeup:
- final AsyncWakeupTask wakeupTask = new AsyncWakeupTask(this);
- wakeupTask.execute();
- break;
- case R.id.main_logo:
- Intent i = new Intent(Intent.ACTION_VIEW);
- i.setData(Uri.parse(VDR_PORTAL));
- startActivity(i);
- break;
-
- case R.id.action_menu_remote:
- startActivity(RemoteActivity.class);
- break;
-
- }
-
- }
-
- protected void startSearchManager() {
- Bundle appData = new Bundle();
- startSearch(null, false, appData, false);
- }
-
- @Override
- public boolean onSearchRequested() {
- search.setVisibility(View.VISIBLE);
- // Bundle appData = new Bundle();
- // appData.putBoolean(SearchableActivity.JARGON, true);
- // startSearch(null, false, appData, false);
- return true;
- }
-
- @Override
- public boolean onQueryTextSubmit(String query) {
- // TODO Auto-generated method stub
- return false;
- }
-
- @Override
- public boolean onQueryTextChange(String newText) {
- // TODO Auto-generated method stub
- return false;
- }
+ case R.id.action_menu_wakeup:
+ final AsyncWakeupTask wakeupTask = new AsyncWakeupTask(this);
+ wakeupTask.execute();
+ break;
+ case R.id.main_logo:
+ Intent i = new Intent(Intent.ACTION_VIEW);
+ i.setData(Uri.parse(VDR_PORTAL));
+ startActivity(i);
+ break;
+
+ case R.id.action_menu_remote:
+ startActivity(RemoteActivity.class);
+ break;
+
+ }
+
+ }
+
+ protected void startSearchManager() {
+ Bundle appData = new Bundle();
+ startSearch(null, false, appData, false);
+ }
+
+ @Override
+ public boolean onSearchRequested() {
+ search.setVisibility(View.VISIBLE);
+ // Bundle appData = new Bundle();
+ // appData.putBoolean(SearchableActivity.JARGON, true);
+ // startSearch(null, false, appData, false);
+ return true;
+ }
+
+ @Override
+ public boolean onQueryTextSubmit(String query) {
+ // TODO Auto-generated method stub
+ return false;
+ }
+
+ @Override
+ public boolean onQueryTextChange(String newText) {
+ // TODO Auto-generated method stub
+ return false;
+ }
}
diff --git a/vdrmanager/de.bjusystems.vdrmanager/src/main/java/de/bjusystems/vdrmanager/remote/RemoteActivity.java b/vdrmanager/de.bjusystems.vdrmanager/src/main/java/de/bjusystems/vdrmanager/remote/RemoteActivity.java
index efd3cec..254150e 100644
--- a/vdrmanager/de.bjusystems.vdrmanager/src/main/java/de/bjusystems/vdrmanager/remote/RemoteActivity.java
+++ b/vdrmanager/de.bjusystems.vdrmanager/src/main/java/de/bjusystems/vdrmanager/remote/RemoteActivity.java
@@ -7,9 +7,12 @@ import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
+import android.net.Uri;
import android.os.AsyncTask;
import android.os.Build;
import android.os.Bundle;
+import android.os.Environment;
+import android.util.Log;
import android.util.Pair;
import android.view.ContextMenu;
import android.view.KeyEvent;
@@ -35,11 +38,21 @@ import org.hampelratte.svdrp.commands.HITK;
import org.json.JSONException;
import org.json.JSONObject;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Set;
import de.androvdr.widget.AnimatedTextView;
import de.androvdr.widget.FontAwesome;
import de.bjusystems.vdrmanager.R;
+import de.bjusystems.vdrmanager.backup.IOUtils;
import de.bjusystems.vdrmanager.data.Preferences;
import de.bjusystems.vdrmanager.gui.ColoredButton;
import de.bjusystems.vdrmanager.gui.Utils;
@@ -52,6 +65,10 @@ public class RemoteActivity extends Activity implements OnClickListener, View.On
private static final int TAG_KEY = -100;
+ private static final String TAG = RemoteActivity.class.getSimpleName();
+
+ private static final int READ_REQUEST_CODE = 19;
+
private Connection connection;
private AnimatedTextView result;
@@ -60,12 +77,15 @@ public class RemoteActivity extends Activity implements OnClickListener, View.On
private View dummyContextMenuView;
+ private ViewGroup remoteroot;
+
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.requestWindowFeature(Window.FEATURE_NO_TITLE);
+
//Remove notification bar
this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
View view = getLayoutInflater().inflate(R.layout.remote, null);
@@ -77,12 +97,12 @@ public class RemoteActivity extends Activity implements OnClickListener, View.On
view.setOnLongClickListener(this);
- ViewGroup viewGroup = (ViewGroup) view.findViewById(R.id.remoteroot);
+ remoteroot = (ViewGroup) view.findViewById(R.id.remoteroot);
//Button button = (Button) viewGroup.findViewById(R.id.red);
//button.getBackground().setColorFilter(0xFF00FF00, PorterDuff.Mode.MULTIPLY);
- setAllButtonListener(viewGroup);
+ setAllButtonListener(remoteroot);
result = (AnimatedTextView) findViewById(R.id.result);
//Animation in = AnimationUtils.loadAnimation(this,android.R.anim.fade_in);
@@ -95,9 +115,14 @@ public class RemoteActivity extends Activity implements OnClickListener, View.On
in = new AlphaAnimation(0.0f, 1.0f);
in.setDuration(100);
-
- //SearchableSpinner spinner2 = (SearchableSpinner) findViewById(R.id.search2);
- //spinner2.setList(getResources().getStringArray(R.array.font));
+ Bundle bundle = getIntent().getExtras();
+ if (bundle != null) {
+ Uri uri = (Uri) bundle.get(Intent.EXTRA_STREAM);
+ if (uri != null) {
+ importFromUri(uri);
+ return;
+ }
+ }
}
@@ -162,46 +187,83 @@ public class RemoteActivity extends Activity implements OnClickListener, View.On
public void export() {
SharedPreferences sharedPref = getSharedPreferences("remote_" + Preferences.get().getCurrentVdr().getId(), Context.MODE_PRIVATE);
ViewGroup viewGroup = (ViewGroup) findViewById(R.id.remoteroot);
- ArrayList<Pair<String, String>> list = new ArrayList<>();
- gather(viewGroup, list, sharedPref);
+ HashMap<String, Pair<String, String>> map = new HashMap<>();
+ collect(viewGroup, map, sharedPref);
+
+ if(map.isEmpty()){
+ Utils.say(this, R.string.remote_nothing_to_import);
+ return;
+ }
JSONObject root = new JSONObject();
try {
- for (Pair<String, String> stringStringPair : list) {
- root.put(stringStringPair.first, stringStringPair.second);
+ for (Map.Entry<String, Pair<String, String>> e : map.entrySet()) {
+ JSONObject pair = new JSONObject();
+ Pair<String, String> stringStringPair = e.getValue();
+ pair.put("key", stringStringPair.first);
+ pair.put("label", stringStringPair.second);
+ root.put(e.getKey(), pair);
}
} catch (JSONException jse) {
Utils.say(this, jse.getLocalizedMessage());
}
- Intent i = new Intent(android.content.Intent.ACTION_SEND);
- i.setType("application/json");
- i.putExtra(android.content.Intent.EXTRA_TEXT, root.toString());
- startActivity(Intent.createChooser(i, getResources().getString(R.string.export_custom_key_mapping)));
+ Intent intentShareFile = new Intent(Intent.ACTION_SEND);
+ String content = root.toString();
+ File outputFile = null;
+ try {
+ outputFile = File.createTempFile("vdr_remote_keys_", ".json", Environment.getExternalStorageDirectory());
+ final FileOutputStream fileOutputStream = new FileOutputStream(outputFile);
+ fileOutputStream.write(content.getBytes("utf-8"));
+ IOUtils.closeQuietly(fileOutputStream);
+ } catch (IOException iox) {
+ Log.d(TAG, iox.getMessage(), iox);
+ Utils.say(this, iox.getLocalizedMessage());
+ return;
+ }
+ intentShareFile.setType("text/plain");
+ intentShareFile.putExtra(Intent.EXTRA_STREAM, Uri.parse("file://" + outputFile.getAbsolutePath()));
+
+ intentShareFile.putExtra(Intent.EXTRA_SUBJECT,
+ getString(R.string.export_custom_key_mapping));
+
+ intentShareFile.putExtra(Intent.EXTRA_TEXT, content);
+
+ startActivity(Intent.createChooser(intentShareFile, getString(R.string.export_custom_key_mapping)));
}
+ //Intent i = new Intent(android.content.Intent.ACTION_SEND);
+ // i.setType("application/json");
+// i.putExtra(android.content.Intent.EXTRA_TEXT,root.toString());
+
+ // startActivity(Intent.createChooser(i, getResources().
+
+ //getString()));
+//}
+
/**
* Gather.
*
* @param viewGroup the view group
- * @param pair the pair
+ * @param map the map
* @param sharedPref the shared pref
*/
- public void gather(ViewGroup viewGroup, ArrayList<Pair<String, String>> pair, SharedPreferences sharedPref) {
+ public void collect(ViewGroup viewGroup, HashMap<String, Pair<String, String>> map, SharedPreferences sharedPref) {
for (int i = 0; i < viewGroup.getChildCount(); i++) {
View v = viewGroup.getChildAt(i);
if (v instanceof ViewGroup) {
- gather((ViewGroup) v, pair, sharedPref);
+ collect((ViewGroup) v, map, sharedPref);
} else if (v instanceof Button) {
if (v.getTag() == null) {
continue;
}
- String hitk = sharedPref.getString("key_" + String.valueOf(v.getTag()), null);
- String label = sharedPref.getString("label_" + String.valueOf(v.getTag()), null);
+ String tagKey = String.valueOf(v.getTag());
+ String hitk = sharedPref.getString("key_" + tagKey, null);
+ String label = sharedPref.getString("label_" + tagKey, null);
if (hitk == null && label == null) {
continue;
}
- pair.add(Pair.create(hitk, label));
+ map.put(tagKey, Pair.create(hitk, label));
}
}
}
@@ -272,7 +334,9 @@ public class RemoteActivity extends Activity implements OnClickListener, View.On
private void restart() {
-
+ if(getIntent() != null) {
+ getIntent().removeExtra(Intent.EXTRA_STREAM);
+ }
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
recreate();
} else {
@@ -299,7 +363,18 @@ public class RemoteActivity extends Activity implements OnClickListener, View.On
return true;
}
case R.id.imprt: {
- Utils.say(this, R.string.not_yet_implemented);
+ Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
+
+ // Filter to only show results that can be "opened", such as a
+ // file (as opposed to a list of contacts or timezones)
+ intent.addCategory(Intent.CATEGORY_OPENABLE);
+
+ // Filter to show only images, using the image MIME data type.
+ // If one wanted to search for ogg vorbis files, the type would be "audio/ogg".
+ // To search for all documents available via installed storage providers,
+ // it would be "*/*".
+ intent.setType("*/*");
+ startActivityForResult(intent, READ_REQUEST_CODE);
return true;
}
case R.id.remapback: {
@@ -322,6 +397,13 @@ public class RemoteActivity extends Activity implements OnClickListener, View.On
;
+ /**
+ * On create context menu.
+ *
+ * @param menu the menu
+ * @param v the v
+ * @param menuInfo the menu info
+ */
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
@@ -417,6 +499,70 @@ public class RemoteActivity extends Activity implements OnClickListener, View.On
return false;
}
+ @Override
+ protected void onActivityResult(int requestCode, int resultCode, Intent data) {
+ // The ACTION_OPEN_DOCUMENT intent was sent with the request code
+ // READ_REQUEST_CODE. If the request code seen here doesn't match, it's the
+ // response to some other intent, and the code below shouldn't run at all.
+
+ if (requestCode == READ_REQUEST_CODE && resultCode == Activity.RESULT_OK) {
+ // The document selected by the user won't be returned in the intent.
+ // Instead, a URI to that document will be contained in the return intent
+ // provided to this method as a parameter.
+ // Pull that URI using resultData.getData().
+ Uri uri = null;
+ if (data != null) {
+ uri = data.getData();
+ importFromUri(uri);
+ }
+ }
+ }
+
+ private void importFromUri(Uri uri) {
+ try {
+ Log.i(TAG, "Uri: " + uri.toString());
+ ByteArrayOutputStream bos = new ByteArrayOutputStream();
+ IOUtils.copy(getContentResolver().openInputStream(uri), bos);
+ JSONObject object = new JSONObject(new String(bos.toByteArray(), "utf-8"
+ ));
+ IOUtils.closeQuietly(bos);
+ final Iterator<String> keys = object.keys();
+ Set<String> all = new HashSet<String>();
+ for (de.bjusystems.vdrmanager.remote.HITK hitk : de.bjusystems.vdrmanager.remote.HITK.values()) {
+ all.add(hitk.getValue());
+ }
+ SharedPreferences sharedPref = getSharedPreferences("remote_" + Preferences.get().getCurrentVdr().getId(), Context.MODE_PRIVATE);
+ SharedPreferences.Editor edit = sharedPref.edit();
+ int counter = 0;
+ while (keys.hasNext()) {
+ final String next = keys.next();
+ if (all.contains(next) == false) {
+ continue;
+ }
+ JSONObject pair = object.getJSONObject(next);
+ String key = pair.getString("key");
+ if (all.contains(key) == false) {
+ continue;
+ }
+ String value = pair.getString("label");
+ edit.putString("key_" + next, key);
+ edit.putString("label_" + next, value);
+ counter++;
+ }
+ edit.commit();
+ Utils.say(this, getString(R.string.remote_keys_imported, String.valueOf(counter)));
+ if (counter > 0) {
+ setAllButtonListener(remoteroot);
+ }
+ } catch (Exception iox)
+
+ {
+ Log.w(TAG, iox.getMessage(), iox);
+ Utils.say(this, iox.getMessage());
+ }
+ }
+
+
private void putVdrKey(String key, CharSequence value) {
SharedPreferences sharedPref = getSharedPreferences("remote_" + Preferences.get().getCurrentVdr().getId(), Context.MODE_PRIVATE);
SharedPreferences.Editor edit = sharedPref.edit();
diff --git a/vdrmanager/de.bjusystems.vdrmanager/src/main/res/layout/dialog_dropdown.xml b/vdrmanager/de.bjusystems.vdrmanager/src/main/res/layout/dialog_dropdown.xml
new file mode 100644
index 0000000..4f90097
--- /dev/null
+++ b/vdrmanager/de.bjusystems.vdrmanager/src/main/res/layout/dialog_dropdown.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/layout"
+ android:orientation="vertical"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center"
+ >
+
+ <EditText
+ android:id="@+id/filter"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:maxLines="1"
+ android:lines="1"
+ android:singleLine="true"
+ />
+
+ <com.rajasharan.widget.RecyclerDropdown
+ android:id="@+id/list"
+ android:layout_width="match_parent"
+ android:layout_height="@dimen/recycler_height"
+ />
+
+</LinearLayout>
diff --git a/vdrmanager/de.bjusystems.vdrmanager/src/main/res/layout/recycler_buffer_item.xml b/vdrmanager/de.bjusystems.vdrmanager/src/main/res/layout/recycler_buffer_item.xml
new file mode 100644
index 0000000..25ce8b8
--- /dev/null
+++ b/vdrmanager/de.bjusystems.vdrmanager/src/main/res/layout/recycler_buffer_item.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<View
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="@dimen/item_height"
+ />
diff --git a/vdrmanager/de.bjusystems.vdrmanager/src/main/res/layout/recycler_itemviews.xml b/vdrmanager/de.bjusystems.vdrmanager/src/main/res/layout/recycler_itemviews.xml
new file mode 100644
index 0000000..6aeb1b0
--- /dev/null
+++ b/vdrmanager/de.bjusystems.vdrmanager/src/main/res/layout/recycler_itemviews.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<TextView xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/text"
+ android:layout_width="match_parent"
+ android:layout_height="@dimen/item_height"
+ />
diff --git a/vdrmanager/de.bjusystems.vdrmanager/src/main/res/layout/remote.xml b/vdrmanager/de.bjusystems.vdrmanager/src/main/res/layout/remote.xml
index b251ca1..c75d83e 100644
--- a/vdrmanager/de.bjusystems.vdrmanager/src/main/res/layout/remote.xml
+++ b/vdrmanager/de.bjusystems.vdrmanager/src/main/res/layout/remote.xml
@@ -7,6 +7,8 @@
android:orientation="vertical"
android:padding="5dp">
+
+
<LinearLayout
android:id="@+id/resultwrapper"
android:layout_width="fill_parent"
diff --git a/vdrmanager/de.bjusystems.vdrmanager/src/main/res/values/dimens.xml b/vdrmanager/de.bjusystems.vdrmanager/src/main/res/values/dimens.xml
new file mode 100644
index 0000000..1ee0176
--- /dev/null
+++ b/vdrmanager/de.bjusystems.vdrmanager/src/main/res/values/dimens.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+ <dimen name="item_height">40dp</dimen>
+ <dimen name="item_margin">0dp</dimen>
+ <dimen name="item_inset">2dp</dimen>
+ <dimen name="recycler_height">200dp</dimen>
+</resources>
diff --git a/vdrmanager/de.bjusystems.vdrmanager/src/main/res/values/font.xml b/vdrmanager/de.bjusystems.vdrmanager/src/main/res/values/font.xml
new file mode 100644
index 0000000..554cc96
--- /dev/null
+++ b/vdrmanager/de.bjusystems.vdrmanager/src/main/res/values/font.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8" ?>
+
+<resources>
+ <string-array name="font">
+ <item> 500px</item>
+ <item> address-book</item>
+ <item> address-book-o</item>
+ <item> address-card</item>
+ <item> address-card-o</item>
+ <item> adjust</item>
+ <item> adn</item>
+ </string-array>
+</resources>
diff --git a/vdrmanager/de.bjusystems.vdrmanager/src/main/res/values/strings.xml b/vdrmanager/de.bjusystems.vdrmanager/src/main/res/values/strings.xml
index ec417e0..4f62261 100644
--- a/vdrmanager/de.bjusystems.vdrmanager/src/main/res/values/strings.xml
+++ b/vdrmanager/de.bjusystems.vdrmanager/src/main/res/values/strings.xml
@@ -1,43 +1,43 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools">
- <string name="action_menu_channels">Channels</string>
- <string name="action_menu_timers">Timers</string>
- <string name="action_menu_recordings">Recordings</string>
- <string name="action_menu_epg">EPG list</string>
- <string name="action_menu_search">EPG search</string>
- <string name="action_menu_wakeup">Wakeup</string>
- <string name="action_menu_remote">Remote</string>
- <string name="app_name">VDR-Manager</string>
- <string name="channel_item_menu_epg">Show EPG</string>
- <string name="channel_item_menu_stream">Live stream</string>
- <string name="channel_item_menu_hide">Hide</string>
- <string name="channel_item_menu_hide_permanent">Hide permanent</string>
- <string name="channel_group_menu_hide">Hide</string>
- <string name="channel_group_menu_hide_permanent">Hide permanent</string>
- <string name="menu_groupby">Group by</string>
- <string name="groupby_group">Group</string>
- <string name="groupby_provider">Provider</string>
- <string name="groupby_name">Name</string>
- <string name="groupby_source">Source</string>
- <string name="groupby_channel">By Channel</string>
- <string name="groupby_date">By Date</string>
- <string name="groupby_name_all_channels_group">All Channels</string>
- <string name="groupby_window_title_templte">Group by %1$s</string>
- <string name="common_delete">Delete</string>
- <string name="prefs_current_value">Current:</string>
- <string name="prefs_current_value_template">\nCurrent: %1$s</string>
- <string name="prefs_current_value_not_set">&lt;not set></string>
- <string name="no_connection">No connection</string>
- <string name="aborted">Connection aborted.</string>
- <string name="no_connection_retry">Retry</string>
- <string name="refresh">Refresh</string>
- <string name="done">Done</string>
- <string name="share">Share</string>
- <string name="addtocal">Add to calendar</string>
- <string name="search_reapt">Reruns</string>
- <string name="share_chooser">Share EPG Entry</string>
- <string name="about_text">About "VDR-Manager" Software for Android\n
+ <string name="action_menu_channels">Channels</string>
+ <string name="action_menu_timers">Timers</string>
+ <string name="action_menu_recordings">Recordings</string>
+ <string name="action_menu_epg">EPG list</string>
+ <string name="action_menu_search">EPG search</string>
+ <string name="action_menu_wakeup">Wakeup</string>
+ <string name="action_menu_remote">Remote</string>
+ <string name="app_name">VDR-Manager</string>
+ <string name="channel_item_menu_epg">Show EPG</string>
+ <string name="channel_item_menu_stream">Live stream</string>
+ <string name="channel_item_menu_hide">Hide</string>
+ <string name="channel_item_menu_hide_permanent">Hide permanent</string>
+ <string name="channel_group_menu_hide">Hide</string>
+ <string name="channel_group_menu_hide_permanent">Hide permanent</string>
+ <string name="menu_groupby">Group by</string>
+ <string name="groupby_group">Group</string>
+ <string name="groupby_provider">Provider</string>
+ <string name="groupby_name">Name</string>
+ <string name="groupby_source">Source</string>
+ <string name="groupby_channel">By Channel</string>
+ <string name="groupby_date">By Date</string>
+ <string name="groupby_name_all_channels_group">All Channels</string>
+ <string name="groupby_window_title_templte">Group by %1$s</string>
+ <string name="common_delete">Delete</string>
+ <string name="prefs_current_value">Current:</string>
+ <string name="prefs_current_value_template">\nCurrent: %1$s</string>
+ <string name="prefs_current_value_not_set">&lt;not set></string>
+ <string name="no_connection">No connection</string>
+ <string name="aborted">Connection aborted.</string>
+ <string name="no_connection_retry">Retry</string>
+ <string name="refresh">Refresh</string>
+ <string name="done">Done</string>
+ <string name="share">Share</string>
+ <string name="addtocal">Add to calendar</string>
+ <string name="search_reapt">Reruns</string>
+ <string name="share_chooser">Share EPG Entry</string>
+ <string name="about_text">About "VDR-Manager" Software for Android\n
This is Version %1$s\n
If you have a VDR at home reachable
over the internet and own a mobile phone running Android then you possibly find this program useful.
@@ -46,389 +46,389 @@
bju&lt;herrlado@gmail.com>
herrlado&lt;herrlado@gmail.com>
</string>
- <string name="about_title">About</string>
- <string name="no_internet_connection">No data connection</string>
- <string name="update_will_start_in">Update will start in one second</string>
- <string name="epg_menu_search">Search EPG</string>
- <string name="epg_menu_times">Search times</string>
- <string name="epg_item_menu_timer_add">Create timer</string>
- <string name="epg_item_menu_timer_record">Record</string>
- <string name="epg_item_menu_timer_delete">Delete timer</string>
- <string name="epg_item_menu_timer_modify">Modify timer</string>
- <string name="epg_item_menu_timer_enable">Enable timer</string>
- <string name="epg_item_menu_timer_disable">Disable timer</string>
- <string name="epg_no_items">Nothing found…</string>
- <string name="epg_client_errors">An error occurred, check logs…</string>
- <string name="navigae_at_the_end">End</string>
- <string name="navigae_at_the_start">Beginning</string>
- <string name="epg_search_times_add">Add time</string>
- <string name="epg_search_times_window">Custom times</string>
-
- <!-- What's on display -->
- <string name="epg_list_time_label">What\'s on at</string>
- <string name="epg_list_time_now">Now</string>
- <string name="epg_list_time_next">Next</string>
- <string name="epg_list_time_adhoc">Ad Hoc</string>
- <string name="epg_list_channel_spinner">Channel</string>
- <string name="epg_list_search_label">Search results</string>
-
- <!-- create timer -->
- <string name="epg_event_share_text">Share</string>
- <string name="epg_event_imdb_text">IMDb Search</string>
- <string name="epg_event_omdb_text">OMDB Search</string>
- <string name="epg_event_tmdb_text">TMDb Search</string>
- <string name="epg_eent_livetv_text">Stream</string>
- <string name="epg_event_create_timer_text">Add timer</string>
- <string name="epg_event_modify_timer_text">Modify timer</string>
-
- <!-- search -->
- <string name="epg_search_button">Search</string>
- <string name="epg_duration_template">%1$s min</string>
- <string name="epg_duration_template_live">%1$s/%2$s min</string>
- <string name="epg_of_a_channel">%1$s, %2$s/%3$s</string>
- <string name="epg_by_channel">EPG by channel</string>
- <string name="epg_by_search">EPG Search</string>
- <string name="epg_by_search_param">EPG Search: \'%1$s\'</string>
- <string name="epg_by_time">EPG by time</string>
- <string name="epg_by_time_args">EPG by time: \'%1$s\'</string>
- <string name="search_epg_hint">Search EPG</string>
- <string name="epg_search_settings_description">Search VDR EPG</string>
- <string name="epg_window_title_count">%1$s, %2$s items</string>
- <string name="channels_window_title_count">%1$s, %2$s/%3$s</string>
- <string name="new_timer">New timer</string>
- <string name="vdr_error_text">The communication with VDR has caused an error: %1$s</string>
- <string name="livetv">Live TV</string>
- <string name="settings_livetv_summary">Needs streamdev-server on VDR and an external
+ <string name="about_title">About</string>
+ <string name="no_internet_connection">No data connection</string>
+ <string name="update_will_start_in">Update will start in one second</string>
+ <string name="epg_menu_search">Search EPG</string>
+ <string name="epg_menu_times">Search times</string>
+ <string name="epg_item_menu_timer_add">Create timer</string>
+ <string name="epg_item_menu_timer_record">Record</string>
+ <string name="epg_item_menu_timer_delete">Delete timer</string>
+ <string name="epg_item_menu_timer_modify">Modify timer</string>
+ <string name="epg_item_menu_timer_enable">Enable timer</string>
+ <string name="epg_item_menu_timer_disable">Disable timer</string>
+ <string name="epg_no_items">Nothing found…</string>
+ <string name="epg_client_errors">An error occurred, check logs…</string>
+ <string name="navigae_at_the_end">End</string>
+ <string name="navigae_at_the_start">Beginning</string>
+ <string name="epg_search_times_add">Add time</string>
+ <string name="epg_search_times_window">Custom times</string>
+
+ <!-- What's on display -->
+ <string name="epg_list_time_label">What\'s on at</string>
+ <string name="epg_list_time_now">Now</string>
+ <string name="epg_list_time_next">Next</string>
+ <string name="epg_list_time_adhoc">Ad Hoc</string>
+ <string name="epg_list_channel_spinner">Channel</string>
+ <string name="epg_list_search_label">Search results</string>
+
+ <!-- create timer -->
+ <string name="epg_event_share_text">Share</string>
+ <string name="epg_event_imdb_text">IMDb Search</string>
+ <string name="epg_event_omdb_text">OMDB Search</string>
+ <string name="epg_event_tmdb_text">TMDb Search</string>
+ <string name="epg_eent_livetv_text">Stream</string>
+ <string name="epg_event_create_timer_text">Add timer</string>
+ <string name="epg_event_modify_timer_text">Modify timer</string>
+
+ <!-- search -->
+ <string name="epg_search_button">Search</string>
+ <string name="epg_duration_template">%1$s min</string>
+ <string name="epg_duration_template_live">%1$s/%2$s min</string>
+ <string name="epg_of_a_channel">%1$s, %2$s/%3$s</string>
+ <string name="epg_by_channel">EPG by channel</string>
+ <string name="epg_by_search">EPG Search</string>
+ <string name="epg_by_search_param">EPG Search: \'%1$s\'</string>
+ <string name="epg_by_time">EPG by time</string>
+ <string name="epg_by_time_args">EPG by time: \'%1$s\'</string>
+ <string name="search_epg_hint">Search EPG</string>
+ <string name="epg_search_settings_description">Search VDR EPG</string>
+ <string name="epg_window_title_count">%1$s, %2$s items</string>
+ <string name="channels_window_title_count">%1$s, %2$s/%3$s</string>
+ <string name="new_timer">New timer</string>
+ <string name="vdr_error_text">The communication with VDR has caused an error: %1$s</string>
+ <string name="livetv">Live TV</string>
+ <string name="settings_livetv_summary">Needs streamdev-server on VDR and an external
player such as VPlayer
</string>
- <string name="settings_livetv_streamformat">Streamformat</string>
- <string name="settings_livetv_port">Streaming Port</string>
- <string name="settings_livetv_port_summary">Default 3000. The access must be enabled in
+ <string name="settings_livetv_streamformat">Streamformat</string>
+ <string name="settings_livetv_port">Streaming Port</string>
+ <string name="settings_livetv_port_summary">Default 3000. The access must be enabled in
streamdevhosts.conf.
</string>
- <string-array name="livetv_streamformat">
- <item>TS</item>
- <item>PES</item>
- <item>ES</item>
- <item>PS</item>
- </string-array>
-
- <string name="key_remux_enable">remux_enable</string>
- <string name="key_remux_command">remux_command</string>
- <string name="key_remux_parameter">remux_parameter</string>
- <string name="stream_via_as">Stream</string>
- <string name="stream_choose_audio">Choose Audio Track</string>
- <string name="stream_via">via %s</string>
- <string name="stream_as">as %s</string>
- <string name="remux_title">Remux</string>
- <string name="remux_enable_title">Enable Remux</string>
- <string name="remux_enable_summary">Enable streaming via remux (e.g. externremux.sh)</string>
- <string name="remux_command_title">Command</string>
- <string name="remux_command_summary">Typically EXT or Extern e.g. http://vdr:3000/EXT/1</string>
- <string name="remux_parameter_title">Parameter</string>
- <string name="remux_parameter_summary">Control Streaming quality. E.g. http://vdr:3000/EXT;DSL1000/1</string>
- <string name="main_menu_preferences">Preferences</string>
- <string name="main_menu_info">Info</string>
- <string name="main_menu_exit">Exit</string>
- <string name="main_menu_goto">Switch Device</string>
- <string name="main_menu_goto_title">Switch to…</string>
- <string name="main_menu_goto_no_vdr">Can not load selected device :(</string>
- <string name="main_menu_switched_to">Switched to %1$s</string>
- <string name="vdr_devices_summary">Define one or more VDR Devices.</string>
- <string name="vdr_devices">VDR Devices</string>
-
- <!-- VDR plugin preferences -->
- <string name="vdr_preferences">Network settings</string>
- <string name="vdr_host_title">VDR host</string>
- <string name="vdr_host_summary">Host running VDR</string>
- <string name="vdr_port_title">VDR plugin port</string>
- <string name="vdr_port_summary">Port for connections to VDR plugin</string>
- <string name="vdr_password_title">VDR plugin password</string>
- <string name="vdr_password_summary">Password for the VDR plugin</string>
- <string name="vdr_ssl_title">Secure connect</string>
- <string name="vdr_ssl_summary">Use SSL for connections</string>
-
- <!-- channel filter preferences -->
- <string name="channel_filter_preferences">Channel settings</string>
- <string name="channel_filter_filter_title">Limit channels</string>
- <string name="channel_filter_filter_summary">Use only given channels</string>
- <string name="channel_filter_last_title">Channel filter</string>
- <string name="channel_filter_last_summary">Comma separated channelnumbers or ranges (separator \'-\'). A.e. 1,2,4-10
+ <string-array name="livetv_streamformat">
+ <item>TS</item>
+ <item>PES</item>
+ <item>ES</item>
+ <item>PS</item>
+ </string-array>
+
+ <string name="key_remux_enable">remux_enable</string>
+ <string name="key_remux_command">remux_command</string>
+ <string name="key_remux_parameter">remux_parameter</string>
+ <string name="stream_via_as">Stream</string>
+ <string name="stream_choose_audio">Choose Audio Track</string>
+ <string name="stream_via">via %s</string>
+ <string name="stream_as">as %s</string>
+ <string name="remux_title">Remux</string>
+ <string name="remux_enable_title">Enable Remux</string>
+ <string name="remux_enable_summary">Enable streaming via remux (e.g. externremux.sh)</string>
+ <string name="remux_command_title">Command</string>
+ <string name="remux_command_summary">Typically EXT or Extern e.g. http://vdr:3000/EXT/1</string>
+ <string name="remux_parameter_title">Parameter</string>
+ <string name="remux_parameter_summary">Control Streaming quality. E.g. http://vdr:3000/EXT;DSL1000/1</string>
+ <string name="main_menu_preferences">Preferences</string>
+ <string name="main_menu_info">Info</string>
+ <string name="main_menu_exit">Exit</string>
+ <string name="main_menu_goto">Switch Device</string>
+ <string name="main_menu_goto_title">Switch to…</string>
+ <string name="main_menu_goto_no_vdr">Can not load selected device :(</string>
+ <string name="main_menu_switched_to">Switched to %1$s</string>
+ <string name="vdr_devices_summary">Define one or more VDR Devices.</string>
+ <string name="vdr_devices">VDR Devices</string>
+
+ <!-- VDR plugin preferences -->
+ <string name="vdr_preferences">Network settings</string>
+ <string name="vdr_host_title">VDR host</string>
+ <string name="vdr_host_summary">Host running VDR</string>
+ <string name="vdr_port_title">VDR plugin port</string>
+ <string name="vdr_port_summary">Port for connections to VDR plugin</string>
+ <string name="vdr_password_title">VDR plugin password</string>
+ <string name="vdr_password_summary">Password for the VDR plugin</string>
+ <string name="vdr_ssl_title">Secure connect</string>
+ <string name="vdr_ssl_summary">Use SSL for connections</string>
+
+ <!-- channel filter preferences -->
+ <string name="channel_filter_preferences">Channel settings</string>
+ <string name="channel_filter_filter_title">Limit channels</string>
+ <string name="channel_filter_filter_summary">Use only given channels</string>
+ <string name="channel_filter_last_title">Channel filter</string>
+ <string name="channel_filter_last_summary">Comma separated channelnumbers or ranges (separator \'-\'). A.e. 1,2,4-10
</string>
- <!-- wakeup -->
- <string name="wakeup_preferences">Remote VDR host wakeup</string>
- <string name="wakeup_enabled_title">Can remote wakeup VDR</string>
- <string name="wakeup_enabled_summary">Enables to remote wakeup the VDR host</string>
- <string name="wakeup_url_title">URL for remote wakeup</string>
- <string name="wakeup_url_summary">URL for a request doing the wakeup</string>
- <string name="wakeup_user_title">Wakeup user</string>
- <string name="wakeup_user_summary">User for remote wakeup</string>
- <string name="wakeup_password_title">Wakeup password</string>
- <string name="wakeup_password_summary">Password for remote wakeup</string>
- <string name="wakeup_method_title">Wakeup method</string>
- <string name="wakeup_method_summary">Choose a method to wakeup the vdr host</string>
-
- <string-array name="wakeup_methods">
- <item>Call a URL</item>
- <item>WOL</item>
- </string-array>
-
- <string name="wakeup_wol_custom_boradcast_title">Destination IP address</string>
- <string name="wakeup_wol_custom_boradcast_summary">Unless you have static ARP tables you should use some kind of
+ <!-- wakeup -->
+ <string name="wakeup_preferences">Remote VDR host wakeup</string>
+ <string name="wakeup_enabled_title">Can remote wakeup VDR</string>
+ <string name="wakeup_enabled_summary">Enables to remote wakeup the VDR host</string>
+ <string name="wakeup_url_title">URL for remote wakeup</string>
+ <string name="wakeup_url_summary">URL for a request doing the wakeup</string>
+ <string name="wakeup_user_title">Wakeup user</string>
+ <string name="wakeup_user_summary">User for remote wakeup</string>
+ <string name="wakeup_password_title">Wakeup password</string>
+ <string name="wakeup_password_summary">Password for remote wakeup</string>
+ <string name="wakeup_method_title">Wakeup method</string>
+ <string name="wakeup_method_summary">Choose a method to wakeup the vdr host</string>
+
+ <string-array name="wakeup_methods">
+ <item>Call a URL</item>
+ <item>WOL</item>
+ </string-array>
+
+ <string name="wakeup_wol_custom_boradcast_title">Destination IP address</string>
+ <string name="wakeup_wol_custom_boradcast_summary">Unless you have static ARP tables you should use some kind of
broadcast address.
</string>
- <string name="wakeup_wol_mac_title">MAC-Address</string>
- <string name="wakeup_wol_mac_summary">MAC-Address of the VDR host. Use \':\' or \'-\' or a space as separator.</string>
+ <string name="wakeup_wol_mac_title">MAC-Address</string>
+ <string name="wakeup_wol_mac_summary">MAC-Address of the VDR host. Use \':\' or \'-\' or a space as separator.</string>
- <!-- timer -->
- <string name="timer_preferences">Timer defaults</string>
- <string name="timer_pre_start_buffer_title">Margin at start</string>
- <string name="timer_pre_start_buffer_summary">Minutes recording starts before the beginning of
+ <!-- timer -->
+ <string name="timer_preferences">Timer defaults</string>
+ <string name="timer_pre_start_buffer_title">Margin at start</string>
+ <string name="timer_pre_start_buffer_summary">Minutes recording starts before the beginning of
the broadcast
</string>
- <string name="timer_post_end_buffer_title">Margin at stop</string>
- <string name="timer_post_end_buffer_summary">Minutes recording stops after the end of the
+ <string name="timer_post_end_buffer_title">Margin at stop</string>
+ <string name="timer_post_end_buffer_summary">Minutes recording stops after the end of the
broadcast
</string>
- <string name="timer_default_priority_title">Default priority</string>
- <string name="timer_default_priority_summary">Default priority</string>
- <string name="timer_default_primary_limit_title">Default primary limit</string>
- <string name="timer_default_primary_limit_summary">Default primary limit</string>
- <string name="timer_default_lifetime_title">Default lifetime</string>
- <string name="timer_default_lifetime_summary">Default lifetime</string>
- <string name="timer_already_exists">Timer already defined.</string>
- <string name="timer_created">Timer created</string>
-
-
- <!-- GUI -->
- <string name="gui_preferences">GUI Settings</string>
- <string name="gui_enable_24h_format_title">Use 24-hour format</string>
- <string name="gui_enable_24h_format_summary_on">13:00</string>
- <string name="gui_enable_24h_format_summary_off">1:00 PM</string>
- <string name="gui_channels_show_channel_numbers_title">Show channel numbers</string>
- <string name="gui_channels_show_channel_numbers_summary">Show channel numbers in the channel list.</string>
- <string name="gui_quit_on_back_title">Quit on back button</string>
- <string name="gui_quit_on_back_summary_on">Back button quits the VDR-Manager</string>
- <string name="gui_quit_on_back_summary_off">Back button does not quit VDR-Manager</string>
- <string name="qui_show_imdb_button_title">Show IMDb Button</string>
- <string name="qui_show_imdb_button_summary_on">IMDb Button is shown</string>
- <string name="qui_show_imdb_button_summary_off">IMDb Button is not shown</string>
- <string name="qui_imdb_url_title">IMDb Site</string>
- <string name="qui_imdb_url_summary">Which IMDb site to search.</string>
- <string name="qui_show_omdb_button_title">Show OMDB Button</string>
- <string name="qui_show_omdb_button_summary_on">OMDB Button is shown</string>
- <string name="qui_show_omdb_button_summary_off">OMDB Button is not shown</string>
- <string name="qui_show_tmdb_button_title">Show TMDb Button</string>
- <string name="qui_show_tmdb_button_summary_on">TMDb Button is shown</string>
- <string name="qui_show_tmdb_button_summary_off">TMDb Button is not shown</string>
- <string name="gui_custom_locale_title">Custom language</string>
- <string name="gui_custom_locale_sum">Set a custom language.</string>
-
- <string-array name="imdb_urls">
- <item>International</item>
- <item>imdb.com</item>
- <item>uk.imdb.com</item>
- <item>imdb.de</item>
- <item>imdb.es</item>
- <item>imdb.fr</item>
- <item>imdb.it</item>
- <item>imdb.pt</item>
- </string-array>
- <string-array name="lang">
-
- <!-- <item>Default language</item> -->
- <item>English</item>
- <item>German</item>
- <item>French</item>
- <item>Italian</item>
- <item>Polish</item>
- <item>Ukrainian</item>
- </string-array>
- <string-array name="remux_entries">
- <item>EXT</item>
- <item>EXTERN (deprecated)</item>
- </string-array>
-
- <string name="vdr_advanced_preferences">Advanced</string>
- <string name="vdr_advanced_preferences_summary">Advanced settings</string>
- <string name="vdr_conntimeout_title">Connection Timeout</string>
- <string name="vdr_conntimeout_sum">How long (in seconds) to wait before the connection is established?</string>
- <string name="vdr_readtimeout_title">Read Timeout</string>
- <string name="vdr_readtimeout_sum">How long (in seconds) to wait for every read line operation?</string>
- <string name="vdr_timeout_title">Total timeout</string>
- <string name="vdr_timeout_sum">How long (in seconds) to wait for a whole I/O operation, before it gets aborted?
+ <string name="timer_default_priority_title">Default priority</string>
+ <string name="timer_default_priority_summary">Default priority</string>
+ <string name="timer_default_primary_limit_title">Default primary limit</string>
+ <string name="timer_default_primary_limit_summary">Default primary limit</string>
+ <string name="timer_default_lifetime_title">Default lifetime</string>
+ <string name="timer_default_lifetime_summary">Default lifetime</string>
+ <string name="timer_already_exists">Timer already defined.</string>
+ <string name="timer_created">Timer created</string>
+
+
+ <!-- GUI -->
+ <string name="gui_preferences">GUI Settings</string>
+ <string name="gui_enable_24h_format_title">Use 24-hour format</string>
+ <string name="gui_enable_24h_format_summary_on">13:00</string>
+ <string name="gui_enable_24h_format_summary_off">1:00 PM</string>
+ <string name="gui_channels_show_channel_numbers_title">Show channel numbers</string>
+ <string name="gui_channels_show_channel_numbers_summary">Show channel numbers in the channel list.</string>
+ <string name="gui_quit_on_back_title">Quit on back button</string>
+ <string name="gui_quit_on_back_summary_on">Back button quits the VDR-Manager</string>
+ <string name="gui_quit_on_back_summary_off">Back button does not quit VDR-Manager</string>
+ <string name="qui_show_imdb_button_title">Show IMDb Button</string>
+ <string name="qui_show_imdb_button_summary_on">IMDb Button is shown</string>
+ <string name="qui_show_imdb_button_summary_off">IMDb Button is not shown</string>
+ <string name="qui_imdb_url_title">IMDb Site</string>
+ <string name="qui_imdb_url_summary">Which IMDb site to search.</string>
+ <string name="qui_show_omdb_button_title">Show OMDB Button</string>
+ <string name="qui_show_omdb_button_summary_on">OMDB Button is shown</string>
+ <string name="qui_show_omdb_button_summary_off">OMDB Button is not shown</string>
+ <string name="qui_show_tmdb_button_title">Show TMDb Button</string>
+ <string name="qui_show_tmdb_button_summary_on">TMDb Button is shown</string>
+ <string name="qui_show_tmdb_button_summary_off">TMDb Button is not shown</string>
+ <string name="gui_custom_locale_title">Custom language</string>
+ <string name="gui_custom_locale_sum">Set a custom language.</string>
+
+ <string-array name="imdb_urls">
+ <item>International</item>
+ <item>imdb.com</item>
+ <item>uk.imdb.com</item>
+ <item>imdb.de</item>
+ <item>imdb.es</item>
+ <item>imdb.fr</item>
+ <item>imdb.it</item>
+ <item>imdb.pt</item>
+ </string-array>
+ <string-array name="lang">
+
+ <!-- <item>Default language</item> -->
+ <item>English</item>
+ <item>German</item>
+ <item>French</item>
+ <item>Italian</item>
+ <item>Polish</item>
+ <item>Ukrainian</item>
+ </string-array>
+ <string-array name="remux_entries">
+ <item>EXT</item>
+ <item>EXTERN (deprecated)</item>
+ </string-array>
+
+ <string name="vdr_advanced_preferences">Advanced</string>
+ <string name="vdr_advanced_preferences_summary">Advanced settings</string>
+ <string name="vdr_conntimeout_title">Connection Timeout</string>
+ <string name="vdr_conntimeout_sum">How long (in seconds) to wait before the connection is established?</string>
+ <string name="vdr_readtimeout_title">Read Timeout</string>
+ <string name="vdr_readtimeout_sum">How long (in seconds) to wait for every read line operation?</string>
+ <string name="vdr_timeout_title">Total timeout</string>
+ <string name="vdr_timeout_sum">How long (in seconds) to wait for a whole I/O operation, before it gets aborted?
</string>
- <string name="streaming_password_title">Streamdev password</string>
- <string name="streaming_password_sum">Set your streamdev server password. (a.e. -a \'username:password\')</string>
- <string name="streaming_username_title">Streamdev username</string>
- <string name="streaming_username_sum">Set your streamdev server username. (a.e. -a \'username:password\')</string>
- <string name="vdr_encoding_title">Character encoding</string>
- <string name="vdr_encoding_summary">Character encoding of your VDR device. Default is utf-8.</string>
- <string name="new_vdr">New VDR</string>
- <string name="no_vdr">No VDR Devices</string>
- <string name="vdr_devices_category">VDR devices</string>
- <string name="vdr_prefs_category">Device</string>
- <string name="vdr_name_title">Name</string>
- <string name="vdr_name_summary">A name for this device</string>
- <string name="vdr_device_delete_qeustion">Delete this device?</string>
- <string name="recstream">Streaming of recordings</string>
- <string name="recstream_enable_title">Streaming of recordings</string>
- <string name="recstream_enable_summary">Enable Streaming of recordings</string>
-
- <string-array name="recstream_entries">
- <item>live plugin</item>
- <item>streamdev plugin</item>
- <item>smarttvweb plugin</item>
- </string-array>
-
-
- <string-array name="recstream_smarttvweb_entries">
- <item>Progressive</item>
- <item>MPEG-DASH</item>
- <item>Apple HLS</item>
- </string-array>
-
- <string name="recstream_method_title">Streaming method</string>
- <string name="recstream_method_summary">Currently Streaming over VDR live and or streamdev plugin is supported</string>
- <string name="settings_live_port">VDR live plugin port</string>
- <string name="settings_live_port_summary">VDR live plugin has default port 8008.</string>
-
- <!-- progress -->
- <string name="progress_connect">Connecting…</string>
- <string name="progress_connect_error">Connection failed!</string>
- <string name="progress_connect_timeout">Connection timeout!</string>
- <string name="progress_login">Login.</string>
- <string name="progress_login_error">Login failed.</string>
- <string name="progress_whatson_loading">Loading EPG…</string>
- <string name="progress_timers_loading">Loading timers…</string>
- <string name="progress_recordings_loading">Loading recordings…</string>
- <string name="progress_switching">Switching…</string>
- <string name="progress_channels_loading">Loading channels…</string>
- <string name="progress_loading">Loading…</string>
- <string name="progress_disconnect">Disconnecting…</string>
- <string name="progress_wakeup_sending">Initiating wakeup request…</string>
- <string name="progress_wakeup_sent">Wakeup request sent</string>
- <string name="progress_wakeup_error">Error sending wakeup request: %1$s</string>
- <string name="progress_timer_save">Saving timer…</string>
- <string name="progress_timer_delete">Deleting timer…</string>
- <string name="progress_recording_delete">Deleting recording…</string>
- <string name="progress_timer_enable">Enabling timer…</string>
- <string name="progress_timer_modify">Updating timer…</string>
- <string name="progress_timer_disable">Disabling timer…</string>
- <string name="progress_connect_finished_abnormal">Connection finished abnormal</string>
- <string name="progress_connect_finished_abnormal_arg">Connection finished abnormal: %1$s</string>
- <string name="progress_cache_hit">Loaded from cache.</string>
- <string name="recording_item_menu_delete">Delete</string>
- <string name="recording_item_menu_stream">Stream</string>
- <string name="recent_channels">Recent channels</string>
- <string name="recent_channels_no_history">No history…</string>
- <string name="gui_max_recent_channels_title">Max. recent channels</string>
- <string name="gui_max_recent_channels_summary">How many channels should be kept in the recent channels?</string>
- <string name="timer_detail_day_title">Day</string>
-
- <!--
- Repeat options that appear under an alarm on main Alarm Clock
- screen to identify repetition schedule: special case for when
- the alarm is set to repeat every day
- -->
- <string name="every_day">Every day</string>
-
- <!--
- Repeat options that appear under an alarm on main Alarm Clock
- screen to identify repetition schedule: special case for when
- the alarm is set to never repeat
- -->
- <string name="never">Never</string>
-
- <!--
- Repeat options that appear under an alarm on main Alarm Clock
- screen to identify repetition schedule: concatenate days with
- this character, i.e. "Mon, Tue, Wed"
- -->
- <string name="day_concat">", "</string>
- <string name="timer_detail_repeat_title">Repeat</string>
- <string name="timer_detail_use_vps">Use VPS:</string>
- <string name="timer_detail_priority">Priority:</string>
- <string name="timer_detail_lifetime">Lifetime:</string>
- <string name="timer_detail_lifetime_hint">e.g. 99</string>
- <string name="timer_detail_priority_hint">e.g. 50</string>
- <string name="timer_detail_title_vps">%1$s (VPS)</string>
- <string name="channel_item_menu_switch">Switch to</string>
- <string name="switching_success">Switched to %s</string>
- <string name="switching_failed">Switching to %1$s failed: %2$s</string>
- <string name="switch_to_channel">Switch to</string>
- <string name="sort">Sort</string>
- <string name="sortby">Sort by</string>
- <string name="sortby_time">Time</string>
- <string name="sortby_channel">Channel</string>
- <string name="sortby_alphabet">Alphabet</string>
- <string name="sortby_channellist">Chanellist</string>
- <string name="main_menu_clear_search">Clear Search History</string>
- <string name="vdr_host_not_defined">VDR host not defined</string>
- <string name="processing">Processing…</string>
-
- <string-array name="recent_channels_order_entries">
- <item>Mostly used</item>
- <item>Last used</item>
- </string-array>
- <string-array name="epg_sort_by_time_alpha">
- <item>Time</item>
- <item>Alphabet</item>
- </string-array>
- <string-array name="epg_sort_by_time_alpha_channel">
- <item>Time</item>
- <item>Alphabet</item>
- <item>Channel</item>
- </string-array>
- <string-array name="epg_sort_by_channels_alpha">
- <item>Channels</item>
- <item>Alphabet</item>
- </string-array>
- <string-array name="recordings_group_by">
- <item>By Time</item>
- <item>By Alphabet</item>
- </string-array>
-
- <string name="gui_recent_channels_order_summary">Sort by last used or mostly used</string>
- <string name="gui_recent_channels_order_title">Recent Channels Sorting</string>
-
- <string-array name="channels_group_by">
- <item>Group</item>
- <item>Provider</item>
- <item>Source</item>
- <item>Name</item>
- </string-array>
- <string-array name="navigation_array">
- <item>Channels</item>
- <item>EPG by Time</item>
- <item>EPG by Channel</item>
- <item>Recordings</item>
- <item>Timers</item>
- <item>Remote</item>
- </string-array>
-
- <string name="filter">Filter</string>
- <string name="audio_tracks_template">Audio Tracks: %1$s</string>
- <string name="audio_track_dolby">D</string>
- <string name="vdr_timezone_summary">The time zone used on the server. It is important if you travel and modify timers
+ <string name="streaming_password_title">Streamdev password</string>
+ <string name="streaming_password_sum">Set your streamdev server password. (a.e. -a \'username:password\')</string>
+ <string name="streaming_username_title">Streamdev username</string>
+ <string name="streaming_username_sum">Set your streamdev server username. (a.e. -a \'username:password\')</string>
+ <string name="vdr_encoding_title">Character encoding</string>
+ <string name="vdr_encoding_summary">Character encoding of your VDR device. Default is utf-8.</string>
+ <string name="new_vdr">New VDR</string>
+ <string name="no_vdr">No VDR Devices</string>
+ <string name="vdr_devices_category">VDR devices</string>
+ <string name="vdr_prefs_category">Device</string>
+ <string name="vdr_name_title">Name</string>
+ <string name="vdr_name_summary">A name for this device</string>
+ <string name="vdr_device_delete_qeustion">Delete this device?</string>
+ <string name="recstream">Streaming of recordings</string>
+ <string name="recstream_enable_title">Streaming of recordings</string>
+ <string name="recstream_enable_summary">Enable Streaming of recordings</string>
+
+ <string-array name="recstream_entries">
+ <item>live plugin</item>
+ <item>streamdev plugin</item>
+ <item>smarttvweb plugin</item>
+ </string-array>
+
+
+ <string-array name="recstream_smarttvweb_entries">
+ <item>Progressive</item>
+ <item>MPEG-DASH</item>
+ <item>Apple HLS</item>
+ </string-array>
+
+ <string name="recstream_method_title">Streaming method</string>
+ <string name="recstream_method_summary">Currently Streaming over VDR live and or streamdev plugin is supported</string>
+ <string name="settings_live_port">VDR live plugin port</string>
+ <string name="settings_live_port_summary">VDR live plugin has default port 8008.</string>
+
+ <!-- progress -->
+ <string name="progress_connect">Connecting…</string>
+ <string name="progress_connect_error">Connection failed!</string>
+ <string name="progress_connect_timeout">Connection timeout!</string>
+ <string name="progress_login">Login.</string>
+ <string name="progress_login_error">Login failed.</string>
+ <string name="progress_whatson_loading">Loading EPG…</string>
+ <string name="progress_timers_loading">Loading timers…</string>
+ <string name="progress_recordings_loading">Loading recordings…</string>
+ <string name="progress_switching">Switching…</string>
+ <string name="progress_channels_loading">Loading channels…</string>
+ <string name="progress_loading">Loading…</string>
+ <string name="progress_disconnect">Disconnecting…</string>
+ <string name="progress_wakeup_sending">Initiating wakeup request…</string>
+ <string name="progress_wakeup_sent">Wakeup request sent</string>
+ <string name="progress_wakeup_error">Error sending wakeup request: %1$s</string>
+ <string name="progress_timer_save">Saving timer…</string>
+ <string name="progress_timer_delete">Deleting timer…</string>
+ <string name="progress_recording_delete">Deleting recording…</string>
+ <string name="progress_timer_enable">Enabling timer…</string>
+ <string name="progress_timer_modify">Updating timer…</string>
+ <string name="progress_timer_disable">Disabling timer…</string>
+ <string name="progress_connect_finished_abnormal">Connection finished abnormal</string>
+ <string name="progress_connect_finished_abnormal_arg">Connection finished abnormal: %1$s</string>
+ <string name="progress_cache_hit">Loaded from cache.</string>
+ <string name="recording_item_menu_delete">Delete</string>
+ <string name="recording_item_menu_stream">Stream</string>
+ <string name="recent_channels">Recent channels</string>
+ <string name="recent_channels_no_history">No history…</string>
+ <string name="gui_max_recent_channels_title">Max. recent channels</string>
+ <string name="gui_max_recent_channels_summary">How many channels should be kept in the recent channels?</string>
+ <string name="timer_detail_day_title">Day</string>
+
+ <!--
+ Repeat options that appear under an alarm on main Alarm Clock
+ screen to identify repetition schedule: special case for when
+ the alarm is set to repeat every day
+ -->
+ <string name="every_day">Every day</string>
+
+ <!--
+ Repeat options that appear under an alarm on main Alarm Clock
+ screen to identify repetition schedule: special case for when
+ the alarm is set to never repeat
+ -->
+ <string name="never">Never</string>
+
+ <!--
+ Repeat options that appear under an alarm on main Alarm Clock
+ screen to identify repetition schedule: concatenate days with
+ this character, i.e. "Mon, Tue, Wed"
+ -->
+ <string name="day_concat">", "</string>
+ <string name="timer_detail_repeat_title">Repeat</string>
+ <string name="timer_detail_use_vps">Use VPS:</string>
+ <string name="timer_detail_priority">Priority:</string>
+ <string name="timer_detail_lifetime">Lifetime:</string>
+ <string name="timer_detail_lifetime_hint">e.g. 99</string>
+ <string name="timer_detail_priority_hint">e.g. 50</string>
+ <string name="timer_detail_title_vps">%1$s (VPS)</string>
+ <string name="channel_item_menu_switch">Switch to</string>
+ <string name="switching_success">Switched to %s</string>
+ <string name="switching_failed">Switching to %1$s failed: %2$s</string>
+ <string name="switch_to_channel">Switch to</string>
+ <string name="sort">Sort</string>
+ <string name="sortby">Sort by</string>
+ <string name="sortby_time">Time</string>
+ <string name="sortby_channel">Channel</string>
+ <string name="sortby_alphabet">Alphabet</string>
+ <string name="sortby_channellist">Chanellist</string>
+ <string name="main_menu_clear_search">Clear Search History</string>
+ <string name="vdr_host_not_defined">VDR host not defined</string>
+ <string name="processing">Processing…</string>
+
+ <string-array name="recent_channels_order_entries">
+ <item>Mostly used</item>
+ <item>Last used</item>
+ </string-array>
+ <string-array name="epg_sort_by_time_alpha">
+ <item>Time</item>
+ <item>Alphabet</item>
+ </string-array>
+ <string-array name="epg_sort_by_time_alpha_channel">
+ <item>Time</item>
+ <item>Alphabet</item>
+ <item>Channel</item>
+ </string-array>
+ <string-array name="epg_sort_by_channels_alpha">
+ <item>Channels</item>
+ <item>Alphabet</item>
+ </string-array>
+ <string-array name="recordings_group_by">
+ <item>By Time</item>
+ <item>By Alphabet</item>
+ </string-array>
+
+ <string name="gui_recent_channels_order_summary">Sort by last used or mostly used</string>
+ <string name="gui_recent_channels_order_title">Recent Channels Sorting</string>
+
+ <string-array name="channels_group_by">
+ <item>Group</item>
+ <item>Provider</item>
+ <item>Source</item>
+ <item>Name</item>
+ </string-array>
+ <string-array name="navigation_array">
+ <item>Channels</item>
+ <item>EPG by Time</item>
+ <item>EPG by Channel</item>
+ <item>Recordings</item>
+ <item>Timers</item>
+ <item>Remote</item>
+ </string-array>
+
+ <string name="filter">Filter</string>
+ <string name="audio_tracks_template">Audio Tracks: %1$s</string>
+ <string name="audio_track_dolby">D</string>
+ <string name="vdr_timezone_summary">The time zone used on the server. It is important if you travel and modify timers
from another time zone.
</string>
- <string name="vdr_timezone_title">Select server time zone</string>
- <string name="zone_list_menu_sort_alphabetically">Sort alphabetically</string>
- <string name="zone_list_menu_sort_by_timezone">Sort by time zone</string>
- <string name="probing">Probing %1$s …</string>
- <string name="no_results">No results…</string>
- <string name="recording_started">Recording started</string>
- <string name="set_time">Set time</string>
- <!-- … -->
+ <string name="vdr_timezone_title">Select server time zone</string>
+ <string name="zone_list_menu_sort_alphabetically">Sort alphabetically</string>
+ <string name="zone_list_menu_sort_by_timezone">Sort by time zone</string>
+ <string name="probing">Probing %1$s …</string>
+ <string name="no_results">No results…</string>
+ <string name="recording_started">Recording started</string>
+ <string name="set_time">Set time</string>
+ <!-- … -->
- <!-- SSL related messages -->
+ <!-- SSL related messages -->
- <string name="certificate_problem_message_title">Certificate warning</string>
- <string name="certificate_problem_message_text">The server certificate was not accepted:\n\n
+ <string name="certificate_problem_message_title">Certificate warning</string>
+ <string name="certificate_problem_message_text">The server certificate was not accepted:\n\n
Hostname:\n
%1$s\n
Valid from:\n
@@ -437,124 +437,127 @@
%3$s\n\n
What do you want to do?
</string>
- <string name="certificate_accept_once">Accept once</string>
- <string name="certificate_accepted_forever">Accept forever</string>
- <string name="certificate_not_accepted">Abort</string>
-
- <!-- EPG Content -->
- <string name="Content_Movie__Drama">Movie/Drama</string>
- <string name="Content_Detective__Thriller">Detective/Thriller</string>
- <string name="Content_Adventure__Western__War">Adventure/Western/War</string>
- <string name="Content_Science_Fiction__Fantasy__Horror">Science Fiction/Fantasy/Horror</string>
- <string name="Content_Comedy">Comedy</string>
- <string name="Content_Soap__Melodrama__Folkloric">Soap/Melodrama/Folkloric</string>
- <string name="Content_Romance">Romance</string>
- <string name="Content_Serious__Classical__Religious__Historical_Movie__Drama">Serious/Classical/Religious/Historical
+ <string name="certificate_accept_once">Accept once</string>
+ <string name="certificate_accepted_forever">Accept forever</string>
+ <string name="certificate_not_accepted">Abort</string>
+
+ <!-- EPG Content -->
+ <string name="Content_Movie__Drama">Movie/Drama</string>
+ <string name="Content_Detective__Thriller">Detective/Thriller</string>
+ <string name="Content_Adventure__Western__War">Adventure/Western/War</string>
+ <string name="Content_Science_Fiction__Fantasy__Horror">Science Fiction/Fantasy/Horror</string>
+ <string name="Content_Comedy">Comedy</string>
+ <string name="Content_Soap__Melodrama__Folkloric">Soap/Melodrama/Folkloric</string>
+ <string name="Content_Romance">Romance</string>
+ <string name="Content_Serious__Classical__Religious__Historical_Movie__Drama">Serious/Classical/Religious/Historical
Movie/Drama
</string>
- <string name="Content_Adult_Movie__Drama">Adult Movie/Drama</string>
- <string name="Content_News__Current_Affairs">News/Current Affairs</string>
- <string name="Content_News__Weather_Report">News/Weather Report</string>
- <string name="Content_News_Magazine">News Magazine</string>
- <string name="Content_Documentary">Documentary</string>
- <string name="Content_Discussion__Inverview__Debate">Discussion/Inverview/Debate</string>
- <string name="Content_Show__Game_Show">Show/Game Show</string>
- <string name="Content_Game_Show__Quiz__Contest">Game Show/Quiz/Contest</string>
- <string name="Content_Variety_Show">Variety Show</string>
- <string name="Content_Talk_Show">Talk Show</string>
- <string name="Content_Sports">Sports</string>
- <string name="Content_Special_Event">Special Event</string>
- <string name="Content_Sport_Magazine">Sport Magazine</string>
- <string name="Content_Football__Soccer">Football/Soccer</string>
- <string name="Content_Tennis__Squash">Tennis/Squash</string>
- <string name="Content_Team_Sports">Team Sports</string>
- <string name="Content_Athletics">Athletics</string>
- <string name="Content_Motor_Sport">Motor Sport</string>
- <string name="Content_Water_Sport">Water Sport</string>
- <string name="Content_Winter_Sports">Winter Sports</string>
- <string name="Content_Equestrian">Equestrian</string>
- <string name="Content_Martial_Sports">Martial Sports</string>
- <string name="Content_Childrens__Youth_Programme">Children\'s/Youth Programme</string>
- <string name="Content_Preschool_Childrens_Programme">Pre-school Children\'s Programme</string>
- <string name="Content_Entertainment_Programme_for_6_to_14">Entertainment Programme for 6 to 14</string>
- <string name="Content_Entertainment_Programme_for_10_to_16">Entertainment Programme for 10 to 16</string>
- <string name="Content_Informational__Educational__School_Programme">Informational/Educational/School Programme</string>
- <string name="Content_Cartoons__Puppets">Cartoons/Puppets</string>
- <string name="Content_Music__Ballet__Dance">Music/Ballet/Dance</string>
- <string name="Content_Rock__Pop">Rock/Pop</string>
- <string name="Content_Serious__Classical_Music">Serious/Classical Music</string>
- <string name="Content_Folk__Tradional_Music">Folk/Tradional Music</string>
- <string name="Content_Jazz">Jazz</string>
- <string name="Content_Musical__Opera">Musical/Opera</string>
- <string name="Content_Ballet">Ballet</string>
- <string name="Content_Arts__Culture">Arts/Culture</string>
- <string name="Content_Performing_Arts">Performing Arts</string>
- <string name="Content_Fine_Arts">Fine Arts</string>
- <string name="Content_Religion">Religion</string>
- <string name="Content_Popular_Culture__Traditional_Arts">Popular Culture/Traditional Arts</string>
- <string name="Content_Literature">Literature</string>
- <string name="Content_Film__Cinema">Film/Cinema</string>
- <string name="Content_Experimental_Film__Video">Experimental Film/Video</string>
- <string name="Content_Broadcasting__Press">Broadcasting/Press</string>
- <string name="Content_New_Media">New Media</string>
- <string name="Content_Arts__Culture_Magazine">Arts/Culture Magazine</string>
- <string name="Content_Fashion">Fashion</string>
- <string name="Content_Social__Political__Economics">Social/Political/Economics</string>
- <string name="Content_Magazine__Report__Documentary">Magazine/Report/Documentary</string>
- <string name="Content_Economics__Social_Advisory">Economics/Social Advisory</string>
- <string name="Content_Remarkable_People">Remarkable People</string>
- <string name="Content_Education__Science__Factual">Education/Science/Factual</string>
- <string name="Content_Nature__Animals__Environment">Nature/Animals/Environment</string>
- <string name="Content_Technology__Natural_Sciences">Technology/Natural Sciences</string>
- <string name="Content_Medicine__Physiology__Psychology">Medicine/Physiology/Psychology</string>
- <string name="Content_Foreign_Countries__Expeditions">Foreign Countries/Expeditions</string>
- <string name="Content_Social__Spiritual_Sciences">Social/Spiritual Sciences</string>
- <string name="Content_Further_Education">Further Education</string>
- <string name="Content_Languages">Languages</string>
- <string name="Content_Leisure__Hobbies">Leisure/Hobbies</string>
- <string name="Content_Tourism__Travel">Tourism/Travel</string>
- <string name="Content_Handicraft">Handicraft</string>
- <string name="Content_Motoring">Motoring</string>
- <string name="Content_Fitness_and_Health">Fitness &amp; Health</string>
- <string name="Content_Cooking">Cooking</string>
- <string name="Content_Advertisement__Shopping">Advertisement/Shopping</string>
- <string name="Content_Gardening">Gardening</string>
- <string name="Content_Original_Language">Original Language</string>
- <string name="Content_Black_and_White">Black &amp; White</string>
- <string name="Content_Unpublished">Unpublished</string>
- <string name="Content_Live_Broadcast">Live Broadcast</string>
- <string name="Content_Unknown"></string>
- <!-- EPG Content END -->
- <string name="type_to_filter">type to filter</string>
- <string name="drive_info">Free %1$s GB of %2$s GB (%3$s%%)</string>
- <string name="drive_img">Drive</string>
- <string name="sad_img">Sad</string>
- <string name="search">Search</string>
- <string name="clear_term_after_search_title">Clear Term after Search</string>
- <string name="clear_term_after_search_summary_off">Search term remains after peforming search</string>
- <string name="clear_term_after_search_summary_on">Term gets cleared after performing search</string>
- <string name="drawer_open">Open navigation drawer</string>
- <string name="drawer_close">Close navigation drawer</string>
- <string name="action_websearch">Web search</string>
- <string name="settings_smarttvweb_port_summary">VDR smarttvweb plugin has default port 8000</string>
- <string name="settings_smarttvweb_port">Smarttvweb port</string>
- <string name="recstream_smarttvweb_method_title">Smarttvweb Stream Type</string>
- <string name="recstream_smarttvweb_method_summary">Supported methods: \'Progressive\', \'MPEG-DASH \/ OIPF HAS\',
+ <string name="Content_Adult_Movie__Drama">Adult Movie/Drama</string>
+ <string name="Content_News__Current_Affairs">News/Current Affairs</string>
+ <string name="Content_News__Weather_Report">News/Weather Report</string>
+ <string name="Content_News_Magazine">News Magazine</string>
+ <string name="Content_Documentary">Documentary</string>
+ <string name="Content_Discussion__Inverview__Debate">Discussion/Inverview/Debate</string>
+ <string name="Content_Show__Game_Show">Show/Game Show</string>
+ <string name="Content_Game_Show__Quiz__Contest">Game Show/Quiz/Contest</string>
+ <string name="Content_Variety_Show">Variety Show</string>
+ <string name="Content_Talk_Show">Talk Show</string>
+ <string name="Content_Sports">Sports</string>
+ <string name="Content_Special_Event">Special Event</string>
+ <string name="Content_Sport_Magazine">Sport Magazine</string>
+ <string name="Content_Football__Soccer">Football/Soccer</string>
+ <string name="Content_Tennis__Squash">Tennis/Squash</string>
+ <string name="Content_Team_Sports">Team Sports</string>
+ <string name="Content_Athletics">Athletics</string>
+ <string name="Content_Motor_Sport">Motor Sport</string>
+ <string name="Content_Water_Sport">Water Sport</string>
+ <string name="Content_Winter_Sports">Winter Sports</string>
+ <string name="Content_Equestrian">Equestrian</string>
+ <string name="Content_Martial_Sports">Martial Sports</string>
+ <string name="Content_Childrens__Youth_Programme">Children\'s/Youth Programme</string>
+ <string name="Content_Preschool_Childrens_Programme">Pre-school Children\'s Programme</string>
+ <string name="Content_Entertainment_Programme_for_6_to_14">Entertainment Programme for 6 to 14</string>
+ <string name="Content_Entertainment_Programme_for_10_to_16">Entertainment Programme for 10 to 16</string>
+ <string name="Content_Informational__Educational__School_Programme">Informational/Educational/School Programme</string>
+ <string name="Content_Cartoons__Puppets">Cartoons/Puppets</string>
+ <string name="Content_Music__Ballet__Dance">Music/Ballet/Dance</string>
+ <string name="Content_Rock__Pop">Rock/Pop</string>
+ <string name="Content_Serious__Classical_Music">Serious/Classical Music</string>
+ <string name="Content_Folk__Tradional_Music">Folk/Tradional Music</string>
+ <string name="Content_Jazz">Jazz</string>
+ <string name="Content_Musical__Opera">Musical/Opera</string>
+ <string name="Content_Ballet">Ballet</string>
+ <string name="Content_Arts__Culture">Arts/Culture</string>
+ <string name="Content_Performing_Arts">Performing Arts</string>
+ <string name="Content_Fine_Arts">Fine Arts</string>
+ <string name="Content_Religion">Religion</string>
+ <string name="Content_Popular_Culture__Traditional_Arts">Popular Culture/Traditional Arts</string>
+ <string name="Content_Literature">Literature</string>
+ <string name="Content_Film__Cinema">Film/Cinema</string>
+ <string name="Content_Experimental_Film__Video">Experimental Film/Video</string>
+ <string name="Content_Broadcasting__Press">Broadcasting/Press</string>
+ <string name="Content_New_Media">New Media</string>
+ <string name="Content_Arts__Culture_Magazine">Arts/Culture Magazine</string>
+ <string name="Content_Fashion">Fashion</string>
+ <string name="Content_Social__Political__Economics">Social/Political/Economics</string>
+ <string name="Content_Magazine__Report__Documentary">Magazine/Report/Documentary</string>
+ <string name="Content_Economics__Social_Advisory">Economics/Social Advisory</string>
+ <string name="Content_Remarkable_People">Remarkable People</string>
+ <string name="Content_Education__Science__Factual">Education/Science/Factual</string>
+ <string name="Content_Nature__Animals__Environment">Nature/Animals/Environment</string>
+ <string name="Content_Technology__Natural_Sciences">Technology/Natural Sciences</string>
+ <string name="Content_Medicine__Physiology__Psychology">Medicine/Physiology/Psychology</string>
+ <string name="Content_Foreign_Countries__Expeditions">Foreign Countries/Expeditions</string>
+ <string name="Content_Social__Spiritual_Sciences">Social/Spiritual Sciences</string>
+ <string name="Content_Further_Education">Further Education</string>
+ <string name="Content_Languages">Languages</string>
+ <string name="Content_Leisure__Hobbies">Leisure/Hobbies</string>
+ <string name="Content_Tourism__Travel">Tourism/Travel</string>
+ <string name="Content_Handicraft">Handicraft</string>
+ <string name="Content_Motoring">Motoring</string>
+ <string name="Content_Fitness_and_Health">Fitness &amp; Health</string>
+ <string name="Content_Cooking">Cooking</string>
+ <string name="Content_Advertisement__Shopping">Advertisement/Shopping</string>
+ <string name="Content_Gardening">Gardening</string>
+ <string name="Content_Original_Language">Original Language</string>
+ <string name="Content_Black_and_White">Black &amp; White</string>
+ <string name="Content_Unpublished">Unpublished</string>
+ <string name="Content_Live_Broadcast">Live Broadcast</string>
+ <string name="Content_Unknown"></string>
+ <!-- EPG Content END -->
+ <string name="type_to_filter">type to filter</string>
+ <string name="drive_info">Free %1$s GB of %2$s GB (%3$s%%)</string>
+ <string name="drive_img">Drive</string>
+ <string name="sad_img">Sad</string>
+ <string name="search">Search</string>
+ <string name="clear_term_after_search_title">Clear Term after Search</string>
+ <string name="clear_term_after_search_summary_off">Search term remains after peforming search</string>
+ <string name="clear_term_after_search_summary_on">Term gets cleared after performing search</string>
+ <string name="drawer_open">Open navigation drawer</string>
+ <string name="drawer_close">Close navigation drawer</string>
+ <string name="action_websearch">Web search</string>
+ <string name="settings_smarttvweb_port_summary">VDR smarttvweb plugin has default port 8000</string>
+ <string name="settings_smarttvweb_port">Smarttvweb port</string>
+ <string name="recstream_smarttvweb_method_title">Smarttvweb Stream Type</string>
+ <string name="recstream_smarttvweb_method_summary">Supported methods: \'Progressive\', \'MPEG-DASH \/ OIPF HAS\',
\'Apple HLS\'
</string>
- <string name="remote">Remote Control</string>
- <string name="remote_enable_summary">Shows the remote control view if enabled</string>
- <string name="remote_enable_title">Enable VDR remote control</string>
- <string name="svdrp_port_title">SVDRP Port</string>
- <string name="svdrp_port_summary">Default is 6419</string>
- <string name="label">Label</string>
- <string name="hitkcommand">HITK Command</string>
- <string name="menu_reset">Reset</string>
- <string name="menu_exprt">Export</string>
- <string name="export_custom_key_mapping">Export Custom Key Mapping</string>
- <string name="menu_imprt">Import</string>
- <string name="menu_remapback">\'Back\' is \'Back\' HITK</string>
- <string name="remapback_hint">Longpress on Back Button to leave the remote.</string>
- <string name="not_yet_implemented">Not Yet Implemented</string>
- <string name="timer_error">Can not create timer: %1$s</string>
+ <string name="remote">Remote Control</string>
+ <string name="remote_enable_summary">Shows the remote control view if enabled</string>
+ <string name="remote_enable_title">Enable VDR remote control</string>
+ <string name="svdrp_port_title">SVDRP Port</string>
+ <string name="svdrp_port_summary">Default is 6419</string>
+ <string name="label">Label</string>
+ <string name="hitkcommand">HITK Command</string>
+ <string name="menu_reset">Reset</string>
+ <string name="menu_exprt">Export</string>
+ <string name="export_custom_key_mapping">Export Custom Key Mapping</string>
+ <string name="menu_imprt">Import</string>
+ <string name="menu_remapback">\'Back\' is \'Back\' HITK</string>
+ <string name="remapback_hint">Longpress on Back Button to leave the remote.</string>
+ <string name="not_yet_implemented">Not Yet Implemented</string>
+ <string name="timer_error">Can not create timer: %1$s</string>
+ <string name="permission_rationale">The app needs Storage permissions to import/export.</string>
+ <string name="remote_keys_imported">Remote Keys imported: %1$s</string>
+ <string name="remote_nothing_to_import" >No custom mapping…</string>
</resources>