diff --git a/res/layout/forum_post_item.xml b/res/layout/forum_post_item.xml
new file mode 100644
index 0000000..d974b49
--- /dev/null
+++ b/res/layout/forum_post_item.xml
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/com/annimon/client/adapters/ForumPostAdapter.java b/src/com/annimon/client/adapters/ForumPostAdapter.java
new file mode 100644
index 0000000..ab28b52
--- /dev/null
+++ b/src/com/annimon/client/adapters/ForumPostAdapter.java
@@ -0,0 +1,66 @@
+package com.annimon.client.adapters;
+
+import java.util.List;
+import com.annimon.client.R;
+import com.annimon.client.entities.ForumPost;
+import android.content.Context;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.BaseAdapter;
+import android.widget.TextView;
+
+
+public class ForumPostAdapter extends BaseAdapter {
+
+ private final LayoutInflater inflater;
+ private List items;
+
+ public ForumPostAdapter(Context context, List items) {
+ inflater = LayoutInflater.from(context);
+ this.items = items;
+ }
+
+ @Override
+ public int getCount() {
+ return items.size();
+ }
+
+ @Override
+ public Object getItem(int position) {
+ return items.get(position);
+ }
+
+ @Override
+ public long getItemId(int position) {
+ return position;
+ }
+
+ @Override
+ public View getView(int position, View convertView, ViewGroup parent) {
+ final ViewHolder holder;
+ if (convertView == null) {
+ int layoutId = R.layout.forum_post_item;
+ convertView = inflater.inflate(layoutId, parent, false);
+
+ holder = new ViewHolder();
+ holder.author = (TextView) convertView.findViewById(R.id.forum_author);
+ holder.date = (TextView) convertView.findViewById(R.id.forum_date);
+ holder.message = (TextView) convertView.findViewById(R.id.forum_message);
+ convertView.setTag(holder);
+ } else {
+ holder = (ViewHolder) convertView.getTag();
+ }
+
+ final ForumPost post = items.get(position);
+ holder.author.setText(post.getAuthor());
+ holder.date.setText(post.getDate());
+ holder.message.setText(post.getMessage());
+
+ return convertView;
+ }
+
+ private static class ViewHolder {
+ TextView author, date, message;
+ }
+}
diff --git a/src/com/annimon/client/entities/Action.java b/src/com/annimon/client/entities/Action.java
index 3db72a8..9fc190c 100644
--- a/src/com/annimon/client/entities/Action.java
+++ b/src/com/annimon/client/entities/Action.java
@@ -2,8 +2,8 @@ package com.annimon.client.entities;
public class Action {
- public String name;
- public String path;
+ private String name;
+ private String path;
public Action(String name, String path) {
this.name = name;
diff --git a/src/com/annimon/client/entities/ForumPost.java b/src/com/annimon/client/entities/ForumPost.java
new file mode 100644
index 0000000..325d027
--- /dev/null
+++ b/src/com/annimon/client/entities/ForumPost.java
@@ -0,0 +1,43 @@
+package com.annimon.client.entities;
+
+public class ForumPost {
+
+ private String forumTitle;
+ private String author;
+ private String date;
+ private String message;
+
+ public String getForumTitle() {
+ return forumTitle;
+ }
+
+ public void setForumTitle(String forumTitle) {
+ this.forumTitle = forumTitle;
+ }
+
+ public String getAuthor() {
+ return author;
+ }
+
+ public void setAuthor(String author) {
+ this.author = author;
+ }
+
+
+ public String getDate() {
+ return date;
+ }
+
+ public void setDate(String date) {
+ this.date = date;
+ }
+
+ public String getMessage() {
+ return message;
+ }
+
+ public void setMessage(String message) {
+ this.message = message;
+ }
+
+}
diff --git a/src/com/annimon/client/fragments/ForumFragment.java b/src/com/annimon/client/fragments/ForumFragment.java
index 958a386..f5a4383 100644
--- a/src/com/annimon/client/fragments/ForumFragment.java
+++ b/src/com/annimon/client/fragments/ForumFragment.java
@@ -1,34 +1,33 @@
package com.annimon.client.fragments;
-import android.app.Fragment;
+import java.util.List;
+import android.app.ListFragment;
import android.os.Bundle;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.webkit.WebView;
-import android.webkit.WebViewClient;
-import android.widget.TextView;
-
-public class ForumFragment extends Fragment {
+import com.annimon.client.adapters.ForumPostAdapter;
+import com.annimon.client.entities.ForumPost;
+import com.annimon.client.tasks.ForumPostLoader;
+public class ForumFragment extends ListFragment {
+
+ private static final String URL = "http://annimon.com/rss/forumreader.php";
+
+ private ForumPostAdapter adapter;
+
@Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container,
- Bundle savedInstanceState) {
-
- //final View v = inflater.inflate(R.layout.about, container, false);
-
- //TextView tv = new TextView(getActivity());
- //tv.setText("This is forum fragment " + System.currentTimeMillis());
-
- WebView wv = new WebView(getActivity());
- wv.setWebViewClient(new WebViewClient() {
+ public void onActivityCreated(Bundle savedInstanceState) {
+ super.onActivityCreated(savedInstanceState);
+
+ update();
+ }
+
+ private void update() {
+ new ForumPostLoader(getActivity(), new ForumPostLoader.FinishLoadingListener() {
+
@Override
- public boolean shouldOverrideUrlLoading(WebView view, String url) {
- return super.shouldOverrideUrlLoading(view, url);
+ public void onLoadingFinished(List items) {
+ adapter = new ForumPostAdapter(getActivity(), items);
+ setListAdapter(adapter);
}
- });
- wv.loadUrl("http://annimon.com/forum/");
-
- return wv;
+ }).execute(URL);
}
}
diff --git a/src/com/annimon/client/tasks/ForumPostLoader.java b/src/com/annimon/client/tasks/ForumPostLoader.java
new file mode 100644
index 0000000..96cc615
--- /dev/null
+++ b/src/com/annimon/client/tasks/ForumPostLoader.java
@@ -0,0 +1,79 @@
+package com.annimon.client.tasks;
+
+import java.util.ArrayList;
+import java.util.List;
+import com.annimon.client.entities.ForumPost;
+import com.annimon.client.utils.InetUtils;
+import android.app.AlertDialog;
+import android.content.Context;
+import android.os.AsyncTask;
+import android.text.TextUtils;
+import android.widget.ProgressBar;
+
+/**
+ *
+ * @author aNNiMON
+ */
+public class ForumPostLoader extends AsyncTask> {
+
+ private static final String SEPARATOR = "|$|";
+
+ private Context context;
+ private FinishLoadingListener listener;
+ private AlertDialog dialog;
+
+ public ForumPostLoader(Context context, FinishLoadingListener listener) {
+ this.context = context;
+ this.listener = listener;
+ }
+
+ @Override
+ protected List doInBackground(String... params) {
+ final String text = InetUtils.getTextFromUri(params[0]);
+ if (TextUtils.isEmpty(text)) return null;
+
+ final List postItems = new ArrayList();
+
+ final String[] data = text.split(SEPARATOR);
+ final int size = data.length / 3;
+ for (int i = 0; i < size; i++) {
+ ForumPost post = new ForumPost();
+
+ String titleAuthor = data[i];
+ int breakCharIndex = titleAuthor.indexOf('\n');
+ post.setForumTitle(titleAuthor.substring(0, breakCharIndex));
+ post.setAuthor(titleAuthor.substring(breakCharIndex + 1));
+ post.setDate(data[i + 1]);
+ post.setMessage(data[i + 2]);
+
+ postItems.add(post);
+ }
+
+ return postItems;
+ }
+
+ @Override
+ protected void onPreExecute() {
+ ProgressBar progressBar = new ProgressBar(context);
+ progressBar.setIndeterminate(true);
+
+ AlertDialog.Builder builder = new AlertDialog.Builder(context);
+ builder.setCustomTitle(progressBar);
+ builder.setIcon(android.R.drawable.ic_menu_upload);
+ builder.setMessage("Please, wait...");
+ builder.setCancelable(false);
+ dialog = builder.create();
+ dialog.show();
+ }
+
+ @Override
+ protected void onPostExecute(List items) {
+ super.onPostExecute(items);
+ listener.onLoadingFinished(items);
+ dialog.dismiss();
+ }
+
+ public interface FinishLoadingListener {
+ void onLoadingFinished(List items);
+ }
+}
diff --git a/src/com/annimon/client/utils/InetUtils.java b/src/com/annimon/client/utils/InetUtils.java
new file mode 100644
index 0000000..1f680e9
--- /dev/null
+++ b/src/com/annimon/client/utils/InetUtils.java
@@ -0,0 +1,37 @@
+package com.annimon.client.utils;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.net.URL;
+
+/**
+ *
+ * @author aNNiMON
+ */
+public class InetUtils {
+
+ public static synchronized String getTextFromUri(String urlsite) {
+ StringBuilder text = new StringBuilder();
+
+ BufferedReader reader = null;
+ try {
+ final URL url = new URL(urlsite);
+ reader = new BufferedReader(new InputStreamReader(url.openStream()));
+ String line;
+ while ((line = reader.readLine()) != null) {
+ text.append(line);
+ }
+ } catch (IOException ex) {
+ ex.printStackTrace();
+ } finally {
+ if (reader != null) {
+ try {
+ reader.close();
+ } catch (IOException ex) { }
+ }
+ }
+
+ return text.toString();
+ }
+}