Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/stefan-niedermann/nextcloud-deck.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--app/build.gradle4
-rw-r--r--app/src/main/AndroidManifest.xml1
-rw-r--r--app/src/main/java/it/niedermann/nextcloud/deck/DeckAppGlideModule.java9
-rw-r--r--app/src/main/java/it/niedermann/nextcloud/deck/ui/card/CardDetailsFragment.java178
-rw-r--r--app/src/main/res/drawable/ic_close_circle_white.xml8
-rw-r--r--app/src/main/res/layout/fragment_card_edit_tab_details.xml7
-rw-r--r--app/src/main/res/values/dimens.xml1
-rw-r--r--app/src/main/res/xml/network_security_config.xml4
8 files changed, 161 insertions, 51 deletions
diff --git a/app/build.gradle b/app/build.gradle
index 026861825..2182aef6a 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -30,7 +30,7 @@ android {
dependencies {
implementation 'io.reactivex.rxjava2:rxjava:2.1.4'
- //implementation 'com.github.nextcloud:android-SingleSignOn:0.1.2'
+ //implementation 'com.github.nextcloud:Android-SingleSignOn:add-annotations-SNAPSHOT'
implementation project(':Android-SingleSignOn')
implementation 'io.reactivex.rxjava2:rxandroid:2.0.1'
implementation 'com.squareup.retrofit2:adapter-rxjava2:2.3.0'
@@ -39,6 +39,8 @@ dependencies {
implementation 'com.squareup.retrofit2:converter-gson:2.3.0'
implementation 'com.jakewharton:butterknife:8.8.1'
annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'
+ implementation 'com.github.bumptech.glide:glide:4.9.0'
+ annotationProcessor 'com.github.bumptech.glide:compiler:4.9.0'
implementation fileTree(include: ['*.jar'], dir: 'libs')
implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.android.support:design:28.0.0'
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 0d0eacab1..fbde967ec 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -14,6 +14,7 @@
android:supportsRtl="true"
android:hardwareAccelerated="true"
android:theme="@style/AppTheme"
+ android:networkSecurityConfig="@xml/network_security_config"
tools:ignore="GoogleAppIndexingWarning">
<activity
diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/DeckAppGlideModule.java b/app/src/main/java/it/niedermann/nextcloud/deck/DeckAppGlideModule.java
new file mode 100644
index 000000000..fb637624f
--- /dev/null
+++ b/app/src/main/java/it/niedermann/nextcloud/deck/DeckAppGlideModule.java
@@ -0,0 +1,9 @@
+package it.niedermann.nextcloud.deck;
+
+import com.bumptech.glide.annotation.GlideModule;
+import com.bumptech.glide.module.AppGlideModule;
+
+@GlideModule
+public class DeckAppGlideModule extends AppGlideModule {
+ // no psecial config (yet)
+}
diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/CardDetailsFragment.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/CardDetailsFragment.java
index b0dde49eb..05942942a 100644
--- a/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/CardDetailsFragment.java
+++ b/app/src/main/java/it/niedermann/nextcloud/deck/ui/card/CardDetailsFragment.java
@@ -2,15 +2,17 @@ package it.niedermann.nextcloud.deck.ui.card;
import android.app.DatePickerDialog;
import android.app.TimePickerDialog;
-import android.content.Context;
-import android.content.DialogInterface;
import android.content.res.ColorStateList;
import android.graphics.Color;
+import android.graphics.drawable.Drawable;
+import android.net.Uri;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.design.chip.Chip;
import android.support.design.chip.ChipGroup;
import android.support.v4.app.Fragment;
+import android.support.v4.graphics.ColorUtils;
+import android.support.v4.graphics.drawable.DrawableCompat;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
@@ -18,23 +20,28 @@ import android.view.ViewGroup;
import android.widget.DatePicker;
import android.widget.EditText;
import android.widget.ImageView;
+import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.TimePicker;
+import com.bumptech.glide.Glide;
+import com.bumptech.glide.request.RequestOptions;
+import com.nextcloud.android.sso.exceptions.NextcloudFilesAppAccountNotFoundException;
+import com.nextcloud.android.sso.exceptions.NoCurrentAccountSelectedException;
+import com.nextcloud.android.sso.helper.SingleAccountHelper;
+import com.nextcloud.android.sso.model.SingleSignOnAccount;
+
import java.text.DateFormat;
-import java.text.FieldPosition;
-import java.text.ParsePosition;
import java.text.SimpleDateFormat;
import java.util.Calendar;
-import java.util.Date;
import java.util.Locale;
import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.Unbinder;
import it.niedermann.nextcloud.deck.ColorUtil;
+import it.niedermann.nextcloud.deck.DeckLog;
import it.niedermann.nextcloud.deck.R;
-import it.niedermann.nextcloud.deck.SupportUtil;
import it.niedermann.nextcloud.deck.model.Label;
import it.niedermann.nextcloud.deck.model.User;
import it.niedermann.nextcloud.deck.model.full.FullCard;
@@ -56,6 +63,9 @@ public class CardDetailsFragment extends Fragment implements DatePickerDialog.On
@BindView(R.id.people)
TextView people;
+ @BindView(R.id.peopleList)
+ LinearLayout peopleList;
+
@BindView(R.id.dueDateDate)
TextView dueDate;
@@ -112,55 +122,16 @@ public class CardDetailsFragment extends Fragment implements DatePickerDialog.On
this.card = card;
if (this.card != null) {
// people
- // TODO implement proper people display + avatar fetching
- // TODO find out how to get the server's Nextcloud URL to build the avatar URL
- if(this.card.getAssignedUsers() != null) {
- for (User user : this.card.getAssignedUsers()) {
- people.setText(people.getText() + user.getDisplayname() + " ");
- }
- }
+ setupPeople();
// labels
- // TODO load labels
- labelsGroup.removeAllViews();
- if (this.card.getLabels() != null && this.card.getLabels().size() > 0) {
- Chip chip;
- for (Label label : this.card.getLabels()) {
- chip = new Chip(getActivity());
- chip.setText(label.getTitle());
- // TODO use grey/white icon depending on textTinting
- chip.setCloseIconResource(R.drawable.ic_close_circle_grey600);
- chip.setCloseIconVisible(true);
-
- try {
- int labelColor = Color.parseColor("#" + label.getColor());
- ColorStateList c = ColorStateList.valueOf(labelColor);
- chip.setChipBackgroundColor(c);
- chip.setTextColor(ColorUtil.getForegroundColorForBackgroundColor(labelColor));
- } catch (IllegalArgumentException e) {
- Log.e(TAG, "error parsing label color", e);
- }
-
- labelsGroup.addView(chip);
- }
- labelsGroup.setVisibility(View.VISIBLE);
- } else {
- labelsGroup.setVisibility(View.GONE);
- }
+ setupLabels();
// due date
- if (this.card.getCard().getDueDate() != null) {
- dueDate.setText(dateFormat.format(this.card.getCard().getDueDate()));
- dueDateTime.setText(dueTime.format(this.card.getCard().getDueDate()));
- } else {
- dueDate.setText(null);
- dueDateTime.setText(null);
- }
+ setupDueDate();
// description
- if (this.card.getCard().getDescription() != null) {
- description.setText(this.card.getCard().getDescription());
- }
+ setupDescription();
}
});
@@ -203,6 +174,91 @@ public class CardDetailsFragment extends Fragment implements DatePickerDialog.On
});
}
+ private void setupDescription() {
+ if (this.card.getCard().getDescription() != null) {
+ description.setText(this.card.getCard().getDescription());
+ }
+ }
+
+ private void setupDueDate() {
+ if (this.card.getCard().getDueDate() != null) {
+ dueDate.setText(dateFormat.format(this.card.getCard().getDueDate()));
+ dueDateTime.setText(dueTime.format(this.card.getCard().getDueDate()));
+ } else {
+ dueDate.setText(null);
+ dueDateTime.setText(null);
+ }
+ }
+
+ private void setupLabels() {
+ labelsGroup.removeAllViews();
+ if (this.card.getLabels() != null && this.card.getLabels().size() > 0) {
+ Chip chip;
+ for (Label label : this.card.getLabels()) {
+ chip = new Chip(getActivity());
+ chip.setText(label.getTitle());
+ // TODO use grey/white icon depending on textTinting
+ chip.setCloseIcon(getContext().getResources().getDrawable(R.drawable.ic_close_circle_grey600));
+ chip.setCloseIconVisible(true);
+ try {
+ int labelColor = Color.parseColor("#" + label.getColor());
+ ColorStateList c = ColorStateList.valueOf(labelColor);
+ chip.setChipBackgroundColor(c);
+ int color = ColorUtil.getForegroundColorForBackgroundColor(labelColor);
+ chip.setTextColor(color);
+
+ Drawable wrapDrawable = DrawableCompat.wrap(chip.getCloseIcon());
+ DrawableCompat.setTint(wrapDrawable, ColorUtils.setAlphaComponent(color, 150));
+ } catch (IllegalArgumentException e) {
+ Log.e(TAG, "error parsing label color", e);
+ }
+
+ labelsGroup.addView(chip);
+ }
+ labelsGroup.setVisibility(View.VISIBLE);
+ } else {
+ labelsGroup.setVisibility(View.GONE);
+ }
+ }
+
+ private void setupPeople() {
+ // TODO implement proper people display + avatar fetching
+ // TODO find out how to get the server's Nextcloud URL to build the avatar URL
+ if (this.card.getAssignedUsers() != null) {
+ try {
+ // TODO FIX: NullPointerException!
+ // syncManager.getServerUrl()
+
+ //Workaround
+ SingleSignOnAccount account = SingleAccountHelper.getCurrentSingleSignOnAccount(getContext());
+ ImageView avatar;
+ String baseUrl = account.url;
+ int px = getAvatarDimension();
+ int margin = dpToPx(8);
+ LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(px, px);
+ params.setMargins(
+ 0, 0, margin, 0);
+ peopleList.removeAllViews();
+ for (User user : this.card.getAssignedUsers()) {
+ avatar = new ImageView(getActivity());
+ avatar.setLayoutParams(params);
+ String uri = baseUrl + "/index.php/avatar/" + Uri.encode(user.getUid()) + "/" + px;
+ peopleList.addView(avatar);
+ avatar.requestLayout();
+ Glide.with(this)
+ .load(uri)
+ .apply(RequestOptions.circleCropTransform())
+ .into(avatar);
+ people.setText(people.getText() + user.getDisplayname() + " ");
+ }
+ } catch (NextcloudFilesAppAccountNotFoundException e) {
+ DeckLog.logError(e);
+ } catch (NoCurrentAccountSelectedException e) {
+ DeckLog.logError(e);
+ }
+ }
+ }
+
@Override
public void onDestroy() {
super.onDestroy();
@@ -216,7 +272,7 @@ public class CardDetailsFragment extends Fragment implements DatePickerDialog.On
int hourOfDay;
int minute;
- if (dueDateTime.getText() != null && dueDateTime.length()>0) {
+ if (dueDateTime.getText() != null && dueDateTime.length() > 0) {
hourOfDay = this.card.getCard().getDueDate().getHours();
minute = this.card.getCard().getDueDate().getMinutes();
} else {
@@ -237,4 +293,26 @@ public class CardDetailsFragment extends Fragment implements DatePickerDialog.On
dueDateTime.setText(dueTime.format(this.card.getCard().getDueDate().getTime()));
syncManager.updateCard(this.card.getCard());
}
+
+ //TODO move to UI-Utils class
+
+ /**
+ * Converts size of file icon from dp to pixel.
+ *
+ * @return int
+ */
+ private int getAvatarDimension() {
+ // Converts dp to pixel
+ return Math.round(getContext().getResources().getDimension(R.dimen.avatar_size));
+ }
+
+ /**
+ * convert dp into px.
+ *
+ * @param dp dp value
+ * @return corresponding px value
+ */
+ private int dpToPx(int dp) {
+ return (int) (dp * getResources().getDisplayMetrics().density + 0.5f);
+ }
}
diff --git a/app/src/main/res/drawable/ic_close_circle_white.xml b/app/src/main/res/drawable/ic_close_circle_white.xml
new file mode 100644
index 000000000..631859ee4
--- /dev/null
+++ b/app/src/main/res/drawable/ic_close_circle_white.xml
@@ -0,0 +1,8 @@
+<!-- drawable/close_circle.xml -->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:height="24dp"
+ android:width="24dp"
+ android:viewportWidth="24"
+ android:viewportHeight="24">
+ <path android:fillColor="#FFFFFF" android:pathData="M12,2C17.53,2 22,6.47 22,12C22,17.53 17.53,22 12,22C6.47,22 2,17.53 2,12C2,6.47 6.47,2 12,2M15.59,7L12,10.59L8.41,7L7,8.41L10.59,12L7,15.59L8.41,17L12,13.41L15.59,17L17,15.59L13.41,12L17,8.41L15.59,7Z" />
+</vector> \ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_card_edit_tab_details.xml b/app/src/main/res/layout/fragment_card_edit_tab_details.xml
index 4691cab63..c4ac97a7a 100644
--- a/app/src/main/res/layout/fragment_card_edit_tab_details.xml
+++ b/app/src/main/res/layout/fragment_card_edit_tab_details.xml
@@ -28,6 +28,13 @@
android:hint="@string/simple_people" />
</LinearLayout>
+ <LinearLayout
+ android:id="@+id/peopleList"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal"
+ android:layout_marginStart="40dp"
+ android:layout_marginLeft="40dp"/>
<LinearLayout
android:layout_width="match_parent"
diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml
index b77692d0d..74c7cea5c 100644
--- a/app/src/main/res/values/dimens.xml
+++ b/app/src/main/res/values/dimens.xml
@@ -9,4 +9,5 @@
<dimen name="fab_margin">16dp</dimen>
<dimen name="appbar_padding_top">8dp</dimen>
<dimen name="line_item_visual_size">40dp</dimen>
+ <dimen name="avatar_size">40dp</dimen>
</resources> \ No newline at end of file
diff --git a/app/src/main/res/xml/network_security_config.xml b/app/src/main/res/xml/network_security_config.xml
new file mode 100644
index 000000000..c15c09cbf
--- /dev/null
+++ b/app/src/main/res/xml/network_security_config.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<network-security-config>
+ <base-config cleartextTrafficPermitted="true"/>
+</network-security-config>