- Fix #6 (Show Excerpt instead of Modified Date in List-View)

- Add some further JUnit Tests
This commit is contained in:
Stefan Niedermann 2015-10-06 22:51:56 +02:00
parent 9097f0050a
commit 727c8a93f2
5 changed files with 114 additions and 22 deletions

View file

@ -0,0 +1,28 @@
package it.niedermann.owncloud.notes.util;
import junit.framework.TestCase;
/**
* Tests the NoteUtil
* Created by stefan on 06.10.15.
*/
public class NoteUtilTest extends TestCase {
public void testParseMarkDown() {
assertTrue(NoteUtil.parseMarkDown("*cursive*").contains("<em>cursive</em>"));
assertTrue(NoteUtil.parseMarkDown("**bold**").contains("<strong>bold</strong>"));
assertTrue(NoteUtil.parseMarkDown("##header").contains("<h2>header</h2>"));
}
public void testRemoveMarkDown() {
assertTrue("Aufzählung".equals(NoteUtil.removeMarkDown("* Aufzählung")));
assertTrue("Header".equals(NoteUtil.removeMarkDown("# Header")));
}
public void testIsEmptyLine() {
assertTrue(NoteUtil.isEmptyLine(" "));
assertTrue(NoteUtil.isEmptyLine("\n"));
assertTrue(NoteUtil.isEmptyLine("\n "));
assertTrue(NoteUtil.isEmptyLine(" \n"));
assertTrue(NoteUtil.isEmptyLine(" \n "));
}
}

View file

@ -1,30 +1,26 @@
package it.niedermann.owncloud.notes.model; package it.niedermann.owncloud.notes.model;
import android.text.Html;
import com.commonsware.cwac.anddown.AndDown;
import java.io.Serializable; import java.io.Serializable;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.Calendar; import java.util.Calendar;
import java.util.Locale; import java.util.Locale;
import it.niedermann.owncloud.notes.persistence.NoteSQLiteOpenHelper; import it.niedermann.owncloud.notes.persistence.NoteSQLiteOpenHelper;
import it.niedermann.owncloud.notes.util.NoteUtil;
@SuppressWarnings("serial") @SuppressWarnings("serial")
public class Note implements Serializable { public class Note implements Serializable {
private static final AndDown and_down = new AndDown();
private long id = 0; private long id = 0;
private String title = ""; private String title = "";
private Calendar modified = null; private Calendar modified = null;
private String content = ""; private String content = "";
private String excerpt = "";
private String htmlContent = null; private String htmlContent = null;
public Note(long id, Calendar modified, String title, String content) { public Note(long id, Calendar modified, String title, String content) {
this.id = id; this.id = id;
if(title != null) if(title != null)
this.title = Html.fromHtml(and_down.markdownToHtml(title)).toString().trim(); setTitle(title);
setTitle(title); setTitle(title);
setContent(content); setContent(content);
this.modified = modified; this.modified = modified;
@ -39,7 +35,7 @@ public class Note implements Serializable {
} }
public void setTitle(String title) { public void setTitle(String title) {
this.title = Html.fromHtml(and_down.markdownToHtml(title)).toString().trim(); this.title = NoteUtil.removeMarkDown(title);
} }
@SuppressWarnings("WeakerAccess") @SuppressWarnings("WeakerAccess")
@ -57,13 +53,31 @@ public class Note implements Serializable {
} }
public void setContent(String content) { public void setContent(String content) {
setExcerpt(content);
this.content = content; this.content = content;
this.htmlContent = null; this.htmlContent = null;
} }
public String getExcerpt() {
return excerpt;
}
private void setExcerpt(String content) {
if (content.contains("\n")) {
String[] lines = content.split("\n");
int currentLine = 1;
while (NoteUtil.isEmptyLine(lines[currentLine]) && currentLine < lines.length) {
currentLine++;
}
excerpt = NoteUtil.removeMarkDown(lines[currentLine]);
} else {
excerpt = content;
}
}
public String getHtmlContent() { public String getHtmlContent() {
if(htmlContent == null && getContent() != null) { if(htmlContent == null && getContent() != null) {
htmlContent = and_down.markdownToHtml(getContent()); htmlContent = NoteUtil.parseMarkDown(getContent());
} }
return htmlContent; return htmlContent;
} }

View file

@ -51,16 +51,16 @@ public class NoteAdapter extends ArrayAdapter<Note> {
// These TextViews are created in the XML files we defined. // These TextViews are created in the XML files we defined.
TextView noteTitle = (TextView) v.findViewById(R.id.noteTitle); TextView noteTitle = (TextView) v.findViewById(R.id.noteTitle);
TextView noteModified = (TextView) v TextView noteExcerpt = (TextView) v
.findViewById(R.id.noteModified); .findViewById(R.id.noteExcerpt);
// check to see if each individual textview is null. // check to see if each individual textview is null.
// if not, assign some text! // if not, assign some text!
if (noteTitle != null) { if (noteTitle != null) {
noteTitle.setText(note.getTitle()); noteTitle.setText(note.getTitle());
} }
if (noteModified != null) { if (noteExcerpt != null) {
noteModified.setText(note.getModified("dd.MM.yyyy HH:mm")); noteExcerpt.setText(note.getExcerpt());
} }
} }

View file

@ -0,0 +1,49 @@
package it.niedermann.owncloud.notes.util;
import android.text.Html;
import com.commonsware.cwac.anddown.AndDown;
/**
* Provides basic functionality for Note operations.
* Created by stefan on 06.10.15.
*/
public class NoteUtil {
private static final AndDown and_down = new AndDown();
/**
* Parses a MarkDown-String and returns its HTML-Pendant
*
* @param s String MarkDown
* @return String HTML
*/
public static String parseMarkDown(String s) {
return and_down.markdownToHtml(s);
}
/**
* Strips all MarkDown from the given String
*
* @param s String - MarkDown
* @return Plain Text-String
*/
public static String removeMarkDown(String s) {
return s == null ? "" : Html.fromHtml(and_down.markdownToHtml(s)).toString().trim();
}
/**
* Checks if a line is empty.
* " " -> empty
* "\n" -> empty
* "\n " -> empty
* " \n" -> empty
* " \n " -> empty
*
* @param line String - a single Line which ends with \n
* @return boolean isEmpty
*/
public static boolean isEmptyLine(String line) {
return removeMarkDown(line).trim().length() == 0;
}
}

View file

@ -1,17 +1,18 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" <RelativeLayout
android:id="@+id/noteItem"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent" android:layout_width="fill_parent"
android:layout_height="?android:attr/listPreferredItemHeight" android:layout_height="?android:attr/listPreferredItemHeight"
android:padding="16dp"
android:background="@drawable/list_item_background_selector" android:background="@drawable/list_item_background_selector"
android:id="@+id/noteItem" > android:padding="16dp">
<TextView <TextView
android:id="@+id/noteTitle" android:id="@+id/noteTitle"
android:layout_width="fill_parent" android:layout_width="fill_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true" android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true" android:layout_alignParentTop="true"
android:layout_alignWithParentIfMissing="true" android:layout_alignWithParentIfMissing="true"
android:gravity="center_vertical" android:gravity="center_vertical"
@ -19,15 +20,15 @@
android:textSize="16sp" /> android:textSize="16sp" />
<TextView <TextView
android:id="@+id/noteModified" android:id="@+id/noteExcerpt"
android:layout_width="fill_parent" android:layout_width="fill_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_alignParentBottom="true" android:layout_alignParentBottom="true"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true" android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:layout_below="@id/noteTitle"
android:ellipsize="marquee" android:ellipsize="marquee"
android:singleLine="true" android:singleLine="true"
android:layout_below="@id/noteTitle"
android:textColor="@drawable/list_item_color_selector_low" android:textColor="@drawable/list_item_color_selector_low"
android:textSize="14sp" /> android:textSize="14sp" />