Commit 606498f3 authored by Tiago Cunha's avatar Tiago Cunha

Initial changes

Next: RoomFragment
parent c582b8cb
......@@ -93,7 +93,7 @@ dependencies {
compile project(':log-wrapper')
compile project(':android-ddp')
compile project(':rocket-chat-android-widgets')
compile project(':realm-helpers')
compile project(':persistence-realm')
compile rootProject.ext.supportAppCompat
compile rootProject.ext.supportDesign
......@@ -127,6 +127,9 @@ dependencies {
compile 'com.github.hotchemi:permissionsdispatcher:2.3.0'
annotationProcessor 'com.github.hotchemi:permissionsdispatcher-processor:2.3.0'
provided "com.google.auto.value:auto-value:1.3"
annotationProcessor "com.google.auto.value:auto-value:1.3"
}
apply plugin: 'com.google.gms.google-services'
......@@ -8,7 +8,7 @@ import io.realm.RealmConfiguration;
import java.util.List;
import chat.rocket.android.helper.OkHttpHelper;
import chat.rocket.android.realm_helper.RealmStore;
import chat.rocket.persistence.realm.RealmStore;
import chat.rocket.android.service.ConnectivityManager;
import chat.rocket.android.service.ServerInfo;
import chat.rocket.android.widget.RocketChatWidgets;
......
......@@ -11,7 +11,7 @@ import chat.rocket.android.RocketChatCache;
import chat.rocket.android.model.ddp.RoomSubscription;
import chat.rocket.android.push.PushConstants;
import chat.rocket.android.push.PushNotificationHandler;
import chat.rocket.android.realm_helper.RealmStore;
import chat.rocket.persistence.realm.RealmStore;
import chat.rocket.android.service.ConnectivityManager;
import chat.rocket.android.service.ServerInfo;
import icepick.State;
......
......@@ -10,8 +10,8 @@ import chat.rocket.android.fragment.server_config.LoginFragment;
import chat.rocket.android.fragment.server_config.RetryLoginFragment;
import chat.rocket.android.helper.TextUtils;
import chat.rocket.android.model.internal.Session;
import chat.rocket.android.realm_helper.RealmObjectObserver;
import chat.rocket.android.realm_helper.RealmStore;
import chat.rocket.persistence.realm.RealmObjectObserver;
import chat.rocket.persistence.realm.RealmStore;
import chat.rocket.android.service.ConnectivityManager;
/**
......
......@@ -18,12 +18,12 @@ import chat.rocket.android.fragment.sidebar.SidebarMainFragment;
import chat.rocket.android.helper.LogcatIfError;
import chat.rocket.android.helper.TextUtils;
import chat.rocket.android.model.ddp.RoomSubscription;
import chat.rocket.android.model.ddp.User;
import chat.rocket.android.model.ddp.RealmUser;
import chat.rocket.android.model.internal.Session;
import chat.rocket.android.realm_helper.RealmHelper;
import chat.rocket.android.realm_helper.RealmListObserver;
import chat.rocket.android.realm_helper.RealmObjectObserver;
import chat.rocket.android.realm_helper.RealmStore;
import chat.rocket.persistence.realm.RealmHelper;
import chat.rocket.persistence.realm.RealmListObserver;
import chat.rocket.persistence.realm.RealmObjectObserver;
import chat.rocket.persistence.realm.RealmStore;
import chat.rocket.android.service.ConnectivityManager;
import chat.rocket.android.widget.RoomToolbar;
import hugo.weaving.DebugLog;
......@@ -87,14 +87,14 @@ public class MainActivity extends AbstractAuthedActivity {
private void setUserOnlineIfServerAvailable() {
if (hostname != null) {
new MethodCallHelper(this, hostname).setUserPresence(User.STATUS_ONLINE)
new MethodCallHelper(this, hostname).setUserPresence(RealmUser.STATUS_ONLINE)
.continueWith(new LogcatIfError());
}
}
private void setUserAwayIfServerAvailable() {
if (hostname != null) {
new MethodCallHelper(this, hostname).setUserPresence(User.STATUS_AWAY)
new MethodCallHelper(this, hostname).setUserPresence(RealmUser.STATUS_AWAY)
.continueWith(new LogcatIfError());
}
}
......
......@@ -6,7 +6,7 @@ import org.json.JSONObject;
import bolts.Task;
import chat.rocket.android.helper.TextUtils;
import chat.rocket.android.realm_helper.RealmHelper;
import chat.rocket.persistence.realm.RealmHelper;
import chat.rocket.android.service.DDPClientRef;
/**
......
......@@ -12,13 +12,13 @@ import bolts.Task;
import chat.rocket.android.helper.CheckSum;
import chat.rocket.android.helper.TextUtils;
import chat.rocket.android.model.SyncState;
import chat.rocket.android.model.ddp.Message;
import chat.rocket.android.model.ddp.RealmMessage;
import chat.rocket.android.model.ddp.PublicSetting;
import chat.rocket.android.model.ddp.RoomSubscription;
import chat.rocket.android.model.internal.MethodCall;
import chat.rocket.android.model.internal.Session;
import chat.rocket.android.realm_helper.RealmHelper;
import chat.rocket.android.realm_helper.RealmStore;
import chat.rocket.persistence.realm.RealmHelper;
import chat.rocket.persistence.realm.RealmStore;
import chat.rocket.android.service.DDPClientRef;
import chat.rocket.android_ddp.DDPClientCallback;
import hugo.weaving.DebugLog;
......@@ -107,7 +107,7 @@ public class MethodCallHelper {
}
/**
* Register User.
* Register RealmUser.
*/
public Task<String> registerUser(final String name, final String email,
final String password, final String confirmPassword) {
......@@ -241,18 +241,18 @@ public class MethodCallHelper {
JSONObject result = task.getResult();
final JSONArray messages = result.getJSONArray("messages");
for (int i = 0; i < messages.length(); i++) {
Message.customizeJson(messages.getJSONObject(i));
RealmMessage.customizeJson(messages.getJSONObject(i));
}
return realmHelper.executeTransaction(realm -> {
if (timestamp == 0) {
realm.where(Message.class)
realm.where(RealmMessage.class)
.equalTo("rid", roomId)
.equalTo("syncstate", SyncState.SYNCED)
.findAll().deleteAllFromRealm();
}
if (messages.length() > 0) {
realm.createOrUpdateAllFromJson(Message.class, messages);
realm.createOrUpdateAllFromJson(RealmMessage.class, messages);
}
return null;
}).onSuccessTask(_task -> Task.forResult(messages));
......
......@@ -7,7 +7,7 @@ import org.json.JSONArray;
import org.json.JSONObject;
import bolts.Task;
import chat.rocket.android.realm_helper.RealmHelper;
import chat.rocket.persistence.realm.RealmHelper;
import chat.rocket.android.service.DDPClientRef;
public class RaixPushHelper extends MethodCallHelper {
......
......@@ -3,10 +3,10 @@ package chat.rocket.android.api.rest;
import android.content.Context;
import chat.rocket.android.RocketChatCache;
import chat.rocket.android.model.ddp.User;
import chat.rocket.android.model.ddp.RealmUser;
import chat.rocket.android.model.internal.Session;
import chat.rocket.android.realm_helper.RealmHelper;
import chat.rocket.android.realm_helper.RealmStore;
import chat.rocket.persistence.realm.RealmHelper;
import chat.rocket.persistence.realm.RealmStore;
public class DefaultCookieProvider implements CookieProvider {
......@@ -33,8 +33,8 @@ public class DefaultCookieProvider implements CookieProvider {
return "";
}
final User user = realmHelper.executeTransactionForRead(realm ->
User.queryCurrentUser(realm).findFirst());
final RealmUser user = realmHelper.executeTransactionForRead(realm ->
RealmUser.queryCurrentUser(realm).findFirst());
final Session session = realmHelper.executeTransactionForRead(realm ->
Session.queryDefaultSession(realm).findFirst());
......
......@@ -104,6 +104,4 @@ public abstract class AbstractWebViewFragment extends AbstractFragment
protected boolean onHandleCallback(WebView webview, String url) {
return false;
}
;
}
package chat.rocket.android.fragment.add_server;
import android.support.annotation.NonNull;
public interface InputHostnameContract {
interface View {
void showLoader();
void hideLoader();
void showInvalidServerError();
void showConnectionError();
void showHome();
}
interface Presenter {
void bindView(@NonNull View view);
void release();
void connectTo(String hostname);
}
}
package chat.rocket.android.fragment.add_server;
import android.content.Context;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.design.widget.Snackbar;
import android.view.View;
import android.widget.TextView;
import chat.rocket.android.BuildConfig;
import chat.rocket.android.LaunchUtil;
import chat.rocket.android.R;
import chat.rocket.android.RocketChatCache;
import chat.rocket.android.api.rest.DefaultServerPolicyApi;
import chat.rocket.android.api.rest.ServerPolicyApi;
import chat.rocket.android.fragment.AbstractFragment;
import chat.rocket.android.helper.OkHttpHelper;
import chat.rocket.android.helper.ServerPolicyApiValidationHelper;
import chat.rocket.android.helper.ServerPolicyHelper;
import chat.rocket.android.helper.TextUtils;
import chat.rocket.android.service.ConnectivityManager;
import chat.rocket.android.service.ConnectivityManagerApi;
import rx.Subscription;
import rx.android.schedulers.AndroidSchedulers;
import rx.schedulers.Schedulers;
/**
* Input server host.
*/
public class InputHostnameFragment extends AbstractFragment {
Subscription serverPolicySubscription;
public class InputHostnameFragment extends AbstractFragment implements InputHostnameContract.View {
private InputHostnameContract.Presenter presenter;
public InputHostnameFragment() {
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
final Context appContext = getContext().getApplicationContext();
presenter = new InputHostnamePresenter(
RocketChatCache.get(appContext),
ConnectivityManager.getInstance(appContext));
}
@Override
protected int getLayout() {
return R.layout.fragment_input_hostname;
......@@ -47,42 +54,18 @@ public class InputHostnameFragment extends AbstractFragment {
}
private void handleConnect() {
final String hostname = ServerPolicyHelper.enforceHostname(getHostname());
final ServerPolicyApi serverPolicyApi =
new DefaultServerPolicyApi(OkHttpHelper.getClientForUploadFile(), hostname);
final ServerPolicyApiValidationHelper validationHelper =
new ServerPolicyApiValidationHelper(serverPolicyApi);
if (serverPolicySubscription != null) {
serverPolicySubscription.unsubscribe();
}
rootView.findViewById(R.id.btn_connect).setEnabled(false);
presenter.connectTo(getHostname());
}
serverPolicySubscription = ServerPolicyHelper.isApiVersionValid(validationHelper)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.doOnTerminate(() -> rootView.findViewById(R.id.btn_connect).setEnabled(true))
.subscribe(
serverValidation -> {
if (serverValidation.isValid()) {
onServerValid(hostname, serverValidation.usesSecureConnection());
} else {
showError(getString(R.string.input_hostname_invalid_server_message));
}
},
throwable -> {
showError(getString(R.string.connection_error_try_later));
});
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
presenter.bindView(this);
}
@Override
public void onDestroyView() {
if (serverPolicySubscription != null) {
serverPolicySubscription.unsubscribe();
}
presenter.release();
super.onDestroyView();
}
......@@ -92,21 +75,33 @@ public class InputHostnameFragment extends AbstractFragment {
return TextUtils.or(TextUtils.or(editor.getText(), editor.getHint()), "").toString();
}
private void onServerValid(final String hostname, boolean usesSecureConnection) {
RocketChatCache.get(getContext()).edit()
.putString(RocketChatCache.KEY_SELECTED_SERVER_HOSTNAME, hostname)
.apply();
private void showError(String errString) {
Snackbar.make(rootView, errString, Snackbar.LENGTH_LONG).show();
}
ConnectivityManagerApi connectivityManager =
ConnectivityManager.getInstance(getContext().getApplicationContext());
connectivityManager.addOrUpdateServer(hostname, hostname, !usesSecureConnection);
connectivityManager.keepAliveServer();
@Override
public void showLoader() {
rootView.findViewById(R.id.btn_connect).setEnabled(false);
}
LaunchUtil.showMainActivity(getContext());
getActivity().overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);
@Override
public void hideLoader() {
rootView.findViewById(R.id.btn_connect).setEnabled(true);
}
private void showError(String errString) {
Snackbar.make(rootView, errString, Snackbar.LENGTH_LONG).show();
@Override
public void showInvalidServerError() {
showError(getString(R.string.input_hostname_invalid_server_message));
}
@Override
public void showConnectionError() {
showError(getString(R.string.connection_error_try_later));
}
@Override
public void showHome() {
LaunchUtil.showMainActivity(getContext());
getActivity().overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);
}
}
package chat.rocket.android.fragment.add_server;
import android.content.SharedPreferences;
import android.support.annotation.NonNull;
import chat.rocket.android.RocketChatCache;
import chat.rocket.android.api.rest.DefaultServerPolicyApi;
import chat.rocket.android.api.rest.ServerPolicyApi;
import chat.rocket.android.helper.OkHttpHelper;
import chat.rocket.android.helper.ServerPolicyApiValidationHelper;
import chat.rocket.android.helper.ServerPolicyHelper;
import chat.rocket.android.service.ConnectivityManagerApi;
import rx.Subscription;
import rx.android.schedulers.AndroidSchedulers;
import rx.schedulers.Schedulers;
public class InputHostnamePresenter implements InputHostnameContract.Presenter {
private final SharedPreferences rocketChatCache;
private final ConnectivityManagerApi connectivityManager;
public InputHostnamePresenter(SharedPreferences rocketChatCache,
ConnectivityManagerApi connectivityManager) {
this.rocketChatCache = rocketChatCache;
this.connectivityManager = connectivityManager;
}
private InputHostnameContract.View view;
private Subscription serverPolicySubscription;
@Override
public void bindView(@NonNull InputHostnameContract.View view) {
this.view = view;
}
@Override
public void release() {
if (serverPolicySubscription != null) {
serverPolicySubscription.unsubscribe();
}
view = null;
}
@Override
public void connectTo(final String hostname) {
view.showLoader();
connectToEnforced(ServerPolicyHelper.enforceHostname(hostname));
}
public void connectToEnforced(final String hostname) {
final ServerPolicyApi serverPolicyApi =
new DefaultServerPolicyApi(OkHttpHelper.getClientForUploadFile(), hostname);
final ServerPolicyApiValidationHelper validationHelper =
new ServerPolicyApiValidationHelper(serverPolicyApi);
if (serverPolicySubscription != null) {
serverPolicySubscription.unsubscribe();
}
serverPolicySubscription = ServerPolicyHelper.isApiVersionValid(validationHelper)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.doOnTerminate(() -> view.hideLoader())
.subscribe(
serverValidation -> {
if (serverValidation.isValid()) {
onServerValid(hostname, serverValidation.usesSecureConnection());
} else {
view.showInvalidServerError();
}
},
throwable -> {
view.showConnectionError();
});
}
private void onServerValid(final String hostname, boolean usesSecureConnection) {
rocketChatCache.edit()
.putString(RocketChatCache.KEY_SELECTED_SERVER_HOSTNAME, hostname)
.apply();
connectivityManager.addOrUpdateServer(hostname, hostname, !usesSecureConnection);
connectivityManager.keepAliveServer();
view.showHome();
}
}
......@@ -51,15 +51,15 @@ import chat.rocket.android.layouthelper.extra_action.upload.ImageUploadActionIte
import chat.rocket.android.layouthelper.extra_action.upload.VideoUploadActionItem;
import chat.rocket.android.log.RCLog;
import chat.rocket.android.model.SyncState;
import chat.rocket.android.model.ddp.Message;
import chat.rocket.android.model.ddp.RealmMessage;
import chat.rocket.android.model.ddp.RoomSubscription;
import chat.rocket.android.model.ddp.User;
import chat.rocket.android.model.ddp.RealmUser;
import chat.rocket.android.model.internal.LoadMessageProcedure;
import chat.rocket.android.model.internal.Session;
import chat.rocket.android.realm_helper.RealmHelper;
import chat.rocket.android.realm_helper.RealmModelListAdapter;
import chat.rocket.android.realm_helper.RealmObjectObserver;
import chat.rocket.android.realm_helper.RealmStore;
import chat.rocket.persistence.realm.RealmHelper;
import chat.rocket.persistence.realm.RealmModelListAdapter;
import chat.rocket.persistence.realm.RealmObjectObserver;
import chat.rocket.persistence.realm.RealmStore;
import chat.rocket.android.service.ConnectivityManager;
import chat.rocket.android.widget.internal.ExtraActionPickerDialogFragment;
import chat.rocket.android.widget.message.MessageFormLayout;
......@@ -75,6 +75,8 @@ public class RoomFragment extends AbstractChatRoomFragment
RealmModelListAdapter.OnItemClickListener<PairedMessage> {
private static final int DIALOG_ID = 1;
private static final String HOSTNAME = "hostname";
private static final String ROOM_ID = "roomId";
private String hostname;
private RealmHelper realmHelper;
......@@ -96,8 +98,8 @@ public class RoomFragment extends AbstractChatRoomFragment
}
public static boolean canCreate(RealmHelper realmHelper) {
User currentUser = realmHelper.executeTransactionForRead(realm ->
User.queryCurrentUser(realm).findFirst());
RealmUser currentUser = realmHelper.executeTransactionForRead(realm ->
RealmUser.queryCurrentUser(realm).findFirst());
Session session = realmHelper.executeTransactionForRead(realm ->
Session.queryDefaultSession(realm).findFirst());
return currentUser != null && session != null;
......@@ -108,8 +110,8 @@ public class RoomFragment extends AbstractChatRoomFragment
*/
public static RoomFragment create(String hostname, String roomId) {
Bundle args = new Bundle();
args.putString("hostname", hostname);
args.putString("roomId", roomId);
args.putString(HOSTNAME, hostname);
args.putString(ROOM_ID, roomId);
RoomFragment fragment = new RoomFragment();
fragment.setArguments(args);
return fragment;
......@@ -120,11 +122,11 @@ public class RoomFragment extends AbstractChatRoomFragment
super.onCreate(savedInstanceState);
Bundle args = getArguments();
hostname = args.getString("hostname");
hostname = args.getString(HOSTNAME);
realmHelper = RealmStore.get(hostname);
roomId = args.getString("roomId");
roomId = args.getString(ROOM_ID);
userId = realmHelper.executeTransactionForRead(realm ->
User.queryCurrentUser(realm).findFirst()).getId();
RealmUser.queryCurrentUser(realm).findFirst()).getId();
token = realmHelper.executeTransactionForRead(realm ->
Session.queryDefaultSession(realm).findFirst()).getToken();
roomObserver = realmHelper
......@@ -151,9 +153,9 @@ public class RoomFragment extends AbstractChatRoomFragment
protected void onSetupView() {
RecyclerView listView = (RecyclerView) rootView.findViewById(R.id.recyclerview);
MessageListAdapter adapter = (MessageListAdapter) realmHelper.createListAdapter(getContext(),
realm -> realm.where(Message.class)
.equalTo(Message.ROOM_ID, roomId)
.findAllSorted(Message.TIMESTAMP, Sort.DESCENDING),
realm -> realm.where(RealmMessage.class)
.equalTo(RealmMessage.ROOM_ID, roomId)
.findAllSorted(RealmMessage.TIMESTAMP, Sort.DESCENDING),
context -> new MessageListAdapter(context, hostname, userId, token)
);
listView.setAdapter(adapter);
......@@ -233,10 +235,10 @@ public class RoomFragment extends AbstractChatRoomFragment
realm.where(RoomSubscription.class).equalTo(RoomSubscription.ROOM_ID, roomId).findFirst());
if (room != null) {
return realmHelper.executeTransactionForReadResults(realm ->
realm.where(Message.class)
.equalTo(Message.ROOM_ID, roomId)
.greaterThanOrEqualTo(Message.TIMESTAMP, room.getLastSeen())
.notEqualTo(Message.USER_ID, userId)
realm.where(RealmMessage.class)
.equalTo(RealmMessage.ROOM_ID, roomId)
.greaterThanOrEqualTo(RealmMessage.TIMESTAMP, room.getLastSeen())
.notEqualTo(RealmMessage.USER_ID, userId)
.findAll()).size();
} else {
return 0;
......@@ -259,16 +261,16 @@ public class RoomFragment extends AbstractChatRoomFragment
new AlertDialog.Builder(getContext())
.setPositiveButton(R.string.resend, (dialog, which) -> {
realmHelper.executeTransaction(realm ->
realm.createOrUpdateObjectFromJson(Message.class, new JSONObject()
.put(Message.ID, messageId)
.put(Message.SYNC_STATE, SyncState.NOT_SYNCED))
realm.createOrUpdateObjectFromJson(RealmMessage.class, new JSONObject()
.put(RealmMessage.ID, messageId)
.put(RealmMessage.SYNC_STATE, SyncState.NOT_SYNCED))
).continueWith(new LogcatIfError());
})
.setNegativeButton(android.R.string.cancel, null)
.setNeutralButton(R.string.discard, (dialog, which) -> {
realmHelper.executeTransaction(realm ->
realm.where(Message.class)
.equalTo(Message.ID, messageId).findAll().deleteAllFromRealm()
realm.where(RealmMessage.class)
.equalTo(RealmMessage.ID, messageId).findAll().deleteAllFromRealm()
).continueWith(new LogcatIfError());
})
.show();
......@@ -524,14 +526,14 @@ public class RoomFragment extends AbstractChatRoomFragment
private Task<Void> sendMessage(String messageText) {
return realmHelper.executeTransaction(realm ->
realm.createOrUpdateObjectFromJson(Message.class, new JSONObject()
.put(Message.ID, UUID.randomUUID().toString())
.put(Message.SYNC_STATE, SyncState.NOT_SYNCED)
.put(Message.TIMESTAMP, System.currentTimeMillis())
.put(Message.ROOM_ID, roomId)
.put(Message.USER, new JSONObject()
.put(User.ID, userId))
.put(Message.MESSAGE, messageText)))
realm.createOrUpdateObjectFromJson(RealmMessage.class, new JSONObject()
.put(RealmMessage.ID, UUID.randomUUID().toString())
.put(RealmMessage.SYNC_STATE, SyncState.NOT_SYNCED)
.put(RealmMessage.TIMESTAMP, System.currentTimeMillis())
.put(RealmMessage.ROOM_ID, roomId)
.put(RealmMessage.USER, new JSONObject()
.put(RealmUser.ID, userId))
.put(RealmMessage.MESSAGE, messageText)))
.onSuccess(_task -> {
scrollToLatestMessage();
return null;
......
......@@ -7,8 +7,8 @@ import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.design.widget.BottomSheetDialogFragment;
import chat.rocket.android.realm_helper.RealmHelper;
import chat.rocket.android.realm_helper.RealmStore;
import chat.rocket.persistence.realm.RealmHelper;
import chat.rocket.persistence.realm.RealmStore;
abstract class AbstractChatRoomDialogFragment extends BottomSheetDialogFragment {
......
......@@ -11,7 +11,7 @@ import android.widget.Toast;
import chat.rocket.android.R;
import chat.rocket.android.model.SyncState;
import chat.rocket.android.model.internal.FileUploading;
import chat.rocket.android.realm_helper.RealmObjectObserver;
import chat.rocket.persistence.realm.RealmObjectObserver;
import chat.rocket.android.renderer.FileUploadingRenderer;
/**
......
......@@ -19,7 +19,7 @@ import chat.rocket.android.layouthelper.chatroom.dialog.RoomUserAdapter;
import chat.rocket.android.log.RCLog;
import chat.rocket.android.model.SyncState;
import chat.rocket.android.model.internal.GetUsersOfRoomsProcedure;
import chat.rocket.android.realm_helper.RealmObjectObserver;
import chat.rocket.persistence.realm.RealmObjectObserver;
import chat.rocket.android.service.ConnectivityManager;
/**
......
......@@ -15,7 +15,7 @@ import chat.rocket.android.fragment.AbstractWebViewFragment;
import chat.rocket.android.helper.LogcatIfError;
import chat.rocket.android.log.RCLog;
import chat.rocket.android.model.ddp.MeteorLoginServiceConfiguration;
import chat.rocket.android.realm_helper.RealmStore;
import chat.rocket.persistence.realm.RealmStore;
public abstract class AbstractOAuthFragment extends AbstractWebViewFragment {
......
......@@ -15,8 +15,8 @@ import chat.rocket.android.helper.TextUtils;
import chat.rocket.android.layouthelper.oauth.OAuthProviderInfo;
import chat.rocket.android.log.RCLog;
import chat.rocket.android.model.ddp.MeteorLoginServiceConfiguration;
import chat.rocket.android.realm_helper.RealmListObserver;
import chat.rocket.android.realm_helper.RealmStore;
import chat.rocket.persistence.realm.RealmListObserver;
import chat.rocket.persistence.realm.RealmStore;
/**
* Login screen.
......
......@@ -9,8 +9,8 @@ import chat.rocket.android.R;
import chat.rocket.android.api.MethodCallHelper;
import chat.rocket.android.helper.TextUtils;
import chat.rocket.android.model.internal.Session;
import chat.rocket.android.realm_helper.RealmObjectObserver;
import chat.rocket.android.realm_helper.RealmStore;
import chat.rocket.persistence.realm.RealmObjectObserver;
import chat.rocket.persistence.realm.RealmStore;
/**
* Login screen.
......
package chat.rocket.android.fragment.sidebar;
import android.support.annotation.NonNull;
import java.util.List;
import chat.rocket.android.model.core.Room;
import chat.rocket.android.model.core.User;
public interface SidebarMainContract {
interface View {
void showScreen();
void showEmptyScreen();
void showRoomList(List<Room> roomList);
void showUser(User user);
}
interface Presenter {
void bindView(@NonNull View view);
void release();
void onUserOnline();
void onUserAway();
void onUserBusy();
void onUserOffline();
void onLogout();
}
}
......@@ -3,6 +3,7 @@ package chat.rocket.android.fragment.sidebar;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.DialogFragment;
import android.view.View;
import android.widget.CompoundButton;
import android.widget.ImageView;
import android.widget.LinearLayout;
......@@ -10,6 +11,7 @@ import android.widget.TextView;
import com.jakewharton.rxbinding.view.RxView;
import com.jakewharton.rxbinding.widget.RxCompoundButton;
import java.util.List;
import chat.rocket.android.BuildConfig;
import chat.rocket.android.R;
import chat.rocket.android.RocketChatCache;
......@@ -18,25 +20,25 @@ import chat.rocket.android.fragment.AbstractFragment;
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.helper.LogcatIfError;
import chat.rocket.android.helper.TextUtils;
import chat.rocket.android.layouthelper.chatroom.RoomListManager;
import chat.rocket.android.model.ddp.RoomSubscription;
import chat.rocket.android.model.ddp.User;
import chat.rocket.android.realm_helper.RealmHelper;
import chat.rocket.android.realm_helper.RealmListObserver;
import chat.rocket.android.realm_helper.RealmObjectObserver;
import chat.rocket.android.realm_helper.RealmStore;
import chat.rocket.android.model.core.Room;
import chat.rocket.android.model.core.User;
import chat.rocket.android.renderer.UserRenderer;
import chat.rocket.android.repositories.RealmRoomRepository;
import chat.rocket.android.repositories.RealmUserRepository;
import chat.rocket.android.widget.RocketChatAvatar;
import chat.rocket.persistence.realm.RealmStore;
public class SidebarMainFragment extends AbstractFragment {
public class SidebarMainFragment extends AbstractFragment implements SidebarMainContract.View {
private static final String HOSTNAME = "hostname";
private SidebarMainContract.Presenter presenter;
private String hostname;
private RoomListManager roomListManager;
private RealmListObserver<RoomSubscription> roomsObserver;
private RealmObjectObserver<User> currentUserObserver;
private MethodCallHelper methodCallHelper;
private String hostname;
public SidebarMainFragment() {
}
......@@ -46,10 +48,11 @@ public class SidebarMainFragment extends AbstractFragment {
*/
public static SidebarMainFragment create(String hostname) {
Bundle args = new Bundle();
args.putString("hostname", hostname);
args.putString(HOSTNAME, hostname);
SidebarMainFragment fragment = new SidebarMainFragment();
fragment.setArguments(args);
return fragment;
}
......@@ -58,40 +61,35 @@ public class SidebarMainFragment extends AbstractFragment {
super.onCreate(savedInstanceState);
Bundle args = getArguments();
hostname = args == null ? null : args.getString("hostname");
if (!TextUtils.isEmpty(hostname)) {
RealmHelper realmHelper = RealmStore.get(hostname);
if (realmHelper != null) {
roomsObserver = realmHelper
.createListObserver(
realm -> realm.where(RoomSubscription.class).equalTo(RoomSubscription.OPEN, true)
.findAll())
.setOnUpdateListener(list -> roomListManager.setRooms(list));
currentUserObserver = realmHelper
.createObjectObserver(User::queryCurrentUser)
.setOnUpdateListener(this::onCurrentUser);
methodCallHelper = new MethodCallHelper(getContext(), hostname);
}
}
hostname = args == null ? null : args.getString(HOSTNAME);
presenter = new SidebarMainPresenter(
hostname,
new RealmRoomRepository(RealmStore.getRealm(hostname)),
new RealmUserRepository(RealmStore.getRealm(hostname)),
TextUtils.isEmpty(hostname) ? null : new MethodCallHelper(getContext(), hostname)
);
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
presenter.bindView(this);
}
@Override
public void onDestroyView() {
presenter.release();
super.onDestroyView();
}
@Override
protected int getLayout() {
if (hostname == null) {
return R.layout.simple_screen;
} else {
return R.layout.fragment_sidebar_main;
}
return R.layout.fragment_sidebar_main;
}
@Override
protected void onSetupView() {
if (hostname == null) {
return;
}
setupUserActionToggle();
setupUserStatusButtons();
setupLogoutButton();
......@@ -123,26 +121,22 @@ public class SidebarMainFragment extends AbstractFragment {
}
private void setupUserStatusButtons() {
rootView.findViewById(R.id.btn_status_online).setOnClickListener(view ->
updateCurrentUserStatus(User.STATUS_ONLINE));
rootView.findViewById(R.id.btn_status_away).setOnClickListener(view ->
updateCurrentUserStatus(User.STATUS_AWAY));
rootView.findViewById(R.id.btn_status_busy).setOnClickListener(view ->
updateCurrentUserStatus(User.STATUS_BUSY));
rootView.findViewById(R.id.btn_status_invisible).setOnClickListener(view ->
updateCurrentUserStatus(User.STATUS_OFFLINE));
}
private void updateCurrentUserStatus(String status) {
if (methodCallHelper != null) {
methodCallHelper.setUserStatus(status).continueWith(new LogcatIfError());
rootView.findViewById(R.id.btn_status_online).setOnClickListener(view -> {
presenter.onUserOnline();
closeUserActionContainer();
}
}
private void onCurrentUser(User user) {
onRenderCurrentUser(user);
updateRoomListMode(user);
});
rootView.findViewById(R.id.btn_status_away).setOnClickListener(view -> {
presenter.onUserAway();
closeUserActionContainer();
});
rootView.findViewById(R.id.btn_status_busy).setOnClickListener(view -> {
presenter.onUserBusy();
closeUserActionContainer();
});
rootView.findViewById(R.id.btn_status_invisible).setOnClickListener(view -> {
presenter.onUserOffline();
closeUserActionContainer();
});
}
private void onRenderCurrentUser(User user) {
......@@ -163,10 +157,8 @@ public class SidebarMainFragment extends AbstractFragment {
private void setupLogoutButton() {
rootView.findViewById(R.id.btn_logout).setOnClickListener(view -> {
if (methodCallHelper != null) {
methodCallHelper.logout().continueWith(new LogcatIfError());
closeUserActionContainer();
}
presenter.onLogout();
closeUserActionContainer();
});
}
......@@ -198,20 +190,23 @@ public class SidebarMainFragment extends AbstractFragment {
}
@Override
public void onResume() {
super.onResume();
if (roomsObserver != null) {
roomsObserver.sub();
currentUserObserver.sub();
}
public void showScreen() {
rootView.setVisibility(View.VISIBLE);
}
@Override
public void onPause() {
if (roomsObserver != null) {
currentUserObserver.unsub();
roomsObserver.unsub();
}
super.onPause();
public void showEmptyScreen() {
rootView.setVisibility(View.INVISIBLE);
}
@Override
public void showRoomList(List<Room> roomList) {
roomListManager.setRooms(roomList);
}
@Override
public void showUser(User user) {
onRenderCurrentUser(user);
updateRoomListMode(user);
}
}
package chat.rocket.android.fragment.sidebar;
import android.support.annotation.NonNull;
import chat.rocket.android.api.MethodCallHelper;
import chat.rocket.android.helper.LogcatIfError;
import chat.rocket.android.helper.TextUtils;
import chat.rocket.android.model.core.User;
import chat.rocket.android.repositories.RoomRepository;
import chat.rocket.android.repositories.UserRepository;
import rx.Subscription;
import rx.subscriptions.CompositeSubscription;
public class SidebarMainPresenter implements SidebarMainContract.Presenter {
private final String hostname;
private final RoomRepository roomRepository;
private final UserRepository userRepository;
private final MethodCallHelper methodCallHelper;
private SidebarMainContract.View view;
private CompositeSubscription compositeSubscription = new CompositeSubscription();
public SidebarMainPresenter(String hostname, RoomRepository roomRepository,
UserRepository userRepository, MethodCallHelper methodCallHelper) {
this.hostname = hostname;
this.roomRepository = roomRepository;
this.userRepository = userRepository;
this.methodCallHelper = methodCallHelper;
}
@Override
public void bindView(@NonNull SidebarMainContract.View view) {
this.view = view;
if (TextUtils.isEmpty(hostname)) {
view.showEmptyScreen();
return;
}
view.showScreen();
subscribeToRooms();
subscribeToUser();
}
@Override
public void release() {
compositeSubscription.unsubscribe();
view = null;
}
@Override
public void onUserOnline() {
updateCurrentUserStatus(User.STATUS_ONLINE);
}
@Override
public void onUserAway() {
updateCurrentUserStatus(User.STATUS_AWAY);
}
@Override
public void onUserBusy() {
updateCurrentUserStatus(User.STATUS_BUSY);
}
@Override
public void onUserOffline() {
updateCurrentUserStatus(User.STATUS_OFFLINE);
}
@Override
public void onLogout() {
if (methodCallHelper != null) {
methodCallHelper.logout().continueWith(new LogcatIfError());
}
}
private void subscribeToRooms() {
final Subscription subscription = roomRepository.getOpenRooms()
.distinctUntilChanged()
.subscribe(
rooms -> view.showRoomList(rooms)
);
compositeSubscription.add(subscription);
}
private void subscribeToUser() {
final Subscription subscription = userRepository.getCurrentUser()
.distinctUntilChanged()
.subscribe(user -> view.showUser(user));
compositeSubscription.add(subscription);
}
private void updateCurrentUserStatus(String status) {
if (methodCallHelper != null) {
methodCallHelper.setUserStatus(status).continueWith(new LogcatIfError());
}
}
}
......@@ -12,8 +12,8 @@ import com.trello.rxlifecycle.components.support.RxAppCompatDialogFragment;
import bolts.Task;
import chat.rocket.android.R;
import chat.rocket.android.api.MethodCallHelper;
import chat.rocket.android.realm_helper.RealmHelper;
import chat.rocket.android.realm_helper.RealmStore;
import chat.rocket.persistence.realm.RealmHelper;
import chat.rocket.persistence.realm.RealmStore;
public abstract class AbstractAddRoomDialogFragment extends RxAppCompatDialogFragment {
......
......@@ -12,11 +12,11 @@ import bolts.Task;
import chat.rocket.android.R;
import chat.rocket.android.helper.TextUtils;
import chat.rocket.android.layouthelper.sidebar.dialog.SuggestUserAdapter;
import chat.rocket.android.model.ddp.User;
import chat.rocket.android.realm_helper.RealmAutoCompleteAdapter;
import chat.rocket.android.model.ddp.RealmUser;
import chat.rocket.persistence.realm.RealmAutoCompleteAdapter;
/**
* add Direct Message.
* add Direct RealmMessage.
*/
public class AddDirectMessageDialogFragment extends AbstractAddRoomDialogFragment {
public static AddDirectMessageDialogFragment create(String hostname) {
......@@ -39,10 +39,10 @@ public class AddDirectMessageDialogFragment extends AbstractAddRoomDialogFragmen
AutoCompleteTextView autoCompleteTextView =
(AutoCompleteTextView) getDialog().findViewById(R.id.editor_username);
RealmAutoCompleteAdapter<User> adapter = realmHelper.createAutoCompleteAdapter(getContext(),
(realm, text) -> realm.where(User.class)
.contains(User.USERNAME, text, Case.INSENSITIVE)
.findAllSorted(User.USERNAME),
RealmAutoCompleteAdapter<RealmUser> adapter = realmHelper.createAutoCompleteAdapter(getContext(),
(realm, text) -> realm.where(RealmUser.class)
.contains(RealmUser.USERNAME, text, Case.INSENSITIVE)
.findAllSorted(RealmUser.USERNAME),
context -> new SuggestUserAdapter(context, hostname));
autoCompleteTextView.setAdapter(adapter);
......
......@@ -17,7 +17,7 @@ import chat.rocket.android.log.RCLog;
import chat.rocket.android.model.SyncState;
import chat.rocket.android.model.ddp.PublicSetting;
import chat.rocket.android.model.internal.FileUploading;
import chat.rocket.android.realm_helper.RealmHelper;
import chat.rocket.persistence.realm.RealmHelper;
/**
* utility class for uploading file.
......
......@@ -5,8 +5,8 @@ import android.support.annotation.LayoutRes;
import android.support.v7.util.ListUpdateCallback;
import io.realm.RealmObject;
import chat.rocket.android.realm_helper.RealmModelListAdapter;
import chat.rocket.android.realm_helper.RealmModelViewHolder;
import chat.rocket.persistence.realm.RealmModelListAdapter;
import chat.rocket.persistence.realm.RealmModelViewHolder;
@SuppressWarnings({"PMD.AbstractNaming", "PMD.GenericsNaming"})
/**
......
......@@ -8,7 +8,7 @@ import chat.rocket.android.R;
import chat.rocket.android.helper.DateTime;
import chat.rocket.android.helper.TextUtils;
import chat.rocket.android.model.SyncState;
import chat.rocket.android.realm_helper.RealmModelViewHolder;
import chat.rocket.persistence.realm.RealmModelViewHolder;
import chat.rocket.android.widget.RocketChatAvatar;
public abstract class AbstractMessageViewHolder extends RealmModelViewHolder<PairedMessage> {
......
......@@ -10,13 +10,13 @@ import java.util.List;
import chat.rocket.android.R;
import chat.rocket.android.helper.TextUtils;
import chat.rocket.android.layouthelper.ExtRealmModelListAdapter;
import chat.rocket.android.model.ddp.Message;
import chat.rocket.android.model.ddp.RealmMessage;
/**
* target list adapter for chat room.
*/
public class MessageListAdapter
extends ExtRealmModelListAdapter<Message, PairedMessage, AbstractMessageViewHolder> {
extends ExtRealmModelListAdapter<RealmMessage, PairedMessage, AbstractMessageViewHolder> {
private static final int VIEW_TYPE_UNKNOWN = 0;
private static final int VIEW_TYPE_NORMAL_MESSAGE = 1;
......@@ -99,7 +99,7 @@ public class MessageListAdapter
}
@Override
protected List<PairedMessage> mapResultsToViewModel(List<Message> results) {
protected List<PairedMessage> mapResultsToViewModel(List<RealmMessage> results) {
if (results.isEmpty()) {
return Collections.emptyList();
}
......
......@@ -3,7 +3,7 @@ package chat.rocket.android.layouthelper.chatroom;
import android.content.Context;
import chat.rocket.android.R;
import chat.rocket.android.model.ddp.Message;
import chat.rocket.android.model.ddp.RealmMessage;
/**
* message type.
......@@ -11,46 +11,46 @@ import chat.rocket.android.model.ddp.Message;
public enum MessageType {
ROOM_NAME_CHANGED("r") {
@Override
public String getString(Context context, Message message) {
public String getString(Context context, RealmMessage message) {
return context.getString(R.string.message_room_name_changed,
message.getMessage(), getUsername(message));
}
},
USER_ADDED("au") {
@Override
public String getString(Context context, Message message) {
public String getString(Context context, RealmMessage message) {
return context.getString(R.string.message_user_added_by,
message.getMessage(), getUsername(message));
}
},
USER_REMOVED("ru") {
@Override
public String getString(Context context, Message message) {
public String getString(Context context, RealmMessage message) {
return context.getString(R.string.message_user_removed_by,
message.getMessage(), getUsername(message));
}
},
USER_JOINED("uj") {
@Override
public String getString(Context context, Message message) {
public String getString(Context context, RealmMessage message) {
return context.getString(R.string.message_user_joined_channel);
}
},
USER_LEFT("ul") {
@Override
public String getString(Context context, Message message) {
public String getString(Context context, RealmMessage message) {
return context.getString(R.string.message_user_left);
}
},
WELCOME("wm") {
@Override
public String getString(Context context, Message message) {
public String getString(Context context, RealmMessage message) {
return context.getString(R.string.message_welcome, getUsername(message));
}
},
MESSAGE_REMOVED("rm") {
@Override
public String getString(Context context, Message message) {
public String getString(Context context, RealmMessage message) {
return context.getString(R.string.message_removed);
}
},
......@@ -74,11 +74,11 @@ public enum MessageType {
return UNSPECIFIED;
}
public String getString(Context context, Message message) {
public String getString(Context context, RealmMessage message) {
return "";
}
private static String getUsername(Message message) {
private static String getUsername(RealmMessage message) {
if (message != null && message.getUser() != null) {
return message.getUser().getUsername();
} else {
......
package chat.rocket.android.layouthelper.chatroom;
import chat.rocket.android.helper.DateTime;
import chat.rocket.android.model.ddp.Message;
import chat.rocket.android.model.ddp.RealmMessage;
/**
* ViewData Model for messages in chatroom.
*/
public class PairedMessage {
public final Message target;
final Message nextSibling;
public final RealmMessage target;
final RealmMessage nextSibling;
public PairedMessage(Message target, Message nextSibling) {
public PairedMessage(RealmMessage target, RealmMessage nextSibling) {
this.target = target;
this.nextSibling = nextSibling;
}
......
......@@ -4,7 +4,7 @@ import android.view.View;
import android.view.ViewGroup;
import chat.rocket.android.helper.TextUtils;
import chat.rocket.android.model.ddp.RoomSubscription;
import chat.rocket.android.model.core.Room;
import chat.rocket.android.widget.internal.RoomListItemView;
import java.util.List;
......@@ -19,7 +19,7 @@ public class RoomListManager {
private boolean unreadRoomMode = false;
private List<RoomSubscription> roomSubscriptionList;
private List<Room> roomList;
/**
* Callback interface for List item clicked.
......@@ -54,8 +54,8 @@ public class RoomListManager {
/**
* update ViewGroups with room list.
*/
public void setRooms(List<RoomSubscription> roomSubscriptionList) {
this.roomSubscriptionList = roomSubscriptionList;
public void setRooms(List<Room> roomList) {
this.roomList = roomList;
updateRoomsList();
}
......@@ -66,14 +66,14 @@ public class RoomListManager {
this.listener = listener;
}
private void removeDeletedItem(ViewGroup parent, List<RoomSubscription> roomSubscriptionList) {
private void removeDeletedItem(ViewGroup parent, List<Room> roomList) {
for (int index = parent.getChildCount() - 1; index >= 0; index--) {
RoomListItemView roomListItemView = (RoomListItemView) parent.getChildAt(index);
final String targetRoomName = roomListItemView.getRoomName();
if (!TextUtils.isEmpty(targetRoomName)) {
boolean found = false;
for (RoomSubscription roomSubscription : roomSubscriptionList) {
if (targetRoomName.equals(roomSubscription.getName())) {
for (Room room : roomList) {
if (targetRoomName.equals(room.getName())) {
found = true;
break;
}
......@@ -90,15 +90,15 @@ public class RoomListManager {
updateRoomsList();
}
private void insertOrUpdateItem(ViewGroup parent, RoomSubscription roomSubscription) {
final String roomName = roomSubscription.getName();
private void insertOrUpdateItem(ViewGroup parent, Room room) {
final String roomName = room.getName();
int index;
for (index = 0; index < parent.getChildCount(); index++) {
RoomListItemView roomListItemView = (RoomListItemView) parent.getChildAt(index);
final String targetRoomName = roomListItemView.getRoomName();
if (roomName.equals(targetRoomName)) {
updateRoomItemView(roomListItemView, roomSubscription);
updateRoomItemView(roomListItemView, room);
return;
}
if (roomName.compareToIgnoreCase(targetRoomName) < 0) {
......@@ -107,7 +107,7 @@ public class RoomListManager {
}
RoomListItemView roomListItemView = new RoomListItemView(parent.getContext());
updateRoomItemView(roomListItemView, roomSubscription);
updateRoomItemView(roomListItemView, room);
if (index == parent.getChildCount()) {
parent.addView(roomListItemView);
} else {
......@@ -116,13 +116,13 @@ public class RoomListManager {
}
private void updateRoomItemView(RoomListItemView roomListItemView,
RoomSubscription roomSubscription) {
Room room) {
roomListItemView
.setRoomId(roomSubscription.getRoomId())
.setRoomName(roomSubscription.getName())
.setRoomType(roomSubscription.getType())
.setAlert(roomSubscription.isAlert())
.setUnreadCount(roomSubscription.getUnread());
.setRoomId(room.getRoomId())
.setRoomName(room.getName())
.setRoomType(room.getType())
.setAlert(room.isAlert())
.setUnreadCount(room.getUnread());
roomListItemView.setOnClickListener(this::onItemClick);
}
......@@ -134,31 +134,35 @@ public class RoomListManager {
}
private void updateRoomsList() {
removeDeletedItem(unreadRoomsContainer, roomSubscriptionList);
removeDeletedItem(channelsContainer, roomSubscriptionList);
removeDeletedItem(dmContainer, roomSubscriptionList);
if (roomList == null) {
return;
}
removeDeletedItem(unreadRoomsContainer, roomList);
removeDeletedItem(channelsContainer, roomList);
removeDeletedItem(dmContainer, roomList);
for (RoomSubscription roomSubscription : roomSubscriptionList) {
String name = roomSubscription.getName();
for (Room room : roomList) {
String name = room.getName();
if (TextUtils.isEmpty(name)) {
continue;
}
String type = roomSubscription.getType();
String type = room.getType();
if (unreadRoomMode && roomSubscription.isAlert()) {
insertOrUpdateItem(unreadRoomsContainer, roomSubscription);
if (unreadRoomMode && room.isAlert()) {
insertOrUpdateItem(unreadRoomsContainer, room);
removeItemIfExists(channelsContainer, name);
removeItemIfExists(dmContainer, name);
} else if (RoomSubscription.TYPE_CHANNEL.equals(type)
|| RoomSubscription.TYPE_PRIVATE.equals(type)) {
} else if (Room.TYPE_CHANNEL.equals(type)
|| Room.TYPE_PRIVATE.equals(type)) {
removeItemIfExists(unreadRoomsContainer, name);
insertOrUpdateItem(channelsContainer, roomSubscription);
insertOrUpdateItem(channelsContainer, room);
removeItemIfExists(dmContainer, name);
} else if (RoomSubscription.TYPE_DIRECT_MESSAGE.equals(type)) {
} else if (Room.TYPE_DIRECT_MESSAGE.equals(type)) {
removeItemIfExists(unreadRoomsContainer, name);
removeItemIfExists(channelsContainer, name);
insertOrUpdateItem(dmContainer, roomSubscription);
insertOrUpdateItem(dmContainer, room);
}
}
......
......@@ -9,8 +9,8 @@ import android.view.ViewGroup;
import java.util.List;
import chat.rocket.android.R;
import chat.rocket.android.helper.TextUtils;
import chat.rocket.android.model.ddp.User;
import chat.rocket.android.realm_helper.RealmHelper;
import chat.rocket.android.model.ddp.RealmUser;
import chat.rocket.persistence.realm.RealmHelper;
import chat.rocket.android.renderer.UserRenderer;
/**
......@@ -47,16 +47,16 @@ public class RoomUserAdapter extends RecyclerView.Adapter<RoomUserViewHolder> {
return;
}
User user = realmHelper.executeTransactionForRead(realm ->
realm.where(User.class).equalTo(User.USERNAME, username).findFirst());
RealmUser user = realmHelper.executeTransactionForRead(realm ->
realm.where(RealmUser.class).equalTo(RealmUser.USERNAME, username).findFirst());
if (user == null) {
user = new User();
user = new RealmUser();
user.setUsername(username);
new UserRenderer(context, user)
new UserRenderer(context, user.asUser())
.avatarInto(holder.avatar, hostname)
.usernameInto(holder.username);
} else {
new UserRenderer(context, user)
new UserRenderer(context, user.asUser())
.statusColorInto(holder.status)
.avatarInto(holder.avatar, hostname)
.usernameInto(holder.username);
......
......@@ -7,15 +7,15 @@ import android.widget.ImageView;
import java.util.Iterator;
import java.util.List;
import chat.rocket.android.R;
import chat.rocket.android.model.ddp.User;
import chat.rocket.android.realm_helper.RealmAutoCompleteAdapter;
import chat.rocket.android.model.ddp.RealmUser;
import chat.rocket.persistence.realm.RealmAutoCompleteAdapter;
import chat.rocket.android.renderer.UserRenderer;
import chat.rocket.android.widget.RocketChatAvatar;
/**
* adapter to suggest user names.
*/
public class SuggestUserAdapter extends RealmAutoCompleteAdapter<User> {
public class SuggestUserAdapter extends RealmAutoCompleteAdapter<RealmUser> {
private final String hostname;
public SuggestUserAdapter(Context context, String hostname) {
......@@ -24,18 +24,18 @@ public class SuggestUserAdapter extends RealmAutoCompleteAdapter<User> {
}
@Override
protected void onBindItemView(View itemView, User user) {
new UserRenderer(itemView.getContext(), user)
protected void onBindItemView(View itemView, RealmUser user) {
new UserRenderer(itemView.getContext(), user.asUser())
.statusColorInto((ImageView) itemView.findViewById(R.id.room_user_status))
.avatarInto((RocketChatAvatar) itemView.findViewById(R.id.room_user_avatar), hostname);
}
@Override
protected void filterList(List<User> users, String text) {
Iterator<User> itUsers = users.iterator();
protected void filterList(List<RealmUser> users, String text) {
Iterator<RealmUser> itUsers = users.iterator();
final String prefix = text.toLowerCase();
while (itUsers.hasNext()) {
User user = itUsers.next();
RealmUser user = itUsers.next();
if (!user.getUsername().toLowerCase().startsWith(prefix)) {
itUsers.remove();
}
......@@ -43,7 +43,7 @@ public class SuggestUserAdapter extends RealmAutoCompleteAdapter<User> {
}
@Override
protected String getStringForSelectedItem(User user) {
protected String getStringForSelectedItem(RealmUser user) {
return user.getUsername();
}
}
package chat.rocket.android.model.core;
import com.google.auto.value.AutoValue;
import android.support.annotation.Nullable;
import java.util.List;
@AutoValue
public abstract class Attachment {
@Nullable
public abstract String getColor();
@Nullable
public abstract String getText();
@Nullable
public abstract String getTimestamp();
@Nullable
public abstract String getThumbUrl();
@Nullable
public abstract String getMessageLink();
public abstract boolean isCollapsed();
@Nullable
public abstract AttachmentAuthor getAttachmentAuthor();
@Nullable
public abstract AttachmentTitle getAttachmentTitle();
@Nullable
public abstract String getImageUrl();
@Nullable
public abstract String getAudioUrl();
@Nullable
public abstract String getVideoUrl();
@Nullable
public abstract List<AttachmentField> getAttachmentFields();
public static Builder builder() {
return new AutoValue_Attachment.Builder();
}
@AutoValue.Builder
public abstract static class Builder {
public abstract Builder setColor(String color);
public abstract Builder setText(String text);
public abstract Builder setTimestamp(String timestamp);
public abstract Builder setThumbUrl(String thumbUrl);
public abstract Builder setMessageLink(String messageLink);
public abstract Builder setCollapsed(boolean collapsed);
public abstract Builder setAttachmentAuthor(AttachmentAuthor attachmentAuthor);
public abstract Builder setAttachmentTitle(AttachmentTitle attachmentTitle);
public abstract Builder setImageUrl(String imageUrl);
public abstract Builder setAudioUrl(String audioUrl);
public abstract Builder setVideoUrl(String videoUrl);
public abstract Builder setAttachmentFields(List<AttachmentField> attachmentFields);
public abstract Attachment build();
}
}
package chat.rocket.android.model.core;
import com.google.auto.value.AutoValue;
@AutoValue
public abstract class AttachmentAuthor {
public abstract String getName();
public abstract String getLink();
public abstract String getIconUrl();
public static Builder builder() {
return new AutoValue_AttachmentAuthor.Builder();
}
@AutoValue.Builder
public abstract static class Builder {
public abstract Builder setName(String name);
public abstract Builder setLink(String link);
public abstract Builder setIconUrl(String iconUrl);
public abstract AttachmentAuthor build();
}
}
package chat.rocket.android.model.core;
import com.google.auto.value.AutoValue;
@AutoValue
public abstract class AttachmentField {
public abstract boolean isShort();
public abstract String getTitle();
public abstract String getText();
public static Builder builder() {
return new AutoValue_AttachmentField.Builder();
}
@AutoValue.Builder
public abstract static class Builder {
public abstract Builder setShort(boolean isShort);
public abstract Builder setTitle(String link);
public abstract Builder setText(String text);
public abstract AttachmentField build();
}
}
package chat.rocket.android.model.core;
import com.google.auto.value.AutoValue;
import android.support.annotation.Nullable;
@AutoValue
public abstract class AttachmentTitle {
public abstract String getTitle();
@Nullable
public abstract String getLink();
@Nullable
public abstract String getDownloadLink();
public static Builder builder() {
return new AutoValue_AttachmentTitle.Builder();
}
@AutoValue.Builder
public abstract static class Builder {
public abstract Builder setTitle(String title);
public abstract Builder setLink(String link);
public abstract Builder setDownloadLink(String downloadLink);
public abstract AttachmentTitle build();
}
}
package chat.rocket.android.model.core;
import com.google.auto.value.AutoValue;
@AutoValue
public abstract class Email {
public abstract String getAddress();
public abstract boolean isVerified();
public static Builder builder() {
return new AutoValue_Email.Builder();
}
@AutoValue.Builder
public abstract static class Builder {
public abstract Builder setAddress(String address);
public abstract Builder setVerified(boolean verified);
public abstract Email build();
}
}
package chat.rocket.android.model.core;
import com.google.auto.value.AutoValue;
import android.support.annotation.Nullable;
import java.util.List;
@AutoValue
public abstract class Message {
public abstract String getId();
@Nullable
public abstract String getType();
public abstract String getRoomId();
public abstract int getSyncState();
public abstract long getTimestamp();
public abstract String getMessage();
public abstract User getUser();
public abstract boolean isGroupable();
@Nullable
public abstract List<Attachment> getAttachments();
@Nullable
public abstract List<WebContent> getWebContents();
@Nullable
public abstract String getAlias();
@Nullable
public abstract String getAvatar();
public static Builder builder() {
return new AutoValue_Message.Builder();
}
@AutoValue.Builder
public abstract static class Builder {
public abstract Builder setId(String id);
public abstract Builder setType(String type);
public abstract Builder setRoomId(String roomId);
public abstract Builder setSyncState(int syncState);
public abstract Builder setTimestamp(long timestamp);
public abstract Builder setMessage(String msg);
public abstract Builder setUser(User user);
public abstract Builder setGroupable(boolean groupable);
public abstract Builder setAttachments(List<Attachment> attachments);
public abstract Builder setWebContents(List<WebContent> webContents);
public abstract Builder setAlias(String alias);
public abstract Builder setAvatar(String avatar);
public abstract Message build();
}
}
package chat.rocket.android.model.core;
import com.google.auto.value.AutoValue;
@AutoValue
public abstract class Preferences {
public abstract String getId();
public abstract boolean isNewRoomNotification();
public abstract boolean isNewMessageNotification();
public abstract boolean isUseEmojis();
public abstract boolean isConvertAsciiEmoji();
public abstract boolean isSaveMobileBandwidth();
public abstract boolean isCollapseMediaByDefault();
public abstract boolean isUnreadRoomsMode();
public abstract boolean isAutoImageLoad();
public abstract String getEmailNotificationMode();
public abstract boolean isUnreadAlert();
public abstract int getDesktopNotificationDuration();
public abstract int getViewMode();
public abstract boolean isHideUsernames();
public abstract boolean isHideAvatars();
public abstract boolean isHideFlexTab();
public static Builder builder() {
return new AutoValue_Preferences.Builder();
}
@AutoValue.Builder
public abstract static class Builder {
public abstract Builder setId(String id);
public abstract Builder setNewRoomNotification(boolean newRoomNotification);
public abstract Builder setNewMessageNotification(boolean newMessageNotification);
public abstract Builder setUseEmojis(boolean useEmojis);
public abstract Builder setConvertAsciiEmoji(boolean convertAsciiEmoji);
public abstract Builder setSaveMobileBandwidth(boolean saveMobileBandwidth);
public abstract Builder setCollapseMediaByDefault(boolean collapseMediaByDefault);
public abstract Builder setUnreadRoomsMode(boolean unreadRoomsMode);
public abstract Builder setAutoImageLoad(boolean autoImageLoad);
public abstract Builder setEmailNotificationMode(String emailNotificationMode);
public abstract Builder setUnreadAlert(boolean unreadAlert);
public abstract Builder setDesktopNotificationDuration(int desktopNotificationDuration);
public abstract Builder setViewMode(int viewMode);
public abstract Builder setHideUsernames(boolean hideUsernames);
public abstract Builder setHideAvatars(boolean hideAvatars);
public abstract Builder setHideFlexTab(boolean hideFlexTab);
public abstract Preferences build();
}
}
package chat.rocket.android.model.core;
import com.google.auto.value.AutoValue;
@AutoValue
public abstract class Room {
public static final String TYPE_CHANNEL = "c";
public static final String TYPE_PRIVATE = "p";
public static final String TYPE_DIRECT_MESSAGE = "d";
public abstract String getId();
public abstract String getRoomId();
public abstract String getName();
public abstract String getType();
public abstract boolean isOpen();
public abstract boolean isAlert();
public abstract int getUnread();
public abstract long getUpdatedAt();
public abstract long getLastSeen();
public static Builder builder() {
return new AutoValue_Room.Builder();
}
@AutoValue.Builder
public abstract static class Builder {
public abstract Builder setId(String id);
public abstract Builder setRoomId(String roomId);
public abstract Builder setName(String name);
public abstract Builder setType(String type);
public abstract Builder setOpen(boolean open);
public abstract Builder setAlert(boolean alert);
public abstract Builder setUnread(int unread);
public abstract Builder setUpdatedAt(long updatedAt);
public abstract Builder setLastSeen(long lastSeen);
public abstract Room build();
}
}
package chat.rocket.android.model.core;
import com.google.auto.value.AutoValue;
@AutoValue
public abstract class Settings {
public abstract String getId();
public abstract Preferences getPreferences();
public static Builder builder() {
return new AutoValue_Settings.Builder();
}
@AutoValue.Builder
public abstract static class Builder {
public abstract Builder setId(String id);
public abstract Builder setPreferences(Preferences preferences);
public abstract Settings build();
}
}
package chat.rocket.android.model.core;
import com.google.auto.value.AutoValue;
import android.support.annotation.Nullable;
import java.util.List;
@AutoValue
public abstract class User {
public static final String STATUS_ONLINE = "online";
public static final String STATUS_BUSY = "busy";
public static final String STATUS_AWAY = "away";
public static final String STATUS_OFFLINE = "offline";
public abstract String getId();
public abstract String getUsername();
@Nullable
public abstract String getStatus();
public abstract double getUtcOffset();
@Nullable
public abstract List<Email> getEmails();
@Nullable
public abstract Settings getSettings();
public static Builder builder() {
return new AutoValue_User.Builder();
}
@AutoValue.Builder
public abstract static class Builder {
public abstract Builder setId(String id);
public abstract Builder setUsername(String username);
public abstract Builder setStatus(String status);
public abstract Builder setUtcOffset(double utcOffset);
public abstract Builder setEmails(List<Email> emails);
public abstract Builder setSettings(Settings settings);
public abstract User build();
}
}
package chat.rocket.android.model.core;
import com.google.auto.value.AutoValue;
import android.support.annotation.Nullable;
@AutoValue
public abstract class WebContent {
public abstract String getUrl();
@Nullable
public abstract String getMeta();
@Nullable
public abstract String getHeaders();
public static Builder builder() {
return new AutoValue_WebContent.Builder();
}
@AutoValue.Builder
public abstract static class Builder {
public abstract Builder setUrl(String url);
public abstract Builder setMeta(String meta);
public abstract Builder setHeaders(String headers);
public abstract WebContent build();
}
}
......@@ -7,7 +7,7 @@ import org.json.JSONException;
import org.json.JSONObject;
import chat.rocket.android.model.JsonConstants;
import chat.rocket.android.realm_helper.RealmHelper;
import chat.rocket.persistence.realm.RealmHelper;
/**
* public setting model.
......
......@@ -3,13 +3,22 @@ package chat.rocket.android.model.ddp;
import io.realm.RealmObject;
import io.realm.annotations.PrimaryKey;
import chat.rocket.android.model.core.Email;
/**
* Login-User's email.
* Login-RealmUser's email.
*/
public class Email extends RealmObject {
public class RealmEmail extends RealmObject {
@PrimaryKey private String address;
private boolean verified;
public Email asEmail() {
return Email.builder()
.setAddress(address)
.setVerified(verified)
.build();
}
@SuppressWarnings({"PMD.ShortVariable"})
@Override
public boolean equals(Object o) {
......@@ -20,7 +29,7 @@ public class Email extends RealmObject {
return false;
}
Email email = (Email) o;
RealmEmail email = (RealmEmail) o;
if (verified != email.verified) {
return false;
......
......@@ -2,18 +2,27 @@ package chat.rocket.android.model.ddp;
import io.realm.RealmObject;
import io.realm.annotations.PrimaryKey;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.List;
import chat.rocket.android.model.JsonConstants;
import chat.rocket.android.model.SyncState;
import chat.rocket.android.model.core.Attachment;
import chat.rocket.android.model.core.AttachmentAuthor;
import chat.rocket.android.model.core.AttachmentField;
import chat.rocket.android.model.core.AttachmentTitle;
import chat.rocket.android.model.core.Message;
import chat.rocket.android.model.core.WebContent;
/**
* Message.
* RealmMessage.
*/
@SuppressWarnings({"PMD.ShortClassName", "PMD.ShortVariable",
"PMD.MethodNamingConventions", "PMD.VariableNamingConventions"})
public class Message extends RealmObject {
public class RealmMessage extends RealmObject {
//ref: Rocket.Chat:packages/rocketchat-lib/lib/MessageTypes.coffee
public static final String ID = "_id";
......@@ -36,7 +45,7 @@ public class Message extends RealmObject {
private int syncstate;
private long ts;
private String msg;
private User u;
private RealmUser u;
private boolean groupable;
private String alias;
private String avatar;
......@@ -103,11 +112,11 @@ public class Message extends RealmObject {
this.msg = msg;
}
public User getUser() {
public RealmUser getUser() {
return u;
}
public void setUser(User u) {
public void setUser(RealmUser u) {
this.u = u;
}
......@@ -151,9 +160,141 @@ public class Message extends RealmObject {
this.avatar = avatar;
}
public Message asMessage() {
return Message.builder()
.setId(_id)
.setType(t)
.setRoomId(rid)
.setSyncState(syncstate)
.setTimestamp(ts)
.setMessage(msg)
.setUser(u.asUser())
.setGroupable(groupable)
.setAlias(alias)
.setAvatar(avatar)
.setAttachments(getCoreAttachments())
.setWebContents(getWebContents())
.build();
}
private List<Attachment> getCoreAttachments() {
if (attachments == null || attachments.length() == 0) {
return null;
}
final List<Attachment> coreAttachments = new ArrayList<>();
try {
final JSONArray jsonArray = new JSONArray(urls);
for (int i = 0, size = jsonArray.length(); i < size; i++) {
final Attachment coreAttachment = getCoreAttachment(jsonArray.getJSONObject(i));
if (coreAttachment != null) {
coreAttachments.add(coreAttachment);
}
}
} catch (JSONException ignored) {
}
return coreAttachments;
}
private Attachment getCoreAttachment(JSONObject jsonCoreAttachment) {
return Attachment.builder()
.setColor(jsonCoreAttachment.optString("color", null))
.setText(jsonCoreAttachment.optString("text", null))
.setTimestamp(jsonCoreAttachment.optString("ts", null))
.setThumbUrl(jsonCoreAttachment.optString("thumb_url", null))
.setMessageLink(jsonCoreAttachment.optString("message_link", null))
.setCollapsed(jsonCoreAttachment.optBoolean("collapsed"))
.setImageUrl(jsonCoreAttachment.optString("image_url", null))
.setAudioUrl(jsonCoreAttachment.optString("audio_url", null))
.setVideoUrl(jsonCoreAttachment.optString("video_url", null))
.setAttachmentAuthor(getAttachmentAuthor(jsonCoreAttachment))
.setAttachmentTitle(getAttachmentTitle(jsonCoreAttachment))
.setAttachmentFields(getAttachmentFields(jsonCoreAttachment))
.build();
}
private AttachmentAuthor getAttachmentAuthor(JSONObject jsonCoreAttachment) {
if (jsonCoreAttachment.isNull("author_name") || jsonCoreAttachment.isNull("author_link")
|| jsonCoreAttachment.isNull("author_icon")) {
return null;
}
return AttachmentAuthor.builder()
.setName(jsonCoreAttachment.optString("author_name"))
.setLink(jsonCoreAttachment.optString("author_link"))
.setIconUrl(jsonCoreAttachment.optString("author_icon"))
.build();
}
private AttachmentTitle getAttachmentTitle(JSONObject jsonCoreAttachment) {
if (jsonCoreAttachment.isNull("title")) {
return null;
}
return AttachmentTitle.builder()
.setTitle(jsonCoreAttachment.optString("title"))
.setLink(jsonCoreAttachment.optString("title_link", null))
.setDownloadLink(jsonCoreAttachment.optString("title_link_download", null))
.build();
}
private List<AttachmentField> getAttachmentFields(JSONObject jsonCoreAttachment) {
final JSONArray jsonFields = jsonCoreAttachment.optJSONArray("fields");
if (jsonFields == null) {
return null;
}
final List<AttachmentField> attachmentFields = new ArrayList<>();
for (int i = 0, size = jsonFields.length(); i < size; i++) {
final JSONObject fieldObject = jsonFields.optJSONObject(i);
if (fieldObject == null || fieldObject.isNull("title") || fieldObject.isNull("value")) {
continue;
}
attachmentFields.add(AttachmentField.builder()
.setShort(fieldObject.optBoolean("short"))
.setTitle(fieldObject.optString("title"))
.setText(fieldObject.optString("value"))
.build());
}
return attachmentFields;
}
private List<WebContent> getWebContents() {
if (urls == null || urls.length() == 0) {
return null;
}
final List<WebContent> webContents = new ArrayList<>();
try {
final JSONArray jsonArray = new JSONArray(urls);
for (int i = 0, size = jsonArray.length(); i < size; i++) {
final WebContent webContent = getWebContent(jsonArray.getJSONObject(i));
if (webContent != null) {
webContents.add(webContent);
}
}
} catch (JSONException ignored) {
}
return webContents;
}
private WebContent getWebContent(JSONObject jsonWebContent) {
return WebContent.builder()
.setUrl(jsonWebContent.optString("url"))
.setMeta(jsonWebContent.optString("meta", null))
.setHeaders(jsonWebContent.optString("headers", null))
.build();
}
@Override
public String toString() {
return "Message{" +
return "RealmMessage{" +
"_id='" + _id + '\'' +
", t='" + t + '\'' +
", rid='" + rid + '\'' +
......@@ -178,7 +319,7 @@ public class Message extends RealmObject {
return false;
}
Message message = (Message) o;
RealmMessage message = (RealmMessage) o;
if (syncstate != message.syncstate) {
return false;
......
......@@ -3,8 +3,10 @@ package chat.rocket.android.model.ddp;
import io.realm.RealmObject;
import io.realm.annotations.PrimaryKey;
import chat.rocket.android.model.core.Preferences;
@SuppressWarnings({"PMD.ShortVariable"})
public class Preferences extends RealmObject {
public class RealmPreferences extends RealmObject {
@PrimaryKey private String id;
......@@ -25,6 +27,27 @@ public class Preferences extends RealmObject {
private boolean hideFlexTab;
// private List<String> highlights; // Realm does not support this yet
public Preferences asPreferences() {
return Preferences.builder()
.setId(id)
.setNewRoomNotification(newRoomNotification)
.setNewMessageNotification(newMessageNotification)
.setUseEmojis(useEmojis)
.setConvertAsciiEmoji(convertAsciiEmoji)
.setSaveMobileBandwidth(saveMobileBandwidth)
.setCollapseMediaByDefault(collapseMediaByDefault)
.setUnreadRoomsMode(unreadRoomsMode)
.setAutoImageLoad(autoImageLoad)
.setEmailNotificationMode(emailNotificationMode)
.setUnreadAlert(unreadAlert)
.setDesktopNotificationDuration(desktopNotificationDuration)
.setViewMode(viewMode)
.setHideUsernames(hideUsernames)
.setHideAvatars(hideAvatars)
.setHideFlexTab(hideFlexTab)
.build();
}
public boolean isNewRoomNotification() {
return newRoomNotification;
}
......@@ -94,7 +117,7 @@ public class Preferences extends RealmObject {
return false;
}
Preferences that = (Preferences) o;
RealmPreferences that = (RealmPreferences) o;
if (newRoomNotification != that.newRoomNotification) {
return false;
......
......@@ -3,17 +3,26 @@ package chat.rocket.android.model.ddp;
import io.realm.RealmObject;
import io.realm.annotations.PrimaryKey;
import chat.rocket.android.model.core.Settings;
@SuppressWarnings({"PMD.ShortVariable"})
public class Settings extends RealmObject {
public class RealmSettings extends RealmObject {
@PrimaryKey private String id;
private Preferences preferences;
private RealmPreferences preferences;
public Preferences getPreferences() {
public RealmPreferences getPreferences() {
return preferences;
}
public Settings asSettings() {
return Settings.builder()
.setId(id)
.setPreferences(preferences.asPreferences())
.build();
}
@Override
public boolean equals(Object o) {
if (this == o) {
......@@ -23,7 +32,7 @@ public class Settings extends RealmObject {
return false;
}
Settings settings = (Settings) o;
RealmSettings settings = (RealmSettings) o;
if (id != null ? !id.equals(settings.id) : settings.id != null) {
return false;
......
......@@ -6,12 +6,17 @@ import io.realm.RealmObject;
import io.realm.RealmQuery;
import io.realm.annotations.PrimaryKey;
import java.util.ArrayList;
import java.util.List;
import chat.rocket.android.model.core.Email;
import chat.rocket.android.model.core.User;
/**
* User.
* RealmUser.
*/
@SuppressWarnings({"PMD.ShortClassName", "PMD.ShortVariable",
"PMD.MethodNamingConventions", "PMD.VariableNamingConventions"})
public class User extends RealmObject {
public class RealmUser extends RealmObject {
public static final String ID = "_id";
public static final String USERNAME = "username";
......@@ -29,11 +34,11 @@ public class User extends RealmObject {
private String username;
private String status;
private double utcOffset;
private RealmList<Email> emails;
private Settings settings;
private RealmList<RealmEmail> emails;
private RealmSettings settings;
public static RealmQuery<User> queryCurrentUser(Realm realm) {
return realm.where(User.class).isNotEmpty(EMAILS);
public static RealmQuery<RealmUser> queryCurrentUser(Realm realm) {
return realm.where(RealmUser.class).isNotEmpty(EMAILS);
}
public String getId() {
......@@ -68,21 +73,40 @@ public class User extends RealmObject {
this.utcOffset = utcOffset;
}
public RealmList<Email> getEmails() {
public RealmList<RealmEmail> getEmails() {
return emails;
}
public void setEmails(RealmList<Email> emails) {
public void setEmails(RealmList<RealmEmail> emails) {
this.emails = emails;
}
public Settings getSettings() {
public RealmSettings getSettings() {
return settings;
}
public User asUser() {
// convert email list
final int total = emails.size();
final List<Email> coreEmails = new ArrayList<>(total);
for (int i = 0; i < total; i++) {
coreEmails.add(emails.get(i).asEmail());
}
return User.builder()
.setId(_id)
.setUsername(username)
.setStatus(status)
.setUtcOffset(utcOffset)
.setEmails(coreEmails)
.setSettings(settings != null ? settings.asSettings() : null)
.build();
}
@Override
public String toString() {
return "User{" +
return "RealmUser{" +
"_id='" + _id + '\'' +
", username='" + username + '\'' +
", status='" + status + '\'' +
......@@ -101,7 +125,7 @@ public class User extends RealmObject {
return false;
}
User user = (User) o;
RealmUser user = (RealmUser) o;
if (Double.compare(user.utcOffset, utcOffset) != 0) {
return false;
......
......@@ -6,6 +6,7 @@ import org.json.JSONException;
import org.json.JSONObject;
import chat.rocket.android.model.JsonConstants;
import chat.rocket.android.model.core.Room;
/**
* Chat Room(Subscription).
......@@ -31,7 +32,7 @@ public class RoomSubscription extends RealmObject {
private String _id; //subscriptionId
@PrimaryKey private String rid; //roomId
private String name;
//private User u; // REMARK: do not save u, because it is just me.
//private RealmUser u; // REMARK: do not save u, because it is just me.
private String t; //type { c: channel, d: direct message, p: private }
private boolean open;
private boolean alert;
......@@ -126,4 +127,18 @@ public class RoomSubscription extends RealmObject {
public void setLastSeen(long ls) {
this.ls = ls;
}
public Room asRoom() {
return Room.builder()
.setId(_id)
.setRoomId(rid)
.setName(name)
.setType(t)
.setOpen(open)
.setAlert(alert)
.setUnread(unread)
.setUpdatedAt(_updatedAt)
.setLastSeen(ls)
.build();
}
}
......@@ -14,8 +14,8 @@ import chat.rocket.android.helper.LogcatIfError;
import chat.rocket.android.helper.TextUtils;
import chat.rocket.android.log.RCLog;
import chat.rocket.android.model.SyncState;
import chat.rocket.android.realm_helper.RealmHelper;
import chat.rocket.android.realm_helper.RealmObjectObserver;
import chat.rocket.persistence.realm.RealmHelper;
import chat.rocket.persistence.realm.RealmObjectObserver;
import chat.rocket.android.service.ConnectivityManager;
public class MethodCall extends RealmObject {
......
......@@ -8,7 +8,7 @@ import org.json.JSONObject;
import chat.rocket.android.helper.LogcatIfError;
import chat.rocket.android.helper.TextUtils;
import chat.rocket.android.realm_helper.RealmHelper;
import chat.rocket.persistence.realm.RealmHelper;
import hugo.weaving.DebugLog;
/**
......
......@@ -6,8 +6,8 @@ import java.util.List;
import chat.rocket.android.helper.GcmPushSettingHelper;
import chat.rocket.android.model.ddp.PublicSetting;
import chat.rocket.android.model.internal.GcmPushRegistration;
import chat.rocket.android.realm_helper.RealmHelper;
import chat.rocket.android.realm_helper.RealmStore;
import chat.rocket.persistence.realm.RealmHelper;
import chat.rocket.persistence.realm.RealmStore;
import chat.rocket.android.service.ConnectivityManager;
import chat.rocket.android.service.ServerInfo;
......
......@@ -10,23 +10,24 @@ import chat.rocket.android.helper.Avatar;
import chat.rocket.android.helper.DateTime;
import chat.rocket.android.helper.TextUtils;
import chat.rocket.android.model.SyncState;
import chat.rocket.android.model.ddp.Message;
import chat.rocket.android.model.ddp.User;
import chat.rocket.android.model.ddp.RealmMessage;
import chat.rocket.android.model.ddp.RealmUser;
import chat.rocket.android.widget.RocketChatAvatar;
import chat.rocket.android.widget.message.RocketChatMessageAttachmentsLayout;
import chat.rocket.android.widget.message.RocketChatMessageLayout;
import chat.rocket.android.widget.message.RocketChatMessageUrlsLayout;
/**
* Renderer for Message model.
* Renderer for RealmMessage model.
*/
public class MessageRenderer extends AbstractRenderer<Message> {
public class MessageRenderer extends AbstractRenderer<RealmMessage> {
private final UserRenderer userRenderer;
public MessageRenderer(Context context, Message message) {
public MessageRenderer(Context context, RealmMessage message) {
super(context, message);
userRenderer = new UserRenderer(context, message.getUser());
RealmUser realmUser = message.getUser();
userRenderer = new UserRenderer(context, realmUser == null ? null : realmUser.asUser());
}
/**
......@@ -39,7 +40,7 @@ public class MessageRenderer extends AbstractRenderer<Message> {
} else if (TextUtils.isEmpty(object.getAvatar())) {
userRenderer.avatarInto(rocketChatAvatar, hostname);
} else {
final User user = object.getUser();
final RealmUser user = object.getUser();
setAvatarInto(object.getAvatar(), hostname, user == null ? null : user.getUsername(),
rocketChatAvatar);
}
......
......@@ -7,11 +7,11 @@ import android.widget.TextView;
import chat.rocket.android.R;
import chat.rocket.android.helper.Avatar;
import chat.rocket.android.helper.TextUtils;
import chat.rocket.android.model.ddp.User;
import chat.rocket.android.model.core.User;
import chat.rocket.android.widget.RocketChatAvatar;
/**
* Renderer for User model.
* Renderer for RealmUser model.
*/
public class UserRenderer extends AbstractRenderer<User> {
......
package chat.rocket.android.repositories;
import io.realm.Realm;
import io.realm.RealmResults;
import java.util.ArrayList;
import java.util.List;
import chat.rocket.android.model.core.Room;
import chat.rocket.android.model.ddp.RoomSubscription;
import rx.Observable;
public class RealmRoomRepository implements RoomRepository {
private final Realm realm;
public RealmRoomRepository(Realm realm) {
this.realm = realm;
}
@Override
public Observable<List<Room>> getOpenRooms() {
return realm.where(RoomSubscription.class)
.equalTo(RoomSubscription.OPEN, true)
.findAllAsync()
.asObservable()
.filter(roomSubscriptions -> roomSubscriptions != null && roomSubscriptions.isLoaded()
&& roomSubscriptions.isValid())
.map(roomSubscriptions -> toList(roomSubscriptions));
}
private List<Room> toList(RealmResults<RoomSubscription> roomSubscriptions) {
int total = roomSubscriptions.size();
final List<Room> roomList = new ArrayList<>(total);
for (int i = 0; i < total; i++) {
roomList.add(roomSubscriptions.get(i).asRoom());
}
return roomList;
}
}
package chat.rocket.android.repositories;
import io.realm.Realm;
import chat.rocket.android.model.core.User;
import chat.rocket.android.model.ddp.RealmUser;
import rx.Observable;
public class RealmUserRepository implements UserRepository {
private final Realm realm;
public RealmUserRepository(Realm realm) {
this.realm = realm;
}
@Override
public Observable<User> getCurrentUser() {
return realm.where(RealmUser.class)
.isNotEmpty(RealmUser.EMAILS)
.findFirstAsync()
.<RealmUser>asObservable()
.filter(realmUser -> realmUser != null && realmUser.isLoaded() && realmUser.isValid())
.map(realmUser -> realmUser.asUser());
}
}
package chat.rocket.android.repositories;
import java.util.List;
import chat.rocket.android.model.core.Room;
import rx.Observable;
public interface RoomRepository {
Observable<List<Room>> getOpenRooms();
}
package chat.rocket.android.repositories;
import chat.rocket.android.model.core.User;
import rx.Observable;
public interface UserRepository {
Observable<User> getCurrentUser();
}
......@@ -9,8 +9,8 @@ import org.json.JSONObject;
import java.util.ArrayList;
import java.util.List;
import chat.rocket.android.realm_helper.RealmHelper;
import chat.rocket.android.realm_helper.RealmStore;
import chat.rocket.persistence.realm.RealmHelper;
import chat.rocket.persistence.realm.RealmStore;
/**
* Backend implementation to store ServerInfo.
......
......@@ -15,8 +15,8 @@ import chat.rocket.android.helper.LogcatIfError;
import chat.rocket.android.helper.TextUtils;
import chat.rocket.android.log.RCLog;
import chat.rocket.android.model.internal.Session;
import chat.rocket.android.realm_helper.RealmHelper;
import chat.rocket.android.realm_helper.RealmStore;
import chat.rocket.persistence.realm.RealmHelper;
import chat.rocket.persistence.realm.RealmStore;
import chat.rocket.android.service.ddp.base.ActiveUsersSubscriber;
import chat.rocket.android.service.ddp.base.LoginServiceConfigurationSubscriber;
import chat.rocket.android.service.ddp.base.UserDataSubscriber;
......
......@@ -11,7 +11,7 @@ import org.json.JSONObject;
import java.util.Iterator;
import chat.rocket.android.helper.LogcatIfError;
import chat.rocket.android.log.RCLog;
import chat.rocket.android.realm_helper.RealmHelper;
import chat.rocket.persistence.realm.RealmHelper;
import chat.rocket.android.service.DDPClientRef;
import chat.rocket.android.service.Registrable;
import chat.rocket.android_ddp.DDPSubscription;
......
......@@ -3,7 +3,7 @@ package chat.rocket.android.service.ddp.base;
import android.content.Context;
import org.json.JSONArray;
import chat.rocket.android.realm_helper.RealmHelper;
import chat.rocket.persistence.realm.RealmHelper;
import chat.rocket.android.service.DDPClientRef;
import chat.rocket.android.service.ddp.AbstractDDPDocEventSubscriber;
......
......@@ -5,8 +5,8 @@ import io.realm.RealmObject;
import org.json.JSONException;
import org.json.JSONObject;
import chat.rocket.android.model.ddp.User;
import chat.rocket.android.realm_helper.RealmHelper;
import chat.rocket.android.model.ddp.RealmUser;
import chat.rocket.persistence.realm.RealmHelper;
import chat.rocket.android.service.DDPClientRef;
/**
......@@ -30,7 +30,7 @@ public class ActiveUsersSubscriber extends AbstractBaseSubscriber {
@Override
protected Class<? extends RealmObject> getModelClass() {
return User.class;
return RealmUser.class;
}
@Override
......
......@@ -4,7 +4,7 @@ import android.content.Context;
import io.realm.RealmObject;
import chat.rocket.android.model.ddp.MeteorLoginServiceConfiguration;
import chat.rocket.android.realm_helper.RealmHelper;
import chat.rocket.persistence.realm.RealmHelper;
import chat.rocket.android.service.DDPClientRef;
/**
......
......@@ -5,8 +5,8 @@ import io.realm.RealmObject;
import org.json.JSONException;
import org.json.JSONObject;
import chat.rocket.android.model.ddp.User;
import chat.rocket.android.realm_helper.RealmHelper;
import chat.rocket.android.model.ddp.RealmUser;
import chat.rocket.persistence.realm.RealmHelper;
import chat.rocket.android.service.DDPClientRef;
/**
......@@ -30,7 +30,7 @@ public class UserDataSubscriber extends AbstractBaseSubscriber {
@Override
protected Class<? extends RealmObject> getModelClass() {
return User.class;
return RealmUser.class;
}
@Override
......
......@@ -7,7 +7,7 @@ import org.json.JSONObject;
import chat.rocket.android.helper.LogcatIfError;
import chat.rocket.android.log.RCLog;
import chat.rocket.android.realm_helper.RealmHelper;
import chat.rocket.persistence.realm.RealmHelper;
import chat.rocket.android.service.DDPClientRef;
import chat.rocket.android.service.ddp.AbstractDDPDocEventSubscriber;
import chat.rocket.android_ddp.DDPSubscription;
......
......@@ -2,7 +2,7 @@ package chat.rocket.android.service.ddp.stream;
import android.content.Context;
import chat.rocket.android.realm_helper.RealmHelper;
import chat.rocket.persistence.realm.RealmHelper;
import chat.rocket.android.service.DDPClientRef;
abstract class AbstractStreamNotifyUserEventSubscriber extends AbstractStreamNotifyEventSubscriber {
......
......@@ -6,7 +6,7 @@ import org.json.JSONException;
import org.json.JSONObject;
import chat.rocket.android.model.ddp.RoomSubscription;
import chat.rocket.android.realm_helper.RealmHelper;
import chat.rocket.persistence.realm.RealmHelper;
import chat.rocket.android.service.DDPClientRef;
public class StreamNotifyUserSubscriptionsChanged extends AbstractStreamNotifyUserEventSubscriber {
......
......@@ -5,8 +5,8 @@ import io.realm.RealmObject;
import org.json.JSONException;
import org.json.JSONObject;
import chat.rocket.android.model.ddp.Message;
import chat.rocket.android.realm_helper.RealmHelper;
import chat.rocket.android.model.ddp.RealmMessage;
import chat.rocket.persistence.realm.RealmHelper;
import chat.rocket.android.service.DDPClientRef;
/**
......@@ -33,7 +33,7 @@ public class StreamRoomMessage extends AbstractStreamNotifyEventSubscriber {
@Override
protected Class<? extends RealmObject> getModelClass() {
return Message.class;
return RealmMessage.class;
}
@Override
......@@ -43,6 +43,6 @@ public class StreamRoomMessage extends AbstractStreamNotifyEventSubscriber {
@Override
protected JSONObject customizeFieldJson(JSONObject json) throws JSONException {
return Message.customizeJson(super.customizeFieldJson(json));
return RealmMessage.customizeJson(super.customizeFieldJson(json));
}
}
......@@ -6,7 +6,7 @@ import android.content.SharedPreferences;
import chat.rocket.android.RocketChatCache;
import chat.rocket.android.helper.TextUtils;
import chat.rocket.android.model.ddp.RoomSubscription;
import chat.rocket.android.realm_helper.RealmHelper;
import chat.rocket.persistence.realm.RealmHelper;
import chat.rocket.android.service.Registrable;
public abstract class AbstractRocketChatCacheObserver implements Registrable {
......
......@@ -4,7 +4,7 @@ import android.content.Context;
import android.os.Handler;
import android.os.Looper;
import chat.rocket.android.realm_helper.RealmHelper;
import chat.rocket.persistence.realm.RealmHelper;
import chat.rocket.android.service.DDPClientRef;
import chat.rocket.android.service.Registrable;
import chat.rocket.android.service.ddp.stream.StreamRoomMessage;
......
......@@ -3,8 +3,8 @@ package chat.rocket.android.service.observer;
import android.content.Context;
import io.realm.RealmObject;
import chat.rocket.android.realm_helper.RealmHelper;
import chat.rocket.android.realm_helper.RealmListObserver;
import chat.rocket.persistence.realm.RealmHelper;
import chat.rocket.persistence.realm.RealmListObserver;
import chat.rocket.android.service.DDPClientRef;
import chat.rocket.android.service.Registrable;
......
......@@ -8,8 +8,8 @@ import java.util.ArrayList;
import java.util.List;
import chat.rocket.android.api.MethodCallHelper;
import chat.rocket.android.helper.LogcatIfError;
import chat.rocket.android.model.ddp.User;
import chat.rocket.android.realm_helper.RealmHelper;
import chat.rocket.android.model.ddp.RealmUser;
import chat.rocket.persistence.realm.RealmHelper;
import chat.rocket.android.service.DDPClientRef;
import chat.rocket.android.service.Registrable;
import chat.rocket.android.service.ddp.stream.StreamNotifyUserSubscriptionsChanged;
......@@ -18,7 +18,7 @@ import hugo.weaving.DebugLog;
/**
* observe the user with emails.
*/
public class CurrentUserObserver extends AbstractModelObserver<User> {
public class CurrentUserObserver extends AbstractModelObserver<RealmUser> {
private final MethodCallHelper methodCall;
private boolean currentUserExists;
private ArrayList<Registrable> listeners;
......@@ -31,12 +31,12 @@ public class CurrentUserObserver extends AbstractModelObserver<User> {
}
@Override
public RealmResults<User> queryItems(Realm realm) {
return User.queryCurrentUser(realm).findAll();
public RealmResults<RealmUser> queryItems(Realm realm) {
return RealmUser.queryCurrentUser(realm).findAll();
}
@Override
public void onUpdateResults(List<User> results) {
public void onUpdateResults(List<RealmUser> results) {
boolean exists = !results.isEmpty();
if (currentUserExists != exists) {
......@@ -50,7 +50,7 @@ public class CurrentUserObserver extends AbstractModelObserver<User> {
}
@DebugLog
private void onLogin(User user) {
private void onLogin(RealmUser user) {
if (listeners != null) {
onLogout();
}
......
......@@ -17,7 +17,7 @@ import chat.rocket.android.helper.OkHttpHelper;
import chat.rocket.android.log.RCLog;
import chat.rocket.android.model.SyncState;
import chat.rocket.android.model.internal.FileUploading;
import chat.rocket.android.realm_helper.RealmHelper;
import chat.rocket.persistence.realm.RealmHelper;
import chat.rocket.android.service.DDPClientRef;
import okhttp3.MediaType;
import okhttp3.MultipartBody;
......
......@@ -14,10 +14,10 @@ import chat.rocket.android.helper.LogcatIfError;
import chat.rocket.android.helper.OkHttpHelper;
import chat.rocket.android.log.RCLog;
import chat.rocket.android.model.SyncState;
import chat.rocket.android.model.ddp.User;
import chat.rocket.android.model.ddp.RealmUser;
import chat.rocket.android.model.internal.FileUploading;
import chat.rocket.android.model.internal.Session;
import chat.rocket.android.realm_helper.RealmHelper;
import chat.rocket.persistence.realm.RealmHelper;
import chat.rocket.android.service.DDPClientRef;
import okhttp3.MediaType;
import okhttp3.Request;
......@@ -92,8 +92,8 @@ public class FileUploadingWithUfsObserver extends AbstractModelObserver<FileUplo
return;
}
User currentUser = realmHelper.executeTransactionForRead(realm ->
User.queryCurrentUser(realm).findFirst());
RealmUser currentUser = realmHelper.executeTransactionForRead(realm ->
RealmUser.queryCurrentUser(realm).findFirst());
Session session = realmHelper.executeTransactionForRead(realm ->
Session.queryDefaultSession(realm).findFirst());
if (currentUser == null || session == null) {
......
......@@ -16,9 +16,9 @@ import chat.rocket.android.helper.LogcatIfError;
import chat.rocket.android.model.SyncState;
import chat.rocket.android.model.ddp.PublicSetting;
import chat.rocket.android.model.ddp.PublicSettingsConstants;
import chat.rocket.android.model.ddp.User;
import chat.rocket.android.model.ddp.RealmUser;
import chat.rocket.android.model.internal.GcmPushRegistration;
import chat.rocket.android.realm_helper.RealmHelper;
import chat.rocket.persistence.realm.RealmHelper;
import chat.rocket.android.service.DDPClientRef;
/**
......@@ -70,8 +70,8 @@ public class GcmPushRegistrationObserver extends AbstractModelObserver<GcmPushRe
.getString(realmHelper, PublicSettingsConstants.Push.GCM_PROJECT_NUMBER, "").trim();
final String gcmToken = getGcmToken(senderId);
final User currentUser = realmHelper.executeTransactionForRead(realm ->
User.queryCurrentUser(realm).findFirst());
final RealmUser currentUser = realmHelper.executeTransactionForRead(realm ->
RealmUser.queryCurrentUser(realm).findFirst());
final String userId = currentUser != null ? currentUser.getId() : null;
final String pushId = RocketChatCache.getOrCreatePushId(context);
......
......@@ -11,7 +11,7 @@ import chat.rocket.android.api.MethodCallHelper;
import chat.rocket.android.log.RCLog;
import chat.rocket.android.model.SyncState;
import chat.rocket.android.model.internal.GetUsersOfRoomsProcedure;
import chat.rocket.android.realm_helper.RealmHelper;
import chat.rocket.persistence.realm.RealmHelper;
import chat.rocket.android.service.DDPClientRef;
/**
......
......@@ -11,9 +11,9 @@ import bolts.Task;
import chat.rocket.android.api.MethodCallHelper;
import chat.rocket.android.log.RCLog;
import chat.rocket.android.model.SyncState;
import chat.rocket.android.model.ddp.Message;
import chat.rocket.android.model.ddp.RealmMessage;
import chat.rocket.android.model.internal.LoadMessageProcedure;
import chat.rocket.android.realm_helper.RealmHelper;
import chat.rocket.persistence.realm.RealmHelper;
import chat.rocket.android.service.DDPClientRef;
/**
......@@ -56,11 +56,11 @@ public class LoadMessageProcedureObserver extends AbstractModelObserver<LoadMess
).onSuccessTask(task ->
methodCall.loadHistory(roomId, isReset ? 0 : timestamp, count, lastSeen)
.onSuccessTask(_task -> {
Message lastMessage = realmHelper.executeTransactionForRead(realm ->
realm.where(Message.class)
.equalTo(Message.ROOM_ID, roomId)
.equalTo(Message.SYNC_STATE, SyncState.SYNCED)
.findAllSorted(Message.TIMESTAMP, Sort.ASCENDING).first(null));
RealmMessage lastMessage = realmHelper.executeTransactionForRead(realm ->
realm.where(RealmMessage.class)
.equalTo(RealmMessage.ROOM_ID, roomId)
.equalTo(RealmMessage.SYNC_STATE, SyncState.SYNCED)
.findAllSorted(RealmMessage.TIMESTAMP, Sort.ASCENDING).first(null));
long lastTs = lastMessage != null ? lastMessage.getTimestamp() : 0;
int messageCount = _task.getResult().length();
return realmHelper.executeTransaction(realm ->
......
......@@ -10,7 +10,7 @@ import chat.rocket.android.helper.CheckSum;
import chat.rocket.android.helper.LogcatIfError;
import chat.rocket.android.model.SyncState;
import chat.rocket.android.model.internal.MethodCall;
import chat.rocket.android.realm_helper.RealmHelper;
import chat.rocket.persistence.realm.RealmHelper;
import chat.rocket.android.service.DDPClientRef;
import chat.rocket.android_ddp.DDPClientCallback;
......
......@@ -10,14 +10,14 @@ import chat.rocket.android.api.MethodCallHelper;
import chat.rocket.android.helper.LogcatIfError;
import chat.rocket.android.log.RCLog;
import chat.rocket.android.model.SyncState;
import chat.rocket.android.model.ddp.Message;
import chat.rocket.android.realm_helper.RealmHelper;
import chat.rocket.android.model.ddp.RealmMessage;
import chat.rocket.persistence.realm.RealmHelper;
import chat.rocket.android.service.DDPClientRef;
/**
* Observe messages for sending.
*/
public class NewMessageObserver extends AbstractModelObserver<Message> {
public class NewMessageObserver extends AbstractModelObserver<RealmMessage> {
private final MethodCallHelper methodCall;
......@@ -28,10 +28,10 @@ public class NewMessageObserver extends AbstractModelObserver<Message> {
realmHelper.executeTransaction(realm -> {
// resume pending operations.
RealmResults<Message> pendingMethodCalls = realm.where(Message.class)
.equalTo(Message.SYNC_STATE, SyncState.SYNCING)
RealmResults<RealmMessage> pendingMethodCalls = realm.where(RealmMessage.class)
.equalTo(RealmMessage.SYNC_STATE, SyncState.SYNCING)
.findAll();
for (Message message : pendingMethodCalls) {
for (RealmMessage message : pendingMethodCalls) {
message.setSyncState(SyncState.NOT_SYNCED);
}
......@@ -40,37 +40,37 @@ public class NewMessageObserver extends AbstractModelObserver<Message> {
}
@Override
public RealmResults<Message> queryItems(Realm realm) {
return realm.where(Message.class)
.equalTo(Message.SYNC_STATE, SyncState.NOT_SYNCED)
.isNotNull(Message.ROOM_ID)
public RealmResults<RealmMessage> queryItems(Realm realm) {
return realm.where(RealmMessage.class)
.equalTo(RealmMessage.SYNC_STATE, SyncState.NOT_SYNCED)
.isNotNull(RealmMessage.ROOM_ID)
.findAll();
}
@Override
public void onUpdateResults(List<Message> results) {
public void onUpdateResults(List<RealmMessage> results) {
if (results.isEmpty()) {
return;
}
final Message message = results.get(0);
final RealmMessage message = results.get(0);
final String messageId = message.getId();
final String roomId = message.getRoomId();
final String msg = message.getMessage();
realmHelper.executeTransaction(realm ->
realm.createOrUpdateObjectFromJson(Message.class, new JSONObject()
.put(Message.ID, messageId)
.put(Message.SYNC_STATE, SyncState.SYNCING)
realm.createOrUpdateObjectFromJson(RealmMessage.class, new JSONObject()
.put(RealmMessage.ID, messageId)
.put(RealmMessage.SYNC_STATE, SyncState.SYNCING)
)
).onSuccessTask(task -> methodCall.sendMessage(messageId, roomId, msg)
).continueWith(task -> {
if (task.isFaulted()) {
RCLog.w(task.getError());
realmHelper.executeTransaction(realm ->
realm.createOrUpdateObjectFromJson(Message.class, new JSONObject()
.put(Message.ID, messageId)
.put(Message.SYNC_STATE, SyncState.FAILED)));
realm.createOrUpdateObjectFromJson(RealmMessage.class, new JSONObject()
.put(RealmMessage.ID, messageId)
.put(RealmMessage.SYNC_STATE, SyncState.FAILED)));
}
return null;
});
......
......@@ -8,7 +8,7 @@ import java.util.List;
import chat.rocket.android.helper.GcmPushSettingHelper;
import chat.rocket.android.model.ddp.PublicSetting;
import chat.rocket.android.model.internal.GcmPushRegistration;
import chat.rocket.android.realm_helper.RealmHelper;
import chat.rocket.persistence.realm.RealmHelper;
import chat.rocket.android.service.DDPClientRef;
public class PushSettingsObserver extends AbstractModelObserver<PublicSetting> {
......
......@@ -12,7 +12,7 @@ import chat.rocket.android.model.internal.GetUsersOfRoomsProcedure;
import chat.rocket.android.model.internal.LoadMessageProcedure;
import chat.rocket.android.model.internal.MethodCall;
import chat.rocket.android.model.internal.Session;
import chat.rocket.android.realm_helper.RealmHelper;
import chat.rocket.persistence.realm.RealmHelper;
import chat.rocket.android.service.DDPClientRef;
import chat.rocket.android.service.internal.StreamRoomMessageManager;
import hugo.weaving.DebugLog;
......
......@@ -8,7 +8,7 @@ import java.util.List;
import chat.rocket.android.api.MethodCallHelper;
import chat.rocket.android.helper.LogcatIfError;
import chat.rocket.android.model.internal.Session;
import chat.rocket.android.realm_helper.RealmHelper;
import chat.rocket.persistence.realm.RealmHelper;
import chat.rocket.android.service.DDPClientRef;
public class TokenLoginObserver extends AbstractModelObserver<Session> {
......
......@@ -3,7 +3,9 @@
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:theme="@style/AppTheme.Dark">
android:theme="@style/AppTheme.Dark"
android:visibility="invisible"
tools:visibility="visible">
<LinearLayout
android:id="@+id/user_info_container"
......
<manifest package="chat.rocket.persistence.realm"/>
\ No newline at end of file
package chat.rocket.android.realm_helper;
package chat.rocket.persistence.realm;
import io.realm.Realm;
import io.realm.RealmChangeListener;
......
package chat.rocket.android.realm_helper;
package chat.rocket.persistence.realm;
import android.content.Context;
import android.support.annotation.NonNull;
......
package chat.rocket.android.realm_helper;
package chat.rocket.persistence.realm;
import android.annotation.SuppressLint;
import android.content.Context;
......
package chat.rocket.android.realm_helper;
package chat.rocket.persistence.realm;
import io.realm.Realm;
import io.realm.RealmChangeListener;
......
package chat.rocket.android.realm_helper;
package chat.rocket.persistence.realm;
import android.content.Context;
import android.support.annotation.LayoutRes;
......
package chat.rocket.android.realm_helper;
package chat.rocket.persistence.realm;
import android.support.v7.widget.RecyclerView;
import android.view.View;
......
package chat.rocket.android.realm_helper;
package chat.rocket.persistence.realm;
import io.realm.Realm;
import io.realm.RealmChangeListener;
......
package chat.rocket.android.realm_helper;
package chat.rocket.persistence.realm;
import io.realm.Realm;
import io.realm.RealmConfiguration;
import java.util.HashMap;
......@@ -35,4 +36,14 @@ public class RealmStore {
}
return new RealmHelper(sStore.get(name));
}
public static Realm getRealm(String name) {
RealmHelper realmHelper = get(name);
if (realmHelper == null) {
return null;
}
return realmHelper.instance();
}
}
<manifest package="chat.rocket.android.realm_helper"/>
\ No newline at end of file
include ':app', ':android-ddp', ':rocket-chat-android-widgets', ':realm-helpers',
include ':app', ':android-ddp', ':rocket-chat-android-widgets', ':persistence-realm',
':log-wrapper'
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