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" <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"> android:versionName="1.0" xmlns:android="http://schemas.android.com/apk/res/android" android:installLocation="auto">
<uses-sdk <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.OnItemSelectedListener;
import org.RickBarrette.osj.forum.content.TopicAdapter; import org.RickBarrette.osj.forum.content.TopicAdapter;
import org.RickBarrette.osj.forum.content.TopicContent; 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.app.Activity;
import android.os.Bundle; import android.os.Bundle;
@@ -38,7 +41,7 @@ import android.widget.ListView;
* *
* @author ricky barrette * @author ricky barrette
*/ */
public class ForumDetailFragment extends ListFragment { public class ForumDetailFragment extends ListFragment implements DatabaseListener {
public static final String ARG_ITEM_ID = "item_id"; public static final String ARG_ITEM_ID = "item_id";
private int mActivatedPosition = ListView.INVALID_POSITION; private int mActivatedPosition = ListView.INVALID_POSITION;
@@ -46,10 +49,30 @@ public class ForumDetailFragment extends ListFragment {
ForumItem mItem; ForumItem mItem;
private OnItemSelectedListener mCallbacks; private OnItemSelectedListener mCallbacks;
private ForumDatabase mDb;
public ForumDetailFragment() { 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) * (non-Javadoc)
* *
@@ -69,19 +92,28 @@ public class ForumDetailFragment extends ListFragment {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
if (getArguments().containsKey(ARG_ITEM_ID)) if (getArguments().containsKey(ARG_ITEM_ID))
mItem = ForumContent.ITEM_MAP.get(getArguments().getString(ARG_ITEM_ID)); mItem = ForumContent.ITEM_MAP.get(getArguments().getString(ARG_ITEM_ID));
}
new Thread(new Runnable() { @Override
@Override public void onDatabaseCreate() {
public void run() { // TODO Auto-generated method stub
TopicContent.getTopics((String) mItem.content.get("forum_id"), getActivity());
getActivity().runOnUiThread(new Runnable() { }
@Override
public void run() { @Override
setListAdapter(new TopicAdapter(getActivity())); public void onDatabaseUpgrade() {
} // TODO Auto-generated method stub
});
} }
}).start();
@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); mCallbacks.onItemSelected(this, TopicContent.ITEMS.get(position).id);
} }
@Override
public void onRestoreComplete() {
refreshList();
}
@Override @Override
public void onSaveInstanceState(final Bundle outState) { public void onSaveInstanceState(final Bundle outState) {
super.onSaveInstanceState(outState); super.onSaveInstanceState(outState);
@@ -103,6 +140,11 @@ public class ForumDetailFragment extends ListFragment {
outState.putInt(STATE_ACTIVATED_POSITION, mActivatedPosition); outState.putInt(STATE_ACTIVATED_POSITION, mActivatedPosition);
} }
@Override
public void onSyncComplete() {
refreshList();
}
@Override @Override
public void onViewCreated(final View view, final Bundle savedInstanceState) { public void onViewCreated(final View view, final Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState); super.onViewCreated(view, savedInstanceState);
@@ -110,6 +152,21 @@ public class ForumDetailFragment extends ListFragment {
setActivatedPosition(savedInstanceState.getInt(STATE_ACTIVATED_POSITION)); 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) { public void setActivatedPosition(final int position) {
if (position == AdapterView.INVALID_POSITION) if (position == AdapterView.INVALID_POSITION)
getListView().setItemChecked(mActivatedPosition, false); getListView().setItemChecked(mActivatedPosition, false);

View File

@@ -35,6 +35,7 @@ import android.widget.AdapterView;
import android.widget.ListView; import android.widget.ListView;
/** /**
* This fragment will be used to display a list of forums to the user
* *
* @author ricky barrette * @author ricky barrette
*/ */
@@ -42,19 +43,38 @@ public class ForumListFragment extends ListFragment implements DatabaseListener
private ForumDatabase mDb; private ForumDatabase mDb;
private static final String STATE_ACTIVATED_POSITION = "activated_position"; private static final String STATE_ACTIVATED_POSITION = "activated_position";
private static final String TAG = "ForumListFragment";
private OnItemSelectedListener mCallbacks = sForumCallbacks; private OnItemSelectedListener mCallbacks = sForumCallbacks;
private int mActivatedPosition = ListView.INVALID_POSITION; private int mActivatedPosition = ListView.INVALID_POSITION;
private static OnItemSelectedListener sForumCallbacks = new OnItemSelectedListener() { private static OnItemSelectedListener sForumCallbacks = new OnItemSelectedListener() {
@Override @Override
public void onItemSelected(final Fragment listFragment, final String id) { public void onItemSelected(final Fragment listFragment, final String id) {
// TODO something
} }
}; };
public ForumListFragment() { 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 @Override
public void onAttach(final Activity activity) { public void onAttach(final Activity activity) {
super.onAttach(activity); super.onAttach(activity);
@@ -64,25 +84,6 @@ public class ForumListFragment extends ListFragment implements DatabaseListener
mCallbacks = (OnItemSelectedListener) activity; 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 @Override
public void onDatabaseCreate() { public void onDatabaseCreate() {
// TODO Auto-generated method stub // TODO Auto-generated method stub
@@ -103,8 +104,7 @@ public class ForumListFragment extends ListFragment implements DatabaseListener
@Override @Override
public void onDeletionComplete() { public void onDeletionComplete() {
// TODO Auto-generated method stub refreshList();
} }
@Override @Override
@@ -121,8 +121,7 @@ public class ForumListFragment extends ListFragment implements DatabaseListener
@Override @Override
public void onRestoreComplete() { public void onRestoreComplete() {
// TODO Auto-generated method stub refreshList();
} }
@Override @Override
@@ -134,13 +133,7 @@ public class ForumListFragment extends ListFragment implements DatabaseListener
@Override @Override
public void onSyncComplete() { public void onSyncComplete() {
getActivity().runOnUiThread(new Runnable() { refreshList();
@Override
public void run() {
ForumContent.getForum(mDb);
setListAdapter(new ForumAdapter(getActivity()));
}
});
} }
@Override @Override
@@ -150,6 +143,21 @@ public class ForumListFragment extends ListFragment implements DatabaseListener
setActivatedPosition(savedInstanceState.getInt(STATE_ACTIVATED_POSITION)); 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) { public void setActivatedPosition(final int position) {
if (position == AdapterView.INVALID_POSITION) if (position == AdapterView.INVALID_POSITION)
getListView().setItemChecked(mActivatedPosition, false); 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.ThreadContent;
import org.RickBarrette.osj.forum.content.TopicContent; import org.RickBarrette.osj.forum.content.TopicContent;
import org.RickBarrette.osj.forum.content.TopicContent.TopicItem; 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.app.Activity;
import android.os.Bundle; import android.os.Bundle;
@@ -33,7 +36,7 @@ import android.widget.AbsListView;
import android.widget.AdapterView; import android.widget.AdapterView;
import android.widget.ListView; 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"; public static final String ARG_ITEM_ID = "item_id";
private int mActivatedPosition = ListView.INVALID_POSITION; private int mActivatedPosition = ListView.INVALID_POSITION;
@@ -41,10 +44,30 @@ public class TopicDetailFragment extends ListFragment {
TopicItem mItem; TopicItem mItem;
private OnItemSelectedListener mCallbacks; private OnItemSelectedListener mCallbacks;
private ForumDatabase mDb;
public TopicDetailFragment() { 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) * (non-Javadoc)
* *
@@ -67,19 +90,28 @@ public class TopicDetailFragment extends ListFragment {
if (mItem == null) if (mItem == null)
throw new NullPointerException(); throw new NullPointerException();
}
new Thread(new Runnable() { @Override
@Override public void onDatabaseCreate() {
public void run() { // TODO Auto-generated method stub
ThreadContent.getThread((String) mItem.content.get("topic_id"), 0, 0, getActivity());
getActivity().runOnUiThread(new Runnable() { }
@Override
public void run() { @Override
setListAdapter(new ThreadAdapter(getActivity())); public void onDatabaseUpgrade() {
} // TODO Auto-generated method stub
});
} }
}).start();
@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); mCallbacks.onItemSelected(this, TopicContent.ITEMS.get(position).id);
} }
@Override
public void onRestoreComplete() {
refreshList();
}
@Override @Override
public void onSaveInstanceState(final Bundle outState) { public void onSaveInstanceState(final Bundle outState) {
super.onSaveInstanceState(outState); super.onSaveInstanceState(outState);
@@ -101,6 +138,11 @@ public class TopicDetailFragment extends ListFragment {
outState.putInt(STATE_ACTIVATED_POSITION, mActivatedPosition); outState.putInt(STATE_ACTIVATED_POSITION, mActivatedPosition);
} }
@Override
public void onSyncComplete() {
refreshList();
}
@Override @Override
public void onViewCreated(final View view, final Bundle savedInstanceState) { public void onViewCreated(final View view, final Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState); super.onViewCreated(view, savedInstanceState);
@@ -108,6 +150,21 @@ public class TopicDetailFragment extends ListFragment {
setActivatedPosition(savedInstanceState.getInt(STATE_ACTIVATED_POSITION)); 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) { public void setActivatedPosition(final int position) {
if (position == AdapterView.INVALID_POSITION) if (position == AdapterView.INVALID_POSITION)
getListView().setItemChecked(mActivatedPosition, false); 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.Log;
import org.RickBarrette.osj.forum.database.ForumDatabase; 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 * This class is used to maintain an instance of a thread's data content
* *
@@ -85,13 +83,10 @@ public class ThreadContent {
* @param context * @param context
* @author ricky barrette * @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(); ITEMS.clear();
ITEM_MAP.clear(); ITEM_MAP.clear();
final ForumDatabase db = new ForumDatabase(context);
final List<String> list = db.getThreads(topicId); final List<String> list = db.getThreads(topicId);
int index = 0; int index = 0;
for (final String item : list) for (final String item : list)
addItem(new ThreadItem(Integer.valueOf(index++).toString(), db.getThread(item))); 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.Log;
import org.RickBarrette.osj.forum.database.ForumDatabase; 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 * This class is used to maintain an instance of a topic's content data
* *
@@ -83,11 +81,10 @@ public class TopicContent {
* @return * @return
* @author ricky barrette * @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(); ITEMS.clear();
ITEM_MAP.clear(); ITEM_MAP.clear();
final ForumDatabase db = new ForumDatabase(context);
final List<String> list = db.getTopics(forumId); final List<String> list = db.getTopics(forumId);
int index = 0; int index = 0;