From 73a98c05a36419f3a44277f5d253876747aef7a8 Mon Sep 17 00:00:00 2001 From: Ricky Barrette Date: Sun, 14 Oct 2012 09:37:05 -0400 Subject: [PATCH] Started working on displaying user avatars Currently the downloading and displaying of avatar images is working, however we now need to fetch the author avatar url from the forum. Signed-off-by: Ricky Barrette --- OSJ Forum/.settings/org.eclipse.jdt.ui.prefs | 54 +++++++++ OSJ Forum/AndroidManifest.xml | 2 +- OSJ Forum/assets/legal.html | 7 +- OSJ Forum/libs/CWAC-AdapterWrapper.jar | Bin 0 -> 1641 bytes OSJ Forum/libs/CWAC-Bus.jar | Bin 0 -> 10031 bytes OSJ Forum/libs/CWAC-Cache.jar | Bin 0 -> 16501 bytes OSJ Forum/libs/CWAC-Task.jar | Bin 0 -> 9700 bytes OSJ Forum/res/layout/item_post.xml | 5 +- OSJ Forum/res/layout/item_topic.xml | 5 +- .../cwac/thumbnail/ThumbnailAdapter.java | 111 ++++++++++++++++++ .../cwac/thumbnail/ThumbnailBus.java | 36 ++++++ .../cwac/thumbnail/ThumbnailMessage.java | 47 ++++++++ .../osj/forum/ForumDetailFragment.java | 7 +- .../osj/forum/TopicDetailFragment.java | 7 +- .../osj/forum/TopicListFragment.java | 8 +- .../osj/forum/content/ThreadAdapter.java | 2 + .../osj/forum/content/TopicAdapter.java | 2 + 17 files changed, 284 insertions(+), 9 deletions(-) create mode 100644 OSJ Forum/.settings/org.eclipse.jdt.ui.prefs create mode 100644 OSJ Forum/libs/CWAC-AdapterWrapper.jar create mode 100644 OSJ Forum/libs/CWAC-Bus.jar create mode 100644 OSJ Forum/libs/CWAC-Cache.jar create mode 100644 OSJ Forum/libs/CWAC-Task.jar create mode 100644 OSJ Forum/src/com/commonsware/cwac/thumbnail/ThumbnailAdapter.java create mode 100644 OSJ Forum/src/com/commonsware/cwac/thumbnail/ThumbnailBus.java create mode 100644 OSJ Forum/src/com/commonsware/cwac/thumbnail/ThumbnailMessage.java diff --git a/OSJ Forum/.settings/org.eclipse.jdt.ui.prefs b/OSJ Forum/.settings/org.eclipse.jdt.ui.prefs new file mode 100644 index 0000000..d16a9ff --- /dev/null +++ b/OSJ Forum/.settings/org.eclipse.jdt.ui.prefs @@ -0,0 +1,54 @@ +cleanup.add_default_serial_version_id=false +cleanup.add_generated_serial_version_id=true +cleanup.add_missing_annotations=true +cleanup.add_missing_deprecated_annotations=true +cleanup.add_missing_methods=true +cleanup.add_missing_nls_tags=false +cleanup.add_missing_override_annotations=true +cleanup.add_missing_override_annotations_interface_methods=true +cleanup.add_serial_version_id=true +cleanup.always_use_blocks=false +cleanup.always_use_parentheses_in_expressions=false +cleanup.always_use_this_for_non_static_field_access=false +cleanup.always_use_this_for_non_static_method_access=false +cleanup.convert_to_enhanced_for_loop=true +cleanup.correct_indentation=true +cleanup.format_source_code=true +cleanup.format_source_code_changes_only=false +cleanup.make_local_variable_final=true +cleanup.make_parameters_final=true +cleanup.make_private_fields_final=true +cleanup.make_type_abstract_if_missing_method=false +cleanup.make_variable_declarations_final=true +cleanup.never_use_blocks=true +cleanup.never_use_parentheses_in_expressions=true +cleanup.organize_imports=true +cleanup.qualify_static_field_accesses_with_declaring_class=false +cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true +cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true +cleanup.qualify_static_member_accesses_with_declaring_class=true +cleanup.qualify_static_method_accesses_with_declaring_class=false +cleanup.remove_private_constructors=true +cleanup.remove_trailing_whitespaces=true +cleanup.remove_trailing_whitespaces_all=true +cleanup.remove_trailing_whitespaces_ignore_empty=false +cleanup.remove_unnecessary_casts=true +cleanup.remove_unnecessary_nls_tags=true +cleanup.remove_unused_imports=true +cleanup.remove_unused_local_variables=true +cleanup.remove_unused_private_fields=true +cleanup.remove_unused_private_members=true +cleanup.remove_unused_private_methods=true +cleanup.remove_unused_private_types=true +cleanup.sort_members=true +cleanup.sort_members_all=false +cleanup.use_blocks=true +cleanup.use_blocks_only_for_return_and_throw=false +cleanup.use_parentheses_in_expressions=true +cleanup.use_this_for_non_static_field_access=true +cleanup.use_this_for_non_static_field_access_only_if_necessary=true +cleanup.use_this_for_non_static_method_access=true +cleanup.use_this_for_non_static_method_access_only_if_necessary=true +cleanup_profile=_Ricky +cleanup_settings_version=2 +eclipse.preferences.version=1 diff --git a/OSJ Forum/AndroidManifest.xml b/OSJ Forum/AndroidManifest.xml index ede2864..5f74c6c 100644 --- a/OSJ Forum/AndroidManifest.xml +++ b/OSJ Forum/AndroidManifest.xml @@ -1,5 +1,5 @@
  • android-xmlrpc - Very thin xmlrpc client library for Android platform
  • -
  • Android-PullToRefresh - A project to provide a reusable Pull to Refresh widget for Android.
  • +
  • Android-PullToRefresh - A project to provide a reusable Pull to Refresh widget for Android
  • +
  • CWAC Thumbnail - Images in Lists, Without the Wait
  • +
  • CWAC AdapterWrapper - Adding Bits o' Functionality
  • +
  • CWAC Bus - Services And Activities, Communicating
  • +
  • CWAC Cache - Dealing With Pesky Download Times
  • +
  • CWAC Task - A Bit More Background Task Goodness

  • diff --git a/OSJ Forum/libs/CWAC-AdapterWrapper.jar b/OSJ Forum/libs/CWAC-AdapterWrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..ebbe0d9450f326718ab62491325bfdcd3d71d2ca GIT binary patch literal 1641 zcmWIWW@h1H00D0k5o<65N^ml;F!;KLIO=-(x#|Bq#lR2%Rm#EO1yuTLgMnQ%P-z+v zivTfPsjs7-r<-eVh@P+8XWuiYeY|z`F7kToYMncCeshq)72^j_i_SO;73z5Sobw1} z=weho`<171=bY{!Veg>elDS%quYAAoluYJ1D`L{*{aK{OcyjlrZtZUGpyF;(o6nQJ znpEzr*a>$G1K2T8Cxa;#Aeo$>s}FN7rV0V53ZSao{Ji4w#G+I@sztG=PA*SO#-l|R zmzKno#DbF4BDhvaP-cC&@^K3jFo4+@7z_z%b%YoZUX)l+kXoddoRe5wJauxu|K$LY zWAmer9lLh!pjt=60*+n1_FwtCxSBk!^yqwIn#0+tzv~;D_qJ^>t;B@wC#lWK;MwZJ&R6zW%*E!<}PpTvA_DLhb}*R=cW>)n=(d&8x$E?Pu6N#k$iK-?k9E&EgIW5br`(TiTzH-5dBFX(a)rhVdKAy+ z-e`Pl#k0mGx+?K@t`*~9hkXu*3^+w+Z~u0`GRE$N#|!zHcLe7YZBEHp9VUEU>by+i z9WFz59?#$Fl{WF;y2sL#s2%?*nV=cOjSO z8Nnnu%b;Vo)<0BoYb;RxVA8aRPiUX!!>o_oQ%(x=X#BXscwCb+!j3iA+CcR24w*wM z<_T>RdUtYv!(4@99~O3RmD;qWY+8!p#h!aD2Q?mg`ZJYoI^X)pi)CZ+xz-G&s@t9} zZ{K{~;{5o^@pA!J&dn}UA?&qlHFTgYa9{1-65& zX52*&FdqPc0K;2H5DhO~AO#UjEB2xYqyYq$G-?A$xK^Zs3E6T`VFp$XB|zl|1b{5x z0c1i-6PTUY%M*l-TTmUSr3-G|pz;L*K=yGkLhM7<4J~bO8v!bB5Jp(zG6GThz>LCP h{=f`d(pW~wC~T!sfHy0!AY)))2f|xG11iBG3IIjTA*uiX literal 0 HcmV?d00001 diff --git a/OSJ Forum/libs/CWAC-Bus.jar b/OSJ Forum/libs/CWAC-Bus.jar new file mode 100644 index 0000000000000000000000000000000000000000..c44b1f2f4cf2789b5923aff8552550ddd857d78a GIT binary patch literal 10031 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 ~e*vV&ATRbvAr&g7{PQ-`gO*DSR7+0pCKzzf^x} ziul?1zx6Ksq5g;Q=KJZl1mwSIeCuWSKEAoTct8C$W%+N~-+CLqk8j$D_leK1+CMrS z{=8|ZKYBm@RQh)P*6Z+ne1j1DPY^#kAO6Jo_uhv;kqQHx|0~YVxz~?Qh`;ah-w&<- zhQ_^5?f&&H|8VhV=pRSeze4|d?)W!!75wi)|2T#G75djxg}0eF#TH*ZLlqve}n)=sz=dXr-tuXy + android:layout_height="match_parent" + android:padding="5dip" + > + android:layout_height="wrap_content" + android:padding="5dip" > + /> cache = null; + private Activity host = null; + + private final ThumbnailBus.Receiver onCache = new ThumbnailBus.Receiver() { + @Override + public void onReceive(final ThumbnailMessage message) { + final ImageView image = message.getImageView(); + + host.runOnUiThread(new Runnable() { + @Override + public void run() { + if (image.getTag() != null && image.getTag().toString().equals(message.getUrl())) + image.setImageDrawable(cache.get(message.getUrl())); + } + }); + } + }; + + /** + * Constructor wrapping a supplied ListAdapter + */ + public ThumbnailAdapter(final Activity host, final ListAdapter wrapped, final SimpleWebImageCache cache, final int[] imageIds) { + super(wrapped); + + this.host = host; + this.imageIds = imageIds; + this.cache = cache; + + cache.getBus().register(getBusKey(), onCache); + } + + public void close() { + cache.getBus().unregister(onCache); + } + + private String getBusKey() { + return toString(); + } + + /** + * Get a View that displays the data at the specified position in the data + * set. In this case, if we are at the end of the list and we are still in + * append mode, we ask for a pending view and return it, plus kick off the + * background task to append more data to the wrapped adapter. + * + * @param position + * Position of the item whose data we want + * @param convertView + * View to recycle, if not null + * @param parent + * ViewGroup containing the returned View + */ + @Override + public View getView(final int position, final View convertView, final ViewGroup parent) { + final View result = super.getView(position, convertView, parent); + + processView(result); + + return result; + } + + public void processView(final View row) { + Log.v(TAG, "Processing View"); + for (final int imageId : imageIds) { + final ImageView image = (ImageView) row.findViewById(imageId); + + if (image != null && image.getTag() != null) { + final ThumbnailMessage msg = cache.getBus().createMessage(getBusKey()); + + msg.setImageView(image); + msg.setUrl(image.getTag().toString()); + + try { + cache.notify(msg.getUrl(), msg); + } catch (final Throwable t) { + Log.e(TAG, "Exception trying to fetch image", t); + } + } + } + } +} \ No newline at end of file diff --git a/OSJ Forum/src/com/commonsware/cwac/thumbnail/ThumbnailBus.java b/OSJ Forum/src/com/commonsware/cwac/thumbnail/ThumbnailBus.java new file mode 100644 index 0000000..6c1edbe --- /dev/null +++ b/OSJ Forum/src/com/commonsware/cwac/thumbnail/ThumbnailBus.java @@ -0,0 +1,36 @@ +/*** + Copyright (c) 2008-2009 CommonsWare, LLC + + Licensed under the Apache License, Version 2.0 (the "License"); you may + not use this file except in compliance with the License. You may obtain + a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +package com.commonsware.cwac.thumbnail; + +import com.commonsware.cwac.bus.AbstractBus; + +public class ThumbnailBus extends AbstractBus { + class MatchStrategy implements AbstractBus.Strategy { + @Override + public boolean isMatch(final ThumbnailMessage message, final String filter) { + return filter != null && message != null && filter.equals(message.getKey()); + } + } + + public ThumbnailBus() { + super(); + + setStrategy(new MatchStrategy()); + } + + public ThumbnailMessage createMessage(final String key) { + return new ThumbnailMessage(key); + } +} \ No newline at end of file diff --git a/OSJ Forum/src/com/commonsware/cwac/thumbnail/ThumbnailMessage.java b/OSJ Forum/src/com/commonsware/cwac/thumbnail/ThumbnailMessage.java new file mode 100644 index 0000000..78ee5ad --- /dev/null +++ b/OSJ Forum/src/com/commonsware/cwac/thumbnail/ThumbnailMessage.java @@ -0,0 +1,47 @@ +/*** +Copyright (c) 2008-2009 CommonsWare, LLC + +Licensed under the Apache License, Version 2.0 (the "License"); you may +not use this file except in compliance with the License. You may obtain +a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + */ + +package com.commonsware.cwac.thumbnail; + +import android.widget.ImageView; + +public class ThumbnailMessage { + private final String key; + private ImageView image; + private String url; + + public ThumbnailMessage(final String key) { + this.key = key; + } + + public ImageView getImageView() { + return image; + } + + public String getKey() { + return key; + } + + public String getUrl() { + return url; + } + + public void setImageView(final ImageView image) { + this.image = image; + } + + public void setUrl(final String url) { + this.url = url; + } +} \ No newline at end of file diff --git a/OSJ Forum/src/org/RickBarrette/osj/forum/ForumDetailFragment.java b/OSJ Forum/src/org/RickBarrette/osj/forum/ForumDetailFragment.java index 8a39554..5809469 100644 --- a/OSJ Forum/src/org/RickBarrette/osj/forum/ForumDetailFragment.java +++ b/OSJ Forum/src/org/RickBarrette/osj/forum/ForumDetailFragment.java @@ -35,6 +35,10 @@ import android.widget.AbsListView; import android.widget.AdapterView; import android.widget.ListView; +import com.commonsware.cwac.cache.SimpleWebImageCache; +import com.commonsware.cwac.thumbnail.ThumbnailAdapter; +import com.commonsware.cwac.thumbnail.ThumbnailBus; +import com.commonsware.cwac.thumbnail.ThumbnailMessage; import com.handmark.pulltorefresh.extras.listfragment.PullToRefreshListFragment; import com.handmark.pulltorefresh.library.PullToRefreshBase; @@ -173,7 +177,8 @@ public class ForumDetailFragment extends PullToRefreshListFragment implements Da @Override public void run() { TopicContent.getTopics((String) mItem.content.get("forum_id"), mDb); - setListAdapter(new TopicAdapter(getActivity())); + setListAdapter(new ThumbnailAdapter(getActivity(), new TopicAdapter(getActivity()), new SimpleWebImageCache(null, null, + 101, new ThumbnailBus()), new int[] { R.id.quickContactBadge1 })); getPullToRefreshListView().onRefreshComplete(); } }); diff --git a/OSJ Forum/src/org/RickBarrette/osj/forum/TopicDetailFragment.java b/OSJ Forum/src/org/RickBarrette/osj/forum/TopicDetailFragment.java index 7c44fd1..ca4b128 100644 --- a/OSJ Forum/src/org/RickBarrette/osj/forum/TopicDetailFragment.java +++ b/OSJ Forum/src/org/RickBarrette/osj/forum/TopicDetailFragment.java @@ -35,6 +35,10 @@ import android.widget.AbsListView; import android.widget.AdapterView; import android.widget.ListView; +import com.commonsware.cwac.cache.SimpleWebImageCache; +import com.commonsware.cwac.thumbnail.ThumbnailAdapter; +import com.commonsware.cwac.thumbnail.ThumbnailBus; +import com.commonsware.cwac.thumbnail.ThumbnailMessage; import com.handmark.pulltorefresh.extras.listfragment.PullToRefreshListFragment; import com.handmark.pulltorefresh.library.PullToRefreshBase; @@ -171,7 +175,8 @@ public class TopicDetailFragment extends PullToRefreshListFragment implements Da @Override public void run() { ThreadContent.getThread((String) mItem.content.get("topic_id"), mDb); - setListAdapter(new ThreadAdapter(getActivity())); + setListAdapter(new ThumbnailAdapter(getActivity(), new ThreadAdapter(getActivity()), new SimpleWebImageCache(null, null, + 101, new ThumbnailBus()), new int[] { R.id.quickContactBadge1 })); getPullToRefreshListView().onRefreshComplete(); } }); diff --git a/OSJ Forum/src/org/RickBarrette/osj/forum/TopicListFragment.java b/OSJ Forum/src/org/RickBarrette/osj/forum/TopicListFragment.java index abf20f7..f2872fa 100644 --- a/OSJ Forum/src/org/RickBarrette/osj/forum/TopicListFragment.java +++ b/OSJ Forum/src/org/RickBarrette/osj/forum/TopicListFragment.java @@ -32,6 +32,11 @@ import android.widget.AbsListView; import android.widget.AdapterView; import android.widget.ListView; +import com.commonsware.cwac.cache.SimpleWebImageCache; +import com.commonsware.cwac.thumbnail.ThumbnailAdapter; +import com.commonsware.cwac.thumbnail.ThumbnailBus; +import com.commonsware.cwac.thumbnail.ThumbnailMessage; + public class TopicListFragment extends ListFragment { private static final String STATE_ACTIVATED_POSITION = "activated_position"; @@ -61,7 +66,8 @@ public class TopicListFragment extends ListFragment { @Override public void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); - setListAdapter(new TopicAdapter(getActivity())); + setListAdapter(new ThumbnailAdapter(getActivity(), new TopicAdapter(getActivity()), new SimpleWebImageCache(null, null, 101, + new ThumbnailBus()), new int[] { R.id.quickContactBadge1 })); } @Override diff --git a/OSJ Forum/src/org/RickBarrette/osj/forum/content/ThreadAdapter.java b/OSJ Forum/src/org/RickBarrette/osj/forum/content/ThreadAdapter.java index 2943bc2..96bf80d 100644 --- a/OSJ Forum/src/org/RickBarrette/osj/forum/content/ThreadAdapter.java +++ b/OSJ Forum/src/org/RickBarrette/osj/forum/content/ThreadAdapter.java @@ -129,6 +129,8 @@ public class ThreadAdapter extends BaseAdapter { holder.title.setText((String) getItem(position).get("post_title")); holder.user.setText((String) getItem(position).get("post_author_name")); holder.post.setText((String) getItem(position).get("post_content")); + holder.badage.setImageResource(R.drawable.ic_launcher); + holder.badage.setTag("http://www.gravatar.com/avatar/9b4f3d34ca3ce31198efac149c3a1ca2?s=300&d=identicon&r=PG"); return convertView; } diff --git a/OSJ Forum/src/org/RickBarrette/osj/forum/content/TopicAdapter.java b/OSJ Forum/src/org/RickBarrette/osj/forum/content/TopicAdapter.java index f2e23a2..40b99a2 100644 --- a/OSJ Forum/src/org/RickBarrette/osj/forum/content/TopicAdapter.java +++ b/OSJ Forum/src/org/RickBarrette/osj/forum/content/TopicAdapter.java @@ -131,6 +131,8 @@ public class TopicAdapter extends BaseAdapter { holder.user.setText((String) getItem(position).get("topic_author_name")); holder.lastestPost.setText((String) getItem(position).get("short_content")); holder.newPosts.setVisibility(Boolean.parseBoolean((String) getItem(position).get("new_post")) ? View.VISIBLE : View.GONE); + holder.badage.setImageResource(R.drawable.ic_launcher); + holder.badage.setTag("http://www.gravatar.com/avatar/9b4f3d34ca3ce31198efac149c3a1ca2?s=300&d=identicon&r=PG"); return convertView; }