Browse Source

Showing labels in the navigation list or spinner.

pull/11/head
Eric Kok 12 years ago
parent
commit
597c6b1ac3
  1. 2
      core/res/layout/list_item_filter.xml
  2. 3
      core/res/layout/list_item_navigation.xml
  3. 20
      core/src/org/transdroid/core/gui/TorrentsActivity.java
  4. 19
      core/src/org/transdroid/core/gui/log/Log.java
  5. 17
      core/src/org/transdroid/core/gui/navigation/FilterListAdapter.java
  6. 16
      core/src/org/transdroid/core/gui/navigation/Label.java
  7. 10
      lib/src/org/transdroid/daemon/Rtorrent/RtorrentAdapter.java
  8. 5
      lib/src/org/xmlrpc/android/XMLRPCClient.java

2
core/res/layout/list_item_filter.xml

@ -12,6 +12,6 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:textSize="17sp" android:textSize="17sp"
android:textIsSelectable="true" /> android:textIsSelectable="false" />
</FrameLayout> </FrameLayout>

3
core/res/layout/list_item_navigation.xml

@ -3,8 +3,7 @@
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="match_parent" android:layout_height="match_parent"
android:orientation="vertical" android:orientation="vertical"
android:paddingLeft="@dimen/margin_default" android:paddingRight="@dimen/margin_half" >
android:paddingRight="@dimen/margin_default" >
<TextView <TextView
android:id="@+id/filter_text" android:id="@+id/filter_text"

20
core/src/org/transdroid/core/gui/TorrentsActivity.java

@ -20,9 +20,8 @@ import org.transdroid.core.app.settings.ServerSetting;
import org.transdroid.core.gui.lists.LocalTorrent; import org.transdroid.core.gui.lists.LocalTorrent;
import org.transdroid.core.gui.lists.SimpleListItem; import org.transdroid.core.gui.lists.SimpleListItem;
import org.transdroid.core.gui.log.Log; import org.transdroid.core.gui.log.Log;
import org.transdroid.core.gui.log.Log_;
import org.transdroid.core.gui.navigation.*; import org.transdroid.core.gui.navigation.*;
import org.transdroid.core.gui.navigation.NavigationFilter;
import org.transdroid.core.gui.navigation.NavigationHelper;
import org.transdroid.core.gui.navigation.NavigationSelectionView.NavigationFilterManager; import org.transdroid.core.gui.navigation.NavigationSelectionView.NavigationFilterManager;
import org.transdroid.core.gui.navigation.StatusType; import org.transdroid.core.gui.navigation.StatusType;
import org.transdroid.core.gui.settings.*; import org.transdroid.core.gui.settings.*;
@ -45,6 +44,7 @@ import org.transdroid.daemon.task.SetLabelTask;
import org.transdroid.daemon.task.SetTrackersTask; import org.transdroid.daemon.task.SetTrackersTask;
import org.transdroid.daemon.task.StartTask; import org.transdroid.daemon.task.StartTask;
import org.transdroid.daemon.task.StopTask; import org.transdroid.daemon.task.StopTask;
import org.transdroid.daemon.util.DLog;
import android.annotation.TargetApi; import android.annotation.TargetApi;
import android.app.SearchManager; import android.app.SearchManager;
@ -116,19 +116,22 @@ public class TorrentsActivity extends SherlockFragmentActivity implements OnNavi
navigationListAdapter = FilterListAdapter_.getInstance_(this); navigationListAdapter = FilterListAdapter_.getInstance_(this);
navigationListAdapter.updateStatusTypes(StatusType.getAllStatusTypes(this)); navigationListAdapter.updateStatusTypes(StatusType.getAllStatusTypes(this));
// Add an empty labels list (which will be updated later, but the adapter needs to be created now) // Add an empty labels list (which will be updated later, but the adapter needs to be created now)
navigationListAdapter.updateLabels(new ArrayList<SimpleListItem>()); navigationListAdapter.updateLabels(new ArrayList<Label>());
filtersList.setAdapter(navigationListAdapter); filtersList.setAdapter(navigationListAdapter);
filtersList.setOnItemSelectedListener(onFilterListItemSelected); filtersList.setOnItemSelectedListener(onFilterListItemSelected);
} else { } else {
// Add status types directly to the action bar spinner // Add status types directly to the action bar spinner
navigationSpinnerAdapter.updateStatusTypes(StatusType.getAllStatusTypes(this)); navigationSpinnerAdapter.updateStatusTypes(StatusType.getAllStatusTypes(this));
// Add an empty labels list (which will be updated later, but the adapter needs to be created now) // Add an empty labels list (which will be updated later, but the adapter needs to be created now)
navigationSpinnerAdapter.updateLabels(new ArrayList<SimpleListItem>()); navigationSpinnerAdapter.updateLabels(new ArrayList<Label>());
} }
// Now that all items (or at least their adapters) have been added // Now that all items (or at least their adapters) have been added
getSupportActionBar().setListNavigationCallbacks(navigationSpinnerAdapter, this); getSupportActionBar().setListNavigationCallbacks(navigationSpinnerAdapter, this);
currentFilter = StatusType.getShowAllType(this); currentFilter = StatusType.getShowAllType(this);
// Log messages from the server daemons using our singleton logger
DLog.setLogger(Log_.getInstance_(this));
// Connect to the last used server // Connect to the last used server
ServerSetting lastUsed = applicationSettings.getLastUsedServer(); ServerSetting lastUsed = applicationSettings.getLastUsedServer();
if (lastUsed == null) { if (lastUsed == null) {
@ -497,7 +500,14 @@ public class TorrentsActivity extends SherlockFragmentActivity implements OnNavi
if (fragmentDetails != null) { if (fragmentDetails != null) {
fragmentDetails.perhapsUpdateTorrent(torrents); fragmentDetails.perhapsUpdateTorrent(torrents);
} }
// TODO: Update local list of labels // Update local list of labels in the navigation
if (navigationListAdapter != null) {
// Labels are shown in the dedicated side navigation
navigationListAdapter.updateLabels(Label.convertToNavigationLabels(labels));
} else {
// Labels are shown in the action bar spinner
navigationSpinnerAdapter.updateLabels(Label.convertToNavigationLabels(labels));
}
} }
@UiThread @UiThread

19
core/src/org/transdroid/core/gui/log/Log.java

@ -6,6 +6,7 @@ import java.util.Date;
import org.androidannotations.annotations.EBean; import org.androidannotations.annotations.EBean;
import org.androidannotations.annotations.EBean.Scope; import org.androidannotations.annotations.EBean.Scope;
import org.androidannotations.annotations.OrmLiteDao; import org.androidannotations.annotations.OrmLiteDao;
import org.transdroid.daemon.util.ITLogger;
import android.content.Context; import android.content.Context;
@ -17,14 +18,20 @@ import com.j256.ormlite.stmt.DeleteBuilder;
* @author Eric Kok * @author Eric Kok
*/ */
@EBean(scope = Scope.Singleton) @EBean(scope = Scope.Singleton)
public class Log { public class Log implements ITLogger {
public static final String LOG_NAME = "Transdroid"; public static final String LOG_NAME = "Transdroid";
private static final long MAX_LOG_AGE = 15 * 60 * 1000; // 15 minutes private static final long MAX_LOG_AGE = 15 * 60 * 1000; // 15 minutes
// Access to resources and database in local singleton instance
private Context context;
@OrmLiteDao(helper = DatabaseHelper.class, model = ErrorLogEntry.class) @OrmLiteDao(helper = DatabaseHelper.class, model = ErrorLogEntry.class)
Dao<ErrorLogEntry, Integer> errorLogDao; Dao<ErrorLogEntry, Integer> errorLogDao;
protected Log(Context context) {
this.context = context;
}
protected void log(String logName, int priority, String message) { protected void log(String logName, int priority, String message) {
android.util.Log.println(priority, LOG_NAME, message); android.util.Log.println(priority, LOG_NAME, message);
try { try {
@ -51,4 +58,14 @@ public class Log {
Log_.getInstance_(caller).log(caller.getClass().toString(), android.util.Log.DEBUG, message); Log_.getInstance_(caller).log(caller.getClass().toString(), android.util.Log.DEBUG, message);
} }
@Override
public void d(String self, String msg) {
Log.d(context, msg);
}
@Override
public void e(String self, String msg) {
Log.e(context, msg);
}
} }

17
core/src/org/transdroid/core/gui/navigation/FilterListAdapter.java

@ -5,9 +5,10 @@ import java.util.List;
import org.androidannotations.annotations.EBean; import org.androidannotations.annotations.EBean;
import org.androidannotations.annotations.RootContext; import org.androidannotations.annotations.RootContext;
import org.transdroid.core.R; import org.transdroid.core.R;
import org.transdroid.core.gui.lists.SimpleListItem; import org.transdroid.core.app.settings.ServerSetting;
import org.transdroid.core.gui.lists.SimpleListItemAdapter; import org.transdroid.core.gui.lists.SimpleListItemAdapter;
import org.transdroid.core.gui.navigation.NavigationSelectionView.NavigationFilterManager; import org.transdroid.core.gui.navigation.NavigationSelectionView.NavigationFilterManager;
import org.transdroid.core.gui.navigation.StatusType.StatusTypeFilter;
import android.content.Context; import android.content.Context;
import android.view.View; import android.view.View;
@ -46,10 +47,10 @@ public class FilterListAdapter extends MergeAdapter {
* Update the list of available servers * Update the list of available servers
* @param servers The new list of available servers * @param servers The new list of available servers
*/ */
public void updateServers(List<? extends SimpleListItem> servers) { public void updateServers(List<ServerSetting> servers) {
if (this.serverItems == null && servers != null) { if (this.serverItems == null && servers != null) {
serverSeparator = FilterSeparatorView_.build(context).setText(context.getString(R.string.navigation_servers)); serverSeparator = FilterSeparatorView_.build(context).setText(context.getString(R.string.navigation_servers));
serverSeparator.setVisibility(serverItems.isEmpty()? View.GONE: View.VISIBLE); serverSeparator.setVisibility(servers.isEmpty()? View.GONE: View.VISIBLE);
addView(serverSeparator, false); addView(serverSeparator, false);
this.serverItems = new SimpleListItemAdapter(context, servers); this.serverItems = new SimpleListItemAdapter(context, servers);
addAdapter(serverItems); addAdapter(serverItems);
@ -66,11 +67,11 @@ public class FilterListAdapter extends MergeAdapter {
* Update the list of available status types * Update the list of available status types
* @param statusTypes The new list of available status types * @param statusTypes The new list of available status types
*/ */
public void updateStatusTypes(List<? extends SimpleListItem> statusTypes) { public void updateStatusTypes(List<StatusTypeFilter> statusTypes) {
if (this.statusTypeItems == null && statusTypes != null) { if (this.statusTypeItems == null && statusTypes != null) {
statusTypeSeparator = FilterSeparatorView_.build(context).setText( statusTypeSeparator = FilterSeparatorView_.build(context).setText(
context.getString(R.string.navigation_status)); context.getString(R.string.navigation_status));
statusTypeSeparator.setVisibility(statusTypeItems.isEmpty()? View.GONE: View.VISIBLE); statusTypeSeparator.setVisibility(statusTypes.isEmpty()? View.GONE: View.VISIBLE);
addView(statusTypeSeparator, false); addView(statusTypeSeparator, false);
this.statusTypeItems = new SimpleListItemAdapter(context, statusTypes); this.statusTypeItems = new SimpleListItemAdapter(context, statusTypes);
addAdapter(statusTypeItems); addAdapter(statusTypeItems);
@ -87,14 +88,14 @@ public class FilterListAdapter extends MergeAdapter {
* Update the list of available labels * Update the list of available labels
* @param labels The new list of available labels * @param labels The new list of available labels
*/ */
public void updateLabels(List<? extends SimpleListItem> labels) { public void updateLabels(List<Label> labels) {
if (this.labelItems == null && labels != null) { if (this.labelItems == null && labels != null) {
labelSeperator = FilterSeparatorView_.build(context).setText(context.getString(R.string.navigation_labels)); labelSeperator = FilterSeparatorView_.build(context).setText(context.getString(R.string.navigation_labels));
labelSeperator.setVisibility(labelItems.isEmpty()? View.GONE: View.VISIBLE); labelSeperator.setVisibility(labels.isEmpty()? View.GONE: View.VISIBLE);
addView(labelSeperator, false); addView(labelSeperator, false);
this.labelItems = new SimpleListItemAdapter(context, labels); this.labelItems = new SimpleListItemAdapter(context, labels);
addAdapter(labelItems); addAdapter(labelItems);
} else if (this.serverItems != null && labels != null) { } else if (this.labelItems != null && labels != null) {
labelSeperator.setVisibility(labelItems.isEmpty()? View.GONE: View.VISIBLE); labelSeperator.setVisibility(labelItems.isEmpty()? View.GONE: View.VISIBLE);
this.labelItems.update(labels); this.labelItems.update(labels);
} else { } else {

16
core/src/org/transdroid/core/gui/navigation/Label.java

@ -13,12 +13,14 @@ import android.os.Parcelable;
* Represents some label that is active or available on the server. * Represents some label that is active or available on the server.
* @author Eric Kok * @author Eric Kok
*/ */
public class Label extends org.transdroid.daemon.Label implements SimpleListItem, NavigationFilter { public class Label implements SimpleListItem, NavigationFilter {
private final String name; private final String name;
private final int count;
public Label(String name) { public Label(org.transdroid.daemon.Label daemonLabel) {
this.name = name; this.name = daemonLabel.getName();
this.count = daemonLabel.getCount();
} }
@Override @Override
@ -26,6 +28,10 @@ public class Label extends org.transdroid.daemon.Label implements SimpleListItem
return this.name; return this.name;
} }
public int getCount() {
return count;
}
@Override @Override
public boolean matches(Torrent torrent) { public boolean matches(Torrent torrent) {
return torrent.getLabelName() != null && torrent.getLabelName().equals(name); return torrent.getLabelName() != null && torrent.getLabelName().equals(name);
@ -36,13 +42,14 @@ public class Label extends org.transdroid.daemon.Label implements SimpleListItem
return null; return null;
List<Label> localLabels = new ArrayList<Label>(); List<Label> localLabels = new ArrayList<Label>();
for (org.transdroid.daemon.Label label : daemonLabels) { for (org.transdroid.daemon.Label label : daemonLabels) {
localLabels.add(new Label(label.getName())); localLabels.add(new Label(label));
} }
return localLabels; return localLabels;
} }
private Label(Parcel in) { private Label(Parcel in) {
this.name = in.readString(); this.name = in.readString();
this.count = in.readInt();
} }
public static final Parcelable.Creator<Label> CREATOR = new Parcelable.Creator<Label>() { public static final Parcelable.Creator<Label> CREATOR = new Parcelable.Creator<Label>() {
@ -63,6 +70,7 @@ public class Label extends org.transdroid.daemon.Label implements SimpleListItem
@Override @Override
public void writeToParcel(Parcel dest, int flags) { public void writeToParcel(Parcel dest, int flags) {
dest.writeString(name); dest.writeString(name);
dest.writeInt(count);
} }
} }

10
lib/src/org/transdroid/daemon/Rtorrent/RtorrentAdapter.java

@ -241,14 +241,16 @@ public class RtorrentAdapter implements IDaemonAdapter {
initialise(); initialise();
} }
String params = "";
for (Object arg : arguments) params += " " + arg.toString();
try { try {
String params = ""; DLog.d(LOG_NAME, "Calling " + serverMethod + " with params [" + (params.length() > 100? params.substring(0, 100) + "...": params) + " ]");
for (Object arg : arguments) params += " " + arg.toString();
DLog.d(LOG_NAME, "Calling " + serverMethod + " with params [" + (params.length() > 300? params.substring(0, 300) + "...": params) + " ]");
return rpcclient.call(serverMethod, arguments); return rpcclient.call(serverMethod, arguments);
} catch (XMLRPCException e) { } catch (XMLRPCException e) {
DLog.d(LOG_NAME, e.toString()); DLog.d(LOG_NAME, e.toString());
throw new DaemonException(ExceptionType.ConnectionError, "Error making call to " + serverMethod + " with params " + arguments.toString() + ": " + e.toString()); if (e.getCause() instanceof DaemonException)
throw (DaemonException) e.getCause();
throw new DaemonException(ExceptionType.ConnectionError, "Error making call to " + serverMethod + " with params [" + (params.length() > 100? params.substring(0, 100) + "...": params) + " ]: " + e.toString());
} }
} }

5
lib/src/org/xmlrpc/android/XMLRPCClient.java

@ -14,6 +14,8 @@ import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity; import org.apache.http.entity.StringEntity;
import org.apache.http.params.HttpParams; import org.apache.http.params.HttpParams;
import org.apache.http.params.HttpProtocolParams; import org.apache.http.params.HttpProtocolParams;
import org.transdroid.daemon.DaemonException;
import org.transdroid.daemon.DaemonMethod;
import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserFactory; import org.xmlpull.v1.XmlPullParserFactory;
import org.xmlpull.v1.XmlSerializer; import org.xmlpull.v1.XmlSerializer;
@ -319,6 +321,9 @@ public class XMLRPCClient {
// check status code // check status code
int statusCode = response.getStatusLine().getStatusCode(); int statusCode = response.getStatusLine().getStatusCode();
if (statusCode != HttpStatus.SC_OK) { if (statusCode != HttpStatus.SC_OK) {
if (statusCode == HttpStatus.SC_UNAUTHORIZED)
throw new DaemonException(DaemonException.ExceptionType.AuthenticationFailure, "HTTP status code: "
+ statusCode + " != " + HttpStatus.SC_OK);
throw new XMLRPCException("HTTP status code: " + statusCode + " != " + HttpStatus.SC_OK); throw new XMLRPCException("HTTP status code: " + statusCode + " != " + HttpStatus.SC_OK);
} }

Loading…
Cancel
Save