/** * Wire * Copyright (C) 2016 Wire Swiss GmbH * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package com.waz.zclient.pages.main.participants.views; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView; import com.waz.api.CoreList; import com.waz.api.OtrClient; import com.waz.api.UpdateListener; import com.waz.api.Verification; import com.waz.zclient.R; import com.waz.zclient.ui.utils.TextViewUtils; import com.waz.zclient.utils.OtrUtils; import com.waz.zclient.utils.ViewUtils; import java.util.Locale; public class ParticipantOtrDeviceAdapter extends RecyclerView.Adapter<ParticipantOtrDeviceAdapter.ViewHolder> { private static final int VIEW_TYPE_HEADER = 0; private static final int VIEW_TYPE_OTR_CLIENT = 1; private static final String OTR_CLIENT_TEXT_TEMPLATE = "[[%s]]\n%s"; private ViewHolder.ViewHolderClicks viewHolderClicks; private CoreList<OtrClient> otrClients; private String userDisplayName; private int accentColor; public ParticipantOtrDeviceAdapter(ViewHolder.ViewHolderClicks viewHolderClicks) { this.viewHolderClicks = viewHolderClicks; } @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view; switch (viewType) { case VIEW_TYPE_HEADER: view = LayoutInflater.from(parent.getContext()).inflate(R.layout.row_participant_otr_header, parent, false); return new OtrHeaderViewHolder(view, viewHolderClicks); case VIEW_TYPE_OTR_CLIENT: view = LayoutInflater.from(parent.getContext()).inflate(R.layout.row_participant_otr_device, parent, false); return new OtrClientViewHolder(view, viewHolderClicks); } return null; } @Override public void onBindViewHolder(ViewHolder holder, int position) { holder.bindOtrClient(getOtrClient(position), accentColor, userDisplayName); holder.setIsLastItem(position == getItemCount() - 1); } private OtrClient getOtrClient(int position) { switch (getItemViewType(position)) { case VIEW_TYPE_OTR_CLIENT: return otrClients.get(position - 1); default: return null; } } @Override public int getItemViewType(int position) { switch (position) { case 0: return VIEW_TYPE_HEADER; default: return VIEW_TYPE_OTR_CLIENT; } } @Override public int getItemCount() { return otrClients == null || otrClients.size() == 0 ? 1 : otrClients.size() + 1; } public void setOtrClients(CoreList<OtrClient> otrClients) { this.otrClients = otrClients; notifyDataSetChanged(); } public void setUserDisplayName(String userDisplayName) { this.userDisplayName = userDisplayName; notifyDataSetChanged(); } public void setAccentColor(int accentColor) { this.accentColor = accentColor; notifyDataSetChanged(); } public static abstract class ViewHolder extends RecyclerView.ViewHolder { protected ViewHolderClicks viewHolderClicks; public ViewHolder(View itemView, ViewHolderClicks viewHolderClicks) { super(itemView); this.viewHolderClicks = viewHolderClicks; } public abstract void bindOtrClient(OtrClient otrClient, int accentColor, String userDisplayName); public abstract void recycle(); public abstract void setIsLastItem(boolean isLastItem); public interface ViewHolderClicks { void onOtrClientClick(OtrClient otrClient); void onOtrHeaderClick(); } } public static class OtrClientViewHolder extends ViewHolder implements UpdateListener { private OtrClient otrClient; private View divider; private TextView textView; private ImageView imageView; public OtrClientViewHolder(View itemView, final ViewHolderClicks viewHolderClicks) { super(itemView, viewHolderClicks); textView = ViewUtils.getView(itemView, R.id.ttv__row_otr_device); imageView = ViewUtils.getView(itemView, R.id.iv__row_otr_icon); divider = ViewUtils.getView(itemView, R.id.v__row_otr__divider); } @Override public void bindOtrClient(final OtrClient otrClient, int accentColor, String userDisplayName) { if (this.otrClient != null) { this.otrClient.removeUpdateListener(this); } this.otrClient = otrClient; if (otrClient != null) { otrClient.addUpdateListener(this); } itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (viewHolderClicks != null) { viewHolderClicks.onOtrClientClick(otrClient); } } }); updated(); } @Override public void recycle() { if (otrClient != null) { otrClient.removeUpdateListener(this); otrClient = null; } textView.setText(""); imageView.setImageDrawable(null); } @Override public void setIsLastItem(boolean isLastItem) { divider.setVisibility(isLastItem ? View.GONE : View.VISIBLE); } @Override public void updated() { String otrClientText = String.format(OTR_CLIENT_TEXT_TEMPLATE, OtrUtils.getDeviceClassName(textView.getContext(), otrClient), textView.getContext().getString(R.string.pref_devices_device_id, otrClient.getDisplayId())); CharSequence boldText = TextViewUtils.getBoldText(textView.getContext(), otrClientText.toUpperCase(Locale.getDefault())); textView.setText(boldText); if (otrClient.getVerified() == Verification.VERIFIED) { imageView.setImageResource(R.drawable.shield_full); } else { imageView.setImageResource(R.drawable.shield_half); } } } public static class OtrHeaderViewHolder extends ViewHolder { private final TextView headerTextView; private final TextView linkTextView; private String userDisplayName; public OtrHeaderViewHolder(View itemView, final ViewHolderClicks viewHolderClicks) { super(itemView, viewHolderClicks); headerTextView = ViewUtils.getView(itemView, R.id.ttv__row__otr_header); linkTextView = ViewUtils.getView(itemView, R.id.ttv__row__otr_details_link); } @Override public void bindOtrClient(OtrClient otrClient, int accentColor, String userDisplayName) { this.userDisplayName = userDisplayName; headerTextView.setText(""); linkTextView.setText( TextViewUtils.getHighlightText(linkTextView.getContext(), linkTextView.getContext().getString(R.string.otr__participant__device_header__link_text), accentColor, false)); linkTextView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { if (viewHolderClicks != null) { viewHolderClicks.onOtrHeaderClick(); } } }); } @Override public void setIsLastItem(boolean isLastItem) { if (isLastItem) { headerTextView.setText(headerTextView.getContext().getString(R.string.otr__participant__device_header__no_devices, userDisplayName)); linkTextView.setVisibility(View.GONE); } else { headerTextView.setText(headerTextView.getContext().getString(R.string.otr__participant__device_header, userDisplayName)); linkTextView.setVisibility(View.VISIBLE); } ViewUtils.setPaddingTop(linkTextView, isLastItem ? linkTextView.getContext().getResources().getDimensionPixelSize(R.dimen.wire__padding__small) : 0); } @Override public void recycle() { headerTextView.setText(""); } } }