Skip to content

Commit

Permalink
feat ✨: display online status of friends
Browse files Browse the repository at this point in the history
  • Loading branch information
SDIDSA committed Jul 21, 2023
1 parent bc62995 commit b4ce3b5
Show file tree
Hide file tree
Showing 17 changed files with 169 additions and 36 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ public BasicApiGet(String path, Param... params) {

public void execute(ObjectConsumer<JSONObject> onResult, String token) throws IOException, ParseException, JSONException {
try {
String uri = new URIBuilder().setPath(path).addParameters(Arrays.stream(params).map(param -> new BasicNameValuePair(param.getKey(), param.getValue())).collect(Collectors.toList())).build().toString().substring(1);
String uri = new URIBuilder().setPath(path).addParameters(Arrays.stream(params).map(param -> new BasicNameValuePair(param.getKey(), param.stringValue())).collect(Collectors.toList())).build().toString().substring(1);
HttpGet httpGet = new HttpGet(uri);
httpGet.addHeader("Accept", "application/json");

Expand Down
19 changes: 6 additions & 13 deletions app/src/main/java/org/luke/diminou/abs/api/json/Param.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,32 +2,25 @@

import androidx.annotation.NonNull;

import org.apache.hc.core5.http.NameValuePair;
import org.apache.hc.core5.http.message.BasicNameValuePair;

public class Param {
private String key;
private String value;
private final String key;
private final Object value;

public Param(String key, String value) {
public Param(String key, Object value) {
this.key = key;
this.value = value;
}

public Param(String key, int value) {
this(key, Integer.toString(value));
}

public String getKey() {
return key;
}

public String getValue() {
public Object getValue() {
return value;
}

public NameValuePair norm() {
return new BasicNameValuePair(key, value);
public String stringValue() {
return String.valueOf(value);
}

@NonNull
Expand Down
2 changes: 1 addition & 1 deletion app/src/main/java/org/luke/diminou/app/Diminou.java
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ protected void postCreate() {
int userId = result.getInt("user");
User.getForId(userId, user -> {
putUser(user);
SessionManager.registerSocket(getMainSocket(), token, String.valueOf(user.getId()));
SessionManager.registerSocket(getMainSocket(), token, user.getId());
loadPage(Home.class);
});
} else {
Expand Down
59 changes: 52 additions & 7 deletions app/src/main/java/org/luke/diminou/app/avatar/AvatarDisplay.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,16 @@
import android.graphics.drawable.GradientDrawable;

import org.luke.diminou.abs.components.controls.image.ImageProxy;
import org.luke.diminou.abs.components.controls.shape.Rectangle;
import org.luke.diminou.abs.components.layout.StackPane;

import android.view.Gravity;
import android.widget.FrameLayout;
import android.widget.LinearLayout;


import androidx.annotation.ColorInt;

import org.luke.diminou.abs.App;
import org.luke.diminou.abs.components.controls.image.Image;
import org.luke.diminou.abs.style.Style;
Expand All @@ -19,14 +25,18 @@
public class AvatarDisplay extends StackPane implements Styleable {
private final App owner;
private final GradientDrawable background;
private final GradientDrawable foreground;

private final Image img;
private final GradientDrawable onlineBack;
private final FrameLayout preOnline;
private final Rectangle online;

public static final int preSize = 64;

private final ChangeListener<String> onUrl;

private final ChangeListener<Boolean> onOnline;

private User old;

public AvatarDisplay(App owner, float sizeDp) {
Expand All @@ -37,21 +47,44 @@ public AvatarDisplay(App owner, float sizeDp) {
setLayoutParams(new LinearLayout.LayoutParams(size, size));

background = new GradientDrawable();
foreground = new GradientDrawable();

int radii = ViewUtils.dipToPx(7, owner);
background.setCornerRadius(radii);
foreground.setCornerRadius(radii);
setBackground(background);
setForeground(foreground);

img = new Image(owner);
img.setSize(sizeDp);
img.setCornerRadius(7);
ViewUtils.setPaddingUnified(img, 1, owner);
img.setCornerRadius(10);

onUrl = (obs, ov, nv) -> ImageProxy.getImage(nv, img::setImageBitmap);
float preOnlineSizeDp = sizeDp / 3f;
int preOnlineSizePx = ViewUtils.dipToPx(preOnlineSizeDp, owner);
float strokeWidthDp = preOnlineSizeDp / 4f;
float onlineSizeDp = preOnlineSizeDp - 2 * strokeWidthDp;

onlineBack = new GradientDrawable();
onlineBack.setCornerRadius(preOnlineSizePx);

preOnline = new FrameLayout(owner);
preOnline.setBackground(onlineBack);
preOnline.setLayoutParams(new LayoutParams(preOnlineSizePx, preOnlineSizePx));
ViewUtils.alignInFrame(preOnline, Gravity.BOTTOM | Gravity.END);
int by = ViewUtils.dipToPx(strokeWidthDp - 1, owner);
preOnline.setTranslationY(by);
preOnline.setTranslationX(by);

online = new Rectangle(owner);
online.setRadius(onlineSizeDp);
online.setSize(onlineSizeDp, onlineSizeDp);
ViewUtils.alignInFrame(online, Gravity.CENTER);

preOnline.addView(online);

addView(img);
addView(preOnline);

onUrl = (obs, ov, nv) -> ImageProxy.getImage(nv, img::setImageBitmap);
onOnline = (obs, ov, nv) -> applyStyle(owner.getStyle());

applyStyle(owner.getStyle());
}
Expand All @@ -74,20 +107,32 @@ public void setValue(Avatar value) {
public void setUser(User user) {
if(old != null) {
old.avatarProperty().removeListener(onUrl);
old.onlineProperty().removeListener(onOnline);
}

old = user;
user.avatarProperty().addListener(onUrl);
user.onlineProperty().addListener(onOnline);
}

public void setValue(String val) {
setValue(Avatar.valueOf(val));
}

public void setOnlineBackground(@ColorInt int color) {
onlineBack.setColor(color);
}

@Override
public void applyStyle(Style style) {
boolean isOnline = (old != null && old.isOnline());
int borderColor = isOnline ? style.getTextPositive() : style.getTextMuted();
preOnline.setVisibility(isOnline ? VISIBLE : INVISIBLE);

background.setColor(style.getBackgroundPrimary());
foreground.setStroke(ViewUtils.dipToPx(1, owner), style.getTextMuted());
background.setStroke(ViewUtils.dipToPx(1, owner), borderColor);
online.setFill(style.getTextPositive());
onlineBack.setStroke(ViewUtils.dipToPx(1, owner), borderColor);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,9 @@
import org.luke.diminou.abs.components.controls.scratches.Orientation;
import org.luke.diminou.abs.components.layout.linear.HBox;
import org.luke.diminou.abs.components.layout.linear.VBox;
import org.luke.diminou.abs.utils.ErrorHandler;
import org.luke.diminou.abs.utils.ViewUtils;
import org.luke.diminou.abs.utils.functional.ObjectConsumer;
import org.luke.diminou.app.cards.offline.OfflineDisplayCards;
import org.luke.diminou.app.cards.offline.OfflinePlayerCard;

Expand Down Expand Up @@ -57,4 +59,14 @@ public void unbind() {
card.unbind();
}
}

public void forEach(ObjectConsumer<PlayerCard> o) {
for(PlayerCard card : cards) {
try {
o.accept(card);
} catch (Exception e) {
ErrorHandler.handle(e, "running cards foreach");
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -129,7 +129,7 @@ public PlayerCard(App owner, boolean host, int index) {
}else {
preAvatar.removeAllViews();
preAvatar.addView(avatarDisplay, 0);
if(host) {
if(host || (boundTo != null && boundTo.host)) {
if (nv.isSelf()) remove.setImageResource(R.drawable.owner);
else remove.setImageResource(R.drawable.close);
preAvatar.addView(remove);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package org.luke.diminou.app.pages.home.online;

import android.util.Log;
import android.widget.LinearLayout;

import androidx.core.graphics.Insets;
Expand Down Expand Up @@ -33,6 +34,7 @@
import org.luke.diminou.data.property.Property;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;

public class Home extends Page {
Expand Down Expand Up @@ -108,6 +110,11 @@ private void registerSocket() {
User user = owner.getUser();
registeredListeners.forEach(owner.getMainSocket()::off);
registeredListeners.clear();

owner.getMainSocket().onAnyIncoming(e -> {
Log.i("received" ,Arrays.toString(e));
});

addSocketEventHandler("user_sync", obj -> {
for (Iterator<String> it = obj.keys(); it.hasNext(); ) {
String key = it.next();
Expand All @@ -118,7 +125,8 @@ private void registerSocket() {
User.getForId(obj.getInt("user_id"), u -> {
for (Iterator<String> it = obj.keys(); it.hasNext(); ) {
String key = it.next();
u.set(key, obj.get(key));
if(!key.equals("user_id"))
u.set(key, obj.get(key));
}
}));
addSocketEventHandler("request_sent", obj -> {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -130,6 +130,7 @@ private UserDisplay(App owner, int userId) {
public void applyStyle(Style style) {
root.setBackground(style.getBackgroundTertiary());
root.setBorderColor(style.getTextMuted());
img.setOnlineBackground(style.getBackgroundTertiary());
setBackground(style.getTextMuted());
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -188,6 +188,7 @@ public void setup(User user) {
public void applyStyle(Style style) {
newUn.setBackgroundColor(style.getBackgroundTertiary());
newUn.setBorderColor(Color.TRANSPARENT);
pfp.setOnlineBackground(style.getBackgroundPrimary());
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
import org.luke.diminou.abs.utils.ErrorHandler;
import org.luke.diminou.abs.utils.Platform;
import org.luke.diminou.abs.utils.Store;
import org.luke.diminou.abs.utils.ViewUtils;
import org.luke.diminou.app.avatar.Avatar;
import org.luke.diminou.app.cards.offline.OfflineDisplayCards;
import org.luke.diminou.app.cards.offline.OfflineMirorredCards;
Expand Down Expand Up @@ -154,7 +155,7 @@ public void setup() {
offlineMirorredCards.bind(cards);

start.setAlpha(0);
start.setTranslationY(40);
start.setTranslationY(ViewUtils.by(owner));
start.setScaleX(.7f);
start.setScaleY(.7f);

Expand Down
59 changes: 55 additions & 4 deletions app/src/main/java/org/luke/diminou/app/pages/host/online/Host.java
Original file line number Diff line number Diff line change
@@ -1,8 +1,21 @@
package org.luke.diminou.app.pages.host.online;

import android.widget.LinearLayout;

import org.luke.diminou.R;
import org.luke.diminou.abs.App;
import org.luke.diminou.abs.animation.base.Animation;
import org.luke.diminou.abs.animation.combine.ParallelAnimation;
import org.luke.diminou.abs.animation.easing.Interpolator;
import org.luke.diminou.abs.animation.view.AlphaAnimation;
import org.luke.diminou.abs.animation.view.position.TranslateYAnimation;
import org.luke.diminou.abs.animation.view.scale.ScaleXYAnimation;
import org.luke.diminou.abs.api.Session;
import org.luke.diminou.abs.components.controls.button.Button;
import org.luke.diminou.abs.components.controls.button.PrimaryButton;
import org.luke.diminou.abs.components.controls.text.font.Font;
import org.luke.diminou.abs.utils.Platform;
import org.luke.diminou.abs.utils.ViewUtils;
import org.luke.diminou.app.cards.online.DisplayCards;
import org.luke.diminou.app.cards.online.MirorredCards;
import org.luke.diminou.app.pages.Titled;
Expand All @@ -15,7 +28,8 @@ public class Host extends Titled {
private final RoomId idDisp;

private final DisplayCards cards;
private final MirorredCards mirorredCards;

private final Animation showStart, hideStart;

private String roomId;

Expand All @@ -27,35 +41,72 @@ public Host(App owner) {
idDisp = new RoomId(owner);

cards = new DisplayCards(owner, true);
mirorredCards = new MirorredCards(owner);
cards.setLayoutParams(new LayoutParams(0, 0));
MirorredCards mirorredCards = new MirorredCards(owner);

mirorredCards.bind(cards);

invite = new Invite(owner);

cards.forEach(card -> {
mirorredCards.forEach(card -> {
card.setOnClickListener(v -> {
if(!card.isLoaded()) {
invite.show();
}
});
});

Button start = new PrimaryButton(owner, "start_game");
start.setLayoutParams(new LinearLayout.LayoutParams(-1, -2));
start.setFont(new Font(18));

content.addView(idDisp);
content.addView(cards);
content.addView(mirorredCards);
content.addView(start);

start.setAlpha(0);
start.setTranslationY(ViewUtils.by(owner));
start.setScaleX(.7f);
start.setScaleY(.7f);

hideStart = new ParallelAnimation(300)
.addAnimation(new TranslateYAnimation(start, 40))
.addAnimation(new AlphaAnimation(start, 0))
.addAnimation(new ScaleXYAnimation(start, .7f))
.setInterpolator(Interpolator.EASE_OUT);

showStart = new ParallelAnimation(300)
.addAnimation(new TranslateYAnimation(start, 0))
.addAnimation(new AlphaAnimation(start, 1))
.addAnimation(new ScaleXYAnimation(start, 1))
.setInterpolator(Interpolator.OVERSHOOT);
}

public String getRoomId() {
return roomId;
}

public void joined(int id) {
User.getForId(id, user -> cards.getLast().loadPlayer(user));
User.getForId(id, user -> {
owner.playMenuSound(R.raw.joined);
cards.getLast().loadPlayer(user);
checkCount();
});
}

public void left(int id) {
owner.playMenuSound(R.raw.left);
cards.unloadPlayer(id);
checkCount();
}

private void checkCount() {
if(cards.size() > 1) {
showStart.start();
}else {
hideStart.start();
}
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ public void setUser(User user) {
public void applyStyle(Style style) {
setBackground(style.getBackgroundPrimary());
setBorderColor(style.getTextMuted());
avatar.setBackground(style.getBackgroundPrimary());
}

@Override
Expand Down
Loading

0 comments on commit b4ce3b5

Please sign in to comment.