From 2a01d8460d6e01a70ab5b10a0478a85b6bcd568e Mon Sep 17 00:00:00 2001 From: Andrew Shaw Date: Wed, 22 Feb 2012 15:27:43 -0800 Subject: [PATCH] Caching images in AsyncImageView --- api/src/com/todoroo/astrid/data/TagData.java | 4 - api/src/com/todoroo/astrid/data/Update.java | 4 - .../astrid/actfm/EditPeopleControlSet.java | 3 +- .../astrid/actfm/TagSettingsActivity.java | 91 +++-- .../astrid/actfm/TagUpdatesFragment.java | 2 +- .../todoroo/astrid/actfm/TagViewFragment.java | 2 +- .../astrid/actfm/sync/ActFmInvoker.java | 6 +- .../astrid/notes/EditNoteActivity.java | 17 +- astrid/res/drawable/icn_add_contact.png | Bin 282 -> 508 bytes astrid/res/drawable/icn_list_shortcut.png | Bin 8678 -> 5921 bytes astrid/res/layout/assigned_adapter_row.xml | 2 +- astrid/res/layout/contact_adapter_row.xml | 2 +- astrid/res/layout/contact_edit_row.xml | 10 +- astrid/res/layout/filter_adapter_row.xml | 2 +- astrid/res/layout/tag_settings_activity.xml | 347 ++++++++++-------- astrid/res/layout/tag_updates_fragment.xml | 2 +- astrid/res/layout/tag_updates_header.xml | 2 +- .../res/layout/task_adapter_draggable_row.xml | 127 +++++++ astrid/res/layout/task_adapter_row.xml | 5 +- astrid/res/layout/update_adapter_row.xml | 6 +- astrid/res/layout/web_service_amazon_row.xml | 2 +- astrid/res/layout/web_service_row.xml | 2 +- astrid/res/values/strings-actfm.xml | 3 + astrid/res/values/styles.xml | 5 +- .../astrid/activity/FilterListFragment.java | 29 +- .../todoroo/astrid/adapter/FilterAdapter.java | 2 +- .../todoroo/astrid/adapter/TaskAdapter.java | 2 +- .../todoroo/astrid/adapter/UpdateAdapter.java | 2 +- .../todoroo/astrid/helper/AsyncImageView.java | 67 ++++ .../todoroo/astrid/helper/ImageDiskCache.java | 250 +++++++------ .../todoroo/astrid/ui/PeopleContainer.java | 50 +-- .../todoroo/astrid/ui/WebServicesView.java | 2 +- 32 files changed, 649 insertions(+), 401 deletions(-) create mode 100644 astrid/res/layout/task_adapter_draggable_row.xml create mode 100644 astrid/src/com/todoroo/astrid/helper/AsyncImageView.java diff --git a/api/src/com/todoroo/astrid/data/TagData.java b/api/src/com/todoroo/astrid/data/TagData.java index be2e379b5..9ce7b5de6 100644 --- a/api/src/com/todoroo/astrid/data/TagData.java +++ b/api/src/com/todoroo/astrid/data/TagData.java @@ -203,8 +203,4 @@ public final class TagData extends RemoteModel { return getValue(DELETION_DATE) > 0; } - public String getPictureHash() { - return getId() + "" + getValue(TagData.CREATION_DATE); - } - } diff --git a/api/src/com/todoroo/astrid/data/Update.java b/api/src/com/todoroo/astrid/data/Update.java index b0206d8a6..64fc5ca17 100644 --- a/api/src/com/todoroo/astrid/data/Update.java +++ b/api/src/com/todoroo/astrid/data/Update.java @@ -162,8 +162,4 @@ public class Update extends RemoteModel { return CREATOR; } - public String getPictureHash() { - String s = getValue(Update.TASK) + "" + getValue(Update.CREATION_DATE); - return s; - } } diff --git a/astrid/plugin-src/com/todoroo/astrid/actfm/EditPeopleControlSet.java b/astrid/plugin-src/com/todoroo/astrid/actfm/EditPeopleControlSet.java index 71f730b82..ef8b122fc 100644 --- a/astrid/plugin-src/com/todoroo/astrid/actfm/EditPeopleControlSet.java +++ b/astrid/plugin-src/com/todoroo/astrid/actfm/EditPeopleControlSet.java @@ -1,7 +1,5 @@ package com.todoroo.astrid.actfm; -import greendroid.widget.AsyncImageView; - import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; @@ -50,6 +48,7 @@ import com.todoroo.astrid.actfm.sync.ActFmSyncService; import com.todoroo.astrid.data.Metadata; import com.todoroo.astrid.data.TagData; import com.todoroo.astrid.data.Task; +import com.todoroo.astrid.helper.AsyncImageView; import com.todoroo.astrid.service.AstridDependencyInjector; import com.todoroo.astrid.service.MetadataService; import com.todoroo.astrid.service.TagDataService; diff --git a/astrid/plugin-src/com/todoroo/astrid/actfm/TagSettingsActivity.java b/astrid/plugin-src/com/todoroo/astrid/actfm/TagSettingsActivity.java index 9ce64110b..8ae09c388 100644 --- a/astrid/plugin-src/com/todoroo/astrid/actfm/TagSettingsActivity.java +++ b/astrid/plugin-src/com/todoroo/astrid/actfm/TagSettingsActivity.java @@ -1,7 +1,5 @@ package com.todoroo.astrid.actfm; -import greendroid.widget.AsyncImageView; - import java.io.IOException; import org.json.JSONArray; @@ -24,10 +22,11 @@ import android.view.View; import android.view.View.OnClickListener; import android.view.inputmethod.InputMethodManager; import android.widget.Button; +import android.widget.CheckBox; import android.widget.EditText; +import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast; -import android.widget.ToggleButton; import com.timsu.astrid.R; import com.todoroo.andlib.service.Autowired; @@ -46,6 +45,7 @@ import com.todoroo.astrid.api.AstridApiConstants; import com.todoroo.astrid.api.Filter; import com.todoroo.astrid.core.PluginServices; import com.todoroo.astrid.data.TagData; +import com.todoroo.astrid.helper.AsyncImageView; import com.todoroo.astrid.helper.ImageDiskCache; import com.todoroo.astrid.service.StatisticsConstants; import com.todoroo.astrid.service.StatisticsService; @@ -84,7 +84,7 @@ public class TagSettingsActivity extends FragmentActivity { private AsyncImageView picture; private EditText tagName; private EditText tagDescription; - private ToggleButton isSilent; + private CheckBox isSilent; private Bitmap setBitmap; private final ImageDiskCache imageCache; @@ -173,7 +173,7 @@ public class TagSettingsActivity extends FragmentActivity { tagName = (EditText) findViewById(R.id.tag_name); tagDescription = (EditText) findViewById(R.id.tag_description); picture = (AsyncImageView) findViewById(R.id.picture); - isSilent = (ToggleButton) findViewById(R.id.tag_silenced); + isSilent = (CheckBox) findViewById(R.id.tag_silenced); isSilent.setChecked(tagData.getFlag(TagData.FLAGS, TagData.FLAG_SILENT)); Button leaveListButton = (Button) findViewById(R.id.leave_list); @@ -205,12 +205,13 @@ public class TagSettingsActivity extends FragmentActivity { if (isNewTag) { findViewById(R.id.create_shortcut_container).setVisibility(View.GONE); } else { - findViewById(R.id.create_shortcut).setOnClickListener(new OnClickListener() { + findViewById(R.id.create_shortcut_container).setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if (filter == null) { filter = TagFilterExposer.filterFromTagData(TagSettingsActivity.this, tagData); } + filter.listingIcon = picture.getImageBitmap(); FilterListFragment.showCreateShortcutDialog(TagSettingsActivity.this, ShortcutActivity.createIntent(filter), filter); } }); @@ -334,8 +335,7 @@ public class TagSettingsActivity extends FragmentActivity { public void run() { actFmSyncService.pushTagDataOnSave(tagData, tagData.getMergedValues()); if(setBitmap != null && tagData.getValue(TagData.REMOTE_ID) > 0) - uploadTagPicture(setBitmap); - + uploadTagPicture(setBitmap); runOnUiThread(loadTag); } @@ -357,7 +357,7 @@ public class TagSettingsActivity extends FragmentActivity { private void saveTagPictureLocally(Bitmap bitmap) { if (bitmap == null) return; try { - String tagPicture = tagData.getPictureHash(); + String tagPicture = ImageDiskCache.getPictureHash(tagData); imageCache.put(tagPicture, bitmap); tagData.setValue(TagData.PICTURE, tagPicture); } @@ -397,18 +397,11 @@ public class TagSettingsActivity extends FragmentActivity { setTitle(getString(R.string.tag_settings_title)); } } - String tagImage = tagData.getValue(TagData.PICTURE); - if(!TextUtils.isEmpty(tagImage) && imageCache.contains(tagImage)) { - try { - picture.setDefaultImageBitmap(imageCache.get(tagImage)); - } catch (IOException e) { - e.printStackTrace(); - } - } - else { - picture.setUrl(tagImage); - } picture.setUrl(tagData.getValue(TagData.PICTURE)); + if (!isNewTag) { + ImageView shortcut = (ImageView) findViewById(R.id.create_shortcut); + shortcut.setImageBitmap(FilterListFragment.superImposeListIcon(this, picture.getImageBitmap(), tagData.getValue(TagData.NAME))); + } String peopleJson = tagData.getValue(TagData.MEMBERS); updateMembers(peopleJson); @@ -438,6 +431,10 @@ public class TagSettingsActivity extends FragmentActivity { public void run() { try { String url = actFmSyncService.setTagPicture(tagData.getValue(TagData.REMOTE_ID), bitmap); + if (TextUtils.isEmpty(url)) return; + if (imageCache.contains(tagData.getValue(TagData.PICTURE))) { + imageCache.move(tagData.getValue(TagData.PICTURE), url); + } tagData.setValue(TagData.PICTURE, url); Flags.set(Flags.ACTFM_SUPPRESS_SYNC); tagDataService.save(tagData); @@ -510,39 +507,37 @@ public class TagSettingsActivity extends FragmentActivity { - protected void showDeleteDialog(TagData tagData) { - int string; - if (tagData != null && tagData.getValue(TagData.MEMBER_COUNT) > 0) - string = R.string.DLG_leave_this_shared_tag_question; - else - string = R.string.DLG_delete_this_tag_question; - DialogUtilities.okCancelDialog(this, getString(string, tagData.getValue(TagData.NAME)), new DialogInterface.OnClickListener() { - - @Override - public void onClick(DialogInterface dialog, int which) { - deleteTag(); - } - }, null ); - } + protected void showDeleteDialog(TagData tagData) { + int string; + if (tagData != null && tagData.getValue(TagData.MEMBER_COUNT) > 0) + string = R.string.DLG_leave_this_shared_tag_question; + else + string = R.string.DLG_delete_this_tag_question; + DialogUtilities.okCancelDialog(this, getString(string, tagData.getValue(TagData.NAME)), new DialogInterface.OnClickListener() { - protected boolean deleteTag() { - tagDataService.delete(tagData.getId()); - boolean shared = false; - if(tagData != null) { - tagData.setValue(TagData.DELETION_DATE, DateUtilities.now()); - PluginServices.getTagDataService().save(tagData); - shared = tagData.getValue(TagData.MEMBER_COUNT) > 0 && tagData.getValue(TagData.USER_ID) != 0; // Was I a list member and NOT owner? + @Override + public void onClick(DialogInterface dialog, int which) { + deleteTag(); } + }, null ); + } - Intent tagDeleted = new Intent(AstridApiConstants.BROADCAST_EVENT_TAG_DELETED); - tagDeleted.putExtra(TagViewFragment.EXTRA_TAG_NAME, tagData.getValue(TagData.NAME)); - tagDeleted.putExtra(TagFilterExposer.TAG_SQL, TagFilterExposer.SHOW_ACTIVE_TASKS); + protected boolean deleteTag() { + tagDataService.delete(tagData.getId()); + if(tagData != null) { + tagData.setValue(TagData.DELETION_DATE, DateUtilities.now()); + PluginServices.getTagDataService().save(tagData); + } - this.finish(); - sendBroadcast(tagDeleted); + Intent tagDeleted = new Intent(AstridApiConstants.BROADCAST_EVENT_TAG_DELETED); + tagDeleted.putExtra(TagViewFragment.EXTRA_TAG_NAME, tagData.getValue(TagData.NAME)); + tagDeleted.putExtra(TagFilterExposer.TAG_SQL, TagFilterExposer.SHOW_ACTIVE_TASKS); - return true; - } + this.finish(); + sendBroadcast(tagDeleted); + + return true; + } diff --git a/astrid/plugin-src/com/todoroo/astrid/actfm/TagUpdatesFragment.java b/astrid/plugin-src/com/todoroo/astrid/actfm/TagUpdatesFragment.java index 2373f5131..007f7bc02 100644 --- a/astrid/plugin-src/com/todoroo/astrid/actfm/TagUpdatesFragment.java +++ b/astrid/plugin-src/com/todoroo/astrid/actfm/TagUpdatesFragment.java @@ -1,6 +1,6 @@ package com.todoroo.astrid.actfm; -import greendroid.widget.AsyncImageView; +import com.todoroo.astrid.helper.AsyncImageView; import android.app.Activity; import android.content.Intent; import android.database.Cursor; diff --git a/astrid/plugin-src/com/todoroo/astrid/actfm/TagViewFragment.java b/astrid/plugin-src/com/todoroo/astrid/actfm/TagViewFragment.java index e563189dc..e4ff1407a 100644 --- a/astrid/plugin-src/com/todoroo/astrid/actfm/TagViewFragment.java +++ b/astrid/plugin-src/com/todoroo/astrid/actfm/TagViewFragment.java @@ -1,6 +1,6 @@ package com.todoroo.astrid.actfm; -import greendroid.widget.AsyncImageView; +import com.todoroo.astrid.helper.AsyncImageView; import org.json.JSONArray; import org.json.JSONException; diff --git a/astrid/plugin-src/com/todoroo/astrid/actfm/sync/ActFmInvoker.java b/astrid/plugin-src/com/todoroo/astrid/actfm/sync/ActFmInvoker.java index 30ba3aef8..464c30965 100644 --- a/astrid/plugin-src/com/todoroo/astrid/actfm/sync/ActFmInvoker.java +++ b/astrid/plugin-src/com/todoroo/astrid/actfm/sync/ActFmInvoker.java @@ -26,9 +26,9 @@ import com.todoroo.andlib.utility.Preferences; public class ActFmInvoker { /** NOTE: these values are development values & will not work on production */ - private static final String URL = "//astrid.com/api/"; - private static final String APP_ID = "bf6170638298af8ed9a8c79995b1fc0f"; - private static final String APP_SECRET = "d15d25c63323bddcaa48928dccac1207"; + private static final String URL = "//10.0.2.2:3000/api/"; + private static final String APP_ID = "a4732a32859dbcd3e684331acd36432c"; + private static final String APP_SECRET = "e389bfc82a0d932332f9a8bd8203735f"; public static final String PROVIDER_FACEBOOK = "facebook"; public static final String PROVIDER_GOOGLE= "google"; diff --git a/astrid/plugin-src/com/todoroo/astrid/notes/EditNoteActivity.java b/astrid/plugin-src/com/todoroo/astrid/notes/EditNoteActivity.java index 55a44575d..eb090f7f0 100644 --- a/astrid/plugin-src/com/todoroo/astrid/notes/EditNoteActivity.java +++ b/astrid/plugin-src/com/todoroo/astrid/notes/EditNoteActivity.java @@ -1,8 +1,5 @@ package com.todoroo.astrid.notes; -import greendroid.widget.AsyncImageView; - -import java.io.IOException; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; @@ -58,6 +55,7 @@ import com.todoroo.astrid.dao.UpdateDao; import com.todoroo.astrid.data.Metadata; import com.todoroo.astrid.data.Task; import com.todoroo.astrid.data.Update; +import com.todoroo.astrid.helper.AsyncImageView; import com.todoroo.astrid.helper.ImageDiskCache; import com.todoroo.astrid.helper.ProgressBarSyncResultCallback; import com.todoroo.astrid.service.MetadataService; @@ -367,16 +365,7 @@ public class EditNoteActivity extends LinearLayout implements TimerActionListene commentPictureView.setVisibility(View.GONE); else { commentPictureView.setVisibility(View.VISIBLE); - if(imageCache.contains(item.commentPicture)) { - try { - commentPictureView.setDefaultImageBitmap(imageCache.get(item.commentPicture)); - } catch (IOException e) { - e.printStackTrace(); - } - } - else { - commentPictureView.setUrl(item.commentPicture); - } + commentPictureView.setUrl(item.commentPicture); } } } @@ -445,7 +434,7 @@ public class EditNoteActivity extends LinearLayout implements TimerActionListene if (usePicture && pendingCommentPicture != null) { update.setValue(Update.PICTURE, Update.PICTURE_LOADING); try { - String updateString = update.getPictureHash(); + String updateString = ImageDiskCache.getPictureHash(update); imageCache.put(updateString, pendingCommentPicture); update.setValue(Update.PICTURE, updateString); } diff --git a/astrid/res/drawable/icn_add_contact.png b/astrid/res/drawable/icn_add_contact.png index cdbb282f2e76173a6b6c549b06b9c53ee748268c..a45edcc191e42fa701f8b949c344fc91a663b012 100644 GIT binary patch delta 453 zcmV;$0XqJg0{jCZiBL{Q4GJ0x0000DNk~Le0000m0000g2nGNE0QFDUdXXVRe*uC? zL_t(o!|j>Tae_b)hQHjT07{?(DS^!J9!j7C>A-a0qym!)AQfl_Y6aK6a+yDw- zGvfY@6oeA8&DtPteWOy&0aid{e-IbxSg!z)r4aH09g3$ z0er3@xsiEM00;n{0S*E=9DD*C1ptmd0d@iaJD&h2OA8!q4>uA`{OKuH4B!Lk4B|Q+ z>m8ueXWg-?4Z$bb2fiG|Oa@RpiU~V$0GJ~{L_e?^t5V`XWCIY>&vqKjf9FC&Z0r&s z1uA~Vh><|`8og#ZB|rh}fi3;;R$94Ud(Vhjle*I;E&V(*anP5EepY*rz0@CXqmgPh zOMBg{y1EK@)8s~eoKQpGwK~V|7y5jW{MM00Y^$;YUV#^&8!AveK=RjpQVkYLXJ(f% vwn`QKe_D^KrJCqB-Ien28!;CE{yV@KBWFe|5KTt=00000NkvXXu0mjf$@#Xg delta 225 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 literal 8678 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 - - - + style="@style/TextAppearance" + android:textCursorDrawable="@null" + android:textSize="15sp" /> - - - + android:orientation="vertical" > - + android:gravity="right" + android:orientation="horizontal" + android:visibility="gone" > - + + + + + - + android:paddingBottom="5dip" + android:paddingTop="5dip" > - + - + - + + + + + + + + android:layout_marginLeft="10dip" + android:layout_marginTop="10dip" + android:paddingBottom="5dip" + android:text="@string/actfm_TVA_members_label" /> - - - - - - - - - - - - + android:orientation="vertical" /> - - - + - + android:layout_below="@id/tag_label" + android:layout_marginTop="5dip" + android:padding="10dip" + android:paddingBottom="14dip" > - + android:background="#00000000" + android:hint="@string/actfm_TVA_tag_description_hint" + android:textCursorDrawable="@null" + android:textSize="15sp" /> + - - + - + - + android:layout_marginTop="5dip" + android:orientation="vertical" > - - - - + android:orientation="horizontal" + android:padding="5dip" > + + + + + + + + + + + + + + + + +