diff --git a/app/src/main/java/gr/thmmy/mthmmy/activities/profile/summary/SummaryFragment.java b/app/src/main/java/gr/thmmy/mthmmy/activities/profile/summary/SummaryFragment.java index 8993fcf0..76380576 100644 --- a/app/src/main/java/gr/thmmy/mthmmy/activities/profile/summary/SummaryFragment.java +++ b/app/src/main/java/gr/thmmy/mthmmy/activities/profile/summary/SummaryFragment.java @@ -180,8 +180,6 @@ public class SummaryFragment extends Fragment { if (profileSummaryRow.contains("@") && (profileSummaryRow.contains("Email") || profileSummaryRow.contains("E-mail"))) { - Timber.d("mpika"); - Timber.d(profileSummaryRow); String email = profileSummaryRow.substring(profileSummaryRow.indexOf(": ") + 6); profileSummaryRow = profileSummaryRow.replace(email, "" + email + ""); diff --git a/app/src/main/java/gr/thmmy/mthmmy/activities/topic/TopicAdapter.java b/app/src/main/java/gr/thmmy/mthmmy/activities/topic/TopicAdapter.java index 13d50f9d..bbd8f85d 100644 --- a/app/src/main/java/gr/thmmy/mthmmy/activities/topic/TopicAdapter.java +++ b/app/src/main/java/gr/thmmy/mthmmy/activities/topic/TopicAdapter.java @@ -17,8 +17,10 @@ import android.support.v7.app.AlertDialog; import android.support.v7.content.res.AppCompatResources; import android.support.v7.widget.AppCompatButton; import android.support.v7.widget.RecyclerView; +import android.text.Html; import android.text.InputType; import android.text.TextUtils; +import android.text.method.LinkMovementMethod; import android.util.DisplayMetrics; import android.view.LayoutInflater; import android.view.View; @@ -41,11 +43,13 @@ import android.widget.RelativeLayout; import android.widget.TextView; import com.github.mikephil.charting.charts.HorizontalBarChart; +import com.github.mikephil.charting.components.AxisBase; import com.github.mikephil.charting.components.XAxis; import com.github.mikephil.charting.components.YAxis; import com.github.mikephil.charting.data.BarData; import com.github.mikephil.charting.data.BarDataSet; import com.github.mikephil.charting.data.BarEntry; +import com.github.mikephil.charting.formatter.IAxisValueFormatter; import com.squareup.picasso.Picasso; import java.util.ArrayList; @@ -94,7 +98,7 @@ class TopicAdapter extends RecyclerView.Adapter { private TopicViewModel viewModel; /** - * @param context the context of the {@link RecyclerView} + * @param context the context of the {@link RecyclerView} * @param topicItems List of {@link Post} objects to use */ TopicAdapter(TopicActivity context, List topicItems) { @@ -170,7 +174,13 @@ class TopicAdapter extends RecyclerView.Adapter { if (poll.getAvailableVoteCount() > 1) { for (Poll.Entry entry : entries) { CheckBox checkBox = new CheckBox(context); - checkBox.setText(entry.getEntryName()); + checkBox.setMovementMethod(LinkMovementMethod.getInstance()); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + checkBox.setText(Html.fromHtml(entry.getEntryName(), Html.FROM_HTML_MODE_LEGACY)); + } else { + //noinspection deprecation + checkBox.setText(Html.fromHtml(entry.getEntryName())); + } checkBox.setTextColor(context.getResources().getColor(R.color.primary_text)); holder.optionsLayout.addView(checkBox); } @@ -181,7 +191,13 @@ class TopicAdapter extends RecyclerView.Adapter { for (int i = 0; i < entries.length; i++) { RadioButton radioButton = new RadioButton(context); radioButton.setId(i); - radioButton.setText(entries[i].getEntryName()); + radioButton.setMovementMethod(LinkMovementMethod.getInstance()); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + radioButton.setText(Html.fromHtml(entries[i].getEntryName(), Html.FROM_HTML_MODE_LEGACY)); + } else { + //noinspection deprecation + radioButton.setText(Html.fromHtml(entries[i].getEntryName())); + } radioButton.setTextColor(context.getResources().getColor(R.color.primary_text)); radioGroup.addView(radioButton); } @@ -206,7 +222,7 @@ class TopicAdapter extends RecyclerView.Adapter { yAxisRight.setEnabled(false); XAxis xAxis = holder.voteChart.getXAxis(); - xAxis.setValueFormatter((value, axis) -> entries[(int) value].getEntryName()); + xAxis.setValueFormatter((value, axis) -> Html.fromHtml(entries[(int) value].getEntryName()).toString()); xAxis.setTextColor(context.getResources().getColor(R.color.primary_text)); xAxis.setGranularity(1f); xAxis.setDrawGridLines(false); @@ -752,7 +768,7 @@ class TopicAdapter extends RecyclerView.Adapter { final AppCompatButton removeVotesButton, showPollResultsButton, hidePollResultsButton; final HorizontalBarChart voteChart; - public PollViewHolder(View itemView) { + PollViewHolder(View itemView) { super(itemView); question = itemView.findViewById(R.id.question_textview); diff --git a/app/src/main/java/gr/thmmy/mthmmy/activities/topic/TopicParser.java b/app/src/main/java/gr/thmmy/mthmmy/activities/topic/TopicParser.java index b835472c..4ebbba5a 100644 --- a/app/src/main/java/gr/thmmy/mthmmy/activities/topic/TopicParser.java +++ b/app/src/main/java/gr/thmmy/mthmmy/activities/topic/TopicParser.java @@ -1,11 +1,11 @@ package gr.thmmy.mthmmy.activities.topic; import android.graphics.Color; -import android.util.Log; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; +import org.jsoup.nodes.Node; import org.jsoup.select.Elements; import java.net.MalformedURLException; @@ -480,84 +480,80 @@ public class TopicParser { private static Poll findPoll(Document topic) { Pattern integerPattern = Pattern.compile("[0-9]+"); - Elements tables = topic.select("table"); - for (int i = 0; i < tables.size(); i++) { - try { - Element image = tables.get(i).child(0).child(0).child(0); - if (image.html().contains("Poll") || image.html().contains("Ψηφοφορία")) { - // has poll in english - String question; - ArrayList entries = new ArrayList<>(); - int availableVoteCount = 0; - String pollFormUrl = null, sc = null, removeVoteUrl = null, showVoteResultsUrl = null, + Element table = topic.select("table.tborder").first(); + try { + String question; + ArrayList entries = new ArrayList<>(); + int availableVoteCount = 0; + String pollFormUrl = null, sc = null, removeVoteUrl = null, showVoteResultsUrl = null, showOptionsUrl = null; - Element secondRow = tables.get(i).select("tr[class=windowbg]").first(); - Element secondColumn = secondRow.child(1); - String columnString = secondColumn.outerHtml(); - question = columnString.substring(columnString.indexOf('>') + 1, columnString.indexOf('<', 2)) - .replace(" ", " ").trim(); - - Element form = secondColumn.select("form").first(); - if (form != null) { - // poll in vote mode - pollFormUrl = form.attr("action"); - sc = form.select("input[name=sc]").first().attr("value"); - - int rowIndex = -1; - Elements possibleEntriesRows = form.child(0).child(0).children(); - for (int j = 0; j < possibleEntriesRows.size(); j++) { - if (possibleEntriesRows.get(j).select("input").size() > 0) { - rowIndex = j; - break; - } - } - String entriesRaw = form.child(0).child(0).child(rowIndex).child(0).html(); - Matcher entryMatcher = Pattern.compile(">[^<]+ 0) { - showVoteResultsUrl = links.first().attr("href"); - } - } else { - // poll in results mode - Elements optionRows = secondColumn.child(0).child(0).select("table").first().child(0).children(); - for (int j = 0; j < optionRows.size(); j++) { - String optionName = optionRows.get(j).child(0).text(); - String voteCountDescription = optionRows.get(j).child(1).text(); - Matcher integerMatcher = integerPattern.matcher(voteCountDescription); - integerMatcher.find(); - int voteCount = Integer.parseInt(voteCountDescription.substring(integerMatcher.start(), - integerMatcher.end())); - entries.add(0, new Poll.Entry(optionName, voteCount)); - } + if (form != null) { + // poll in vote mode + pollFormUrl = form.attr("action"); + sc = form.select("input[name=sc]").first().attr("value"); - Elements links = secondColumn.select("a"); - if (links != null && links.size() > 0) { - if (links.first().text().equals("Remove Vote") || links.first().text().equals("Αφαίρεση ψήφου")) - removeVoteUrl = links.first().attr("href"); - else if (links.first().text().equals("Voting options") || links.first().text().equals("Επιλογές ψηφοφορίας")) - showOptionsUrl = links.first().attr("href"); - } + List possibleEntriesRows = form.select("td:has(input[id^=options])").first().childNodes(); + for (Node possibleEntry : possibleEntriesRows) { + String possibleEntryHtml = possibleEntry.outerHtml(); + if (!possibleEntryHtml.equals(" ") && !possibleEntryHtml.equals("
") && !possibleEntryHtml.startsWith("tr"); + Elements links; + + if (formTableRows.size() == 3) { + String prompt = formTableRows.first().child(0).text().trim(); + Matcher integerMatcher = integerPattern.matcher(prompt); + if (integerMatcher.find()) { + availableVoteCount = Integer.parseInt(prompt.substring(integerMatcher.start(), integerMatcher.end())); + } + links = formTableRows.get(1).child(1).select("a"); + } else { + availableVoteCount = 1; + links = formTableRows.first().child(1).select("a"); + } + + if (links != null && links.size() > 0) { + showVoteResultsUrl = links.first().attr("href"); + } + } else { + // poll in results mode + Elements entryRows = pollColumn.select("table[cellspacing] tr"); + for (Element entryRow : entryRows) { + Elements entryColumns = entryRow.select("td"); + String optionName = entryColumns.first().html(); + String voteCountDescription = entryColumns.last().text(); + Matcher integerMatcher = integerPattern.matcher(voteCountDescription); + int voteCount = 0; + if (integerMatcher.find()) { + voteCount = Integer.parseInt(voteCountDescription.substring(integerMatcher.start(), + integerMatcher.end())); + } + + entries.add(0, new Poll.Entry(optionName, voteCount)); + } + + Elements links = pollColumn.child(0).child(0).child(0).child(1).select("a"); + if (links != null && links.size() > 0) { + if (links.first().text().equals("Remove Vote") || links.first().text().equals("Αφαίρεση ψήφου")) + removeVoteUrl = links.first().attr("href"); + else if (links.first().text().equals("Voting options") || links.first().text().equals("Επιλογές ψηφοφορίας")) + showOptionsUrl = links.first().attr("href"); + } } + return new Poll(question, entries.toArray(new Poll.Entry[0]), availableVoteCount, + pollFormUrl, sc, removeVoteUrl, showVoteResultsUrl, showOptionsUrl); + } catch (Exception e) { + Timber.v(e, "Could not parse a poll"); } + return null; } diff --git a/app/src/main/java/gr/thmmy/mthmmy/model/Poll.java b/app/src/main/java/gr/thmmy/mthmmy/model/Poll.java index 071557e9..e0d544f6 100644 --- a/app/src/main/java/gr/thmmy/mthmmy/model/Poll.java +++ b/app/src/main/java/gr/thmmy/mthmmy/model/Poll.java @@ -22,7 +22,7 @@ public class Poll extends TopicItem { this.showOptionsUrl = showOptionsUrl; } - public int totalVotes() { + private int totalVotes() { int sum = 0; for (Entry entry : entries) { sum += entry.votes;