diff --git a/media/android/NewsBlur/libs/gson-2.1.jar b/media/android/NewsBlur/libs/gson-2.1.jar deleted file mode 100644 index b85f091a0..000000000 Binary files a/media/android/NewsBlur/libs/gson-2.1.jar and /dev/null differ diff --git a/media/android/NewsBlur/libs/gson-2.2.3.jar b/media/android/NewsBlur/libs/gson-2.2.3.jar new file mode 100644 index 000000000..a4e18be67 Binary files /dev/null and b/media/android/NewsBlur/libs/gson-2.2.3.jar differ diff --git a/media/android/NewsBlur/src/com/newsblur/activity/Reading.java b/media/android/NewsBlur/src/com/newsblur/activity/Reading.java index 76679b44a..04eee7366 100644 --- a/media/android/NewsBlur/src/com/newsblur/activity/Reading.java +++ b/media/android/NewsBlur/src/com/newsblur/activity/Reading.java @@ -200,7 +200,7 @@ public abstract class Reading extends NbFragmentActivity implements OnPageChange */ protected void addStoryToMarkAsRead(Story story) { if (story == null) return; - if (story.read != Story.UNREAD) return; + if (story.read) return; synchronized (this.storiesToMarkAsRead) { this.storiesToMarkAsRead.add(story); } diff --git a/media/android/NewsBlur/src/com/newsblur/database/BlurDatabase.java b/media/android/NewsBlur/src/com/newsblur/database/BlurDatabase.java index ed78ffadc..702c98ed3 100644 --- a/media/android/NewsBlur/src/com/newsblur/database/BlurDatabase.java +++ b/media/android/NewsBlur/src/com/newsblur/database/BlurDatabase.java @@ -10,7 +10,6 @@ public class BlurDatabase extends SQLiteOpenHelper { private final String TEXT = " text"; private final String INTEGER = " integer"; - private final static String TAG = "DatabaseHelper"; public final static String DB_NAME = "blur.db"; private final static int VERSION = 1; @@ -105,7 +104,7 @@ public class BlurDatabase extends SQLiteOpenHelper { DatabaseConstants.STORY_FRIEND_USER_IDS + TEXT + ", " + DatabaseConstants.STORY_TAGS + TEXT + ", " + DatabaseConstants.STORY_PERMALINK + TEXT + ", " + - DatabaseConstants.STORY_READ + TEXT + ", " + + DatabaseConstants.STORY_READ + INTEGER + ", " + DatabaseConstants.STORY_TITLE + TEXT + ")"; diff --git a/media/android/NewsBlur/src/com/newsblur/database/FeedItemsAdapter.java b/media/android/NewsBlur/src/com/newsblur/database/FeedItemsAdapter.java index 1b9d77e81..11814702e 100644 --- a/media/android/NewsBlur/src/com/newsblur/database/FeedItemsAdapter.java +++ b/media/android/NewsBlur/src/com/newsblur/database/FeedItemsAdapter.java @@ -60,8 +60,7 @@ public class FeedItemsAdapter extends SimpleCursorAdapter { borderTwo.setBackgroundColor(Color.LTGRAY); } - // 1 is read - if (Story.fromCursor(cursor).read == Story.UNREAD) { + if (! Story.fromCursor(cursor).read) { ((TextView) v.findViewById(R.id.row_item_author)).setTextColor(storyAuthorUnread); ((TextView) v.findViewById(R.id.row_item_date)).setTextColor(storyDateUnread); diff --git a/media/android/NewsBlur/src/com/newsblur/database/MultipleFeedItemsAdapter.java b/media/android/NewsBlur/src/com/newsblur/database/MultipleFeedItemsAdapter.java index eb386e4c6..840184477 100644 --- a/media/android/NewsBlur/src/com/newsblur/database/MultipleFeedItemsAdapter.java +++ b/media/android/NewsBlur/src/com/newsblur/database/MultipleFeedItemsAdapter.java @@ -70,7 +70,7 @@ public class MultipleFeedItemsAdapter extends SimpleCursorAdapter { } // 1 is read - if (Story.fromCursor(cursor).read == Story.UNREAD) { + if (! Story.fromCursor(cursor).read) { ((TextView) v.findViewById(R.id.row_item_author)).setTextColor(storyAuthorUnread); ((TextView) v.findViewById(R.id.row_item_date)).setTextColor(storyDateUnread); ((TextView) v.findViewById(R.id.row_item_feedtitle)).setTextColor(storyFeedUnread); diff --git a/media/android/NewsBlur/src/com/newsblur/domain/Story.java b/media/android/NewsBlur/src/com/newsblur/domain/Story.java index de2047ee7..257a6b1fe 100644 --- a/media/android/NewsBlur/src/com/newsblur/domain/Story.java +++ b/media/android/NewsBlur/src/com/newsblur/domain/Story.java @@ -18,9 +18,6 @@ public class Story implements Serializable { private static final long serialVersionUID = 7629596752129163308L; - public static final int UNREAD = 0; - public static final int READ = 1; - public String id; @SerializedName("story_permalink") @@ -42,7 +39,7 @@ public class Story implements Serializable { public int commentCount; @SerializedName("read_status") - public int read; + public boolean read; @SerializedName("story_tags") public String[] tags; @@ -135,7 +132,7 @@ public class Story implements Serializable { story.intelligence.intelligenceFeed = cursor.getInt(cursor.getColumnIndex(DatabaseConstants.STORY_INTELLIGENCE_FEED)); story.intelligence.intelligenceTags = cursor.getInt(cursor.getColumnIndex(DatabaseConstants.STORY_INTELLIGENCE_TAGS)); story.intelligence.intelligenceTitle = cursor.getInt(cursor.getColumnIndex(DatabaseConstants.STORY_INTELLIGENCE_TITLE)); - story.read = cursor.getInt(cursor.getColumnIndex(DatabaseConstants.STORY_READ)); + story.read = cursor.getInt(cursor.getColumnIndex(DatabaseConstants.STORY_READ)) > 0; story.tags = TextUtils.split(cursor.getString(cursor.getColumnIndex(DatabaseConstants.STORY_TAGS)), ","); story.feedId = cursor.getString(cursor.getColumnIndex(DatabaseConstants.STORY_FEED_ID)); story.id = cursor.getString(cursor.getColumnIndex(DatabaseConstants.STORY_ID)); diff --git a/media/android/NewsBlur/src/com/newsblur/fragment/FeedItemListFragment.java b/media/android/NewsBlur/src/com/newsblur/fragment/FeedItemListFragment.java index 474d492e9..c96504163 100644 --- a/media/android/NewsBlur/src/com/newsblur/fragment/FeedItemListFragment.java +++ b/media/android/NewsBlur/src/com/newsblur/fragment/FeedItemListFragment.java @@ -183,7 +183,7 @@ public class FeedItemListFragment extends ItemListFragment implements LoaderMana final AdapterView.AdapterContextMenuInfo menuInfo = (AdapterView.AdapterContextMenuInfo)item.getMenuInfo(); if (item.getItemId() == R.id.menu_mark_story_as_read) { final Story story = adapter.getStory(menuInfo.position); - if(story.read == Story.UNREAD) { + if(! story.read) { ArrayList storiesToMarkAsRead = new ArrayList(); storiesToMarkAsRead.add(story); FeedUtils.markStoriesAsRead(storiesToMarkAsRead, getActivity()); @@ -193,7 +193,7 @@ public class FeedItemListFragment extends ItemListFragment implements LoaderMana final ArrayList previousStories = adapter.getPreviousStories(menuInfo.position); ArrayList storiesToMarkAsRead = new ArrayList(); for(Story story: previousStories) { - if(story.read == Story.UNREAD) { + if(! story.read) { storiesToMarkAsRead.add(story); } } diff --git a/media/android/NewsBlur/src/com/newsblur/network/APIManager.java b/media/android/NewsBlur/src/com/newsblur/network/APIManager.java index 4fae11e40..44b2b705c 100644 --- a/media/android/NewsBlur/src/com/newsblur/network/APIManager.java +++ b/media/android/NewsBlur/src/com/newsblur/network/APIManager.java @@ -44,27 +44,24 @@ import com.newsblur.network.domain.Message; import com.newsblur.network.domain.ProfileResponse; import com.newsblur.network.domain.SocialFeedResponse; import com.newsblur.network.domain.StoriesResponse; +import com.newsblur.serialization.BooleanTypeAdapter; import com.newsblur.serialization.DateStringTypeAdapter; import com.newsblur.util.PrefsUtils; public class APIManager { private Context context; - private static Gson gson; + private Gson gson; private ContentResolver contentResolver; public APIManager(final Context context) { this.context = context; - contentResolver = context.getContentResolver(); - initGsonIfNeededBuilder(); - } - - private static synchronized void initGsonIfNeededBuilder() { - if(gson == null) { - final GsonBuilder builder = new GsonBuilder(); - builder.registerTypeAdapter(Date.class, new DateStringTypeAdapter()); - gson = builder.create(); - } + this.contentResolver = context.getContentResolver(); + this.gson = new GsonBuilder() + .registerTypeAdapter(Date.class, new DateStringTypeAdapter()) + .registerTypeAdapter(Boolean.class, new BooleanTypeAdapter()) + .registerTypeAdapter(boolean.class, new BooleanTypeAdapter()) + .create(); } public LoginResponse login(final String username, final String password) { diff --git a/media/android/NewsBlur/src/com/newsblur/serialization/BooleanTypeAdapter.java b/media/android/NewsBlur/src/com/newsblur/serialization/BooleanTypeAdapter.java new file mode 100644 index 000000000..5ca835b32 --- /dev/null +++ b/media/android/NewsBlur/src/com/newsblur/serialization/BooleanTypeAdapter.java @@ -0,0 +1,43 @@ +package com.newsblur.serialization; + +import java.io.IOException; + +import com.google.gson.TypeAdapter; +import com.google.gson.stream.JsonReader; +import com.google.gson.stream.JsonToken; +import com.google.gson.stream.JsonWriter; + +/** + * A more forgiving type adapter to deserialize JSON booleans. Specifically, this implementation is + * friendly to backend code that may send numeric 0s and 1s for boolean fields, on which the strict + * GSON base impl would choke. + */ +public class BooleanTypeAdapter extends TypeAdapter { + + @Override + public Boolean read(JsonReader in) throws IOException { + JsonToken type = in.peek(); + if (type == JsonToken.NULL) { + in.nextNull(); + return null; + } else if (type == JsonToken.BOOLEAN) { + return in.nextBoolean(); + } else if (type == JsonToken.NUMBER) { + return in.nextInt() > 0; + } else if (type == JsonToken.STRING) { + return Boolean.parseBoolean(in.nextString()); + } else { + throw new IOException( "Could not parse JSON boolean." ); + } + } + + @Override + public void write(JsonWriter out, Boolean b) throws IOException{ + if (b == null) { + out.nullValue(); + } else { + out.value(b); + } + } + +}