From f91ddb6a834fb0dec3cd5f98783fdb3d615f48ee Mon Sep 17 00:00:00 2001 From: Victor Date: Thu, 29 Aug 2013 19:44:23 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=20=D0=BF=D1=80=D0=BE=D1=81=D0=BC=D0=BE=D1=82=D1=80=20?= =?UTF-8?q?=D1=81=D0=BE=D0=BE=D0=B1=D1=89=D0=B5=D0=BD=D0=B8=D0=B9=20=D1=84?= =?UTF-8?q?=D0=BE=D1=80=D1=83=D0=BC=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- res/layout/forum_post_item.xml | 28 +++++++ .../client/adapters/ForumPostAdapter.java | 66 ++++++++++++++++ src/com/annimon/client/entities/Action.java | 4 +- .../annimon/client/entities/ForumPost.java | 43 ++++++++++ .../client/fragments/ForumFragment.java | 49 ++++++------ .../annimon/client/tasks/ForumPostLoader.java | 79 +++++++++++++++++++ src/com/annimon/client/utils/InetUtils.java | 37 +++++++++ 7 files changed, 279 insertions(+), 27 deletions(-) create mode 100644 res/layout/forum_post_item.xml create mode 100644 src/com/annimon/client/adapters/ForumPostAdapter.java create mode 100644 src/com/annimon/client/entities/ForumPost.java create mode 100644 src/com/annimon/client/tasks/ForumPostLoader.java create mode 100644 src/com/annimon/client/utils/InetUtils.java 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(); + } +}