diff --git a/app/src/main/java/org/nuclearfog/twidda/backend/api/ConnectionException.java b/app/src/main/java/org/nuclearfog/twidda/backend/api/ConnectionException.java index 4c9de0bd..30daffda 100644 --- a/app/src/main/java/org/nuclearfog/twidda/backend/api/ConnectionException.java +++ b/app/src/main/java/org/nuclearfog/twidda/backend/api/ConnectionException.java @@ -114,6 +114,16 @@ public abstract class ConnectionException extends Exception { */ public static final int SERVICE_UNAVAILABLE = 20; + /** + * network connection not available + */ + public static final int NETWORK_CONNECTION = 21; + + /** + * error parsing json format + */ + public static final int JSON_FORMAT = 22; + /** * */ diff --git a/app/src/main/java/org/nuclearfog/twidda/backend/api/mastodon/MastodonException.java b/app/src/main/java/org/nuclearfog/twidda/backend/api/mastodon/MastodonException.java index 34754d09..74cf45e6 100644 --- a/app/src/main/java/org/nuclearfog/twidda/backend/api/mastodon/MastodonException.java +++ b/app/src/main/java/org/nuclearfog/twidda/backend/api/mastodon/MastodonException.java @@ -34,6 +34,11 @@ public class MastodonException extends ConnectionException { */ private static final int ERROR_NETWORK = -2; + /** + * error caused by parsing json format + */ + private static final int ERROR_JSON = -3; + private int errorCode = UNKNOWN_ERROR; private String errorMessage = ""; @@ -46,6 +51,8 @@ public class MastodonException extends ConnectionException { super(e); if (e instanceof UnknownHostException) { errorCode = ERROR_NETWORK; + } else if (e instanceof JSONException) { + errorCode = ERROR_JSON; } } @@ -101,7 +108,10 @@ public class MastodonException extends ConnectionException { return SERVICE_UNAVAILABLE; case ERROR_NETWORK: - return ERROR_NETWORK; + return NETWORK_CONNECTION; + + case ERROR_JSON: + return JSON_FORMAT; default: case UNKNOWN_ERROR: diff --git a/app/src/main/java/org/nuclearfog/twidda/backend/api/mastodon/impl/MastodonPoll.java b/app/src/main/java/org/nuclearfog/twidda/backend/api/mastodon/impl/MastodonPoll.java index 0d7234a4..bc8c2ed5 100644 --- a/app/src/main/java/org/nuclearfog/twidda/backend/api/mastodon/impl/MastodonPoll.java +++ b/app/src/main/java/org/nuclearfog/twidda/backend/api/mastodon/impl/MastodonPoll.java @@ -36,8 +36,10 @@ public class MastodonPoll implements Poll { exTime = StringTools.getTime(exTimeStr, StringTools.TIME_MASTODON); expired = json.getBoolean("expired"); voted = json.optBoolean("voted", false); - voteCount = json.getInt("voters_count"); multipleChoice = json.getBoolean("multiple"); + if (!json.isNull("voters_count")) { + voteCount = json.getInt("voters_count"); + } options = new MastodonOption[optionsJson.length()]; for (int i = 0; i < optionsJson.length(); i++) { diff --git a/app/src/main/java/org/nuclearfog/twidda/backend/api/mastodon/impl/MastodonStatus.java b/app/src/main/java/org/nuclearfog/twidda/backend/api/mastodon/impl/MastodonStatus.java index 38a0f1b0..b7463d8a 100644 --- a/app/src/main/java/org/nuclearfog/twidda/backend/api/mastodon/impl/MastodonStatus.java +++ b/app/src/main/java/org/nuclearfog/twidda/backend/api/mastodon/impl/MastodonStatus.java @@ -67,7 +67,6 @@ public class MastodonStatus implements Status { String replyIdStr = json.optString("in_reply_to_id", "0"); String replyUserIdStr = json.optString("in_reply_to_account_id", "0"); String idStr = json.getString("id"); - String url = json.optString("url", ""); author = new MastodonUser(json.getJSONObject("account"), currentUserId); createdAt = StringTools.getTime(json.optString("created_at"), StringTools.TIME_MASTODON); @@ -86,8 +85,8 @@ public class MastodonStatus implements Status { if (embeddedJson != null) { embeddedStatus = new MastodonStatus(embeddedJson, currentUserId); this.url = embeddedStatus.getUrl(); - } else if (!url.equals("null")) { - this.url = url; + } else if (!json.isNull("url")) { + this.url = json.optString("url", ""); } if (pollJson != null) { poll = new MastodonPoll(pollJson); diff --git a/app/src/main/java/org/nuclearfog/twidda/backend/utils/ErrorHandler.java b/app/src/main/java/org/nuclearfog/twidda/backend/utils/ErrorHandler.java index 6a418576..98d23e2f 100644 --- a/app/src/main/java/org/nuclearfog/twidda/backend/utils/ErrorHandler.java +++ b/app/src/main/java/org/nuclearfog/twidda/backend/utils/ErrorHandler.java @@ -38,6 +38,7 @@ public class ErrorHandler { } return context.getString(R.string.error_rate_limit); + case ConnectionException.NETWORK_CONNECTION: case ConnectionException.SERVICE_UNAVAILABLE: return context.getString(R.string.error_service_unavailable); @@ -98,6 +99,9 @@ public class ErrorHandler { case ConnectionException.ERROR_API_ACCESS_DENIED: return context.getString(R.string.error_api_access_limited); + case ConnectionException.JSON_FORMAT: + return context.getString(R.string.error_json_format); + case ConnectionException.ERROR_NOT_DEFINED: if (error.getMessage() != null && !error.getMessage().isEmpty()) { return error.getMessage(); diff --git a/app/src/main/java/org/nuclearfog/twidda/ui/activities/StatusActivity.java b/app/src/main/java/org/nuclearfog/twidda/ui/activities/StatusActivity.java index 669f401a..4d702b84 100644 --- a/app/src/main/java/org/nuclearfog/twidda/ui/activities/StatusActivity.java +++ b/app/src/main/java/org/nuclearfog/twidda/ui/activities/StatusActivity.java @@ -657,7 +657,7 @@ public class StatusActivity extends AppCompatActivity implements OnClickListener @Override - public void onPollOptionClick(Poll poll, int selection) { + public void onVoteClick(Poll poll, int[] selection) { // todo add implementation } diff --git a/app/src/main/java/org/nuclearfog/twidda/ui/adapter/OptionsAdapter.java b/app/src/main/java/org/nuclearfog/twidda/ui/adapter/OptionsAdapter.java index caf65551..61b05f40 100644 --- a/app/src/main/java/org/nuclearfog/twidda/ui/adapter/OptionsAdapter.java +++ b/app/src/main/java/org/nuclearfog/twidda/ui/adapter/OptionsAdapter.java @@ -92,4 +92,15 @@ public class OptionsAdapter extends RecyclerView.Adapter implement limitVotes = poll.getLimit(); notifyDataSetChanged(); } + + /** + * @return a set of selection position + */ + public int[] getSelection() { + int pos = 0; + int[] result = new int[selection.size()]; + for (Integer index : selection) + result[pos++] = index; + return result; + } } \ No newline at end of file diff --git a/app/src/main/java/org/nuclearfog/twidda/ui/adapter/PreviewAdapter.java b/app/src/main/java/org/nuclearfog/twidda/ui/adapter/PreviewAdapter.java index 12b49782..4ac3c7b1 100644 --- a/app/src/main/java/org/nuclearfog/twidda/ui/adapter/PreviewAdapter.java +++ b/app/src/main/java/org/nuclearfog/twidda/ui/adapter/PreviewAdapter.java @@ -142,10 +142,10 @@ public class PreviewAdapter extends RecyclerView.Adapter implements } break; - case OnHolderClickListener.POLL_ITEM: + case OnHolderClickListener.POLL_VOTE: if (item instanceof Poll && extras.length == 1) { Poll poll = (Poll) item; - listener.onPollOptionClick(poll, extras[0]); + listener.onVoteClick(poll, extras); } break; @@ -208,8 +208,8 @@ public class PreviewAdapter extends RecyclerView.Adapter implements * called on poll option click * * @param poll poll containing the clicked option - * @param selection poll option index + * @param selection selected poll options */ - void onPollOptionClick(Poll poll, int selection); + void onVoteClick(Poll poll, int[] selection); } } \ No newline at end of file diff --git a/app/src/main/java/org/nuclearfog/twidda/ui/adapter/holder/OnHolderClickListener.java b/app/src/main/java/org/nuclearfog/twidda/ui/adapter/holder/OnHolderClickListener.java index 0f862acf..4c48cbab 100644 --- a/app/src/main/java/org/nuclearfog/twidda/ui/adapter/holder/OnHolderClickListener.java +++ b/app/src/main/java/org/nuclearfog/twidda/ui/adapter/holder/OnHolderClickListener.java @@ -41,11 +41,9 @@ public interface OnHolderClickListener { int CARD_LINK = 16; - int POLL_ITEM = 17; + int POLL_OPTION = 17; - int POLL_OPTION = 18; - - int POLL_VOTE = 19; + int POLL_VOTE = 18; /** * called when an item was clicked diff --git a/app/src/main/java/org/nuclearfog/twidda/ui/adapter/holder/PollHolder.java b/app/src/main/java/org/nuclearfog/twidda/ui/adapter/holder/PollHolder.java index 94413c0c..9192bb49 100644 --- a/app/src/main/java/org/nuclearfog/twidda/ui/adapter/holder/PollHolder.java +++ b/app/src/main/java/org/nuclearfog/twidda/ui/adapter/holder/PollHolder.java @@ -60,7 +60,10 @@ public class PollHolder extends ViewHolder implements OnClickListener { if (v.getId() == R.id.item_poll_vote_button) { int pos = getLayoutPosition(); if (pos != RecyclerView.NO_POSITION) { - listener.onItemClick(pos, OnHolderClickListener.POLL_VOTE); + int[] selection = adapter.getSelection(); + if (selection.length > 0) { + listener.onItemClick(pos, OnHolderClickListener.POLL_VOTE, selection); + } } } } diff --git a/app/src/main/res/layout/item_poll.xml b/app/src/main/res/layout/item_poll.xml index f1b3fa24..b65f08c6 100644 --- a/app/src/main/res/layout/item_poll.xml +++ b/app/src/main/res/layout/item_poll.xml @@ -14,7 +14,10 @@ android:id="@+id/item_poll_options_list" android:layout_width="match_parent" android:layout_height="0dp" - android:layout_weight="1" /> + android:layout_weight="1" + android:layout_marginBottom="@dimen/item_poll_layout_margin" + android:descendantFocusability="blocksDescendants" + android:nestedScrollingEnabled="true"/> + android:lines="1" + android:layout_weight="1" />