mirror of
https://github.com/nextcloud/talk-android
synced 2025-06-21 12:39:58 +01:00
modify StatusDrawable and use it for conversationList
Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
This commit is contained in:
parent
73ce2716de
commit
1da8c3b206
@ -48,6 +48,7 @@ import com.nextcloud.talk.models.json.chat.ChatMessage;
|
|||||||
import com.nextcloud.talk.models.json.conversations.Conversation;
|
import com.nextcloud.talk.models.json.conversations.Conversation;
|
||||||
import com.nextcloud.talk.models.json.status.Status;
|
import com.nextcloud.talk.models.json.status.Status;
|
||||||
import com.nextcloud.talk.models.json.status.StatusType;
|
import com.nextcloud.talk.models.json.status.StatusType;
|
||||||
|
import com.nextcloud.talk.ui.StatusDrawable;
|
||||||
import com.nextcloud.talk.utils.ApiUtils;
|
import com.nextcloud.talk.utils.ApiUtils;
|
||||||
import com.nextcloud.talk.utils.DisplayUtils;
|
import com.nextcloud.talk.utils.DisplayUtils;
|
||||||
|
|
||||||
@ -70,6 +71,7 @@ import eu.davidea.viewholders.FlexibleViewHolder;
|
|||||||
public class ConversationItem extends AbstractFlexibleItem<ConversationItem.ConversationItemViewHolder> implements ISectionable<ConversationItem.ConversationItemViewHolder, GenericTextHeaderItem>,
|
public class ConversationItem extends AbstractFlexibleItem<ConversationItem.ConversationItemViewHolder> implements ISectionable<ConversationItem.ConversationItemViewHolder, GenericTextHeaderItem>,
|
||||||
IFilterable<String> {
|
IFilterable<String> {
|
||||||
|
|
||||||
|
private static final float STATUS_SIZE_IN_DP = 9f;
|
||||||
|
|
||||||
private Conversation conversation;
|
private Conversation conversation;
|
||||||
private UserEntity userEntity;
|
private UserEntity userEntity;
|
||||||
@ -198,23 +200,13 @@ public class ConversationItem extends AbstractFlexibleItem<ConversationItem.Conv
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!Conversation.ConversationType.ROOM_SYSTEM.equals(conversation.getType())) {
|
if (!Conversation.ConversationType.ROOM_SYSTEM.equals(conversation.getType())) {
|
||||||
if (status != null && status.getStatus().equals(StatusType.DND.getString())) {
|
float size = DisplayUtils.convertDpToPixel(STATUS_SIZE_IN_DP, appContext);
|
||||||
setOnlineStateIcon(holder, R.drawable.ic_user_status_dnd_with_border);
|
holder.userStatusImage.setImageDrawable(new StatusDrawable(
|
||||||
} else if (status != null && status.getIcon() != null && !status.getIcon().isEmpty()) {
|
status != null ? status.getStatus() : "",
|
||||||
holder.userStatusOnlineState.setVisibility(View.GONE);
|
status != null ? status.getIcon() : "",
|
||||||
holder.userStatusEmoji.setVisibility(View.VISIBLE);
|
size,
|
||||||
holder.userStatusEmoji.setText(status.getIcon());
|
context.getResources().getColor(R.color.bg_default),
|
||||||
} else if (status != null && status.getStatus().equals(StatusType.AWAY.getString())) {
|
appContext));
|
||||||
setOnlineStateIcon(holder, R.drawable.ic_user_status_away_with_border);
|
|
||||||
} else if (status != null && status.getStatus().equals(StatusType.ONLINE.getString())) {
|
|
||||||
setOnlineStateIcon(holder, R.drawable.online_status_with_border);
|
|
||||||
} else {
|
|
||||||
holder.userStatusEmoji.setVisibility(View.GONE);
|
|
||||||
holder.userStatusOnlineState.setVisibility(View.GONE);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
holder.userStatusEmoji.setVisibility(View.GONE);
|
|
||||||
holder.userStatusOnlineState.setVisibility(View.GONE);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (conversation.getLastMessage() != null) {
|
if (conversation.getLastMessage() != null) {
|
||||||
@ -314,12 +306,6 @@ public class ConversationItem extends AbstractFlexibleItem<ConversationItem.Conv
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void setOnlineStateIcon(ConversationItemViewHolder holder, int icon) {
|
|
||||||
holder.userStatusEmoji.setVisibility(View.GONE);
|
|
||||||
holder.userStatusOnlineState.setVisibility(View.VISIBLE);
|
|
||||||
holder.userStatusOnlineState.setImageDrawable(ContextCompat.getDrawable(context, icon));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean filter(String constraint) {
|
public boolean filter(String constraint) {
|
||||||
return conversation.getDisplayName() != null &&
|
return conversation.getDisplayName() != null &&
|
||||||
@ -349,11 +335,8 @@ public class ConversationItem extends AbstractFlexibleItem<ConversationItem.Conv
|
|||||||
Chip dialogUnreadBubble;
|
Chip dialogUnreadBubble;
|
||||||
@BindView(R.id.favoriteConversationImageView)
|
@BindView(R.id.favoriteConversationImageView)
|
||||||
ImageView pinnedConversationImageView;
|
ImageView pinnedConversationImageView;
|
||||||
@BindView(R.id.userStatusEmoji)
|
@BindView(R.id.user_status_image)
|
||||||
com.vanniktech.emoji.EmojiEditText userStatusEmoji;
|
ImageView userStatusImage;
|
||||||
@BindView(R.id.userStatusOnlineState)
|
|
||||||
ImageView userStatusOnlineState;
|
|
||||||
|
|
||||||
|
|
||||||
ConversationItemViewHolder(View view, FlexibleAdapter adapter) {
|
ConversationItemViewHolder(View view, FlexibleAdapter adapter) {
|
||||||
super(view, adapter);
|
super(view, adapter);
|
||||||
|
@ -43,49 +43,38 @@ public class StatusDrawable extends Drawable {
|
|||||||
private String text;
|
private String text;
|
||||||
private @DrawableRes int icon = -1;
|
private @DrawableRes int icon = -1;
|
||||||
private Paint textPaint;
|
private Paint textPaint;
|
||||||
private Paint backgroundPaint;
|
private int backgroundColor;
|
||||||
private final float radius;
|
private final float radius;
|
||||||
private Context context;
|
private Context context;
|
||||||
private final static int whiteBackground = Color.argb(200, 255, 255, 255);
|
|
||||||
private final static int onlineStatus = Color.argb(255, 73, 179, 130);
|
|
||||||
|
|
||||||
public StatusDrawable(String status, String statusIcon, float statusSize, Context context) {
|
|
||||||
backgroundPaint = new Paint();
|
|
||||||
backgroundPaint.setStyle(Paint.Style.FILL);
|
|
||||||
backgroundPaint.setAntiAlias(true);
|
|
||||||
|
|
||||||
|
public StatusDrawable(String status, String statusIcon, float statusSize, int backgroundColor, Context context) {
|
||||||
radius = statusSize;
|
radius = statusSize;
|
||||||
|
this.backgroundColor = backgroundColor;
|
||||||
|
|
||||||
if (TextUtils.isEmpty(statusIcon)) {
|
|
||||||
switch (status) {
|
if ("dnd".equals(status)) {
|
||||||
case "dnd":
|
|
||||||
icon = R.drawable.ic_user_status_dnd;
|
icon = R.drawable.ic_user_status_dnd;
|
||||||
backgroundPaint.setColor(whiteBackground);
|
|
||||||
this.context = context;
|
this.context = context;
|
||||||
break;
|
} else if (TextUtils.isEmpty(statusIcon)) {
|
||||||
|
switch (status) {
|
||||||
case "online":
|
case "online":
|
||||||
backgroundPaint.setColor(onlineStatus);
|
icon = R.drawable.online_status;
|
||||||
|
this.context = context;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case "away":
|
case "away":
|
||||||
icon = R.drawable.ic_user_status_away;
|
icon = R.drawable.ic_user_status_away;
|
||||||
backgroundPaint.setColor(whiteBackground);
|
|
||||||
this.context = context;
|
this.context = context;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
// do not show
|
// do not show
|
||||||
backgroundPaint = null;
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
text = statusIcon;
|
text = statusIcon;
|
||||||
|
|
||||||
backgroundPaint.setColor(whiteBackground);
|
|
||||||
|
|
||||||
textPaint = new Paint();
|
textPaint = new Paint();
|
||||||
textPaint.setColor(Color.WHITE);
|
|
||||||
textPaint.setTextSize(statusSize);
|
textPaint.setTextSize(statusSize);
|
||||||
textPaint.setAntiAlias(true);
|
textPaint.setAntiAlias(true);
|
||||||
textPaint.setTextAlign(Paint.Align.CENTER);
|
textPaint.setTextAlign(Paint.Align.CENTER);
|
||||||
@ -100,16 +89,20 @@ public class StatusDrawable extends Drawable {
|
|||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void draw(@NonNull Canvas canvas) {
|
public void draw(@NonNull Canvas canvas) {
|
||||||
if (backgroundPaint != null) {
|
|
||||||
canvas.drawCircle(radius, radius, radius, backgroundPaint);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (text != null) {
|
if (text != null) {
|
||||||
textPaint.setTextSize(1.6f * radius);
|
textPaint.setTextSize(1.6f * radius);
|
||||||
canvas.drawText(text, radius, radius - ((textPaint.descent() + textPaint.ascent()) / 2), textPaint);
|
canvas.drawText(text, radius, radius - ((textPaint.descent() + textPaint.ascent()) / 2), textPaint);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (icon != -1) {
|
if (icon != -1) {
|
||||||
|
|
||||||
|
Paint backgroundPaint = new Paint();
|
||||||
|
backgroundPaint.setStyle(Paint.Style.FILL);
|
||||||
|
backgroundPaint.setAntiAlias(true);
|
||||||
|
backgroundPaint.setColor(backgroundColor);
|
||||||
|
|
||||||
|
canvas.drawCircle(radius, radius, radius, backgroundPaint);
|
||||||
|
|
||||||
Drawable drawable = ResourcesCompat.getDrawable(context.getResources(), icon, null);
|
Drawable drawable = ResourcesCompat.getDrawable(context.getResources(), icon, null);
|
||||||
|
|
||||||
if (drawable != null) {
|
if (drawable != null) {
|
||||||
|
@ -313,6 +313,7 @@ public class ChooseAccountDialogFragment extends DialogFragment {
|
|||||||
status.getStatus(),
|
status.getStatus(),
|
||||||
status.getIcon(),
|
status.getIcon(),
|
||||||
size,
|
size,
|
||||||
|
getContext().getResources().getColor(R.color.dialog_background),
|
||||||
getContext()));
|
getContext()));
|
||||||
binding.currentAccount.ticker.setVisibility(View.VISIBLE);
|
binding.currentAccount.ticker.setVisibility(View.VISIBLE);
|
||||||
|
|
||||||
|
@ -84,7 +84,7 @@ private const val LAST_SECOND_OF_MINUTE = 59
|
|||||||
class SetStatusDialogFragment :
|
class SetStatusDialogFragment :
|
||||||
DialogFragment(), PredefinedStatusClickListener {
|
DialogFragment(), PredefinedStatusClickListener {
|
||||||
|
|
||||||
private val logTag = ChooseAccountDialogFragment::class.java.simpleName
|
private val logTag = SetStatusDialogFragment::class.java.simpleName
|
||||||
|
|
||||||
private lateinit var binding: DialogSetStatusBinding
|
private lateinit var binding: DialogSetStatusBinding
|
||||||
|
|
||||||
|
@ -17,7 +17,16 @@
|
|||||||
You should have received a copy of the GNU Affero General Public License
|
You should have received a copy of the GNU Affero General Public License
|
||||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
-->
|
-->
|
||||||
<shape xmlns:android="http://schemas.android.com/apk/res/android"
|
<vector xmlns:tools="http://schemas.android.com/tools"
|
||||||
android:shape="oval">
|
android:autoMirrored="true"
|
||||||
<solid android:color="#00ff00" />
|
android:height="24dp"
|
||||||
</shape>
|
android:viewportHeight="24"
|
||||||
|
android:viewportWidth="24"
|
||||||
|
android:width="24dp"
|
||||||
|
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
tools:ignore="VectorRaster">
|
||||||
|
<path
|
||||||
|
android:fillColor="#00ff00"
|
||||||
|
android:pathData="m12,2c-5.52,0 -10,4.48 -10,10s4.48,10 10,10 10,-4.48 10,-10 -4.48,-10 -10,-10z" />
|
||||||
|
</vector>
|
||||||
|
|
||||||
|
@ -107,6 +107,7 @@
|
|||||||
android:maxLines="1"
|
android:maxLines="1"
|
||||||
android:textColor="?android:attr/textColorSecondary"
|
android:textColor="?android:attr/textColorSecondary"
|
||||||
android:visibility="gone"
|
android:visibility="gone"
|
||||||
|
tools:visibility="visible"
|
||||||
tools:text="☁️ My custom status" />
|
tools:text="☁️ My custom status" />
|
||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
|
@ -55,24 +55,12 @@
|
|||||||
app:tint="@color/favorite_icon_tint"
|
app:tint="@color/favorite_icon_tint"
|
||||||
app:tintMode="src_in" />
|
app:tintMode="src_in" />
|
||||||
|
|
||||||
<com.vanniktech.emoji.EmojiEditText
|
|
||||||
android:id="@+id/userStatusEmoji"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_gravity="bottom|end"
|
|
||||||
android:background="@color/transparent"
|
|
||||||
android:cursorVisible="false"
|
|
||||||
android:gravity="center"
|
|
||||||
android:text="@string/default_emoji"
|
|
||||||
android:textSize="16sp" />
|
|
||||||
|
|
||||||
<ImageView
|
<ImageView
|
||||||
android:id="@+id/userStatusOnlineState"
|
android:id="@+id/user_status_image"
|
||||||
android:layout_width="16dp"
|
android:layout_width="18dp"
|
||||||
android:layout_height="16dp"
|
android:layout_height="18dp"
|
||||||
android:layout_gravity="bottom|end"
|
android:layout_gravity="bottom|end"
|
||||||
android:contentDescription="@null"
|
android:contentDescription="@string/nc_account_chooser_active_user" />
|
||||||
android:src="@drawable/online_status"/>
|
|
||||||
</FrameLayout>
|
</FrameLayout>
|
||||||
|
|
||||||
<RelativeLayout
|
<RelativeLayout
|
||||||
|
@ -68,4 +68,6 @@
|
|||||||
|
|
||||||
<color name="list_divider_background">#222222</color>
|
<color name="list_divider_background">#222222</color>
|
||||||
<color name="grey_200">#818181</color>
|
<color name="grey_200">#818181</color>
|
||||||
|
|
||||||
|
<color name="dialog_background">#353535</color>
|
||||||
</resources>
|
</resources>
|
||||||
|
@ -100,4 +100,8 @@
|
|||||||
<color name="list_divider_background">#eeeeee</color>
|
<color name="list_divider_background">#eeeeee</color>
|
||||||
<color name="grey_200">#EEEEEE</color>
|
<color name="grey_200">#EEEEEE</color>
|
||||||
|
|
||||||
|
<!-- this is just a helper for status icon background because getting the background color of a dialog is not
|
||||||
|
possible?! don't use this to set the background of dialogs -->
|
||||||
|
<color name="dialog_background">#FFFFFF</color>
|
||||||
|
|
||||||
</resources>
|
</resources>
|
||||||
|
Loading…
Reference in New Issue
Block a user