diff options
author | lado <herrlado@gmail.com> | 2011-10-15 02:57:34 +0200 |
---|---|---|
committer | lado <herrlado@gmail.com> | 2011-10-15 02:57:34 +0200 |
commit | 9e369f6edd85fcd77c1ce4009df63d9993e53d18 (patch) | |
tree | 86f9fc0f092354048cdb51a828bf2e61e87fc40b | |
parent | e11ed9dce9afefb3818d64ac95ef24edf9f9c041 (diff) | |
download | vdr-manager-9e369f6edd85fcd77c1ce4009df63d9993e53d18.tar.gz vdr-manager-9e369f6edd85fcd77c1ce4009df63d9993e53d18.tar.bz2 |
implemented search (not yet 100% clean) and time search not know if
works, not yet tested.
Added imdb support
22 files changed, 677 insertions, 375 deletions
diff --git a/vdrmanager/AndroidManifest.xml b/vdrmanager/AndroidManifest.xml index c22a0e8..35fb221 100644 --- a/vdrmanager/AndroidManifest.xml +++ b/vdrmanager/AndroidManifest.xml @@ -1,39 +1,77 @@ <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" - package="de.bjusystems.vdrmanager" android:versionName="0.2" + package="de.bjusystems.vdrmanager" android:versionName="0.2_12102011" android:versionCode="02"> - <application android:icon="@drawable/app_logo" android:label="@string/app_name" - android:debuggable="true" android:name=".app.VdrManagerApp"> + <application android:icon="@drawable/app_logo" + android:label="@string/app_name" android:debuggable="true" + android:name=".app.VdrManagerApp"> <activity android:label="@string/app_name" android:name=".gui.VdrManagerActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> - + <intent-filter> <action android:name="android.intent.action.SEARCH" /> </intent-filter> - <meta-data android:name="android.app.default_searchable" - android:value=".gui.EpgSearchActivity" /> - + <meta-data android:name="android.app.default_searchable" + android:value=".gui.EpgSearchListActivity" /> + </activity> <activity android:name=".gui.TimeEpgListActivity" android:configChanges="orientation" /> <activity android:name=".gui.EventEpgListActivity" - android:configChanges="orientation" /> + android:configChanges="orientation"> + <intent-filter> + <action android:name="android.intent.action.SEARCH" /> + </intent-filter> + <meta-data android:name="android.app.default_searchable" + android:value=".gui.EpgSearchListActivity" /> + </activity> <activity android:name=".gui.TimerListActivity" - android:configChanges="orientation"></activity> + android:configChanges="orientation"> + <intent-filter> + <action android:name="android.intent.action.SEARCH" /> + </intent-filter> + <meta-data android:name="android.app.default_searchable" + android:value=".gui.EpgSearchListActivity" /> + </activity> <activity android:name=".gui.PreferencesActivity" android:configChanges="orientation"></activity> <activity android:name=".gui.ChannelListActivity" - android:configChanges="orientation"></activity> + android:configChanges="orientation"> + <intent-filter> + <action android:name="android.intent.action.SEARCH" /> + </intent-filter> + <meta-data android:name="android.app.default_searchable" + android:value=".gui.EpgSearchListActivity" /> + </activity> <activity android:name=".gui.EpgDetailsActivity" - android:configChanges="orientation"></activity> - <activity android:name=".gui.TimerDetailsActivity"></activity> + android:configChanges="orientation"> + <intent-filter> + <action android:name="android.intent.action.SEARCH" /> + </intent-filter> + <meta-data android:name="android.app.default_searchable" + android:value=".gui.EpgSearchListActivity" /> + </activity> + <activity android:name=".gui.TimerDetailsActivity"> + <intent-filter> + <action android:name="android.intent.action.SEARCH" /> + </intent-filter> + <meta-data android:name="android.app.default_searchable" + android:value=".gui.EpgSearchListActivity" /> + </activity> <activity android:name=".gui.RecordingListActivity" - android:configChanges="orientation"></activity> - <activity android:name=".gui.EpgSearchActivity"> + android:configChanges="orientation"> + <intent-filter> + <action android:name="android.intent.action.SEARCH" /> + </intent-filter> + <meta-data android:name="android.app.default_searchable" + android:value=".gui.EpgSearchListActivity" /> + </activity> + <activity android:name=".gui.EpgSearchListActivity" + android:configChanges="orientation"> <intent-filter> <action android:name="android.intent.action.SEARCH" /> </intent-filter> @@ -42,10 +80,11 @@ </activity> <activity android:name=".gui.EpgSearchTimesListActivity"></activity> - - - <provider android:name=".data.db.DataProvider" android:authorities="de.bjusystems.vdrmanager.provider" /> - + + + <provider android:name=".data.db.DataProvider" + android:authorities="de.bjusystems.vdrmanager.provider" /> + </application> diff --git a/vdrmanager/res/layout/epg_detail.xml b/vdrmanager/res/layout/epg_detail.xml index 41305a2..bc64690 100644 --- a/vdrmanager/res/layout/epg_detail.xml +++ b/vdrmanager/res/layout/epg_detail.xml @@ -129,7 +129,7 @@ android:layout_centerHorizontal="true" style="?android:attr/buttonStyleSmall" android:layout_marginLeft="20dip" android:layout_marginRight="20dip" android:background="@android:drawable/list_selector_background" - android:text="@string/epg_event_create_timer_text"/> + android:text="@string/epg_eent_livetv_text"/> <ImageButton android:id="@+id/epg_event_create_timer" @@ -141,6 +141,18 @@ android:background="@android:drawable/list_selector_background" style="?android:attr/buttonStyleSmall" android:text="@string/epg_event_create_timer_text"/> + + <ImageButton + android:id="@+id/epg_event_imdb" + android:src="@drawable/imdb" + android:layout_width="wrap_content" + android:layout_height="wrap_content" android:layout_marginLeft="20dip" android:layout_marginRight="20dip" + android:layout_gravity="center_horizontal" + android:layout_centerHorizontal="true" + android:background="@android:drawable/list_selector_background" + style="?android:attr/buttonStyleSmall" + android:text="@string/epg_event_imdb_text"/> + <!-- <ImageButton diff --git a/vdrmanager/res/layout/epg_event_item.xml b/vdrmanager/res/layout/epg_event_item.xml index c1ce677..bf54b10 100644 --- a/vdrmanager/res/layout/epg_event_item.xml +++ b/vdrmanager/res/layout/epg_event_item.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/timer_item" android:layout_width="fill_parent" - android:layout_height="fill_parent" android:padding="4dp" + android:layout_height="fill_parent" android:padding="5dp" android:orientation="vertical"> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="vertical" @@ -31,7 +31,7 @@ </LinearLayout> - <LinearLayout android:layout_width="fill_parent" + <LinearLayout android:layout_width="fill_parent" android:padding="3dip" android:layout_height="wrap_content" android:layout_marginTop="0dip" android:orientation="horizontal"> @@ -49,5 +49,13 @@ android:layout_height="wrap_content" android:text="89min"/> </LinearLayout> + + <TextView android:id="@+id/event_item_description" + android:layout_width="wrap_content" + android:textAppearance="?android:textAppearanceSmall" + android:visibility="gone" + android:textSize="12dip" + android:padding="3dip" + android:layout_height="wrap_content" /> </LinearLayout> </LinearLayout>
\ No newline at end of file diff --git a/vdrmanager/res/menu/epg_list_menu.xml b/vdrmanager/res/menu/epg_list_menu.xml index cb5e4cf..44ae64d 100644 --- a/vdrmanager/res/menu/epg_list_menu.xml +++ b/vdrmanager/res/menu/epg_list_menu.xml @@ -3,9 +3,11 @@ <item android:id="@+id/epg_menu_search" + android:icon="@android:drawable/ic_menu_search" android:title="@string/epg_menu_search"/> <item android:id="@+id/epg_menu_times" + android:icon="@android:drawable/ic_menu_search" android:title="@string/epg_menu_times"/> </menu>
\ No newline at end of file diff --git a/vdrmanager/res/values/channel_list.xml b/vdrmanager/res/values/channel_list.xml index 8c3bd89..2a15cc9 100644 --- a/vdrmanager/res/values/channel_list.xml +++ b/vdrmanager/res/values/channel_list.xml @@ -9,6 +9,7 @@ <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> diff --git a/vdrmanager/res/values/epg.xml b/vdrmanager/res/values/epg.xml index a5e32fe..db84fdd 100644 --- a/vdrmanager/res/values/epg.xml +++ b/vdrmanager/res/values/epg.xml @@ -9,6 +9,8 @@ <string name="epg_list_search_label">Search results</string> <!-- create timer --> + <string name="epg_event_imdb_text">IMDB 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> @@ -18,8 +20,10 @@ <string name="epg_duration_template_live">%1$s/%2$s min</string> <string name="epg_of_a_channel">EPG -> %1$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="search_epg_hint">Search EPG</string> - <string name="epg_search_settings_description">Searcg VDR EPG</string> + <string name="epg_search_settings_description">Search VDR EPG</string> </resources> diff --git a/vdrmanager/res/values/preferences.xml b/vdrmanager/res/values/preferences.xml index 16737ef..a1d3f81 100644 --- a/vdrmanager/res/values/preferences.xml +++ b/vdrmanager/res/values/preferences.xml @@ -17,8 +17,8 @@ <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">Channels</string> - <string name="channel_filter_last_summary">Channels to use</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> @@ -76,9 +76,30 @@ <string name="gui_channels_show_channel_numbers_key">key_channels_show_channel_numbers</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="qui_quit_on_back_key">key_gui_quit_on_back</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_key">key_qui_show_imdb_button</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_key">key_qui_imdb_url</string> + <string name="qui_imdb_url_title">IMDb Site</string> + <string name="qui_imdb_url_summary">Which IMDb site to search.</string> + + + <string-array name="imdb_urls"> + <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> </resources> diff --git a/vdrmanager/res/xml/preferences.xml b/vdrmanager/res/xml/preferences.xml index 1f54c26..88c27d6 100644 --- a/vdrmanager/res/xml/preferences.xml +++ b/vdrmanager/res/xml/preferences.xml @@ -3,7 +3,7 @@ <PreferenceCategory android:title="@string/vdr_preferences" android:key="vdr_preferences"> - + <EditTextPreference android:key="@string/vdr_host_key" android:title="@string/vdr_host_title" android:summary="@string/vdr_host_summary" /> <EditTextPreference android:key="@string/vdr_port_key" @@ -16,13 +16,14 @@ android:title="@string/vdr_ssl_title" android:summary="@string/vdr_ssl_summary" /> </PreferenceCategory> - + <PreferenceCategory android:title="@string/channel_filter_preferences" android:key="filter_preferences"> <CheckBoxPreference android:key="@string/channel_filter_filter_key" android:title="@string/channel_filter_filter_title" android:summary="@string/channel_filter_filter_summary" /> <EditTextPreference android:key="@string/channel_filter_last_key" android:title="@string/channel_filter_last_title" android:summary="@string/channel_filter_last_summary" + android:dependency="@string/channel_filter_filter_key" android:defaultValue="1" /> </PreferenceCategory> @@ -78,35 +79,48 @@ android:title="@string/gui_enable_24h_format_title" android:summaryOn="@string/gui_enable_24h_format_summary_on" android:summaryOff="@string/gui_enable_24h_format_summary_off" /> - - <CheckBoxPreference android:key="@string/qui_quit_on_back_key" + + <CheckBoxPreference android:key="@string/qui_show_imdb_button_key" + android:title="@string/qui_show_imdb_button_title" android:summaryOn="@string/qui_show_imdb_button_summary_on" + android:summaryOff="@string/qui_show_imdb_button_summary_off" + android:defaultValue="true" /> + + <ListPreference android:key="@string/qui_imdb_url_key" + android:title="@string/qui_imdb_url_title" android:summaryOn="@string/qui_imdb_url_summary" + android:entries="@array/imdb_urls" android:entryValues="@array/imdb_urls" + android:dependency="@string/qui_show_imdb_button_key" + android:defaultValue="imdb.de" /> + + <CheckBoxPreference android:key="@string/qui_quit_on_back_key" android:title="@string/gui_quit_on_back_title" android:summaryOn="@string/gui_quit_on_back_summary_on" android:summaryOff="@string/gui_quit_on_back_summary_off" android:defaultValue="true" /> </PreferenceCategory> + <PreferenceCategory android:title="@string/livetv"> <EditTextPreference android:key="streamingport" android:inputType="number" android:title="@string/settings_livetv_port" android:summary="@string/settings_livetv_port_summary" android:defaultValue="3000" /> - + <ListPreference android:key="livetv_streamformat" android:title="@string/settings_livetv_streamformat" android:defaultValue="TS" android:entries="@array/livetv_streamformat" android:entryValues="@array/livetv_streamformat_values" /> - - <CheckBoxPreference android:key="remux_enable" android:title="@string/remux_enable_title" android:summary="@string/remux_enable_summary" - - /> - <EditTextPreference android:dependency="remux_enable" android:key="remux_command" android:title="@string/remux_command_title" android:defaultValue="EXT" android:summary="@string/remux_command_summary" - /> - <EditTextPreference android:dependency="remux_enable" android:key="remux_parameter" android:title="@string/remux_parameter_title" android:summary="@string/remux_parameter_summary" - android:defaultValue="QUALITY=DSL1000" - /> - - + <CheckBoxPreference android:key="remux_enable" + android:title="@string/remux_enable_title" android:summary="@string/remux_enable_summary" /> + <EditTextPreference android:dependency="remux_enable" + android:key="remux_command" android:title="@string/remux_command_title" + android:defaultValue="EXT" android:summary="@string/remux_command_summary" /> + + <EditTextPreference android:dependency="remux_enable" + android:key="remux_parameter" android:title="@string/remux_parameter_title" + android:summary="@string/remux_parameter_summary" + android:defaultValue="QUALITY=DSL1000" /> + + </PreferenceCategory> - + </PreferenceScreen> diff --git a/vdrmanager/src/de/bjusystems/vdrmanager/app/Intents.java b/vdrmanager/src/de/bjusystems/vdrmanager/app/Intents.java index 9b113e8..dc71105 100644 --- a/vdrmanager/src/de/bjusystems/vdrmanager/app/Intents.java +++ b/vdrmanager/src/de/bjusystems/vdrmanager/app/Intents.java @@ -3,5 +3,6 @@ package de.bjusystems.vdrmanager.app; public interface Intents { public static final String CURRENT_CHANNEL = "CURRENT_CHANNEL"; + public static final String HIGHLIGHT = "HIGHLIGHT"; } diff --git a/vdrmanager/src/de/bjusystems/vdrmanager/app/VdrManagerApp.java b/vdrmanager/src/de/bjusystems/vdrmanager/app/VdrManagerApp.java index fd84f25..a714845 100644 --- a/vdrmanager/src/de/bjusystems/vdrmanager/app/VdrManagerApp.java +++ b/vdrmanager/src/de/bjusystems/vdrmanager/app/VdrManagerApp.java @@ -23,12 +23,12 @@ public class VdrManagerApp extends Application { private Timer currentTimer; private Channel currentChannel; - private ArrayList<Epg> currentEpgList = new ArrayList<Epg>(); - public ArrayList<Epg> getCurrentEpgList() { + private List<Epg> currentEpgList = new ArrayList<Epg>(); + public List<Epg> getCurrentEpgList() { return currentEpgList; } - public void setCurrentEpgList(ArrayList<Epg> currentEpgList) { + public void setCurrentEpgList(List<Epg> currentEpgList) { this.currentEpgList = currentEpgList; } diff --git a/vdrmanager/src/de/bjusystems/vdrmanager/data/Preferences.java b/vdrmanager/src/de/bjusystems/vdrmanager/data/Preferences.java index c415465..2570e67 100644 --- a/vdrmanager/src/de/bjusystems/vdrmanager/data/Preferences.java +++ b/vdrmanager/src/de/bjusystems/vdrmanager/data/Preferences.java @@ -2,13 +2,13 @@ package de.bjusystems.vdrmanager.data; import android.content.Context; import android.content.SharedPreferences; -import android.test.IsolatedContext; import de.bjusystems.vdrmanager.R; /** * Class for all preferences * - * @author bju + * @author bju, lado + * */ public class Preferences { @@ -110,6 +110,36 @@ public class Preferences { * Quits the app on back button */ private boolean quiteOnBackButton = true; + + + /** + * Show IMDB buttons, where possible (e.g. EPG Details) + */ + private boolean showImdbButton = true; + + + /** + * On Which imdb site to search? + */ + private String imdbUrl = "imdb.de"; + + + public String getImdbUrl() { + return imdbUrl; + } + + + public void setImdbUrl(String imdbUrl) { + this.imdbUrl = imdbUrl; + } + + + /** + * @return whether to shwo imdb button + */ + public boolean isShowImdbButton() { + return showImdbButton; + } /** Properties singleton */ private static Preferences thePrefs; @@ -498,6 +528,10 @@ public class Preferences { prefs.quiteOnBackButton = getBoolean(context, R.string.qui_quit_on_back_key, true); + prefs.showImdbButton = getBoolean(context, R.string.qui_show_imdb_button_key, true); + + prefs.imdbUrl = getString(context, R.string.qui_imdb_url_key, "imdb.de"); + thePrefs = prefs; } diff --git a/vdrmanager/src/de/bjusystems/vdrmanager/gui/BaseEpgListActivity.java b/vdrmanager/src/de/bjusystems/vdrmanager/gui/BaseEpgListActivity.java index c1530dc..d298de1 100644 --- a/vdrmanager/src/de/bjusystems/vdrmanager/gui/BaseEpgListActivity.java +++ b/vdrmanager/src/de/bjusystems/vdrmanager/gui/BaseEpgListActivity.java @@ -30,33 +30,33 @@ import de.bjusystems.vdrmanager.utils.svdrp.SvdrpEvent; /** * @author lado - * + * */ -public abstract class BaseEpgListActivity extends BaseActivity implements SimpleGestureListener{ +public abstract class BaseEpgListActivity extends BaseActivity implements + SimpleGestureListener { - private static final int REQUEST_CODE_TIMED_EDIT = 41; - + private SimpleGestureFilter detector; - + protected EpgClient epgClient; - + protected EventAdapter adapter; - + protected SvdrpProgressDialog progress; - + + protected String highlight = null; + protected static final Date FUTURE = new Date(Long.MAX_VALUE); - - //private static final Date BEGIN = new Date(0); + // private static final Date BEGIN = new Date(0); protected Channel currentChannel = null; - + protected ListView listView; abstract protected int getWindowTitle(); - - + @Override protected void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -66,11 +66,12 @@ public abstract class BaseEpgListActivity extends BaseActivity implements Simple setTitle(getWindowTitle()); initChannel(); } - - private void initChannel(){ - currentChannel = getIntent().getParcelableExtra(Intents.CURRENT_CHANNEL); + + private void initChannel() { + currentChannel = getIntent() + .getParcelableExtra(Intents.CURRENT_CHANNEL); } - + protected void deleteTimer(final EventListItem item) { final DeleteTimerTask task = new DeleteTimerTask(this, item.getEpg() @@ -82,11 +83,13 @@ public abstract class BaseEpgListActivity extends BaseActivity implements Simple }; task.start(); } - - - /* (non-Javadoc) - * @see de.bjusystems.vdrmanager.gui.BaseActivity#onCreateOptionsMenu(android.view.Menu) + /* + * (non-Javadoc) + * + * @see + * de.bjusystems.vdrmanager.gui.BaseActivity#onCreateOptionsMenu(android + * .view.Menu) */ @Override public boolean onCreateOptionsMenu(final Menu menu) { @@ -97,11 +100,13 @@ public abstract class BaseEpgListActivity extends BaseActivity implements Simple return true; } - protected void prepareTimer(EventListItem event){ - + protected void prepareTimer(EventListItem event) { + } - - /* (non-Javadoc) + + /* + * (non-Javadoc) + * * @see android.app.Activity#onContextItemSelected(android.view.MenuItem) */ @Override @@ -137,9 +142,13 @@ public abstract class BaseEpgListActivity extends BaseActivity implements Simple return true; } - - /* (non-Javadoc) - * @see de.bjusystems.vdrmanager.gui.BaseActivity#onOptionsItemSelected(android.view.MenuItem) + + /* + * (non-Javadoc) + * + * @see + * de.bjusystems.vdrmanager.gui.BaseActivity#onOptionsItemSelected(android + * .view.MenuItem) */ public boolean onOptionsItemSelected(final MenuItem item) { @@ -147,9 +156,8 @@ public abstract class BaseEpgListActivity extends BaseActivity implements Simple switch (item.getItemId()) { case R.id.epg_menu_search: - intent = new Intent(); - intent.setClass(this, EpgSearchActivity.class); - startActivity(intent); + //startSearchManager(); + super.onSearchRequested(); break; case R.id.epg_menu_times: intent = new Intent(); @@ -160,9 +168,11 @@ public abstract class BaseEpgListActivity extends BaseActivity implements Simple return super.onOptionsItemSelected(item); } - - /* (non-Javadoc) - * @see android.app.Activity#onCreateContextMenu(android.view.ContextMenu, android.view.View, android.view.ContextMenu.ContextMenuInfo) + /* + * (non-Javadoc) + * + * @see android.app.Activity#onCreateContextMenu(android.view.ContextMenu, + * android.view.View, android.view.ContextMenu.ContextMenuInfo) */ @Override public void onCreateContextMenu(final ContextMenu menu, final View v, @@ -201,7 +211,6 @@ public abstract class BaseEpgListActivity extends BaseActivity implements Simple } - protected void toggleTimer(final EventListItem item) { final ToggleTimerTask task = new ToggleTimerTask(this, item.getEpg() .getTimer()) { @@ -213,8 +222,11 @@ public abstract class BaseEpgListActivity extends BaseActivity implements Simple task.start(); } - /* (non-Javadoc) - * @see android.app.Activity#onActivityResult(int, int, android.content.Intent) + /* + * (non-Javadoc) + * + * @see android.app.Activity#onActivityResult(int, int, + * android.content.Intent) */ @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { @@ -224,7 +236,7 @@ public abstract class BaseEpgListActivity extends BaseActivity implements Simple } } } - + /** * @param parent * @param view @@ -247,10 +259,14 @@ public abstract class BaseEpgListActivity extends BaseActivity implements Simple // show details final Intent intent = new Intent(); intent.setClass(this, EpgDetailsActivity.class); + intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT + | Intent.FLAG_ACTIVITY_SINGLE_TOP); + if (highlight != null) { + intent.putExtra(Intents.HIGHLIGHT, highlight); + } startActivity(intent); } - @Override protected void onPause() { super.onPause(); @@ -262,7 +278,6 @@ public abstract class BaseEpgListActivity extends BaseActivity implements Simple progress = null; } } - public void svdrpEvent(final SvdrpEvent event, final Epg result) { @@ -285,7 +300,7 @@ public abstract class BaseEpgListActivity extends BaseActivity implements Simple break; } } - + @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); @@ -293,6 +308,7 @@ public abstract class BaseEpgListActivity extends BaseActivity implements Simple int top = savedInstanceState.getInt("TOP"); listView.setSelectionFromTop(index, top); } + @Override protected void onSaveInstanceState(Bundle outState) { int index = listView.getFirstVisiblePosition(); @@ -302,7 +318,7 @@ public abstract class BaseEpgListActivity extends BaseActivity implements Simple outState.putInt("TOP", top); super.onSaveInstanceState(outState); } - + protected abstract void finishedSuccess(); public boolean onSearchRequested() { @@ -311,6 +327,11 @@ public abstract class BaseEpgListActivity extends BaseActivity implements Simple return true; } + protected void startSearchManager() { + Bundle appData = new Bundle(); + startSearch(highlight, false, appData, false); + } + @Override public boolean dispatchTouchEvent(MotionEvent me) { this.detector.onTouchEvent(me); @@ -318,11 +339,12 @@ public abstract class BaseEpgListActivity extends BaseActivity implements Simple } public void onSwipe(int direction) { - + } + public void onDoubleTap() { // TODO Auto-generated method stub - + } } diff --git a/vdrmanager/src/de/bjusystems/vdrmanager/gui/ChannelAdapter.java b/vdrmanager/src/de/bjusystems/vdrmanager/gui/ChannelAdapter.java index c712cdd..7c0ff05 100644 --- a/vdrmanager/src/de/bjusystems/vdrmanager/gui/ChannelAdapter.java +++ b/vdrmanager/src/de/bjusystems/vdrmanager/gui/ChannelAdapter.java @@ -7,6 +7,10 @@ import java.util.Map; import android.content.Context; import android.graphics.Color; +import android.text.Spannable; +import android.text.SpannableString; +import android.text.TextUtils; +import android.util.Pair; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -18,11 +22,11 @@ import android.widget.TextView; import de.bjusystems.vdrmanager.R; import de.bjusystems.vdrmanager.data.Channel; import de.bjusystems.vdrmanager.data.Preferences; +import de.bjusystems.vdrmanager.utils.svdrp.ChannelClient; class ChannelAdapter extends BaseExpandableListAdapter implements Filterable// , - // SectionIndexer +// SectionIndexer { - @Override public boolean areAllItemsEnabled() { return true; @@ -93,18 +97,20 @@ class ChannelAdapter extends BaseExpandableListAdapter implements Filterable// , view.setBackgroundColor(Color.BLACK); - String name = item.getName(); + CharSequence name = item.getName(); + name = Utils.highlight(String.valueOf(name), channelFilter); + if (showChannelNumber) { name = item.getNumber() + " - " + name; } itemHolder.name.setText(name); - - if(groupBy != ChannelListActivity.MENU_PROVIDER){ + + if (groupBy != ChannelListActivity.MENU_PROVIDER) { itemHolder.aux.setText(item.getProvider()); } else { itemHolder.aux.setText(""); } - + return view; } @@ -132,6 +138,11 @@ class ChannelAdapter extends BaseExpandableListAdapter implements Filterable// , View convertView, ViewGroup parent) { String group = (String) getGroup(groupPosition); + + int channelCount = this.channels.get(group).size(); + + CharSequence groupDisplay = Utils.highlight(group, groupFilter); + ChannelHolder itemHolder = new ChannelHolder(); // recycle view? @@ -149,8 +160,8 @@ class ChannelAdapter extends BaseExpandableListAdapter implements Filterable// , } else { itemHolder = (ChannelHolder) view.getTag(); } - itemHolder.name.setText(group); - itemHolder.aux.setText(String.valueOf(this.channels.get(group).size())); + itemHolder.name.setText(groupDisplay); + itemHolder.aux.setText(String.valueOf(channelCount)); return view; } @@ -168,27 +179,64 @@ class ChannelAdapter extends BaseExpandableListAdapter implements Filterable// , return true; } - public Filter getFilter() { - return new Filter() { + private String groupFilter = null; - private ArrayList<Channel> ALL = channels.get(0); + private String channelFilter = null; + public Filter getFilter() { + return new Filter() { @Override protected FilterResults performFiltering(CharSequence arg0) { - ArrayList<Channel> c = new ArrayList<Channel>(ALL); - Iterator<Channel> ci = c.iterator(); - while (ci.hasNext()) { - if (ci.next().getName().startsWith(arg0.toString()) == false) { - ci.remove(); + FilterResults fr = new FilterResults(); + String q = String.valueOf(arg0).toLowerCase(); + ArrayList<String> groups = new ArrayList<String>(); + HashMap<String, ArrayList<Channel>> groupChannels = new HashMap<String, ArrayList<Channel>>(); + if (groupBy == ChannelListActivity.MENU_GROUP) { + groupFilter = String.valueOf(arg0).toLowerCase(); + for (String str : ChannelClient.getChannelGroups()) { + String g = str.toLowerCase(); + if (g.indexOf(q) != -1) { + groups.add(str); + groupChannels.put(str, ChannelClient + .getGroupChannels().get(str)); + } + } + + } else if (groupBy == ChannelListActivity.MENU_PROVIDER) { + groupFilter = String.valueOf(arg0).toLowerCase(); + for (Map.Entry<String, ArrayList<Channel>> p : ChannelClient + .getProviderChannels().entrySet()) { + String pr = p.getKey(); + String g = pr.toLowerCase(); + if (g.indexOf(q) != -1) { + groups.add(pr); + groupChannels.put(pr, p.getValue()); + } } + + } else { + channelFilter = String.valueOf(arg0).toLowerCase(); + ArrayList<Channel> channels = new ArrayList<Channel>(); + for(Channel c : ChannelClient.getChannels()){ + String cname = c.getName(); + String tmp = cname.toLowerCase(); + if(tmp.indexOf(channelFilter) != -1){ + channels.add(c); + } + } + String fakeGroup = context.getString(R.string.groupby_name_all_channels_group); + groups.add (fakeGroup); + groupChannels.put(fakeGroup, channels); } - FilterResults fr = new FilterResults(); + fr.values = Pair.create(groups, groupChannels); return fr; } @Override protected void publishResults(CharSequence arg0, FilterResults arg1) { - notifyDataSetChanged(); + Pair<ArrayList<String>, HashMap<String, ArrayList<Channel>>> res = (Pair<ArrayList<String>, HashMap<String, ArrayList<Channel>>>) arg1.values; + fill(res.first, res.second, groupBy); + } }; } diff --git a/vdrmanager/src/de/bjusystems/vdrmanager/gui/ChannelListActivity.java b/vdrmanager/src/de/bjusystems/vdrmanager/gui/ChannelListActivity.java index a89034b..a2249b9 100644 --- a/vdrmanager/src/de/bjusystems/vdrmanager/gui/ChannelListActivity.java +++ b/vdrmanager/src/de/bjusystems/vdrmanager/gui/ChannelListActivity.java @@ -4,7 +4,9 @@ import java.util.ArrayList; import java.util.HashMap; import android.app.Activity; +import android.app.AlertDialog; import android.content.Context; +import android.content.DialogInterface; import android.content.Intent; import android.os.Bundle; import android.text.Editable; @@ -17,6 +19,7 @@ import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.inputmethod.InputMethodManager; +import android.widget.ArrayAdapter; import android.widget.EditText; import android.widget.ExpandableListView; import android.widget.ExpandableListView.ExpandableListContextMenuInfo; @@ -46,22 +49,14 @@ public class ChannelListActivity extends BaseActivity implements ChannelAdapter adapter; Preferences prefs; SvdrpProgressDialog progress; - private EditText searchBox; - public static final int MENU_GROUP_GROUP = 1; - public static final int MENU_GROUP_PROVIDER = 2; - public static final int MENU_GROUP_NAME = 3; - // public static final int MENU_GROUP_SHOW_CHANNEL_NUMBERS = 2; - - public static final int MENU_GROUP = 1; - public static final int MENU_PROVIDER = 2; - public static final int MENU_NAME = 3; - - private TextWatcher filterTextWatcher; + public static final int MENU_GROUP = 0; + public static final int MENU_PROVIDER = 1; + public static final int MENU_NAME = 2; private int groupBy = MENU_GROUP; - private final ArrayList<String> ALL_CHANNELS_GROUP = new ArrayList<String>( + final static ArrayList<String> ALL_CHANNELS_GROUP = new ArrayList<String>( 1); ExpandableListView listView; @@ -95,58 +90,17 @@ public class ChannelListActivity extends BaseActivity implements setTitle(R.string.action_menu_channels); adapter = new ChannelAdapter(this); - searchBox = (EditText) findViewById(R.id.search_box); - - filterTextWatcher = new TextWatcher() { - - public void afterTextChanged(Editable s) { - } - - public void beforeTextChanged(CharSequence s, int start, int count, - int after) { - } - - public void onTextChanged(CharSequence s, int start, int before, - int count) { - adapter.getFilter().filter(s); - } - }; - searchBox.addTextChangedListener(filterTextWatcher); - // Create adapter for ListView listView = (ExpandableListView) findViewById(R.id.channel_list); // listView.setOnItemClickListener(this); listView.setOnChildClickListener(this); - // listView.setOnGroupClickListener(this); - // - // public boolean onChildClick(ExpandableListView arg0, View arg1, - // int arg2, int arg3, long arg4) { - // Toast.makeText(getBaseContext(), "Child clicked", - // Toast.LENGTH_LONG).show(); - // return false; - // } - // }); - // - // listView.setOnGroupClickListener(new OnGroupClickListener() { - // - // public boolean onGroupClick(ExpandableListView arg0, View arg1, - // int arg2, long arg3) { - // Toast.makeText(getBaseContext(), "Group clicked", - // Toast.LENGTH_LONG).show(); - // return false; - // } - // }); listView.setTextFilterEnabled(true); listView.setFastScrollEnabled(true); listView.setAdapter(adapter); // register context menu registerForContextMenu(listView); startChannelQuery(); - - // create channel list - - // listView.setOnItemClickListener(this); } // @@ -167,6 +121,9 @@ public class ChannelListActivity extends BaseActivity implements progress.dismiss(); progress = null; } + if (groupByDialog != null) { + groupByDialog.dismiss(); + } } private void startChannelQuery() { @@ -196,7 +153,7 @@ public class ChannelListActivity extends BaseActivity implements switch (groupBy) { case MENU_GROUP: adapter.fill( - new ArrayList<String>(channelClient.getChannelGroups()), + channelClient.getChannelGroups(), channelClient.getGroupChannels(), groupBy); listView.collapseGroup(0); updateWindowTitle( @@ -204,7 +161,7 @@ public class ChannelListActivity extends BaseActivity implements getString(R.string.groupby_window_title_templte, getString(R.string.groupby_group))); break; - case MENU_GROUP_PROVIDER: + case MENU_PROVIDER: adapter.fill(new ArrayList<String>(channelClient .getProviderChannels().keySet()), channelClient .getProviderChannels(), groupBy); @@ -214,7 +171,7 @@ public class ChannelListActivity extends BaseActivity implements getString(R.string.groupby_window_title_templte, getString(R.string.groupby_provider))); break; - case MENU_GROUP_NAME: + case MENU_NAME: if (ALL_CHANNELS_GROUP.isEmpty()) { ALL_CHANNELS_GROUP .add(getString(R.string.groupby_name_all_channels_group)); @@ -264,62 +221,69 @@ public class ChannelListActivity extends BaseActivity implements } public boolean onPrepareOptionsMenu(Menu menu) { - switch (groupBy) { - case MENU_GROUP: - menu.setGroupVisible(MENU_GROUP_GROUP, false); - menu.setGroupVisible(MENU_GROUP_PROVIDER, true); - menu.setGroupVisible(MENU_GROUP_NAME, true); - break; - - case MENU_PROVIDER: - menu.setGroupVisible(MENU_GROUP_PROVIDER, false); - menu.setGroupVisible(MENU_GROUP_GROUP, true); - menu.setGroupVisible(MENU_GROUP_NAME, true); - break; - - case MENU_NAME: - menu.setGroupVisible(MENU_GROUP_NAME, false); - menu.setGroupVisible(MENU_GROUP_GROUP, true); - menu.setGroupVisible(MENU_GROUP_PROVIDER, true); - break; - default: - return super.onPrepareOptionsMenu(menu); - } - return true; - + + return super.onPrepareOptionsMenu(menu); } + @Override public final boolean onCreateOptionsMenu(final Menu menu) { super.onCreateOptionsMenu(menu); MenuItem item; - item = menu - .add(MENU_GROUP_GROUP, MENU_GROUP, 0, R.string.groupby_group); + item = menu.add(MENU_GROUP, MENU_GROUP, 0, R.string.menu_groupby); item.setIcon(android.R.drawable.ic_menu_sort_alphabetically); item.setAlphabeticShortcut('g'); - item = menu.add(MENU_GROUP_PROVIDER, MENU_PROVIDER, 0, - R.string.groupby_provider); - item.setIcon(android.R.drawable.ic_menu_sort_alphabetically); - item.setAlphabeticShortcut('p'); + // item = menu.add(MENU_GROUP_PROVIDER, MENU_PROVIDER, 0, + // R.string.groupby_provider); + // item.setIcon(android.R.drawable.ic_menu_sort_alphabetically); + // item.setAlphabeticShortcut('p'); - item = menu.add(MENU_GROUP_NAME, MENU_NAME, 0, R.string.groupby_name); - item.setIcon(android.R.drawable.ic_menu_sort_alphabetically); - item.setAlphabeticShortcut('n'); + // item = menu.add(MENU_GROUP_NAME, MENU_NAME, 0, + // R.string.groupby_name); + // item.setIcon(android.R.drawable.ic_menu_sort_alphabetically); + // item.setAlphabeticShortcut('n'); return true; } + private static final String[] EMPTY = new String[] {}; + + private String[] getAvailableGroupByEntries() { + ArrayList<String> entries = new ArrayList<String>(2); + entries.add(getString(R.string.groupby_group)); + entries.add(getString(R.string.groupby_provider)); + entries.add(getString(R.string.groupby_name)); + return entries.toArray(EMPTY); + } + + AlertDialog groupByDialog = null; + @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case MENU_GROUP: - case MENU_PROVIDER: - case MENU_NAME: - groupBy = item.getItemId(); - fillAdapter(); + // case MENU_PROVIDER: + // case MENU_NAME: + if (groupByDialog == null) { + groupByDialog = new AlertDialog.Builder(this) + .setTitle(R.string.menu_groupby) + .setIcon(android.R.drawable.ic_menu_sort_alphabetically) + .setSingleChoiceItems(getAvailableGroupByEntries(), + groupBy, new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, + int which) { + groupBy = which; + fillAdapter(); + groupByDialog.dismiss(); + } + }).create(); + } + + groupByDialog.show(); + return true; default: return super.onOptionsItemSelected(item); @@ -418,11 +382,6 @@ public class ChannelListActivity extends BaseActivity implements @Override public boolean onSearchRequested() { - if (groupBy != MENU_NAME) { - return true; - } - searchBox.setVisibility(View.VISIBLE); - searchBox.requestFocus(); InputMethodManager inputMgr = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); inputMgr.toggleSoftInput(0, 0); return true; @@ -430,11 +389,7 @@ public class ChannelListActivity extends BaseActivity implements @Override public void onBackPressed() { - if (searchBox.getVisibility() == View.VISIBLE) { - searchBox.setVisibility(View.GONE); - } else { - super.onBackPressed(); - } + super.onBackPressed(); } public boolean onGroupClick(ExpandableListView arg0, View arg1, int arg2, @@ -445,8 +400,8 @@ public class ChannelListActivity extends BaseActivity implements private void startChannelEPG(Channel channel) { // find and remember item // final Channel channel = adapter.getItem(position); - //final VdrManagerApp app = (VdrManagerApp) getApplication(); - //app.setCurrentChannel(channel); + // final VdrManagerApp app = (VdrManagerApp) getApplication(); + // app.setCurrentChannel(channel); // show details final Intent intent = new Intent(); diff --git a/vdrmanager/src/de/bjusystems/vdrmanager/gui/EpgDetailsActivity.java b/vdrmanager/src/de/bjusystems/vdrmanager/gui/EpgDetailsActivity.java index 6e61099..8c52801 100644 --- a/vdrmanager/src/de/bjusystems/vdrmanager/gui/EpgDetailsActivity.java +++ b/vdrmanager/src/de/bjusystems/vdrmanager/gui/EpgDetailsActivity.java @@ -1,11 +1,11 @@ package de.bjusystems.vdrmanager.gui; import java.util.ArrayList; -import java.util.LinkedList; import java.util.List; import android.app.Activity; import android.content.Intent; +import android.net.Uri; import android.os.AsyncTask; import android.os.Bundle; import android.view.MotionEvent; @@ -16,6 +16,7 @@ import android.widget.ProgressBar; import android.widget.TextView; import android.widget.Toast; import de.bjusystems.vdrmanager.R; +import de.bjusystems.vdrmanager.app.Intents; import de.bjusystems.vdrmanager.app.VdrManagerApp; import de.bjusystems.vdrmanager.data.Channel; import de.bjusystems.vdrmanager.data.Epg; @@ -33,10 +34,12 @@ import de.bjusystems.vdrmanager.utils.svdrp.SvdrpException; public class EpgDetailsActivity extends Activity implements OnClickListener, SimpleGestureListener { - Preferences prefs; - + public static String IMDB_URL = "http://www.%s/find?s=all&q=%s"; + private SimpleGestureFilter detector; + private String highlight = null; + ImageButton event_left; ImageButton event_right; @@ -45,8 +48,13 @@ public class EpgDetailsActivity extends Activity implements OnClickListener, protected void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); + Intent i = getIntent(); + highlight = i.getStringExtra(Intents.HIGHLIGHT); + // Attach view setContentView(R.layout.epg_detail); + + detector = new SimpleGestureFilter(this, this); //event_left = (ImageButton) findViewById(R.id.epg_event_left); @@ -89,53 +97,8 @@ public class EpgDetailsActivity extends Activity implements OnClickListener, }.execute((Void)null); publishEPG(epg); - // final EventFormatter formatter = new EventFormatter(event); - // - // final TextView title = (TextView) - // findViewById(R.id.epg_detail_title); - // title.setText(formatter.getTitle()); - // title.setTextSize(TypedValue.COMPLEX_UNIT_PX, title.getTextSize() - // * (float) 1.3); - // - // ((TextView) findViewById(R.id.epg_detail_time)).setText(formatter - // .getTime()); - // ((TextView) findViewById(R.id.epg_detail_channel)).setText(event - // .getChannelName()); - // ((TextView) findViewById(R.id.epg_detail_date)).setText(formatter - // .getLongDate()); - // final TextView textView = (TextView) - // findViewById(R.id.epg_detail_description); - // textView.setText(formatter.getDescription()); - // - // // copy color for separator lines - // final int color = textView.getTextColors().getDefaultColor(); - // // ((TextView) findViewById(R.id.epg_detail_separator_1)) - // // .setBackgroundColor(color); - // - // ((ProgressBar) findViewById(R.id.epg_detail_progress)) - // .setProgress(Utils.getProgress(event)); - // - // ((TextView) findViewById(R.id.epg_detail_separator_2)) - // .setBackgroundColor(color); - // - // // register button handler - // final ImageButton timeButton = (ImageButton) - // findViewById(R.id.epg_event_create_timer); - // timeButton.setOnClickListener(this); - // - // final ImageButton livetvButton = (ImageButton) - // findViewById(R.id.epg_event_livetv); - // livetvButton.setOnClickListener(this); - // - // - // // set button text - // if (event.getTimer() == null) { - // // timeButton.setText(R.string.epg_event_create_timer_text); - // } else { - // // timeButton.setText(R.string.epg_event_modify_timer_text); - // } - - // clear list of activities to finish + + //TODO was ist das? app.clearActivitiesToFinish(); } @@ -148,7 +111,8 @@ public class EpgDetailsActivity extends Activity implements OnClickListener, final EventFormatter formatter = new EventFormatter(event); final TextView title = (TextView) findViewById(R.id.epg_detail_title); - title.setText(formatter.getTitle()); + String titleText = formatter.getTitle(); + title.setText(Utils.highlight(titleText, highlight)); // title.setTextSize(TypedValue.COMPLEX_UNIT_PX, title.getTextSize() // * (float) 1.3); @@ -163,11 +127,11 @@ public class EpgDetailsActivity extends Activity implements OnClickListener, // .getLongDate()); final TextView shortText = (TextView) findViewById(R.id.epg_detail_shorttext); - shortText.setText(formatter.getShortText()); + shortText.setText(Utils.highlight(formatter.getShortText(), highlight)); final TextView textView = (TextView) findViewById(R.id.epg_detail_description); - textView.setText(formatter.getDescription()); + textView.setText(Utils.highlight(formatter.getDescription(), highlight)); // copy color for separator lines final int color = textView.getTextColors().getDefaultColor(); @@ -191,7 +155,18 @@ public class EpgDetailsActivity extends Activity implements OnClickListener, // register button handler setThisAsOnClickListener(R.id.epg_event_create_timer); - View b = findViewById(R.id.epg_event_livetv); + + + View b = findViewById(R.id.epg_event_imdb); + + if(Preferences.get().isShowImdbButton() == false){ + b.setVisibility(View.GONE); + } else { + b.setVisibility(View.VISIBLE); + setThisAsOnClickListener(b); + } + + b = findViewById(R.id.epg_event_livetv); if (Utils.isLive(event) == false) { b.setVisibility(View.GONE); } else { @@ -223,6 +198,9 @@ public class EpgDetailsActivity extends Activity implements OnClickListener, @Override protected void onResume() { super.onResume(); + //TODO Check here whether the config has changed for imdb + //TODO check here if we are still live ? + } @Override @@ -241,13 +219,13 @@ public class EpgDetailsActivity extends Activity implements OnClickListener, case R.id.epg_event_create_timer: Toast.makeText(this, "Soon we get here the timer menu", Toast.LENGTH_SHORT).show(); break; - -// case R.id.epg_event_left: -// prevEPG(); -// break; -// case R.id.epg_event_right: -// nextEPG(); -// break; + case R.id.epg_event_imdb: + final TextView title = (TextView) findViewById(R.id.epg_detail_title); + String url = String.format(IMDB_URL,Preferences.get().getImdbUrl(), String.valueOf(title.getText())); + Intent i = new Intent(Intent.ACTION_VIEW); + i.setData(Uri.parse(url)); + startActivity(i); + break; } } @@ -274,13 +252,11 @@ public class EpgDetailsActivity extends Activity implements OnClickListener, } - ArrayList<Epg> epgs = null; + List<Epg> epgs = null; int counter = 0; public void initEPGs() { - // epgs = ((VdrManagerApp)getApplication()).getCurrentEpgList(); - if (epgs != null) { return; } diff --git a/vdrmanager/src/de/bjusystems/vdrmanager/gui/EpgSearchActivity.java b/vdrmanager/src/de/bjusystems/vdrmanager/gui/EpgSearchActivity.java deleted file mode 100644 index e6fbfdd..0000000 --- a/vdrmanager/src/de/bjusystems/vdrmanager/gui/EpgSearchActivity.java +++ /dev/null @@ -1,62 +0,0 @@ -package de.bjusystems.vdrmanager.gui; - -import android.app.Activity; -import android.content.Intent; -import android.os.Bundle; -import android.view.View; -import android.view.View.OnClickListener; -import android.widget.Button; -import android.widget.TextView; -import de.bjusystems.vdrmanager.R; -import de.bjusystems.vdrmanager.app.VdrManagerApp; -import de.bjusystems.vdrmanager.data.EpgSearchParams; -import de.bjusystems.vdrmanager.data.Preferences; - -/** - * This class is used for showing what's current running on all channels - * - * @author bju - */ -public class EpgSearchActivity extends Activity implements OnClickListener { - - Preferences prefs; - TextView text; - - @Override - protected void onCreate(final Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - // Attach view - setContentView(R.layout.epg_search); - - // save fields - text = (TextView) findViewById(R.id.epg_search_text); - - // register button - final Button button = (Button) findViewById(R.id.epg_search_button); - button.setOnClickListener(this); - } - - @Override - protected void onResume() { - super.onResume(); - } - - @Override - protected void onPause() { - super.onPause(); - } - - public void onClick(final View v) { - - // Save search parameters - final EpgSearchParams search = new EpgSearchParams(); - search.setTitle(text.getText().toString()); - ((VdrManagerApp) getApplication()).setCurrentSearch(search); - - // show timer details - final Intent intent = new Intent(); - //intent.setClass(this, EpgListActivity.class); - startActivity(intent); - } -} diff --git a/vdrmanager/src/de/bjusystems/vdrmanager/gui/EpgSearchListActivity.java b/vdrmanager/src/de/bjusystems/vdrmanager/gui/EpgSearchListActivity.java new file mode 100644 index 0000000..4dba61d --- /dev/null +++ b/vdrmanager/src/de/bjusystems/vdrmanager/gui/EpgSearchListActivity.java @@ -0,0 +1,168 @@ +package de.bjusystems.vdrmanager.gui; + +import java.util.Calendar; +import java.util.List; + +import android.app.SearchManager; +import android.content.Intent; +import android.os.Bundle; +import android.text.TextUtils; +import android.widget.AdapterView; +import android.widget.AdapterView.OnItemClickListener; +import android.widget.ListView; +import de.bjusystems.vdrmanager.R; +import de.bjusystems.vdrmanager.app.VdrManagerApp; +import de.bjusystems.vdrmanager.data.Epg; +import de.bjusystems.vdrmanager.data.EpgSearchParams; +import de.bjusystems.vdrmanager.data.EventListItem; +import de.bjusystems.vdrmanager.utils.date.DateFormatter; +import de.bjusystems.vdrmanager.utils.svdrp.EpgClient; +import de.bjusystems.vdrmanager.utils.svdrp.SvdrpAsyncListener; +import de.bjusystems.vdrmanager.utils.svdrp.SvdrpAsyncTask; +import de.bjusystems.vdrmanager.utils.svdrp.SvdrpClient; +import de.bjusystems.vdrmanager.utils.svdrp.SvdrpException; + +/** + * This class is used for showing what's current running on all channels + * + * @author bju + */ +public class EpgSearchListActivity extends BaseEpgListActivity implements + OnItemClickListener, SvdrpAsyncListener<Epg> { + + public List<Epg> results; + + @Override + protected void onCreate(final Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + Intent intent = getIntent(); + if (Intent.ACTION_SEARCH.equals(intent.getAction())) { + String query = intent.getStringExtra(SearchManager.QUERY); + if (TextUtils.isEmpty(query) == false) { + highlight = query.trim(); + } + } + adapter = new ChannelEventAdapter(this); + adapter.setHideDescription(false); + + // Create adapter for EPG list + listView = (ListView) findViewById(R.id.whatson_list); + listView.setAdapter(adapter); + listView.setFastScrollEnabled(true); + listView.setTextFilterEnabled(true); + registerForContextMenu(listView); + + // register EPG item click + listView.setOnItemClickListener(this); + + } + + @Override + protected void onResume() { + super.onResume(); + // adapter.notifyDataSetChanged(); + startEpgQuery(); + } + + + + public void onNothingSelected(final AdapterView<?> arg0) { + // startTimeEpgQuery(((EpgTimeSpinnerValue)timeSpinner.getAdapter().getItem(0)).getValue()); + } + + // + + private void startEpgQuery() { + + EpgSearchParams sp = new EpgSearchParams(); + sp.setTitle(highlight); + setTitle(getString(R.string.epg_by_search_param, highlight)); + epgClient = new EpgClient(sp); + + // remove old listeners + // epgClient.clearSvdrpListener(); + + // create background task + final SvdrpAsyncTask<Epg, SvdrpClient<Epg>> task = new SvdrpAsyncTask<Epg, SvdrpClient<Epg>>( + epgClient); + + // create progress + progress = new SvdrpProgressDialog(this, epgClient); + // attach listener + task.addListener(this); + + // start task + task.run(); + } + + /* + * (non-Javadoc) TODO this method also should be used in startEpgQuery on + * cache hit + * + * @see de.bjusystems.vdrmanager.gui.BaseEpgListActivity#finishedSuccess() + */ + @Override + protected void finishedSuccess() { + adapter.clear(); + adapter.highlight = this.highlight; + + Calendar cal = Calendar.getInstance(); + int day = -1; + results = epgClient.getResults(); + for (Epg e : results) { + cal.setTime(e.getStart()); + int eday = cal.get(Calendar.DAY_OF_YEAR); + if (eday != day) { + day = eday; + adapter.add(new EventListItem(new DateFormatter(cal) + .getDailyHeader())); + } + adapter.add(new EventListItem(e)); + } + listView.setSelectionAfterHeaderView(); + if (progress != null) { + progress.dismiss(); + progress = null; + } + } + + public void svdrpException(final SvdrpException exception) { + if (progress != null) { + progress.svdrpException(exception); + } + } + + protected void prepareTimer(final EventListItem item) { + final VdrManagerApp app = (VdrManagerApp) getApplication(); + app.setCurrentEvent(item.getEpg()); + app.setCurrentEpgList(results); + } + + @Override + protected int getMainLayout() { + return R.layout.search_epg_list; + } + + @Override + protected void refresh() { + startEpgQuery(); + } + + @Override + protected void retry() { + startEpgQuery(); + } + + @Override + protected int getWindowTitle() { + return R.string.epg_by_search; + } + + @Override + public boolean onSearchRequested() { + startSearchManager(); + return true; + } + +} diff --git a/vdrmanager/src/de/bjusystems/vdrmanager/gui/EventAdapter.java b/vdrmanager/src/de/bjusystems/vdrmanager/gui/EventAdapter.java index 78e5dc6..98adbb9 100644 --- a/vdrmanager/src/de/bjusystems/vdrmanager/gui/EventAdapter.java +++ b/vdrmanager/src/de/bjusystems/vdrmanager/gui/EventAdapter.java @@ -9,6 +9,7 @@ import android.text.Spannable; import android.text.SpannableString; import android.text.TextUtils; import android.text.style.ForegroundColorSpan; +import android.util.Pair; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -26,15 +27,16 @@ import de.bjusystems.vdrmanager.data.EventListItem; abstract class EventAdapter extends ArrayAdapter<EventListItem> implements Filterable { - private static final ForegroundColorSpan HIGHLIGHT = new ForegroundColorSpan( - Color.RED); - protected final int layout; protected final LayoutInflater inflater; protected final List<EventListItem> items = new ArrayList<EventListItem>(); + protected boolean hideDescription = true; + protected boolean hideChannelName = false; + String highlight; + public EventAdapter(final Context context, int layout) { super(context, layout); this.layout = layout; @@ -47,8 +49,6 @@ abstract class EventAdapter extends ArrayAdapter<EventListItem> implements super.add(object); } - private String highlight; - @Override public View getView(final int position, final View convertView, final ViewGroup parent) { @@ -76,6 +76,8 @@ abstract class EventAdapter extends ArrayAdapter<EventListItem> implements .findViewById(R.id.timer_item_shorttext); itemHolder.duration = (TextView) view .findViewById(R.id.timer_item_duration); + itemHolder.description = (TextView) view + .findViewById(R.id.event_item_description); view.setTag(itemHolder); } else { itemHolder = (EventListItemHolder) view.getTag(); @@ -96,7 +98,7 @@ abstract class EventAdapter extends ArrayAdapter<EventListItem> implements itemHolder.progress.setVisibility(View.GONE); itemHolder.shortText.setVisibility(View.GONE); itemHolder.duration.setVisibility(View.GONE); - + itemHolder.description.setVisibility(View.GONE); } else { view.setBackgroundColor(Color.BLACK); @@ -130,12 +132,22 @@ abstract class EventAdapter extends ArrayAdapter<EventListItem> implements itemHolder.channel.setText(item.getChannelName()); } - - CharSequence title = highlight(formatter.getTitle(), highlight); - CharSequence shortText = highlight(formatter.getShortText(), highlight); - + CharSequence title = Utils.highlight(formatter.getTitle(), + highlight); + CharSequence shortText = Utils.highlight(formatter.getShortText(), + highlight); itemHolder.title.setText(title); itemHolder.shortText.setText(shortText); + + if (hideDescription == false) { + Pair<Boolean, CharSequence> desc = Utils.highlight2( + formatter.getDescription(), highlight); + if (desc.first == true) { + itemHolder.description.setVisibility(View.VISIBLE); + itemHolder.description.setText(desc.second); + } + } + int p = Utils.getProgress(item); if (p == -1) { itemHolder.progress.setVisibility(View.GONE); @@ -160,22 +172,6 @@ abstract class EventAdapter extends ArrayAdapter<EventListItem> implements return view; } - private CharSequence highlight(String where, String what){ - if(TextUtils.isEmpty(what)){ - return where; - } - - String str = where.toLowerCase(); - int idx = str.indexOf(highlight); - if(idx == -1){ - return where; - } - SpannableString ss = new SpannableString(str); - ss.setSpan(HIGHLIGHT, idx, idx + highlight.length(), - Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); - return ss; - } - protected EventFormatter getEventFormatter(Event event) { return new EventFormatter(event); } @@ -184,7 +180,23 @@ abstract class EventAdapter extends ArrayAdapter<EventListItem> implements super.add(item); } - //TODO implement locking in performFiltering, check the parent class + public boolean isHideDescription() { + return hideDescription; + } + + public void setHideDescription(boolean hideDescription) { + this.hideDescription = hideDescription; + } + + public boolean isHideChannelName() { + return hideChannelName; + } + + public void setHideChannelName(boolean hideChannelName) { + this.hideChannelName = hideChannelName; + } + + // TODO implement locking in performFiltering, check the parent class // public Filter getFilter() { return new Filter() { @@ -199,8 +211,8 @@ abstract class EventAdapter extends ArrayAdapter<EventListItem> implements ArrayList<EventListItem> result = new ArrayList<EventListItem>(); for (EventListItem event : items) { if (event.isHeader()) { - prevHead = event; - //result.add(event); + prevHead = event; + // result.add(event); continue; } if (event.getTitle().toLowerCase() @@ -208,7 +220,7 @@ abstract class EventAdapter extends ArrayAdapter<EventListItem> implements || event.getShortText() .toLowerCase() .indexOf(String.valueOf(arg0).toLowerCase()) != -1) { - if(prevHead != null){ + if (prevHead != null) { result.add(prevHead); prevHead = null; } diff --git a/vdrmanager/src/de/bjusystems/vdrmanager/gui/EventEpgListActivity.java b/vdrmanager/src/de/bjusystems/vdrmanager/gui/EventEpgListActivity.java index 4e0987d..476bdd9 100644 --- a/vdrmanager/src/de/bjusystems/vdrmanager/gui/EventEpgListActivity.java +++ b/vdrmanager/src/de/bjusystems/vdrmanager/gui/EventEpgListActivity.java @@ -5,7 +5,10 @@ import java.util.Calendar; import java.util.Date; import java.util.List; +import android.app.SearchManager; +import android.content.Intent; import android.os.Bundle; +import android.text.TextUtils; import android.view.View; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; @@ -44,7 +47,7 @@ public class EventEpgListActivity extends BaseEpgListActivity implements Spinner channelSpinner; ArrayAdapter<Channel> channelSpinnerAdapter; - + @Override protected void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -53,8 +56,8 @@ public class EventEpgListActivity extends BaseEpgListActivity implements final List<Channel> channels = ChannelClient.getChannels(); // create adapter for channel spinner - channelSpinnerAdapter = new ArrayAdapter<Channel>( - this, android.R.layout.simple_spinner_item); + channelSpinnerAdapter = new ArrayAdapter<Channel>(this, + android.R.layout.simple_spinner_item); channelSpinnerAdapter .setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); channelSpinner = (Spinner) findViewById(R.id.epg_list_channel_spinner); diff --git a/vdrmanager/src/de/bjusystems/vdrmanager/gui/EventListItemHolder.java b/vdrmanager/src/de/bjusystems/vdrmanager/gui/EventListItemHolder.java index f7086b0..7b9c93b 100644 --- a/vdrmanager/src/de/bjusystems/vdrmanager/gui/EventListItemHolder.java +++ b/vdrmanager/src/de/bjusystems/vdrmanager/gui/EventListItemHolder.java @@ -14,4 +14,5 @@ class EventListItemHolder { public TextView shortText; public ProgressBar progress; public TextView duration; + public TextView description; }
\ No newline at end of file diff --git a/vdrmanager/src/de/bjusystems/vdrmanager/gui/Utils.java b/vdrmanager/src/de/bjusystems/vdrmanager/gui/Utils.java index f7d359c..ff51637 100644 --- a/vdrmanager/src/de/bjusystems/vdrmanager/gui/Utils.java +++ b/vdrmanager/src/de/bjusystems/vdrmanager/gui/Utils.java @@ -4,11 +4,15 @@ import java.util.Date; import android.app.Activity; import android.app.AlertDialog; -import android.app.AlertDialog.Builder; import android.content.DialogInterface; import android.content.Intent; +import android.graphics.Color; import android.net.Uri; - +import android.text.Spannable; +import android.text.SpannableString; +import android.text.TextUtils; +import android.text.style.ForegroundColorSpan; +import android.util.Pair; import de.bjusystems.vdrmanager.R; import de.bjusystems.vdrmanager.data.Channel; import de.bjusystems.vdrmanager.data.Event; @@ -16,6 +20,46 @@ import de.bjusystems.vdrmanager.data.Preferences; public class Utils { + public static final ForegroundColorSpan HIGHLIGHT_TEXT = new ForegroundColorSpan( + Color.RED); + + + + public static CharSequence highlight(String where, String what){ + if(TextUtils.isEmpty(what)){ + return where; + } + + String str = where.toLowerCase(); + what = what.toLowerCase(); + int idx = str.indexOf(what); + if(idx == -1){ + return where; + } + 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(String where, String what){ + if(TextUtils.isEmpty(what)){ + return Pair.create(Boolean.FALSE, (CharSequence)where); + } + + String str = where.toLowerCase(); + what = what.toLowerCase(); + int idx = str.indexOf(what); + if(idx == -1){ + return Pair.create(Boolean.FALSE, (CharSequence)where); + } + 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(Date start, Date stop) { long now = System.currentTimeMillis(); return getProgress(now, start.getTime(), stop.getTime()); diff --git a/vdrmanager/src/de/bjusystems/vdrmanager/gui/VdrManagerActivity.java b/vdrmanager/src/de/bjusystems/vdrmanager/gui/VdrManagerActivity.java index 8aa4107..70a56dc 100644 --- a/vdrmanager/src/de/bjusystems/vdrmanager/gui/VdrManagerActivity.java +++ b/vdrmanager/src/de/bjusystems/vdrmanager/gui/VdrManagerActivity.java @@ -101,7 +101,7 @@ public class VdrManagerActivity extends Activity implements OnClickListener { startActivity(TimeEpgListActivity.class); break; case R.id.action_menu_search: - startActivity(EpgSearchActivity.class); + onSearchRequested(); break; case R.id.action_menu_wakeup: final AsyncWakeupTask wakeupTask = new AsyncWakeupTask(this); @@ -117,6 +117,5 @@ public class VdrManagerActivity extends Activity implements OnClickListener { //appData.putBoolean(SearchableActivity.JARGON, true); startSearch(null, false, appData, false); return true; - } } |