Commit f2791a03 authored by Tiago Cunha's avatar Tiago Cunha

Added unread mode

parent 9bc47756
...@@ -7,16 +7,14 @@ import android.widget.CompoundButton; ...@@ -7,16 +7,14 @@ import android.widget.CompoundButton;
import android.widget.ImageView; import android.widget.ImageView;
import android.widget.LinearLayout; import android.widget.LinearLayout;
import android.widget.TextView; import android.widget.TextView;
import com.jakewharton.rxbinding.view.RxView;
import com.jakewharton.rxbinding.widget.RxCompoundButton;
import chat.rocket.android.R; import chat.rocket.android.R;
import chat.rocket.android.RocketChatCache; import chat.rocket.android.RocketChatCache;
import chat.rocket.android.api.MethodCallHelper; import chat.rocket.android.api.MethodCallHelper;
import chat.rocket.android.fragment.AbstractFragment; import chat.rocket.android.fragment.AbstractFragment;
import chat.rocket.android.fragment.sidebar.dialog.AbstractAddRoomDialogFragment; import chat.rocket.android.fragment.sidebar.dialog.AbstractAddRoomDialogFragment;
import chat.rocket.android.fragment.sidebar.dialog.AddChannelDialogFragment;
import chat.rocket.android.fragment.sidebar.dialog.AddDirectMessageDialogFragment; import chat.rocket.android.fragment.sidebar.dialog.AddDirectMessageDialogFragment;
import chat.rocket.android.fragment.sidebar.dialog.AddChannelDialogFragment;
import chat.rocket.android.helper.LogcatIfError; import chat.rocket.android.helper.LogcatIfError;
import chat.rocket.android.helper.TextUtils; import chat.rocket.android.helper.TextUtils;
import chat.rocket.android.layouthelper.chatroom.RoomListManager; import chat.rocket.android.layouthelper.chatroom.RoomListManager;
...@@ -29,6 +27,9 @@ import chat.rocket.android.realm_helper.RealmObjectObserver; ...@@ -29,6 +27,9 @@ import chat.rocket.android.realm_helper.RealmObjectObserver;
import chat.rocket.android.realm_helper.RealmStore; import chat.rocket.android.realm_helper.RealmStore;
import chat.rocket.android.renderer.UserRenderer; import chat.rocket.android.renderer.UserRenderer;
import com.jakewharton.rxbinding.view.RxView;
import com.jakewharton.rxbinding.widget.RxCompoundButton;
public class SidebarMainFragment extends AbstractFragment { public class SidebarMainFragment extends AbstractFragment {
private String serverConfigId; private String serverConfigId;
...@@ -75,7 +76,7 @@ public class SidebarMainFragment extends AbstractFragment { ...@@ -75,7 +76,7 @@ public class SidebarMainFragment extends AbstractFragment {
currentUserObserver = realmHelper currentUserObserver = realmHelper
.createObjectObserver(User::queryCurrentUser) .createObjectObserver(User::queryCurrentUser)
.setOnUpdateListener(this::onRenderCurrentUser); .setOnUpdateListener(this::onCurrentUser);
methodCallHelper = new MethodCallHelper(getContext(), serverConfigId); methodCallHelper = new MethodCallHelper(getContext(), serverConfigId);
} }
...@@ -103,6 +104,8 @@ public class SidebarMainFragment extends AbstractFragment { ...@@ -103,6 +104,8 @@ public class SidebarMainFragment extends AbstractFragment {
setupAddChannelButton(); setupAddChannelButton();
roomListManager = new RoomListManager( roomListManager = new RoomListManager(
rootView.findViewById(R.id.unread_title),
(LinearLayout) rootView.findViewById(R.id.unread_container),
(LinearLayout) rootView.findViewById(R.id.channels_container), (LinearLayout) rootView.findViewById(R.id.channels_container),
(LinearLayout) rootView.findViewById(R.id.direct_messages_container)); (LinearLayout) rootView.findViewById(R.id.direct_messages_container));
roomListManager.setOnItemClickListener(view -> { roomListManager.setOnItemClickListener(view -> {
...@@ -142,6 +145,11 @@ public class SidebarMainFragment extends AbstractFragment { ...@@ -142,6 +145,11 @@ public class SidebarMainFragment extends AbstractFragment {
} }
} }
private void onCurrentUser(User user) {
onRenderCurrentUser(user);
updateRoomListMode(user);
}
private void onRenderCurrentUser(User user) { private void onRenderCurrentUser(User user) {
if (user != null && !TextUtils.isEmpty(hostname)) { if (user != null && !TextUtils.isEmpty(hostname)) {
new UserRenderer(getContext(), user) new UserRenderer(getContext(), user)
...@@ -151,6 +159,13 @@ public class SidebarMainFragment extends AbstractFragment { ...@@ -151,6 +159,13 @@ public class SidebarMainFragment extends AbstractFragment {
} }
} }
private void updateRoomListMode(User user) {
if (user == null || user.getSettings() == null || user.getSettings().getPreferences() == null) {
return;
}
roomListManager.setUnreadRoomMode(user.getSettings().getPreferences().isUnreadRoomsMode());
}
private void setupLogoutButton() { private void setupLogoutButton() {
rootView.findViewById(R.id.btn_logout).setOnClickListener(view -> { rootView.findViewById(R.id.btn_logout).setOnClickListener(view -> {
if (methodCallHelper != null) { if (methodCallHelper != null) {
......
...@@ -3,61 +3,60 @@ package chat.rocket.android.layouthelper.chatroom; ...@@ -3,61 +3,60 @@ package chat.rocket.android.layouthelper.chatroom;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import java.util.List;
import chat.rocket.android.helper.TextUtils; import chat.rocket.android.helper.TextUtils;
import chat.rocket.android.model.ddp.RoomSubscription; import chat.rocket.android.model.ddp.RoomSubscription;
import chat.rocket.android.widget.internal.RoomListItemView; import chat.rocket.android.widget.internal.RoomListItemView;
import java.util.List;
/** /**
* Utility class for mapping Room list into channel list ViewGroup. * Utility class for mapping Room list into channel list ViewGroup.
*/ */
public class RoomListManager { public class RoomListManager {
private View unreadTitle;
private ViewGroup unreadRoomsContainer;
private ViewGroup channelsContainer; private ViewGroup channelsContainer;
private ViewGroup dmContainer; private ViewGroup dmContainer;
private boolean unreadRoomMode = false;
private List<RoomSubscription> roomSubscriptionList;
/**
* Callback interface for List item clicked.
*/
public interface OnItemClickListener {
void onItemClick(RoomListItemView roomListItemView);
}
private OnItemClickListener listener; private OnItemClickListener listener;
/**
* constructor with three ViewGroups.
*/
public RoomListManager(View unreadTitle, ViewGroup unreadRoomsContainer,
ViewGroup channelsContainer, ViewGroup dmContainer) {
this(unreadTitle, unreadRoomsContainer, channelsContainer, dmContainer, false);
}
/** /**
* constructor with two ViewGroups. * constructor with two ViewGroups.
*/ */
public RoomListManager(ViewGroup channelsContainer, ViewGroup dmContainer) { public RoomListManager(View unreadTitle, ViewGroup unreadRoomsContainer,
ViewGroup channelsContainer, ViewGroup dmContainer,
boolean unreadRoomMode) {
this.unreadTitle = unreadTitle;
this.unreadRoomsContainer = unreadRoomsContainer;
this.channelsContainer = channelsContainer; this.channelsContainer = channelsContainer;
this.dmContainer = dmContainer; this.dmContainer = dmContainer;
} this.unreadRoomMode = unreadRoomMode;
private static void removeItemIfExists(ViewGroup parent, String roomName) {
for (int i = 0; i < parent.getChildCount(); i++) {
RoomListItemView roomListItemView = (RoomListItemView) parent.getChildAt(i);
if (roomName.equals(roomListItemView.getRoomName())) {
parent.removeViewAt(i);
break;
}
}
} }
/** /**
* update ViewGroups with room list. * update ViewGroups with room list.
*/ */
public void setRooms(List<RoomSubscription> roomSubscriptionList) { public void setRooms(List<RoomSubscription> roomSubscriptionList) {
removeDeletedItem(channelsContainer, roomSubscriptionList); this.roomSubscriptionList = roomSubscriptionList;
removeDeletedItem(dmContainer, roomSubscriptionList); updateRoomsList();
for (RoomSubscription roomSubscription : roomSubscriptionList) {
String name = roomSubscription.getName();
if (TextUtils.isEmpty(name)) {
continue;
}
String type = roomSubscription.getType();
if (RoomSubscription.TYPE_CHANNEL.equals(type)
|| RoomSubscription.TYPE_PRIVATE.equals(type)) {
insertOrUpdateItem(channelsContainer, roomSubscription);
removeItemIfExists(dmContainer, name);
} else if (RoomSubscription.TYPE_DIRECT_MESSAGE.equals(type)) {
removeItemIfExists(channelsContainer, name);
insertOrUpdateItem(dmContainer, roomSubscription);
}
}
} }
/** /**
...@@ -86,6 +85,11 @@ public class RoomListManager { ...@@ -86,6 +85,11 @@ public class RoomListManager {
} }
} }
public void setUnreadRoomMode(boolean unreadRoomMode) {
this.unreadRoomMode = unreadRoomMode;
updateRoomsList();
}
private void insertOrUpdateItem(ViewGroup parent, RoomSubscription roomSubscription) { private void insertOrUpdateItem(ViewGroup parent, RoomSubscription roomSubscription) {
final String roomName = roomSubscription.getName(); final String roomName = roomSubscription.getName();
...@@ -129,10 +133,47 @@ public class RoomListManager { ...@@ -129,10 +133,47 @@ public class RoomListManager {
} }
} }
/** private void updateRoomsList() {
* Callback interface for List item clicked. removeDeletedItem(unreadRoomsContainer, roomSubscriptionList);
*/ removeDeletedItem(channelsContainer, roomSubscriptionList);
public interface OnItemClickListener { removeDeletedItem(dmContainer, roomSubscriptionList);
void onItemClick(RoomListItemView roomListItemView);
for (RoomSubscription roomSubscription : roomSubscriptionList) {
String name = roomSubscription.getName();
if (TextUtils.isEmpty(name)) {
continue;
}
String type = roomSubscription.getType();
if (unreadRoomMode && roomSubscription.getUnread() > 0) {
insertOrUpdateItem(unreadRoomsContainer, roomSubscription);
removeItemIfExists(channelsContainer, name);
removeItemIfExists(dmContainer, name);
} else if (RoomSubscription.TYPE_CHANNEL.equals(type)
|| RoomSubscription.TYPE_PRIVATE.equals(type)) {
removeItemIfExists(unreadRoomsContainer, name);
insertOrUpdateItem(channelsContainer, roomSubscription);
removeItemIfExists(dmContainer, name);
} else if (RoomSubscription.TYPE_DIRECT_MESSAGE.equals(type)) {
removeItemIfExists(unreadRoomsContainer, name);
removeItemIfExists(channelsContainer, name);
insertOrUpdateItem(dmContainer, roomSubscription);
}
}
boolean showUnread = unreadRoomMode && unreadRoomsContainer.getChildCount() != 0;
unreadTitle.setVisibility(showUnread ? View.VISIBLE : View.GONE);
unreadRoomsContainer.setVisibility(showUnread ? View.VISIBLE : View.GONE);
}
private static void removeItemIfExists(ViewGroup parent, String roomName) {
for (int i = 0; i < parent.getChildCount(); i++) {
RoomListItemView roomListItemView = (RoomListItemView) parent.getChildAt(i);
if (roomName.equals(roomListItemView.getRoomName())) {
parent.removeViewAt(i);
break;
}
}
} }
} }
...@@ -22,6 +22,7 @@ public class User extends RealmObject { ...@@ -22,6 +22,7 @@ public class User extends RealmObject {
private String status; private String status;
private double utcOffset; private double utcOffset;
private RealmList<Email> emails; private RealmList<Email> emails;
private Settings settings;
public static RealmQuery<User> queryCurrentUser(Realm realm) { public static RealmQuery<User> queryCurrentUser(Realm realm) {
return realm.where(User.class).isNotEmpty("emails"); return realm.where(User.class).isNotEmpty("emails");
...@@ -66,4 +67,8 @@ public class User extends RealmObject { ...@@ -66,4 +67,8 @@ public class User extends RealmObject {
public void setEmails(RealmList<Email> emails) { public void setEmails(RealmList<Email> emails) {
this.emails = emails; this.emails = emails;
} }
public Settings getSettings() {
return settings;
}
} }
...@@ -140,7 +140,7 @@ public class RocketChatWebSocketThread extends HandlerThread { ...@@ -140,7 +140,7 @@ public class RocketChatWebSocketThread extends HandlerThread {
* synchronize the state of the thread with ServerConfig. * synchronize the state of the thread with ServerConfig.
*/ */
@DebugLog @DebugLog
public void keepalive() { public void keepAlive() {
if (ddpClient == null || !ddpClient.isConnected()) { if (ddpClient == null || !ddpClient.isConnected()) {
defaultRealm.executeTransaction(realm -> { defaultRealm.executeTransaction(realm -> {
ServerConfig config = realm.where(ServerConfig.class) ServerConfig config = realm.where(ServerConfig.class)
...@@ -242,9 +242,9 @@ public class RocketChatWebSocketThread extends HandlerThread { ...@@ -242,9 +242,9 @@ public class RocketChatWebSocketThread extends HandlerThread {
Object obj = ctor.newInstance(appContext, hostname, serverConfigRealm, ddpClient); Object obj = ctor.newInstance(appContext, hostname, serverConfigRealm, ddpClient);
if (obj instanceof Registrable) { if (obj instanceof Registrable) {
Registrable registerable = (Registrable) obj; Registrable registrable = (Registrable) obj;
registerable.register(); registrable.register();
listeners.add(registerable); listeners.add(registrable);
} }
} catch (Exception exception) { } catch (Exception exception) {
RCLog.w(exception, "Failed to register listeners!!"); RCLog.w(exception, "Failed to register listeners!!");
...@@ -260,8 +260,8 @@ public class RocketChatWebSocketThread extends HandlerThread { ...@@ -260,8 +260,8 @@ public class RocketChatWebSocketThread extends HandlerThread {
Iterator<Registrable> iterator = listeners.iterator(); Iterator<Registrable> iterator = listeners.iterator();
while (iterator.hasNext()) { while (iterator.hasNext()) {
Registrable registerable = iterator.next(); Registrable registrable = iterator.next();
registerable.unregister(); registrable.unregister();
iterator.remove(); iterator.remove();
} }
if (ddpClient != null) { if (ddpClient != null) {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment