diff options
author | Andy Scherzinger <info@andy-scherzinger.de> | 2019-03-03 21:19:09 +0300 |
---|---|---|
committer | Andy Scherzinger <info@andy-scherzinger.de> | 2019-03-03 21:19:09 +0300 |
commit | a8bb38bff68a7a34cfac51bae870d5323badf089 (patch) | |
tree | a9e24b436d455a502c5de4d3471953f47e149515 /app/src | |
parent | 40bb01d0915b8b378fa8aa7e5321f44fad39700e (diff) |
add avatar fetching, add close icon tinting
Signed-off-by: Andy Scherzinger <info@andy-scherzinger.de>
Diffstat (limited to 'app/src')
7 files changed, 158 insertions, 50 deletions
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> |