Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(theming): Use grayscale default theme to avoid wrong color tones #1570

Merged
merged 9 commits into from
Jan 23, 2024
2 changes: 1 addition & 1 deletion app/src/dev/res/xml/shortcuts.xml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
<shortcuts xmlns:android="http://schemas.android.com/apk/res/android">
<shortcut
android:enabled="true"
android:icon="@drawable/ic_add_grey_24dp"
android:icon="@drawable/ic_add_24dp"
android:shortcutId="it.niedermann.nextcloud.deck"
android:shortcutLongLabel="@string/add_card"
android:shortcutShortLabel="@string/simple_add">
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,7 @@ protected void onDestroy() {
public void onStackPicked(@NonNull Account account, @Nullable Board board, @Nullable Stack stack) {
viewModel.setSelected(account, board, stack);
applyTheme(board == null
? ContextCompat.getColor(this, R.color.accent)
? ContextCompat.getColor(this, R.color.onSurface)
: board.getColor()
);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
import com.bumptech.glide.Glide;
import com.bumptech.glide.request.RequestOptions;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import com.nextcloud.android.common.ui.theme.utils.ColorRole;

import java.util.Objects;
import java.util.stream.Collectors;
Expand Down Expand Up @@ -77,8 +78,8 @@ public Dialog onCreateDialog(Bundle savedInstanceState) {
Glide.with(requireContext())
.load(currentAccount.getAvatarUrl(binding.currentAccountItemAvatar.getResources().getDimensionPixelSize(R.dimen.avatar_size)))
.apply(RequestOptions.circleCropTransform())
.placeholder(R.drawable.ic_baseline_account_circle_24)
.error(R.drawable.ic_baseline_account_circle_24)
.placeholder(R.drawable.ic_account_circle_24)
.error(R.drawable.ic_account_circle_24)
.into(binding.currentAccountItemAvatar);

applyTheme(currentAccount.getColor());
Expand Down Expand Up @@ -115,5 +116,9 @@ public static DialogFragment newInstance() {
private void applyTheme(int color) {
final var utils = ThemeUtils.of(color, requireContext());
utils.deck.themeSelectedCheck(binding.check.getContext(), binding.check.getDrawable());
utils.platform.colorImageView(binding.addAccountIcon, ColorRole.ON_SURFACE);
utils.platform.colorImageView(binding.manageAccountsIcon, ColorRole.ON_SURFACE);
utils.platform.colorTextView(binding.addAccountLabel, ColorRole.ON_SURFACE);
utils.platform.colorTextView(binding.manageAccountsLabel, ColorRole.ON_SURFACE);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@

import com.bumptech.glide.Glide;
import com.bumptech.glide.request.RequestOptions;
import com.nextcloud.android.common.ui.theme.utils.ColorRole;

import it.niedermann.nextcloud.deck.R;
import it.niedermann.nextcloud.deck.databinding.ItemAccountChooseBinding;
Expand All @@ -35,13 +36,15 @@ public void bind(@NonNull Account account, @NonNull Consumer<Account> onAccountC
Glide.with(itemView.getContext())
.load(account.getAvatarUrl(binding.accountItemAvatar.getResources().getDimensionPixelSize(R.dimen.avatar_size)))
.apply(RequestOptions.circleCropTransform())
.placeholder(R.drawable.ic_baseline_account_circle_24)
.error(R.drawable.ic_baseline_account_circle_24)
.placeholder(R.drawable.ic_account_circle_24)
.error(R.drawable.ic_account_circle_24)
.into(binding.accountItemAvatar);
itemView.setOnClickListener((v) -> onAccountClick.accept(account));
binding.delete.setVisibility(View.GONE);

final var utils = ThemeUtils.of(account.getColor(), itemView.getContext());
utils.deck.themeSelectedCheck(binding.currentAccountIndicator.getContext(), binding.currentAccountIndicator.getDrawable());
utils.platform.colorTextView(binding.accountName, ColorRole.ON_SURFACE);
utils.platform.colorTextView(binding.accountHost, ColorRole.ON_SURFACE_VARIANT);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ void bind(@NonNull Account account, @NonNull Board board, FragmentManager fragme
if (account.getServerDeckVersionAsObject().isSupported()) {
if (board.isPermissionManage()) {
binding.boardMenu.setVisibility(View.VISIBLE);
binding.boardMenu.setImageDrawable(util.platform.tintDrawable(context, R.drawable.ic_menu, ColorRole.ON_SURFACE));
binding.boardMenu.setImageDrawable(util.platform.tintDrawable(context, R.drawable.ic_menu, ColorRole.ON_SURFACE_VARIANT));
binding.boardMenu.setOnClickListener((v) -> {
PopupMenu popup = new PopupMenu(context, binding.boardMenu);
popup.getMenuInflater().inflate(R.menu.archived_board_menu, popup.getMenu());
Expand Down Expand Up @@ -72,7 +72,7 @@ void bind(@NonNull Account account, @NonNull Board board, FragmentManager fragme
});
} else if (board.isPermissionShare()) {
binding.boardMenu.setVisibility(View.VISIBLE);
binding.boardMenu.setImageDrawable(util.platform.tintDrawable(context, R.drawable.ic_share_grey600_18dp, ColorRole.ON_SURFACE));
binding.boardMenu.setImageDrawable(util.platform.tintDrawable(context, R.drawable.ic_share_18dp, ColorRole.ON_SURFACE_VARIANT));
binding.boardMenu.setOnClickListener((v) -> AccessControlDialogFragment.newInstance(account, board.getLocalId()).show(fragmentManager, AccessControlDialogFragment.class.getSimpleName()));
}
binding.boardMenu.setVisibility(View.VISIBLE);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ public AttachmentViewHolder(@NonNull Context parentContext, @NonNull ItemAttachm
public void bind(@NonNull Account account, @NonNull Attachment attachment, long cardRemoteId) {
if (MimeTypeUtil.isImage(attachment.getMimetype())) {
binding.preview.setTransitionName(parentContext.getString(R.string.transition_attachment_preview, String.valueOf(attachment.getLocalId())));
binding.preview.setImageResource(R.drawable.ic_image_grey600_24dp);
binding.preview.setImageResource(R.drawable.ic_image_24dp);
binding.preview.post(() -> {
final String uri = AttachmentUtil.getThumbnailUrl(account, cardRemoteId, attachment, binding.preview.getWidth(), binding.preview.getHeight());
Glide.with(parentContext)
Expand All @@ -61,7 +61,7 @@ public boolean onResourceReady(Drawable resource, Object model,
return false;
}
})
.error(R.drawable.ic_image_grey600_24dp)
.error(R.drawable.ic_image_24dp)
.into(binding.preview);
});
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ public void onCreate(Bundle savedInstanceState) {
supportPostponeEnterTransition();

setSupportActionBar(binding.toolbar);
final Drawable navigationIcon = ContextCompat.getDrawable(this, R.drawable.ic_arrow_back_white_24dp);
final Drawable navigationIcon = ContextCompat.getDrawable(this, R.drawable.ic_arrow_back_24dp);
DrawableCompat.setTint(navigationIcon, ContextCompat.getColor(this, android.R.color.white));
binding.toolbar.setNavigationIcon(navigationIcon);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -83,8 +83,8 @@ public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int positi
Glide.with(ownerHolder.binding.avatar.getContext())
.load(account.getAvatarUrl(ownerHolder.binding.avatar.getResources().getDimensionPixelSize(R.dimen.avatar_size), ac.getUser().getUid()))
.apply(RequestOptions.circleCropTransform())
.placeholder(R.drawable.ic_person_grey600_24dp)
.error(R.drawable.ic_person_grey600_24dp)
.placeholder(R.drawable.ic_person_24dp)
.error(R.drawable.ic_person_24dp)
.into(ownerHolder.binding.avatar);
break;
}
Expand All @@ -94,13 +94,13 @@ public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int positi
Glide.with(acHolder.binding.avatar.getContext())
.load(account.getAvatarUrl(acHolder.binding.avatar.getResources().getDimensionPixelSize(R.dimen.avatar_size), ac.getUser().getUid()))
.apply(RequestOptions.circleCropTransform())
.placeholder(R.drawable.ic_person_grey600_24dp)
.error(R.drawable.ic_person_grey600_24dp)
.placeholder(R.drawable.ic_person_24dp)
.error(R.drawable.ic_person_24dp)
.into(acHolder.binding.avatar);

acHolder.binding.username.setText(ac.getUser().getDisplayname());
acHolder.binding.username.setCompoundDrawables(null, null, ac.getStatus() == DBStatus.LOCAL_EDITED.getId()
? ContextCompat.getDrawable(context, R.drawable.ic_sync_blue_24dp) : null, null);
? ContextCompat.getDrawable(context, R.drawable.ic_sync_18dp) : null, null);
acHolder.binding.delete.setOnClickListener((v) -> accessControlChangedListener.deleteAccessControl(ac));

if (hasManagePermission) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,7 @@ public void bind(@NonNull FullCard fullCard, @NonNull Account account, @Nullable
protected void applyTheme(@Nullable ThemeUtils utils) {
if (utils != null) {
utils.platform.colorImageView(getNotSyncedYet(), ColorRole.PRIMARY);
utils.platform.colorImageView(getCardMenu(), ColorRole.ON_SURFACE);
utils.platform.colorImageView(getCardMenu(), ColorRole.ON_SURFACE_VARIANT);
utils.platform.colorTextView(getCardTitle(), ColorRole.ON_SURFACE);

// TODO should be discussed with UX
Expand Down Expand Up @@ -149,8 +149,8 @@ protected static void setupCoverImages(@NonNull Account account, @NonNull ViewGr
coverImagesHolder.addView(coverImageView);
Glide.with(coverImageView)
.load(new SingleSignOnUrl(account.getName(), AttachmentUtil.getThumbnailUrl(account, fullCard.getId(), coverImage, coverWidth, coverHeight)))
.placeholder(R.drawable.ic_image_grey600_24dp)
.error(R.drawable.ic_image_grey600_24dp)
.placeholder(R.drawable.ic_image_24dp)
.error(R.drawable.ic_image_24dp)
.into(coverImageView);
}
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,7 @@ public void bind(@NonNull FullCard fullCard, @NonNull Account account, @Nullable
} else {
final String description = fullCard.getCard().getDescription();
if (!TextUtils.isEmpty(description)) {
binding.cardCountTasks.setCompoundDrawablesWithIntrinsicBounds(ContextCompat.getDrawable(context, R.drawable.ic_baseline_subject_24), null, null, null);
binding.cardCountTasks.setCompoundDrawablesWithIntrinsicBounds(ContextCompat.getDrawable(context, R.drawable.ic_subject_24), null, null, null);
binding.cardCountTasks.setText(null);
binding.cardCountTasks.setVisibility(View.VISIBLE);
} else {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -63,16 +63,16 @@ public class EditActivity extends AppCompatActivity {
*/
@Deprecated
private static final int[] tabIcons = new int[]{
R.drawable.ic_home_grey600_24dp,
R.drawable.ic_attach_file_grey600_24dp,
R.drawable.ic_activity_light_grey
R.drawable.ic_home_24dp,
R.drawable.ic_attach_file_24dp,
R.drawable.ic_activity_72dp
};

private static final int[] tabIconsWithComments = new int[]{
R.drawable.ic_home_grey600_24dp,
R.drawable.ic_attach_file_grey600_24dp,
R.drawable.type_comment_grey600_36dp,
R.drawable.ic_activity_light_grey
R.drawable.ic_home_24dp,
R.drawable.ic_attach_file_24dp,
R.drawable.type_comment_36dp,
R.drawable.ic_activity_72dp
};

@Override
Expand Down Expand Up @@ -162,7 +162,7 @@ private void loadDataFromIntent() {
public boolean onCreateOptionsMenu(@NonNull Menu menu) {
if (viewModel.canEdit()) {
getMenuInflater().inflate(R.menu.card_edit_menu, menu);
@ColorInt final int color = ContextCompat.getColor(this, R.color.accent);
@ColorInt final int color = ContextCompat.getColor(this, R.color.onSurface);
final var utils = ThemeUtils.of(color, this);

for (int i = 0; i < menu.size(); i++) {
Expand Down Expand Up @@ -282,7 +282,7 @@ private void applyTheme(int color) {
if (navigationIcon == null) {
DeckLog.error("Expected navigationIcon to be present.");
} else {
DrawableCompat.setTint(binding.toolbar.getNavigationIcon(), ContextCompat.getColor(this, R.color.accent));
DrawableCompat.setTint(binding.toolbar.getNavigationIcon(), ContextCompat.getColor(this, R.color.onSurface));
}

final var utils = ThemeUtils.of(color, this);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -83,8 +83,8 @@ public View getView(int position, View convertView, ViewGroup parent) {
Glide.with(binding.icon.getContext())
.load(account.getAvatarUrl(binding.icon.getResources().getDimensionPixelSize(R.dimen.avatar_size), getItem(position).getUid()))
.apply(RequestOptions.circleCropTransform())
.placeholder(R.drawable.ic_person_grey600_24dp)
.error(R.drawable.ic_person_grey600_24dp)
.placeholder(R.drawable.ic_person_24dp)
.error(R.drawable.ic_person_24dp)
.into(binding.icon);
binding.label.setText(getItem(position).getDisplayname());

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,24 +5,28 @@
import android.view.ViewGroup;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.recyclerview.widget.RecyclerView;

import java.util.ArrayList;
import java.util.List;

import it.niedermann.nextcloud.deck.databinding.ItemActivityBinding;
import it.niedermann.nextcloud.deck.model.ocs.Activity;
import it.niedermann.nextcloud.deck.ui.theme.ThemeUtils;

public class CardActivityAdapter extends RecyclerView.Adapter<CardActivityViewHolder> {

@NonNull
private final List<Activity> activities;
private final List<Activity> activities = new ArrayList<>();
@Nullable
private ThemeUtils utils;
@NonNull
private final MenuInflater menuInflater;

@SuppressWarnings("WeakerAccess")
public CardActivityAdapter(@NonNull List<Activity> activities, @NonNull MenuInflater menuInflater) {
public CardActivityAdapter(@NonNull MenuInflater menuInflater) {
super();
this.activities = activities;
this.menuInflater = menuInflater;
}

Expand All @@ -34,9 +38,16 @@ public CardActivityViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int
return new CardActivityViewHolder(binding);
}

public void setData(@NonNull List<Activity> activities, @NonNull ThemeUtils utils) {
this.activities.clear();
this.activities.addAll(activities);
this.utils = utils;
this.notifyDataSetChanged();
}

@Override
public void onBindViewHolder(@NonNull CardActivityViewHolder holder, int position) {
holder.bind(activities.get(position), menuInflater);
holder.bind(activities.get(position), menuInflater, utils);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import androidx.fragment.app.Fragment;
import androidx.lifecycle.ViewModelProvider;

import it.niedermann.android.reactivelivedata.ReactiveLiveData;
import it.niedermann.nextcloud.deck.DeckLog;
import it.niedermann.nextcloud.deck.databinding.FragmentCardEditTabActivitiesBinding;
import it.niedermann.nextcloud.deck.ui.card.EditCardViewModel;
Expand Down Expand Up @@ -38,18 +39,22 @@ public View onCreateView(@NonNull LayoutInflater inflater,
return binding.getRoot();
}

viewModel.getBoardColor().observe(getViewLifecycleOwner(), this::applyTheme);
final var adapter = new CardActivityAdapter(requireActivity().getMenuInflater());
binding.activitiesList.setAdapter(adapter);

viewModel.syncActivitiesForCard(viewModel.getFullCard().getCard()).observe(getViewLifecycleOwner(), (activities -> {
if (activities == null || activities.size() == 0) {
binding.emptyContentView.setVisibility(View.VISIBLE);
binding.activitiesList.setVisibility(View.GONE);
} else {
binding.emptyContentView.setVisibility(View.GONE);
binding.activitiesList.setVisibility(View.VISIBLE);
binding.activitiesList.setAdapter(new CardActivityAdapter(activities, requireActivity().getMenuInflater()));
}
}));
new ReactiveLiveData<>(viewModel.syncActivitiesForCard(viewModel.getFullCard().getCard()))
.combineWith(viewModel::getBoardColor)
.observe(getViewLifecycleOwner(), data -> {
applyTheme(data.second);
if (data.first == null || data.first.size() == 0) {
binding.emptyContentView.setVisibility(View.VISIBLE);
binding.activitiesList.setVisibility(View.GONE);
} else {
binding.emptyContentView.setVisibility(View.GONE);
binding.activitiesList.setVisibility(View.VISIBLE);
}
adapter.setData(data.first, ThemeUtils.of(data.second, requireContext()));
});
return binding.getRoot();
}

Expand Down
Loading
Loading