android-ibc-forum

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs

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:
res/values/strings.xml | 11++++++++---
src/de/mtbnews/android/ForumActivity.java | 122++++++++++++++++++++++++++++++++++++++++++++++++++++---------------------------
src/de/mtbnews/android/ForumOverviewActivity.java | 65++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-------
src/de/mtbnews/android/IBCActivity.java | 2+-
src/de/mtbnews/android/MailActivity.java | 2+-
src/de/mtbnews/android/MailboxActivity.java | 2+-
src/de/mtbnews/android/TopicActivity.java | 132++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-------------
src/de/mtbnews/android/adapter/ListEntryContentAdapter.java | 110+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
src/de/mtbnews/android/adapter/MapContentAdapter.java | 9++++++---
src/de/mtbnews/android/tapatalk/TapatalkClient.java | 181+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
src/de/mtbnews/android/tapatalk/wrapper/Forum.java | 77+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
src/de/mtbnews/android/tapatalk/wrapper/ListEntry.java | 13+++++++++++++
src/de/mtbnews/android/tapatalk/wrapper/Post.java | 44++++++++++++++++++++++++++++++++++++++++++++
src/de/mtbnews/android/util/ServerAsyncTask.java | 29++++++++++++++++++++---------
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); + } }