commit 1f3f4c88c7aaeb1ea4bddcf3ca750022cba6b7be
parent 9ea009d9ef12a28cba3620ee32531117f710ad21
Author: Jan Dankert <devnull@localhost>
Date: Tue, 24 Jan 2012 01:35:18 +0100
Nachladebare Topics, Tapatalk-Client in eigener Klasse und Wrapper für Rückgabeobjekte.
Diffstat:
14 files changed, 711 insertions(+), 88 deletions(-)
diff --git a/res/values/strings.xml b/res/values/strings.xml
@@ -1,6 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
+ <string name="sub_only">Forum enthält keine Themen</string>
<string name="app_name">IBC</string>
<string name="preferences">Einstellungen</string>
<string name="username">Benutzername</string>
@@ -30,14 +31,17 @@
<string name="publish">Veröffentlichen</string>
<string name="properties">Eigenschaften</string>
<string name="loading">Warten auf Server</string>
+ <string name="waitingfor_news">Neue Nachrichten werden geladen</string>
+ <string name="waitingfor_forum">Foren werden geladen</string>
+ <string name="waitingfor_topic">Thema wird geladen</string>
<string name="waitingforcontent">Inhalt wird geladen</string>
<string name="waitingforprojects">Projekte werden geladen</string>
- <string name="waitingforlogin">Anmeldung am Server</string>
+ <string name="waitingfor_login">Anmeldung am Server</string>
+ <string name="waitingfor_logout">Abmeldung</string>
<string name="waitingfordelete">Löschen</string>
<string name="waitingfornew">Erzeuge</string>
<string name="waitingforsave">Speichern</string>
- <string name="waitingforlanguageload">Verfügbare Sprachen werden geladen</string>
- <string name="waitingforlanguagesave">Ausgewählte Sprache wird aktiviert</string>
+ <string name="waitingfor_loadmore">Lade weitere Einträge</string>
<string name="language">Sprache</string>
<string name="model">Variante</string>
<string name="new1">Neu</string>
@@ -83,6 +87,7 @@
<string name="saved">Gespeichert</string>
<string name="release">Freigeben</string>
<string name="noserver">Es ist noch kein Server konfiguriert. Über die Menütaste können Sie einen neuen Server anlegen.</string>
+ <string name="nousername">Es ist noch kein Benutzername konfiguriert</string>
<string name="www">Zur Webseite</string>
<string name="scroll_down">Immer an das Ende scrollen</string>
<string name="use_ibc_theme">Das IBC-Theme benutzen</string>
diff --git a/src/de/mtbnews/android/ForumActivity.java b/src/de/mtbnews/android/ForumActivity.java
@@ -24,10 +24,14 @@ import android.view.View;
import android.widget.AdapterView;
import android.widget.ListAdapter;
import android.widget.ListView;
+import android.widget.Toast;
import android.widget.AdapterView.OnItemClickListener;
+import de.mtbnews.android.adapter.ListEntryContentAdapter;
import de.mtbnews.android.adapter.MapContentAdapter;
import de.mtbnews.android.tapatalk.TapatalkClient;
import de.mtbnews.android.tapatalk.TapatalkException;
+import de.mtbnews.android.tapatalk.wrapper.Forum;
+import de.mtbnews.android.tapatalk.wrapper.Topic;
import de.mtbnews.android.util.AppData;
import de.mtbnews.android.util.IBC;
import de.mtbnews.android.util.ServerAsyncTask;
@@ -39,6 +43,7 @@ import de.mtbnews.android.util.ServerAsyncTask;
public class ForumActivity extends ListActivity
{
private Object[] forumList;
+ private Forum forum;
private SharedPreferences prefs;
@Override
@@ -53,7 +58,7 @@ public class ForumActivity extends ListActivity
prefs = PreferenceManager.getDefaultSharedPreferences(this);
- if (prefs.getBoolean("auto_login", false))
+ if (!AppData.client.loggedIn && prefs.getBoolean("auto_login", false))
{
login();
}
@@ -81,17 +86,45 @@ public class ForumActivity extends ListActivity
private void login()
{
final TapatalkClient client = AppData.client;
- new ServerAsyncTask(this, R.string.waitingforlogin)
+ new ServerAsyncTask(this, R.string.waitingfor_login)
{
-
+
@Override
- protected void callServer() throws IOException
+ protected synchronized void callServer() throws IOException
{
-
+
try
{
Map<String, Object> map = client.login(prefs.getString(
"username", ""), prefs.getString("password", ""));
+
+ }
+ catch (TapatalkException e)
+ {
+ e.printStackTrace();
+ throw new RuntimeException(e);
+ }
+
+ }
+
+ }.executeSynchronized();
+ }
+
+
+ private void logout()
+ {
+ final TapatalkClient client = AppData.client;
+
+ new ServerAsyncTask(this, R.string.waitingfor_logout)
+ {
+
+ @Override
+ protected synchronized void callServer() throws IOException
+ {
+
+ try
+ {
+ client.logout();
}
catch (TapatalkException e)
@@ -102,7 +135,7 @@ public class ForumActivity extends ListActivity
}
- }.execute();
+ }.executeSynchronized();
}
private void loadUnread()
@@ -241,10 +274,12 @@ public class ForumActivity extends ListActivity
int position, long id)
{
- // final Intent intent = new Intent(ForumActivity.this,
- // NewsDetailActivity.class);
- // intent.putExtra("itemid", position);
- // startActivity(intent);
+ final Intent intent = new Intent(ForumActivity.this,
+ TopicActivity.class);
+ intent.putExtra("topic_id",
+ (String) ((Map) forumList[position]).get("topic_id"));
+ startActivity(intent);
+
}
});
}
@@ -255,7 +290,7 @@ public class ForumActivity extends ListActivity
.getDefaultSharedPreferences(this);
final XMLRPCClient client = AppData.client.getXMLRPCClient();
- new ServerAsyncTask(this, R.string.waitingforcontent)
+ new ServerAsyncTask(this, R.string.waitingfor_forum)
{
private Object[] forumList;
@@ -306,10 +341,12 @@ public class ForumActivity extends ListActivity
int position, long id)
{
- // final Intent intent = new Intent(ForumActivity.this,
- // NewsDetailActivity.class);
- // intent.putExtra("itemid", position);
- // startActivity(intent);
+ final Intent intent = new Intent(ForumActivity.this,
+ TopicActivity.class);
+ intent.putExtra("topic_id",
+ (String) ((Map) forumList[position]).get("topic_id"));
+ startActivity(intent);
+
}
});
}
@@ -317,12 +354,12 @@ public class ForumActivity extends ListActivity
private void loadForum(final String forumId)
{
- final XMLRPCClient client = AppData.client.getXMLRPCClient();
+ final TapatalkClient client = AppData.client;
- new ServerAsyncTask(this, R.string.waitingforcontent)
+ new ServerAsyncTask(this, R.string.waitingfor_forum)
{
- private Object[] forumList;
+ // private Object[] forumList;
@Override
protected void callServer() throws IOException
@@ -330,13 +367,10 @@ public class ForumActivity extends ListActivity
try
{
- Map map = (Map) client.call("get_topic", forumId);
-
- this.forumList = (Object[]) map.get("topics");
+ forum = client.getForum(forumId);
}
- catch (XMLRPCException e)
+ catch (TapatalkException e)
{
- e.printStackTrace();
throw new RuntimeException(e);
}
@@ -344,33 +378,29 @@ public class ForumActivity extends ListActivity
protected void doOnSuccess()
{
- List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
- for (Object o : forumList)
- {
- list.add((Map) o);
- }
- ListAdapter adapter = new MapContentAdapter(ForumActivity.this,
- list, "last_reply_time", "topic_title", "short_content");
- // IBCActivity.this.setTitle(feed.getTitle());
- setListAdapter(adapter);
+ ForumActivity.this.setTitle(forum.getTitle());
+ ListAdapter adapter = new ListEntryContentAdapter(
+ ForumActivity.this, forum.getTopics());
+ setListAdapter(adapter);
}
}.execute();
+
final ListView list = getListView();
list.setOnItemClickListener(new OnItemClickListener()
{
-
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id)
{
+ final Intent intent = new Intent(ForumActivity.this,
+ TopicActivity.class);
+ intent.putExtra("topic_id", forum.getTopics().get(position)
+ .getId());
+ startActivity(intent);
- // final Intent intent = new Intent(ForumActivity.this,
- // NewsDetailActivity.class);
- // intent.putExtra("itemid", position);
- // startActivity(intent);
}
});
}
@@ -380,7 +410,11 @@ public class ForumActivity extends ListActivity
{
super.onCreateOptionsMenu(menu);
MenuInflater mi = new MenuInflater(getApplication());
- mi.inflate(R.menu.forum, menu);
+
+ if (AppData.client.loggedIn)
+ mi.inflate(R.menu.forum, menu);
+ else
+ mi.inflate(R.menu.forum_guest, menu);
return true;
}
@@ -411,12 +445,15 @@ public class ForumActivity extends ListActivity
return true;
case R.id.menu_logout:
- return false;
+ logout();
+ return true;
case R.id.menu_login:
if (TextUtils.isEmpty(prefs.getString("username", "")))
{
+ Toast.makeText(this,R.string.nousername,Toast.LENGTH_LONG).show();
+
Intent intent4 = new Intent(this, Configuration.class);
startActivity(intent4);
}
@@ -424,11 +461,12 @@ public class ForumActivity extends ListActivity
if (!TextUtils.isEmpty(prefs.getString("username", "")))
{
- Intent intent4 = new Intent(this, Configuration.class);
- startActivity(intent4);
+ login();
+ }
+ else {
+ Toast.makeText(this,R.string.nousername,Toast.LENGTH_LONG).show();
}
- login();
return true;
}
diff --git a/src/de/mtbnews/android/ForumOverviewActivity.java b/src/de/mtbnews/android/ForumOverviewActivity.java
@@ -26,6 +26,7 @@ import android.widget.AdapterView;
import android.widget.ExpandableListView;
import android.widget.ListAdapter;
import android.widget.ListView;
+import android.widget.Toast;
import android.widget.AdapterView.OnItemClickListener;
import de.mtbnews.android.adapter.MapContentAdapter;
import de.mtbnews.android.tapatalk.TapatalkClient;
@@ -67,7 +68,7 @@ public class ForumOverviewActivity extends ListActivity
private void login()
{
final TapatalkClient client = AppData.client;
- new ServerAsyncTask(this, R.string.waitingforlogin)
+ new ServerAsyncTask(this, R.string.waitingfor_login)
{
@Override
@@ -97,7 +98,7 @@ public class ForumOverviewActivity extends ListActivity
{
final XMLRPCClient client = AppData.client.getXMLRPCClient();
- new ServerAsyncTask(this, R.string.waitingforcontent)
+ new ServerAsyncTask(this, R.string.waitingfor_forum)
{
private Object[] forumList;
@@ -147,7 +148,12 @@ public class ForumOverviewActivity extends ListActivity
.get(position);
boolean subOnly = (Boolean) map.get("sub_only");
- if (!subOnly)
+ if (subOnly)
+ {
+ Toast.makeText(ForumOverviewActivity.this,
+ R.string.sub_only, Toast.LENGTH_SHORT).show();
+ }
+ else
{
final Intent intent = new Intent(
ForumOverviewActivity.this, ForumActivity.class);
@@ -168,6 +174,17 @@ public class ForumOverviewActivity extends ListActivity
return true;
}
+ /**
+ * {@inheritDoc}
+ *
+ * @see android.app.Activity#onSearchRequested()
+ */
+ @Override
+ public boolean onSearchRequested()
+ {
+ return super.onSearchRequested();
+ }
+
public boolean onOptionsItemSelected(MenuItem item)
{
switch (item.getItemId())
@@ -194,12 +211,15 @@ public class ForumOverviewActivity extends ListActivity
return true;
case R.id.menu_logout:
- return false;
+ logout();
+ return true;
case R.id.menu_login:
if (TextUtils.isEmpty(prefs.getString("username", "")))
{
+ Toast.makeText(this,R.string.nousername,Toast.LENGTH_LONG).show();
+
Intent intent4 = new Intent(this, Configuration.class);
startActivity(intent4);
}
@@ -207,11 +227,12 @@ public class ForumOverviewActivity extends ListActivity
if (!TextUtils.isEmpty(prefs.getString("username", "")))
{
- Intent intent4 = new Intent(this, Configuration.class);
- startActivity(intent4);
+ login();
+ }
+ else {
+ Toast.makeText(this,R.string.nousername,Toast.LENGTH_LONG).show();
}
- login();
return true;
}
@@ -238,4 +259,34 @@ public class ForumOverviewActivity extends ListActivity
return list;
}
+
+
+ private void logout()
+ {
+ final TapatalkClient client = AppData.client;
+
+ new ServerAsyncTask(this, R.string.waitingfor_logout)
+ {
+
+ @Override
+ protected synchronized void callServer() throws IOException
+ {
+
+ try
+ {
+ client.logout();
+
+ }
+ catch (TapatalkException e)
+ {
+ e.printStackTrace();
+ throw new RuntimeException(e);
+ }
+
+ }
+
+ }.executeSynchronized();
+ }
+
+
}
diff --git a/src/de/mtbnews/android/IBCActivity.java b/src/de/mtbnews/android/IBCActivity.java
@@ -108,7 +108,7 @@ public class IBCActivity extends ListActivity
return;
}
- new ServerAsyncTask(this, R.string.waitingforcontent)
+ new ServerAsyncTask(this, R.string.waitingfor_news)
{
private RSSFeed feed;
diff --git a/src/de/mtbnews/android/MailActivity.java b/src/de/mtbnews/android/MailActivity.java
@@ -44,7 +44,7 @@ public class MailActivity extends ListActivity
try
{
- Object l = AppData.client.call("get_box");
+ Object l = AppData.client.getXMLRPCClient().call("get_box");
this.forumList = (Object[]) ((Map) l).get("list");
diff --git a/src/de/mtbnews/android/MailboxActivity.java b/src/de/mtbnews/android/MailboxActivity.java
@@ -51,7 +51,7 @@ public class MailboxActivity extends ListActivity
try
{
- Object l = AppData.client.call("get_box_info");
+ Object l = AppData.client.getXMLRPCClient().call("get_box_info");
this.forumList = (Object[]) ((Map) l).get("list");
diff --git a/src/de/mtbnews/android/TopicActivity.java b/src/de/mtbnews/android/TopicActivity.java
@@ -17,12 +17,19 @@ import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.view.View;
+import android.widget.AbsListView;
import android.widget.AdapterView;
import android.widget.ListAdapter;
import android.widget.ListView;
+import android.widget.AbsListView.OnScrollListener;
import android.widget.AdapterView.OnItemClickListener;
+import de.mtbnews.android.adapter.ListEntryContentAdapter;
import de.mtbnews.android.adapter.MapContentAdapter;
import de.mtbnews.android.tapatalk.TapatalkClient;
+import de.mtbnews.android.tapatalk.TapatalkException;
+import de.mtbnews.android.tapatalk.wrapper.ListEntry;
+import de.mtbnews.android.tapatalk.wrapper.Post;
+import de.mtbnews.android.tapatalk.wrapper.Topic;
import de.mtbnews.android.util.AppData;
import de.mtbnews.android.util.ServerAsyncTask;
@@ -35,7 +42,14 @@ public class TopicActivity extends ListActivity
public static final String ID = "id";
public static final String CLIENT = "client";
- private Object[] forumList;
+ private boolean loadingMore = true;
+
+ private int displayFrom;
+ private int displayTo;
+ private int postCount;
+
+ private List<Post> posts;
+ private Topic topic;
Map<String, String> data;
@@ -49,28 +63,35 @@ public class TopicActivity extends ListActivity
setContentView(R.layout.listing);
- new ServerAsyncTask(this, R.string.waitingforcontent)
+ new ServerAsyncTask(this, R.string.waitingfor_topic)
{
+
@Override
protected void callServer() throws IOException
{
+ TapatalkClient client = AppData.client;
- XMLRPCClient client = AppData.client.getXMLRPCClient();
- // add 2 to 4
try
{
- // add 2 to 4
- Object[] params = new Object[] { TopicActivity.this
- .getIntent().getStringExtra("topic_id") };
- Object l = client.call("get_thread",params[0]);
+ int start = 0;
+ int end = Integer.parseInt(prefs
+ .getString("num_load", "10")) - 1;
- forumList = (Object[]) ((Map) l).get("posts");
+ displayFrom = start;
+ displayTo = end;
-// TopicActivity.this.setTitle(((Map) l).get("topic_title")
-// .toString());
+ String topicId = TopicActivity.this.getIntent()
+ .getStringExtra("topic_id");
+ topic = client.getTopic(topicId, start, end);
+
+
+ postCount = topic.getPostCount();
+ posts = topic.getPosts();
+
+ loadingMore = false;
}
- catch (XMLRPCException e)
+ catch (TapatalkException e)
{
throw new RuntimeException(e);
}
@@ -78,14 +99,10 @@ public class TopicActivity extends ListActivity
protected void doOnSuccess()
{
- List<Map<String, Object>> list1 = new ArrayList<Map<String, Object>>();
- for (Object o : forumList)
- {
- list1.add((Map) o);
- }
- ListAdapter adapter = new MapContentAdapter(TopicActivity.this,
- list1, null, "post_title", "post_content");
- // IBCActivity.this.setTitle(feed.getTitle());
+ TopicActivity.this.setTitle(topic.getTitle());
+ List p = posts;
+ ListAdapter adapter = new ListEntryContentAdapter(
+ TopicActivity.this, p);
setListAdapter(adapter);
}
@@ -95,7 +112,6 @@ public class TopicActivity extends ListActivity
list.setOnItemClickListener(new OnItemClickListener()
{
-
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id)
@@ -107,5 +123,79 @@ public class TopicActivity extends ListActivity
}
});
+ /**
+ * Weitere List-Einträge automatisch nachladen.
+ */
+ list.setOnScrollListener(new OnScrollListener()
+ {
+
+ @Override
+ public void onScrollStateChanged(AbsListView view, int scrollState)
+ {
+ }
+
+ @Override
+ public void onScroll(AbsListView view, int firstVisibleItem,
+ int visibleItemCount, int totalItemCount)
+ {
+
+ // what is the bottom iten that is visible
+ int lastInScreen = firstVisibleItem + visibleItemCount;
+
+ // is the bottom item visible & not loading more already ? Load
+ // more !
+ if ((lastInScreen == totalItemCount) && !(loadingMore))
+ {
+ loadingMore = true;
+ new ServerAsyncTask(TopicActivity.this,
+ R.string.waitingfor_loadmore)
+ {
+ @Override
+ protected void callServer() throws IOException
+ {
+ TapatalkClient client = AppData.client;
+
+ try
+ {
+ int start = displayTo + 1;
+ int end = start
+ + Integer.parseInt(prefs.getString(
+ "num_load", "10")) - 1;
+
+ displayTo = end;
+
+ String topicId = TopicActivity.this.getIntent()
+ .getStringExtra("topic_id");
+
+ Topic topic = client.getTopic(topicId, start,
+ end);
+
+
+ postCount = topic.getPostCount();
+ posts.addAll(topic.getPosts());
+
+ loadingMore = false;
+ }
+ catch (TapatalkException e)
+ {
+ throw new RuntimeException(e);
+ }
+ }
+
+ protected void doOnSuccess()
+ {
+ TopicActivity.this.setTitle(topic.getTitle());
+
+ ListAdapter adapter = new ListEntryContentAdapter(
+ TopicActivity.this, posts);
+ setListAdapter(adapter);
+ }
+
+ }.execute();
+
+ }
+ }
+ });
+
}
}
diff --git a/src/de/mtbnews/android/adapter/ListEntryContentAdapter.java b/src/de/mtbnews/android/adapter/ListEntryContentAdapter.java
@@ -0,0 +1,110 @@
+/**
+ *
+ */
+package de.mtbnews.android.adapter;
+
+import java.util.List;
+import java.util.Map;
+
+import android.content.Context;
+import android.text.format.DateFormat;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.BaseAdapter;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+import de.mtbnews.android.R;
+import de.mtbnews.android.tapatalk.wrapper.ListEntry;
+
+/**
+ * @author dankert
+ *
+ */
+public class ListEntryContentAdapter extends BaseAdapter
+{
+
+ /** Remember our context so we can use it when constructing views. */
+ private Context mContext;
+
+ /**
+ * Hold onto a copy of the entire Contact List.
+ */
+
+ private LayoutInflater inflator;
+
+ private List<? extends ListEntry> list;
+
+ public ListEntryContentAdapter(Context context, List<? extends ListEntry> list)
+ {
+ mContext = context;
+ inflator = (LayoutInflater) context
+ .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
+ this.list = list;
+ }
+
+ public int getCount()
+ {
+ return list.size();
+ }
+
+ public Object getItem(int position)
+ {
+ return list.get(position);
+ }
+
+ /** Use the array index as a unique id. */
+ public long getItemId(int position)
+ {
+ return position;
+
+ }
+
+ /**
+ * @param convertView
+ * The old view to overwrite, if one is passed
+ * @returns a ContactEntryView that holds wraps around an ContactEntry
+ */
+ public View getView(int position, View convertView, ViewGroup parent)
+ {
+
+ ListEntry e = list.get(position);
+
+ final View view = inflator.inflate(R.layout.rss_item, null);
+
+ // Linken Rand ggf. erhöhen.
+ // LinearLayout.LayoutParams params2 = new LinearLayout.LayoutParams(
+ // LinearLayout.LayoutParams.FILL_PARENT,
+ // LinearLayout.LayoutParams.WRAP_CONTENT);
+ // params2.setMargins(20,0,0,0);
+ // view.setLayoutParams(params2);
+
+ TextView datum = (TextView) view.findViewById(R.id.item_date);
+ if (e.getDate() != null)
+ {
+ datum.setText(DateFormat.getDateFormat(parent.getContext()).format(
+ e.getDate())
+ + " "
+ + DateFormat.getTimeFormat(parent.getContext()).format(
+ e.getDate()));
+ }
+ else
+ {
+ datum.setEnabled(false);
+ }
+
+ if (e.getTitle() != null)
+ {
+ TextView name = (TextView) view.findViewById(R.id.item_title);
+ name.setText(e.getTitle());
+ }
+
+ if (e.getContent() != null)
+ {
+ TextView desc = (TextView) view.findViewById(R.id.item_description);
+ desc.setText(e.getContent());
+ }
+
+ return view;
+ }
+}
diff --git a/src/de/mtbnews/android/adapter/MapContentAdapter.java b/src/de/mtbnews/android/adapter/MapContentAdapter.java
@@ -86,15 +86,19 @@ public class MapContentAdapter extends BaseAdapter
// params2.setMargins(20,0,0,0);
// view.setLayoutParams(params2);
+ TextView datum = (TextView) view.findViewById(R.id.item_date);
if (dateKey != null)
{
- TextView datum = (TextView) view.findViewById(R.id.item_date);
datum.setText(DateFormat.getDateFormat(parent.getContext()).format(
e.get(dateKey))
+ " "
+ DateFormat.getTimeFormat(parent.getContext()).format(
e.get(dateKey)));
}
+ else
+ {
+ datum.setEnabled(false);
+ }
if (titleKey != null)
{
@@ -107,8 +111,7 @@ public class MapContentAdapter extends BaseAdapter
TextView desc = (TextView) view.findViewById(R.id.item_description);
if (e.get(descriptionKey) != null)
- desc.setText(new String((byte[]) e.get(descriptionKey))
- + " ...");
+ desc.setText(new String((byte[]) e.get(descriptionKey)));
else
desc.setText("");
}
diff --git a/src/de/mtbnews/android/tapatalk/TapatalkClient.java b/src/de/mtbnews/android/tapatalk/TapatalkClient.java
@@ -0,0 +1,181 @@
+package de.mtbnews.android.tapatalk;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+import org.xmlrpc.android.XMLRPCClient;
+import org.xmlrpc.android.XMLRPCException;
+
+import de.mtbnews.android.tapatalk.wrapper.Forum;
+import de.mtbnews.android.tapatalk.wrapper.Post;
+import de.mtbnews.android.tapatalk.wrapper.Topic;
+
+/**
+ * Tapatalk-kompatibler Client.
+ *
+ * @author dankert
+ *
+ */
+public class TapatalkClient
+{
+ private XMLRPCClient client;
+ public boolean loggedIn;
+
+ public TapatalkClient(String connectorUrl)
+ {
+ this.client = new XMLRPCClient(connectorUrl);
+ }
+
+ @SuppressWarnings("unchecked")
+ public Map<String, Object> login(String username, String password)
+ throws TapatalkException
+ {
+
+ final Object[] params = new Object[] { username.getBytes(),
+ password.getBytes() };
+
+ try
+ {
+
+ final Map<String, Object> map = (Map<String, Object>) toMap(getXMLRPCClient()
+ .callEx("login", params));
+ this.loggedIn = true;
+ return map;
+ }
+ catch (XMLRPCException e)
+ {
+ throw new TapatalkException("Login failed", e);
+ }
+ }
+
+ public void logout() throws TapatalkException
+ {
+
+ try
+ {
+ @SuppressWarnings("unused")
+ Object result = getXMLRPCClient().call("logout_user");
+ this.loggedIn = false;
+ }
+ catch (XMLRPCException e)
+ {
+ throw new TapatalkException("Logout failed", e);
+ }
+ }
+
+ @SuppressWarnings("unchecked")
+ public Topic getTopic(String topicId, int start, int end)
+ throws TapatalkException
+ {
+ try
+ {
+ Object[] params = new Object[] { topicId, start, end };
+
+ Map map = toMap(client.callEx("get_thread", params));
+
+ toMap(map);
+
+ String title = byteArrayToString(map.get("topic_title"));
+ String id = (String) map.get("topic_id");
+ int postCount = toInt(map.get("total_post_num"));
+
+ List<Post> posts = new ArrayList<Post>();
+ Topic topic = new Topic(id, posts, title, null, null, postCount);
+
+ for (Object o1 : (Object[]) map.get("posts"))
+ {
+ Map postMap = (Map) o1;
+ Post post = new Post(new String((byte[]) postMap
+ .get("post_title")), new String((byte[]) postMap
+ .get("post_content")));
+ posts.add(post);
+ }
+
+ return topic;
+ }
+ catch (XMLRPCException e)
+ {
+ throw new TapatalkException("Could not load Topic " + topicId, e);
+ }
+ }
+
+ private Map toMap(Object o) throws TapatalkException
+ {
+ if (!(o instanceof Map))
+ {
+ throw new TapatalkException("no map: " + o.toString() + " ("
+ + o.getClass() + ")");
+ }
+ Map map = (Map) o;
+
+ Object object = map.get("result");
+ if (object == null)
+ return map;
+
+ boolean ok = (Boolean) object;
+ if (!ok)
+ throw new TapatalkException(byteArrayToString(map
+ .get("result_text")));
+ return map;
+ }
+
+ @SuppressWarnings("unchecked")
+ public Forum getForum(String forumId) throws TapatalkException
+ {
+ try
+ {
+ Object o = client.call("get_topic", forumId);
+
+ Map map = (Map) o;
+ String title = new String((byte[]) map.get("forum_name"));
+ String id = (String) map.get("forum_id");
+
+ final List<Topic> topics = new ArrayList<Topic>();
+ final List<Post> posts = new ArrayList<Post>();
+
+ Forum forum = new Forum(id, topics, title, null, null);
+ for (Object o1 : (Object[]) map.get("topics"))
+ {
+ Map topicMap = (Map) o1;
+ Topic topic = new Topic((String) topicMap.get("topic_id"),
+ posts, //
+ byteArrayToString(topicMap.get("topic_title")),//
+ (Date) topicMap.get("last_reply_time"), //
+ new String((byte[]) topicMap.get("short_content")),//
+ 0);
+ topics.add(topic);
+ }
+
+ return forum;
+ }
+ catch (XMLRPCException e)
+ {
+ throw new TapatalkException("Could not load Forum " + forumId, e);
+ }
+ }
+
+ public XMLRPCClient getXMLRPCClient()
+ {
+ return client;
+ }
+
+ private static String byteArrayToString(Object object)
+ {
+ byte[] byteArray = (byte[]) object;
+ if (byteArray == null)
+ return null;
+ else
+ return new String(byteArray);
+ }
+
+ private static int toInt(Object object)
+ {
+ Integer i = (Integer) object;
+ if (i == null)
+ return 0;
+ else
+ return i.intValue();
+ }
+}
diff --git a/src/de/mtbnews/android/tapatalk/wrapper/Forum.java b/src/de/mtbnews/android/tapatalk/wrapper/Forum.java
@@ -0,0 +1,77 @@
+package de.mtbnews.android.tapatalk.wrapper;
+
+import java.util.Date;
+import java.util.List;
+
+public class Forum implements ListEntry
+{
+
+ private String id;
+
+ private List<Topic> topics;
+
+ private String title;
+ private Date date;
+ private String content;
+
+ /**
+ * @param id
+ * @param topics
+ * @param title
+ * @param date
+ * @param content
+ * @param postCount
+ */
+ public Forum(String id, List<Topic> topics, String title, Date date,
+ String content)
+ {
+ super();
+ this.id = id;
+ this.topics = topics;
+ this.title = title;
+ this.date = date;
+ this.content = content;
+ }
+
+
+ /**
+ * @return the id
+ */
+ public String getId()
+ {
+ return id;
+ }
+
+ /**
+ * @return the title
+ */
+ public String getTitle()
+ {
+ return title;
+ }
+
+ /**
+ * @return the date
+ */
+ public Date getDate()
+ {
+ return date;
+ }
+
+ /**
+ * @return the content
+ */
+ public String getContent()
+ {
+ return content;
+ }
+
+ /**
+ * @return the topics
+ */
+ public List<Topic> getTopics()
+ {
+ return topics;
+ }
+
+}
diff --git a/src/de/mtbnews/android/tapatalk/wrapper/ListEntry.java b/src/de/mtbnews/android/tapatalk/wrapper/ListEntry.java
@@ -0,0 +1,13 @@
+package de.mtbnews.android.tapatalk.wrapper;
+
+import java.util.Date;
+
+public interface ListEntry
+{
+
+ String getTitle();
+
+ String getContent();
+
+ Date getDate();
+}
diff --git a/src/de/mtbnews/android/tapatalk/wrapper/Post.java b/src/de/mtbnews/android/tapatalk/wrapper/Post.java
@@ -0,0 +1,44 @@
+package de.mtbnews.android.tapatalk.wrapper;
+
+import java.util.Date;
+
+public class Post implements ListEntry
+{
+
+ private String title;
+ private String content;
+
+ /**
+ * @param title
+ * @param content
+ */
+ public Post(String title, String content)
+ {
+ super();
+ this.title = title;
+ this.content = content;
+ }
+
+ /**
+ * @return the title
+ */
+ public String getTitle()
+ {
+ return title;
+ }
+
+ /**
+ * @return the content
+ */
+ public String getContent()
+ {
+ return content;
+ }
+
+ @Override
+ public Date getDate()
+ {
+ return null;
+ }
+
+}
diff --git a/src/de/mtbnews/android/util/ServerAsyncTask.java b/src/de/mtbnews/android/util/ServerAsyncTask.java
@@ -31,8 +31,7 @@ import android.util.Log;
* @author dankert
*
*/
-public abstract class ServerAsyncTask extends
- AsyncTask<Void, Void, Void>
+public abstract class ServerAsyncTask extends AsyncTask<Void, Void, Void>
{
private ProgressDialog progressDialog;
private Context context;
@@ -58,13 +57,16 @@ public abstract class ServerAsyncTask extends
final protected void onPreExecute()
{
progressDialog.setCancelable(true);
- progressDialog.setOnCancelListener(new DialogInterface.OnCancelListener(){
- @Override
- public void onCancel(DialogInterface dialog) {
- ServerAsyncTask.this.cancel(true);
- }
- });
-
+ progressDialog
+ .setOnCancelListener(new DialogInterface.OnCancelListener()
+ {
+ @Override
+ public void onCancel(DialogInterface dialog)
+ {
+ ServerAsyncTask.this.cancel(true);
+ }
+ });
+
progressDialog.show();
}
@@ -155,4 +157,13 @@ public abstract class ServerAsyncTask extends
* Vom Server erzeugte Fehler
*/
protected abstract void callServer() throws IOException;
+
+ /**
+ *
+ * @param params
+ */
+ public synchronized final void executeSynchronized(Void... params)
+ {
+ super.execute(params);
+ }
}