summaryrefslogtreecommitdiff
path: root/vdrmanager/src
diff options
context:
space:
mode:
authorbju <bju@maxi.fritz.box>2013-04-22 00:53:50 +0200
committerbju <bju@maxi.fritz.box>2013-04-22 00:53:50 +0200
commit612cf3729bf532e100b520118e4fa7d567b13f41 (patch)
tree2669e7db5df4cb2ab6eb00dd78632a9917fcfb4f /vdrmanager/src
parent6f0394b5d60df470f245bd7581f92bc7889ac0d5 (diff)
parent75516dd3d04aa9a8f61adfb882d5d78b9267b613 (diff)
downloadvdr-manager-612cf3729bf532e100b520118e4fa7d567b13f41.tar.gz
vdr-manager-612cf3729bf532e100b520118e4fa7d567b13f41.tar.bz2
merged SSL client implementation
Diffstat (limited to 'vdrmanager/src')
-rw-r--r--vdrmanager/src/de/bjusystems/vdrmanager/app/VdrManagerApp.java250
-rw-r--r--vdrmanager/src/de/bjusystems/vdrmanager/gui/BaseActivity.java945
-rw-r--r--vdrmanager/src/de/bjusystems/vdrmanager/gui/BaseEventListActivity.java964
-rw-r--r--vdrmanager/src/de/bjusystems/vdrmanager/gui/CertificateProblemDialog.java98
-rw-r--r--vdrmanager/src/de/bjusystems/vdrmanager/gui/ChannelListActivity.java1087
-rw-r--r--vdrmanager/src/de/bjusystems/vdrmanager/gui/EpgSearchListActivity.java482
-rw-r--r--vdrmanager/src/de/bjusystems/vdrmanager/gui/EventEpgListActivity.java845
-rw-r--r--vdrmanager/src/de/bjusystems/vdrmanager/gui/ICSBaseActivity.java28
-rw-r--r--vdrmanager/src/de/bjusystems/vdrmanager/gui/RecordingListActivity.java830
-rw-r--r--vdrmanager/src/de/bjusystems/vdrmanager/gui/TimeEpgListActivity.java741
-rw-r--r--vdrmanager/src/de/bjusystems/vdrmanager/gui/TimerListActivity.java501
-rw-r--r--vdrmanager/src/de/bjusystems/vdrmanager/gui/Utils.java837
-rw-r--r--vdrmanager/src/de/bjusystems/vdrmanager/gui/VdrManagerActivity.java13
-rw-r--r--vdrmanager/src/de/bjusystems/vdrmanager/tasks/AsyncProgressTask.java103
-rw-r--r--vdrmanager/src/de/bjusystems/vdrmanager/tasks/ChannelsTask.java6
-rw-r--r--vdrmanager/src/de/bjusystems/vdrmanager/tasks/CreateTimerTask.java17
-rw-r--r--vdrmanager/src/de/bjusystems/vdrmanager/tasks/DeleteRecordingTask.java17
-rw-r--r--vdrmanager/src/de/bjusystems/vdrmanager/tasks/DeleteTimerTask.java17
-rw-r--r--vdrmanager/src/de/bjusystems/vdrmanager/tasks/ModifyTimerTask.java27
-rw-r--r--vdrmanager/src/de/bjusystems/vdrmanager/tasks/ToggleTimerTask.java29
-rw-r--r--vdrmanager/src/de/bjusystems/vdrmanager/utils/svdrp/AliveClient.java68
-rw-r--r--vdrmanager/src/de/bjusystems/vdrmanager/utils/svdrp/CertificateProblemListener.java39
-rw-r--r--vdrmanager/src/de/bjusystems/vdrmanager/utils/svdrp/ChannelClient.java328
-rw-r--r--vdrmanager/src/de/bjusystems/vdrmanager/utils/svdrp/DelRecordingClient.java70
-rw-r--r--vdrmanager/src/de/bjusystems/vdrmanager/utils/svdrp/EpgClient.java130
-rw-r--r--vdrmanager/src/de/bjusystems/vdrmanager/utils/svdrp/MySSLSocketFactory.java253
-rw-r--r--vdrmanager/src/de/bjusystems/vdrmanager/utils/svdrp/RecordingClient.java32
-rw-r--r--vdrmanager/src/de/bjusystems/vdrmanager/utils/svdrp/SetTimerClient.java152
-rw-r--r--vdrmanager/src/de/bjusystems/vdrmanager/utils/svdrp/SvdrpAsyncTask.java309
-rw-r--r--vdrmanager/src/de/bjusystems/vdrmanager/utils/svdrp/SvdrpClient.java34
-rw-r--r--vdrmanager/src/de/bjusystems/vdrmanager/utils/svdrp/SwitchChannelClient.java82
-rw-r--r--vdrmanager/src/de/bjusystems/vdrmanager/utils/svdrp/TimerClient.java64
-rw-r--r--vdrmanager/src/de/bjusystems/vdrmanager/utils/wakeup/WakeupUrlClient.java78
33 files changed, 4986 insertions, 4490 deletions
diff --git a/vdrmanager/src/de/bjusystems/vdrmanager/app/VdrManagerApp.java b/vdrmanager/src/de/bjusystems/vdrmanager/app/VdrManagerApp.java
index 5f4a3de..fd301f0 100644
--- a/vdrmanager/src/de/bjusystems/vdrmanager/app/VdrManagerApp.java
+++ b/vdrmanager/src/de/bjusystems/vdrmanager/app/VdrManagerApp.java
@@ -1,5 +1,6 @@
package de.bjusystems.vdrmanager.app;
+import java.security.KeyStore;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
@@ -16,114 +17,143 @@ import de.bjusystems.vdrmanager.data.Vdr;
public class VdrManagerApp extends Application {
- public enum EpgListState {
- EPG_TIME, EPG_CHANNEL, EPG_SEARCH
- }
-
- private EpgListState epgListState;
- private Event currentEvent;
- private Timer currentTimer;
- private Channel currentChannel;
-
- public static final Locale SYSTEM_LOCALE = Locale.getDefault();
-
- private Vdr currentVDR;
-
- public Vdr getCurrentVDR() {
- return currentVDR;
- }
-
- public void setCurrentVDR(Vdr currentVDR) {
- this.currentVDR = currentVDR;
- }
-
- private List<Event> currentEpgList = new ArrayList<Event>();
-
- public List<Event> getCurrentEpgList() {
- return currentEpgList;
- }
-
- public void setCurrentEpgList(List currentEpgList) {
- this.currentEpgList = currentEpgList;
- }
-
- private EpgSearchParams currentSearch;
- private Class<? extends Activity> nextActivity;
- private final List<Activity> activitiesToFinish = new ArrayList<Activity>();
- private boolean reload;
-
- @Override
- public void onCreate() {
- super.onCreate();
- Preferences.init(this);
- }
-
- public void clear() {
- this.currentEvent = null;
- this.currentTimer = null;
- this.currentChannel = null;
- this.currentSearch = null;
- this.currentEpgList = null;
- this.epgListState = EpgListState.EPG_TIME;
- }
-
- public Event getCurrentEvent() {
- return currentEvent;
- }
-
- public void setCurrentEvent(final Event currentEvent) {
- this.currentEvent = currentEvent;
- }
-
- public Timer getCurrentTimer() {
- return currentTimer;
- }
-
- public void setCurrentTimer(final Timer currentTimer) {
- this.currentTimer = currentTimer;
- }
-
- public Channel getCurrentChannel() {
- return currentChannel;
- }
-
- public void setCurrentChannel(final Channel currentChannel) {
- clear();
- this.currentChannel = currentChannel;
- this.epgListState = EpgListState.EPG_CHANNEL;
- }
-
- public EpgSearchParams getCurrentSearch() {
- return currentSearch;
- }
-
- public void setCurrentSearch(final EpgSearchParams currentSearch) {
- clear();
- this.currentSearch = currentSearch;
- this.epgListState = EpgListState.EPG_SEARCH;
- }
-
- public EpgListState getEpgListState() {
- return epgListState;
- }
-
- public Class<? extends Activity> getNextActivity() {
- return nextActivity;
- }
-
- public void setNextActivity(final Class<? extends Activity> nextActivity) {
- this.nextActivity = nextActivity;
- }
-
- public List<Activity> getActivitiesToFinish() {
- return activitiesToFinish;
- }
-
- public boolean isReload() {
- return reload;
- }
-
- public void setReload(final boolean reload) {
- this.reload = reload;
- }
+
+ public VdrManagerApp() {
+ super();
+ initSessionKeyStore();
+ }
+
+ public enum EpgListState {
+ EPG_TIME, EPG_CHANNEL, EPG_SEARCH
+ }
+
+ private EpgListState epgListState;
+ private Event currentEvent;
+ private Timer currentTimer;
+ private Channel currentChannel;
+
+ public static final Locale SYSTEM_LOCALE = Locale.getDefault();
+
+ private Vdr currentVDR;
+
+ public Vdr getCurrentVDR() {
+ return currentVDR;
+ }
+
+ public void setCurrentVDR(final Vdr currentVDR) {
+ this.currentVDR = currentVDR;
+ }
+
+ private List<Event> currentEpgList = new ArrayList<Event>();
+
+ public List<Event> getCurrentEpgList() {
+ return currentEpgList;
+ }
+
+ public void setCurrentEpgList(final List currentEpgList) {
+ this.currentEpgList = currentEpgList;
+ }
+
+ private EpgSearchParams currentSearch;
+ private Class<? extends Activity> nextActivity;
+ private final List<Activity> activitiesToFinish = new ArrayList<Activity>();
+ private boolean reload;
+
+ @Override
+ public void onCreate() {
+ super.onCreate();
+ Preferences.init(this);
+ }
+
+ public void clear() {
+ this.currentEvent = null;
+ this.currentTimer = null;
+ this.currentChannel = null;
+ this.currentSearch = null;
+ this.currentEpgList = null;
+ this.epgListState = EpgListState.EPG_TIME;
+ }
+
+ public Event getCurrentEvent() {
+ return currentEvent;
+ }
+
+ public void setCurrentEvent(final Event currentEvent) {
+ this.currentEvent = currentEvent;
+ }
+
+ public Timer getCurrentTimer() {
+ return currentTimer;
+ }
+
+ public void setCurrentTimer(final Timer currentTimer) {
+ this.currentTimer = currentTimer;
+ }
+
+ public Channel getCurrentChannel() {
+ return currentChannel;
+ }
+
+ public void setCurrentChannel(final Channel currentChannel) {
+ clear();
+ this.currentChannel = currentChannel;
+ this.epgListState = EpgListState.EPG_CHANNEL;
+ }
+
+ public EpgSearchParams getCurrentSearch() {
+ return currentSearch;
+ }
+
+ public void setCurrentSearch(final EpgSearchParams currentSearch) {
+ clear();
+ this.currentSearch = currentSearch;
+ this.epgListState = EpgListState.EPG_SEARCH;
+ }
+
+ public EpgListState getEpgListState() {
+ return epgListState;
+ }
+
+ public Class<? extends Activity> getNextActivity() {
+ return nextActivity;
+ }
+
+ public void setNextActivity(final Class<? extends Activity> nextActivity) {
+ this.nextActivity = nextActivity;
+ }
+
+ public List<Activity> getActivitiesToFinish() {
+ return activitiesToFinish;
+ }
+
+ public boolean isReload() {
+ return reload;
+ }
+
+ public void setReload(final boolean reload) {
+ this.reload = reload;
+ }
+
+ /** KeyStore for per app run accepted certificates */
+ private KeyStore sessionKeyStore;
+
+ /**
+ * Gets the temporary accepted certificates
+ * @return KeyStore
+ */
+ public KeyStore getSessionKeyStore() {
+ return sessionKeyStore;
+ }
+
+ /**
+ * Create a new and empty key store
+ */
+ public void initSessionKeyStore() {
+ try {
+ sessionKeyStore = KeyStore.getInstance(KeyStore.getDefaultType());
+ sessionKeyStore.load(null);
+ } catch (final Exception e) {
+ sessionKeyStore = null;
+ }
+ }
}
diff --git a/vdrmanager/src/de/bjusystems/vdrmanager/gui/BaseActivity.java b/vdrmanager/src/de/bjusystems/vdrmanager/gui/BaseActivity.java
index fc53833..73d858c 100644
--- a/vdrmanager/src/de/bjusystems/vdrmanager/gui/BaseActivity.java
+++ b/vdrmanager/src/de/bjusystems/vdrmanager/gui/BaseActivity.java
@@ -4,8 +4,6 @@ import java.util.List;
import android.app.AlertDialog;
import android.app.ProgressDialog;
-import android.content.DialogInterface;
-import android.content.DialogInterface.OnCancelListener;
import android.content.Intent;
import android.content.res.Configuration;
import android.os.Bundle;
@@ -31,482 +29,491 @@ import de.bjusystems.vdrmanager.utils.svdrp.SvdrpFinishedListener;
import de.bjusystems.vdrmanager.utils.svdrp.SvdrpListener;
public abstract class BaseActivity<Result, T extends ListView> extends
- ICSBaseActivity implements OnClickListener, SvdrpListener,
- SvdrpExceptionListener, SvdrpFinishedListener<Result> {
-
- public static final String TAG = BaseActivity.class.getName();
-
- public static final int MENU_GROUP_REFRESH = 99;
-
- public static final int MENU_REFRESH = 99;
-
- protected T listView;
+ICSBaseActivity implements OnClickListener, SvdrpListener,
+SvdrpExceptionListener, SvdrpFinishedListener<Result> {
+
+ public static final String TAG = BaseActivity.class.getName();
+
+ public static final int MENU_GROUP_REFRESH = 99;
+
+ public static final int MENU_REFRESH = 99;
+
+ protected T listView;
- protected ViewFlipper flipper;
-
- private Button retry;
+ protected ViewFlipper flipper;
+
+ private Button retry;
- private ProgressDialog progress;
+ private ProgressDialog progress;
- // protected SvdrpProgressDialog progress;
+ // protected SvdrpProgressDialog progress;
- abstract protected String getWindowTitle();
+ abstract protected String getWindowTitle();
- abstract protected int getMainLayout();
+ abstract protected int getMainLayout();
- protected void noInternetConnection() {
- alert(R.string.no_internet_connection);
- }
+ protected void noInternetConnection() {
+ alert(R.string.no_internet_connection);
+ }
- abstract protected boolean displayingResults();
+ abstract protected boolean displayingResults();
- protected boolean isForceRefresh() {
- if (forceRefresh == false) {
- return false;
- }
- forceRefresh = false;
- return true;
- }
+ protected boolean isForceRefresh() {
+ if (forceRefresh == false) {
+ return false;
+ }
+ forceRefresh = false;
+ return true;
+ }
- protected boolean forceRefresh = false;
-
- protected void switchNoConnection() {
- if (flipper == null) {
- say(R.string.no_connection);
- return;
- }
-
- if (displayingResults()) {
- say(R.string.no_connection);
- } else {
- flipper.setDisplayedChild(1);
- }
- }
-
- @Override
- public void onConfigurationChanged(Configuration newConfig) {
- Preferences.setLocale(this);
- super.onConfigurationChanged(newConfig);
- }
-
- @Override
- protected void onResume() {
- Preferences.setLocale(this);
- // Preferences.init(this);
- super.onResume();
- }
-
- protected void initFlipper() {
- this.flipper = (ViewFlipper) findViewById(R.id.flipper);
- retry = (Button) findViewById(R.id.retry_button);
- retry.setOnClickListener(this);
- }
-
- public void onClick(View v) {
- if (v.getId() == R.id.retry_button) {
- retry();
- }
- }
-
- //
- // protected void updateWindowTitle(int topic, int subtopic) {
- // String title;
- // title = getString(topic);
- // if (subtopic != -1) {
- // title += " > " + getString(subtopic);
- // }
- // setTitle(title);
- // }
- //
- // protected void updateWindowTitle(String topic, String subtopic) {
- // String title = topic;
- // if (subtopic != null) {
- // title += " > " + subtopic;
- // }
- // setTitle(title);
- // }
-
- abstract protected int getListNavigationIndex();
-
- public static final int LIST_NAVIGATION_CHANNELS = 0;
- public static final int LIST_NAVIGATION_EPG_BY_TIME = 1;
- public static final int LIST_NAVIGATION_EPG_BY_CHANNEL = 2;
- public static final int LIST_NAVIGATION_RECORDINGS = 3;
- public static final int LIST_NAVIGATION_TIMERS = 4;
-
- protected boolean hasListNavigation() {
- return true;
- }
-
- protected void initListNavigation() {
-
- if (hasListNavigation() == false) {
- return;
- }
-
- getSupportActionBar().setDisplayShowTitleEnabled(false);
-
- getSupportActionBar().setNavigationMode(
- getSupportActionBar().NAVIGATION_MODE_LIST);
-
- ArrayAdapter<CharSequence> mSpinnerAdapter = ArrayAdapter
- .createFromResource(this, R.array.navigation_array,
- android.R.layout.simple_spinner_dropdown_item);
-
- getSupportActionBar().setListNavigationCallbacks(mSpinnerAdapter,
- new OnNavigationListener() {
-
- private boolean firstHit = true;
-
- @Override
- public boolean onNavigationItemSelected(int itemPosition,
- long itemId) {
-
- if (firstHit == true) {
- firstHit = false;
- return false;
- }
- switch (itemPosition) {
-
- case LIST_NAVIGATION_CHANNELS: {
- startActivity(ChannelListActivity.class);
- return true;
- }
- case LIST_NAVIGATION_EPG_BY_TIME: {
- startActivity(TimeEpgListActivity.class);
- return true;
- }
-
- case LIST_NAVIGATION_EPG_BY_CHANNEL: {
- startActivity(EventEpgListActivity.class);
- return true;
- }
-
- case LIST_NAVIGATION_RECORDINGS: {
- startActivity(RecordingListActivity.class);
- return true;
- }
-
- case LIST_NAVIGATION_TIMERS: {
- startActivity(TimerListActivity.class);
- return true;
- }
-
- }
- return false;
- }
- });
- getSupportActionBar().setSelectedNavigationItem(
- getListNavigationIndex());
-
- }
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- Preferences.setLocale(this);
- progress = new ProgressDialog(this);
- progress.setCancelable(false);
- progress.setCanceledOnTouchOutside(false);
-// progress.setOnCancelListener(new OnCancelListener() {
-// @Override
-// public void onCancel(DialogInterface dialog) {
-//
-// }
-// });
-
- initActionBar();
-
- initListNavigation();
-
- // new OnNavigationListener() {
- // @Override
- // public boolean onNavigationItemSelected(int itemPosition, long
- // itemId) {
- // System.err.println("itemPosition: "+ itemPosition +", itemId:" +
- // itemId);
- // rturn false;
- // }
- // });
-
- // your logic for click listner
- // setListenerForActionBarCustomView(actionBarView);
-
- // private void setListenerForActionBarCustomView(View actionBarView) {
- // ActionBarCustomViewOnClickListener actionBarCustomViewOnClickListener
- // = new ActionBarCustomViewOnClickListener();
- // actionBarView.findViewById(R.id.text_view_title).setOnClickListener(actionBarCustomViewOnClickListener);
- // }
-
- }
-
- public void startActivity(Class<?> clazz) {
- Intent intent = new Intent(Intent.ACTION_VIEW);
- intent.setClass(this, clazz);
- startActivity(intent);
- finish();
- }
-
- protected int getBaseMenu() {
- return R.menu.refresh_filter_menu;
- }
-
- @Override
- public boolean onCreateOptionsMenu(
- final com.actionbarsherlock.view.Menu menu) {
-
- // MenuItem item;
- // item = menu.add(MENU_GROUP_REFRESH, MENU_REFRESH, 0,
- // R.string.refresh);
- // item.setIcon(R.drawable.ic_menu_refresh);
- // item.setAlphabeticShortcut('r');
- com.actionbarsherlock.view.MenuInflater inf = getSupportMenuInflater();
- inf.inflate(getBaseMenu(), menu);
-
- // SearchView searchView = (SearchView)
- // menu.findItem(R.id.menu_search).getActionView();
- // searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
-
- return true;
- }
-
- abstract protected void refresh();
-
- abstract protected void retry();
-
- // abstract protected SvdrpClient<Result> getClient();
-
- @Override
- public boolean onOptionsItemSelected(
- final com.actionbarsherlock.view.MenuItem item) {
- switch (item.getItemId()) {
- case R.id.list_refresh:
- backupViewSelection();
- refresh();
- return true;
- case R.id.list_filter: {
- onSearchRequested();
- return true;
- }
- case android.R.id.home:
- Intent intent = new Intent(this, VdrManagerActivity.class);
- intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
- startActivity(intent);
- return true;
- default:
- return false;
- }
- }
-
- protected void setCurrent(Channel channel) {
- getApp().setCurrentChannel(channel);
- }
-
- protected VdrManagerApp getApp() {
- final VdrManagerApp app = (VdrManagerApp) getApplication();
- return app;
- }
-
- // protected Channel getCurrentChannel(){
- // final Channel channel = ((VdrManagerApp) getApplication())
- // .getCurrentChannel();
- // return channel;
- // }
-
- protected void say(int res) {
- say(this.getString(res));
- }
-
- protected void say(String msg) {
- Utils.say(this, msg);
- }
-
- protected boolean noConnection(SvdrpEvent event) {
- switch (event) {
- case CONNECTION_TIMEOUT:
- say(R.string.progress_connect_timeout);
- switchNoConnection();
- case CONNECT_ERROR:
- say(R.string.progress_connect_error);
- switchNoConnection();
- break;
- case FINISHED_ABNORMALY:
- alert(R.string.progress_connect_finished_abnormal);
- switchNoConnection();
- break;
- case LOGIN_ERROR:
- say(R.string.progress_login_error);
- switchNoConnection();
- break;
- default:
- return false;
- }
- return true;
- }
-
- protected void alert(String msg) {
- if (isFinishing()) {
- return;
- }
- new AlertDialog.Builder(this)//
- .setMessage(msg)//
- .setPositiveButton(android.R.string.ok, null)//
- .create()//
- .show();//
- }
-
- protected void alert(int resId) {
- alert(getString(resId));
- }
-
- protected void restoreViewSelection() {
- listView.setSelectionFromTop(index, top);
- }
-
- protected void backupViewSelection() {
- index = listView.getFirstVisiblePosition();
- View v = listView.getChildAt(0);
- top = (v == null) ? 0 : v.getTop();
- }
-
- int index;
- int top;
-
- protected boolean checkInternetConnection() {
- if (Utils.checkInternetConnection(this)) {
- return true;
- }
- noInternetConnection();
- return false;
- }
-
- // public void svdrpEvent(Result result) {
- // resultReceived(result);
- // }
-
- @Override
- public void svdrpEvent(SvdrpEvent event, Throwable t) {
- progress.dismiss();
- Utils.say(this, t.getMessage());
- }
-
- protected void addListener(SvdrpAsyncTask<Result, SvdrpClient<Result>> task) {
- task.addSvdrpExceptionListener(this);
- task.addSvdrpListener(this);
- task.addSvdrpFinishedListener(this);
- }
-
- @Override
- public void svdrpEvent(final SvdrpEvent event) {
-
- switch (event) {
- case LOGIN:
- break;
- case COMMAND_SENDING:
- break;
- case CONNECTING:
- progress.setProgressStyle(ProgressDialog.STYLE_SPINNER);
- setMessage(R.string.progress_connect);
- if (!isFinishing()) {
- progress.show();
- }
- break;
- case LOGGED_IN:
- setMessage(R.string.progress_login);
- break;
- case COMMAND_SENT:
- setMessage(getProgressTextId());
- break;
- case DISCONNECTING:
- setMessage(R.string.progress_disconnect);
- break;
- case DISCONNECTED:
- break;
- case ABORTED:
- progress.dismiss();
- say(R.string.aborted);
- break;
- case ERROR:
- progress.dismiss();
- alert(R.string.epg_client_errors);
- break;
- case CONNECTED:
- connected();
- break;
- case CONNECTION_TIMEOUT:
- case CONNECT_ERROR:
- case FINISHED_ABNORMALY:
- case LOGIN_ERROR:
- progress.dismiss();
- noConnection(event);
- break;
- case CACHE_HIT:
- progress.dismiss();
- cacheHit();
- return;
- case FINISHED_SUCCESS:
- progress.dismiss();
- break;
- }
- // case RESULT_RECEIVED:
- // resultReceived(result);
- // break;
- // }
- }
-
- protected int getProgressTextId() {
- return R.string.progress_loading;
- }
-
- private void setMessage(int progressConnect) {
- progress.setMessage(getString(progressConnect));
- }
-
- protected boolean finishedSuccess = false;
-
- protected void cacheHit() {
-
- }
-
- /**
- * @return false, if no results found
- */
- protected abstract boolean finishedSuccess(List<Result> results);
-
- // /**
- // * @param result
- // */
- // protected abstract void resultReceived(Result result);
-
- protected void connected() {
- if (flipper != null) {
- flipper.setDisplayedChild(0);
- }
- }
-
- public void svdrpException(final SvdrpException exception) {
- // svdrpException(exception);
- // Log.w(TAG, exception);
- alert(getString(R.string.vdr_error_text, exception.getMessage()));
- }
-
- @Override
- protected void onDestroy() {
- if (progress.isShowing()) {
- progress.dismiss();
- }
- super.onDestroy();
- }
-
- @Override
- public void finished(List<Result> results) {
- if (finishedSuccess(results)) {
- finishedSuccess = true;
- restoreViewSelection();
- } else {
- say(R.string.epg_no_items);
- }
- }
+ protected boolean forceRefresh = false;
+ protected void switchNoConnection() {
+ if (flipper == null) {
+ say(R.string.no_connection);
+ return;
+ }
+
+ if (displayingResults()) {
+ say(R.string.no_connection);
+ } else {
+ flipper.setDisplayedChild(1);
+ }
+ }
+
+ @Override
+ public void onConfigurationChanged(final Configuration newConfig) {
+ Preferences.setLocale(this);
+ super.onConfigurationChanged(newConfig);
+ }
+
+ @Override
+ protected void onResume() {
+ Preferences.setLocale(this);
+ // Preferences.init(this);
+ super.onResume();
+ }
+
+ protected void initFlipper() {
+ this.flipper = (ViewFlipper) findViewById(R.id.flipper);
+ retry = (Button) findViewById(R.id.retry_button);
+ retry.setOnClickListener(this);
+ }
+
+ @Override
+ public void onClick(final View v) {
+ if (v.getId() == R.id.retry_button) {
+ retry();
+ }
+ }
+
+ //
+ // protected void updateWindowTitle(int topic, int subtopic) {
+ // String title;
+ // title = getString(topic);
+ // if (subtopic != -1) {
+ // title += " > " + getString(subtopic);
+ // }
+ // setTitle(title);
+ // }
+ //
+ // protected void updateWindowTitle(String topic, String subtopic) {
+ // String title = topic;
+ // if (subtopic != null) {
+ // title += " > " + subtopic;
+ // }
+ // setTitle(title);
+ // }
+
+ abstract protected int getListNavigationIndex();
+
+ public static final int LIST_NAVIGATION_CHANNELS = 0;
+ public static final int LIST_NAVIGATION_EPG_BY_TIME = 1;
+ public static final int LIST_NAVIGATION_EPG_BY_CHANNEL = 2;
+ public static final int LIST_NAVIGATION_RECORDINGS = 3;
+ public static final int LIST_NAVIGATION_TIMERS = 4;
+
+ protected boolean hasListNavigation() {
+ return true;
+ }
+
+ protected void initListNavigation() {
+
+ if (hasListNavigation() == false) {
+ return;
+ }
+
+ getSupportActionBar().setDisplayShowTitleEnabled(false);
+
+ getSupportActionBar().setNavigationMode(
+ getSupportActionBar().NAVIGATION_MODE_LIST);
+
+ final ArrayAdapter<CharSequence> mSpinnerAdapter = ArrayAdapter
+ .createFromResource(this, R.array.navigation_array,
+ android.R.layout.simple_spinner_dropdown_item);
+
+ getSupportActionBar().setListNavigationCallbacks(mSpinnerAdapter,
+ new OnNavigationListener() {
+
+ private boolean firstHit = true;
+
+ @Override
+ public boolean onNavigationItemSelected(final int itemPosition,
+ final long itemId) {
+
+ if (firstHit == true) {
+ firstHit = false;
+ return false;
+ }
+ switch (itemPosition) {
+
+ case LIST_NAVIGATION_CHANNELS: {
+ startActivity(ChannelListActivity.class);
+ return true;
+ }
+ case LIST_NAVIGATION_EPG_BY_TIME: {
+ startActivity(TimeEpgListActivity.class);
+ return true;
+ }
+
+ case LIST_NAVIGATION_EPG_BY_CHANNEL: {
+ startActivity(EventEpgListActivity.class);
+ return true;
+ }
+
+ case LIST_NAVIGATION_RECORDINGS: {
+ startActivity(RecordingListActivity.class);
+ return true;
+ }
+
+ case LIST_NAVIGATION_TIMERS: {
+ startActivity(TimerListActivity.class);
+ return true;
+ }
+
+ }
+ return false;
+ }
+ });
+ getSupportActionBar().setSelectedNavigationItem(
+ getListNavigationIndex());
+
+ }
+
+ @Override
+ protected void onCreate(final Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ Preferences.setLocale(this);
+ progress = new ProgressDialog(this);
+ progress.setCancelable(false);
+ progress.setCanceledOnTouchOutside(false);
+ // progress.setOnCancelListener(new OnCancelListener() {
+ // @Override
+ // public void onCancel(DialogInterface dialog) {
+ //
+ // }
+ // });
+
+ initActionBar();
+
+ initListNavigation();
+
+ // new OnNavigationListener() {
+ // @Override
+ // public boolean onNavigationItemSelected(int itemPosition, long
+ // itemId) {
+ // System.err.println("itemPosition: "+ itemPosition +", itemId:" +
+ // itemId);
+ // rturn false;
+ // }
+ // });
+
+ // your logic for click listner
+ // setListenerForActionBarCustomView(actionBarView);
+
+ // private void setListenerForActionBarCustomView(View actionBarView) {
+ // ActionBarCustomViewOnClickListener actionBarCustomViewOnClickListener
+ // = new ActionBarCustomViewOnClickListener();
+ // actionBarView.findViewById(R.id.text_view_title).setOnClickListener(actionBarCustomViewOnClickListener);
+ // }
+
+ }
+
+ public void startActivity(final Class<?> clazz) {
+ final Intent intent = new Intent(Intent.ACTION_VIEW);
+ intent.setClass(this, clazz);
+ startActivity(intent);
+ finish();
+ }
+
+ protected int getBaseMenu() {
+ return R.menu.refresh_filter_menu;
+ }
+
+ @Override
+ public boolean onCreateOptionsMenu(
+ final com.actionbarsherlock.view.Menu menu) {
+
+ // MenuItem item;
+ // item = menu.add(MENU_GROUP_REFRESH, MENU_REFRESH, 0,
+ // R.string.refresh);
+ // item.setIcon(R.drawable.ic_menu_refresh);
+ // item.setAlphabeticShortcut('r');
+ final com.actionbarsherlock.view.MenuInflater inf = getSupportMenuInflater();
+ inf.inflate(getBaseMenu(), menu);
+
+ // SearchView searchView = (SearchView)
+ // menu.findItem(R.id.menu_search).getActionView();
+ // searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
+
+ return true;
+ }
+
+ abstract protected void refresh();
+
+ abstract protected void retry();
+
+ // abstract protected SvdrpClient<Result> getClient();
+
+ @Override
+ public boolean onOptionsItemSelected(
+ final com.actionbarsherlock.view.MenuItem item) {
+ switch (item.getItemId()) {
+ case R.id.list_refresh:
+ backupViewSelection();
+ refresh();
+ return true;
+ case R.id.list_filter: {
+ onSearchRequested();
+ return true;
+ }
+ case android.R.id.home:
+ final Intent intent = new Intent(this, VdrManagerActivity.class);
+ intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
+ startActivity(intent);
+ return true;
+ default:
+ return false;
+ }
+ }
+
+ protected void setCurrent(final Channel channel) {
+ getApp().setCurrentChannel(channel);
+ }
+
+ protected VdrManagerApp getApp() {
+ final VdrManagerApp app = (VdrManagerApp) getApplication();
+ return app;
+ }
+
+ // protected Channel getCurrentChannel(){
+ // final Channel channel = ((VdrManagerApp) getApplication())
+ // .getCurrentChannel();
+ // return channel;
+ // }
+
+ protected void say(final int res) {
+ say(this.getString(res));
+ }
+
+ protected void say(final String msg) {
+ Utils.say(this, msg);
+ }
+
+ protected boolean noConnection(final SvdrpEvent event) {
+ switch (event) {
+ case CONNECTION_TIMEOUT:
+ say(R.string.progress_connect_timeout);
+ switchNoConnection();
+ case CONNECT_ERROR:
+ say(R.string.progress_connect_error);
+ switchNoConnection();
+ break;
+ case FINISHED_ABNORMALY:
+ alert(R.string.progress_connect_finished_abnormal);
+ switchNoConnection();
+ break;
+ case LOGIN_ERROR:
+ say(R.string.progress_login_error);
+ switchNoConnection();
+ break;
+ default:
+ return false;
+ }
+ return true;
+ }
+
+ protected void alert(final String msg) {
+ if (isFinishing()) {
+ return;
+ }
+ new AlertDialog.Builder(this)//
+ .setMessage(msg)//
+ .setPositiveButton(android.R.string.ok, null)//
+ .create()//
+ .show();//
+ }
+
+ protected void alert(final int resId) {
+ alert(getString(resId));
+ }
+
+ protected void restoreViewSelection() {
+ listView.setSelectionFromTop(index, top);
+ }
+
+ protected void backupViewSelection() {
+ index = listView.getFirstVisiblePosition();
+ final View v = listView.getChildAt(0);
+ top = (v == null) ? 0 : v.getTop();
+ }
+
+ int index;
+ int top;
+
+ protected boolean checkInternetConnection() {
+ if (Utils.checkInternetConnection(this)) {
+ return true;
+ }
+ noInternetConnection();
+ return false;
+ }
+
+ // public void svdrpEvent(Result result) {
+ // resultReceived(result);
+ // }
+
+ @Override
+ public void svdrpEvent(final SvdrpEvent event, final Throwable t) {
+ progress.dismiss();
+ Utils.say(this, t.getMessage());
+ }
+
+ protected void addListener(final SvdrpAsyncTask<Result, SvdrpClient<Result>> task) {
+ task.addSvdrpExceptionListener(this);
+ task.addSvdrpListener(this);
+ task.addSvdrpFinishedListener(this);
+ }
+
+ @Override
+ public void svdrpEvent(final SvdrpEvent event) {
+
+ switch (event) {
+ case LOGIN:
+ break;
+ case COMMAND_SENDING:
+ break;
+ case CONNECTING:
+ progress.setProgressStyle(ProgressDialog.STYLE_SPINNER);
+ setMessage(R.string.progress_connect);
+ if (!isFinishing()) {
+ progress.show();
+ }
+ break;
+ case LOGGED_IN:
+ setMessage(R.string.progress_login);
+ break;
+ case COMMAND_SENT:
+ setMessage(getProgressTextId());
+ break;
+ case DISCONNECTING:
+ setMessage(R.string.progress_disconnect);
+ break;
+ case DISCONNECTED:
+ break;
+ case ABORTED:
+ progress.dismiss();
+ say(R.string.aborted);
+ break;
+ case ERROR:
+ progress.dismiss();
+ alert(R.string.epg_client_errors);
+ break;
+ case CONNECTED:
+ connected();
+ break;
+ case CONNECTION_TIMEOUT:
+ case CONNECT_ERROR:
+ case FINISHED_ABNORMALY:
+ case LOGIN_ERROR:
+ progress.dismiss();
+ noConnection(event);
+ break;
+ case CACHE_HIT:
+ progress.dismiss();
+ cacheHit();
+ return;
+ case FINISHED_SUCCESS:
+ progress.dismiss();
+ break;
+ }
+ // case RESULT_RECEIVED:
+ // resultReceived(result);
+ // break;
+ // }
+ }
+
+ protected int getProgressTextId() {
+ return R.string.progress_loading;
+ }
+
+ private void setMessage(final int progressConnect) {
+ progress.setMessage(getString(progressConnect));
+ }
+
+ protected boolean finishedSuccess = false;
+
+ protected void cacheHit() {
+
+ }
+
+ /**
+ * @return false, if no results found
+ */
+ protected abstract boolean finishedSuccess(List<Result> results);
+
+ // /**
+ // * @param result
+ // */
+ // protected abstract void resultReceived(Result result);
+
+ protected void connected() {
+ if (flipper != null) {
+ flipper.setDisplayedChild(0);
+ }
+ }
+
+ public void svdrpException(final SvdrpException exception) {
+ // svdrpException(exception);
+ // Log.w(TAG, exception);
+ alert(getString(R.string.vdr_error_text, exception.getMessage()));
+ }
+
+ @Override
+ protected void onDestroy() {
+ if (progress.isShowing()) {
+ progress.dismiss();
+ }
+ super.onDestroy();
+ }
+
+ @Override
+ public void finished(final List<Result> results) {
+ if (finishedSuccess(results)) {
+ finishedSuccess = true;
+ restoreViewSelection();
+ } else {
+ say(R.string.epg_no_items);
+ }
+ }
+
+ /**
+ * Creates a dialog for showing certificate problems
+ * @return dialog
+ */
+ @Override
+ protected CertificateProblemDialog getCertificateProblemDialog() {
+ return new CertificateProblemDialog(this);
+ }
}
diff --git a/vdrmanager/src/de/bjusystems/vdrmanager/gui/BaseEventListActivity.java b/vdrmanager/src/de/bjusystems/vdrmanager/gui/BaseEventListActivity.java
index 8463063..58b88ea 100644
--- a/vdrmanager/src/de/bjusystems/vdrmanager/gui/BaseEventListActivity.java
+++ b/vdrmanager/src/de/bjusystems/vdrmanager/gui/BaseEventListActivity.java
@@ -36,511 +36,523 @@ import de.bjusystems.vdrmanager.utils.svdrp.SvdrpException;
*
*/
public abstract class BaseEventListActivity<T extends Event> extends
- BaseActivity<T, ListView> implements OnItemClickListener,
- SimpleGestureListener {
+BaseActivity<T, ListView> implements OnItemClickListener,
+SimpleGestureListener {
- public static final String TAG = BaseEventListActivity.class.getName();
+ public static final String TAG = BaseEventListActivity.class.getName();
- public static final int MENU_GROUP_SHARE = 90;
+ public static final int MENU_GROUP_SHARE = 90;
- public static final int MENU_SHARE = 90;
+ public static final int MENU_SHARE = 90;
- public static final int MENU_GROUP_TO_CAL = 91;
+ public static final int MENU_GROUP_TO_CAL = 91;
- public static final int MENU_TO_CAL = 91;
+ public static final int MENU_TO_CAL = 91;
- private SimpleGestureFilter detector;
+ private SimpleGestureFilter detector;
protected BaseEventAdapter<EventListItem> adapter;
- protected String highlight = null;
+ protected String highlight = null;
- protected Date lastUpdate = null;
+ protected Date lastUpdate = null;
- protected static final Date FUTURE = new Date(Long.MAX_VALUE);
+ 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 Channel currentChannel = null;
- //protected List<T> results = new ArrayList<T>();
+ //protected List<T> results = new ArrayList<T>();
- AlertDialog sortByDialog = null;
+ AlertDialog sortByDialog = null;
- public static final int MENU_GROUP_DEFAULT = 0;
+ public static final int MENU_GROUP_DEFAULT = 0;
- public static final int MENU_GROUP_ALPHABET = 1;
+ public static final int MENU_GROUP_ALPHABET = 1;
- protected int sortBy;
+ protected int sortBy;
- @Override
- protected void onCreate(final Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
+ @Override
+ protected void onCreate(final Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
- sortBy = Preferences.get(this, getViewID() + "_"
- + P.EPG_LAST_SORT, MENU_GROUP_DEFAULT);
- // Attach view
- setContentView(getMainLayout());
- setTitle(getWindowTitle());
- initFlipper();
- detector = new SimpleGestureFilter(this, this);
+ sortBy = Preferences.get(this, getViewID() + "_"
+ + P.EPG_LAST_SORT, MENU_GROUP_DEFAULT);
+ // Attach view
+ setContentView(getMainLayout());
+ setTitle(getWindowTitle());
+ initFlipper();
+ detector = new SimpleGestureFilter(this, this);
- initChannel();
- }
+ initChannel();
+ }
- private void initChannel() {
- currentChannel = getApp().getCurrentChannel();
- // currentChannel = getIntent()
- // .getParcelableExtra(Intents.CURRENT_CHANNEL);
- }
+ private void initChannel() {
+ currentChannel = getApp().getCurrentChannel();
+ // currentChannel = getIntent()
+ // .getParcelableExtra(Intents.CURRENT_CHANNEL);
+ }
- @Override
- protected void onResume() {
- super.onResume();
- if (notifyDataSetChangedOnResume()) {
- adapter.notifyDataSetChanged();
- }
- }
+ @Override
+ protected void onResume() {
+ super.onResume();
+ if (notifyDataSetChangedOnResume()) {
+ adapter.notifyDataSetChanged();
+ }
+ }
- /*
- * (non-Javadoc)
- *
- * @see
- * de.bjusystems.vdrmanager.gui.BaseActivity#onCreateOptionsMenu(android
- * .view.Menu)
- */
- @Override
- public boolean onCreateOptionsMenu(
- final com.actionbarsherlock.view.Menu menu) {
- super.onCreateOptionsMenu(menu);
- final com.actionbarsherlock.view.MenuInflater inflater = getSupportMenuInflater();
- inflater.inflate(R.menu.epg_list_menu, menu);
- return true;
- }
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * de.bjusystems.vdrmanager.gui.BaseActivity#onCreateOptionsMenu(android
+ * .view.Menu)
+ */
+ @Override
+ public boolean onCreateOptionsMenu(
+ final com.actionbarsherlock.view.Menu menu) {
+ super.onCreateOptionsMenu(menu);
+ final com.actionbarsherlock.view.MenuInflater inflater = getSupportMenuInflater();
+ inflater.inflate(R.menu.epg_list_menu, menu);
+ return true;
+ }
- /**
- * Prepare the current event and the chained events for
- *
- * @param event
- */
- protected void prepareDetailsViewData(EventListItem event) {
-
- }
+ /**
+ * Prepare the current event and the chained events for
+ *
+ * @param event
+ */
+ protected void prepareDetailsViewData(final EventListItem event) {
+
+ }
- /*
- * (non-Javadoc)
- *
- * @see android.app.Activity#onContextItemSelected(android.view.MenuItem)
- */
- @Override
- public boolean onContextItemSelected(final MenuItem item) {
+ /*
+ * (non-Javadoc)
+ *
+ * @see android.app.Activity#onContextItemSelected(android.view.MenuItem)
+ */
+ @Override
+ public boolean onContextItemSelected(final MenuItem item) {
- final AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) item
- .getMenuInfo();
- final EventListItem event = adapter.getItem(info.position);
+ final AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) item
+ .getMenuInfo();
+ final EventListItem event = adapter.getItem(info.position);
- int itemId = item.getItemId();
+ final int itemId = item.getItemId();
- switch (itemId) {
+ switch (itemId) {
- case R.id.epg_item_menu_live_tv: {
- Utils.stream(this, event);
- break;
- }
-
-
- case MENU_SHARE: {
- Utils.shareEvent(this, event);
- break;
- }
-
- case MENU_TO_CAL: {
- Utils.addCalendarEvent(this, event);
- break;
- }
-
- case R.id.epg_item_menu_switchto: {
- Utils.switchTo(this, event.getChannelId(), event.getChannelName());
- break;
- }
-
- default:
- return super.onContextItemSelected(item);
- }
-
- return true;
- }
-
-
-
- protected int getAvailableSortByEntries() {
- return 0;
- }
-
- protected void fillAdapter() {
-
- }
-
- /*
- * (non-Javadoc)
- *
- * @see
- * de.bjusystems.vdrmanager.gui.BaseActivity#onOptionsItemSelected(android
- * .view.MenuItem)
- */
- public boolean onOptionsItemSelected(
- final com.actionbarsherlock.view.MenuItem item) {
-
- switch (item.getItemId()) {
-
- case R.id.epg_list_sort_menu: {
-
- if (sortByDialog == null) {
- sortByDialog = new AlertDialog.Builder(this)
- .setTitle(R.string.sort)
- .setIcon(android.R.drawable.ic_menu_sort_alphabetically)
- .setSingleChoiceItems(getAvailableSortByEntries(),
- sortBy, new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog,
- int which) {
-
- if (sortBy == which) {
- sortByDialog.dismiss();
- return;
- }
-
- sortBy = which;
-
- new VoidAsyncTask() {
-
- @Override
- protected Void doInBackground(
- Void... params) {
- Preferences
- .set(BaseEventListActivity.this,
- getViewID()
- + "_"
- + P.EPG_LAST_SORT,
- sortBy);
- return null;
- }
- }.execute();
-
- sortByDialog.dismiss();
- fillAdapter();
- }
-
- }).create();
- }
-
- sortByDialog.show();
-
- return true;
- }
-
- // switch (item.getItemId()) {
- // case R.id.epg_menu_search:
- // startSearchManager();
- // super.onSearchRequested();
- // break;
- // case R.id.epg_menu_times:
- // intent = new Intent();
- // /intent.setClass(this, EpgSearchTimesListActivity.class);
- // startActivity(intent);
- // break;
- }
- return super.onOptionsItemSelected(item);
- }
-
- /*
- * (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,
- final ContextMenuInfo menuInfo) {
-
- // if (v.getId() == R.id.whatson_list) {
- final AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) menuInfo;
-
- // set menu title
- final EventListItem item = adapter.getItem(info.position);
-
- if (item.isHeader()) {
- return;
- }
-
- MenuItem mi = menu.findItem(R.id.epg_item_menu_live_tv);
- if (item.isLive() && item.getStreamId() != null) {
-
- mi.setVisible(true);
-
- } else {
-
- mi.setVisible(false);
- }
- menu.add(MENU_GROUP_SHARE, MENU_SHARE, 0, R.string.share);
- menu.add(MENU_GROUP_TO_CAL, MENU_TO_CAL, 0, R.string.addtocal);
- super.onCreateContextMenu(menu, v, menuInfo);
-
- }
-
- /**
- * @param parent
- * @param view
- * @param position
- * @param id
- */
- public void onItemClick(final AdapterView<?> parent, final View view,
- final int position, final long id) {
-
- // find and remember item
- final EventListItem item = adapter.getItem(position);
-
- if (item.isHeader()) {
- return;
- }
-
- prepareDetailsViewData(item);
-
- // show details
- final Intent intent = new Intent(this, EpgDetailsActivity.class);
- intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT
- | Intent.FLAG_ACTIVITY_SINGLE_TOP);
- if (highlight != null) {
- intent.putExtra(Intents.HIGHLIGHT, highlight);
- }
- startActivityForResult(intent,
- TimerDetailsActivity.REQUEST_CODE_TIMER_MODIFIED);
- }
-
- protected boolean notifyDataSetChangedOnResume() {
- return true;
- }
-
- @Override
- protected void onPause() {
- super.onPause();
- // if (epgClient != null) {
- // epgClient.abort();
- // }
- // if (progress != null) {
- // progress.dismiss();
- // progress = null;
- // }
- }
-
-// protected void resultReceived(T result) {
-// results.add(result);
-// }
-
- @Override
- protected void onRestoreInstanceState(Bundle savedInstanceState) {
- super.onRestoreInstanceState(savedInstanceState);
- int index = savedInstanceState.getInt("INDEX");
- int top = savedInstanceState.getInt("TOP");
- listView.setSelectionFromTop(index, top);
- }
-
- @Override
- protected void onSaveInstanceState(Bundle outState) {
- int index = listView.getFirstVisiblePosition();
- View v = listView.getChildAt(0);
- int top = (v == null) ? 0 : v.getTop();
- outState.putInt("INDEX", index);
- outState.putInt("TOP", top);
- super.onSaveInstanceState(outState);
- }
-
- protected void dismiss(AlertDialog dialog) {
- if (dialog == null) {
- return;
- }
- dialog.dismiss();
- }
-
- public boolean onSearchRequested() {
- InputMethodManager inputMgr = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
- inputMgr.toggleSoftInput(0, 0);
- return true;
- }
-
- protected void startSearchManager() {
- Bundle appData = new Bundle();
- startSearch(highlight, false, appData, false);
- }
-
- @Override
- public boolean dispatchTouchEvent(MotionEvent me) {
- this.detector.onTouchEvent(me);
- return super.dispatchTouchEvent(me);
- }
-
- public void onSwipe(int direction) {
-
- }
-
- public void onDoubleTap() {
-
- }
-
- protected void sortItemsByChannel(List<Event> result) {
- final Comparator<Event> comparator = new Comparator<Event>() {
-
- public int compare(final Event item1, final Event item2) {
- return item1.getChannelNumber().compareTo(
- item2.getChannelNumber());
- }
- };
- Collections.sort(result, comparator);
- }
-
- protected void sortItemsByTime(List<T> result) {
- sortItemsByTime(result, false);
- }
-
- protected void sortItemsByTime(List<T> result, final boolean reverse) {
- Collections.sort(result, new TimeAndChannelComparator(reverse));
- }
-
- public void svdrpException(final SvdrpException exception) {
- Log.w(TAG, exception);
- alert(getString(R.string.vdr_error_text, exception.getMessage()));
- }
-
- abstract protected boolean finishedSuccessImpl(List<T> results);
-
- protected String getViewID(){
- return this.getClass().getSimpleName();
- }
-
- protected void pushResultCountToTitle(){
- setTitle(getString(R.string.epg_window_title_count, getWindowTitle(),
- getCACHE().size()));
- }
-
-
- synchronized protected final boolean finishedSuccess(List<T> results) {
- //ProgressDialog dialog = new ProgressDialog(this);
- //dialog.setMessage("Loading");
- //dialog.show();
- try {
- lastUpdate = new Date();
- boolean r = finishedSuccessImpl(results);
- if(r == false){
- adapter.clear();
- adapter.notifyDataSetChanged();
- }
- return r;
- } finally {
-// dialog.dismiss();
- //results.clear();
- }
- }
-
- @Override
- protected boolean displayingResults() {
- return getCACHE().isEmpty() == false;
- }
-
- class TitleComparator implements Comparator<Event> {
-
- @Override
- public int compare(Event lhs, Event rhs) {
- if (lhs == null || lhs.getTitle() == null) {
- return 1;
- }
- if (rhs == null || rhs.getTitle() == null) {
- return 0;
- }
- return lhs.getTitle().compareToIgnoreCase(rhs.getTitle());
- }
- };
-
- class TimeAndChannelComparator implements Comparator<Event> {
- boolean r = false;
-
- TimeAndChannelComparator() {
- this(false);
- }
- TimeAndChannelComparator(boolean r) {
- this.r = r;
- }
-
- public int compare(final Event item1, final Event item2) {
-
- int c = item1.getStart().compareTo(item2.getStart());
- if (c != 0) {
- if (r == false)
- return c;
- return -1 * c;
- }
- if (item1.getChannelNumber() == null
- && item2.getChannelNumber() == null) {
- return 0;
- }
- if (item1.getChannelNumber() == null) {
- return 1;
- }
- if (item2.getChannelNumber() == null) {
- return -1;
- }
- return item1.getChannelNumber().compareTo(item2.getChannelNumber());
- }
- }
-
-
- class TimeComparator implements Comparator<Event> {
- boolean r = false;
-
- TimeComparator(boolean r) {
- this.r = r;
- }
-
- public int compare(final Event item1, final Event item2) {
-
- int c = item1.getStart().compareTo(item2.getStart());
- if (c == 0) {
- return c;
- }
- if (r == false)
- return c;
- return -1 * c;
- }
- }
-
- class ChannelComparator implements Comparator<Event> {
-
- public int compare(final Event item1, final Event item2) {
-
- if (item1.getChannelNumber() == null
- && item2.getChannelNumber() == null) {
- return 0;
- }
- if (item1.getChannelNumber() == null) {
- return 1;
- }
- if (item2.getChannelNumber() == null) {
- return -1;
- }
- return item1.getChannelNumber().compareTo(item2.getChannelNumber());
- }
- }
-
-
-
- public void clearCache() {
- getCACHE().clear();
- }
-
- protected abstract List<T> getCACHE();
-
-// @Override
-// protected void connected() {
-// super.connected();
-// results.clear();
-// }
+ case R.id.epg_item_menu_live_tv: {
+ Utils.stream(this, event);
+ break;
+ }
+
+
+ case MENU_SHARE: {
+ Utils.shareEvent(this, event);
+ break;
+ }
+
+ case MENU_TO_CAL: {
+ Utils.addCalendarEvent(this, event);
+ break;
+ }
+
+ case R.id.epg_item_menu_switchto: {
+ Utils.switchTo(this, event.getChannelId(), event.getChannelName());
+ break;
+ }
+
+ default:
+ return super.onContextItemSelected(item);
+ }
+
+ return true;
+ }
+
+
+
+ protected int getAvailableSortByEntries() {
+ return 0;
+ }
+
+ protected void fillAdapter() {
+
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * de.bjusystems.vdrmanager.gui.BaseActivity#onOptionsItemSelected(android
+ * .view.MenuItem)
+ */
+ public boolean onOptionsItemSelected(
+ final com.actionbarsherlock.view.MenuItem item) {
+
+ switch (item.getItemId()) {
+
+ case R.id.epg_list_sort_menu: {
+
+ if (sortByDialog == null) {
+ sortByDialog = new AlertDialog.Builder(this)
+ .setTitle(R.string.sort)
+ .setIcon(android.R.drawable.ic_menu_sort_alphabetically)
+ .setSingleChoiceItems(getAvailableSortByEntries(),
+ sortBy, new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(final DialogInterface dialog,
+ final int which) {
+
+ if (sortBy == which) {
+ sortByDialog.dismiss();
+ return;
+ }
+
+ sortBy = which;
+
+ new VoidAsyncTask() {
+
+ @Override
+ protected Void doInBackground(
+ final Void... params) {
+ Preferences
+ .set(BaseEventListActivity.this,
+ getViewID()
+ + "_"
+ + P.EPG_LAST_SORT,
+ sortBy);
+ return null;
+ }
+ }.execute();
+
+ sortByDialog.dismiss();
+ fillAdapter();
+ }
+
+ }).create();
+ }
+
+ sortByDialog.show();
+
+ return true;
+ }
+
+ // switch (item.getItemId()) {
+ // case R.id.epg_menu_search:
+ // startSearchManager();
+ // super.onSearchRequested();
+ // break;
+ // case R.id.epg_menu_times:
+ // intent = new Intent();
+ // /intent.setClass(this, EpgSearchTimesListActivity.class);
+ // startActivity(intent);
+ // break;
+ }
+ return super.onOptionsItemSelected(item);
+ }
+
+ /*
+ * (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,
+ final ContextMenuInfo menuInfo) {
+
+ // if (v.getId() == R.id.whatson_list) {
+ final AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) menuInfo;
+
+ // set menu title
+ final EventListItem item = adapter.getItem(info.position);
+
+ if (item.isHeader()) {
+ return;
+ }
+
+ final MenuItem mi = menu.findItem(R.id.epg_item_menu_live_tv);
+ if (item.isLive() && item.getStreamId() != null) {
+
+ mi.setVisible(true);
+
+ } else {
+
+ mi.setVisible(false);
+ }
+ menu.add(MENU_GROUP_SHARE, MENU_SHARE, 0, R.string.share);
+ menu.add(MENU_GROUP_TO_CAL, MENU_TO_CAL, 0, R.string.addtocal);
+ super.onCreateContextMenu(menu, v, menuInfo);
+
+ }
+
+ /**
+ * @param parent
+ * @param view
+ * @param position
+ * @param id
+ */
+ @Override
+ public void onItemClick(final AdapterView<?> parent, final View view,
+ final int position, final long id) {
+
+ // find and remember item
+ final EventListItem item = adapter.getItem(position);
+
+ if (item.isHeader()) {
+ return;
+ }
+
+ prepareDetailsViewData(item);
+
+ // show details
+ final Intent intent = new Intent(this, EpgDetailsActivity.class);
+ intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT
+ | Intent.FLAG_ACTIVITY_SINGLE_TOP);
+ if (highlight != null) {
+ intent.putExtra(Intents.HIGHLIGHT, highlight);
+ }
+ startActivityForResult(intent,
+ TimerDetailsActivity.REQUEST_CODE_TIMER_MODIFIED);
+ }
+
+ protected boolean notifyDataSetChangedOnResume() {
+ return true;
+ }
+
+ @Override
+ protected void onPause() {
+ super.onPause();
+ // if (epgClient != null) {
+ // epgClient.abort();
+ // }
+ // if (progress != null) {
+ // progress.dismiss();
+ // progress = null;
+ // }
+ }
+
+ // protected void resultReceived(T result) {
+ // results.add(result);
+ // }
+
+ @Override
+ protected void onRestoreInstanceState(final Bundle savedInstanceState) {
+ super.onRestoreInstanceState(savedInstanceState);
+ final int index = savedInstanceState.getInt("INDEX");
+ final int top = savedInstanceState.getInt("TOP");
+ listView.setSelectionFromTop(index, top);
+ }
+
+ @Override
+ protected void onSaveInstanceState(final Bundle outState) {
+ final int index = listView.getFirstVisiblePosition();
+ final View v = listView.getChildAt(0);
+ final int top = (v == null) ? 0 : v.getTop();
+ outState.putInt("INDEX", index);
+ outState.putInt("TOP", top);
+ super.onSaveInstanceState(outState);
+ }
+
+ protected void dismiss(final AlertDialog dialog) {
+ if (dialog == null) {
+ return;
+ }
+ dialog.dismiss();
+ }
+
+ public boolean onSearchRequested() {
+ final InputMethodManager inputMgr = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
+ inputMgr.toggleSoftInput(0, 0);
+ return true;
+ }
+
+ protected void startSearchManager() {
+ final Bundle appData = new Bundle();
+ startSearch(highlight, false, appData, false);
+ }
+
+ @Override
+ public boolean dispatchTouchEvent(final MotionEvent me) {
+ this.detector.onTouchEvent(me);
+ return super.dispatchTouchEvent(me);
+ }
+
+ @Override
+ public void onSwipe(final int direction) {
+
+ }
+
+ @Override
+ public void onDoubleTap() {
+
+ }
+
+ protected void sortItemsByChannel(final List<Event> result) {
+ final Comparator<Event> comparator = new Comparator<Event>() {
+
+ @Override
+ public int compare(final Event item1, final Event item2) {
+ return item1.getChannelNumber().compareTo(
+ item2.getChannelNumber());
+ }
+ };
+ Collections.sort(result, comparator);
+ }
+
+ protected void sortItemsByTime(final List<T> result) {
+ sortItemsByTime(result, false);
+ }
+
+ protected void sortItemsByTime(final List<T> result, final boolean reverse) {
+ Collections.sort(result, new TimeAndChannelComparator(reverse));
+ }
+
+ @Override
+ public void svdrpException(final SvdrpException exception) {
+ Log.w(TAG, exception);
+ alert(getString(R.string.vdr_error_text, exception.getMessage()));
+ }
+
+ abstract protected boolean finishedSuccessImpl(List<T> results);
+
+ protected String getViewID(){
+ return this.getClass().getSimpleName();
+ }
+
+ protected void pushResultCountToTitle(){
+ setTitle(getString(R.string.epg_window_title_count, getWindowTitle(),
+ getCACHE().size()));
+ }
+
+
+ @Override
+ synchronized protected final boolean finishedSuccess(final List<T> results) {
+ //ProgressDialog dialog = new ProgressDialog(this);
+ //dialog.setMessage("Loading");
+ //dialog.show();
+ try {
+ lastUpdate = new Date();
+ final boolean r = finishedSuccessImpl(results);
+ if(r == false){
+ adapter.clear();
+ adapter.notifyDataSetChanged();
+ }
+ return r;
+ } finally {
+ // dialog.dismiss();
+ //results.clear();
+ }
+ }
+
+ @Override
+ protected boolean displayingResults() {
+ return getCACHE().isEmpty() == false;
+ }
+
+ class TitleComparator implements Comparator<Event> {
+
+ @Override
+ public int compare(final Event lhs, final Event rhs) {
+ if (lhs == null || lhs.getTitle() == null) {
+ return 1;
+ }
+ if (rhs == null || rhs.getTitle() == null) {
+ return 0;
+ }
+ return lhs.getTitle().compareToIgnoreCase(rhs.getTitle());
+ }
+ };
+
+ class TimeAndChannelComparator implements Comparator<Event> {
+ boolean r = false;
+
+ TimeAndChannelComparator() {
+ this(false);
+ }
+ TimeAndChannelComparator(final boolean r) {
+ this.r = r;
+ }
+
+ @Override
+ public int compare(final Event item1, final Event item2) {
+
+ final int c = item1.getStart().compareTo(item2.getStart());
+ if (c != 0) {
+ if (r == false) {
+ return c;
+ }
+ return -1 * c;
+ }
+ if (item1.getChannelNumber() == null
+ && item2.getChannelNumber() == null) {
+ return 0;
+ }
+ if (item1.getChannelNumber() == null) {
+ return 1;
+ }
+ if (item2.getChannelNumber() == null) {
+ return -1;
+ }
+ return item1.getChannelNumber().compareTo(item2.getChannelNumber());
+ }
+ }
+
+
+ class TimeComparator implements Comparator<Event> {
+ boolean r = false;
+
+ TimeComparator(final boolean r) {
+ this.r = r;
+ }
+
+ @Override
+ public int compare(final Event item1, final Event item2) {
+
+ final int c = item1.getStart().compareTo(item2.getStart());
+ if (c == 0) {
+ return c;
+ }
+ if (r == false) {
+ return c;
+ }
+ return -1 * c;
+ }
+ }
+
+ class ChannelComparator implements Comparator<Event> {
+
+ @Override
+ public int compare(final Event item1, final Event item2) {
+
+ if (item1.getChannelNumber() == null
+ && item2.getChannelNumber() == null) {
+ return 0;
+ }
+ if (item1.getChannelNumber() == null) {
+ return 1;
+ }
+ if (item2.getChannelNumber() == null) {
+ return -1;
+ }
+ return item1.getChannelNumber().compareTo(item2.getChannelNumber());
+ }
+ }
+
+
+
+ public void clearCache() {
+ getCACHE().clear();
+ }
+
+ protected abstract List<T> getCACHE();
+
+ // @Override
+ // protected void connected() {
+ // super.connected();
+ // results.clear();
+ // }
}
diff --git a/vdrmanager/src/de/bjusystems/vdrmanager/gui/CertificateProblemDialog.java b/vdrmanager/src/de/bjusystems/vdrmanager/gui/CertificateProblemDialog.java
new file mode 100644
index 0000000..bf7034f
--- /dev/null
+++ b/vdrmanager/src/de/bjusystems/vdrmanager/gui/CertificateProblemDialog.java
@@ -0,0 +1,98 @@
+package de.bjusystems.vdrmanager.gui;
+
+import java.security.cert.X509Certificate;
+import java.util.concurrent.Semaphore;
+
+import android.app.Activity;
+import android.app.AlertDialog;
+import android.content.DialogInterface;
+import android.content.DialogInterface.OnClickListener;
+import de.bjusystems.vdrmanager.R;
+import de.bjusystems.vdrmanager.utils.svdrp.CertificateProblemListener;
+
+public class CertificateProblemDialog implements CertificateProblemListener {
+
+ /** Context */
+ private final Activity activity;
+ /** User wanted action */
+ CertificateProblemAction action;
+
+ /**
+ * Constructor
+ * @param activity Context
+ */
+ public CertificateProblemDialog(final Activity activity) {
+ this.activity = activity;
+ }
+
+ @Override
+ public CertificateProblemAction reportProblem(final X509Certificate[] chain, final String authType) {
+
+ // Semaphore to implement a modal dialog
+ final Semaphore semaphore = new Semaphore(0, true);
+
+ // certificate properties
+ final String host = chain[0].getSubjectDN().getName().split(",")[0].replace("CN=", "").trim();
+ final String creationDate = chain[0].getNotBefore().toLocaleString();
+ final String validUntil = chain[0].getNotAfter().toLocaleString();
+
+ // message
+ final CharSequence message = String.format(activity.getString(R.string.certificate_problem_message_text), host, creationDate, validUntil);
+
+ // create dialog builder
+ final AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(activity);
+ alertDialogBuilder.setTitle(R.string.certificate_problem_message_title);
+ alertDialogBuilder.setMessage(message);
+ alertDialogBuilder.setCancelable(false);
+
+ // buttons
+ alertDialogBuilder.setNegativeButton(R.string.certificate_not_accepted, new OnClickListener() {
+ @Override
+ public void onClick(final DialogInterface dialog, final int which) {
+ action = CertificateProblemAction.ABORT;
+ dialog.cancel();
+ semaphore.release();
+ }
+ });
+ alertDialogBuilder.setNeutralButton(R.string.certificate_accept_once, new OnClickListener() {
+ @Override
+ public void onClick(final DialogInterface dialog, final int which) {
+ action = CertificateProblemAction.ACCEPT_ONCE;
+ dialog.cancel();
+ semaphore.release();
+ }
+ });
+ alertDialogBuilder.setPositiveButton(R.string.certificate_accepted_forever, new OnClickListener() {
+ @Override
+ public void onClick(final DialogInterface dialog, final int which) {
+ action = CertificateProblemAction.ACCEPT_FOREVER;
+ dialog.cancel();
+ semaphore.release();
+ }
+ });
+
+ // show the dialog
+
+ activity.runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ final AlertDialog dialog = alertDialogBuilder.create();
+ dialog.show();
+ }
+ });
+
+
+ try {
+ semaphore.acquire();
+ } catch (final InterruptedException e) {
+ // NOP
+ }
+
+ return action;
+ }
+
+ @Override
+ public Activity getCurrentActivity() {
+ return activity;
+ }
+}
diff --git a/vdrmanager/src/de/bjusystems/vdrmanager/gui/ChannelListActivity.java b/vdrmanager/src/de/bjusystems/vdrmanager/gui/ChannelListActivity.java
index 990488d..e6ad0e0 100644
--- a/vdrmanager/src/de/bjusystems/vdrmanager/gui/ChannelListActivity.java
+++ b/vdrmanager/src/de/bjusystems/vdrmanager/gui/ChannelListActivity.java
@@ -42,566 +42,573 @@ import de.bjusystems.vdrmanager.utils.svdrp.SvdrpClient;
* @author bju
*/
public class ChannelListActivity extends
- BaseActivity<Channel, ExpandableListView> implements
- OnChildClickListener, OnGroupClickListener {
+BaseActivity<Channel, ExpandableListView> implements
+OnChildClickListener, OnGroupClickListener {
- private static final String TAG = ChannelListActivity.class.getName();
+ private static final String TAG = ChannelListActivity.class.getName();
- ChannelAdapter adapter;
+ ChannelAdapter adapter;
- Preferences prefs;
+ Preferences prefs;
- // private static final LinkedList<Channel> RECENT = new
- // LinkedList<Channel>();
+ // private static final LinkedList<Channel> RECENT = new
+ // LinkedList<Channel>();
- public static final int MENU_GROUP = 0;
- public static final int MENU_PROVIDER = 1;
- public static final int MENU_SOURCE = 2;
- public static final int MENU_NAME = 3;
+ public static final int MENU_GROUP = 0;
+ public static final int MENU_PROVIDER = 1;
+ public static final int MENU_SOURCE = 2;
+ public static final int MENU_NAME = 3;
- public static final boolean GROUP_NATURAL = false;
+ public static final boolean GROUP_NATURAL = false;
- public static final boolean GROUP_REVERSE = true;
+ public static final boolean GROUP_REVERSE = true;
- private int groupBy;
+ private int groupBy;
- private boolean groupByReverse;
+ private boolean groupByReverse;
- final static ArrayList<String> ALL_CHANNELS_GROUP = new ArrayList<String>(1);
+ final static ArrayList<String> ALL_CHANNELS_GROUP = new ArrayList<String>(1);
- @Override
- protected void onResume() {
- super.onResume();
- }
+ @Override
+ protected void onResume() {
+ super.onResume();
+ }
- @Override
- protected void onCreate(final Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
+ @Override
+ protected void onCreate(final Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
- // Attach view
- setContentView(getMainLayout());
- setTitle(getWindowTitle());
- initFlipper();
+ // Attach view
+ setContentView(getMainLayout());
+ setTitle(getWindowTitle());
+ initFlipper();
- groupBy = Preferences.get(this, P.CHANNELS_LAST_ORDER, MENU_GROUP);
- groupByReverse = Preferences.get(this, P.CHANNELS_LAST_ORDER_REVERSE,
- GROUP_NATURAL);
+ groupBy = Preferences.get(this, P.CHANNELS_LAST_ORDER, MENU_GROUP);
+ groupByReverse = Preferences.get(this, P.CHANNELS_LAST_ORDER_REVERSE,
+ GROUP_NATURAL);
- adapter = new ChannelAdapter(this);
+ adapter = new ChannelAdapter(this);
- listView = (ExpandableListView) findViewById(R.id.channel_list);
- listView.setOnChildClickListener(this);
- listView.setTextFilterEnabled(true);
- listView.setFastScrollEnabled(true);
- listView.setAdapter(adapter);
- // register context menu
- registerForContextMenu(listView);
- startChannelQuery();
+ listView = (ExpandableListView) findViewById(R.id.channel_list);
+ listView.setOnChildClickListener(this);
+ listView.setTextFilterEnabled(true);
+ listView.setFastScrollEnabled(true);
+ listView.setAdapter(adapter);
+ // register context menu
+ registerForContextMenu(listView);
+ startChannelQuery();
- }
+ }
- //
+ //
- @Override
- protected void onPause() {
- super.onPause();
- }
+ @Override
+ protected void onPause() {
+ super.onPause();
+ }
- private void startChannelQuery() {
- backupViewSelection();
- startChannelQuery(true);
- }
-
- private void startChannelQuery(boolean useCache) {
-
- if (checkInternetConnection() == false) {
- return;
- }
-
- ChannelClient channelClient = new ChannelClient();
-
- if (useCache == false) {
- ChannelClient.clearCache();
- }
-
- // create background task
- final SvdrpAsyncTask<Channel, SvdrpClient<Channel>> task = new SvdrpAsyncTask<Channel, SvdrpClient<Channel>>(
- channelClient);
-
- addListener(task);
- //task.addSvdrpExceptionListener(this);
- //task.addSvdrpResultListener(this);
- //task.addSvdrpListener(this);
- //task.addSvdrpFinishedListener(this);
-
- // start task
- task.run();
- }
-
- static RecentChannelsAdapter RECENT_ADAPTER = null;
-
- static class RecentChannelsAdapter extends ArrayAdapter<Channel> {
- private Activity context;
- int resId;
-
- public RecentChannelsAdapter(Activity context) {
- super(context, android.R.layout.simple_list_item_1);
- this.context = context;
- showChannelNumbers = Preferences.get().isShowChannelNumbers();
-
- if (Build.VERSION.SDK_INT < 11) {
- resId = android.R.layout.select_dialog_item;
- } else {
- resId = android.R.layout.simple_list_item_1;
- }
- }
-
- public boolean showChannelNumbers;
-
- public View getView(int position, View convertView, ViewGroup parent) {
- // recycle view?
- TextView text1;
- View view = convertView;
- if (view == null) {
- view = this.context.getLayoutInflater().inflate(resId, null);
- text1 = (TextView) view.findViewById(android.R.id.text1);
- view.setTag(text1);
- } else {
- text1 = (TextView) view.getTag();
- }
-
- Channel c = getItem(position);
- String text = showChannelNumbers ? text = c.toString() : c
- .getName();
- text1.setText(text);
- return view;
-
- }
- }
-
- private ArrayAdapter<Channel> getRecentAdapter() {
- if (RECENT_ADAPTER != null) {
- RECENT_ADAPTER.showChannelNumbers = Preferences.get()
- .isShowChannelNumbers();
- RECENT_ADAPTER.notifyDataSetChanged();
- return RECENT_ADAPTER;
- }
-
- RECENT_ADAPTER = new RecentChannelsAdapter(this);
- return RECENT_ADAPTER;
-
- }
-
- private void fillAdapter() {
- switch (groupBy) {
- case MENU_GROUP:
- ArrayList<String> cgs = ChannelClient.getChannelGroups();
- adapter.fill(cgs, ChannelClient.getGroupChannels(), groupBy,
- groupByReverse);
- if (cgs.size() == 1) {// one group or first no first group
- listView.expandGroup(0);
- } else if ((cgs.size() > 1 && TextUtils.isEmpty(cgs.get(0)))) {
- listView.expandGroup(0);
- }
- updateWindowTitle();
- break;
-
- case MENU_SOURCE:
- ArrayList<String> css = ChannelClient.getChannelSources();
- adapter.fill(css, ChannelClient.getSourceChannels(), groupBy,
- groupByReverse);
- if (css.size() == 1) {// one group or first no first group
- listView.expandGroup(0);
- } else if ((css.size() > 1 && TextUtils.isEmpty(css.get(0)))) {
- listView.expandGroup(0);
- }
- updateWindowTitle();
- break;
-
-
- case MENU_PROVIDER:
- ArrayList<String> gs = new ArrayList<String>(ChannelClient
- .getProviderChannels().keySet());
- adapter.fill(gs, ChannelClient.getProviderChannels(), groupBy,
- groupByReverse);
- if (gs.size() == 1) {
- listView.expandGroup(0);
- }
- updateWindowTitle();
- break;
- case MENU_NAME:
- if (ALL_CHANNELS_GROUP.isEmpty()) {
- ALL_CHANNELS_GROUP
- .add(getString(R.string.groupby_name_all_channels_group));
- }
- HashMap<String, ArrayList<Channel>> channels = new HashMap<String, ArrayList<Channel>>(
- 1);
- channels.put(getString(R.string.groupby_name_all_channels_group),
- ChannelClient.getChannels());
- adapter.fill(ALL_CHANNELS_GROUP, channels, groupBy, groupByReverse);
- listView.expandGroup(0);
- updateWindowTitle();
- }
- adapter.notifyDataSetChanged();
- }
-
- public boolean onPrepareOptionsMenu(com.actionbarsherlock.view.Menu menu) {
- return super.onPrepareOptionsMenu(menu);
- }
-
- @Override
- public final boolean onCreateOptionsMenu(
- final com.actionbarsherlock.view.Menu menu) {
- super.onCreateOptionsMenu(menu);
-
- final com.actionbarsherlock.view.MenuInflater inflater = getSupportMenuInflater();
- inflater.inflate(R.menu.channellist, menu);
-
- return true;
- }
-
- private int getAvailableGroupByEntries() {
- return R.array.channels_group_by;
- }
-
- AlertDialog groupByDialog = null;
-
- @Override
- public boolean onOptionsItemSelected(
- final com.actionbarsherlock.view.MenuItem item) {
-
- switch (item.getItemId()) {
- case R.id.channels_groupby:
- // 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) {
-
- final boolean reversed = which == groupBy ? true
- : false;
- groupBy = which;
- new VoidAsyncTask() {
-
- @Override
- protected Void doInBackground(
- Void... params) {
-
- if (reversed) {
- if (groupByReverse == true) {
- groupByReverse = false;
- } else {
- groupByReverse = true;
- }
- Preferences
- .set(ChannelListActivity.this,
- P.CHANNELS_LAST_ORDER_REVERSE,
- groupByReverse);
-
- } else {
- Preferences
- .set(ChannelListActivity.this,
- P.CHANNELS_LAST_ORDER,
- groupBy);
- }
- return null;
- }
- }.execute();
-
- fillAdapter();
- groupByDialog.dismiss();
- }
- }).create();
- }
-
- groupByDialog.show();
-
- return true;
- case R.id.channels_recent_channels:
-
- String order = Preferences.get(ChannelListActivity.this,
- "gui_recent_channels_order", "most");
-
- List<RecenteChannel> rcs = null;
-
- if (order.equals("most")) {
- rcs = DBAccess
- .get(ChannelListActivity.this)
- .getRecentChannelDAO()
- .loadByRecentUse(
- Preferences.get().getMaxRecentChannels());
- } else if (order.equals("last")) {
- rcs = DBAccess
- .get(ChannelListActivity.this)
- .getRecentChannelDAO()
- .loadByLastAccess(
- Preferences.get().getMaxRecentChannels());
- } else {
- return true;
- }
-
- if (rcs.isEmpty()) {
- say(R.string.recent_channels_no_history);
- return true;
- }
-
- if (Preferences.get().getMaxRecentChannels() <= 0) {
- say(R.string.recent_channels_no_history);
- return true;
- }
-
- final ArrayAdapter<Channel> recentAdapter = getRecentAdapter();
-
- recentAdapter.clear();
- for (Channel c : DBAccess.get(ChannelListActivity.this)
- .getRecentChannelDAO()
- .getRecentChannels(ChannelClient.getIdChannels(), rcs)) {
- recentAdapter.add(c);
- }
-
- new AlertDialog.Builder(this)
- .setTitle(R.string.recent_channels)
- .setAdapter(getRecentAdapter(),
- new DialogInterface.OnClickListener() {
-
- public void onClick(DialogInterface dialog,
- int which) {
- Channel c = recentAdapter.getItem(which);
- startChannelEPG(c);
- }
- })//
- .create().show();
- return true;
- default:
- return super.onOptionsItemSelected(item);
- }
- }
-
-
- @Override
- public void onCreateContextMenu(final ContextMenu menu, final View v,
- final ContextMenuInfo menuInfo) {
- ExpandableListView.ExpandableListContextMenuInfo info = (ExpandableListView.ExpandableListContextMenuInfo) menuInfo;
- int type = ExpandableListView
- .getPackedPositionType(info.packedPosition);
- int group = ExpandableListView
- .getPackedPositionGroup(info.packedPosition);
- int child = ExpandableListView
- .getPackedPositionChild(info.packedPosition);
- // Only create a context menu for child items
- if (type == ExpandableListView.PACKED_POSITION_TYPE_CHILD) {
- // Array created earlier when we built the expandable list
- Channel item = (Channel) adapter.getChild(group, child);
- // if (v.getId() == R.id.channel_list) {
-
- final MenuInflater inflater = getMenuInflater();
- menu.setHeaderTitle(item.getName());
- inflater.inflate(R.menu.channel_list_item_menu, menu);
-
-
- } else if (type == ExpandableListView.PACKED_POSITION_TYPE_GROUP) {
- /*
- * http://projects.vdr-developer.org/issues/722 String grp =
- * adapter.getGroup(group); final MenuInflater infl =
- * getMenuInflater(); menu.setHeaderTitle(grp);
- * infl.inflate(R.menu.channel_list_group_menu, menu);
- */
- }
- }
-
- @Override
- public boolean onContextItemSelected(MenuItem item) {
-
- ExpandableListContextMenuInfo info = (ExpandableListContextMenuInfo) item
- .getMenuInfo();
-
- // String title = ((TextView) info.targetView).getText().toString();
-
- int type = ExpandableListView
- .getPackedPositionType(info.packedPosition);
-
- Channel channel = null;
- if (type == ExpandableListView.PACKED_POSITION_TYPE_CHILD) {
- int groupPos = ExpandableListView
- .getPackedPositionGroup(info.packedPosition);
- int childPos = ExpandableListView
- .getPackedPositionChild(info.packedPosition);
- channel = (Channel) adapter.getChild(groupPos, childPos);
- switch (item.getItemId()) {
- //case R.id.channel_item_menu_epg:
- //startChannelEPG(channel);
- //break;
- case R.id.channel_item_menu_stream:
- // show live stream
- Utils.stream(this, channel);
- break;
-
- //case R.id.channel_item_menu_hide:
- // TODO http://projects.vdr-developer.org/issues/722
- //break;
- //case R.id.channel_item_menu_hide_permanent:
- // TODO http://projects.vdr-developer.org/issues/722
- //break;
-
- case R.id.channel_item_menu_switch:
- Utils.switchTo(this, channel);
- break;
- }
-
- return true;
- } else if (type == ExpandableListView.PACKED_POSITION_TYPE_GROUP) {
- int groupPos = ExpandableListView
- .getPackedPositionGroup(info.packedPosition);
-
- return true;
- }
-
- return false;
-
- }
-
- @Override
- public boolean onSearchRequested() {
- InputMethodManager inputMgr = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
- inputMgr.toggleSoftInput(0, 0);
- return true;
- }
-
- public boolean onGroupClick(ExpandableListView arg0, View arg1, int arg2,
- long arg3) {
- return true;
- }
-
- private void startChannelEPG(final Channel channel) {
- new VoidAsyncTask() {
-
- @Override
- protected Void doInBackground(Void... arg0) {
- int max = Preferences.get().getMaxRecentChannels();
- if (max <= 0) {
- return null;
- }
-
- DBAccess.get(ChannelListActivity.this).getRecentChannelDAO()
- .hit(channel.getId());
-
- return (Void) null;
- }
- }.execute((Void) null);
- // for(int i = 0; i < recent)
- // find and remember item
- // final Channel channel = adapter.getItem(position);
- // final VdrManagerApp app = (VdrManagerApp) getApplication();
- // app.setCurrentChannel(channel);
-
- // show details
- final Intent intent = new Intent();
- getApp().setCurrentChannel(channel);
- // intent.putExtra(Intents.CURRENT_CHANNEL, channel);
- intent.setClass(this, EventEpgListActivity.class);
- startActivity(intent);
- }
-
- public boolean onChildClick(ExpandableListView parent, View v,
- int groupPosition, int childPosition, long id) {
- Channel channel = (Channel) adapter.getChild(groupPosition,
- childPosition);
- startChannelEPG(channel);
- return false;
- }
-
- @Override
- protected void refresh() {
- backupViewSelection();
- startChannelQuery(false);
- }
-
- @Override
- protected void retry() {
- refresh();
- }
-
- @Override
- protected int getMainLayout() {
- return R.layout.channel_list;
- }
-
- private String resolveWindowTitle() {
- StringBuilder sb = new StringBuilder();
- switch (groupBy) {
- case MENU_NAME:
- sb.append(getString(R.string.action_menu_channels))
- .append(" > ")
- .append(getString(R.string.groupby_name_all_channels_group));
- break;
- case MENU_PROVIDER:
- sb.append(getString(R.string.action_menu_channels))
- .append(" > ")
- .append(getString(R.string.groupby_window_title_templte,
- getString(R.string.groupby_provider)));
- break;
- case MENU_GROUP:
- sb.append(getString(R.string.action_menu_channels))
- .append(" > ")
- .append(getString(R.string.groupby_window_title_templte,
- getString(R.string.groupby_group)));
- break;
-
- case MENU_SOURCE: {
- sb.append(getString(R.string.action_menu_channels))
- .append(" > ")
- .append(getString(R.string.groupby_window_title_templte,
- getString(R.string.groupby_source)));
- break;
- }
- }
-
- return sb.toString();
- }
-
- private void updateWindowTitle() {
- setTitle(getString(R.string.channels_window_title_count,
- resolveWindowTitle(), adapter.groups.size(), ChannelClient
- .getChannels().size()));
- }
-
- @Override
- protected synchronized boolean finishedSuccess(List<Channel> results) {
- fillAdapter();
- restoreViewSelection();
- updateWindowTitle();
- return ChannelClient.getChannels().isEmpty() == false;
- }
-
- protected void cacheHit() {
- fillAdapter();
- restoreViewSelection();
- }
-
- @Override
- protected String getWindowTitle() {
- return resolveWindowTitle();
- }
-
- protected boolean displayingResults() {
- return ChannelClient.getChannels().isEmpty() == false;
- }
-
- @Override
- protected int getProgressTextId() {
- return R.string.progress_channels_loading;
- }
-
-
- @Override
- protected int getListNavigationIndex() {
- return LIST_NAVIGATION_CHANNELS;
- }
+ private void startChannelQuery() {
+ backupViewSelection();
+ startChannelQuery(true);
+ }
+
+ private void startChannelQuery(final boolean useCache) {
+
+ if (checkInternetConnection() == false) {
+ return;
+ }
+
+ final ChannelClient channelClient = new ChannelClient(getCertificateProblemDialog());
+
+ if (useCache == false) {
+ ChannelClient.clearCache();
+ }
+
+ // create background task
+ final SvdrpAsyncTask<Channel, SvdrpClient<Channel>> task = new SvdrpAsyncTask<Channel, SvdrpClient<Channel>>(
+ channelClient);
+
+ addListener(task);
+ //task.addSvdrpExceptionListener(this);
+ //task.addSvdrpResultListener(this);
+ //task.addSvdrpListener(this);
+ //task.addSvdrpFinishedListener(this);
+
+ // start task
+ task.run();
+ }
+
+ static RecentChannelsAdapter RECENT_ADAPTER = null;
+
+ static class RecentChannelsAdapter extends ArrayAdapter<Channel> {
+ private final Activity context;
+ int resId;
+
+ public RecentChannelsAdapter(final Activity context) {
+ super(context, android.R.layout.simple_list_item_1);
+ this.context = context;
+ showChannelNumbers = Preferences.get().isShowChannelNumbers();
+
+ if (Build.VERSION.SDK_INT < 11) {
+ resId = android.R.layout.select_dialog_item;
+ } else {
+ resId = android.R.layout.simple_list_item_1;
+ }
+ }
+
+ public boolean showChannelNumbers;
+
+ @Override
+ public View getView(final int position, final View convertView, final ViewGroup parent) {
+ // recycle view?
+ TextView text1;
+ View view = convertView;
+ if (view == null) {
+ view = this.context.getLayoutInflater().inflate(resId, null);
+ text1 = (TextView) view.findViewById(android.R.id.text1);
+ view.setTag(text1);
+ } else {
+ text1 = (TextView) view.getTag();
+ }
+
+ final Channel c = getItem(position);
+ String text = showChannelNumbers ? text = c.toString() : c
+ .getName();
+ text1.setText(text);
+ return view;
+
+ }
+ }
+
+ private ArrayAdapter<Channel> getRecentAdapter() {
+ if (RECENT_ADAPTER != null) {
+ RECENT_ADAPTER.showChannelNumbers = Preferences.get()
+ .isShowChannelNumbers();
+ RECENT_ADAPTER.notifyDataSetChanged();
+ return RECENT_ADAPTER;
+ }
+
+ RECENT_ADAPTER = new RecentChannelsAdapter(this);
+ return RECENT_ADAPTER;
+
+ }
+
+ private void fillAdapter() {
+ switch (groupBy) {
+ case MENU_GROUP:
+ final ArrayList<String> cgs = ChannelClient.getChannelGroups();
+ adapter.fill(cgs, ChannelClient.getGroupChannels(), groupBy,
+ groupByReverse);
+ if (cgs.size() == 1) {// one group or first no first group
+ listView.expandGroup(0);
+ } else if ((cgs.size() > 1 && TextUtils.isEmpty(cgs.get(0)))) {
+ listView.expandGroup(0);
+ }
+ updateWindowTitle();
+ break;
+
+ case MENU_SOURCE:
+ final ArrayList<String> css = ChannelClient.getChannelSources();
+ adapter.fill(css, ChannelClient.getSourceChannels(), groupBy,
+ groupByReverse);
+ if (css.size() == 1) {// one group or first no first group
+ listView.expandGroup(0);
+ } else if ((css.size() > 1 && TextUtils.isEmpty(css.get(0)))) {
+ listView.expandGroup(0);
+ }
+ updateWindowTitle();
+ break;
+
+
+ case MENU_PROVIDER:
+ final ArrayList<String> gs = new ArrayList<String>(ChannelClient
+ .getProviderChannels().keySet());
+ adapter.fill(gs, ChannelClient.getProviderChannels(), groupBy,
+ groupByReverse);
+ if (gs.size() == 1) {
+ listView.expandGroup(0);
+ }
+ updateWindowTitle();
+ break;
+ case MENU_NAME:
+ if (ALL_CHANNELS_GROUP.isEmpty()) {
+ ALL_CHANNELS_GROUP
+ .add(getString(R.string.groupby_name_all_channels_group));
+ }
+ final HashMap<String, ArrayList<Channel>> channels = new HashMap<String, ArrayList<Channel>>(
+ 1);
+ channels.put(getString(R.string.groupby_name_all_channels_group),
+ ChannelClient.getChannels());
+ adapter.fill(ALL_CHANNELS_GROUP, channels, groupBy, groupByReverse);
+ listView.expandGroup(0);
+ updateWindowTitle();
+ }
+ adapter.notifyDataSetChanged();
+ }
+
+ public boolean onPrepareOptionsMenu(final com.actionbarsherlock.view.Menu menu) {
+ return super.onPrepareOptionsMenu(menu);
+ }
+
+ @Override
+ public final boolean onCreateOptionsMenu(
+ final com.actionbarsherlock.view.Menu menu) {
+ super.onCreateOptionsMenu(menu);
+
+ final com.actionbarsherlock.view.MenuInflater inflater = getSupportMenuInflater();
+ inflater.inflate(R.menu.channellist, menu);
+
+ return true;
+ }
+
+ private int getAvailableGroupByEntries() {
+ return R.array.channels_group_by;
+ }
+
+ AlertDialog groupByDialog = null;
+
+ @Override
+ public boolean onOptionsItemSelected(
+ final com.actionbarsherlock.view.MenuItem item) {
+
+ switch (item.getItemId()) {
+ case R.id.channels_groupby:
+ // 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() {
+ @Override
+ public void onClick(final DialogInterface dialog,
+ final int which) {
+
+ final boolean reversed = which == groupBy ? true
+ : false;
+ groupBy = which;
+ new VoidAsyncTask() {
+
+ @Override
+ protected Void doInBackground(
+ final Void... params) {
+
+ if (reversed) {
+ if (groupByReverse == true) {
+ groupByReverse = false;
+ } else {
+ groupByReverse = true;
+ }
+ Preferences
+ .set(ChannelListActivity.this,
+ P.CHANNELS_LAST_ORDER_REVERSE,
+ groupByReverse);
+
+ } else {
+ Preferences
+ .set(ChannelListActivity.this,
+ P.CHANNELS_LAST_ORDER,
+ groupBy);
+ }
+ return null;
+ }
+ }.execute();
+
+ fillAdapter();
+ groupByDialog.dismiss();
+ }
+ }).create();
+ }
+
+ groupByDialog.show();
+
+ return true;
+ case R.id.channels_recent_channels:
+
+ final String order = Preferences.get(ChannelListActivity.this,
+ "gui_recent_channels_order", "most");
+
+ List<RecenteChannel> rcs = null;
+
+ if (order.equals("most")) {
+ rcs = DBAccess
+ .get(ChannelListActivity.this)
+ .getRecentChannelDAO()
+ .loadByRecentUse(
+ Preferences.get().getMaxRecentChannels());
+ } else if (order.equals("last")) {
+ rcs = DBAccess
+ .get(ChannelListActivity.this)
+ .getRecentChannelDAO()
+ .loadByLastAccess(
+ Preferences.get().getMaxRecentChannels());
+ } else {
+ return true;
+ }
+
+ if (rcs.isEmpty()) {
+ say(R.string.recent_channels_no_history);
+ return true;
+ }
+
+ if (Preferences.get().getMaxRecentChannels() <= 0) {
+ say(R.string.recent_channels_no_history);
+ return true;
+ }
+
+ final ArrayAdapter<Channel> recentAdapter = getRecentAdapter();
+
+ recentAdapter.clear();
+ for (final Channel c : DBAccess.get(ChannelListActivity.this)
+ .getRecentChannelDAO()
+ .getRecentChannels(ChannelClient.getIdChannels(), rcs)) {
+ recentAdapter.add(c);
+ }
+
+ new AlertDialog.Builder(this)
+ .setTitle(R.string.recent_channels)
+ .setAdapter(getRecentAdapter(),
+ new DialogInterface.OnClickListener() {
+
+ @Override
+ public void onClick(final DialogInterface dialog,
+ final int which) {
+ final Channel c = recentAdapter.getItem(which);
+ startChannelEPG(c);
+ }
+ })//
+ .create().show();
+ return true;
+ default:
+ return super.onOptionsItemSelected(item);
+ }
+ }
+
+
+ @Override
+ public void onCreateContextMenu(final ContextMenu menu, final View v,
+ final ContextMenuInfo menuInfo) {
+ final ExpandableListView.ExpandableListContextMenuInfo info = (ExpandableListView.ExpandableListContextMenuInfo) menuInfo;
+ final int type = ExpandableListView
+ .getPackedPositionType(info.packedPosition);
+ final int group = ExpandableListView
+ .getPackedPositionGroup(info.packedPosition);
+ final int child = ExpandableListView
+ .getPackedPositionChild(info.packedPosition);
+ // Only create a context menu for child items
+ if (type == ExpandableListView.PACKED_POSITION_TYPE_CHILD) {
+ // Array created earlier when we built the expandable list
+ final Channel item = (Channel) adapter.getChild(group, child);
+ // if (v.getId() == R.id.channel_list) {
+
+ final MenuInflater inflater = getMenuInflater();
+ menu.setHeaderTitle(item.getName());
+ inflater.inflate(R.menu.channel_list_item_menu, menu);
+
+
+ } else if (type == ExpandableListView.PACKED_POSITION_TYPE_GROUP) {
+ /*
+ * http://projects.vdr-developer.org/issues/722 String grp =
+ * adapter.getGroup(group); final MenuInflater infl =
+ * getMenuInflater(); menu.setHeaderTitle(grp);
+ * infl.inflate(R.menu.channel_list_group_menu, menu);
+ */
+ }
+ }
+
+ @Override
+ public boolean onContextItemSelected(final MenuItem item) {
+
+ final ExpandableListContextMenuInfo info = (ExpandableListContextMenuInfo) item
+ .getMenuInfo();
+
+ // String title = ((TextView) info.targetView).getText().toString();
+
+ final int type = ExpandableListView
+ .getPackedPositionType(info.packedPosition);
+
+ Channel channel = null;
+ if (type == ExpandableListView.PACKED_POSITION_TYPE_CHILD) {
+ final int groupPos = ExpandableListView
+ .getPackedPositionGroup(info.packedPosition);
+ final int childPos = ExpandableListView
+ .getPackedPositionChild(info.packedPosition);
+ channel = (Channel) adapter.getChild(groupPos, childPos);
+ switch (item.getItemId()) {
+ //case R.id.channel_item_menu_epg:
+ //startChannelEPG(channel);
+ //break;
+ case R.id.channel_item_menu_stream:
+ // show live stream
+ Utils.stream(this, channel);
+ break;
+
+ //case R.id.channel_item_menu_hide:
+ // TODO http://projects.vdr-developer.org/issues/722
+ //break;
+ //case R.id.channel_item_menu_hide_permanent:
+ // TODO http://projects.vdr-developer.org/issues/722
+ //break;
+
+ case R.id.channel_item_menu_switch:
+ Utils.switchTo(this, channel);
+ break;
+ }
+
+ return true;
+ } else if (type == ExpandableListView.PACKED_POSITION_TYPE_GROUP) {
+ final int groupPos = ExpandableListView
+ .getPackedPositionGroup(info.packedPosition);
+
+ return true;
+ }
+
+ return false;
+
+ }
+
+ @Override
+ public boolean onSearchRequested() {
+ final InputMethodManager inputMgr = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
+ inputMgr.toggleSoftInput(0, 0);
+ return true;
+ }
+
+ @Override
+ public boolean onGroupClick(final ExpandableListView arg0, final View arg1, final int arg2,
+ final long arg3) {
+ return true;
+ }
+
+ private void startChannelEPG(final Channel channel) {
+ new VoidAsyncTask() {
+
+ @Override
+ protected Void doInBackground(final Void... arg0) {
+ final int max = Preferences.get().getMaxRecentChannels();
+ if (max <= 0) {
+ return null;
+ }
+
+ DBAccess.get(ChannelListActivity.this).getRecentChannelDAO()
+ .hit(channel.getId());
+
+ return null;
+ }
+ }.execute((Void) null);
+ // for(int i = 0; i < recent)
+ // find and remember item
+ // final Channel channel = adapter.getItem(position);
+ // final VdrManagerApp app = (VdrManagerApp) getApplication();
+ // app.setCurrentChannel(channel);
+
+ // show details
+ final Intent intent = new Intent();
+ getApp().setCurrentChannel(channel);
+ // intent.putExtra(Intents.CURRENT_CHANNEL, channel);
+ intent.setClass(this, EventEpgListActivity.class);
+ startActivity(intent);
+ }
+
+ @Override
+ public boolean onChildClick(final ExpandableListView parent, final View v,
+ final int groupPosition, final int childPosition, final long id) {
+ final Channel channel = (Channel) adapter.getChild(groupPosition,
+ childPosition);
+ startChannelEPG(channel);
+ return false;
+ }
+
+ @Override
+ protected void refresh() {
+ backupViewSelection();
+ startChannelQuery(false);
+ }
+
+ @Override
+ protected void retry() {
+ refresh();
+ }
+
+ @Override
+ protected int getMainLayout() {
+ return R.layout.channel_list;
+ }
+
+ private String resolveWindowTitle() {
+ final StringBuilder sb = new StringBuilder();
+ switch (groupBy) {
+ case MENU_NAME:
+ sb.append(getString(R.string.action_menu_channels))
+ .append(" > ")
+ .append(getString(R.string.groupby_name_all_channels_group));
+ break;
+ case MENU_PROVIDER:
+ sb.append(getString(R.string.action_menu_channels))
+ .append(" > ")
+ .append(getString(R.string.groupby_window_title_templte,
+ getString(R.string.groupby_provider)));
+ break;
+ case MENU_GROUP:
+ sb.append(getString(R.string.action_menu_channels))
+ .append(" > ")
+ .append(getString(R.string.groupby_window_title_templte,
+ getString(R.string.groupby_group)));
+ break;
+
+ case MENU_SOURCE: {
+ sb.append(getString(R.string.action_menu_channels))
+ .append(" > ")
+ .append(getString(R.string.groupby_window_title_templte,
+ getString(R.string.groupby_source)));
+ break;
+ }
+ }
+
+ return sb.toString();
+ }
+
+ private void updateWindowTitle() {
+ setTitle(getString(R.string.channels_window_title_count,
+ resolveWindowTitle(), adapter.groups.size(), ChannelClient
+ .getChannels().size()));
+ }
+
+ @Override
+ protected synchronized boolean finishedSuccess(final List<Channel> results) {
+ fillAdapter();
+ restoreViewSelection();
+ updateWindowTitle();
+ return ChannelClient.getChannels().isEmpty() == false;
+ }
+
+ @Override
+ protected void cacheHit() {
+ fillAdapter();
+ restoreViewSelection();
+ }
+
+ @Override
+ protected String getWindowTitle() {
+ return resolveWindowTitle();
+ }
+
+ @Override
+ protected boolean displayingResults() {
+ return ChannelClient.getChannels().isEmpty() == false;
+ }
+
+ @Override
+ protected int getProgressTextId() {
+ return R.string.progress_channels_loading;
+ }
+
+
+ @Override
+ protected int getListNavigationIndex() {
+ return LIST_NAVIGATION_CHANNELS;
+ }
} \ No newline at end of file
diff --git a/vdrmanager/src/de/bjusystems/vdrmanager/gui/EpgSearchListActivity.java b/vdrmanager/src/de/bjusystems/vdrmanager/gui/EpgSearchListActivity.java
index 86df035..0185390 100644
--- a/vdrmanager/src/de/bjusystems/vdrmanager/gui/EpgSearchListActivity.java
+++ b/vdrmanager/src/de/bjusystems/vdrmanager/gui/EpgSearchListActivity.java
@@ -37,244 +37,248 @@ import de.bjusystems.vdrmanager.utils.svdrp.SvdrpClient;
* @author bju
*/
public class EpgSearchListActivity extends BaseTimerEditActivity<Epg> implements
- OnItemClickListener {
-
- protected static ArrayList<Epg> CACHE = new ArrayList<Epg>();
-
- protected List<Epg> getCACHE() {
- return CACHE;
- }
-
- private void initSearch(Intent intent) {
- if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
- String query = intent.getStringExtra(SearchManager.QUERY);
- if (TextUtils.isEmpty(query) == false) {
- highlight = query.trim();
- SearchRecentSuggestions suggestions = new SearchRecentSuggestions(
- this, EPGSearchSuggestionsProvider.AUTHORITY,
- EPGSearchSuggestionsProvider.MODE);
- suggestions.saveRecentQuery(query, null);
- }
- }
- }
-
- @Override
- protected void onNewIntent(Intent intent) {
- initSearch(intent);
- startSearch();
- }
-
- private void startSearch() {
- startEpgQuery();
- }
-
- protected String getViewID(){
- return this.getClass().getSimpleName();
- }
-
-
- @Override
- protected void onCreate(final Bundle savedInstanceState) {
- Preferences.setLocale(this);
- // Preferences.init(this);
-
- super.onCreate(savedInstanceState);
-
- sortBy = Preferences.get(this, getViewID() + "_"
- + P.EPG_LAST_SORT, MENU_GROUP_DEFAULT);
-
-
- Intent intent = getIntent();
- initSearch(intent);
- adapter = new TimeEventAdapter(this);
-
- // Create adapter for EPG list
- adapter.setHideDescription(false);
- listView = (ListView) findViewById(R.id.whatson_list);
- listView.setAdapter(adapter);
- listView.setTextFilterEnabled(true);
- registerForContextMenu(listView);
- // register EPG item click
- listView.setOnItemClickListener(this);
- startSearch();
- }
-
- public void onNothingSelected(final AdapterView<?> arg0) {
- // startTimeEpgQuery(((EpgTimeSpinnerValue)timeSpinner.getAdapter().getItem(0)).getValue());
- }
-
- //
-
- private void startEpgQuery() {
-
- if (checkInternetConnection() == false) {
- return;
- }
-
- EpgSearchParams sp = new EpgSearchParams();
- sp.setTitle(highlight);
- setTitle(getWindowTitle());
- EpgClient 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
- addListener(task);
-
- // start task
- task.run();
- }
-
- protected void sort() {
- /* */
- switch (sortBy) {
- case MENU_GROUP_DEFAULT: {
- //Collections.sort(CACHE, getTimeComparator(false));
- break;
- }
- case MENU_GROUP_ALPHABET: {
- Collections.sort(CACHE, new TitleComparator());
- break;
- }
- //case MENU_GROUP_CHANNEL: {
- //sortItemsByChannel(results);
- //}
- }
- }
-
-
- @Override
- protected int getBaseMenu() {
- return R.menu.refresh_menu;
- }
-
- @Override
- protected synchronized void fillAdapter() {
-
- adapter.highlight = this.highlight;
-
- adapter.clear();
-
- if(CACHE.isEmpty()){
- return;
- }
-
- Calendar cal = Calendar.getInstance();
- int day = -1;
- for (Event e : CACHE) {
- 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((Epg) e));
- }
- adapter.notifyDataSetChanged();
- }
-
-
- @Override
- protected int getAvailableSortByEntries() {
- return R.array.epg_sort_by_time_alpha;
- }
-
-
- /*
- * (non-Javadoc) TODO this method also should be used in startEpgQuery on
- * cache hit
- *
- * @see de.bjusystems.vdrmanager.gui.BaseEpgListActivity#finishedSuccess()
- */
- @Override
- protected boolean finishedSuccessImpl(List<Epg> results) {
-
- clearCache();
- for(Epg e : results){
- CACHE.add(e);
- }
- pushResultCountToTitle();
- fillAdapter();
- listView.setSelectionAfterHeaderView();
- return adapter.getCount() > 0;
- }
-
- protected void prepareDetailsViewData(final EventListItem item) {
- final VdrManagerApp app = (VdrManagerApp) getApplication();
- app.setCurrentEvent(item.getEvent());
- app.setCurrentEpgList(CACHE);
- }
-
- @Override
- protected int getMainLayout() {
- return R.layout.search_epg_list;
- }
-
- @Override
- protected void refresh() {
- startEpgQuery();
- }
-
- @Override
- protected void retry() {
- startEpgQuery();
- }
-
- public boolean onCreateOptionsMenu(final com.actionbarsherlock.view.Menu menu) {
- // MenuItem item;
- // item = menu.add(MENU_GROUP_NEW_TIMER, MENU_NEW_TIMER, 0,
- // R.string.new_timer);
- // item.setIcon(android.R.drawable.ic_menu_add);;
- // /item.setAlphabeticShortcut('r');
-
- final com.actionbarsherlock.view.MenuInflater inflater = getSupportMenuInflater();
- inflater.inflate(R.menu.epg_search_menu, menu);
- return super.onCreateOptionsMenu(menu);
- }
-
- @Override
- public boolean onOptionsItemSelected(MenuItem item) {
- if(item.getItemId() == R.id.epg_search){
- startSearchManager();
- return true;
- }
- return super.onOptionsItemSelected(item);
- }
-
- @Override
- protected String getWindowTitle() {
- if (TextUtils.isEmpty(highlight)) {
- return getString(R.string.epg_by_search);
- }
-
- return getString(R.string.epg_by_search_param, highlight);
- }
-
- //@Override
- //public boolean onSearchRequested() {
- //startSearchManager();
- //return true;
- //}
-
- @Override
- protected int getListNavigationIndex() {
- return -1;
- }
-
- @Override
- protected boolean hasListNavigation() {
- return false;
- }
-
- @Override
- protected void timerModified(Timer timer) {
- clearCache();
- super.timerModified(timer);
- }
+OnItemClickListener {
+
+ protected static ArrayList<Epg> CACHE = new ArrayList<Epg>();
+
+ @Override
+ protected List<Epg> getCACHE() {
+ return CACHE;
+ }
+
+ private void initSearch(final Intent intent) {
+ if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
+ final String query = intent.getStringExtra(SearchManager.QUERY);
+ if (TextUtils.isEmpty(query) == false) {
+ highlight = query.trim();
+ final SearchRecentSuggestions suggestions = new SearchRecentSuggestions(
+ this, EPGSearchSuggestionsProvider.AUTHORITY,
+ EPGSearchSuggestionsProvider.MODE);
+ suggestions.saveRecentQuery(query, null);
+ }
+ }
+ }
+
+ @Override
+ protected void onNewIntent(final Intent intent) {
+ initSearch(intent);
+ startSearch();
+ }
+
+ private void startSearch() {
+ startEpgQuery();
+ }
+
+ @Override
+ protected String getViewID(){
+ return this.getClass().getSimpleName();
+ }
+
+
+ @Override
+ protected void onCreate(final Bundle savedInstanceState) {
+ Preferences.setLocale(this);
+ // Preferences.init(this);
+
+ super.onCreate(savedInstanceState);
+
+ sortBy = Preferences.get(this, getViewID() + "_"
+ + P.EPG_LAST_SORT, MENU_GROUP_DEFAULT);
+
+
+ final Intent intent = getIntent();
+ initSearch(intent);
+ adapter = new TimeEventAdapter(this);
+
+ // Create adapter for EPG list
+ adapter.setHideDescription(false);
+ listView = (ListView) findViewById(R.id.whatson_list);
+ listView.setAdapter(adapter);
+ listView.setTextFilterEnabled(true);
+ registerForContextMenu(listView);
+ // register EPG item click
+ listView.setOnItemClickListener(this);
+ startSearch();
+ }
+
+ public void onNothingSelected(final AdapterView<?> arg0) {
+ // startTimeEpgQuery(((EpgTimeSpinnerValue)timeSpinner.getAdapter().getItem(0)).getValue());
+ }
+
+ //
+
+ private void startEpgQuery() {
+
+ if (checkInternetConnection() == false) {
+ return;
+ }
+
+ final EpgSearchParams sp = new EpgSearchParams();
+ sp.setTitle(highlight);
+ setTitle(getWindowTitle());
+ final EpgClient epgClient = new EpgClient(sp, getCertificateProblemDialog());
+ // remove old listeners
+ // epgClient.clearSvdrpListener();
+
+ // create background task
+ final SvdrpAsyncTask<Epg, SvdrpClient<Epg>> task = new SvdrpAsyncTask<Epg, SvdrpClient<Epg>>(
+ epgClient);
+
+ // create progress
+ addListener(task);
+
+ // start task
+ task.run();
+ }
+
+ protected void sort() {
+ /* */
+ switch (sortBy) {
+ case MENU_GROUP_DEFAULT: {
+ //Collections.sort(CACHE, getTimeComparator(false));
+ break;
+ }
+ case MENU_GROUP_ALPHABET: {
+ Collections.sort(CACHE, new TitleComparator());
+ break;
+ }
+ //case MENU_GROUP_CHANNEL: {
+ //sortItemsByChannel(results);
+ //}
+ }
+ }
+
+
+ @Override
+ protected int getBaseMenu() {
+ return R.menu.refresh_menu;
+ }
+
+ @Override
+ protected synchronized void fillAdapter() {
+
+ adapter.highlight = this.highlight;
+
+ adapter.clear();
+
+ if(CACHE.isEmpty()){
+ return;
+ }
+
+ final Calendar cal = Calendar.getInstance();
+ int day = -1;
+ for (final Event e : CACHE) {
+ cal.setTime(e.getStart());
+ final 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));
+ }
+ adapter.notifyDataSetChanged();
+ }
+
+
+ @Override
+ protected int getAvailableSortByEntries() {
+ return R.array.epg_sort_by_time_alpha;
+ }
+
+
+ /*
+ * (non-Javadoc) TODO this method also should be used in startEpgQuery on
+ * cache hit
+ *
+ * @see de.bjusystems.vdrmanager.gui.BaseEpgListActivity#finishedSuccess()
+ */
+ @Override
+ protected boolean finishedSuccessImpl(final List<Epg> results) {
+
+ clearCache();
+ for(final Epg e : results){
+ CACHE.add(e);
+ }
+ pushResultCountToTitle();
+ fillAdapter();
+ listView.setSelectionAfterHeaderView();
+ return adapter.getCount() > 0;
+ }
+
+ @Override
+ protected void prepareDetailsViewData(final EventListItem item) {
+ final VdrManagerApp app = (VdrManagerApp) getApplication();
+ app.setCurrentEvent(item.getEvent());
+ app.setCurrentEpgList(CACHE);
+ }
+
+ @Override
+ protected int getMainLayout() {
+ return R.layout.search_epg_list;
+ }
+
+ @Override
+ protected void refresh() {
+ startEpgQuery();
+ }
+
+ @Override
+ protected void retry() {
+ startEpgQuery();
+ }
+
+ @Override
+ public boolean onCreateOptionsMenu(final com.actionbarsherlock.view.Menu menu) {
+ // MenuItem item;
+ // item = menu.add(MENU_GROUP_NEW_TIMER, MENU_NEW_TIMER, 0,
+ // R.string.new_timer);
+ // item.setIcon(android.R.drawable.ic_menu_add);;
+ // /item.setAlphabeticShortcut('r');
+
+ final com.actionbarsherlock.view.MenuInflater inflater = getSupportMenuInflater();
+ inflater.inflate(R.menu.epg_search_menu, menu);
+ return super.onCreateOptionsMenu(menu);
+ }
+
+ @Override
+ public boolean onOptionsItemSelected(final MenuItem item) {
+ if(item.getItemId() == R.id.epg_search){
+ startSearchManager();
+ return true;
+ }
+ return super.onOptionsItemSelected(item);
+ }
+
+ @Override
+ protected String getWindowTitle() {
+ if (TextUtils.isEmpty(highlight)) {
+ return getString(R.string.epg_by_search);
+ }
+
+ return getString(R.string.epg_by_search_param, highlight);
+ }
+
+ //@Override
+ //public boolean onSearchRequested() {
+ //startSearchManager();
+ //return true;
+ //}
+
+ @Override
+ protected int getListNavigationIndex() {
+ return -1;
+ }
+
+ @Override
+ protected boolean hasListNavigation() {
+ return false;
+ }
+
+ @Override
+ protected void timerModified(final Timer timer) {
+ clearCache();
+ super.timerModified(timer);
+ }
}
diff --git a/vdrmanager/src/de/bjusystems/vdrmanager/gui/EventEpgListActivity.java b/vdrmanager/src/de/bjusystems/vdrmanager/gui/EventEpgListActivity.java
index 689fb34..bb0125a 100644
--- a/vdrmanager/src/de/bjusystems/vdrmanager/gui/EventEpgListActivity.java
+++ b/vdrmanager/src/de/bjusystems/vdrmanager/gui/EventEpgListActivity.java
@@ -5,10 +5,6 @@ import java.util.Calendar;
import java.util.Collections;
import java.util.Date;
import java.util.List;
-import java.util.WeakHashMap;
-
-import com.actionbarsherlock.view.Menu;
-import com.actionbarsherlock.view.MenuItem;
import android.content.Intent;
import android.os.Bundle;
@@ -21,14 +17,17 @@ import android.widget.ListView;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;
+
+import com.actionbarsherlock.view.Menu;
+import com.actionbarsherlock.view.MenuItem;
+
import de.bjusystems.vdrmanager.R;
import de.bjusystems.vdrmanager.app.VdrManagerApp;
-import de.bjusystems.vdrmanager.data.EpgCache;
import de.bjusystems.vdrmanager.data.Channel;
import de.bjusystems.vdrmanager.data.Epg;
+import de.bjusystems.vdrmanager.data.EpgCache;
import de.bjusystems.vdrmanager.data.Event;
import de.bjusystems.vdrmanager.data.EventListItem;
-import de.bjusystems.vdrmanager.data.Timer;
import de.bjusystems.vdrmanager.tasks.ChannelsTask;
import de.bjusystems.vdrmanager.utils.date.DateFormatter;
import de.bjusystems.vdrmanager.utils.svdrp.ChannelClient;
@@ -43,427 +42,433 @@ import de.bjusystems.vdrmanager.utils.svdrp.SvdrpEvent;
* @author bju
*/
public class EventEpgListActivity extends BaseTimerEditActivity<Epg> implements
- OnItemClickListener, OnItemSelectedListener {
-
- private static final String TAG = EventEpgListActivity.class
- .getSimpleName();
+OnItemClickListener, OnItemSelectedListener {
- // protected static Date nextForceCache = null;
+ private static final String TAG = EventEpgListActivity.class
+ .getSimpleName();
- // private static Channel cachedChannel = null;
+ // protected static Date nextForceCache = null;
- Spinner channelSpinner;
+ // private static Channel cachedChannel = null;
- View switcher;
+ Spinner channelSpinner;
- ArrayAdapter<Channel> channelSpinnerAdapter;
+ View switcher;
+
+ ArrayAdapter<Channel> channelSpinnerAdapter;
- // protected static ArrayList<Epg> CACHE = new ArrayList<Epg>();
+ // protected static ArrayList<Epg> CACHE = new ArrayList<Epg>();
- private TextView audio;
+ private TextView audio;
- private View channelInfo;
-
- @Override
- protected void onCreate(final Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- //
- //
- // create adapter for channel spinner
- 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);
- channelSpinner.setAdapter(channelSpinnerAdapter);
-
- switcher = findViewById(R.id.switch_epg_view);
- switcher.setOnClickListener(this);
-
- // add channel values
- // boolean useChannelNumber = Preferences.get().isShowChannelNumbers();
-
- // show needed items
-
- channelInfo = findViewById(R.id.channel_info);
-
- channelInfo.setOnClickListener(this);
-
- audio = (TextView) channelInfo.findViewById(R.id.channel_audio);
-
- adapter = new ChannelEventAdapter(this);
-
- // if (currentChannel != null) {
-
- // }
- // startChannelEpgQuery(channel);
- // findViewById(R.id.timer_item_channel).setVisibility(View.GONE);
- // break;
-
- // 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);
-
- if (checkInternetConnection() == false) {
- return;
- }
-
- startQuery();
-
- }
-
- @Override
- protected int getAvailableSortByEntries() {
- return R.array.epg_sort_by_time_alpha;
- }
-
- protected String getViewID() {
- return EventEpgListActivity.class.getSimpleName();
- }
-
- private void startQuery() {
- new ChannelsTask(this, new ChannelClient()) {
- public void finished(SvdrpEvent event) {
- if (event == SvdrpEvent.CACHE_HIT
- || event == SvdrpEvent.FINISHED_SUCCESS) {
- ArrayList<Channel> channels = ChannelClient.getChannels();
- currentChannel = getApp().getCurrentChannel();
- boolean found = false;
- int count = 0;
- for (final Channel c : channels) {
- channelSpinnerAdapter.add(c);
- if (currentChannel != null && !found) {
- if (currentChannel.equals(c)) {
- found = true;
- } else {
- count++;
- }
- }
- }
- channelSpinner.setSelection(count);
- channelSpinner
- .setOnItemSelectedListener(EventEpgListActivity.this);
- } else {
- noConnection(event);
- }
- }
- }.start();
-
- }
-
- void sort() {
- if (sortBy == BaseEventListActivity.MENU_GROUP_ALPHABET) {
- Collections.sort(getCache(), new TitleComparator());
- } else if (sortBy == BaseEventListActivity.MENU_GROUP_DEFAULT) {
- Collections.sort(getCache(), new TimeComparator(false));
- }
- }
-
- @Override
- protected void onPause() {
- super.onPause();
- }
-
- @Override
- protected void onResume() {
- super.onResume();
- }
-
- public void onItemSelected(final AdapterView<?> parent, final View view,
- final int position, final long id) {
- // get spinner value
- final Channel channel = (Channel) channelSpinner.getSelectedItem();
- currentChannel = channel;
- setCurrent(channel);
- // setAsCurrent(channel);
- // update search
- if (channel.getAudio().isEmpty() == false) {
- audio.setText(Utils.formatAudio(this, channel.getAudio()));
- } else {
- audio.setText("");
- }
-
- startEpgQuery(false);
- }
-
- public void onNothingSelected(final AdapterView<?> arg0) {
- // startTimeEpgQuery(((EpgTimeSpinnerValue)timeSpinner.getAdapter().getItem(0)).getValue());
- }
-
- public void clearCache() {
- getCache().clear();
- EpgCache.CACHE.remove(currentChannel.getId());
- EpgCache.NEXT_REFRESH.remove(currentChannel.getId());
- }
-
- private boolean useCache() {
-
- if (currentChannel == null) {
- return false;
- }
-
- ArrayList<Epg> cachedChannel = EpgCache.CACHE.get(currentChannel.getId());
-
- if (cachedChannel == null) {
- return false;
- }
-
- Date nextForceCache = EpgCache.NEXT_REFRESH.get(currentChannel.getId());
-
- if (nextForceCache == null) {
- return false;
- }
- Date now = new Date();
- if (nextForceCache.before(now)) {
- return false;
- }
- return true;
- }
-
- @Override
- public void onClick(View view) {
-
- if (view == switcher) {
- final Intent intent = new Intent();
- intent.setClass(this, TimeEpgListActivity.class);
- intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT
- | Intent.FLAG_ACTIVITY_SINGLE_TOP);
- startActivity(intent);
- } else if (view == channelInfo) {
- Utils.stream(this, currentChannel);
- } else {
- super.onClick(view);
- }
- }
-
- private void startEpgQuery(final boolean force) {
- if (useCache() && !force) {
- fillAdapter();
- return;
- }
-
- if (checkInternetConnection() == false) {
- return;
- }
-
- // clearCache();
-
- EpgClient epgClient = new EpgClient(currentChannel);
-
- // remove old listeners
- // epgClient.clearSvdrpListener();
-
- // create background task
- final SvdrpAsyncTask<Epg, SvdrpClient<Epg>> task = new SvdrpAsyncTask<Epg, SvdrpClient<Epg>>(
- epgClient);
-
- // create progress
-
- addListener(task);
-
- // start task
- task.run();
- }
-
- private static final ArrayList<Epg> EMPTY = new ArrayList<Epg>(0);
-
- private ArrayList<Epg> getCache() {
- ArrayList<Epg> arrayList = EpgCache.CACHE.get(currentChannel.getId());
- if (arrayList == null) {
- return EMPTY;
- }
- return arrayList;
- }
-
- @Override
- protected void fillAdapter() {
-
- adapter.clear();
-
- ArrayList<Epg> cache = getCache();
-
- if (cache.isEmpty()) {
- return;
- }
-
- sort();
-
- Calendar cal = Calendar.getInstance();
- int day = -1;
- for (Event e : cache) {
- 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((Epg) e));
- }
-
- adapter.notifyDataSetChanged();
-
- }
-
- /*
- * (non-Javadoc) TODO this method also should be used in startEpgQuery on
- * cache hit
- *
- * @see de.bjusystems.vdrmanager.gui.BaseEpgListActivity#finishedSuccess()
- */
- @Override
- protected boolean finishedSuccessImpl(List<Epg> results) {
- // adapter.clear();
- // CACHE.clear();
-
- clearCache();
-
- if (results.isEmpty()) {
- return false;
- }
-
- Date now = new Date();
-
- EpgCache.NEXT_REFRESH.put(currentChannel.getId(), FUTURE);
-
- Date nextForceCache = FUTURE;
-
- // Calendar cal = Calendar.getInstance();
- // int day = -1;
- // sortItemsByTime(results);
- ArrayList<Epg> cache = new ArrayList<Epg>();
- for (Epg e : results) {
- cache.add(e);
- // 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((Epg) e));
- if (e.getStop().before(nextForceCache) && e.getStop().after(now)) {
- nextForceCache = e.getStop();
- }
- }
-
- EpgCache.NEXT_REFRESH.put(currentChannel.getId(), nextForceCache);
- EpgCache.CACHE.put(currentChannel.getId(), cache);
-
- fillAdapter();
- listView.setSelectionAfterHeaderView();
- return results.isEmpty() == false;
-
- // ///////////////
-
- // // get spinner value
- // final EpgSearchTimeValue selection = (EpgSearchTimeValue) timeSpinner
- // .getSelectedItem();
- // nextForceCache = FUTURE;
- // cachedTime = selection.getValue();
- // Date now = new Date();
- //
- // //adapter.add(new EventListItem(new DateFormatter(results.get(0)
- // // .getStart()).getDailyHeader()));
- //
- // for (Event e : results) {
- // CACHE.add(e);
- // if (e.getStop().before(nextForceCache) && e.getStop().after(now)) {
- // nextForceCache = e.getStop();
- // }
- // }
- //
-
- }
-
- protected void prepareDetailsViewData(final EventListItem item) {
- final VdrManagerApp app = (VdrManagerApp) getApplication();
- app.setCurrentEvent(item.getEvent());
- app.setCurrentEpgList(getCache());
- }
-
- @Override
- protected int getMainLayout() {
- return R.layout.event_epg_list;
- }
-
- @Override
- protected void refresh() {
- startEpgQuery(true);
- }
-
- @Override
- protected void retry() {
- refresh();
- }
-
- @Override
- protected String getWindowTitle() {
- return getString(R.string.epg_by_channel);
- }
-
- private void nextEvent() {
- int pos = channelSpinner.getSelectedItemPosition();
- if (pos + 1 >= channelSpinnerAdapter.getCount()) {
- Toast.makeText(this, R.string.navigae_at_the_end,
- Toast.LENGTH_SHORT).show();
- return;
- }
- channelSpinner.setSelection(pos + 1, true);
- }
-
- private void prevEvent() {
- int pos = channelSpinner.getSelectedItemPosition();
- if (pos <= 0) {
- say(R.string.navigae_at_the_start);
- return;
- }
- channelSpinner.setSelection(pos - 1, true);
- }
-
- @Override
- public void onSwipe(int direction) {
- switch (direction) {
- case SimpleGestureFilter.SWIPE_RIGHT:
- prevEvent();
- break;
- case SimpleGestureFilter.SWIPE_LEFT:
- nextEvent();
- break;
- }
- }
-
- @Override
- protected int getListNavigationIndex() {
- return LIST_NAVIGATION_EPG_BY_CHANNEL;
- }
-
- @Override
- protected List<Epg> getCACHE() {
- return getCache();
- }
-
- @Override
- public boolean onCreateOptionsMenu(Menu menu) {
- super.onCreateOptionsMenu(menu);
- final com.actionbarsherlock.view.MenuInflater inflater = getSupportMenuInflater();
- inflater.inflate(R.menu.epg_event_list_menu, menu);
- return true;
- }
-
- @Override
- public boolean onOptionsItemSelected(MenuItem item) {
- if (item.getItemId() == R.id.epg_list_stream) {
- Utils.stream(this, currentChannel);
- return true;
- }
- return super.onOptionsItemSelected(item);
- }
+ private View channelInfo;
+
+ @Override
+ protected void onCreate(final Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ //
+ //
+ // create adapter for channel spinner
+ 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);
+ channelSpinner.setAdapter(channelSpinnerAdapter);
+
+ switcher = findViewById(R.id.switch_epg_view);
+ switcher.setOnClickListener(this);
+
+ // add channel values
+ // boolean useChannelNumber = Preferences.get().isShowChannelNumbers();
+
+ // show needed items
+
+ channelInfo = findViewById(R.id.channel_info);
+
+ channelInfo.setOnClickListener(this);
+
+ audio = (TextView) channelInfo.findViewById(R.id.channel_audio);
+
+ adapter = new ChannelEventAdapter(this);
+
+ // if (currentChannel != null) {
+
+ // }
+ // startChannelEpgQuery(channel);
+ // findViewById(R.id.timer_item_channel).setVisibility(View.GONE);
+ // break;
+
+ // 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);
+
+ if (checkInternetConnection() == false) {
+ return;
+ }
+
+ startQuery();
+
+ }
+
+ @Override
+ protected int getAvailableSortByEntries() {
+ return R.array.epg_sort_by_time_alpha;
+ }
+
+ @Override
+ protected String getViewID() {
+ return EventEpgListActivity.class.getSimpleName();
+ }
+
+ private void startQuery() {
+ new ChannelsTask(this, new ChannelClient(getCertificateProblemDialog())) {
+ @Override
+ public void finished(final SvdrpEvent event) {
+ if (event == SvdrpEvent.CACHE_HIT
+ || event == SvdrpEvent.FINISHED_SUCCESS) {
+ final ArrayList<Channel> channels = ChannelClient.getChannels();
+ currentChannel = getApp().getCurrentChannel();
+ boolean found = false;
+ int count = 0;
+ for (final Channel c : channels) {
+ channelSpinnerAdapter.add(c);
+ if (currentChannel != null && !found) {
+ if (currentChannel.equals(c)) {
+ found = true;
+ } else {
+ count++;
+ }
+ }
+ }
+ channelSpinner.setSelection(count);
+ channelSpinner
+ .setOnItemSelectedListener(EventEpgListActivity.this);
+ } else {
+ noConnection(event);
+ }
+ }
+ }.start();
+
+ }
+
+ void sort() {
+ if (sortBy == BaseEventListActivity.MENU_GROUP_ALPHABET) {
+ Collections.sort(getCache(), new TitleComparator());
+ } else if (sortBy == BaseEventListActivity.MENU_GROUP_DEFAULT) {
+ Collections.sort(getCache(), new TimeComparator(false));
+ }
+ }
+
+ @Override
+ protected void onPause() {
+ super.onPause();
+ }
+
+ @Override
+ protected void onResume() {
+ super.onResume();
+ }
+
+ @Override
+ public void onItemSelected(final AdapterView<?> parent, final View view,
+ final int position, final long id) {
+ // get spinner value
+ final Channel channel = (Channel) channelSpinner.getSelectedItem();
+ currentChannel = channel;
+ setCurrent(channel);
+ // setAsCurrent(channel);
+ // update search
+ if (channel.getAudio().isEmpty() == false) {
+ audio.setText(Utils.formatAudio(this, channel.getAudio()));
+ } else {
+ audio.setText("");
+ }
+
+ startEpgQuery(false);
+ }
+
+ @Override
+ public void onNothingSelected(final AdapterView<?> arg0) {
+ // startTimeEpgQuery(((EpgTimeSpinnerValue)timeSpinner.getAdapter().getItem(0)).getValue());
+ }
+
+ @Override
+ public void clearCache() {
+ getCache().clear();
+ EpgCache.CACHE.remove(currentChannel.getId());
+ EpgCache.NEXT_REFRESH.remove(currentChannel.getId());
+ }
+
+ private boolean useCache() {
+
+ if (currentChannel == null) {
+ return false;
+ }
+
+ final ArrayList<Epg> cachedChannel = EpgCache.CACHE.get(currentChannel.getId());
+
+ if (cachedChannel == null) {
+ return false;
+ }
+
+ final Date nextForceCache = EpgCache.NEXT_REFRESH.get(currentChannel.getId());
+
+ if (nextForceCache == null) {
+ return false;
+ }
+ final Date now = new Date();
+ if (nextForceCache.before(now)) {
+ return false;
+ }
+ return true;
+ }
+
+ @Override
+ public void onClick(final View view) {
+
+ if (view == switcher) {
+ final Intent intent = new Intent();
+ intent.setClass(this, TimeEpgListActivity.class);
+ intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT
+ | Intent.FLAG_ACTIVITY_SINGLE_TOP);
+ startActivity(intent);
+ } else if (view == channelInfo) {
+ Utils.stream(this, currentChannel);
+ } else {
+ super.onClick(view);
+ }
+ }
+
+ private void startEpgQuery(final boolean force) {
+ if (useCache() && !force) {
+ fillAdapter();
+ return;
+ }
+
+ if (checkInternetConnection() == false) {
+ return;
+ }
+
+ // clearCache();
+
+ final EpgClient epgClient = new EpgClient(currentChannel, getCertificateProblemDialog());
+
+ // remove old listeners
+ // epgClient.clearSvdrpListener();
+
+ // create background task
+ final SvdrpAsyncTask<Epg, SvdrpClient<Epg>> task = new SvdrpAsyncTask<Epg, SvdrpClient<Epg>>(
+ epgClient);
+
+ // create progress
+
+ addListener(task);
+
+ // start task
+ task.run();
+ }
+
+ private static final ArrayList<Epg> EMPTY = new ArrayList<Epg>(0);
+
+ private ArrayList<Epg> getCache() {
+ final ArrayList<Epg> arrayList = EpgCache.CACHE.get(currentChannel.getId());
+ if (arrayList == null) {
+ return EMPTY;
+ }
+ return arrayList;
+ }
+
+ @Override
+ protected void fillAdapter() {
+
+ adapter.clear();
+
+ final ArrayList<Epg> cache = getCache();
+
+ if (cache.isEmpty()) {
+ return;
+ }
+
+ sort();
+
+ final Calendar cal = Calendar.getInstance();
+ int day = -1;
+ for (final Event e : cache) {
+ cal.setTime(e.getStart());
+ final 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));
+ }
+
+ adapter.notifyDataSetChanged();
+
+ }
+
+ /*
+ * (non-Javadoc) TODO this method also should be used in startEpgQuery on
+ * cache hit
+ *
+ * @see de.bjusystems.vdrmanager.gui.BaseEpgListActivity#finishedSuccess()
+ */
+ @Override
+ protected boolean finishedSuccessImpl(final List<Epg> results) {
+ // adapter.clear();
+ // CACHE.clear();
+
+ clearCache();
+
+ if (results.isEmpty()) {
+ return false;
+ }
+
+ final Date now = new Date();
+
+ EpgCache.NEXT_REFRESH.put(currentChannel.getId(), FUTURE);
+
+ Date nextForceCache = FUTURE;
+
+ // Calendar cal = Calendar.getInstance();
+ // int day = -1;
+ // sortItemsByTime(results);
+ final ArrayList<Epg> cache = new ArrayList<Epg>();
+ for (final Epg e : results) {
+ cache.add(e);
+ // 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((Epg) e));
+ if (e.getStop().before(nextForceCache) && e.getStop().after(now)) {
+ nextForceCache = e.getStop();
+ }
+ }
+
+ EpgCache.NEXT_REFRESH.put(currentChannel.getId(), nextForceCache);
+ EpgCache.CACHE.put(currentChannel.getId(), cache);
+
+ fillAdapter();
+ listView.setSelectionAfterHeaderView();
+ return results.isEmpty() == false;
+
+ // ///////////////
+
+ // // get spinner value
+ // final EpgSearchTimeValue selection = (EpgSearchTimeValue) timeSpinner
+ // .getSelectedItem();
+ // nextForceCache = FUTURE;
+ // cachedTime = selection.getValue();
+ // Date now = new Date();
+ //
+ // //adapter.add(new EventListItem(new DateFormatter(results.get(0)
+ // // .getStart()).getDailyHeader()));
+ //
+ // for (Event e : results) {
+ // CACHE.add(e);
+ // if (e.getStop().before(nextForceCache) && e.getStop().after(now)) {
+ // nextForceCache = e.getStop();
+ // }
+ // }
+ //
+
+ }
+
+ @Override
+ protected void prepareDetailsViewData(final EventListItem item) {
+ final VdrManagerApp app = (VdrManagerApp) getApplication();
+ app.setCurrentEvent(item.getEvent());
+ app.setCurrentEpgList(getCache());
+ }
+
+ @Override
+ protected int getMainLayout() {
+ return R.layout.event_epg_list;
+ }
+
+ @Override
+ protected void refresh() {
+ startEpgQuery(true);
+ }
+
+ @Override
+ protected void retry() {
+ refresh();
+ }
+
+ @Override
+ protected String getWindowTitle() {
+ return getString(R.string.epg_by_channel);
+ }
+
+ private void nextEvent() {
+ final int pos = channelSpinner.getSelectedItemPosition();
+ if (pos + 1 >= channelSpinnerAdapter.getCount()) {
+ Toast.makeText(this, R.string.navigae_at_the_end,
+ Toast.LENGTH_SHORT).show();
+ return;
+ }
+ channelSpinner.setSelection(pos + 1, true);
+ }
+
+ private void prevEvent() {
+ final int pos = channelSpinner.getSelectedItemPosition();
+ if (pos <= 0) {
+ say(R.string.navigae_at_the_start);
+ return;
+ }
+ channelSpinner.setSelection(pos - 1, true);
+ }
+
+ @Override
+ public void onSwipe(final int direction) {
+ switch (direction) {
+ case SimpleGestureFilter.SWIPE_RIGHT:
+ prevEvent();
+ break;
+ case SimpleGestureFilter.SWIPE_LEFT:
+ nextEvent();
+ break;
+ }
+ }
+
+ @Override
+ protected int getListNavigationIndex() {
+ return LIST_NAVIGATION_EPG_BY_CHANNEL;
+ }
+
+ @Override
+ protected List<Epg> getCACHE() {
+ return getCache();
+ }
+
+ @Override
+ public boolean onCreateOptionsMenu(final Menu menu) {
+ super.onCreateOptionsMenu(menu);
+ final com.actionbarsherlock.view.MenuInflater inflater = getSupportMenuInflater();
+ inflater.inflate(R.menu.epg_event_list_menu, menu);
+ return true;
+ }
+
+ @Override
+ public boolean onOptionsItemSelected(final MenuItem item) {
+ if (item.getItemId() == R.id.epg_list_stream) {
+ Utils.stream(this, currentChannel);
+ return true;
+ }
+ return super.onOptionsItemSelected(item);
+ }
}
diff --git a/vdrmanager/src/de/bjusystems/vdrmanager/gui/ICSBaseActivity.java b/vdrmanager/src/de/bjusystems/vdrmanager/gui/ICSBaseActivity.java
index ce44ef0..b34219f 100644
--- a/vdrmanager/src/de/bjusystems/vdrmanager/gui/ICSBaseActivity.java
+++ b/vdrmanager/src/de/bjusystems/vdrmanager/gui/ICSBaseActivity.java
@@ -2,17 +2,21 @@ package de.bjusystems.vdrmanager.gui;
import com.actionbarsherlock.app.SherlockActivity;
-public abstract class ICSBaseActivity extends SherlockActivity{
+public abstract class ICSBaseActivity extends SherlockActivity {
- public void initActionBar() {
-// int api = Build.VERSION.SDK_INT;
- // if (api < 14) {
- // return;
- //}
- com.actionbarsherlock.app.ActionBar actionBar = getSupportActionBar();
- if(actionBar == null){
- return;
- }
- actionBar.setHomeButtonEnabled(true);
- }
+ public void initActionBar() {
+ // int api = Build.VERSION.SDK_INT;
+ // if (api < 14) {
+ // return;
+ //}
+ final com.actionbarsherlock.app.ActionBar actionBar = getSupportActionBar();
+ if(actionBar == null){
+ return;
+ }
+ actionBar.setHomeButtonEnabled(true);
+ }
+
+ protected CertificateProblemDialog getCertificateProblemDialog() {
+ return new CertificateProblemDialog(this);
+ }
}
diff --git a/vdrmanager/src/de/bjusystems/vdrmanager/gui/RecordingListActivity.java b/vdrmanager/src/de/bjusystems/vdrmanager/gui/RecordingListActivity.java
index ab31d19..5a74852 100644
--- a/vdrmanager/src/de/bjusystems/vdrmanager/gui/RecordingListActivity.java
+++ b/vdrmanager/src/de/bjusystems/vdrmanager/gui/RecordingListActivity.java
@@ -41,417 +41,421 @@ import de.bjusystems.vdrmanager.utils.svdrp.SvdrpEvent;
* @author bju
*/
public class RecordingListActivity extends BaseEventListActivity<Recording>
- implements OnItemLongClickListener {
-
- // RecordingClient recordingClient;
-
- // public static final int MENU_GROUP_CHANNEL = 2;
-
- public static final int ASC = 0;
-
- public static final int DESC = 1;
-
- // protected static ArrayList<Recording> CACHE = new ArrayList<Recording>();
-
- private static Map<String, List<Recording>> CACHE = new TreeMap<String, List<Recording>>();
-
- public static final Map<String, Set<String>> FOLDERS = new TreeMap<String, Set<String>>();
-
- private String currentFolder = Recording.ROOT_FOLDER;
-
- private int ASC_DESC = ASC;
-
- private static final List<Recording> EMPTY = new ArrayList<Recording>(0);
-
- private Stack<String> stack = new Stack<String>();
-
- private TextView folderInfo;
-
- private TextView currentCount;
-
- @Override
- protected void onCreate(final Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
-
- adapter = new RecordingAdapter(this);
-
- // attach adapter to ListView
- listView = (ListView) findViewById(R.id.recording_list);
- folderInfo = (TextView) findViewById(R.id.folder_info);
- currentCount = (TextView) findViewById(R.id.current_count);
- listView.setAdapter(adapter);
-
- // set click listener
- listView.setOnItemLongClickListener(this);
- // register EPG item click
- listView.setOnItemClickListener(this);
- // context menu wanted
- registerForContextMenu(listView);
- listView.setFastScrollEnabled(true);
- listView.setTextFilterEnabled(true);
- // start query
- startRecordingQuery();
- }
-
- protected int getAvailableSortByEntries() {
- return R.array.recordings_group_by;
- };
-
- // AlertDialog groupByDialog = null;
-
- // @Override
- // public boolean onOptionsItemSelected(
- // final com.actionbarsherlock.view.MenuItem item) {
- //
- // switch (item.getItemId()) {
- // case R.id.menu_groupby:
- // // 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) {
- // if (groupBy == which) {
- // ASC_DESC = ASC_DESC == ASC ? DESC
- // : ASC;
- // } else {
- // groupBy = which;
- // ASC_DESC = ASC;
- // }
- // // fillAdapter();
- // groupByDialog.dismiss();
- // say("Comming soon...");
- // }
- // }).create();
- // }
- //
- // groupByDialog.show();
- //
- // return true;
- // default:
- // return super.onOptionsItemSelected(item);
- // }
- // }
-
- @Override
- public void onItemClick(AdapterView<?> parent, View view, int position,
- long id) {
-
- final RecordingListItem item = (RecordingListItem) adapter
- .getItem(position);
- if (item.isFolder()) {
- if (currentFolder.equals(Recording.ROOT_FOLDER)) {
- currentFolder = item.folder;
- } else {
- currentFolder = currentFolder + Recording.FOLDERDELIMCHAR
- + item.folder;
- }
- stack.push(currentFolder);
- fillAdapter();
- } else {
- super.onItemClick(parent, view, position, id);
- }
- }
-
- private void updateCurrentFolderInfo() {
- folderInfo.setText("/" + currentFolder.replaceAll("~", "/"));
- List<Recording> list = CACHE.get(currentFolder);
- currentCount.setText(String.valueOf(list.size()));
- }
-
- /*
- * (non-Javadoc)
- *
- * @see
- * de.bjusystems.vdrmanager.gui.BaseActivity#onCreateOptionsMenu(android
- * .view.Menu)
- */
- @Override
- public boolean onCreateOptionsMenu(
- final com.actionbarsherlock.view.Menu menu) {
- final com.actionbarsherlock.view.MenuInflater inflater = getSupportMenuInflater();
- inflater.inflate(R.menu.recording_list_menu, menu);
- return super.onCreateOptionsMenu(menu);
- }
-
- @Override
- protected void onPause() {
- super.onPause();
- }
-
- @Override
- protected void prepareDetailsViewData(EventListItem event) {
- getApp().setCurrentEvent(event.getEvent());
- getApp().setCurrentEpgList(CACHE.get(currentFolder));
- }
-
- @Override
- public void onCreateContextMenu(final ContextMenu menu, final View v,
- final ContextMenuInfo menuInfo) {
-
- final AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) menuInfo;
- final EventListItem item = adapter.getItem(info.position);
- if (item.isHeader()) {
- return;
- }
-
- if (v.getId() == R.id.recording_list) {
- final MenuInflater inflater = getMenuInflater();
- // set menu title
- final EventFormatter formatter = new EventFormatter(item);
- menu.setHeaderTitle(formatter.getTitle());
-
- inflater.inflate(R.menu.recording_list_item_menu, menu);
- if (Preferences.get().isEnableRecStream() == false) {
- menu.removeItem(R.id.recording_item_menu_stream);
- }
-
- }
-
- super.onCreateContextMenu(menu, v, menuInfo);
- //
- // http://projects.vdr-developer.org/issues/863
- // if (Utils.isLive(item)) {
- menu.removeItem(R.id.epg_item_menu_live_tv);
- // }
- }
-
- @Override
- public boolean onContextItemSelected(final MenuItem item) {
-
- final AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) item
- .getMenuInfo();
- final EventListItem event = adapter.getItem(info.position);
- Recording rec = (Recording) event.getEvent();
- switch (item.getItemId()) {
- case R.id.recording_item_menu_delete: {
- DeleteRecordingTask drt = new DeleteRecordingTask(this, rec) {
- @Override
- public void finished(SvdrpEvent event) {
- if (event == SvdrpEvent.FINISHED_SUCCESS) {
- backupViewSelection();
- refresh();
- }
- }
- };
- drt.start();
- break;
- }
- case R.id.recording_item_menu_stream: {
- Utils.streamRecording(this, rec);
- // say("Sorry, not yet. It would be. File -> " + rec.getFileName());
- break;
- }
-
- default:
- return super.onContextItemSelected(item);
- }
- return true;
- }
-
- private void startRecordingQuery() {
-
- if (checkInternetConnection() == false) {
- return;
- }
-
- // get timer client
- RecordingClient recordingClient = new RecordingClient();
-
- // create backgound task
- final SvdrpAsyncTask<Recording, SvdrpClient<Recording>> task = new SvdrpAsyncTask<Recording, SvdrpClient<Recording>>(
- recordingClient);
-
- // create progress dialog
-
- addListener(task);
-
- // start task
- task.run();
- }
-
- protected void retry() {
- startRecordingQuery();
- }
-
- protected void refresh() {
- startRecordingQuery();
- }
-
- @Override
- protected int getMainLayout() {
- return R.layout.recording_list;
- }
-
- @Override
- protected String getWindowTitle() {
- return getString(R.string.action_menu_recordings);
- }
-
- protected void sort() {
- /* */
- switch (sortBy) {
- case MENU_GROUP_DEFAULT: {
- sortItemsByTime(CACHE.get(currentFolder), true);
- break;
- }
- case MENU_GROUP_ALPHABET: {
- Collections.sort(CACHE.get(currentFolder), new TitleComparator());
- break;
- }
- // case MENU_GROUP_CHANNEL: {
- // sortItemsByChannel(results);
- // }
- }
- }
-
- @Override
- protected void fillAdapter() {
-
- adapter.clear();
- List<Recording> list = CACHE.get(currentFolder);
- if (list == null || list.isEmpty()) {
- return;
- }
-
- updateCurrentFolderInfo();
-
- sort();
-
- Calendar cal = Calendar.getInstance();
- int day = -1;
-
- Set<String> folders = FOLDERS.get(currentFolder);
- if (folders != null) {
- for (String f : folders) {
- RecordingListItem recordingListItem = new RecordingListItem(f);
- recordingListItem.folder = f;
- String sf = currentFolder.length() > 0 ? currentFolder
- + Recording.FOLDERDELIMCHAR + f : f;
- List<Recording> list2 = CACHE.get(sf);
- if (list2 != null) {
- recordingListItem.count = list2.size();
- }
- adapter.add(recordingListItem);
- }
- }
-
- for (final Event rec : CACHE.get(currentFolder)) {
- cal.setTime(rec.getStart());
- int eday = cal.get(Calendar.DAY_OF_YEAR);
- if (eday != day) {
- day = eday;
- adapter.add(new RecordingListItem(new DateFormatter(cal)
- .getDailyHeader()));
- }
- adapter.add(new RecordingListItem((Recording) rec));
- adapter.notifyDataSetChanged();
- }
-
- }
-
- @Override
- public void onBackPressed() {
- if (stack.isEmpty()) {
- super.onBackPressed();
- } else {
- stack.pop();
- if (stack.isEmpty()) {
- currentFolder = "";
- } else {
- currentFolder = stack.peek();
- }
- fillAdapter();
- }
-
- }
-
- @Override
- protected boolean finishedSuccessImpl(List<Recording> results) {
- clearCache();
- for (Recording r : results) {
- String folder = r.getFolder();
- if (folder.length() > 0) {
- String[] split = folder.split(Recording.FOLDERDELIMCHAR);
- String key = null;
- String value = null;
- if (split.length == 1) {
- key = Recording.ROOT_FOLDER;
- value = split[0];
- } else {
- value = split[split.length - 1];
- // StringBuilder sb = new StringBuilder();
- // String sep = "";
- // for(int i = 0; i < split.length - 1; ++i){
- // sb.append(sep).append(split[i]);
- // sep = Recording.FOLDERDELIMCHAR;
- // }
- key = folder.subSequence(0,
- folder.length() - (value.length() + 1)).toString();
-
- }
-
- Set<String> list = FOLDERS.get(key);
- if (list == null) {
- list = new TreeSet<String>(new Comparator<String>() {
- @Override
- public int compare(String lhs, String rhs) {
- return lhs.compareToIgnoreCase(rhs);
- }
- });
- FOLDERS.put(key, list);
- }
-
- list.add(value);
-
- // a b
- // a
- // c
- // a~b > k
-
- }
- List<Recording> list = CACHE.get(folder);
- if (list == null) {
- list = new ArrayList<Recording>();
- CACHE.put(folder, list);
- }
- list.add(r);
- }
-
- pushResultCountToTitle();
- fillAdapter();
- return adapter.isEmpty() == false;
- }
-
- public boolean onItemLongClick(AdapterView<?> arg0, View arg1, int arg2,
- long arg3) {
-
- return false;
- }
-
- @Override
- protected int getListNavigationIndex() {
- return LIST_NAVIGATION_RECORDINGS;
- }
-
- public void clearCache() {
- CACHE.clear();
- FOLDERS.clear();
- }
-
- @Override
- protected List<Recording> getCACHE() {
-
- List<Recording> list = CACHE.get(currentFolder);
-
- if (list != null) {
- return list;
- }
- return EMPTY;
- }
-
+implements OnItemLongClickListener {
+
+ // RecordingClient recordingClient;
+
+ // public static final int MENU_GROUP_CHANNEL = 2;
+
+ public static final int ASC = 0;
+
+ public static final int DESC = 1;
+
+ // protected static ArrayList<Recording> CACHE = new ArrayList<Recording>();
+
+ private static Map<String, List<Recording>> CACHE = new TreeMap<String, List<Recording>>();
+
+ public static final Map<String, Set<String>> FOLDERS = new TreeMap<String, Set<String>>();
+
+ private String currentFolder = Recording.ROOT_FOLDER;
+
+ private final int ASC_DESC = ASC;
+
+ private static final List<Recording> EMPTY = new ArrayList<Recording>(0);
+
+ private final Stack<String> stack = new Stack<String>();
+
+ private TextView folderInfo;
+
+ private TextView currentCount;
+
+ @Override
+ protected void onCreate(final Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ adapter = new RecordingAdapter(this);
+
+ // attach adapter to ListView
+ listView = (ListView) findViewById(R.id.recording_list);
+ folderInfo = (TextView) findViewById(R.id.folder_info);
+ currentCount = (TextView) findViewById(R.id.current_count);
+ listView.setAdapter(adapter);
+
+ // set click listener
+ listView.setOnItemLongClickListener(this);
+ // register EPG item click
+ listView.setOnItemClickListener(this);
+ // context menu wanted
+ registerForContextMenu(listView);
+ listView.setFastScrollEnabled(true);
+ listView.setTextFilterEnabled(true);
+ // start query
+ startRecordingQuery();
+ }
+
+ @Override
+ protected int getAvailableSortByEntries() {
+ return R.array.recordings_group_by;
+ };
+
+ // AlertDialog groupByDialog = null;
+
+ // @Override
+ // public boolean onOptionsItemSelected(
+ // final com.actionbarsherlock.view.MenuItem item) {
+ //
+ // switch (item.getItemId()) {
+ // case R.id.menu_groupby:
+ // // 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) {
+ // if (groupBy == which) {
+ // ASC_DESC = ASC_DESC == ASC ? DESC
+ // : ASC;
+ // } else {
+ // groupBy = which;
+ // ASC_DESC = ASC;
+ // }
+ // // fillAdapter();
+ // groupByDialog.dismiss();
+ // say("Comming soon...");
+ // }
+ // }).create();
+ // }
+ //
+ // groupByDialog.show();
+ //
+ // return true;
+ // default:
+ // return super.onOptionsItemSelected(item);
+ // }
+ // }
+
+ @Override
+ public void onItemClick(final AdapterView<?> parent, final View view, final int position,
+ final long id) {
+
+ final RecordingListItem item = (RecordingListItem) adapter
+ .getItem(position);
+ if (item.isFolder()) {
+ if (currentFolder.equals(Recording.ROOT_FOLDER)) {
+ currentFolder = item.folder;
+ } else {
+ currentFolder = currentFolder + Recording.FOLDERDELIMCHAR
+ + item.folder;
+ }
+ stack.push(currentFolder);
+ fillAdapter();
+ } else {
+ super.onItemClick(parent, view, position, id);
+ }
+ }
+
+ private void updateCurrentFolderInfo() {
+ folderInfo.setText("/" + currentFolder.replaceAll("~", "/"));
+ final List<Recording> list = CACHE.get(currentFolder);
+ currentCount.setText(String.valueOf(list.size()));
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * de.bjusystems.vdrmanager.gui.BaseActivity#onCreateOptionsMenu(android
+ * .view.Menu)
+ */
+ @Override
+ public boolean onCreateOptionsMenu(
+ final com.actionbarsherlock.view.Menu menu) {
+ final com.actionbarsherlock.view.MenuInflater inflater = getSupportMenuInflater();
+ inflater.inflate(R.menu.recording_list_menu, menu);
+ return super.onCreateOptionsMenu(menu);
+ }
+
+ @Override
+ protected void onPause() {
+ super.onPause();
+ }
+
+ @Override
+ protected void prepareDetailsViewData(final EventListItem event) {
+ getApp().setCurrentEvent(event.getEvent());
+ getApp().setCurrentEpgList(CACHE.get(currentFolder));
+ }
+
+ @Override
+ public void onCreateContextMenu(final ContextMenu menu, final View v,
+ final ContextMenuInfo menuInfo) {
+
+ final AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) menuInfo;
+ final EventListItem item = adapter.getItem(info.position);
+ if (item.isHeader()) {
+ return;
+ }
+
+ if (v.getId() == R.id.recording_list) {
+ final MenuInflater inflater = getMenuInflater();
+ // set menu title
+ final EventFormatter formatter = new EventFormatter(item);
+ menu.setHeaderTitle(formatter.getTitle());
+
+ inflater.inflate(R.menu.recording_list_item_menu, menu);
+ if (Preferences.get().isEnableRecStream() == false) {
+ menu.removeItem(R.id.recording_item_menu_stream);
+ }
+
+ }
+
+ super.onCreateContextMenu(menu, v, menuInfo);
+ //
+ // http://projects.vdr-developer.org/issues/863
+ // if (Utils.isLive(item)) {
+ menu.removeItem(R.id.epg_item_menu_live_tv);
+ // }
+ }
+
+ @Override
+ public boolean onContextItemSelected(final MenuItem item) {
+
+ final AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) item
+ .getMenuInfo();
+ final EventListItem event = adapter.getItem(info.position);
+ final Recording rec = (Recording) event.getEvent();
+ switch (item.getItemId()) {
+ case R.id.recording_item_menu_delete: {
+ final DeleteRecordingTask drt = new DeleteRecordingTask(this, rec) {
+ @Override
+ public void finished(final SvdrpEvent event) {
+ if (event == SvdrpEvent.FINISHED_SUCCESS) {
+ backupViewSelection();
+ refresh();
+ }
+ }
+ };
+ drt.start();
+ break;
+ }
+ case R.id.recording_item_menu_stream: {
+ Utils.streamRecording(this, rec);
+ // say("Sorry, not yet. It would be. File -> " + rec.getFileName());
+ break;
+ }
+
+ default:
+ return super.onContextItemSelected(item);
+ }
+ return true;
+ }
+
+ private void startRecordingQuery() {
+
+ if (checkInternetConnection() == false) {
+ return;
+ }
+
+ // get timer client
+ final RecordingClient recordingClient = new RecordingClient(getCertificateProblemDialog());
+
+ // create backgound task
+ final SvdrpAsyncTask<Recording, SvdrpClient<Recording>> task = new SvdrpAsyncTask<Recording, SvdrpClient<Recording>>(
+ recordingClient);
+
+ // create progress dialog
+
+ addListener(task);
+
+ // start task
+ task.run();
+ }
+
+ @Override
+ protected void retry() {
+ startRecordingQuery();
+ }
+
+ @Override
+ protected void refresh() {
+ startRecordingQuery();
+ }
+
+ @Override
+ protected int getMainLayout() {
+ return R.layout.recording_list;
+ }
+
+ @Override
+ protected String getWindowTitle() {
+ return getString(R.string.action_menu_recordings);
+ }
+
+ protected void sort() {
+ /* */
+ switch (sortBy) {
+ case MENU_GROUP_DEFAULT: {
+ sortItemsByTime(CACHE.get(currentFolder), true);
+ break;
+ }
+ case MENU_GROUP_ALPHABET: {
+ Collections.sort(CACHE.get(currentFolder), new TitleComparator());
+ break;
+ }
+ // case MENU_GROUP_CHANNEL: {
+ // sortItemsByChannel(results);
+ // }
+ }
+ }
+
+ @Override
+ protected void fillAdapter() {
+
+ adapter.clear();
+ final List<Recording> list = CACHE.get(currentFolder);
+ if (list == null || list.isEmpty()) {
+ return;
+ }
+
+ updateCurrentFolderInfo();
+
+ sort();
+
+ final Calendar cal = Calendar.getInstance();
+ int day = -1;
+
+ final Set<String> folders = FOLDERS.get(currentFolder);
+ if (folders != null) {
+ for (final String f : folders) {
+ final RecordingListItem recordingListItem = new RecordingListItem(f);
+ recordingListItem.folder = f;
+ final String sf = currentFolder.length() > 0 ? currentFolder
+ + Recording.FOLDERDELIMCHAR + f : f;
+ final List<Recording> list2 = CACHE.get(sf);
+ if (list2 != null) {
+ recordingListItem.count = list2.size();
+ }
+ adapter.add(recordingListItem);
+ }
+ }
+
+ for (final Event rec : CACHE.get(currentFolder)) {
+ cal.setTime(rec.getStart());
+ final int eday = cal.get(Calendar.DAY_OF_YEAR);
+ if (eday != day) {
+ day = eday;
+ adapter.add(new RecordingListItem(new DateFormatter(cal)
+ .getDailyHeader()));
+ }
+ adapter.add(new RecordingListItem((Recording) rec));
+ adapter.notifyDataSetChanged();
+ }
+
+ }
+
+ @Override
+ public void onBackPressed() {
+ if (stack.isEmpty()) {
+ super.onBackPressed();
+ } else {
+ stack.pop();
+ if (stack.isEmpty()) {
+ currentFolder = "";
+ } else {
+ currentFolder = stack.peek();
+ }
+ fillAdapter();
+ }
+
+ }
+
+ @Override
+ protected boolean finishedSuccessImpl(final List<Recording> results) {
+ clearCache();
+ for (final Recording r : results) {
+ final String folder = r.getFolder();
+ if (folder.length() > 0) {
+ final String[] split = folder.split(Recording.FOLDERDELIMCHAR);
+ String key = null;
+ String value = null;
+ if (split.length == 1) {
+ key = Recording.ROOT_FOLDER;
+ value = split[0];
+ } else {
+ value = split[split.length - 1];
+ // StringBuilder sb = new StringBuilder();
+ // String sep = "";
+ // for(int i = 0; i < split.length - 1; ++i){
+ // sb.append(sep).append(split[i]);
+ // sep = Recording.FOLDERDELIMCHAR;
+ // }
+ key = folder.subSequence(0,
+ folder.length() - (value.length() + 1)).toString();
+
+ }
+
+ Set<String> list = FOLDERS.get(key);
+ if (list == null) {
+ list = new TreeSet<String>(new Comparator<String>() {
+ @Override
+ public int compare(final String lhs, final String rhs) {
+ return lhs.compareToIgnoreCase(rhs);
+ }
+ });
+ FOLDERS.put(key, list);
+ }
+
+ list.add(value);
+
+ // a b
+ // a
+ // c
+ // a~b > k
+
+ }
+ List<Recording> list = CACHE.get(folder);
+ if (list == null) {
+ list = new ArrayList<Recording>();
+ CACHE.put(folder, list);
+ }
+ list.add(r);
+ }
+
+ pushResultCountToTitle();
+ fillAdapter();
+ return adapter.isEmpty() == false;
+ }
+
+ @Override
+ public boolean onItemLongClick(final AdapterView<?> arg0, final View arg1, final int arg2,
+ final long arg3) {
+
+ return false;
+ }
+
+ @Override
+ protected int getListNavigationIndex() {
+ return LIST_NAVIGATION_RECORDINGS;
+ }
+
+ @Override
+ public void clearCache() {
+ CACHE.clear();
+ FOLDERS.clear();
+ }
+
+ @Override
+ protected List<Recording> getCACHE() {
+
+ final List<Recording> list = CACHE.get(currentFolder);
+
+ if (list != null) {
+ return list;
+ }
+ return EMPTY;
+ }
}
diff --git a/vdrmanager/src/de/bjusystems/vdrmanager/gui/TimeEpgListActivity.java b/vdrmanager/src/de/bjusystems/vdrmanager/gui/TimeEpgListActivity.java
index caa97f0..ed323d0 100644
--- a/vdrmanager/src/de/bjusystems/vdrmanager/gui/TimeEpgListActivity.java
+++ b/vdrmanager/src/de/bjusystems/vdrmanager/gui/TimeEpgListActivity.java
@@ -9,7 +9,6 @@ import java.util.TimeZone;
import android.app.TimePickerDialog;
import android.app.TimePickerDialog.OnTimeSetListener;
-import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
@@ -40,374 +39,380 @@ import de.bjusystems.vdrmanager.utils.svdrp.SvdrpClient;
* @author bju
*/
public class TimeEpgListActivity extends BaseTimerEditActivity<Epg> implements
- OnItemClickListener, OnItemSelectedListener, OnTimeSetListener {
+OnItemClickListener, OnItemSelectedListener, OnTimeSetListener {
- protected Spinner timeSpinner;
+ protected Spinner timeSpinner;
+
+ protected View switcher;
- protected View switcher;
-
- protected View clock;
-
- ArrayAdapter<EpgSearchTimeValue> timeSpinnerAdapter;
-
- protected static Date nextForceCache = null;
-
- private static String cachedTime = null;
-
- int selectedIndex = 0;
-
- protected static ArrayList<Epg> CACHE = new ArrayList<Epg>();
-
- @Override
- public int getProgressTextId() {
- return R.string.progress_whatson_loading;
- }
-
- @Override
- protected void onCreate(final Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
-
- // create adapter for time spinner
- timeSpinnerAdapter = new ArrayAdapter<EpgSearchTimeValue>(this,
- android.R.layout.simple_spinner_item);
- timeSpinnerAdapter
- .setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
- timeSpinner = (Spinner) findViewById(R.id.epg_list_time_spinner);
- timeSpinner.setAdapter(timeSpinnerAdapter);
-
- switcher = findViewById(R.id.switch_epg_view);
- switcher.setOnClickListener(this);
-
- clock = findViewById(R.id.epg_list_times);
- clock.setOnClickListener(this);
-
- // update gui
- adapter = new TimeEventAdapter(this);
- // searchLabel.setVisibility(View.GONE);
- timeSpinner.setOnItemSelectedListener(this);
-
- fillTimeSpinnerValues();
-
- // Create adapter for EPG list
- listView = (ListView) findViewById(R.id.whatson_list);
- listView.setFastScrollEnabled(true);
- listView.setTextFilterEnabled(true);
-
- listView.setAdapter(adapter);
- registerForContextMenu(listView);
-
- // register EPG item click
- listView.setOnItemClickListener(this);
-
- }
-
- private void fillTimeSpinnerValues() {
- final EpgSearchTimeValues values = new EpgSearchTimeValues(this);
- timeSpinnerAdapter.clear();
- for (final EpgSearchTimeValue value : values.getValues()) {
- timeSpinnerAdapter.add(value);
- }
- }
-
- @Override
- protected void onResume() {
- super.onResume();
- }
-
- @Override
- protected void onPause() {
- super.onPause();
-
- }
-
- @Override
- public void onClick(View view) {
- if (view == switcher) {
- final Intent intent = new Intent();
- intent.setClass(this, EventEpgListActivity.class);
- intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT
- | Intent.FLAG_ACTIVITY_SINGLE_TOP);
- startActivity(intent);
- finish();
- } else if (view == clock) {
- Intent intent = new Intent();
- intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT
- | Intent.FLAG_ACTIVITY_SINGLE_TOP);
- intent.setClass(this, EpgSearchTimesListActivity.class);
- startActivity(intent);
- } else {
- super.onClick(view);
- }
- }
-
- public void onTimeSet(final TimePicker view, final int hourOfDay,
- final int minute) {
- String tm = String.format("%02d:%02d", hourOfDay, minute);
-
- // timeSpinnerAdapter.add(time);
- final EpgSearchTimeValues values = new EpgSearchTimeValues(this);
- List<EpgSearchTimeValue> vs = values.getValues();
- final EpgSearchTimeValue time = new EpgSearchTimeValue(3, tm);
- vs.add(vs.size() - 1, time);
- timeSpinnerAdapter.clear();
- int select = -1;
- int counter = 0;
- for (final EpgSearchTimeValue value : vs) {
- timeSpinnerAdapter.add(value);
- if (select == -1 && value.getText().equals(tm)) {
- select = counter;
- }
- counter++;
- }
- timeSpinner.setSelection(select);
- setTitle(resolveWindowTitle());
- // update search
- startEpgQuery(time.getValue(), false);
- }
-
- private String resolveWindowTitle() {
- if (timeSpinner == null) {
- return getString(R.string.epg_by_time);
- }
- EpgSearchTimeValue v = (EpgSearchTimeValue) timeSpinner
- .getSelectedItem();
- if (v == null) {
- return getString(R.string.epg_by_time);
- }
- return getString(R.string.epg_by_time_args, v.getText());
- }
-
- public void onItemSelected(final AdapterView<?> parent, final View view,
- final int position, final long id) {
-
- // get spinner value
- final EpgSearchTimeValue selection = (EpgSearchTimeValue) timeSpinner
- .getSelectedItem();
-
- if (selection.getValue().equals("adhoc")) {
- final Calendar cal = Calendar.getInstance(TimeZone.getDefault());
- // show time selection
- final TimePickerDialog dialog = new TimePickerDialog(this, this,
- cal.get(Calendar.HOUR_OF_DAY), cal.get(Calendar.MINUTE),
- Preferences.get().isUse24hFormat());
-// dialog.setOnDismissListener(new OnDismissListener() {
-
- // @Override
- // public void onDismiss(DialogInterface dialog) {
-
-
- // }
- //});
-
- dialog.show();
- } else {
- // update search
- setTitle(getString(R.string.epg_by_time_args, selection.getText()));
- startEpgQuery(selection.getValue(), false);
- }
- }
-
- public void onNothingSelected(final AdapterView<?> arg0) {
- // startTimeEpgQuery(((EpgTimeSpinnerValue)timeSpinner.getAdapter().getItem(0)).getValue());
- }
-
- public void clearCache() {
- super.clearCache();
- cachedTime = null;
- }
-
- private boolean useCache(String time) {
-
- if (cachedTime == null) {
- return false;
- }
-
- if (cachedTime.equals(time) == false) {
- return false;
- }
-
- if (nextForceCache == null) {
- return false;
- }
- Date now = new Date();
- if (nextForceCache.before(now)) {
- return false;
- }
- return true;
- }
-
- private void startEpgQuery(String time, boolean force) {
-
- if (useCache(time) && !force) {
- fillAdapter();
- return;
- }
-
- if (checkInternetConnection() == false) {
- return;
- }
-
- EpgClient epgClient = new EpgClient(time);
-
- // remove old listeners
- // epgClient.clearSvdrpListener();
-
- // create background task
- final SvdrpAsyncTask<Epg, SvdrpClient<Epg>> task = new SvdrpAsyncTask<Epg, SvdrpClient<Epg>>(
- epgClient);
-
- // create progress
- addListener(task);
-
- // start task
- task.run();
- }
-
- @Override
- protected synchronized void fillAdapter() {
-
- adapter.clear();
-
- if (CACHE.isEmpty()) {
- return;
- }
-
- sort();
- listView.setFastScrollEnabled(false);
- adapter.add(new EventListItem(
- new DateFormatter(CACHE.get(0).getStart()).getDailyHeader()));
-
- for (Event e : CACHE) {
- adapter.add(new EventListItem((Epg) e));
- }
- adapter.notifyDataSetChanged();
- listView.setFastScrollEnabled(true);
- }
-
- void sort() {
- if (sortBy == BaseEventListActivity.MENU_GROUP_ALPHABET) {
- Collections.sort(CACHE, new TitleComparator());
- } else if (sortBy == BaseEventListActivity.MENU_GROUP_DEFAULT) {
- Collections.sort(CACHE, new ChannelComparator());
- }
- }
-
- @Override
- protected int getAvailableSortByEntries() {
- return R.array.epg_sort_by_channels_alpha;
- }
-
- protected String getViewID() {
- return TimeEpgListActivity.class.getSimpleName();
- }
-
- @Override
- protected boolean finishedSuccessImpl(List<Epg> results) {
- clearCache();
-
- if (results.isEmpty()) {
- return false;
- }
-
- // get spinner value
- final EpgSearchTimeValue selection = (EpgSearchTimeValue) timeSpinner
- .getSelectedItem();
- nextForceCache = FUTURE;
- cachedTime = selection.getValue();
- Date now = new Date();
-
- // adapter.add(new EventListItem(new DateFormatter(results.get(0)
- // .getStart()).getDailyHeader()));
-
- for (Epg e : results) {
- CACHE.add(e);
- if (e.getStop().before(nextForceCache) && e.getStop().after(now)) {
- nextForceCache = e.getStop();
- }
- }
- fillAdapter();
- pushResultCountToTitle();
- listView.setSelectionAfterHeaderView();
- return results.isEmpty() == false;
-
- }
-
- protected void prepareDetailsViewData(final EventListItem item) {
- final VdrManagerApp app = (VdrManagerApp) getApplication();
-
- // remember event for details view and timer things
- app.setCurrentEvent(item.getEvent());
- app.setCurrentEpgList(CACHE);
- }
-
- @Override
- protected int getMainLayout() {
- return R.layout.time_epg_list;
- }
-
- @Override
- protected void refresh() {
- // get spi
- final EpgSearchTimeValue selection = (EpgSearchTimeValue) timeSpinner
- .getSelectedItem();
- // update search
- startEpgQuery(selection.getValue(), true);
- }
-
- @Override
- protected void retry() {
- refresh();
- }
-
- @Override
- protected String getWindowTitle() {
- return resolveWindowTitle();
- }
-
- private void nextEvent() {
- int pos = timeSpinner.getSelectedItemPosition();
- if (pos + 1 >= timeSpinnerAdapter.getCount()) {
- say(R.string.navigae_at_the_end);
- return;
- }
- timeSpinner.setSelection(pos + 1, true);
- }
-
- private void prevEvent() {
- int pos = timeSpinner.getSelectedItemPosition();
- if (pos <= 0) {
- say(R.string.navigae_at_the_start);
- return;
- }
- timeSpinner.setSelection(pos - 1, true);
- }
-
- @Override
- public void onSwipe(int direction) {
- switch (direction) {
- case SimpleGestureFilter.SWIPE_RIGHT:
- prevEvent();
- break;
- case SimpleGestureFilter.SWIPE_LEFT:
- nextEvent();
- break;
- }
- }
-
- @Override
- protected int getListNavigationIndex() {
- return LIST_NAVIGATION_EPG_BY_TIME;
- }
-
- @Override
- protected List<Epg> getCACHE() {
- return CACHE;
- }
-
- @Override
- protected void timerModified(Timer timer) {
- clearCache();
- super.timerModified(timer);
- }
+ protected View clock;
+
+ ArrayAdapter<EpgSearchTimeValue> timeSpinnerAdapter;
+
+ protected static Date nextForceCache = null;
+
+ private static String cachedTime = null;
+
+ int selectedIndex = 0;
+
+ protected static ArrayList<Epg> CACHE = new ArrayList<Epg>();
+
+ @Override
+ public int getProgressTextId() {
+ return R.string.progress_whatson_loading;
+ }
+
+ @Override
+ protected void onCreate(final Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ // create adapter for time spinner
+ timeSpinnerAdapter = new ArrayAdapter<EpgSearchTimeValue>(this,
+ android.R.layout.simple_spinner_item);
+ timeSpinnerAdapter
+ .setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
+ timeSpinner = (Spinner) findViewById(R.id.epg_list_time_spinner);
+ timeSpinner.setAdapter(timeSpinnerAdapter);
+
+ switcher = findViewById(R.id.switch_epg_view);
+ switcher.setOnClickListener(this);
+
+ clock = findViewById(R.id.epg_list_times);
+ clock.setOnClickListener(this);
+
+ // update gui
+ adapter = new TimeEventAdapter(this);
+ // searchLabel.setVisibility(View.GONE);
+ timeSpinner.setOnItemSelectedListener(this);
+
+ fillTimeSpinnerValues();
+
+ // Create adapter for EPG list
+ listView = (ListView) findViewById(R.id.whatson_list);
+ listView.setFastScrollEnabled(true);
+ listView.setTextFilterEnabled(true);
+
+ listView.setAdapter(adapter);
+ registerForContextMenu(listView);
+
+ // register EPG item click
+ listView.setOnItemClickListener(this);
+
+ }
+
+ private void fillTimeSpinnerValues() {
+ final EpgSearchTimeValues values = new EpgSearchTimeValues(this);
+ timeSpinnerAdapter.clear();
+ for (final EpgSearchTimeValue value : values.getValues()) {
+ timeSpinnerAdapter.add(value);
+ }
+ }
+
+ @Override
+ protected void onResume() {
+ super.onResume();
+ }
+
+ @Override
+ protected void onPause() {
+ super.onPause();
+
+ }
+
+ @Override
+ public void onClick(final View view) {
+ if (view == switcher) {
+ final Intent intent = new Intent();
+ intent.setClass(this, EventEpgListActivity.class);
+ intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT
+ | Intent.FLAG_ACTIVITY_SINGLE_TOP);
+ startActivity(intent);
+ finish();
+ } else if (view == clock) {
+ final Intent intent = new Intent();
+ intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT
+ | Intent.FLAG_ACTIVITY_SINGLE_TOP);
+ intent.setClass(this, EpgSearchTimesListActivity.class);
+ startActivity(intent);
+ } else {
+ super.onClick(view);
+ }
+ }
+
+ @Override
+ public void onTimeSet(final TimePicker view, final int hourOfDay,
+ final int minute) {
+ final String tm = String.format("%02d:%02d", hourOfDay, minute);
+
+ // timeSpinnerAdapter.add(time);
+ final EpgSearchTimeValues values = new EpgSearchTimeValues(this);
+ final List<EpgSearchTimeValue> vs = values.getValues();
+ final EpgSearchTimeValue time = new EpgSearchTimeValue(3, tm);
+ vs.add(vs.size() - 1, time);
+ timeSpinnerAdapter.clear();
+ int select = -1;
+ int counter = 0;
+ for (final EpgSearchTimeValue value : vs) {
+ timeSpinnerAdapter.add(value);
+ if (select == -1 && value.getText().equals(tm)) {
+ select = counter;
+ }
+ counter++;
+ }
+ timeSpinner.setSelection(select);
+ setTitle(resolveWindowTitle());
+ // update search
+ startEpgQuery(time.getValue(), false);
+ }
+
+ private String resolveWindowTitle() {
+ if (timeSpinner == null) {
+ return getString(R.string.epg_by_time);
+ }
+ final EpgSearchTimeValue v = (EpgSearchTimeValue) timeSpinner
+ .getSelectedItem();
+ if (v == null) {
+ return getString(R.string.epg_by_time);
+ }
+ return getString(R.string.epg_by_time_args, v.getText());
+ }
+
+ @Override
+ public void onItemSelected(final AdapterView<?> parent, final View view,
+ final int position, final long id) {
+
+ // get spinner value
+ final EpgSearchTimeValue selection = (EpgSearchTimeValue) timeSpinner
+ .getSelectedItem();
+
+ if (selection.getValue().equals("adhoc")) {
+ final Calendar cal = Calendar.getInstance(TimeZone.getDefault());
+ // show time selection
+ final TimePickerDialog dialog = new TimePickerDialog(this, this,
+ cal.get(Calendar.HOUR_OF_DAY), cal.get(Calendar.MINUTE),
+ Preferences.get().isUse24hFormat());
+ // dialog.setOnDismissListener(new OnDismissListener() {
+
+ // @Override
+ // public void onDismiss(DialogInterface dialog) {
+
+
+ // }
+ //});
+
+ dialog.show();
+ } else {
+ // update search
+ setTitle(getString(R.string.epg_by_time_args, selection.getText()));
+ startEpgQuery(selection.getValue(), false);
+ }
+ }
+
+ @Override
+ public void onNothingSelected(final AdapterView<?> arg0) {
+ // startTimeEpgQuery(((EpgTimeSpinnerValue)timeSpinner.getAdapter().getItem(0)).getValue());
+ }
+
+ @Override
+ public void clearCache() {
+ super.clearCache();
+ cachedTime = null;
+ }
+
+ private boolean useCache(final String time) {
+
+ if (cachedTime == null) {
+ return false;
+ }
+
+ if (cachedTime.equals(time) == false) {
+ return false;
+ }
+
+ if (nextForceCache == null) {
+ return false;
+ }
+ final Date now = new Date();
+ if (nextForceCache.before(now)) {
+ return false;
+ }
+ return true;
+ }
+
+ private void startEpgQuery(final String time, final boolean force) {
+
+ if (useCache(time) && !force) {
+ fillAdapter();
+ return;
+ }
+
+ if (checkInternetConnection() == false) {
+ return;
+ }
+
+ final EpgClient epgClient = new EpgClient(time, getCertificateProblemDialog());
+
+ // remove old listeners
+ // epgClient.clearSvdrpListener();
+
+ // create background task
+ final SvdrpAsyncTask<Epg, SvdrpClient<Epg>> task = new SvdrpAsyncTask<Epg, SvdrpClient<Epg>>(
+ epgClient);
+
+ // create progress
+ addListener(task);
+
+ // start task
+ task.run();
+ }
+
+ @Override
+ protected synchronized void fillAdapter() {
+
+ adapter.clear();
+
+ if (CACHE.isEmpty()) {
+ return;
+ }
+
+ sort();
+ listView.setFastScrollEnabled(false);
+ adapter.add(new EventListItem(
+ new DateFormatter(CACHE.get(0).getStart()).getDailyHeader()));
+
+ for (final Event e : CACHE) {
+ adapter.add(new EventListItem(e));
+ }
+ adapter.notifyDataSetChanged();
+ listView.setFastScrollEnabled(true);
+ }
+
+ void sort() {
+ if (sortBy == BaseEventListActivity.MENU_GROUP_ALPHABET) {
+ Collections.sort(CACHE, new TitleComparator());
+ } else if (sortBy == BaseEventListActivity.MENU_GROUP_DEFAULT) {
+ Collections.sort(CACHE, new ChannelComparator());
+ }
+ }
+
+ @Override
+ protected int getAvailableSortByEntries() {
+ return R.array.epg_sort_by_channels_alpha;
+ }
+
+ @Override
+ protected String getViewID() {
+ return TimeEpgListActivity.class.getSimpleName();
+ }
+
+ @Override
+ protected boolean finishedSuccessImpl(final List<Epg> results) {
+ clearCache();
+
+ if (results.isEmpty()) {
+ return false;
+ }
+
+ // get spinner value
+ final EpgSearchTimeValue selection = (EpgSearchTimeValue) timeSpinner
+ .getSelectedItem();
+ nextForceCache = FUTURE;
+ cachedTime = selection.getValue();
+ final Date now = new Date();
+
+ // adapter.add(new EventListItem(new DateFormatter(results.get(0)
+ // .getStart()).getDailyHeader()));
+
+ for (final Epg e : results) {
+ CACHE.add(e);
+ if (e.getStop().before(nextForceCache) && e.getStop().after(now)) {
+ nextForceCache = e.getStop();
+ }
+ }
+ fillAdapter();
+ pushResultCountToTitle();
+ listView.setSelectionAfterHeaderView();
+ return results.isEmpty() == false;
+
+ }
+
+ @Override
+ protected void prepareDetailsViewData(final EventListItem item) {
+ final VdrManagerApp app = (VdrManagerApp) getApplication();
+
+ // remember event for details view and timer things
+ app.setCurrentEvent(item.getEvent());
+ app.setCurrentEpgList(CACHE);
+ }
+
+ @Override
+ protected int getMainLayout() {
+ return R.layout.time_epg_list;
+ }
+
+ @Override
+ protected void refresh() {
+ // get spi
+ final EpgSearchTimeValue selection = (EpgSearchTimeValue) timeSpinner
+ .getSelectedItem();
+ // update search
+ startEpgQuery(selection.getValue(), true);
+ }
+
+ @Override
+ protected void retry() {
+ refresh();
+ }
+
+ @Override
+ protected String getWindowTitle() {
+ return resolveWindowTitle();
+ }
+
+ private void nextEvent() {
+ final int pos = timeSpinner.getSelectedItemPosition();
+ if (pos + 1 >= timeSpinnerAdapter.getCount()) {
+ say(R.string.navigae_at_the_end);
+ return;
+ }
+ timeSpinner.setSelection(pos + 1, true);
+ }
+
+ private void prevEvent() {
+ final int pos = timeSpinner.getSelectedItemPosition();
+ if (pos <= 0) {
+ say(R.string.navigae_at_the_start);
+ return;
+ }
+ timeSpinner.setSelection(pos - 1, true);
+ }
+
+ @Override
+ public void onSwipe(final int direction) {
+ switch (direction) {
+ case SimpleGestureFilter.SWIPE_RIGHT:
+ prevEvent();
+ break;
+ case SimpleGestureFilter.SWIPE_LEFT:
+ nextEvent();
+ break;
+ }
+ }
+
+ @Override
+ protected int getListNavigationIndex() {
+ return LIST_NAVIGATION_EPG_BY_TIME;
+ }
+
+ @Override
+ protected List<Epg> getCACHE() {
+ return CACHE;
+ }
+
+ @Override
+ protected void timerModified(final Timer timer) {
+ clearCache();
+ super.timerModified(timer);
+ }
}
diff --git a/vdrmanager/src/de/bjusystems/vdrmanager/gui/TimerListActivity.java b/vdrmanager/src/de/bjusystems/vdrmanager/gui/TimerListActivity.java
index 45a75ca..9bb2361 100644
--- a/vdrmanager/src/de/bjusystems/vdrmanager/gui/TimerListActivity.java
+++ b/vdrmanager/src/de/bjusystems/vdrmanager/gui/TimerListActivity.java
@@ -24,255 +24,256 @@ import de.bjusystems.vdrmanager.utils.svdrp.TimerClient;
* @author bju
*/
public class TimerListActivity extends BaseTimerEditActivity<Timer> implements
- OnItemClickListener {
-
- private static final int MENU_NEW_TIMER = 2;
-
- private static final int MENU_GROUP_NEW_TIMER = 2;
-
- protected static ArrayList<Timer> CACHE = new ArrayList<Timer>();
-
- /*
- * (non-Javadoc)
- *
- * @see
- * de.bjusystems.vdrmanager.gui.BaseEventListActivity#onCreate(android.os
- * .Bundle)
- */
- @Override
- protected void onCreate(final Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- // Attach view
- // setContentView(getMainLayout());
-
- // create an adapter
- adapter = new TimeEventAdapter(this);
-
- // attach adapter to ListView
- listView = (ListView) findViewById(R.id.timer_list);
- listView.setAdapter(adapter);
- listView.setFastScrollEnabled(true);
- listView.setTextFilterEnabled(true);
-
- // set click listener
- listView.setOnItemClickListener(this);
-
- // context menu wanted
- registerForContextMenu(listView);
-
- // start query
- startTimerQuery();
- }
-
- @Override
- protected void onPause() {
- super.onPause();
- }
-
- private void startTimerQuery() {
-
- if (checkInternetConnection() == false) {
- return;
- }
-
- // get timer client
- TimerClient timerClient = new TimerClient();
-
- // create backgound task
- final SvdrpAsyncTask<Timer, SvdrpClient<Timer>> task = new SvdrpAsyncTask<Timer, SvdrpClient<Timer>>(
- timerClient);
-
- // create progress dialog
- // progress = new SvdrpProgressDialog(this, timerClient);
-
- // attach listener
- // task.addListener(progress);
- addListener(task);
-
- // start task
- task.run();
- }
-
- /*
- * (non-Javadoc)
- *
- * @see
- * de.bjusystems.vdrmanager.gui.BaseTimerEditActivity#getTimer(de.bjusystems
- * .vdrmanager.data.EventListItem)
- */
- @Override
- protected Timer getTimer(EventListItem item) {
- return (Timer) item.getEvent();
- }
-
- /*
- * (non-Javadoc)
- *
- * @see
- * de.bjusystems.vdrmanager.gui.BaseEventListActivity#prepareTimer(de.bjusystems
- * .vdrmanager.data.EventListItem)
- */
- protected void prepareDetailsViewData(final EventListItem item) {
- final VdrManagerApp app = (VdrManagerApp) getApplication();
- // remember event for details view and timer things
- app.setCurrentEvent(item.getEvent());
- app.setCurrentEpgList(CACHE);
- }
-
- protected Comparator<Timer> getTimeComparator(boolean reverse) {
- return new Comparator<Timer>() {
- TimeAndChannelComparator c = new TimeAndChannelComparator();
- @Override
- public int compare(Timer item1, Timer item2) {
- if (item1.isRecurring()) {
- return 1;
- }
- if (item2.isRecurring()) {
- return -1;
- }
- return c.compare(item1, item2);
- }
-
- };
- }
-
-
-
- @Override
- protected boolean finishedSuccessImpl(List<Timer> results) {
- clearCache();
- for(Timer r :results){
- CACHE.add(r);
- }
- pushResultCountToTitle();
- fillAdapter();
- return adapter.isEmpty() == false;
-
- }
-
-
- protected void sort() {
- /* */
- switch (sortBy) {
- case MENU_GROUP_DEFAULT: {
- Collections.sort(CACHE, getTimeComparator(false));
- break;
- }
- case MENU_GROUP_ALPHABET: {
- Collections.sort(CACHE, new TitleComparator());
- break;
- }
- //case MENU_GROUP_CHANNEL: {
- //sortItemsByChannel(results);
- //}
- }
- }
-
-
- @Override
- protected void fillAdapter() {
-
- adapter.clear();
-
- if (CACHE.isEmpty()) {
- return;
- }
-
- sort();
-
- int day = -1;
- Calendar cal = Calendar.getInstance();
-
- for (Timer e : CACHE) {
- if (e.isRecurring()) {
- adapter.add(new EventListItem(e.getWeekdays()));
- } else {
- 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));
- }
- adapter.notifyDataSetChanged();
- }
-
-// protected boolean finishedSuccessImpl() {
-// adapter.clear();
-// sortItemsByTime(results);
-// int day = -1;
-// Calendar cal = Calendar.getInstance();
-// for (Timer e : results) {
-// if (e.isRecurring()) {
-// adapter.add(new EventListItem(e.getWeekdays()));
-// } else {
-// 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();
-// return adapter.isEmpty() == false;
-// }
-
- @Override
- protected boolean notifyDataSetChangedOnResume() {
- return true;
- }
-
- @Override
- protected String getWindowTitle() {
- return getString(R.string.action_menu_timers);
- }
-
- @Override
- protected int getMainLayout() {
- return R.layout.timer_list;
- }
-
- @Override
- protected void refresh() {
- startTimerQuery();
- }
-
- @Override
- protected void retry() {
- refresh();
- }
-
- @Override
- protected int getAvailableSortByEntries() {
- return R.array.epg_sort_by_time_alpha;
- }
-
- public boolean onCreateOptionsMenu(final com.actionbarsherlock.view.Menu menu) {
- // MenuItem item;
- // item = menu.add(MENU_GROUP_NEW_TIMER, MENU_NEW_TIMER, 0,
- // R.string.new_timer);
- // item.setIcon(android.R.drawable.ic_menu_add);;
- // /item.setAlphabeticShortcut('r');
-
- final com.actionbarsherlock.view.MenuInflater inflater = getSupportMenuInflater();
- inflater.inflate(R.menu.timer_list_menu, menu);
- return super.onCreateOptionsMenu(menu);
- }
-
- @Override
- protected int getListNavigationIndex() {
- return LIST_NAVIGATION_TIMERS;
- }
-
- @Override
- protected List<Timer> getCACHE() {
- return CACHE;
- }
+OnItemClickListener {
+
+ private static final int MENU_NEW_TIMER = 2;
+
+ private static final int MENU_GROUP_NEW_TIMER = 2;
+
+ protected static ArrayList<Timer> CACHE = new ArrayList<Timer>();
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * de.bjusystems.vdrmanager.gui.BaseEventListActivity#onCreate(android.os
+ * .Bundle)
+ */
+ @Override
+ protected void onCreate(final Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ // Attach view
+ // setContentView(getMainLayout());
+
+ // create an adapter
+ adapter = new TimeEventAdapter(this);
+
+ // attach adapter to ListView
+ listView = (ListView) findViewById(R.id.timer_list);
+ listView.setAdapter(adapter);
+ listView.setFastScrollEnabled(true);
+ listView.setTextFilterEnabled(true);
+
+ // set click listener
+ listView.setOnItemClickListener(this);
+
+ // context menu wanted
+ registerForContextMenu(listView);
+
+ // start query
+ startTimerQuery();
+ }
+
+ @Override
+ protected void onPause() {
+ super.onPause();
+ }
+
+ private void startTimerQuery() {
+
+ if (checkInternetConnection() == false) {
+ return;
+ }
+
+ // get timer client
+ final TimerClient timerClient = new TimerClient(getCertificateProblemDialog());
+
+ // create backgound task
+ final SvdrpAsyncTask<Timer, SvdrpClient<Timer>> task = new SvdrpAsyncTask<Timer, SvdrpClient<Timer>>(
+ timerClient);
+
+ // create progress dialog
+ // progress = new SvdrpProgressDialog(this, timerClient);
+
+ // attach listener
+ // task.addListener(progress);
+ addListener(task);
+
+ // start task
+ task.run();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * de.bjusystems.vdrmanager.gui.BaseTimerEditActivity#getTimer(de.bjusystems
+ * .vdrmanager.data.EventListItem)
+ */
+ @Override
+ protected Timer getTimer(final EventListItem item) {
+ return (Timer) item.getEvent();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * de.bjusystems.vdrmanager.gui.BaseEventListActivity#prepareTimer(de.bjusystems
+ * .vdrmanager.data.EventListItem)
+ */
+ @Override
+ protected void prepareDetailsViewData(final EventListItem item) {
+ final VdrManagerApp app = (VdrManagerApp) getApplication();
+ // remember event for details view and timer things
+ app.setCurrentEvent(item.getEvent());
+ app.setCurrentEpgList(CACHE);
+ }
+
+ protected Comparator<Timer> getTimeComparator(final boolean reverse) {
+ return new Comparator<Timer>() {
+ TimeAndChannelComparator c = new TimeAndChannelComparator();
+ @Override
+ public int compare(final Timer item1, final Timer item2) {
+ if (item1.isRecurring()) {
+ return 1;
+ }
+ if (item2.isRecurring()) {
+ return -1;
+ }
+ return c.compare(item1, item2);
+ }
+
+ };
+ }
+
+
+
+ @Override
+ protected boolean finishedSuccessImpl(final List<Timer> results) {
+ clearCache();
+ for(final Timer r :results){
+ CACHE.add(r);
+ }
+ pushResultCountToTitle();
+ fillAdapter();
+ return adapter.isEmpty() == false;
+
+ }
+
+
+ protected void sort() {
+ /* */
+ switch (sortBy) {
+ case MENU_GROUP_DEFAULT: {
+ Collections.sort(CACHE, getTimeComparator(false));
+ break;
+ }
+ case MENU_GROUP_ALPHABET: {
+ Collections.sort(CACHE, new TitleComparator());
+ break;
+ }
+ //case MENU_GROUP_CHANNEL: {
+ //sortItemsByChannel(results);
+ //}
+ }
+ }
+
+
+ @Override
+ protected void fillAdapter() {
+
+ adapter.clear();
+
+ if (CACHE.isEmpty()) {
+ return;
+ }
+
+ sort();
+
+ int day = -1;
+ final Calendar cal = Calendar.getInstance();
+
+ for (final Timer e : CACHE) {
+ if (e.isRecurring()) {
+ adapter.add(new EventListItem(e.getWeekdays()));
+ } else {
+ cal.setTime(e.getStart());
+ final 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));
+ }
+ adapter.notifyDataSetChanged();
+ }
+
+ // protected boolean finishedSuccessImpl() {
+ // adapter.clear();
+ // sortItemsByTime(results);
+ // int day = -1;
+ // Calendar cal = Calendar.getInstance();
+ // for (Timer e : results) {
+ // if (e.isRecurring()) {
+ // adapter.add(new EventListItem(e.getWeekdays()));
+ // } else {
+ // 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();
+ // return adapter.isEmpty() == false;
+ // }
+
+ @Override
+ protected boolean notifyDataSetChangedOnResume() {
+ return true;
+ }
+
+ @Override
+ protected String getWindowTitle() {
+ return getString(R.string.action_menu_timers);
+ }
+
+ @Override
+ protected int getMainLayout() {
+ return R.layout.timer_list;
+ }
+
+ @Override
+ protected void refresh() {
+ startTimerQuery();
+ }
+
+ @Override
+ protected void retry() {
+ refresh();
+ }
+
+ @Override
+ protected int getAvailableSortByEntries() {
+ return R.array.epg_sort_by_time_alpha;
+ }
+
+ public boolean onCreateOptionsMenu(final com.actionbarsherlock.view.Menu menu) {
+ // MenuItem item;
+ // item = menu.add(MENU_GROUP_NEW_TIMER, MENU_NEW_TIMER, 0,
+ // R.string.new_timer);
+ // item.setIcon(android.R.drawable.ic_menu_add);;
+ // /item.setAlphabeticShortcut('r');
+
+ final com.actionbarsherlock.view.MenuInflater inflater = getSupportMenuInflater();
+ inflater.inflate(R.menu.timer_list_menu, menu);
+ return super.onCreateOptionsMenu(menu);
+ }
+
+ @Override
+ protected int getListNavigationIndex() {
+ return LIST_NAVIGATION_TIMERS;
+ }
+
+ @Override
+ protected List<Timer> getCACHE() {
+ return CACHE;
+ }
}
diff --git a/vdrmanager/src/de/bjusystems/vdrmanager/gui/Utils.java b/vdrmanager/src/de/bjusystems/vdrmanager/gui/Utils.java
index 06e2522..b0aae06 100644
--- a/vdrmanager/src/de/bjusystems/vdrmanager/gui/Utils.java
+++ b/vdrmanager/src/de/bjusystems/vdrmanager/gui/Utils.java
@@ -44,422 +44,425 @@ 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(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());
- }
-
- public static int getProgress(Event e) {
- if(e instanceof Recording == false){
- return getProgress(e.getStart(), e.getStop());
- }
- 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(long now, long start, long stop) {
- if (now >= start && now <= stop) {
- long dura = stop - start;
- long prog = now - start;
- return (int) (prog * 100 / dura);
- }
- return -1;
- }
-
- public static boolean isLive(Event event) {
- long now = System.currentTimeMillis();
- return now >= event.getStart().getTime()
- && now <= event.getStop().getTime();
- }
-
- private static String trimToEmpty(String str) {
- if (str == null) {
- return "";
- }
- if (TextUtils.isEmpty(str)) {
- return "";
- }
- return str;
- }
-
- private static String getBaseUrl() {
- StringBuilder sb = new StringBuilder();
- Preferences p = Preferences.getPreferences();
- String auth = trimToEmpty(p.getStreamingUsername()) + ":"
- + trimToEmpty(p.getStreamingPassword());
- if (auth.length() == 1) {
- auth = "";
- } else {
- auth += "@";
- }
-
- sb.append("http://").append(auth).append(p.getSvdrpHost()).append(":")
- .append(p.getStreamPort());
- return sb.toString();
- }
-
- private static String getStreamUrl(String chn) {
- // "http://192.168.1.119:3000/TS/"
- Preferences p = Preferences.getPreferences();
- StringBuilder sb = new StringBuilder();
- sb.append(getBaseUrl()).append("/").append(p.getStreamFormat())
- .append("/").append(chn);
-
- return sb.toString();
- }
-
- private static String getRemuxStreamUrl(String chn) {
- // "http://192.168.1.119:3000/TS/"
- StringBuilder sb = new StringBuilder();
- Preferences p = Preferences.getPreferences();
- sb.append(getBaseUrl()).append("/").append(p.getRemuxCommand())
- .append(";").append(p.getRemuxParameter()).append("/")
- .append(chn);
- return sb.toString();
- }
-
- public static void stream(final Activity activity, Event event) {
- stream(activity, event.getStreamId());
- }
-
- public static void stream(final Activity activity, Channel channel) {
- stream(activity, channel.getId());
- }
-
- public static void stream(final Activity activity, final String idornr) {
-
- if (Preferences.get().isEnableRemux() == false) {
- String url = getStreamUrl(idornr);
- startStream(activity, url);
- return;
- }
-
- String sf = Preferences.get().getStreamFormat();
- 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() {
- public void onClick(DialogInterface dialog,
- 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(Activity activity, String url) {
- try {
- final Intent intent = new Intent(Intent.ACTION_VIEW);
- intent.setDataAndType(Uri.parse(url.toString()), "video/*");
- activity.startActivityForResult(intent, 1);
- } catch (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
- MessageDigest digest = java.security.MessageDigest
- .getInstance("MD5");
- digest.update(s.getBytes());
- byte messageDigest[] = digest.digest();
-
- // Create Hex String
- 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 (NoSuchAlgorithmException e) {
- Log.w(TAG, e);
- }
- return "";
- }
-
- public static int getDuration(Event event) {
- long millis = event.getDuration();
- int minuts = (int) (millis / 1000 / 60);
- return minuts;
- }
-
- public static void shareEvent(Activity activity, 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");
- EventFormatter ef = new EventFormatter(event, false);
- sb.append(ef.getDate()).append(" ").append(ef.getTime());
- 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(Activity activity, Event event) {
- 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(String src) {
- if (src == null) {
- return "";
- }
- return src.replace("|##", C.DATA_SEPARATOR).replace("||#", "\n");
- }
-
- public static String unMapSpecialChars(String src) {
- if (src == null) {
- return "";
- }
- return src.replace(C.DATA_SEPARATOR, "|##").replace("\n", "||#");
- }
-
- public static PackageInfo getPackageInfo(Context ctx) {
- PackageInfo pi = null;
- try {
- pi = ctx.getPackageManager().getPackageInfo(ctx.getPackageName(),
- PackageManager.GET_ACTIVITIES);
- } catch (PackageManager.NameNotFoundException e) {
- e.printStackTrace();
- }
- return pi;
- }
-
- public static boolean checkInternetConnection(Context ctx) {
- 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(Activity ctx, Recording rec) {
-
- String m = Preferences.get().getRecStreamMethod();
-
- StringBuilder url = new StringBuilder();
-
- if (StringUtils.equals(m, "vdr-live")) {
- url.append("http://")
- .append(Preferences.get().getSvdrpHost())
- //
- .append(":")
- .append(Integer.valueOf(Preferences.get().getLivePort()))
- //
- .append("/recstream.html?recid=recording_")
- .append(Utils.md5(rec.getFileName()));
- // http://192.168.1.119:8008/b0cdedeed2d36508dfd924f0876a851b
- String urlstring = url.toString();
- return urlstring;
- } else if (StringUtils.equals(m, "vdr-streamdev")) {
- url.append("http://").append(Preferences.get().getSvdrpHost())
- //
- .append(":")
- .append(Integer.valueOf(Preferences.get().getStreamPort()))
- //
- .append("/").append(rec.getDevInode());
- }
- return url.toString();
- }
-
- public static void streamRecording(Activity ctx, Recording rec) {
- String urlstring = getRecordingStream(ctx, rec);
- Log.d(TAG, "try stream: " + urlstring);
- Utils.startStream(ctx, urlstring);
- }
-
- public static void switchTo(final Context ctx, final Channel channel) {
- switchTo(ctx, channel.getId(), channel.getName());
- }
-
- /**
- * @param ctx
- * @param id
- * @param name
- * Optional für die Anzeige
- */
- public static void switchTo(final Context ctx, final String id,
- final String name) {
-
- final SwitchChannelClient scc = new SwitchChannelClient(id);
- SvdrpAsyncTask<String, SwitchChannelClient> task = new SvdrpAsyncTask<String, SwitchChannelClient>(
- scc);
- task.addSvdrpListener(new SvdrpListener() {
- public void svdrpEvent(SvdrpEvent event) {
- if (event == SvdrpEvent.FINISHED_SUCCESS) {
- Utils.say(ctx, ctx.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(ctx, ctx.getString(R.string.switching_failed,
- (name != null ? name : id), event.name()));
- }
- }
-
- public void svdrpException(SvdrpException e) {
- Log.w(TAG, e.getMessage(), e);
- Utils.say(ctx, e.getMessage());
- }
- });
- task.run();
- }
-
- public static void say(Context ctx, String msg) {
- Toast t = Toast.makeText(ctx, msg, Toast.LENGTH_SHORT);
- t.setGravity(Gravity.CENTER, 0, 0);
- t.show();
- }
-
- public static void say(Context ctx, int msg) {
- 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(Context context, long time) {
- return android.text.format.DateFormat.getDateFormat(context).format(
- time)
- + " "
- + DateUtils.formatDateTime(context, time,
- DateUtils.FORMAT_SHOW_TIME).toString();
- }
-
- public static int getTimerStateDrawable(TimerMatch match, int full,
- int begin, int end) {
- if (match == TimerMatch.Full) {
- return full;
- }
-
- if (match == TimerMatch.Begin) {
- return begin;
- }
-
- return end;
- }
-
- public static String formatAudio(Context context, List<AudioTrack> tracks){
-
- StringBuilder sb = new StringBuilder();
-
- String sep = "";
- for(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 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.getPreferences();
+ String auth = trimToEmpty(p.getStreamingUsername()) + ":"
+ + trimToEmpty(p.getStreamingPassword());
+ if (auth.length() == 1) {
+ auth = "";
+ } else {
+ auth += "@";
+ }
+
+ sb.append("http://").append(auth).append(p.getSvdrpHost()).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.getPreferences();
+ 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.getPreferences();
+ 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) {
+
+ final String m = Preferences.get().getRecStreamMethod();
+
+ final StringBuilder url = new StringBuilder();
+
+ if (StringUtils.equals(m, "vdr-live")) {
+ url.append("http://")
+ .append(Preferences.get().getSvdrpHost())
+ //
+ .append(":")
+ .append(Integer.valueOf(Preferences.get().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(Preferences.get().getSvdrpHost())
+ //
+ .append(":")
+ .append(Integer.valueOf(Preferences.get().getStreamPort()))
+ //
+ .append("/").append(rec.getDevInode());
+ }
+ 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 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) {
+ if (match == TimerMatch.Full) {
+ return full;
+ }
+
+ if (match == TimerMatch.Begin) {
+ return begin;
+ }
+
+ return end;
+ }
+
+ 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();
+
+ }
}
diff --git a/vdrmanager/src/de/bjusystems/vdrmanager/gui/VdrManagerActivity.java b/vdrmanager/src/de/bjusystems/vdrmanager/gui/VdrManagerActivity.java
index be0c9f8..8a7330e 100644
--- a/vdrmanager/src/de/bjusystems/vdrmanager/gui/VdrManagerActivity.java
+++ b/vdrmanager/src/de/bjusystems/vdrmanager/gui/VdrManagerActivity.java
@@ -21,6 +21,7 @@ import com.j256.ormlite.android.AndroidDatabaseResults;
import de.bjusystems.vdrmanager.R;
import de.bjusystems.vdrmanager.app.Intents;
+import de.bjusystems.vdrmanager.app.VdrManagerApp;
import de.bjusystems.vdrmanager.data.Preferences;
import de.bjusystems.vdrmanager.data.Vdr;
import de.bjusystems.vdrmanager.data.db.DBAccess;
@@ -50,7 +51,7 @@ public class VdrManagerActivity extends SherlockActivity implements
// }
if (Preferences.initVDR(this) == false) {
- Intent intent = new Intent();
+ final Intent intent = new Intent();
intent.setClass(this, VdrListActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.putExtra(Intents.EMPTY_CONFIG, Boolean.TRUE);
@@ -239,8 +240,18 @@ public class VdrManagerActivity extends SherlockActivity implements
@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) {
diff --git a/vdrmanager/src/de/bjusystems/vdrmanager/tasks/AsyncProgressTask.java b/vdrmanager/src/de/bjusystems/vdrmanager/tasks/AsyncProgressTask.java
index 870bc70..daeb2c7 100644
--- a/vdrmanager/src/de/bjusystems/vdrmanager/tasks/AsyncProgressTask.java
+++ b/vdrmanager/src/de/bjusystems/vdrmanager/tasks/AsyncProgressTask.java
@@ -8,55 +8,56 @@ import de.bjusystems.vdrmanager.utils.svdrp.SvdrpEvent;
public abstract class AsyncProgressTask<Result> {
- class AsyncProgress extends SvdrpProgressDialog<Result> {
-
- public AsyncProgress(final Activity activity,
- final SvdrpClient<Result> client) {
- super(activity, client);
- }
-
- public void svdrpEvent(final SvdrpEvent event) {
- super.svdrpEvent(event);
- switch (event) {
- case ABORTED:
- case CONNECT_ERROR:
- case CONNECTION_TIMEOUT:
- case ERROR:
- case LOGIN_ERROR:
- case FINISHED_ABNORMALY:
- case FINISHED_SUCCESS:
- case CACHE_HIT:
- AsyncProgressTask.this.finished(event);
- break;
- }
- }
- }
-
- Activity activity;
- SvdrpClient<Result> client;
-
- public AsyncProgressTask(final Activity activity,
- final SvdrpClient<Result> client) {
- this.activity = activity;
- this.client = client;
- }
-
- public void start() {
-
- // delete timer
- /*
- * final SetTimerClient client = new SetTimerClient(timer, true) {
- *
- * @Override public int getProgressTextId() { return
- * R.string.progress_timer_delete; } };
- */
- final SvdrpAsyncTask<Result, SvdrpClient<Result>> task = new SvdrpAsyncTask<Result, SvdrpClient<Result>>(
- client);
- final AsyncProgress progress = new AsyncProgress(activity, client);
- task.addSvdrpListener(progress);
- task.addSvdrpExceptionListener(progress);
- task.run();
- }
-
- public abstract void finished(SvdrpEvent event);
+ class AsyncProgress extends SvdrpProgressDialog<Result> {
+
+ public AsyncProgress(final Activity activity,
+ final SvdrpClient<Result> client) {
+ super(activity, client);
+ }
+
+ @Override
+ public void svdrpEvent(final SvdrpEvent event) {
+ super.svdrpEvent(event);
+ switch (event) {
+ case ABORTED:
+ case CONNECT_ERROR:
+ case CONNECTION_TIMEOUT:
+ case ERROR:
+ case LOGIN_ERROR:
+ case FINISHED_ABNORMALY:
+ case FINISHED_SUCCESS:
+ case CACHE_HIT:
+ AsyncProgressTask.this.finished(event);
+ break;
+ }
+ }
+ }
+
+ Activity activity;
+ SvdrpClient<Result> client;
+
+ public AsyncProgressTask(final Activity activity,
+ final SvdrpClient<Result> client) {
+ this.activity = activity;
+ this.client = client;
+ }
+
+ public void start() {
+
+ // delete timer
+ /*
+ * final SetTimerClient client = new SetTimerClient(timer, true) {
+ *
+ * @Override public int getProgressTextId() { return
+ * R.string.progress_timer_delete; } };
+ */
+ final SvdrpAsyncTask<Result, SvdrpClient<Result>> task = new SvdrpAsyncTask<Result, SvdrpClient<Result>>(
+ client);
+ final AsyncProgress progress = new AsyncProgress(activity, client);
+ task.addSvdrpListener(progress);
+ task.addSvdrpExceptionListener(progress);
+ task.run();
+ }
+
+ public abstract void finished(SvdrpEvent event);
}
diff --git a/vdrmanager/src/de/bjusystems/vdrmanager/tasks/ChannelsTask.java b/vdrmanager/src/de/bjusystems/vdrmanager/tasks/ChannelsTask.java
index bd4a679..1623575 100644
--- a/vdrmanager/src/de/bjusystems/vdrmanager/tasks/ChannelsTask.java
+++ b/vdrmanager/src/de/bjusystems/vdrmanager/tasks/ChannelsTask.java
@@ -5,7 +5,7 @@ import de.bjusystems.vdrmanager.data.Channel;
import de.bjusystems.vdrmanager.utils.svdrp.ChannelClient;
public abstract class ChannelsTask extends AsyncProgressTask<Channel> {
- public ChannelsTask(final Activity activity, final ChannelClient client) {
- super(activity, client);
- }
+ public ChannelsTask(final Activity activity, final ChannelClient client) {
+ super(activity, client);
+ }
}
diff --git a/vdrmanager/src/de/bjusystems/vdrmanager/tasks/CreateTimerTask.java b/vdrmanager/src/de/bjusystems/vdrmanager/tasks/CreateTimerTask.java
index f9ab94b..fa7dc43 100644
--- a/vdrmanager/src/de/bjusystems/vdrmanager/tasks/CreateTimerTask.java
+++ b/vdrmanager/src/de/bjusystems/vdrmanager/tasks/CreateTimerTask.java
@@ -3,17 +3,18 @@ package de.bjusystems.vdrmanager.tasks;
import android.app.Activity;
import de.bjusystems.vdrmanager.R;
import de.bjusystems.vdrmanager.data.Timer;
+import de.bjusystems.vdrmanager.gui.CertificateProblemDialog;
import de.bjusystems.vdrmanager.utils.svdrp.SetTimerClient;
import de.bjusystems.vdrmanager.utils.svdrp.SetTimerClient.TimerOperation;
public abstract class CreateTimerTask extends AsyncProgressTask<Timer> {
- public CreateTimerTask(final Activity activity, final Timer timer) {
- super(activity, new SetTimerClient(timer, TimerOperation.CREATE) {
- @Override
- public int getProgressTextId() {
- return R.string.progress_timer_save;
- }
- });
- }
+ public CreateTimerTask(final Activity activity, final Timer timer) {
+ super(activity, new SetTimerClient(timer, TimerOperation.CREATE, new CertificateProblemDialog(activity)) {
+ @Override
+ public int getProgressTextId() {
+ return R.string.progress_timer_save;
+ }
+ });
+ }
}
diff --git a/vdrmanager/src/de/bjusystems/vdrmanager/tasks/DeleteRecordingTask.java b/vdrmanager/src/de/bjusystems/vdrmanager/tasks/DeleteRecordingTask.java
index 255a6a6..b9f5f75 100644
--- a/vdrmanager/src/de/bjusystems/vdrmanager/tasks/DeleteRecordingTask.java
+++ b/vdrmanager/src/de/bjusystems/vdrmanager/tasks/DeleteRecordingTask.java
@@ -3,15 +3,16 @@ package de.bjusystems.vdrmanager.tasks;
import android.app.Activity;
import de.bjusystems.vdrmanager.R;
import de.bjusystems.vdrmanager.data.Recording;
+import de.bjusystems.vdrmanager.gui.CertificateProblemDialog;
import de.bjusystems.vdrmanager.utils.svdrp.DelRecordingClient;
public abstract class DeleteRecordingTask extends AsyncProgressTask<Recording> {
- public DeleteRecordingTask(final Activity activity, final Recording r) {
- super(activity, new DelRecordingClient(r) {
- @Override
- public int getProgressTextId() {
- return R.string.progress_recording_delete;
- }
- });
- }
+ public DeleteRecordingTask(final Activity activity, final Recording r) {
+ super(activity, new DelRecordingClient(r, new CertificateProblemDialog(activity)) {
+ @Override
+ public int getProgressTextId() {
+ return R.string.progress_recording_delete;
+ }
+ });
+ }
}
diff --git a/vdrmanager/src/de/bjusystems/vdrmanager/tasks/DeleteTimerTask.java b/vdrmanager/src/de/bjusystems/vdrmanager/tasks/DeleteTimerTask.java
index f4ea149..b3314d2 100644
--- a/vdrmanager/src/de/bjusystems/vdrmanager/tasks/DeleteTimerTask.java
+++ b/vdrmanager/src/de/bjusystems/vdrmanager/tasks/DeleteTimerTask.java
@@ -3,17 +3,18 @@ package de.bjusystems.vdrmanager.tasks;
import android.app.Activity;
import de.bjusystems.vdrmanager.R;
import de.bjusystems.vdrmanager.data.Timer;
+import de.bjusystems.vdrmanager.gui.CertificateProblemDialog;
import de.bjusystems.vdrmanager.utils.svdrp.SetTimerClient;
import de.bjusystems.vdrmanager.utils.svdrp.SetTimerClient.TimerOperation;
public abstract class DeleteTimerTask extends AsyncProgressTask<Timer> {
- public DeleteTimerTask(final Activity activity, final Timer timer) {
- super(activity, new SetTimerClient(timer, TimerOperation.DELETE) {
- @Override
- public int getProgressTextId() {
- return R.string.progress_timer_delete;
- }
- });
- }
+ public DeleteTimerTask(final Activity activity, final Timer timer) {
+ super(activity, new SetTimerClient(timer, TimerOperation.DELETE, new CertificateProblemDialog(activity)) {
+ @Override
+ public int getProgressTextId() {
+ return R.string.progress_timer_delete;
+ }
+ });
+ }
}
diff --git a/vdrmanager/src/de/bjusystems/vdrmanager/tasks/ModifyTimerTask.java b/vdrmanager/src/de/bjusystems/vdrmanager/tasks/ModifyTimerTask.java
index 14e7b1a..80aae53 100644
--- a/vdrmanager/src/de/bjusystems/vdrmanager/tasks/ModifyTimerTask.java
+++ b/vdrmanager/src/de/bjusystems/vdrmanager/tasks/ModifyTimerTask.java
@@ -3,21 +3,22 @@ package de.bjusystems.vdrmanager.tasks;
import android.app.Activity;
import de.bjusystems.vdrmanager.R;
import de.bjusystems.vdrmanager.data.Timer;
+import de.bjusystems.vdrmanager.gui.CertificateProblemDialog;
import de.bjusystems.vdrmanager.utils.svdrp.SetTimerClient;
import de.bjusystems.vdrmanager.utils.svdrp.SetTimerClient.TimerOperation;
public abstract class ModifyTimerTask extends AsyncProgressTask<Timer> {
-
- public ModifyTimerTask(final Activity activity, final Timer newTimer, final Timer oldTimer) {
- super(activity, new SetTimerClient(newTimer, oldTimer, TimerOperation.MODIFY) {
- @Override
- public int getProgressTextId() {
- return R.string.progress_timer_modify;
- }
-
-
- });
-
-
- }
+
+ public ModifyTimerTask(final Activity activity, final Timer newTimer, final Timer oldTimer) {
+ super(activity, new SetTimerClient(newTimer, oldTimer, TimerOperation.MODIFY, new CertificateProblemDialog(activity)) {
+ @Override
+ public int getProgressTextId() {
+ return R.string.progress_timer_modify;
+ }
+
+
+ });
+
+
+ }
}
diff --git a/vdrmanager/src/de/bjusystems/vdrmanager/tasks/ToggleTimerTask.java b/vdrmanager/src/de/bjusystems/vdrmanager/tasks/ToggleTimerTask.java
index 0f96926..82daae4 100644
--- a/vdrmanager/src/de/bjusystems/vdrmanager/tasks/ToggleTimerTask.java
+++ b/vdrmanager/src/de/bjusystems/vdrmanager/tasks/ToggleTimerTask.java
@@ -3,24 +3,25 @@ package de.bjusystems.vdrmanager.tasks;
import android.app.Activity;
import de.bjusystems.vdrmanager.R;
import de.bjusystems.vdrmanager.data.Timer;
+import de.bjusystems.vdrmanager.gui.CertificateProblemDialog;
import de.bjusystems.vdrmanager.utils.svdrp.SetTimerClient;
import de.bjusystems.vdrmanager.utils.svdrp.SetTimerClient.TimerOperation;
public abstract class ToggleTimerTask extends AsyncProgressTask<Timer> {
- public ToggleTimerTask(final Activity activity, final Timer timer) {
- super(activity, new SetTimerClient(timer, TimerOperation.TOGGLE) {
- boolean enabled = timer.isEnabled();
+ public ToggleTimerTask(final Activity activity, final Timer timer) {
+ super(activity, new SetTimerClient(timer, TimerOperation.TOGGLE, new CertificateProblemDialog(activity)) {
+ boolean enabled = timer.isEnabled();
- @Override
- public int getProgressTextId() {
- if (enabled) {
- return R.string.progress_timer_disable;
- } else {
- return R.string.progress_timer_enable;
- }
- }
- });
- timer.setEnabled(!timer.isEnabled());
- }
+ @Override
+ public int getProgressTextId() {
+ if (enabled) {
+ return R.string.progress_timer_disable;
+ } else {
+ return R.string.progress_timer_enable;
+ }
+ }
+ });
+ timer.setEnabled(!timer.isEnabled());
+ }
}
diff --git a/vdrmanager/src/de/bjusystems/vdrmanager/utils/svdrp/AliveClient.java b/vdrmanager/src/de/bjusystems/vdrmanager/utils/svdrp/AliveClient.java
index ebaee8c..0d5dca9 100644
--- a/vdrmanager/src/de/bjusystems/vdrmanager/utils/svdrp/AliveClient.java
+++ b/vdrmanager/src/de/bjusystems/vdrmanager/utils/svdrp/AliveClient.java
@@ -9,41 +9,39 @@ import de.bjusystems.vdrmanager.data.AliveState;
*/
public class AliveClient extends SvdrpClient<AliveState> {
- /**
- * Constructor
- * @param host host
- * @param port port
- * @param ssl use ssl
- */
- public AliveClient() {
- super();
- }
-
- /**
- * Starts the EPG request
- * @param parameter parameter for lste
- */
- @Override
- public void run() {
- runCommand("aliv");
- }
-
- @Override
- public AliveState parseAnswer(final String line) {
-
- if (line.startsWith("200")) {
- return AliveState.ALIVE;
- }
- if (line.startsWith("400")) {
- return AliveState.DEAD;
- }
- return AliveState.UNKNOWN;
- }
-
- @Override
- public int getProgressTextId() {
- return 0;
- }
+ /**
+ * Constructor
+ * @param certificateProblemListener
+ */
+ public AliveClient(final CertificateProblemListener certificateProblemListener) {
+ super(certificateProblemListener);
+ }
+
+ /**
+ * Starts the EPG request
+ * @param parameter parameter for lste
+ */
+ @Override
+ public void run() {
+ runCommand("aliv");
+ }
+
+ @Override
+ public AliveState parseAnswer(final String line) {
+
+ if (line.startsWith("200")) {
+ return AliveState.ALIVE;
+ }
+ if (line.startsWith("400")) {
+ return AliveState.DEAD;
+ }
+ return AliveState.UNKNOWN;
+ }
+
+ @Override
+ public int getProgressTextId() {
+ return 0;
+ }
} \ No newline at end of file
diff --git a/vdrmanager/src/de/bjusystems/vdrmanager/utils/svdrp/CertificateProblemListener.java b/vdrmanager/src/de/bjusystems/vdrmanager/utils/svdrp/CertificateProblemListener.java
new file mode 100644
index 0000000..ac0ac1e
--- /dev/null
+++ b/vdrmanager/src/de/bjusystems/vdrmanager/utils/svdrp/CertificateProblemListener.java
@@ -0,0 +1,39 @@
+package de.bjusystems.vdrmanager.utils.svdrp;
+
+import java.security.cert.X509Certificate;
+
+import android.app.Activity;
+
+/**
+ * Interface for reporting problems with the SSL certificate
+ * @author bju
+ *
+ */
+public interface CertificateProblemListener {
+
+ /**
+ * Possible user decisions on certificate problems
+ */
+ public enum CertificateProblemAction {
+
+ /** Abort the connection */
+ ABORT,
+ /** Accept the certificate this time */
+ ACCEPT_ONCE,
+ /** Accept the certificate forever */
+ ACCEPT_FOREVER
+ }
+
+ /**
+ * Reports the certificate problem and waits for a user decision
+ * @param chain Certificate trust chain
+ * @param authType authentication type
+ */
+ CertificateProblemAction reportProblem(final X509Certificate[] chain, final String authType);
+
+ /**
+ * Gets the current activity
+ * @return activity
+ */
+ Activity getCurrentActivity();
+}
diff --git a/vdrmanager/src/de/bjusystems/vdrmanager/utils/svdrp/ChannelClient.java b/vdrmanager/src/de/bjusystems/vdrmanager/utils/svdrp/ChannelClient.java
index 3b524c7..c3761c4 100644
--- a/vdrmanager/src/de/bjusystems/vdrmanager/utils/svdrp/ChannelClient.java
+++ b/vdrmanager/src/de/bjusystems/vdrmanager/utils/svdrp/ChannelClient.java
@@ -17,168 +17,168 @@ import de.bjusystems.vdrmanager.data.Preferences;
*
*/
public class ChannelClient extends SvdrpClient<Channel> implements
- SvdrpListener, SvdrpResultListener<Channel> {
-
- private static final ArrayList<String> channelGroups = new ArrayList<String>();
-
- private static final ArrayList<String> channelSources = new ArrayList<String>();
-
- private static LinkedHashMap<String, ArrayList<Channel>> groupChannels = new LinkedHashMap<String, ArrayList<Channel>>();
-
- private static TreeMap<String, ArrayList<Channel>> providerChannels = new TreeMap<String, ArrayList<Channel>>();
-
- private static TreeMap<String, ArrayList<Channel>> sourceChannels = new TreeMap<String, ArrayList<Channel>>();
-
- private static ArrayList<Channel> channels = new ArrayList<Channel>();
-
- private static Map<String, Channel> idChannels = new HashMap<String, Channel>();
-
- public static Map<String, Channel> getIdChannels() {
- return idChannels;
- }
-
- private static boolean inited = false;
-
- public ChannelClient() {
- super();
- // if (useCache == false) {
- // clearCache();
- // }
- addSvdrpListener(this);
- addSvdrpResultListener(this);
- }
-
- public static void clearCache() {
- channelSources.clear();
- sourceChannels.clear();
- channelGroups.clear();
- groupChannels.clear();
- providerChannels.clear();
- channels.clear();
- idChannels.clear();
- inited = false;
- }
-
- public static ArrayList<String> getChannelGroups() {
- return channelGroups;
- }
-
- public static ArrayList<String> getChannelSources() {
- return channelSources;
- }
-
-
- public static HashMap<String, ArrayList<Channel>> getGroupChannels() {
- return groupChannels;
- }
-
- public static TreeMap<String, ArrayList<Channel>> getProviderChannels() {
- return providerChannels;
- }
-
- public static TreeMap<String, ArrayList<Channel>> getSourceChannels() {
- return sourceChannels;
- }
-
- public static ArrayList<Channel> getChannels() {
- return channels;
- }
-
- /**
- * Constructor
- *
- * @param host
- * host
- * @param port
- * port
- * @param ssl
- * use ssl
- */
- // public ChannelClient() {
- // this(true);
- //
- // }
-
- /**
- * Starts the EPG request
- *
- * @param parameter
- * parameter for lste
- */
- @Override
- synchronized public void run() {
- if (inited == true) {
- informListener(SvdrpEvent.CACHE_HIT);
- } else {
- runCommand("channels " + Preferences.get().getChannels());
- }
- }
-
- @Override
- public Channel parseAnswer(final String line) {
- return new Channel(line);
- }
-
- @Override
- public int getProgressTextId() {
- return R.string.progress_channels_loading;
- }
-
- ArrayList<Channel> currentChannels = new ArrayList<Channel>();
-
- String currentGroup;
-
- private void addSourceChannel(Channel c){
- ArrayList<Channel> channels = sourceChannels.get(c.getSource());
-
- if(channels == null){
- channels = new ArrayList<Channel>();
- sourceChannels.put(c.getSource(), channels);
- channelSources.add(c.getSource());
- }
- channels.add(c);
- }
-
- private void received(Channel c) {
-
- if (c.isGroupSeparator()) {
- currentGroup = c.getName();
- channelGroups.add(currentGroup);
- currentChannels = new ArrayList<Channel>();
- groupChannels.put(c.getName(), currentChannels);
- } else {
-
- addSourceChannel(c);
-
- if (channelGroups.isEmpty()) {// receiver channel with no previous
- // group
- channelGroups.add("");
- groupChannels.put("", currentChannels);
- }
-
- c.setGroup(currentGroup);
- channels.add(c);
- idChannels.put(c.getId(), c);
- currentChannels.add(c);
- String provider = c.getProvider();
- ArrayList<Channel> pchannels = providerChannels.get(provider);
- if (pchannels == null) {
- pchannels = new ArrayList<Channel>();
- providerChannels.put(provider, pchannels);
- }
- pchannels.add(c);
- }
- }
-
- @Override
- public void svdrpEvent(Channel c) {
- received(c);
- }
-
- @Override
- public void svdrpEvent(SvdrpEvent event) {
- if (event == SvdrpEvent.FINISHED_SUCCESS) {
- inited = true;
- }
- }
+SvdrpListener, SvdrpResultListener<Channel> {
+
+ private static final ArrayList<String> channelGroups = new ArrayList<String>();
+
+ private static final ArrayList<String> channelSources = new ArrayList<String>();
+
+ private static LinkedHashMap<String, ArrayList<Channel>> groupChannels = new LinkedHashMap<String, ArrayList<Channel>>();
+
+ private static TreeMap<String, ArrayList<Channel>> providerChannels = new TreeMap<String, ArrayList<Channel>>();
+
+ private static TreeMap<String, ArrayList<Channel>> sourceChannels = new TreeMap<String, ArrayList<Channel>>();
+
+ private static ArrayList<Channel> channels = new ArrayList<Channel>();
+
+ private static Map<String, Channel> idChannels = new HashMap<String, Channel>();
+
+ public static Map<String, Channel> getIdChannels() {
+ return idChannels;
+ }
+
+ private static boolean inited = false;
+
+ public ChannelClient(final CertificateProblemListener certificateProblemListener) {
+ super(certificateProblemListener);
+ // if (useCache == false) {
+ // clearCache();
+ // }
+ addSvdrpListener(this);
+ addSvdrpResultListener(this);
+ }
+
+ public static void clearCache() {
+ channelSources.clear();
+ sourceChannels.clear();
+ channelGroups.clear();
+ groupChannels.clear();
+ providerChannels.clear();
+ channels.clear();
+ idChannels.clear();
+ inited = false;
+ }
+
+ public static ArrayList<String> getChannelGroups() {
+ return channelGroups;
+ }
+
+ public static ArrayList<String> getChannelSources() {
+ return channelSources;
+ }
+
+
+ public static HashMap<String, ArrayList<Channel>> getGroupChannels() {
+ return groupChannels;
+ }
+
+ public static TreeMap<String, ArrayList<Channel>> getProviderChannels() {
+ return providerChannels;
+ }
+
+ public static TreeMap<String, ArrayList<Channel>> getSourceChannels() {
+ return sourceChannels;
+ }
+
+ public static ArrayList<Channel> getChannels() {
+ return channels;
+ }
+
+ /**
+ * Constructor
+ *
+ * @param host
+ * host
+ * @param port
+ * port
+ * @param ssl
+ * use ssl
+ */
+ // public ChannelClient() {
+ // this(true);
+ //
+ // }
+
+ /**
+ * Starts the EPG request
+ *
+ * @param parameter
+ * parameter for lste
+ */
+ @Override
+ synchronized public void run() {
+ if (inited == true) {
+ informListener(SvdrpEvent.CACHE_HIT);
+ } else {
+ runCommand("channels " + Preferences.get().getChannels());
+ }
+ }
+
+ @Override
+ public Channel parseAnswer(final String line) {
+ return new Channel(line);
+ }
+
+ @Override
+ public int getProgressTextId() {
+ return R.string.progress_channels_loading;
+ }
+
+ ArrayList<Channel> currentChannels = new ArrayList<Channel>();
+
+ String currentGroup;
+
+ private void addSourceChannel(final Channel c){
+ ArrayList<Channel> channels = sourceChannels.get(c.getSource());
+
+ if(channels == null){
+ channels = new ArrayList<Channel>();
+ sourceChannels.put(c.getSource(), channels);
+ channelSources.add(c.getSource());
+ }
+ channels.add(c);
+ }
+
+ private void received(final Channel c) {
+
+ if (c.isGroupSeparator()) {
+ currentGroup = c.getName();
+ channelGroups.add(currentGroup);
+ currentChannels = new ArrayList<Channel>();
+ groupChannels.put(c.getName(), currentChannels);
+ } else {
+
+ addSourceChannel(c);
+
+ if (channelGroups.isEmpty()) {// receiver channel with no previous
+ // group
+ channelGroups.add("");
+ groupChannels.put("", currentChannels);
+ }
+
+ c.setGroup(currentGroup);
+ channels.add(c);
+ idChannels.put(c.getId(), c);
+ currentChannels.add(c);
+ final String provider = c.getProvider();
+ ArrayList<Channel> pchannels = providerChannels.get(provider);
+ if (pchannels == null) {
+ pchannels = new ArrayList<Channel>();
+ providerChannels.put(provider, pchannels);
+ }
+ pchannels.add(c);
+ }
+ }
+
+ @Override
+ public void svdrpEvent(final Channel c) {
+ received(c);
+ }
+
+ @Override
+ public void svdrpEvent(final SvdrpEvent event) {
+ if (event == SvdrpEvent.FINISHED_SUCCESS) {
+ inited = true;
+ }
+ }
}
diff --git a/vdrmanager/src/de/bjusystems/vdrmanager/utils/svdrp/DelRecordingClient.java b/vdrmanager/src/de/bjusystems/vdrmanager/utils/svdrp/DelRecordingClient.java
index efd5c6d..522e285 100644
--- a/vdrmanager/src/de/bjusystems/vdrmanager/utils/svdrp/DelRecordingClient.java
+++ b/vdrmanager/src/de/bjusystems/vdrmanager/utils/svdrp/DelRecordingClient.java
@@ -10,40 +10,40 @@ import de.bjusystems.vdrmanager.data.Recording;
*/
public class DelRecordingClient extends SvdrpClient<Recording> {
- /** current recording */
- Recording recording;
-
- /**
- * Constructor
- * Recording
- */
- public DelRecordingClient(final Recording recording) {
- super();
- this.recording = recording;
- }
-
- /**
- * Starts the request
- */
- @Override
- public void run() {
-
- final StringBuilder command = new StringBuilder();
-
- command.append("drecording ");
- command.append(recording.toCommandLine());
- runCommand(command.toString());
- }
-
-
- @Override
- public int getProgressTextId() {
- return R.string.progress_timer_save;
- }
-
- @Override
- protected Recording parseAnswer(String line) {
- return null;
- }
+ /** current recording */
+ Recording recording;
+
+ /**
+ * Constructor
+ * Recording
+ */
+ public DelRecordingClient(final Recording recording, final CertificateProblemListener certificateProblemListener) {
+ super(certificateProblemListener);
+ this.recording = recording;
+ }
+
+ /**
+ * Starts the request
+ */
+ @Override
+ public void run() {
+
+ final StringBuilder command = new StringBuilder();
+
+ command.append("drecording ");
+ command.append(recording.toCommandLine());
+ runCommand(command.toString());
+ }
+
+
+ @Override
+ public int getProgressTextId() {
+ return R.string.progress_timer_save;
+ }
+
+ @Override
+ protected Recording parseAnswer(final String line) {
+ return null;
+ }
}
diff --git a/vdrmanager/src/de/bjusystems/vdrmanager/utils/svdrp/EpgClient.java b/vdrmanager/src/de/bjusystems/vdrmanager/utils/svdrp/EpgClient.java
index 88c1801..a3d5b7e 100644
--- a/vdrmanager/src/de/bjusystems/vdrmanager/utils/svdrp/EpgClient.java
+++ b/vdrmanager/src/de/bjusystems/vdrmanager/utils/svdrp/EpgClient.java
@@ -14,79 +14,79 @@ import de.bjusystems.vdrmanager.data.Timer;
*/
public class EpgClient extends SvdrpClient<Epg> {
- /** Time to retrieve EPG for */
- private String time;
- /** Channel to retrieve EPG for */
- private Channel channel;
- /** Search parameters to retrieve EPG for */
- private EpgSearchParams search;
- /** Last read EPG */
- private Epg lastEpg;
+ /** Time to retrieve EPG for */
+ private String time;
+ /** Channel to retrieve EPG for */
+ private Channel channel;
+ /** Search parameters to retrieve EPG for */
+ private EpgSearchParams search;
+ /** Last read EPG */
+ private Epg lastEpg;
- /**
- * Constructor
- */
- private EpgClient() {
- super();
- this.time = null;
- this.channel = null;
- this.search = null;
- }
+ /**
+ * Constructor
+ */
+ private EpgClient(final CertificateProblemListener certificateProblemListener) {
+ super(certificateProblemListener);
+ this.time = null;
+ this.channel = null;
+ this.search = null;
+ }
- /**
- * Constructor
- * @param time time to search for epg events
- */
- public EpgClient(final String time) {
- this();
- this.time = time;
- }
+ /**
+ * Constructor
+ * @param time time to search for epg events
+ */
+ public EpgClient(final String time, final CertificateProblemListener certificateProblemListener) {
+ this(certificateProblemListener);
+ this.time = time;
+ }
- /**
- * Constructor
- * @param channel channel to search for epg events
- */
- public EpgClient(final Channel channel) {
- this();
- this.channel = channel;
- }
+ /**
+ * Constructor
+ * @param channel channel to search for epg events
+ */
+ public EpgClient(final Channel channel, final CertificateProblemListener certificateProblemListener) {
+ this(certificateProblemListener);
+ this.channel = channel;
+ }
- public EpgClient(final EpgSearchParams search) {
- this();
- this.search = search;
- }
+ public EpgClient(final EpgSearchParams search, final CertificateProblemListener certificateProblemListener) {
+ this(certificateProblemListener);
+ this.search = search;
+ }
- /**
- * Starts the EPG request
- * @param parameter parameter for lste
- */
- @Override
- public void run() {
- if (time != null) {
- runCommand(String.format("tevents %s %s", time, Preferences.getPreferences().getChannels()));
- } else if (channel != null) {
- runCommand(String.format("cevents %s", channel.getNumber()));
- } else if (search != null) {
- runCommand(String.format("search %s:%s", Preferences.get().getChannels(), search.toCommandLine()));
- }
- }
+ /**
+ * Starts the EPG request
+ * @param parameter parameter for lste
+ */
+ @Override
+ public void run() {
+ if (time != null) {
+ runCommand(String.format("tevents %s %s", time, Preferences.getPreferences().getChannels()));
+ } else if (channel != null) {
+ runCommand(String.format("cevents %s", channel.getNumber()));
+ } else if (search != null) {
+ runCommand(String.format("search %s:%s", Preferences.get().getChannels(), search.toCommandLine()));
+ }
+ }
- @Override
- public Epg parseAnswer(final String line) {
+ @Override
+ public Epg parseAnswer(final String line) {
- if (line.startsWith("E")) {
- lastEpg = new Epg(line);
- return lastEpg;
- } else if (line.startsWith("T")) {
- lastEpg.setTimer(new Timer(line));
- }
- return null;
- }
+ if (line.startsWith("E")) {
+ lastEpg = new Epg(line);
+ return lastEpg;
+ } else if (line.startsWith("T")) {
+ lastEpg.setTimer(new Timer(line));
+ }
+ return null;
+ }
- @Override
- public int getProgressTextId() {
- return R.string.progress_whatson_loading;
- }
+ @Override
+ public int getProgressTextId() {
+ return R.string.progress_whatson_loading;
+ }
}
diff --git a/vdrmanager/src/de/bjusystems/vdrmanager/utils/svdrp/MySSLSocketFactory.java b/vdrmanager/src/de/bjusystems/vdrmanager/utils/svdrp/MySSLSocketFactory.java
new file mode 100644
index 0000000..6c87faa
--- /dev/null
+++ b/vdrmanager/src/de/bjusystems/vdrmanager/utils/svdrp/MySSLSocketFactory.java
@@ -0,0 +1,253 @@
+package de.bjusystems.vdrmanager.utils.svdrp;
+
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.Socket;
+import java.security.KeyManagementException;
+import java.security.KeyStore;
+import java.security.KeyStoreException;
+import java.security.NoSuchAlgorithmException;
+import java.security.SecureRandom;
+import java.security.UnrecoverableKeyException;
+import java.security.cert.CertificateException;
+import java.security.cert.X509Certificate;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.SSLSocketFactory;
+import javax.net.ssl.TrustManager;
+import javax.net.ssl.TrustManagerFactory;
+import javax.net.ssl.X509TrustManager;
+
+import android.app.Activity;
+import android.content.Context;
+import android.util.Log;
+import de.bjusystems.vdrmanager.app.VdrManagerApp;
+
+
+/**
+ * SSLSocketFactory
+ * @author bju
+ */
+public class MySSLSocketFactory extends org.apache.http.conn.ssl.SSLSocketFactory {
+
+ /** The key store file */
+ private final String keyStoreFile = "KeyStore";
+
+ /** the key store */
+ private KeyStore appKeyStore;
+
+ /** the real socket factory */
+ private final SSLSocketFactory sslFactory;
+
+ /** the trust managers */
+ private X509TrustManager[] trustManagers;
+
+ /** the current activity */
+ private final Activity activity;
+
+ public MySSLSocketFactory(final boolean acceptAllCertificates, final CertificateProblemListener certProblemListener)
+ throws KeyManagementException, NoSuchAlgorithmException, UnrecoverableKeyException, KeyStoreException {
+
+ super(null);
+
+ // save context
+ this.activity = certProblemListener.getCurrentActivity();
+
+ // accept all host names
+ this.setHostnameVerifier(org.apache.http.conn.ssl.SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
+
+ // load the key store
+ initKeyStore();
+
+ // initialize the trust managers
+ if (acceptAllCertificates) {
+ initInsecureTrustManagers();
+ } else {
+ initSecureTrustManagers(certProblemListener);
+ }
+
+ // create SSL context
+ final SSLContext context = SSLContext.getInstance("TLS");
+ context.init(null, trustManagers, new SecureRandom());
+
+ // create the real factory
+ sslFactory = context.getSocketFactory();
+
+ }
+
+ @Override
+ public Socket createSocket() throws IOException {
+ return sslFactory.createSocket();
+ }
+
+ /**
+ * initialize the key store
+ * @return KeyStore
+ * @throws KeyStoreException
+ */
+ private void initKeyStore() throws KeyStoreException {
+
+ try {
+ appKeyStore = KeyStore.getInstance(KeyStore.getDefaultType());
+
+ try {
+ final InputStream stream = activity.openFileInput(keyStoreFile);
+ appKeyStore.load(stream, null);
+ } catch (final FileNotFoundException e) {
+ appKeyStore.load(null);
+ }
+ } catch (final Exception e) {
+ throw new KeyStoreException(e);
+ }
+ }
+
+ /**
+ * initialize the trust managers validating certificates
+ * @param acceptAllCertificates accept all certificates
+ * @param certProblemListener listener to inform about certificate problems
+ * @throws NoSuchAlgorithmException
+ * @throws KeyStoreException
+ */
+ private void initSecureTrustManagers(final CertificateProblemListener certProblemListener) throws NoSuchAlgorithmException, KeyStoreException {
+
+ final List<X509TrustManager> trustManagerList = new ArrayList<X509TrustManager>();
+
+ // initialize the trust manager accepting certificates contained in the session key store
+ TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance("X509");
+ trustManagerFactory.init(((VdrManagerApp)activity.getApplication()).getSessionKeyStore());
+ X509TrustManager trustManager = getTrustManager(trustManagerFactory);
+ if (trustManager != null) {
+ trustManagerList.add(trustManager);
+ }
+
+ // initialize the trust manager accepting certificates contained in the permanent key store
+ trustManagerFactory = TrustManagerFactory.getInstance("X509");
+ trustManagerFactory.init(appKeyStore);
+ trustManager = getTrustManager(trustManagerFactory);
+ if (trustManager != null) {
+ trustManagerList.add(trustManager);
+ }
+
+ // initialize the trust manager accepting certificates accepted from the system
+ trustManagerFactory = TrustManagerFactory.getInstance("X509");
+ trustManagerFactory.init((KeyStore)null);
+ trustManager = getTrustManager(trustManagerFactory);
+ if (trustManager != null) {
+ trustManagerList.add(trustManager);
+ }
+
+ trustManagers = new X509TrustManager[] {
+ new X509TrustManager() {
+
+ @Override
+ public X509Certificate[] getAcceptedIssuers() {
+ return null;
+ }
+
+ @Override
+ public void checkServerTrusted(final X509Certificate[] chain, final String authType) throws CertificateException {
+ CertificateException lastException = null;
+ for(final X509TrustManager tm : trustManagerList) {
+ try {
+ tm.checkServerTrusted(chain, authType);
+ return;
+ } catch (final CertificateException e) {
+ lastException = e;
+ }
+ }
+
+ switch (certProblemListener.reportProblem(chain, authType)) {
+ case ACCEPT_ONCE:
+ saveCertificate(chain, authType, false);
+ return;
+ case ACCEPT_FOREVER:
+ saveCertificate(chain, authType, true);
+ return;
+ default:
+ if (lastException != null) {
+ throw lastException;
+ }
+ break;
+ }
+
+
+ throw new CertificateException("Certificate not validated");
+ }
+
+ @Override
+ public void checkClientTrusted(final X509Certificate[] chain, final String authType) throws CertificateException {
+ // NOP
+ }
+ }
+ };
+ }
+
+ /**
+ * initializes the trust managers validating nothing
+ */
+ private void initInsecureTrustManagers() {
+
+ trustManagers = new X509TrustManager[] {
+ new X509TrustManager() {
+ @Override
+ public X509Certificate[] getAcceptedIssuers() {
+ return null;
+ }
+
+ @Override
+ public void checkServerTrusted(final X509Certificate[] chain, final String authType) throws CertificateException {
+ }
+
+ @Override
+ public void checkClientTrusted(final X509Certificate[] chain, final String authType) throws CertificateException {
+ }
+ }
+ };
+ }
+
+ /**
+ * finds the X509 trust manager
+ * @param trustManagerFactory TrustManager factory
+ * @return X509 trust manager
+ */
+ private X509TrustManager getTrustManager(final TrustManagerFactory trustManagerFactory) {
+
+ for(final TrustManager trustManager : trustManagerFactory.getTrustManagers()) {
+ if (trustManager instanceof X509TrustManager) {
+ return (X509TrustManager) trustManager;
+ }
+ }
+ return null;
+ }
+
+ /**
+ * Saves the certificate
+ * @param chain certificate chain
+ * @param authType authentication type
+ */
+ private void saveCertificate(final X509Certificate[] chain, final String authType, final boolean permanently) {
+
+ // get the certificate alias
+ final String alias = chain[0].getSubjectDN().toString();
+
+ // key store to use
+ final KeyStore saveKeyStore = permanently ? appKeyStore : ((VdrManagerApp)activity.getApplication()).getSessionKeyStore();
+
+ // store the certificate for this alias
+ try {
+ saveKeyStore.setCertificateEntry(alias, chain[0]);
+
+ // the session key store is not saved
+ if (permanently) {
+ final FileOutputStream stream = activity.openFileOutput(keyStoreFile, Context.MODE_PRIVATE);
+ saveKeyStore.store(stream, null);
+ }
+ } catch (final Exception e) {
+ Log.e(getClass().getName(), "Can't save certificate for ' " + alias + "' as trusted");
+ }
+ }
+}
diff --git a/vdrmanager/src/de/bjusystems/vdrmanager/utils/svdrp/RecordingClient.java b/vdrmanager/src/de/bjusystems/vdrmanager/utils/svdrp/RecordingClient.java
index 025dcf9..f201ed9 100644
--- a/vdrmanager/src/de/bjusystems/vdrmanager/utils/svdrp/RecordingClient.java
+++ b/vdrmanager/src/de/bjusystems/vdrmanager/utils/svdrp/RecordingClient.java
@@ -5,19 +5,27 @@ import de.bjusystems.vdrmanager.data.Recording;
public class RecordingClient extends SvdrpClient<Recording> {
- @Override
- protected Recording parseAnswer(String line) {
- return new Recording(line);
- }
+ /**
+ * Constructor
+ * @param certificateProblemListener
+ */
+ public RecordingClient(final CertificateProblemListener certificateProblemListener) {
+ super(certificateProblemListener);
+ }
- @Override
- public int getProgressTextId() {
- return R.string.progress_recordings_loading;
- }
+ @Override
+ protected Recording parseAnswer(final String line) {
+ return new Recording(line);
+ }
- @Override
- public synchronized void run() {
- runCommand("recordings");
- }
+ @Override
+ public int getProgressTextId() {
+ return R.string.progress_recordings_loading;
+ }
+
+ @Override
+ public synchronized void run() {
+ runCommand("recordings");
+ }
}
diff --git a/vdrmanager/src/de/bjusystems/vdrmanager/utils/svdrp/SetTimerClient.java b/vdrmanager/src/de/bjusystems/vdrmanager/utils/svdrp/SetTimerClient.java
index 72ca70e..8daab75 100644
--- a/vdrmanager/src/de/bjusystems/vdrmanager/utils/svdrp/SetTimerClient.java
+++ b/vdrmanager/src/de/bjusystems/vdrmanager/utils/svdrp/SetTimerClient.java
@@ -10,81 +10,81 @@ import de.bjusystems.vdrmanager.data.Timer;
*/
public class SetTimerClient extends SvdrpClient<Timer> {
- public enum TimerOperation {
- CREATE("C"),//
- DELETE("D"),//
- MODIFY("M"),//
- TOGGLE("T"),//
- ;
- private String command;
- private TimerOperation(String command){
- this.command = command;
- }
- public String getCommand(){
- return this.command;
- }
-
- }
-
- /** channel names for timer */
- Timer newTimer;
-
- Timer oldTimer;
-
- /** timer should be deleted */
- private TimerOperation timerOperation;
-
- /**
- * @param newTimer Das was modifiziert angelegt wird
- */
- public SetTimerClient(final Timer newTimer, TimerOperation op) {
- this(newTimer, null, op);
- }
-
- /**
- * @param newTimer
- * @param oldTimer this is original Timer, if any (modify)
- * @param op
- */
- public SetTimerClient(final Timer newTimer, final Timer oldTimer, TimerOperation op) {
- super();
- this.newTimer = newTimer;
- this.oldTimer = oldTimer;
- this.timerOperation = op;
- }
-
-
- /**
- * Starts the request
- */
- @Override
- public void run() {
-
- final StringBuilder command = new StringBuilder();
-
- command.append("timer ");
- command.append(timerOperation.getCommand());
- //command.append(oldTimer.getNumber());
- command.append(" ");
- command.append(newTimer.toCommandLine());
- if(timerOperation == TimerOperation.MODIFY){
- command.append("#|#|#").append(oldTimer.toCommandLine());
- }
- //timer D 1:1:2011-11-11:1513:1710:50:99:Mirrors 2
- //timer C 1:1:2011-11-11:2223:2250:50:99:Zapping
- //timer T 0:1:2011-11-11:2013:2230:50:99:So spielt das Leben
- //timer M
- runCommand(command.toString());
- }
-
- @Override
- public Timer parseAnswer(final String line) {
- return new Timer(line);
- }
-
- @Override
- public int getProgressTextId() {
- return R.string.progress_timer_save;
- }
+ public enum TimerOperation {
+ CREATE("C"),//
+ DELETE("D"),//
+ MODIFY("M"),//
+ TOGGLE("T"),//
+ ;
+ private String command;
+ private TimerOperation(final String command){
+ this.command = command;
+ }
+ public String getCommand(){
+ return this.command;
+ }
+
+ }
+
+ /** channel names for timer */
+ Timer newTimer;
+
+ Timer oldTimer;
+
+ /** timer should be deleted */
+ private final TimerOperation timerOperation;
+
+ /**
+ * @param newTimer Das was modifiziert angelegt wird
+ */
+ public SetTimerClient(final Timer newTimer, final TimerOperation op, final CertificateProblemListener certificateProblemListener) {
+ this(newTimer, null, op, certificateProblemListener);
+ }
+
+ /**
+ * @param newTimer
+ * @param oldTimer this is original Timer, if any (modify)
+ * @param op
+ */
+ public SetTimerClient(final Timer newTimer, final Timer oldTimer, final TimerOperation op, final CertificateProblemListener certificateProblemListener) {
+ super(certificateProblemListener);
+ this.newTimer = newTimer;
+ this.oldTimer = oldTimer;
+ this.timerOperation = op;
+ }
+
+
+ /**
+ * Starts the request
+ */
+ @Override
+ public void run() {
+
+ final StringBuilder command = new StringBuilder();
+
+ command.append("timer ");
+ command.append(timerOperation.getCommand());
+ //command.append(oldTimer.getNumber());
+ command.append(" ");
+ command.append(newTimer.toCommandLine());
+ if(timerOperation == TimerOperation.MODIFY){
+ command.append("#|#|#").append(oldTimer.toCommandLine());
+ }
+ //timer D 1:1:2011-11-11:1513:1710:50:99:Mirrors 2
+ //timer C 1:1:2011-11-11:2223:2250:50:99:Zapping
+ //timer T 0:1:2011-11-11:2013:2230:50:99:So spielt das Leben
+ //timer M
+ runCommand(command.toString());
+ }
+
+ @Override
+ public Timer parseAnswer(final String line) {
+ return new Timer(line);
+ }
+
+ @Override
+ public int getProgressTextId() {
+ return R.string.progress_timer_save;
+ }
}
diff --git a/vdrmanager/src/de/bjusystems/vdrmanager/utils/svdrp/SvdrpAsyncTask.java b/vdrmanager/src/de/bjusystems/vdrmanager/utils/svdrp/SvdrpAsyncTask.java
index b7b090e..505b084 100644
--- a/vdrmanager/src/de/bjusystems/vdrmanager/utils/svdrp/SvdrpAsyncTask.java
+++ b/vdrmanager/src/de/bjusystems/vdrmanager/utils/svdrp/SvdrpAsyncTask.java
@@ -6,157 +6,160 @@ import java.util.List;
import android.os.AsyncTask;
public class SvdrpAsyncTask<Result, Client extends SvdrpClient<Result>> extends
- AsyncTask<Void, Object, Void> implements SvdrpListener,
- SvdrpExceptionListener, SvdrpResultListener<Result> {
-
- Client client;
-
- Throwable ex;
-
- SvdrpEvent event;
-
- List<SvdrpListener> eventListeners = new ArrayList<SvdrpListener>();
-
- List<SvdrpExceptionListener> exceptionListeners = new ArrayList<SvdrpExceptionListener>();
-
- List<SvdrpFinishedListener<Result>> finishedListeners = new ArrayList<SvdrpFinishedListener<Result>>();
-
- public SvdrpAsyncTask(final Client client) {
- this.client = client;
- this.client.addSvdrpListener(this);
- this.client.addSvdrpExceptionListener(this);
- this.client.addSvdrpResultListener(this);
- }
-
- protected List<Result> results = new ArrayList<Result>();
-
-
- public List<Result> getResults() {
- return results;
- }
-
-
- /**
- * Adds the listener to the list of listeners
- *
- * @param listener
- * listener
- */
- public void addSvdrpListener(final SvdrpListener listener) {
- // client.addSvdrpListener(listener);
- eventListeners.add(listener);
- }
-
- /**
- * Adds the listener to the list of listeners
- *
- * @param listener
- * listener
- */
- public void addSvdrpResultListener(
- final SvdrpResultListener<Result> listener) {
- client.addSvdrpResultListener(listener);
- }
-
- public void addSvdrpFinishedListener(final SvdrpFinishedListener<Result> liste) {
- finishedListeners.add(liste);
- }
-
- /**
- * Adds the listener to the list of listeners
- *
- * @param listener
- * listener
- */
- public void addSvdrpExceptionListener(final SvdrpExceptionListener listener) {
- // client.addSvdrpExceptionListener(listener);
- exceptionListeners.add(listener);
- }
-
- public void run() {
- execute();
- }
-
- @Override
- protected Void doInBackground(final Void... params) {
- client.run();
- return null;
- }
-
- @Override
- protected void onProgressUpdate(final Object... values) {
-
- if (values.length == 1) {
-
- if (List.class.isAssignableFrom(values[0].getClass())) {
- for (final SvdrpFinishedListener<Result> listener : finishedListeners) {
- listener.finished((List<Result>) values[0]);
- }
- return;
- }
-
- for (final SvdrpListener listener : eventListeners) {
- listener.svdrpEvent((SvdrpEvent) values[0]);
- }
-
- } else if (values.length == 2) {
- for (final SvdrpExceptionListener listener : exceptionListeners) {
- listener.svdrpEvent((SvdrpEvent) values[0],
- (Throwable) values[1]);
- }
- }
-
- /*
- * switch (event) { case CONNECTING: {
- * setMessage(R.string.progress_connect); progress.show(); break; }
- *
- * case LOGGED_IN: { setMessage(R.string.progress_login); break; }
- *
- * case COMMAND_SENT: { setMessage(client.getProgressTextId()); break; }
- *
- * case DISCONNECTING: { setMessage(R.string.progress_disconnect);
- * break; }
- *
- * case ERROR: case CONNECTION_TIMEOUT: case CONNECT_ERROR: case
- * FINISHED_ABNORMALY: case CACHE_HIT: case FINISHED_SUCCESS: case
- * LOGIN_ERROR: { progress.dismiss(); }
- *
- * }
- */
- }
-
- // @Override
- // protected void onPostExecute(SvdrpException exception) {
- // for (SvdrpExceptionListener l : exceptionListeners) {
- // l.svdrpEvent(exception.getEvent(), ex);
- // }
- // }
-
- @Override
- public void svdrpEvent(SvdrpEvent event) {
- publishProgress(event);;
- if(event == SvdrpEvent.FINISHED_SUCCESS){
- publishProgress(results);
- }
- }
-
-// @Override
-// public void finished(ListResult> results) {
-// publishProgress(results);
-// }
-
- @Override
- public void svdrpEvent(SvdrpEvent event, Throwable t) {
- publishProgress(event, t);
- }
-
-
- @Override
- public void svdrpEvent(Result result) {
- results.add(result);
- }
-
- public void abort(){
- client.abort();
- }
+AsyncTask<Void, Object, Void> implements SvdrpListener,
+SvdrpExceptionListener, SvdrpResultListener<Result> {
+
+ Client client;
+
+ Throwable ex;
+
+ SvdrpEvent event;
+
+ List<SvdrpListener> eventListeners = new ArrayList<SvdrpListener>();
+
+ List<SvdrpExceptionListener> exceptionListeners = new ArrayList<SvdrpExceptionListener>();
+
+ List<SvdrpFinishedListener<Result>> finishedListeners = new ArrayList<SvdrpFinishedListener<Result>>();
+
+ //CertificateProblemListener certificateProblemListener = null;
+
+ //CertificateProblemAction certificateProblemAction;
+
+ public SvdrpAsyncTask(final Client client) {
+ this.client = client;
+ this.client.addSvdrpListener(this);
+ this.client.addSvdrpExceptionListener(this);
+ this.client.addSvdrpResultListener(this);
+ }
+
+ protected List<Result> results = new ArrayList<Result>();
+
+
+ public List<Result> getResults() {
+ return results;
+ }
+
+
+ /**
+ * Adds the listener to the list of listeners
+ *
+ * @param listener
+ * listener
+ */
+ public void addSvdrpListener(final SvdrpListener listener) {
+ // client.addSvdrpListener(listener);
+ eventListeners.add(listener);
+ }
+
+ /**
+ * Adds the listener to the list of listeners
+ *
+ * @param listener
+ * listener
+ */
+ public void addSvdrpResultListener(
+ final SvdrpResultListener<Result> listener) {
+ client.addSvdrpResultListener(listener);
+ }
+
+ public void addSvdrpFinishedListener(final SvdrpFinishedListener<Result> liste) {
+ finishedListeners.add(liste);
+ }
+
+ /**
+ * Adds the listener to the list of listeners
+ *
+ * @param listener
+ * listener
+ */
+ public void addSvdrpExceptionListener(final SvdrpExceptionListener listener) {
+ // client.addSvdrpExceptionListener(listener);
+ exceptionListeners.add(listener);
+ }
+
+ public void run() {
+ execute();
+ }
+
+ @Override
+ protected Void doInBackground(final Void... params) {
+ client.run();
+ return null;
+ }
+
+ @Override
+ protected void onProgressUpdate(final Object... values) {
+
+ if (values.length == 1) {
+
+ if (List.class.isAssignableFrom(values[0].getClass())) {
+ for (final SvdrpFinishedListener<Result> listener : finishedListeners) {
+ listener.finished((List<Result>) values[0]);
+ }
+ return;
+ }
+
+ for (final SvdrpListener listener : eventListeners) {
+ listener.svdrpEvent((SvdrpEvent) values[0]);
+ }
+
+ } else if (values.length == 2) {
+ for (final SvdrpExceptionListener listener : exceptionListeners) {
+ listener.svdrpEvent((SvdrpEvent) values[0], (Throwable) values[1]);
+ }
+ }
+
+ /*
+ * switch (event) { case CONNECTING: {
+ * setMessage(R.string.progress_connect); progress.show(); break; }
+ *
+ * case LOGGED_IN: { setMessage(R.string.progress_login); break; }
+ *
+ * case COMMAND_SENT: { setMessage(client.getProgressTextId()); break; }
+ *
+ * case DISCONNECTING: { setMessage(R.string.progress_disconnect);
+ * break; }
+ *
+ * case ERROR: case CONNECTION_TIMEOUT: case CONNECT_ERROR: case
+ * FINISHED_ABNORMALY: case CACHE_HIT: case FINISHED_SUCCESS: case
+ * LOGIN_ERROR: { progress.dismiss(); }
+ *
+ * }
+ */
+ }
+
+ // @Override
+ // protected void onPostExecute(SvdrpException exception) {
+ // for (SvdrpExceptionListener l : exceptionListeners) {
+ // l.svdrpEvent(exception.getEvent(), ex);
+ // }
+ // }
+
+ @Override
+ public void svdrpEvent(final SvdrpEvent event) {
+ publishProgress(event);;
+ if(event == SvdrpEvent.FINISHED_SUCCESS){
+ publishProgress(results);
+ }
+ }
+
+ // @Override
+ // public void finished(ListResult> results) {
+ // publishProgress(results);
+ // }
+
+ @Override
+ public void svdrpEvent(final SvdrpEvent event, final Throwable t) {
+ publishProgress(event, t);
+ }
+
+
+ @Override
+ public void svdrpEvent(final Result result) {
+ results.add(result);
+ }
+
+ public void abort(){
+ client.abort();
+ }
}
diff --git a/vdrmanager/src/de/bjusystems/vdrmanager/utils/svdrp/SvdrpClient.java b/vdrmanager/src/de/bjusystems/vdrmanager/utils/svdrp/SvdrpClient.java
index 12ef6d5..e269a5b 100644
--- a/vdrmanager/src/de/bjusystems/vdrmanager/utils/svdrp/SvdrpClient.java
+++ b/vdrmanager/src/de/bjusystems/vdrmanager/utils/svdrp/SvdrpClient.java
@@ -15,8 +15,6 @@ import java.util.TimerTask;
import java.util.zip.GZIPInputStream;
import java.util.zip.InflaterInputStream;
-import javax.net.ssl.SSLSocketFactory;
-
import android.util.Log;
import de.bjusystems.vdrmanager.app.C;
import de.bjusystems.vdrmanager.data.Preferences;
@@ -39,14 +37,16 @@ public abstract class SvdrpClient<Result> {
private InputStream inputStream;
/** flag for stopping the current request */
private boolean abort;
- /** listener */
+ /** listener for events */
private final List<SvdrpListener> svdrpListeners = new ArrayList<SvdrpListener>();
-
+ /** listeners for results */
private final List<SvdrpResultListener<Result>> svdrpResultListeners = new ArrayList<SvdrpResultListener<Result>>();
-
+ /** listeners for exceptions */
private final List<SvdrpExceptionListener> svdrpExceptionListeners = new ArrayList<SvdrpExceptionListener>();
-
+ /** listeners for finished job */
private final List<SvdrpFinishedListener<Result>> svdrpFinishedListeners = new ArrayList<SvdrpFinishedListener<Result>>();
+ /** listener for certificate problems set by caller */
+ private final CertificateProblemListener certificateProblemListener;
/** list of results */
// private final List<Result> results = new ArrayList<Result>();
@@ -89,8 +89,9 @@ public abstract class SvdrpClient<Result> {
* @param prefs
* Preferences
*/
- protected SvdrpClient() {
+ protected SvdrpClient(final CertificateProblemListener certificateProblemListener) {
// results.clear();
+ this.certificateProblemListener = certificateProblemListener;
}
/**
@@ -209,12 +210,8 @@ public abstract class SvdrpClient<Result> {
// connect
informListener(SvdrpEvent.CONNECTING);
- if (false && Preferences.get().isSecure()) {
-
- final SSLSocketFactory factory = (SSLSocketFactory) SSLSocketFactory
- .getDefault(); // Erzeugt eine SSLSocketFactory mit
- // Standartkonfiguration
- socket = factory.createSocket();
+ if (Preferences.get().isSecure()) {
+ socket = new MySSLSocketFactory(false, certificateProblemListener).createSocket();
} else {
socket = new Socket();
}
@@ -244,6 +241,11 @@ public abstract class SvdrpClient<Result> {
}
}, delay);
informListener(SvdrpEvent.CONNECTED);
+
+ // create streams
+ outputStream = socket.getOutputStream();
+ inputStream = socket.getInputStream();
+
} catch (final SocketTimeoutException sote) {
Log.w(TAG, sote);
if (abort) {
@@ -263,11 +265,6 @@ public abstract class SvdrpClient<Result> {
return false;
}
- // create streams
- outputStream = socket.getOutputStream();
- inputStream = socket.getInputStream();
-
-
// password needed?
informListener(SvdrpEvent.LOGIN);
writeLine("passwd " + prefs.getPassword());
@@ -503,5 +500,4 @@ public abstract class SvdrpClient<Result> {
listener.svdrpEvent(result);
}
}
-
}
diff --git a/vdrmanager/src/de/bjusystems/vdrmanager/utils/svdrp/SwitchChannelClient.java b/vdrmanager/src/de/bjusystems/vdrmanager/utils/svdrp/SwitchChannelClient.java
index e5b2b68..65a4d59 100644
--- a/vdrmanager/src/de/bjusystems/vdrmanager/utils/svdrp/SwitchChannelClient.java
+++ b/vdrmanager/src/de/bjusystems/vdrmanager/utils/svdrp/SwitchChannelClient.java
@@ -11,45 +11,47 @@ import de.bjusystems.vdrmanager.R;
*/
public class SwitchChannelClient extends SvdrpClient<String> {
- private Integer nr;
-
- private String chid;
-
- public SwitchChannelClient(Integer nr){
- this.nr = nr;
- }
-
- public SwitchChannelClient(String chid){
- this.chid = chid;
- }
-
- /**
- * Constructor
- */
- public SwitchChannelClient() {
- super();
- }
-
- /**
- * Starts the wakeup request
- */
- @Override
- public void run() {
- if(nr != null){
- runCommand("SETCHANNEL " + String.valueOf(nr));
- } else {
- runCommand("SETCHANNEL " + chid);
- }
- }
-
- @Override
- public String parseAnswer(final String line) {
- return line;
- }
-
- @Override
- public int getProgressTextId() {
- return R.string.progress_switching;
- }
+ private Integer nr;
+
+ private String chid;
+
+ public SwitchChannelClient(final Integer nr, final CertificateProblemListener certificateProblemListener){
+ this(certificateProblemListener);
+ this.nr = nr;
+ }
+
+ public SwitchChannelClient(final String chid, final CertificateProblemListener certificateProblemListener){
+ this(certificateProblemListener);
+ this.chid = chid;
+ }
+
+ /**
+ * Constructor
+ */
+ public SwitchChannelClient(final CertificateProblemListener certificateProblemListener) {
+ super(certificateProblemListener);
+ }
+
+ /**
+ * Starts the wakeup request
+ */
+ @Override
+ public void run() {
+ if(nr != null){
+ runCommand("SETCHANNEL " + String.valueOf(nr));
+ } else {
+ runCommand("SETCHANNEL " + chid);
+ }
+ }
+
+ @Override
+ public String parseAnswer(final String line) {
+ return line;
+ }
+
+ @Override
+ public int getProgressTextId() {
+ return R.string.progress_switching;
+ }
} \ No newline at end of file
diff --git a/vdrmanager/src/de/bjusystems/vdrmanager/utils/svdrp/TimerClient.java b/vdrmanager/src/de/bjusystems/vdrmanager/utils/svdrp/TimerClient.java
index 6417541..4983745 100644
--- a/vdrmanager/src/de/bjusystems/vdrmanager/utils/svdrp/TimerClient.java
+++ b/vdrmanager/src/de/bjusystems/vdrmanager/utils/svdrp/TimerClient.java
@@ -14,37 +14,37 @@ import de.bjusystems.vdrmanager.data.Timer;
*/
public class TimerClient extends SvdrpClient<Timer> {
- /** channel names for timer */
- Map<String, Channel> channels;
-
- /**
- * Constructor
- * @param host host
- * @param port port
- * @param ssl use ssl
- */
- public TimerClient() {
- super();
- this.channels = new HashMap<String, Channel>();
- }
-
- /**
- * Starts the EPG request
- * @param parameter parameter for lste
- */
- @Override
- public synchronized void run() {
- runCommand("timers");
- }
-
- @Override
- public Timer parseAnswer(final String line) {
- return new Timer(line);
- }
-
- @Override
- public int getProgressTextId() {
- return R.string.progress_timers_loading;
- }
+ /** channel names for timer */
+ Map<String, Channel> channels;
+
+ /**
+ * Constructor
+ * @param host host
+ * @param port port
+ * @param ssl use ssl
+ */
+ public TimerClient(final CertificateProblemListener certificateProblemListener) {
+ super(certificateProblemListener);
+ this.channels = new HashMap<String, Channel>();
+ }
+
+ /**
+ * Starts the EPG request
+ * @param parameter parameter for lste
+ */
+ @Override
+ public synchronized void run() {
+ runCommand("timers");
+ }
+
+ @Override
+ public Timer parseAnswer(final String line) {
+ return new Timer(line);
+ }
+
+ @Override
+ public int getProgressTextId() {
+ return R.string.progress_timers_loading;
+ }
}
diff --git a/vdrmanager/src/de/bjusystems/vdrmanager/utils/wakeup/WakeupUrlClient.java b/vdrmanager/src/de/bjusystems/vdrmanager/utils/wakeup/WakeupUrlClient.java
index 12068fc..231554a 100644
--- a/vdrmanager/src/de/bjusystems/vdrmanager/utils/wakeup/WakeupUrlClient.java
+++ b/vdrmanager/src/de/bjusystems/vdrmanager/utils/wakeup/WakeupUrlClient.java
@@ -1,8 +1,8 @@
package de.bjusystems.vdrmanager.utils.wakeup;
import de.bjusystems.vdrmanager.data.WakeupState;
+import de.bjusystems.vdrmanager.utils.svdrp.CertificateProblemListener;
import de.bjusystems.vdrmanager.utils.svdrp.SvdrpClient;
-import de.bjusystems.vdrmanager.utils.svdrp.SvdrpException;
/**
* Class for retrieving informations about the running program
@@ -11,43 +11,43 @@ import de.bjusystems.vdrmanager.utils.svdrp.SvdrpException;
*/
public class WakeupUrlClient extends SvdrpClient<WakeupState> {
- private WakeupState state;
-
- /**
- * Constructor
- */
- public WakeupUrlClient() {
- super();
- }
-
- /**
- * Starts the wakeup request
- */
- @Override
- public void run() {
- runCommand("wake");
- }
-
- @Override
- public WakeupState parseAnswer(final String line) {
-
- if (line.startsWith("200")) {
- state = WakeupState.OK;
- } else if (line.startsWith("400")) {
- state = WakeupState.FAILED;
- } else {
- state = WakeupState.ERROR;
- }
- return state;
- }
-
- @Override
- public int getProgressTextId() {
- return 0;
- }
-
- public WakeupState getState() {
- return state;
- }
+ private WakeupState state;
+
+ /**
+ * Constructor
+ */
+ public WakeupUrlClient(final CertificateProblemListener certificateProblemListener) {
+ super(certificateProblemListener);
+ }
+
+ /**
+ * Starts the wakeup request
+ */
+ @Override
+ public void run() {
+ runCommand("wake");
+ }
+
+ @Override
+ public WakeupState parseAnswer(final String line) {
+
+ if (line.startsWith("200")) {
+ state = WakeupState.OK;
+ } else if (line.startsWith("400")) {
+ state = WakeupState.FAILED;
+ } else {
+ state = WakeupState.ERROR;
+ }
+ return state;
+ }
+
+ @Override
+ public int getProgressTextId() {
+ return 0;
+ }
+
+ public WakeupState getState() {
+ return state;
+ }
} \ No newline at end of file