Forums, Topics, and Threads are now downloaded dynamically.

This allows for faster content downloads, however only content
downloaded will be available while offline.

Signed-off-by: Ricky Barrette <rickbarrette@gmail.com>
This commit is contained in:
2012-10-07 13:14:56 -04:00
parent 8d01869e37
commit 3856b76a3c
6 changed files with 183 additions and 69 deletions

View File

@@ -1,5 +1,5 @@
<manifest package="org.RickBarrette.osj.forum"
android:versionCode="345"
android:versionCode="364"
android:versionName="1.0" xmlns:android="http://schemas.android.com/apk/res/android" android:installLocation="auto">
<uses-sdk

View File

@@ -24,6 +24,9 @@ import org.RickBarrette.osj.forum.content.ForumContent.ForumItem;
import org.RickBarrette.osj.forum.content.OnItemSelectedListener;
import org.RickBarrette.osj.forum.content.TopicAdapter;
import org.RickBarrette.osj.forum.content.TopicContent;
import org.RickBarrette.osj.forum.database.DatabaseListener;
import org.RickBarrette.osj.forum.database.ForumDatabase;
import org.xmlrpc.android.XMLRPCClient;
import android.app.Activity;
import android.os.Bundle;
@@ -38,7 +41,7 @@ import android.widget.ListView;
*
* @author ricky barrette
*/
public class ForumDetailFragment extends ListFragment {
public class ForumDetailFragment extends ListFragment implements DatabaseListener {
public static final String ARG_ITEM_ID = "item_id";
private int mActivatedPosition = ListView.INVALID_POSITION;
@@ -46,10 +49,30 @@ public class ForumDetailFragment extends ListFragment {
ForumItem mItem;
private OnItemSelectedListener mCallbacks;
private ForumDatabase mDb;
public ForumDetailFragment() {
}
@Override
public void onActivityCreated(final Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
mDb = new ForumDatabase(getActivity(), this);
new Thread(new Runnable() {
@Override
public void run() {
mDb.saveTopics(XMLRPCClient.getClient(getActivity()), mItem.content.get("forum_id"), false);
}
}).start();
if (TopicContent.ITEMS.size() == 0) {
TopicContent.getTopics((String) mItem.content.get("forum_id"), mDb);
if (TopicContent.ITEMS.size() != 0)
setListAdapter(new TopicAdapter(getActivity()));
}
}
/**
* (non-Javadoc)
*
@@ -69,19 +92,28 @@ public class ForumDetailFragment extends ListFragment {
super.onCreate(savedInstanceState);
if (getArguments().containsKey(ARG_ITEM_ID))
mItem = ForumContent.ITEM_MAP.get(getArguments().getString(ARG_ITEM_ID));
}
new Thread(new Runnable() {
@Override
public void run() {
TopicContent.getTopics((String) mItem.content.get("forum_id"), getActivity());
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
setListAdapter(new TopicAdapter(getActivity()));
}
});
}
}).start();
@Override
public void onDatabaseCreate() {
// TODO Auto-generated method stub
}
@Override
public void onDatabaseUpgrade() {
// TODO Auto-generated method stub
}
@Override
public void onDatabaseUpgradeComplete() {
refreshList();
}
@Override
public void onDeletionComplete() {
refreshList();
}
/**
@@ -96,6 +128,11 @@ public class ForumDetailFragment extends ListFragment {
mCallbacks.onItemSelected(this, TopicContent.ITEMS.get(position).id);
}
@Override
public void onRestoreComplete() {
refreshList();
}
@Override
public void onSaveInstanceState(final Bundle outState) {
super.onSaveInstanceState(outState);
@@ -103,6 +140,11 @@ public class ForumDetailFragment extends ListFragment {
outState.putInt(STATE_ACTIVATED_POSITION, mActivatedPosition);
}
@Override
public void onSyncComplete() {
refreshList();
}
@Override
public void onViewCreated(final View view, final Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
@@ -110,6 +152,21 @@ public class ForumDetailFragment extends ListFragment {
setActivatedPosition(savedInstanceState.getInt(STATE_ACTIVATED_POSITION));
}
/**
* Refreshes the listview
*
* @author ricky barrette
*/
private void refreshList() {
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
TopicContent.getTopics((String) mItem.content.get("forum_id"), mDb);
setListAdapter(new TopicAdapter(getActivity()));
}
});
}
public void setActivatedPosition(final int position) {
if (position == AdapterView.INVALID_POSITION)
getListView().setItemChecked(mActivatedPosition, false);

View File

@@ -35,6 +35,7 @@ import android.widget.AdapterView;
import android.widget.ListView;
/**
* This fragment will be used to display a list of forums to the user
*
* @author ricky barrette
*/
@@ -42,19 +43,38 @@ public class ForumListFragment extends ListFragment implements DatabaseListener
private ForumDatabase mDb;
private static final String STATE_ACTIVATED_POSITION = "activated_position";
private static final String TAG = "ForumListFragment";
private OnItemSelectedListener mCallbacks = sForumCallbacks;
private int mActivatedPosition = ListView.INVALID_POSITION;
private static OnItemSelectedListener sForumCallbacks = new OnItemSelectedListener() {
@Override
public void onItemSelected(final Fragment listFragment, final String id) {
// TODO something
}
};
public ForumListFragment() {
}
@Override
public void onActivityCreated(final Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
mDb = new ForumDatabase(getActivity(), this);
new Thread(new Runnable() {
@Override
public void run() {
mDb.saveForums(false);
}
}).start();
if (ForumContent.ITEMS.size() == 0) {
ForumContent.getForum(mDb);
if (ForumContent.ITEMS.size() != 0)
setListAdapter(new ForumAdapter(getActivity()));
}
}
@Override
public void onAttach(final Activity activity) {
super.onAttach(activity);
@@ -64,25 +84,6 @@ public class ForumListFragment extends ListFragment implements DatabaseListener
mCallbacks = (OnItemSelectedListener) activity;
}
@Override
public void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.v(TAG, "onCreate()");
mDb = new ForumDatabase(getActivity(), this);
new Thread(new Runnable() {
@Override
public void run() {
mDb.saveForums(true);
}
}).start();
if (ForumContent.ITEMS.size() == 0)
ForumContent.getForum(mDb);
setListAdapter(new ForumAdapter(getActivity()));
}
@Override
public void onDatabaseCreate() {
// TODO Auto-generated method stub
@@ -103,8 +104,7 @@ public class ForumListFragment extends ListFragment implements DatabaseListener
@Override
public void onDeletionComplete() {
// TODO Auto-generated method stub
refreshList();
}
@Override
@@ -121,8 +121,7 @@ public class ForumListFragment extends ListFragment implements DatabaseListener
@Override
public void onRestoreComplete() {
// TODO Auto-generated method stub
refreshList();
}
@Override
@@ -134,13 +133,7 @@ public class ForumListFragment extends ListFragment implements DatabaseListener
@Override
public void onSyncComplete() {
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
ForumContent.getForum(mDb);
setListAdapter(new ForumAdapter(getActivity()));
}
});
refreshList();
}
@Override
@@ -150,6 +143,21 @@ public class ForumListFragment extends ListFragment implements DatabaseListener
setActivatedPosition(savedInstanceState.getInt(STATE_ACTIVATED_POSITION));
}
/**
* Refreshes the listview
*
* @author ricky barrette
*/
private void refreshList() {
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
ForumContent.getForum(mDb);
setListAdapter(new ForumAdapter(getActivity()));
}
});
}
public void setActivatedPosition(final int position) {
if (position == AdapterView.INVALID_POSITION)
getListView().setItemChecked(mActivatedPosition, false);

View File

@@ -24,6 +24,9 @@ import org.RickBarrette.osj.forum.content.ThreadAdapter;
import org.RickBarrette.osj.forum.content.ThreadContent;
import org.RickBarrette.osj.forum.content.TopicContent;
import org.RickBarrette.osj.forum.content.TopicContent.TopicItem;
import org.RickBarrette.osj.forum.database.DatabaseListener;
import org.RickBarrette.osj.forum.database.ForumDatabase;
import org.xmlrpc.android.XMLRPCClient;
import android.app.Activity;
import android.os.Bundle;
@@ -33,7 +36,7 @@ import android.widget.AbsListView;
import android.widget.AdapterView;
import android.widget.ListView;
public class TopicDetailFragment extends ListFragment {
public class TopicDetailFragment extends ListFragment implements DatabaseListener {
public static final String ARG_ITEM_ID = "item_id";
private int mActivatedPosition = ListView.INVALID_POSITION;
@@ -41,10 +44,30 @@ public class TopicDetailFragment extends ListFragment {
TopicItem mItem;
private OnItemSelectedListener mCallbacks;
private ForumDatabase mDb;
public TopicDetailFragment() {
}
@Override
public void onActivityCreated(final Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
mDb = new ForumDatabase(getActivity(), this);
new Thread(new Runnable() {
@Override
public void run() {
mDb.saveThreads(XMLRPCClient.getClient(getActivity()), mItem.content.get("forum_id"), mItem.content.get("topic_id"));
}
}).start();
if (ThreadContent.ITEMS.size() == 0) {
ThreadContent.getThread((String) mItem.content.get("topic_id"), mDb);
if (ThreadContent.ITEMS.size() != 0)
setListAdapter(new ThreadAdapter(getActivity()));
}
}
/**
* (non-Javadoc)
*
@@ -67,19 +90,28 @@ public class TopicDetailFragment extends ListFragment {
if (mItem == null)
throw new NullPointerException();
}
new Thread(new Runnable() {
@Override
public void run() {
ThreadContent.getThread((String) mItem.content.get("topic_id"), 0, 0, getActivity());
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
setListAdapter(new ThreadAdapter(getActivity()));
}
});
}
}).start();
@Override
public void onDatabaseCreate() {
// TODO Auto-generated method stub
}
@Override
public void onDatabaseUpgrade() {
// TODO Auto-generated method stub
}
@Override
public void onDatabaseUpgradeComplete() {
refreshList();
}
@Override
public void onDeletionComplete() {
refreshList();
}
/**
@@ -94,6 +126,11 @@ public class TopicDetailFragment extends ListFragment {
mCallbacks.onItemSelected(this, TopicContent.ITEMS.get(position).id);
}
@Override
public void onRestoreComplete() {
refreshList();
}
@Override
public void onSaveInstanceState(final Bundle outState) {
super.onSaveInstanceState(outState);
@@ -101,6 +138,11 @@ public class TopicDetailFragment extends ListFragment {
outState.putInt(STATE_ACTIVATED_POSITION, mActivatedPosition);
}
@Override
public void onSyncComplete() {
refreshList();
}
@Override
public void onViewCreated(final View view, final Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
@@ -108,6 +150,21 @@ public class TopicDetailFragment extends ListFragment {
setActivatedPosition(savedInstanceState.getInt(STATE_ACTIVATED_POSITION));
}
/**
* Refreshes the listview
*
* @author ricky barrette
*/
private void refreshList() {
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
ThreadContent.getThread((String) mItem.content.get("topic_id"), mDb);
setListAdapter(new ThreadAdapter(getActivity()));
}
});
}
public void setActivatedPosition(final int position) {
if (position == AdapterView.INVALID_POSITION)
getListView().setItemChecked(mActivatedPosition, false);

View File

@@ -27,8 +27,6 @@ import java.util.Map;
import org.RickBarrette.osj.forum.Log;
import org.RickBarrette.osj.forum.database.ForumDatabase;
import android.content.Context;
/**
* This class is used to maintain an instance of a thread's data content
*
@@ -85,13 +83,10 @@ public class ThreadContent {
* @param context
* @author ricky barrette
*/
public static void getThread(final String topicId, final int startNumber, final int lastNumber, final Context context) {
public static void getThread(final String topicId, final ForumDatabase db) {
ITEMS.clear();
ITEM_MAP.clear();
final ForumDatabase db = new ForumDatabase(context);
final List<String> list = db.getThreads(topicId);
int index = 0;
for (final String item : list)
addItem(new ThreadItem(Integer.valueOf(index++).toString(), db.getThread(item)));

View File

@@ -27,8 +27,6 @@ import java.util.Map;
import org.RickBarrette.osj.forum.Log;
import org.RickBarrette.osj.forum.database.ForumDatabase;
import android.content.Context;
/**
* This class is used to maintain an instance of a topic's content data
*
@@ -83,11 +81,10 @@ public class TopicContent {
* @return
* @author ricky barrette
*/
public static void getTopics(final String forumId, final Context context) {
public static void getTopics(final String forumId, final ForumDatabase db) {
ITEMS.clear();
ITEM_MAP.clear();
final ForumDatabase db = new ForumDatabase(context);
final List<String> list = db.getTopics(forumId);
int index = 0;