diff --git a/docs-android/app/build.gradle b/docs-android/app/build.gradle index 062f5655..9252b12e 100644 --- a/docs-android/app/build.gradle +++ b/docs-android/app/build.gradle @@ -50,9 +50,9 @@ android { dependencies { compile fileTree(dir: 'libs', include: '*.jar') - compile 'com.android.support:appcompat-v7:23.3.0' - compile 'com.android.support:recyclerview-v7:23.3.0' - compile 'com.android.support:design:23.3.0' + compile 'com.android.support:appcompat-v7:23.4.0' + compile 'com.android.support:recyclerview-v7:23.4.0' + compile 'com.android.support:design:23.4.0' compile 'it.sephiroth.android.library.imagezoom:imagezoom:1.0.5' compile 'org.greenrobot:eventbus:3.0.0' compile 'com.squareup.picasso:picasso:2.5.2' diff --git a/docs-android/app/src/main/java/com/sismics/docs/activity/DocumentViewActivity.java b/docs-android/app/src/main/java/com/sismics/docs/activity/DocumentViewActivity.java index 46a17f55..06297596 100644 --- a/docs-android/app/src/main/java/com/sismics/docs/activity/DocumentViewActivity.java +++ b/docs-android/app/src/main/java/com/sismics/docs/activity/DocumentViewActivity.java @@ -16,6 +16,7 @@ import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; import android.text.TextUtils; import android.text.format.DateFormat; +import android.text.method.LinkMovementMethod; import android.view.ContextMenu; import android.view.Menu; import android.view.MenuInflater; @@ -51,7 +52,7 @@ import com.sismics.docs.resource.FileResource; import com.sismics.docs.service.FileUploadService; import com.sismics.docs.util.NetworkUtil; import com.sismics.docs.util.PreferenceUtil; -import com.sismics.docs.util.TagUtil; +import com.sismics.docs.util.SpannableUtil; import org.greenrobot.eventbus.EventBus; import org.greenrobot.eventbus.Subscribe; @@ -176,9 +177,11 @@ public class DocumentViewActivity extends AppCompatActivity { } // Fill the layout + // Create date TextView createdDateTextView = (TextView) findViewById(R.id.createdDateTextView); createdDateTextView.setText(date); + // Description TextView descriptionTextView = (TextView) findViewById(R.id.descriptionTextView); if (description.isEmpty() || document.isNull("description")) { descriptionTextView.setVisibility(View.GONE); @@ -187,17 +190,20 @@ public class DocumentViewActivity extends AppCompatActivity { descriptionTextView.setText(description); } + // Tags TextView tagTextView = (TextView) findViewById(R.id.tagTextView); if (tags.length() == 0) { tagTextView.setVisibility(View.GONE); } else { tagTextView.setVisibility(View.VISIBLE); - tagTextView.setText(TagUtil.buildSpannable(tags)); + tagTextView.setText(SpannableUtil.buildSpannableTags(tags)); } + // Language ImageView languageImageView = (ImageView) findViewById(R.id.languageImageView); languageImageView.setImageResource(getResources().getIdentifier(language, "drawable", getPackageName())); + // Shared status ImageView sharedImageView = (ImageView) findViewById(R.id.sharedImageView); sharedImageView.setVisibility(shared ? View.VISIBLE : View.GONE); @@ -679,10 +685,54 @@ public class DocumentViewActivity extends AppCompatActivity { startActivity(intent); } }); + + // Contributors + TextView contributorsTextView = (TextView) findViewById(R.id.contributorsTextView); + contributorsTextView.setText(SpannableUtil.buildSpannableContributors(document.optJSONArray("contributors"))); + + // Relations + JSONArray relations = document.optJSONArray("relations"); + if (relations.length() > 0) { + TextView relationsTextView = (TextView) findViewById(R.id.relationsTextView); + relationsTextView.setMovementMethod(LinkMovementMethod.getInstance()); + relationsTextView.setText(SpannableUtil.buildSpannableRelations(relations)); + } else { + findViewById(R.id.relationsLayout).setVisibility(View.GONE); + } + + // Additional dublincore metadata + displayDublincoreMetadata(R.id.subjectTextView, R.id.subjectLayout, "subject"); + displayDublincoreMetadata(R.id.identifierTextView, R.id.identifierLayout, "identifier"); + displayDublincoreMetadata(R.id.publisherTextView, R.id.publisherLayout, "publisher"); + displayDublincoreMetadata(R.id.formatTextView, R.id.formatLayout, "format"); + displayDublincoreMetadata(R.id.sourceTextView, R.id.sourceLayout, "source"); + displayDublincoreMetadata(R.id.typeTextView, R.id.typeLayout, "type"); + displayDublincoreMetadata(R.id.coverageTextView, R.id.coverageLayout, "coverage"); + displayDublincoreMetadata(R.id.rightsTextView, R.id.rightsLayout, "rights"); } }); } + /** + * Display a dublincore metadata. + * + * @param textViewId TextView ID + * @param blockViewId View ID + * @param name Name + */ + private void displayDublincoreMetadata(int textViewId, int blockViewId, String name) { + if (document == null) return; + String value = document.optString(name); + if (document.isNull(name) || value.isEmpty()) { + findViewById(blockViewId).setVisibility(View.GONE); + return; + } + + findViewById(blockViewId).setVisibility(View.VISIBLE); + TextView textView = (TextView) findViewById(textViewId); + textView.setText(value); + } + @Override public void onCreateContextMenu(ContextMenu menu, View view, ContextMenu.ContextMenuInfo menuInfo) { switch (view.getId()) { diff --git a/docs-android/app/src/main/java/com/sismics/docs/adapter/DocListAdapter.java b/docs-android/app/src/main/java/com/sismics/docs/adapter/DocListAdapter.java index bd68ddce..5450db0a 100644 --- a/docs-android/app/src/main/java/com/sismics/docs/adapter/DocListAdapter.java +++ b/docs-android/app/src/main/java/com/sismics/docs/adapter/DocListAdapter.java @@ -9,7 +9,7 @@ import android.widget.ImageView; import android.widget.TextView; import com.sismics.docs.R; -import com.sismics.docs.util.TagUtil; +import com.sismics.docs.util.SpannableUtil; import org.json.JSONArray; import org.json.JSONObject; @@ -69,7 +69,7 @@ public class DocListAdapter extends RecyclerView.Adapter> 2, MeasureSpec.AT_MOST); + super.onMeasure(widthMeasureSpec, heightMeasureSpec_custom); + ViewGroup.LayoutParams params = getLayoutParams(); + params.height = getMeasuredHeight(); + } +} \ No newline at end of file diff --git a/docs-android/app/src/main/java/com/sismics/docs/util/SpannableUtil.java b/docs-android/app/src/main/java/com/sismics/docs/util/SpannableUtil.java new file mode 100644 index 00000000..c0daf560 --- /dev/null +++ b/docs-android/app/src/main/java/com/sismics/docs/util/SpannableUtil.java @@ -0,0 +1,85 @@ +package com.sismics.docs.util; + +import android.graphics.Color; +import android.text.Spannable; +import android.text.SpannableStringBuilder; +import android.text.Spanned; +import android.text.style.BackgroundColorSpan; +import android.text.style.ForegroundColorSpan; + +import org.json.JSONArray; +import org.json.JSONObject; + +/** + * Utility class for tags. + * + * @author bgamard. + */ +public class SpannableUtil { + /** + * Create a colored spannable from tags. + * + * @param tags Tags + * @return Colored spannable + */ + public static Spannable buildSpannableTags(JSONArray tags) { + return buildSpannable(tags, "name", "color"); + } + + /** + * Create a spannable for contributors. + * + * @param contributors Contributors + * @return Spannable + */ + public static Spannable buildSpannableContributors(JSONArray contributors) { + return buildSpannable(contributors, "username", null); + } + + /** + * Create a spannable for relations. + * + * @param relations Relations + * @return Spannable + */ + public static Spannable buildSpannableRelations(JSONArray relations) { + return buildSpannable(relations, "title", null); + } + + /** + * Create a spannable from a JSONArray. + * + * @param array JSONArray + * @param valueName Name of the value part + * @param colorName Name of the color part (optional) + * @return Spannable + */ + private static Spannable buildSpannable(JSONArray array, String valueName, String colorName) { + SpannableStringBuilder builder = new SpannableStringBuilder(); + + for (int i = 0; i < array.length(); i++) { + final JSONObject tag = array.optJSONObject(i); + int start = builder.length(); + builder.append(" ").append(tag.optString(valueName)).append(" "); + builder.setSpan(new ForegroundColorSpan(Color.WHITE), start, builder.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + builder.setSpan(new BackgroundColorSpan(Color.parseColor(tag.optString(colorName, "#5bc0de"))), start, builder.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + /* + TODO : Make tags, relations and contributors clickable + builder.setSpan(new ClickableSpan() { + @Override + public void onClick(View widget) { + } + + @Override + public void updateDrawState(TextPaint ds) { + super.updateDrawState(ds); + ds.setColor(Color.WHITE); + ds.setUnderlineText(false); + } + }, start, builder.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);*/ + builder.append(" "); + } + + return builder; + } +} diff --git a/docs-android/app/src/main/java/com/sismics/docs/util/TagUtil.java b/docs-android/app/src/main/java/com/sismics/docs/util/TagUtil.java deleted file mode 100644 index d2af026d..00000000 --- a/docs-android/app/src/main/java/com/sismics/docs/util/TagUtil.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.sismics.docs.util; - -import android.graphics.Color; -import android.text.Spannable; -import android.text.SpannableStringBuilder; -import android.text.Spanned; -import android.text.style.BackgroundColorSpan; -import android.text.style.ForegroundColorSpan; - -import org.json.JSONArray; -import org.json.JSONObject; - -/** - * Utility class for tags. - * - * @author bgamard. - */ -public class TagUtil { - /** - * Create a colored spannable from tags. - * - * @param tags Tags - * @return Colored spannable - */ - public static Spannable buildSpannable(JSONArray tags) { - SpannableStringBuilder builder = new SpannableStringBuilder(); - - for (int i = 0; i < tags.length(); i++) { - JSONObject tag = tags.optJSONObject(i); - int start = builder.length(); - builder.append(" ").append(tag.optString("name")).append(" "); - builder.setSpan(new ForegroundColorSpan(Color.WHITE), start, builder.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); - builder.setSpan(new BackgroundColorSpan(Color.parseColor(tag.optString("color"))), start, builder.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); - builder.append(" "); - } - - return builder; - } -} diff --git a/docs-android/app/src/main/res/layout/document_view_activity.xml b/docs-android/app/src/main/res/layout/document_view_activity.xml index 0068dceb..fb50540a 100644 --- a/docs-android/app/src/main/res/layout/document_view_activity.xml +++ b/docs-android/app/src/main/res/layout/document_view_activity.xml @@ -142,241 +142,523 @@ - - - + android:elevation="5dp" + android:layout_gravity="end"> + android:orientation="vertical"> + + + android:orientation="vertical" + android:gravity="center"> -