Commit b5cf7b21 authored by Tiago Cunha's avatar Tiago Cunha Committed by GitHub

Merge pull request #198 from RocketChat/fix/un-realm-app-the-app

Un-Realm-app the app
parents bfc33f5f 70bb6778
apply plugin: 'com.android.application' apply plugin: 'com.android.application'
apply plugin: 'me.tatarka.retrolambda' apply plugin: 'me.tatarka.retrolambda'
apply plugin: 'realm-android'
apply plugin: 'com.jakewharton.hugo' apply plugin: 'com.jakewharton.hugo'
apply plugin: 'com.github.triplet.play' apply plugin: 'com.github.triplet.play'
apply from: '../config/quality/quality.gradle' apply from: '../config/quality/quality.gradle'
...@@ -85,8 +84,9 @@ play { ...@@ -85,8 +84,9 @@ play {
dependencies { dependencies {
compile project(':log-wrapper') compile project(':log-wrapper')
compile project(':android-ddp') compile project(':android-ddp')
compile project(':rocket-chat-core')
compile project(':rocket-chat-android-widgets') compile project(':rocket-chat-android-widgets')
compile project(':realm-helpers') compile project(':persistence-realm')
compile rootProject.ext.supportAppCompat compile rootProject.ext.supportAppCompat
compile rootProject.ext.supportDesign compile rootProject.ext.supportDesign
......
package chat.rocket.android;
import android.os.HandlerThread;
import android.os.Looper;
import android.os.Process;
public class BackgroundLooper {
private static HandlerThread handlerThread;
public static Looper get() {
if (handlerThread == null) {
handlerThread =
new HandlerThread("BackgroundHandlerThread", Process.THREAD_PRIORITY_BACKGROUND);
handlerThread.start();
}
return handlerThread.getLooper();
}
}
...@@ -3,16 +3,15 @@ package chat.rocket.android; ...@@ -3,16 +3,15 @@ package chat.rocket.android;
import android.support.multidex.MultiDexApplication; import android.support.multidex.MultiDexApplication;
import com.facebook.stetho.Stetho; import com.facebook.stetho.Stetho;
import com.uphyca.stetho_realm.RealmInspectorModulesProvider; import com.uphyca.stetho_realm.RealmInspectorModulesProvider;
import io.realm.Realm;
import io.realm.RealmConfiguration;
import java.util.List; import java.util.List;
import chat.rocket.android.helper.OkHttpHelper; 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.ConnectivityManager;
import chat.rocket.android.service.ServerInfo; import chat.rocket.core.models.ServerInfo;
import chat.rocket.android.widget.RocketChatWidgets; import chat.rocket.android.widget.RocketChatWidgets;
import chat.rocket.android.wrappers.InstabugWrapper; import chat.rocket.android.wrappers.InstabugWrapper;
import chat.rocket.persistence.realm.RocketChatPersistenceRealm;
/** /**
* Customized Application-class for Rocket.Chat * Customized Application-class for Rocket.Chat
...@@ -22,13 +21,11 @@ public class RocketChatApplication extends MultiDexApplication { ...@@ -22,13 +21,11 @@ public class RocketChatApplication extends MultiDexApplication {
public void onCreate() { public void onCreate() {
super.onCreate(); super.onCreate();
Realm.init(this); RocketChatPersistenceRealm.init(this);
Realm.setDefaultConfiguration(
new RealmConfiguration.Builder().deleteRealmIfMigrationNeeded().build());
List<ServerInfo> serverInfoList = ConnectivityManager.getInstance(this).getServerList(); List<ServerInfo> serverInfoList = ConnectivityManager.getInstance(this).getServerList();
for (ServerInfo serverInfo : serverInfoList) { for (ServerInfo serverInfo : serverInfoList) {
RealmStore.put(serverInfo.hostname); RealmStore.put(serverInfo.getHostname());
} }
Stetho.initialize(Stetho.newInitializerBuilder(this) Stetho.initialize(Stetho.newInitializerBuilder(this)
......
...@@ -8,12 +8,12 @@ import android.support.annotation.Nullable; ...@@ -8,12 +8,12 @@ import android.support.annotation.Nullable;
import java.util.List; import java.util.List;
import chat.rocket.android.LaunchUtil; import chat.rocket.android.LaunchUtil;
import chat.rocket.android.RocketChatCache; import chat.rocket.android.RocketChatCache;
import chat.rocket.android.model.ddp.RoomSubscription; import chat.rocket.persistence.realm.models.ddp.RealmRoom;
import chat.rocket.android.push.PushConstants; import chat.rocket.android.push.PushConstants;
import chat.rocket.android.push.PushNotificationHandler; 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.ConnectivityManager;
import chat.rocket.android.service.ServerInfo; import chat.rocket.core.models.ServerInfo;
import icepick.State; import icepick.State;
abstract class AbstractAuthedActivity extends AbstractFragmentActivity { abstract class AbstractAuthedActivity extends AbstractFragmentActivity {
...@@ -107,7 +107,7 @@ abstract class AbstractAuthedActivity extends AbstractFragmentActivity { ...@@ -107,7 +107,7 @@ abstract class AbstractAuthedActivity extends AbstractFragmentActivity {
// just connect to the first available // just connect to the first available
final ServerInfo serverInfo = serverInfoList.get(0); final ServerInfo serverInfo = serverInfoList.get(0);
prefs.edit() prefs.edit()
.putString(RocketChatCache.KEY_SELECTED_SERVER_HOSTNAME, serverInfo.hostname) .putString(RocketChatCache.KEY_SELECTED_SERVER_HOSTNAME, serverInfo.getHostname())
.remove(RocketChatCache.KEY_SELECTED_ROOM_ID) .remove(RocketChatCache.KEY_SELECTED_ROOM_ID)
.apply(); .apply();
} }
...@@ -130,8 +130,8 @@ abstract class AbstractAuthedActivity extends AbstractFragmentActivity { ...@@ -130,8 +130,8 @@ abstract class AbstractAuthedActivity extends AbstractFragmentActivity {
return false; return false;
} }
RoomSubscription room = RealmStore.get(hostname).executeTransactionForRead(realm -> RealmRoom room = RealmStore.get(hostname).executeTransactionForRead(realm ->
realm.where(RoomSubscription.class).equalTo(RoomSubscription.ROOM_ID, roomId).findFirst()); realm.where(RealmRoom.class).equalTo(RealmRoom.ROOM_ID, roomId).findFirst());
if (room == null) { if (room == null) {
prefs.edit() prefs.edit()
.remove(RocketChatCache.KEY_SELECTED_ROOM_ID) .remove(RocketChatCache.KEY_SELECTED_ROOM_ID)
......
...@@ -8,20 +8,17 @@ import android.support.v4.app.Fragment; ...@@ -8,20 +8,17 @@ import android.support.v4.app.Fragment;
import chat.rocket.android.R; import chat.rocket.android.R;
import chat.rocket.android.fragment.server_config.LoginFragment; import chat.rocket.android.fragment.server_config.LoginFragment;
import chat.rocket.android.fragment.server_config.RetryLoginFragment; import chat.rocket.android.fragment.server_config.RetryLoginFragment;
import chat.rocket.android.helper.TextUtils; import chat.rocket.core.interactors.SessionInteractor;
import chat.rocket.android.model.internal.Session;
import chat.rocket.android.realm_helper.RealmObjectObserver;
import chat.rocket.android.realm_helper.RealmStore;
import chat.rocket.android.service.ConnectivityManager; import chat.rocket.android.service.ConnectivityManager;
import chat.rocket.persistence.realm.repositories.RealmSessionRepository;
/** /**
* Activity for Login, Sign-up, and Retry connecting... * Activity for Login, Sign-up, and Retry connecting...
*/ */
public class LoginActivity extends AbstractFragmentActivity { public class LoginActivity extends AbstractFragmentActivity implements LoginContract.View {
public static final String KEY_HOSTNAME = "hostname"; public static final String KEY_HOSTNAME = "hostname";
private String hostname; private LoginContract.Presenter presenter;
private RealmObjectObserver<Session> sessionObserver;
@Override @Override
protected int getLayoutContainerForFragment() { protected int getLayoutContainerForFragment() {
...@@ -32,69 +29,38 @@ public class LoginActivity extends AbstractFragmentActivity { ...@@ -32,69 +29,38 @@ public class LoginActivity extends AbstractFragmentActivity {
protected void onCreate(@Nullable Bundle savedInstanceState) { protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
String hostname = null;
Intent intent = getIntent(); Intent intent = getIntent();
if (intent == null || intent.getExtras() == null) { if (intent != null && intent.getExtras() != null) {
finish(); hostname = intent.getStringExtra(KEY_HOSTNAME);
return;
} }
hostname = intent.getStringExtra(KEY_HOSTNAME); presenter = new LoginPresenter(
if (TextUtils.isEmpty(hostname)) { hostname,
finish(); new SessionInteractor(new RealmSessionRepository(hostname)),
return; ConnectivityManager.getInstance(getApplicationContext())
} );
sessionObserver = RealmStore.get(hostname)
.createObjectObserver(Session::queryDefaultSession)
.setOnUpdateListener(this::onRenderServerConfigSession);
setContentView(R.layout.simple_screen);
showFragment(new LoginFragment());
} }
@Override @Override
protected void onResume() { protected void onResume() {
super.onResume(); super.onResume();
ConnectivityManager.getInstance(getApplicationContext()).keepAliveServer(); presenter.bindView(this);
sessionObserver.sub();
} }
@Override @Override
protected void onDestroy() { protected void onDestroy() {
sessionObserver.unsub(); presenter.release();
super.onDestroy(); super.onDestroy();
} }
private void onRenderServerConfigSession(Session session) { private void showFragment(Fragment fragment, String hostname) {
if (session == null) { setContentView(R.layout.simple_screen);
return; injectHostnameArgTo(fragment, hostname);
}
final String token = session.getToken();
if (!TextUtils.isEmpty(token)) {
if (TextUtils.isEmpty(session.getError())) {
finish();
overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);
} else {
showFragment(new RetryLoginFragment());
}
return;
}
}
@Override
protected void showFragment(Fragment fragment) {
injectHostnameArgTo(fragment);
super.showFragment(fragment); super.showFragment(fragment);
} }
@Override private void injectHostnameArgTo(Fragment fragment, String hostname) {
protected void showFragmentWithBackStack(Fragment fragment) {
injectHostnameArgTo(fragment);
super.showFragmentWithBackStack(fragment);
}
private void injectHostnameArgTo(Fragment fragment) {
Bundle args = fragment.getArguments(); Bundle args = fragment.getArguments();
if (args == null) { if (args == null) {
args = new Bundle(); args = new Bundle();
...@@ -107,4 +73,20 @@ public class LoginActivity extends AbstractFragmentActivity { ...@@ -107,4 +73,20 @@ public class LoginActivity extends AbstractFragmentActivity {
protected void onBackPressedNotHandled() { protected void onBackPressedNotHandled() {
moveTaskToBack(true); moveTaskToBack(true);
} }
@Override
public void showLogin(String hostname) {
showFragment(new LoginFragment(), hostname);
}
@Override
public void showRetryLogin(String hostname) {
showFragment(new RetryLoginFragment(), hostname);
}
@Override
public void closeView() {
finish();
overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);
}
} }
package chat.rocket.android.activity;
import chat.rocket.android.shared.BaseContract;
public interface LoginContract {
interface View extends BaseContract.View {
void showLogin(String hostname);
void showRetryLogin(String hostname);
void closeView();
}
interface Presenter extends BaseContract.Presenter<View> {
}
}
package chat.rocket.android.activity;
import android.support.annotation.NonNull;
import chat.rocket.android.BackgroundLooper;
import chat.rocket.android.service.ConnectivityManagerApi;
import chat.rocket.android.shared.BasePresenter;
import chat.rocket.core.interactors.SessionInteractor;
import rx.Subscription;
import rx.android.schedulers.AndroidSchedulers;
public class LoginPresenter extends BasePresenter<LoginContract.View>
implements LoginContract.Presenter {
private final String hostname;
private final SessionInteractor sessionInteractor;
private final ConnectivityManagerApi connectivityManagerApi;
public LoginPresenter(String hostname,
SessionInteractor sessionInteractor,
ConnectivityManagerApi connectivityManagerApi) {
this.hostname = hostname;
this.sessionInteractor = sessionInteractor;
this.connectivityManagerApi = connectivityManagerApi;
}
@Override
public void bindView(@NonNull LoginContract.View view) {
super.bindView(view);
connectivityManagerApi.keepAliveServer();
if (hostname == null || hostname.length() == 0) {
view.closeView();
return;
}
loadSessionState();
}
private void loadSessionState() {
final Subscription subscription = sessionInteractor.getSessionState()
.distinctUntilChanged()
.subscribeOn(AndroidSchedulers.from(BackgroundLooper.get()))
.observeOn(AndroidSchedulers.mainThread())
.subscribe(state -> {
switch (state) {
case UNAVAILABLE:
view.showLogin(hostname);
break;
case INVALID:
view.showRetryLogin(hostname);
break;
case VALID:
view.closeView();
}
});
addSubscription(subscription);
}
}
...@@ -8,7 +8,6 @@ import android.support.v7.graphics.drawable.DrawerArrowDrawable; ...@@ -8,7 +8,6 @@ import android.support.v7.graphics.drawable.DrawerArrowDrawable;
import android.support.v7.widget.Toolbar; import android.support.v7.widget.Toolbar;
import android.view.View; import android.view.View;
import java.util.List;
import chat.rocket.android.LaunchUtil; import chat.rocket.android.LaunchUtil;
import chat.rocket.android.R; import chat.rocket.android.R;
import chat.rocket.android.api.MethodCallHelper; import chat.rocket.android.api.MethodCallHelper;
...@@ -16,28 +15,26 @@ import chat.rocket.android.fragment.chatroom.HomeFragment; ...@@ -16,28 +15,26 @@ import chat.rocket.android.fragment.chatroom.HomeFragment;
import chat.rocket.android.fragment.chatroom.RoomFragment; import chat.rocket.android.fragment.chatroom.RoomFragment;
import chat.rocket.android.fragment.sidebar.SidebarMainFragment; import chat.rocket.android.fragment.sidebar.SidebarMainFragment;
import chat.rocket.android.helper.LogcatIfError; import chat.rocket.android.helper.LogcatIfError;
import chat.rocket.android.helper.TextUtils; import chat.rocket.core.interactors.CanCreateRoomInteractor;
import chat.rocket.android.model.ddp.RoomSubscription; import chat.rocket.core.interactors.RoomInteractor;
import chat.rocket.android.model.ddp.User; import chat.rocket.core.interactors.SessionInteractor;
import chat.rocket.android.model.internal.Session; import chat.rocket.core.models.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.service.ConnectivityManager; import chat.rocket.android.service.ConnectivityManager;
import chat.rocket.android.widget.RoomToolbar; import chat.rocket.android.widget.RoomToolbar;
import chat.rocket.persistence.realm.repositories.RealmRoomRepository;
import chat.rocket.persistence.realm.repositories.RealmSessionRepository;
import chat.rocket.persistence.realm.repositories.RealmUserRepository;
import hugo.weaving.DebugLog; import hugo.weaving.DebugLog;
/** /**
* Entry-point for Rocket.Chat.Android application. * Entry-point for Rocket.Chat.Android application.
*/ */
public class MainActivity extends AbstractAuthedActivity { public class MainActivity extends AbstractAuthedActivity implements MainContract.View {
private RealmObjectObserver<Session> sessionObserver;
private RealmListObserver<RoomSubscription> unreadRoomSubscriptionObserver;
private boolean isForeground;
private StatusTicker statusTicker; private StatusTicker statusTicker;
private MainContract.Presenter presenter;
@Override @Override
protected int getLayoutContainerForFragment() { protected int getLayoutContainerForFragment() {
return R.id.activity_main_container; return R.id.activity_main_container;
...@@ -68,13 +65,19 @@ public class MainActivity extends AbstractAuthedActivity { ...@@ -68,13 +65,19 @@ public class MainActivity extends AbstractAuthedActivity {
@Override @Override
protected void onResume() { protected void onResume() {
isForeground = true;
super.onResume(); super.onResume();
if (presenter != null) {
presenter.bindView(this);
}
} }
@Override @Override
protected void onPause() { protected void onPause() {
isForeground = false; if (presenter != null) {
presenter.release();
}
super.onPause(); super.onPause();
} }
...@@ -162,127 +165,92 @@ public class MainActivity extends AbstractAuthedActivity { ...@@ -162,127 +165,92 @@ public class MainActivity extends AbstractAuthedActivity {
@Override @Override
protected void onHostnameUpdated() { protected void onHostnameUpdated() {
super.onHostnameUpdated(); super.onHostnameUpdated();
updateSessionObserver();
updateUnreadRoomSubscriptionObserver();
updateSidebarMainFragment();
}
private void updateSessionObserver() { if (presenter != null) {
if (sessionObserver != null) { presenter.release();
sessionObserver.unsub();
sessionObserver = null;
} }
if (hostname == null) { RoomInteractor roomInteractor = new RoomInteractor(new RealmRoomRepository(hostname));
return;
}
RealmHelper realmHelper = RealmStore.get(hostname); CanCreateRoomInteractor createRoomInteractor = new CanCreateRoomInteractor(
if (realmHelper == null) { new RealmUserRepository(hostname),
return; new SessionInteractor(new RealmSessionRepository(hostname))
} );
SessionInteractor sessionInteractor = new SessionInteractor(
new RealmSessionRepository(hostname)
);
presenter = new MainPresenter(
roomInteractor,
createRoomInteractor,
sessionInteractor
);
sessionObserver = realmHelper updateSidebarMainFragment();
.createObjectObserver(realm ->
Session.queryDefaultSession(realm)
.isNotNull(Session.TOKEN))
.setOnUpdateListener(this::onSessionChanged);
sessionObserver.sub();
} }
private void onSessionChanged(@Nullable Session session) { private void updateSidebarMainFragment() {
if (session == null) { getSupportFragmentManager().beginTransaction()
if (isForeground) { .replace(R.id.sidebar_fragment_container, SidebarMainFragment.create(hostname))
LaunchUtil.showLoginActivity(this, hostname); .commit();
}
statusTicker.updateStatus(StatusTicker.STATUS_DISMISS, null);
} else if (!TextUtils.isEmpty(session.getError())) {
statusTicker.updateStatus(StatusTicker.STATUS_CONNECTION_ERROR,
Snackbar.make(findViewById(getLayoutContainerForFragment()),
R.string.fragment_retry_login_error_title, Snackbar.LENGTH_INDEFINITE)
.setAction(R.string.fragment_retry_login_retry_title, view ->
Session.retryLogin(RealmStore.get(hostname))));
} else if (!session.isTokenVerified()) {
statusTicker.updateStatus(StatusTicker.STATUS_TOKEN_LOGIN,
Snackbar.make(findViewById(getLayoutContainerForFragment()),
R.string.server_config_activity_authenticating, Snackbar.LENGTH_INDEFINITE));
} else {
statusTicker.updateStatus(StatusTicker.STATUS_DISMISS, null);
}
} }
private void updateUnreadRoomSubscriptionObserver() { @Override
if (unreadRoomSubscriptionObserver != null) { protected void onRoomIdUpdated() {
unreadRoomSubscriptionObserver.unsub(); super.onRoomIdUpdated();
unreadRoomSubscriptionObserver = null; presenter.onOpenRoom(hostname, roomId);
} }
if (hostname == null) { @Override
return; protected boolean onBackPress() {
} return closeSidebarIfNeeded() || super.onBackPress();
}
RealmHelper realmHelper = RealmStore.get(hostname); @Override
if (realmHelper == null) { public void showHome() {
return; showFragment(new HomeFragment());
} }
unreadRoomSubscriptionObserver = realmHelper @Override
.createListObserver(realm -> public void showRoom(String hostname, String roomId) {
realm.where(RoomSubscription.class) showFragment(RoomFragment.create(hostname, roomId));
.equalTo(RoomSubscription.ALERT, true) closeSidebarIfNeeded();
.equalTo(RoomSubscription.OPEN, true)
.findAll())
.setOnUpdateListener(this::updateRoomToolbarUnreadCount);
unreadRoomSubscriptionObserver.sub();
} }
private void updateRoomToolbarUnreadCount(List<RoomSubscription> unreadRooms) { @Override
public void showUnreadCount(int roomsCount, int mentionsCount) {
RoomToolbar toolbar = (RoomToolbar) findViewById(R.id.activity_main_toolbar); RoomToolbar toolbar = (RoomToolbar) findViewById(R.id.activity_main_toolbar);
if (toolbar != null) { if (toolbar != null) {
//ref: Rocket.Chat:client/startup/unread.js toolbar.setUnreadBudge(roomsCount, mentionsCount);
final int numUnreadChannels = unreadRooms.size();
int numMentionsSum = 0;
for (RoomSubscription room : unreadRooms) {
numMentionsSum += room.getUnread();
}
toolbar.setUnreadBudge(numUnreadChannels, numMentionsSum);
} }
} }
private void updateSidebarMainFragment() { @Override
getSupportFragmentManager().beginTransaction() public void showLoginScreen() {
.replace(R.id.sidebar_fragment_container, SidebarMainFragment.create(hostname)) LaunchUtil.showLoginActivity(this, hostname);
.commit(); statusTicker.updateStatus(StatusTicker.STATUS_DISMISS, null);
} }
@Override @Override
protected void onRoomIdUpdated() { public void showConnectionError() {
super.onRoomIdUpdated(); statusTicker.updateStatus(StatusTicker.STATUS_CONNECTION_ERROR,
Snackbar.make(findViewById(getLayoutContainerForFragment()),
if (roomId != null && RoomFragment.canCreate(RealmStore.get(hostname))) { R.string.fragment_retry_login_error_title, Snackbar.LENGTH_INDEFINITE)
showFragment(RoomFragment.create(hostname, roomId)); .setAction(R.string.fragment_retry_login_retry_title, view ->
closeSidebarIfNeeded(); presenter.onRetryLogin()));
} else {
showFragment(new HomeFragment());
}
} }
@Override @Override
protected void onDestroy() { public void showConnecting() {
if (sessionObserver != null) { statusTicker.updateStatus(StatusTicker.STATUS_TOKEN_LOGIN,
sessionObserver.unsub(); Snackbar.make(findViewById(getLayoutContainerForFragment()),
sessionObserver = null; R.string.server_config_activity_authenticating, Snackbar.LENGTH_INDEFINITE));
}
if (unreadRoomSubscriptionObserver != null) {
unreadRoomSubscriptionObserver.unsub();
unreadRoomSubscriptionObserver = null;
}
super.onDestroy();
} }
@Override @Override
protected boolean onBackPress() { public void showConnectionOk() {
return closeSidebarIfNeeded() || super.onBackPress(); statusTicker.updateStatus(StatusTicker.STATUS_DISMISS, null);
} }
//TODO: consider this class to define in layouthelper for more complicated operation. //TODO: consider this class to define in layouthelper for more complicated operation.
......
package chat.rocket.android.activity;
import chat.rocket.android.shared.BaseContract;
public interface MainContract {
interface View extends BaseContract.View {
void showHome();
void showRoom(String hostname, String roomId);
void showUnreadCount(int roomsCount, int mentionsCount);
void showLoginScreen();
void showConnectionError();
void showConnecting();
void showConnectionOk();
}
interface Presenter extends BaseContract.Presenter<View> {
void onOpenRoom(String hostname, String roomId);
void onRetryLogin();
}
}
package chat.rocket.android.activity;
import android.support.annotation.NonNull;
import android.support.v4.util.Pair;
import chat.rocket.android.BackgroundLooper;
import chat.rocket.android.shared.BasePresenter;
import chat.rocket.core.interactors.CanCreateRoomInteractor;
import chat.rocket.core.interactors.RoomInteractor;
import chat.rocket.core.interactors.SessionInteractor;
import rx.Observable;
import rx.Subscription;
import rx.android.schedulers.AndroidSchedulers;
public class MainPresenter extends BasePresenter<MainContract.View>
implements MainContract.Presenter {
private final CanCreateRoomInteractor canCreateRoomInteractor;
private final RoomInteractor roomInteractor;
private final SessionInteractor sessionInteractor;
public MainPresenter(RoomInteractor roomInteractor,
CanCreateRoomInteractor canCreateRoomInteractor,
SessionInteractor sessionInteractor) {
this.roomInteractor = roomInteractor;
this.canCreateRoomInteractor = canCreateRoomInteractor;
this.sessionInteractor = sessionInteractor;
}
@Override
public void bindView(@NonNull MainContract.View view) {
super.bindView(view);
subscribeToUnreadCount();
subscribeToSession();
}
@Override
public void onOpenRoom(String hostname, String roomId) {
final Subscription subscription = canCreateRoomInteractor.canCreate(roomId)
.subscribeOn(AndroidSchedulers.from(BackgroundLooper.get()))
.observeOn(AndroidSchedulers.mainThread())
.subscribe(allowed -> {
if (allowed) {
view.showRoom(hostname, roomId);
} else {
view.showHome();
}
});
addSubscription(subscription);
}
@Override
public void onRetryLogin() {
final Subscription subscription = sessionInteractor.retryLogin()
.subscribe();
addSubscription(subscription);
}
private void subscribeToUnreadCount() {
final Subscription subscription = Observable.combineLatest(
roomInteractor.getTotalUnreadRoomsCount(),
roomInteractor.getTotalUnreadMentionsCount(),
(Pair::new)
)
.subscribeOn(AndroidSchedulers.from(BackgroundLooper.get()))
.observeOn(AndroidSchedulers.mainThread())
.subscribe(pair -> view.showUnreadCount(pair.first, pair.second));
addSubscription(subscription);
}
private void subscribeToSession() {
final Subscription subscription = sessionInteractor.getDefault()
.subscribeOn(AndroidSchedulers.from(BackgroundLooper.get()))
.observeOn(AndroidSchedulers.mainThread())
.subscribe(session -> {
if (session == null || session.getToken() == null) {
view.showLoginScreen();
return;
}
String error = session.getError();
if (error != null && error.length() != 0) {
view.showConnectionError();
return;
}
if (!session.isTokenVerified()) {
view.showConnecting();
return;
}
view.showConnectionOk();
});
addSubscription(subscription);
}
}
...@@ -6,7 +6,7 @@ import org.json.JSONObject; ...@@ -6,7 +6,7 @@ import org.json.JSONObject;
import bolts.Task; import bolts.Task;
import chat.rocket.android.helper.TextUtils; 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; import chat.rocket.android.service.DDPClientRef;
/** /**
......
...@@ -11,14 +11,15 @@ import bolts.Continuation; ...@@ -11,14 +11,15 @@ import bolts.Continuation;
import bolts.Task; import bolts.Task;
import chat.rocket.android.helper.CheckSum; import chat.rocket.android.helper.CheckSum;
import chat.rocket.android.helper.TextUtils; import chat.rocket.android.helper.TextUtils;
import chat.rocket.android.model.SyncState; import chat.rocket.android.service.ConnectivityManager;
import chat.rocket.android.model.ddp.Message; import chat.rocket.persistence.realm.models.ddp.RealmPublicSetting;
import chat.rocket.android.model.ddp.PublicSetting; import chat.rocket.core.SyncState;
import chat.rocket.android.model.ddp.RoomSubscription; import chat.rocket.persistence.realm.models.ddp.RealmMessage;
import chat.rocket.android.model.internal.MethodCall; import chat.rocket.persistence.realm.models.ddp.RealmRoom;
import chat.rocket.android.model.internal.Session; import chat.rocket.persistence.realm.models.internal.MethodCall;
import chat.rocket.android.realm_helper.RealmHelper; import chat.rocket.persistence.realm.models.internal.RealmSession;
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.service.DDPClientRef;
import chat.rocket.android_ddp.DDPClientCallback; import chat.rocket.android_ddp.DDPClientCallback;
import hugo.weaving.DebugLog; import hugo.weaving.DebugLog;
...@@ -43,7 +44,7 @@ public class MethodCallHelper { ...@@ -43,7 +44,7 @@ public class MethodCallHelper {
* initialize with Context and hostname. * initialize with Context and hostname.
*/ */
public MethodCallHelper(Context context, String hostname) { public MethodCallHelper(Context context, String hostname) {
this.context = context; this.context = context.getApplicationContext();
this.realmHelper = RealmStore.get(hostname); this.realmHelper = RealmStore.get(hostname);
ddpClientRef = null; ddpClientRef = null;
} }
...@@ -63,7 +64,12 @@ public class MethodCallHelper { ...@@ -63,7 +64,12 @@ public class MethodCallHelper {
return ddpClientRef.get().rpc(UUID.randomUUID().toString(), methodName, param, timeout) return ddpClientRef.get().rpc(UUID.randomUUID().toString(), methodName, param, timeout)
.onSuccessTask(task -> Task.forResult(task.getResult().result)); .onSuccessTask(task -> Task.forResult(task.getResult().result));
} else { } else {
return MethodCall.execute(context, realmHelper, methodName, param, timeout); return MethodCall.execute(realmHelper, methodName, param, timeout)
.onSuccessTask(task -> {
ConnectivityManager.getInstance(context.getApplicationContext())
.keepAliveServer();
return task;
});
} }
} }
...@@ -107,7 +113,7 @@ public class MethodCallHelper { ...@@ -107,7 +113,7 @@ public class MethodCallHelper {
} }
/** /**
* Register User. * Register RealmUser.
*/ */
public Task<String> registerUser(final String name, final String email, public Task<String> registerUser(final String name, final String email,
final String password, final String confirmPassword) { final String password, final String confirmPassword) {
...@@ -120,8 +126,8 @@ public class MethodCallHelper { ...@@ -120,8 +126,8 @@ public class MethodCallHelper {
private Task<Void> saveToken(Task<String> task) { private Task<Void> saveToken(Task<String> task) {
return realmHelper.executeTransaction(realm -> return realmHelper.executeTransaction(realm ->
realm.createOrUpdateObjectFromJson(Session.class, new JSONObject() realm.createOrUpdateObjectFromJson(RealmSession.class, new JSONObject()
.put("sessionId", Session.DEFAULT_ID) .put("sessionId", RealmSession.DEFAULT_ID)
.put("token", task.getResult()) .put("token", task.getResult())
.put("tokenVerified", true) .put("tokenVerified", true)
.put("error", JSONObject.NULL) .put("error", JSONObject.NULL)
...@@ -185,7 +191,7 @@ public class MethodCallHelper { ...@@ -185,7 +191,7 @@ public class MethodCallHelper {
.onSuccessTask(this::saveToken) .onSuccessTask(this::saveToken)
.continueWithTask(task -> { .continueWithTask(task -> {
if (task.isFaulted()) { if (task.isFaulted()) {
Session.logError(realmHelper, task.getError()); RealmSession.logError(realmHelper, task.getError());
} }
return task; return task;
}); });
...@@ -197,7 +203,7 @@ public class MethodCallHelper { ...@@ -197,7 +203,7 @@ public class MethodCallHelper {
public Task<Void> logout() { public Task<Void> logout() {
return call("logout", TIMEOUT_MS).onSuccessTask(task -> return call("logout", TIMEOUT_MS).onSuccessTask(task ->
realmHelper.executeTransaction(realm -> { realmHelper.executeTransaction(realm -> {
realm.delete(Session.class); realm.delete(RealmSession.class);
return null; return null;
})); }));
} }
...@@ -211,13 +217,13 @@ public class MethodCallHelper { ...@@ -211,13 +217,13 @@ public class MethodCallHelper {
final JSONArray result = task.getResult(); final JSONArray result = task.getResult();
try { try {
for (int i = 0; i < result.length(); i++) { for (int i = 0; i < result.length(); i++) {
RoomSubscription.customizeJson(result.getJSONObject(i)); RealmRoom.customizeJson(result.getJSONObject(i));
} }
return realmHelper.executeTransaction(realm -> { return realmHelper.executeTransaction(realm -> {
realm.delete(RoomSubscription.class); realm.delete(RealmRoom.class);
realm.createOrUpdateAllFromJson( realm.createOrUpdateAllFromJson(
RoomSubscription.class, result); RealmRoom.class, result);
return null; return null;
}); });
} catch (JSONException exception) { } catch (JSONException exception) {
...@@ -241,18 +247,18 @@ public class MethodCallHelper { ...@@ -241,18 +247,18 @@ public class MethodCallHelper {
JSONObject result = task.getResult(); JSONObject result = task.getResult();
final JSONArray messages = result.getJSONArray("messages"); final JSONArray messages = result.getJSONArray("messages");
for (int i = 0; i < messages.length(); i++) { for (int i = 0; i < messages.length(); i++) {
Message.customizeJson(messages.getJSONObject(i)); RealmMessage.customizeJson(messages.getJSONObject(i));
} }
return realmHelper.executeTransaction(realm -> { return realmHelper.executeTransaction(realm -> {
if (timestamp == 0) { if (timestamp == 0) {
realm.where(Message.class) realm.where(RealmMessage.class)
.equalTo("rid", roomId) .equalTo("rid", roomId)
.equalTo("syncstate", SyncState.SYNCED) .equalTo("syncstate", SyncState.SYNCED)
.findAll().deleteAllFromRealm(); .findAll().deleteAllFromRealm();
} }
if (messages.length() > 0) { if (messages.length() > 0) {
realm.createOrUpdateAllFromJson(Message.class, messages); realm.createOrUpdateAllFromJson(RealmMessage.class, messages);
} }
return null; return null;
}).onSuccessTask(_task -> Task.forResult(messages)); }).onSuccessTask(_task -> Task.forResult(messages));
...@@ -334,12 +340,12 @@ public class MethodCallHelper { ...@@ -334,12 +340,12 @@ public class MethodCallHelper {
.onSuccessTask(task -> { .onSuccessTask(task -> {
final JSONArray settings = task.getResult(); final JSONArray settings = task.getResult();
for (int i = 0; i < settings.length(); i++) { for (int i = 0; i < settings.length(); i++) {
PublicSetting.customizeJson(settings.getJSONObject(i)); RealmPublicSetting.customizeJson(settings.getJSONObject(i));
} }
return realmHelper.executeTransaction(realm -> { return realmHelper.executeTransaction(realm -> {
realm.delete(PublicSetting.class); realm.delete(RealmPublicSetting.class);
realm.createOrUpdateAllFromJson(PublicSetting.class, settings); realm.createOrUpdateAllFromJson(RealmPublicSetting.class, settings);
return null; return null;
}); });
}); });
......
...@@ -7,7 +7,7 @@ import org.json.JSONArray; ...@@ -7,7 +7,7 @@ import org.json.JSONArray;
import org.json.JSONObject; import org.json.JSONObject;
import bolts.Task; import bolts.Task;
import chat.rocket.android.realm_helper.RealmHelper; import chat.rocket.persistence.realm.RealmHelper;
import chat.rocket.android.service.DDPClientRef; import chat.rocket.android.service.DDPClientRef;
public class RaixPushHelper extends MethodCallHelper { public class RaixPushHelper extends MethodCallHelper {
......
...@@ -3,10 +3,10 @@ package chat.rocket.android.api.rest; ...@@ -3,10 +3,10 @@ package chat.rocket.android.api.rest;
import android.content.Context; import android.content.Context;
import chat.rocket.android.RocketChatCache; import chat.rocket.android.RocketChatCache;
import chat.rocket.android.model.ddp.User; import chat.rocket.persistence.realm.models.ddp.RealmUser;
import chat.rocket.android.model.internal.Session; import chat.rocket.persistence.realm.models.internal.RealmSession;
import chat.rocket.android.realm_helper.RealmHelper; import chat.rocket.persistence.realm.RealmHelper;
import chat.rocket.android.realm_helper.RealmStore; import chat.rocket.persistence.realm.RealmStore;
public class DefaultCookieProvider implements CookieProvider { public class DefaultCookieProvider implements CookieProvider {
...@@ -33,10 +33,10 @@ public class DefaultCookieProvider implements CookieProvider { ...@@ -33,10 +33,10 @@ public class DefaultCookieProvider implements CookieProvider {
return ""; return "";
} }
final User user = realmHelper.executeTransactionForRead(realm -> final RealmUser user = realmHelper.executeTransactionForRead(realm ->
User.queryCurrentUser(realm).findFirst()); RealmUser.queryCurrentUser(realm).findFirst());
final Session session = realmHelper.executeTransactionForRead(realm -> final RealmSession session = realmHelper.executeTransactionForRead(realm ->
Session.queryDefaultSession(realm).findFirst()); RealmSession.queryDefaultSession(realm).findFirst());
if (user == null || session == null) { if (user == null || session == null) {
return ""; return "";
......
...@@ -104,6 +104,4 @@ public abstract class AbstractWebViewFragment extends AbstractFragment ...@@ -104,6 +104,4 @@ public abstract class AbstractWebViewFragment extends AbstractFragment
protected boolean onHandleCallback(WebView webview, String url) { protected boolean onHandleCallback(WebView webview, String url) {
return false; return false;
} }
;
} }
package chat.rocket.android.fragment.add_server;
import chat.rocket.android.shared.BaseContract;
public interface InputHostnameContract {
interface View extends BaseContract.View {
void showLoader();
void hideLoader();
void showInvalidServerError();
void showConnectionError();
void showHome();
}
interface Presenter extends BaseContract.Presenter<View> {
void connectTo(String hostname);
}
}
package chat.rocket.android.fragment.add_server; 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.support.design.widget.Snackbar;
import android.view.View;
import android.widget.TextView; import android.widget.TextView;
import chat.rocket.android.BuildConfig; import chat.rocket.android.BuildConfig;
import chat.rocket.android.LaunchUtil; import chat.rocket.android.LaunchUtil;
import chat.rocket.android.R; import chat.rocket.android.R;
import chat.rocket.android.RocketChatCache; import chat.rocket.android.RocketChatCache;
import chat.rocket.android.api.rest.DefaultServerPolicyApi;
import chat.rocket.android.api.rest.ServerPolicyApi;
import chat.rocket.android.fragment.AbstractFragment; 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.helper.TextUtils;
import chat.rocket.android.service.ConnectivityManager; 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. * Input server host.
*/ */
public class InputHostnameFragment extends AbstractFragment { public class InputHostnameFragment extends AbstractFragment implements InputHostnameContract.View {
Subscription serverPolicySubscription;
private InputHostnameContract.Presenter presenter;
public InputHostnameFragment() { 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 @Override
protected int getLayout() { protected int getLayout() {
return R.layout.fragment_input_hostname; return R.layout.fragment_input_hostname;
...@@ -47,42 +54,18 @@ public class InputHostnameFragment extends AbstractFragment { ...@@ -47,42 +54,18 @@ public class InputHostnameFragment extends AbstractFragment {
} }
private void handleConnect() { private void handleConnect() {
final String hostname = ServerPolicyHelper.enforceHostname(getHostname()); presenter.connectTo(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);
serverPolicySubscription = ServerPolicyHelper.isApiVersionValid(validationHelper) @Override
.subscribeOn(Schedulers.io()) public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
.observeOn(AndroidSchedulers.mainThread()) super.onViewCreated(view, savedInstanceState);
.doOnTerminate(() -> rootView.findViewById(R.id.btn_connect).setEnabled(true)) presenter.bindView(this);
.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 @Override
public void onDestroyView() { public void onDestroyView() {
if (serverPolicySubscription != null) { presenter.release();
serverPolicySubscription.unsubscribe();
}
super.onDestroyView(); super.onDestroyView();
} }
...@@ -92,21 +75,33 @@ public class InputHostnameFragment extends AbstractFragment { ...@@ -92,21 +75,33 @@ public class InputHostnameFragment extends AbstractFragment {
return TextUtils.or(TextUtils.or(editor.getText(), editor.getHint()), "").toString(); return TextUtils.or(TextUtils.or(editor.getText(), editor.getHint()), "").toString();
} }
private void onServerValid(final String hostname, boolean usesSecureConnection) { private void showError(String errString) {
RocketChatCache.get(getContext()).edit() Snackbar.make(rootView, errString, Snackbar.LENGTH_LONG).show();
.putString(RocketChatCache.KEY_SELECTED_SERVER_HOSTNAME, hostname) }
.apply();
ConnectivityManagerApi connectivityManager = @Override
ConnectivityManager.getInstance(getContext().getApplicationContext()); public void showLoader() {
connectivityManager.addOrUpdateServer(hostname, hostname, !usesSecureConnection); rootView.findViewById(R.id.btn_connect).setEnabled(false);
connectivityManager.keepAliveServer(); }
LaunchUtil.showMainActivity(getContext()); @Override
getActivity().overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out); public void hideLoader() {
rootView.findViewById(R.id.btn_connect).setEnabled(true);
} }
private void showError(String errString) { @Override
Snackbar.make(rootView, errString, Snackbar.LENGTH_LONG).show(); 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 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 chat.rocket.android.shared.BasePresenter;
import rx.Subscription;
import rx.android.schedulers.AndroidSchedulers;
import rx.schedulers.Schedulers;
public class InputHostnamePresenter extends BasePresenter<InputHostnameContract.View>
implements InputHostnameContract.Presenter {
private final SharedPreferences rocketChatCache;
private final ConnectivityManagerApi connectivityManager;
public InputHostnamePresenter(SharedPreferences rocketChatCache,
ConnectivityManagerApi connectivityManager) {
this.rocketChatCache = rocketChatCache;
this.connectivityManager = connectivityManager;
}
@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);
clearSubscripions();
final Subscription subscription = 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();
});
addSubscription(subscription);
}
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();
}
}
package chat.rocket.android.fragment.chatroom;
import android.support.annotation.Nullable;
import java.util.List;
import chat.rocket.android.shared.BaseContract;
import chat.rocket.core.models.Message;
import chat.rocket.core.models.Room;
public interface RoomContract {
interface View extends BaseContract.View {
void render(Room room);
void updateHistoryState(boolean hasNext, boolean isLoaded);
void onMessageSendSuccessfully();
void showUnreadCount(int count);
void showMessages(List<Message> messages);
void showMessageSendFailure(Message message);
}
interface Presenter extends BaseContract.Presenter<View> {
void loadMessages();
void loadMoreMessages();
void onMessageSelected(@Nullable Message message);
void sendMessage(String messageText);
void resendMessage(Message message);
void deleteMessage(Message message);
void onUnreadCount();
void onMarkAsRead();
}
}
package chat.rocket.android.fragment.chatroom;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.util.Pair;
import chat.rocket.android.BackgroundLooper;
import chat.rocket.android.api.MethodCallHelper;
import chat.rocket.android.helper.LogcatIfError;
import chat.rocket.android.shared.BasePresenter;
import chat.rocket.core.SyncState;
import chat.rocket.core.interactors.MessageInteractor;
import chat.rocket.core.models.Message;
import chat.rocket.core.models.Room;
import chat.rocket.core.models.User;
import chat.rocket.core.repositories.RoomRepository;
import chat.rocket.core.repositories.UserRepository;
import chat.rocket.android.service.ConnectivityManagerApi;
import rx.Single;
import rx.Subscription;
import rx.android.schedulers.AndroidSchedulers;
public class RoomPresenter extends BasePresenter<RoomContract.View>
implements RoomContract.Presenter {
private final String roomId;
private final MessageInteractor messageInteractor;
private final UserRepository userRepository;
private final RoomRepository roomRepository;
private final MethodCallHelper methodCallHelper;
private final ConnectivityManagerApi connectivityManagerApi;
public RoomPresenter(String roomId,
UserRepository userRepository,
MessageInteractor messageInteractor,
RoomRepository roomRepository,
MethodCallHelper methodCallHelper,
ConnectivityManagerApi connectivityManagerApi) {
this.roomId = roomId;
this.userRepository = userRepository;
this.messageInteractor = messageInteractor;
this.roomRepository = roomRepository;
this.methodCallHelper = methodCallHelper;
this.connectivityManagerApi = connectivityManagerApi;
}
@Override
public void bindView(@NonNull RoomContract.View view) {
super.bindView(view);
getRoomInfo();
getRoomHistoryStateInfo();
getMessages();
}
@Override
public void loadMessages() {
final Subscription subscription = getSingleRoom()
.flatMap(messageInteractor::loadMessages)
.subscribeOn(AndroidSchedulers.from(BackgroundLooper.get()))
.observeOn(AndroidSchedulers.mainThread())
.subscribe(success -> {
if (success) {
connectivityManagerApi.keepAliveServer();
}
});
addSubscription(subscription);
}
@Override
public void loadMoreMessages() {
final Subscription subscription = getSingleRoom()
.flatMap(messageInteractor::loadMoreMessages)
.subscribeOn(AndroidSchedulers.from(BackgroundLooper.get()))
.observeOn(AndroidSchedulers.mainThread())
.subscribe(success -> {
if (success) {
connectivityManagerApi.keepAliveServer();
}
});
addSubscription(subscription);
}
@Override
public void onMessageSelected(@Nullable Message message) {
if (message == null) {
return;
}
if (message.getSyncState() == SyncState.FAILED) {
view.showMessageSendFailure(message);
}
}
@Override
public void sendMessage(String messageText) {
final Subscription subscription = getRoomUserPair()
.flatMap(pair -> messageInteractor.send(pair.first, pair.second, messageText))
.subscribeOn(AndroidSchedulers.from(BackgroundLooper.get()))
.observeOn(AndroidSchedulers.mainThread())
.subscribe(success -> {
if (success) {
view.onMessageSendSuccessfully();
}
});
addSubscription(subscription);
}
@Override
public void resendMessage(Message message) {
final Subscription subscription = messageInteractor.resend(message)
.subscribeOn(AndroidSchedulers.from(BackgroundLooper.get()))
.observeOn(AndroidSchedulers.mainThread())
.subscribe();
addSubscription(subscription);
}
@Override
public void deleteMessage(Message message) {
final Subscription subscription = messageInteractor.delete(message)
.subscribeOn(AndroidSchedulers.from(BackgroundLooper.get()))
.observeOn(AndroidSchedulers.mainThread())
.subscribe();
addSubscription(subscription);
}
@Override
public void onUnreadCount() {
final Subscription subscription = getRoomUserPair()
.flatMap(roomUserPair -> messageInteractor
.unreadCountFor(roomUserPair.first, roomUserPair.second))
.subscribeOn(AndroidSchedulers.from(BackgroundLooper.get()))
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
count -> view.showUnreadCount(count)
);
addSubscription(subscription);
}
@Override
public void onMarkAsRead() {
final Subscription subscription = roomRepository.getById(roomId)
.first()
.filter(room -> room != null && room.isAlert())
.subscribeOn(AndroidSchedulers.from(BackgroundLooper.get()))
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
room -> methodCallHelper.readMessages(room.getRoomId())
.continueWith(new LogcatIfError())
);
addSubscription(subscription);
}
private void getRoomInfo() {
final Subscription subscription = roomRepository.getById(roomId)
.distinctUntilChanged()
.subscribeOn(AndroidSchedulers.from(BackgroundLooper.get()))
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
room -> view.render(room)
);
addSubscription(subscription);
}
private void getRoomHistoryStateInfo() {
final Subscription subscription = roomRepository.getHistoryStateByRoomId(roomId)
.distinctUntilChanged()
.subscribeOn(AndroidSchedulers.from(BackgroundLooper.get()))
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
roomHistoryState -> {
int syncState = roomHistoryState.getSyncState();
view.updateHistoryState(
!roomHistoryState.isComplete(),
syncState == SyncState.SYNCED || syncState == SyncState.FAILED
);
}
);
addSubscription(subscription);
}
private void getMessages() {
final Subscription subscription = roomRepository.getById(roomId)
.first()
.flatMap(messageInteractor::getAllFrom)
.subscribeOn(AndroidSchedulers.from(BackgroundLooper.get()))
.observeOn(AndroidSchedulers.mainThread())
.subscribe(messages -> view.showMessages(messages));
addSubscription(subscription);
}
private Single<Pair<Room, User>> getRoomUserPair() {
return Single.zip(
getSingleRoom(),
userRepository.getCurrent()
.filter(user -> user != null)
.first()
.toSingle(),
Pair::new
);
}
private Single<Room> getSingleRoom() {
return roomRepository.getById(roomId)
.first()
.toSingle();
}
}
...@@ -7,8 +7,8 @@ import android.support.annotation.NonNull; ...@@ -7,8 +7,8 @@ import android.support.annotation.NonNull;
import android.support.annotation.Nullable; import android.support.annotation.Nullable;
import android.support.design.widget.BottomSheetDialogFragment; import android.support.design.widget.BottomSheetDialogFragment;
import chat.rocket.android.realm_helper.RealmHelper; import chat.rocket.persistence.realm.RealmHelper;
import chat.rocket.android.realm_helper.RealmStore; import chat.rocket.persistence.realm.RealmStore;
abstract class AbstractChatRoomDialogFragment extends BottomSheetDialogFragment { abstract class AbstractChatRoomDialogFragment extends BottomSheetDialogFragment {
......
...@@ -9,9 +9,9 @@ import android.widget.TextView; ...@@ -9,9 +9,9 @@ import android.widget.TextView;
import android.widget.Toast; import android.widget.Toast;
import chat.rocket.android.R; import chat.rocket.android.R;
import chat.rocket.android.model.SyncState; import chat.rocket.core.SyncState;
import chat.rocket.android.model.internal.FileUploading; import chat.rocket.persistence.realm.models.internal.FileUploading;
import chat.rocket.android.realm_helper.RealmObjectObserver; import chat.rocket.persistence.realm.RealmObjectObserver;
import chat.rocket.android.renderer.FileUploadingRenderer; import chat.rocket.android.renderer.FileUploadingRenderer;
/** /**
......
...@@ -17,9 +17,9 @@ import chat.rocket.android.R; ...@@ -17,9 +17,9 @@ import chat.rocket.android.R;
import chat.rocket.android.helper.LogcatIfError; import chat.rocket.android.helper.LogcatIfError;
import chat.rocket.android.layouthelper.chatroom.dialog.RoomUserAdapter; import chat.rocket.android.layouthelper.chatroom.dialog.RoomUserAdapter;
import chat.rocket.android.log.RCLog; import chat.rocket.android.log.RCLog;
import chat.rocket.android.model.SyncState; import chat.rocket.core.SyncState;
import chat.rocket.android.model.internal.GetUsersOfRoomsProcedure; import chat.rocket.persistence.realm.models.internal.GetUsersOfRoomsProcedure;
import chat.rocket.android.realm_helper.RealmObjectObserver; import chat.rocket.persistence.realm.RealmObjectObserver;
import chat.rocket.android.service.ConnectivityManager; import chat.rocket.android.service.ConnectivityManager;
/** /**
......
...@@ -14,8 +14,8 @@ import chat.rocket.android.api.MethodCallHelper; ...@@ -14,8 +14,8 @@ import chat.rocket.android.api.MethodCallHelper;
import chat.rocket.android.fragment.AbstractWebViewFragment; import chat.rocket.android.fragment.AbstractWebViewFragment;
import chat.rocket.android.helper.LogcatIfError; import chat.rocket.android.helper.LogcatIfError;
import chat.rocket.android.log.RCLog; import chat.rocket.android.log.RCLog;
import chat.rocket.android.model.ddp.MeteorLoginServiceConfiguration; import chat.rocket.persistence.realm.models.ddp.RealmMeteorLoginServiceConfiguration;
import chat.rocket.android.realm_helper.RealmStore; import chat.rocket.persistence.realm.RealmStore;
public abstract class AbstractOAuthFragment extends AbstractWebViewFragment { public abstract class AbstractOAuthFragment extends AbstractWebViewFragment {
...@@ -25,7 +25,7 @@ public abstract class AbstractOAuthFragment extends AbstractWebViewFragment { ...@@ -25,7 +25,7 @@ public abstract class AbstractOAuthFragment extends AbstractWebViewFragment {
protected abstract String getOAuthServiceName(); protected abstract String getOAuthServiceName();
protected abstract String generateURL(MeteorLoginServiceConfiguration oauthConfig); protected abstract String generateURL(RealmMeteorLoginServiceConfiguration oauthConfig);
private boolean hasValidArgs(Bundle args) { private boolean hasValidArgs(Bundle args) {
return args != null return args != null
...@@ -54,10 +54,10 @@ public abstract class AbstractOAuthFragment extends AbstractWebViewFragment { ...@@ -54,10 +54,10 @@ public abstract class AbstractOAuthFragment extends AbstractWebViewFragment {
} }
hostname = args.getString("hostname"); hostname = args.getString("hostname");
MeteorLoginServiceConfiguration oauthConfig = RealmMeteorLoginServiceConfiguration oauthConfig =
RealmStore.get(hostname).executeTransactionForRead(realm -> RealmStore.get(hostname).executeTransactionForRead(realm ->
realm.where(MeteorLoginServiceConfiguration.class) realm.where(RealmMeteorLoginServiceConfiguration.class)
.equalTo(MeteorLoginServiceConfiguration.SERVICE, getOAuthServiceName()) .equalTo(RealmMeteorLoginServiceConfiguration.SERVICE, getOAuthServiceName())
.findFirst()); .findFirst());
if (oauthConfig == null) { if (oauthConfig == null) {
throw new IllegalArgumentException( throw new IllegalArgumentException(
......
package chat.rocket.android.fragment.oauth; package chat.rocket.android.fragment.oauth;
import chat.rocket.android.model.ddp.MeteorLoginServiceConfiguration; import chat.rocket.persistence.realm.models.ddp.RealmMeteorLoginServiceConfiguration;
import okhttp3.HttpUrl; import okhttp3.HttpUrl;
public class FacebookOAuthFragment extends AbstractOAuthFragment { public class FacebookOAuthFragment extends AbstractOAuthFragment {
...@@ -11,7 +11,7 @@ public class FacebookOAuthFragment extends AbstractOAuthFragment { ...@@ -11,7 +11,7 @@ public class FacebookOAuthFragment extends AbstractOAuthFragment {
} }
@Override @Override
protected String generateURL(MeteorLoginServiceConfiguration oauthConfig) { protected String generateURL(RealmMeteorLoginServiceConfiguration oauthConfig) {
return new HttpUrl.Builder().scheme("https") return new HttpUrl.Builder().scheme("https")
.host("www.facebook.com") .host("www.facebook.com")
.addPathSegment("v2.2") .addPathSegment("v2.2")
......
package chat.rocket.android.fragment.oauth; package chat.rocket.android.fragment.oauth;
import chat.rocket.android.model.ddp.MeteorLoginServiceConfiguration; import chat.rocket.persistence.realm.models.ddp.RealmMeteorLoginServiceConfiguration;
import okhttp3.HttpUrl; import okhttp3.HttpUrl;
public class GitHubOAuthFragment extends AbstractOAuthFragment { public class GitHubOAuthFragment extends AbstractOAuthFragment {
...@@ -11,7 +11,7 @@ public class GitHubOAuthFragment extends AbstractOAuthFragment { ...@@ -11,7 +11,7 @@ public class GitHubOAuthFragment extends AbstractOAuthFragment {
} }
@Override @Override
protected String generateURL(MeteorLoginServiceConfiguration oauthConfig) { protected String generateURL(RealmMeteorLoginServiceConfiguration oauthConfig) {
return new HttpUrl.Builder().scheme("https") return new HttpUrl.Builder().scheme("https")
.host("github.com") .host("github.com")
.addPathSegment("login") .addPathSegment("login")
......
package chat.rocket.android.fragment.oauth; package chat.rocket.android.fragment.oauth;
import chat.rocket.android.model.ddp.MeteorLoginServiceConfiguration; import chat.rocket.persistence.realm.models.ddp.RealmMeteorLoginServiceConfiguration;
import okhttp3.HttpUrl; import okhttp3.HttpUrl;
public class GoogleOAuthFragment extends AbstractOAuthFragment { public class GoogleOAuthFragment extends AbstractOAuthFragment {
...@@ -11,7 +11,7 @@ public class GoogleOAuthFragment extends AbstractOAuthFragment { ...@@ -11,7 +11,7 @@ public class GoogleOAuthFragment extends AbstractOAuthFragment {
} }
@Override @Override
protected String generateURL(MeteorLoginServiceConfiguration oauthConfig) { protected String generateURL(RealmMeteorLoginServiceConfiguration oauthConfig) {
return new HttpUrl.Builder().scheme("https") return new HttpUrl.Builder().scheme("https")
.host("accounts.google.com") .host("accounts.google.com")
.addPathSegment("o") .addPathSegment("o")
......
package chat.rocket.android.fragment.oauth; package chat.rocket.android.fragment.oauth;
import chat.rocket.android.model.ddp.MeteorLoginServiceConfiguration; import chat.rocket.persistence.realm.models.ddp.RealmMeteorLoginServiceConfiguration;
public class TwitterOAuthFragment extends AbstractOAuthFragment { public class TwitterOAuthFragment extends AbstractOAuthFragment {
...@@ -10,7 +10,7 @@ public class TwitterOAuthFragment extends AbstractOAuthFragment { ...@@ -10,7 +10,7 @@ public class TwitterOAuthFragment extends AbstractOAuthFragment {
} }
@Override @Override
protected String generateURL(MeteorLoginServiceConfiguration oauthConfig) { protected String generateURL(RealmMeteorLoginServiceConfiguration oauthConfig) {
return "https://" + hostname + "/_oauth/twitter/" return "https://" + hostname + "/_oauth/twitter/"
+ "?requestTokenAndRedirect=true&state=" + getStateString(); + "?requestTokenAndRedirect=true&state=" + getStateString();
} }
......
...@@ -14,15 +14,15 @@ import chat.rocket.android.api.MethodCallHelper; ...@@ -14,15 +14,15 @@ import chat.rocket.android.api.MethodCallHelper;
import chat.rocket.android.helper.TextUtils; import chat.rocket.android.helper.TextUtils;
import chat.rocket.android.layouthelper.oauth.OAuthProviderInfo; import chat.rocket.android.layouthelper.oauth.OAuthProviderInfo;
import chat.rocket.android.log.RCLog; import chat.rocket.android.log.RCLog;
import chat.rocket.android.model.ddp.MeteorLoginServiceConfiguration; import chat.rocket.persistence.realm.models.ddp.RealmMeteorLoginServiceConfiguration;
import chat.rocket.android.realm_helper.RealmListObserver; import chat.rocket.persistence.realm.RealmListObserver;
import chat.rocket.android.realm_helper.RealmStore; import chat.rocket.persistence.realm.RealmStore;
/** /**
* Login screen. * Login screen.
*/ */
public class LoginFragment extends AbstractServerConfigFragment { public class LoginFragment extends AbstractServerConfigFragment {
private RealmListObserver<MeteorLoginServiceConfiguration> authProvidersObserver; private RealmListObserver<RealmMeteorLoginServiceConfiguration> authProvidersObserver;
@Override @Override
protected int getLayout() { protected int getLayout() {
...@@ -33,7 +33,7 @@ public class LoginFragment extends AbstractServerConfigFragment { ...@@ -33,7 +33,7 @@ public class LoginFragment extends AbstractServerConfigFragment {
public void onCreate(@Nullable Bundle savedInstanceState) { public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
authProvidersObserver = RealmStore.get(hostname) authProvidersObserver = RealmStore.get(hostname)
.createListObserver(realm -> realm.where(MeteorLoginServiceConfiguration.class).findAll()) .createListObserver(realm -> realm.where(RealmMeteorLoginServiceConfiguration.class).findAll())
.setOnUpdateListener(this::onRenderAuthProviders); .setOnUpdateListener(this::onRenderAuthProviders);
} }
...@@ -74,7 +74,7 @@ public class LoginFragment extends AbstractServerConfigFragment { ...@@ -74,7 +74,7 @@ public class LoginFragment extends AbstractServerConfigFragment {
Snackbar.make(rootView, errString, Snackbar.LENGTH_SHORT).show(); Snackbar.make(rootView, errString, Snackbar.LENGTH_SHORT).show();
} }
private void onRenderAuthProviders(List<MeteorLoginServiceConfiguration> authProviders) { private void onRenderAuthProviders(List<RealmMeteorLoginServiceConfiguration> authProviders) {
HashMap<String, View> viewMap = new HashMap<>(); HashMap<String, View> viewMap = new HashMap<>();
HashMap<String, Boolean> supportedMap = new HashMap<>(); HashMap<String, Boolean> supportedMap = new HashMap<>();
for (OAuthProviderInfo info : OAuthProviderInfo.LIST) { for (OAuthProviderInfo info : OAuthProviderInfo.LIST) {
...@@ -82,7 +82,7 @@ public class LoginFragment extends AbstractServerConfigFragment { ...@@ -82,7 +82,7 @@ public class LoginFragment extends AbstractServerConfigFragment {
supportedMap.put(info.serviceName, false); supportedMap.put(info.serviceName, false);
} }
for (MeteorLoginServiceConfiguration authProvider : authProviders) { for (RealmMeteorLoginServiceConfiguration authProvider : authProviders) {
for (OAuthProviderInfo info : OAuthProviderInfo.LIST) { for (OAuthProviderInfo info : OAuthProviderInfo.LIST) {
if (!supportedMap.get(info.serviceName) if (!supportedMap.get(info.serviceName)
&& info.serviceName.equals(authProvider.getService())) { && info.serviceName.equals(authProvider.getService())) {
......
...@@ -8,15 +8,15 @@ import android.widget.TextView; ...@@ -8,15 +8,15 @@ import android.widget.TextView;
import chat.rocket.android.R; import chat.rocket.android.R;
import chat.rocket.android.api.MethodCallHelper; import chat.rocket.android.api.MethodCallHelper;
import chat.rocket.android.helper.TextUtils; import chat.rocket.android.helper.TextUtils;
import chat.rocket.android.model.internal.Session; import chat.rocket.persistence.realm.models.internal.RealmSession;
import chat.rocket.android.realm_helper.RealmObjectObserver; import chat.rocket.persistence.realm.RealmObjectObserver;
import chat.rocket.android.realm_helper.RealmStore; import chat.rocket.persistence.realm.RealmStore;
/** /**
* Login screen. * Login screen.
*/ */
public class RetryLoginFragment extends AbstractServerConfigFragment { public class RetryLoginFragment extends AbstractServerConfigFragment {
private RealmObjectObserver<Session> sessionObserver; private RealmObjectObserver<RealmSession> sessionObserver;
@Override @Override
protected int getLayout() { protected int getLayout() {
...@@ -27,7 +27,7 @@ public class RetryLoginFragment extends AbstractServerConfigFragment { ...@@ -27,7 +27,7 @@ public class RetryLoginFragment extends AbstractServerConfigFragment {
public void onCreate(@Nullable Bundle savedInstanceState) { public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
sessionObserver = RealmStore.get(hostname) sessionObserver = RealmStore.get(hostname)
.createObjectObserver(Session::queryDefaultSession) .createObjectObserver(RealmSession::queryDefaultSession)
.setOnUpdateListener(this::onRenderServerConfigSession); .setOnUpdateListener(this::onRenderServerConfigSession);
} }
...@@ -35,7 +35,7 @@ public class RetryLoginFragment extends AbstractServerConfigFragment { ...@@ -35,7 +35,7 @@ public class RetryLoginFragment extends AbstractServerConfigFragment {
protected void onSetupView() { protected void onSetupView() {
} }
private void onRenderServerConfigSession(Session session) { private void onRenderServerConfigSession(RealmSession session) {
if (session == null) { if (session == null) {
return; return;
} }
......
package chat.rocket.android.fragment.sidebar;
import java.util.List;
import chat.rocket.android.shared.BaseContract;
import chat.rocket.core.models.Room;
import chat.rocket.core.models.User;
public interface SidebarMainContract {
interface View extends BaseContract.View {
void showScreen();
void showEmptyScreen();
void showRoomList(List<Room> roomList);
void showUser(User user);
}
interface Presenter extends BaseContract.Presenter<View> {
void onUserOnline();
void onUserAway();
void onUserBusy();
void onUserOffline();
void onLogout();
}
}
...@@ -3,6 +3,7 @@ package chat.rocket.android.fragment.sidebar; ...@@ -3,6 +3,7 @@ package chat.rocket.android.fragment.sidebar;
import android.os.Bundle; import android.os.Bundle;
import android.support.annotation.Nullable; import android.support.annotation.Nullable;
import android.support.v4.app.DialogFragment; import android.support.v4.app.DialogFragment;
import android.view.View;
import android.widget.CompoundButton; import android.widget.CompoundButton;
import android.widget.ImageView; import android.widget.ImageView;
import android.widget.LinearLayout; import android.widget.LinearLayout;
...@@ -10,6 +11,7 @@ import android.widget.TextView; ...@@ -10,6 +11,7 @@ import android.widget.TextView;
import com.jakewharton.rxbinding.view.RxView; import com.jakewharton.rxbinding.view.RxView;
import com.jakewharton.rxbinding.widget.RxCompoundButton; import com.jakewharton.rxbinding.widget.RxCompoundButton;
import java.util.List;
import chat.rocket.android.BuildConfig; import chat.rocket.android.BuildConfig;
import chat.rocket.android.R; import chat.rocket.android.R;
import chat.rocket.android.RocketChatCache; import chat.rocket.android.RocketChatCache;
...@@ -18,25 +20,25 @@ import chat.rocket.android.fragment.AbstractFragment; ...@@ -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.AbstractAddRoomDialogFragment;
import chat.rocket.android.fragment.sidebar.dialog.AddChannelDialogFragment; import chat.rocket.android.fragment.sidebar.dialog.AddChannelDialogFragment;
import chat.rocket.android.fragment.sidebar.dialog.AddDirectMessageDialogFragment; import chat.rocket.android.fragment.sidebar.dialog.AddDirectMessageDialogFragment;
import chat.rocket.android.helper.LogcatIfError;
import chat.rocket.android.helper.TextUtils; import chat.rocket.android.helper.TextUtils;
import chat.rocket.android.layouthelper.chatroom.RoomListManager; import chat.rocket.android.layouthelper.chatroom.RoomListManager;
import chat.rocket.android.model.ddp.RoomSubscription; import chat.rocket.core.interactors.RoomInteractor;
import chat.rocket.android.model.ddp.User; import chat.rocket.core.models.Room;
import chat.rocket.android.realm_helper.RealmHelper; import chat.rocket.core.models.User;
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.renderer.UserRenderer; import chat.rocket.android.renderer.UserRenderer;
import chat.rocket.persistence.realm.repositories.RealmRoomRepository;
import chat.rocket.persistence.realm.repositories.RealmUserRepository;
import chat.rocket.android.widget.RocketChatAvatar; import chat.rocket.android.widget.RocketChatAvatar;
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 RoomListManager roomListManager;
private RealmListObserver<RoomSubscription> roomsObserver;
private RealmObjectObserver<User> currentUserObserver; private String hostname;
private MethodCallHelper methodCallHelper;
public SidebarMainFragment() { public SidebarMainFragment() {
} }
...@@ -46,10 +48,11 @@ public class SidebarMainFragment extends AbstractFragment { ...@@ -46,10 +48,11 @@ public class SidebarMainFragment extends AbstractFragment {
*/ */
public static SidebarMainFragment create(String hostname) { public static SidebarMainFragment create(String hostname) {
Bundle args = new Bundle(); Bundle args = new Bundle();
args.putString("hostname", hostname); args.putString(HOSTNAME, hostname);
SidebarMainFragment fragment = new SidebarMainFragment(); SidebarMainFragment fragment = new SidebarMainFragment();
fragment.setArguments(args); fragment.setArguments(args);
return fragment; return fragment;
} }
...@@ -58,40 +61,35 @@ public class SidebarMainFragment extends AbstractFragment { ...@@ -58,40 +61,35 @@ public class SidebarMainFragment extends AbstractFragment {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
Bundle args = getArguments(); Bundle args = getArguments();
hostname = args == null ? null : args.getString("hostname"); hostname = args == null ? null : args.getString(HOSTNAME);
if (!TextUtils.isEmpty(hostname)) {
RealmHelper realmHelper = RealmStore.get(hostname); presenter = new SidebarMainPresenter(
if (realmHelper != null) { hostname,
roomsObserver = realmHelper new RoomInteractor(new RealmRoomRepository(hostname)),
.createListObserver( new RealmUserRepository(hostname),
realm -> realm.where(RoomSubscription.class).equalTo(RoomSubscription.OPEN, true) TextUtils.isEmpty(hostname) ? null : new MethodCallHelper(getContext(), hostname)
.findAll()) );
.setOnUpdateListener(list -> roomListManager.setRooms(list)); }
currentUserObserver = realmHelper @Override
.createObjectObserver(User::queryCurrentUser) public void onResume() {
.setOnUpdateListener(this::onCurrentUser); super.onResume();
presenter.bindView(this);
methodCallHelper = new MethodCallHelper(getContext(), hostname); }
}
} @Override
public void onPause() {
presenter.release();
super.onPause();
} }
@Override @Override
protected int getLayout() { protected int getLayout() {
if (hostname == null) { return R.layout.fragment_sidebar_main;
return R.layout.simple_screen;
} else {
return R.layout.fragment_sidebar_main;
}
} }
@Override @Override
protected void onSetupView() { protected void onSetupView() {
if (hostname == null) {
return;
}
setupUserActionToggle(); setupUserActionToggle();
setupUserStatusButtons(); setupUserStatusButtons();
setupLogoutButton(); setupLogoutButton();
...@@ -123,26 +121,22 @@ public class SidebarMainFragment extends AbstractFragment { ...@@ -123,26 +121,22 @@ public class SidebarMainFragment extends AbstractFragment {
} }
private void setupUserStatusButtons() { private void setupUserStatusButtons() {
rootView.findViewById(R.id.btn_status_online).setOnClickListener(view -> rootView.findViewById(R.id.btn_status_online).setOnClickListener(view -> {
updateCurrentUserStatus(User.STATUS_ONLINE)); presenter.onUserOnline();
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());
closeUserActionContainer(); closeUserActionContainer();
} });
} rootView.findViewById(R.id.btn_status_away).setOnClickListener(view -> {
presenter.onUserAway();
private void onCurrentUser(User user) { closeUserActionContainer();
onRenderCurrentUser(user); });
updateRoomListMode(user); 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) { private void onRenderCurrentUser(User user) {
...@@ -163,10 +157,8 @@ public class SidebarMainFragment extends AbstractFragment { ...@@ -163,10 +157,8 @@ public class SidebarMainFragment extends AbstractFragment {
private void setupLogoutButton() { private void setupLogoutButton() {
rootView.findViewById(R.id.btn_logout).setOnClickListener(view -> { rootView.findViewById(R.id.btn_logout).setOnClickListener(view -> {
if (methodCallHelper != null) { presenter.onLogout();
methodCallHelper.logout().continueWith(new LogcatIfError()); closeUserActionContainer();
closeUserActionContainer();
}
}); });
} }
...@@ -198,20 +190,23 @@ public class SidebarMainFragment extends AbstractFragment { ...@@ -198,20 +190,23 @@ public class SidebarMainFragment extends AbstractFragment {
} }
@Override @Override
public void onResume() { public void showScreen() {
super.onResume(); rootView.setVisibility(View.VISIBLE);
if (roomsObserver != null) {
roomsObserver.sub();
currentUserObserver.sub();
}
} }
@Override @Override
public void onPause() { public void showEmptyScreen() {
if (roomsObserver != null) { rootView.setVisibility(View.INVISIBLE);
currentUserObserver.unsub(); }
roomsObserver.unsub();
} @Override
super.onPause(); 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.BackgroundLooper;
import chat.rocket.android.api.MethodCallHelper;
import chat.rocket.android.helper.LogcatIfError;
import chat.rocket.android.helper.TextUtils;
import chat.rocket.android.shared.BasePresenter;
import chat.rocket.core.interactors.RoomInteractor;
import chat.rocket.core.models.User;
import chat.rocket.core.repositories.UserRepository;
import rx.Subscription;
import rx.android.schedulers.AndroidSchedulers;
public class SidebarMainPresenter extends BasePresenter<SidebarMainContract.View>
implements SidebarMainContract.Presenter {
private final String hostname;
private final RoomInteractor roomInteractor;
private final UserRepository userRepository;
private final MethodCallHelper methodCallHelper;
public SidebarMainPresenter(String hostname, RoomInteractor roomInteractor,
UserRepository userRepository, MethodCallHelper methodCallHelper) {
this.hostname = hostname;
this.roomInteractor = roomInteractor;
this.userRepository = userRepository;
this.methodCallHelper = methodCallHelper;
}
@Override
public void bindView(@NonNull SidebarMainContract.View view) {
super.bindView(view);
if (TextUtils.isEmpty(hostname)) {
view.showEmptyScreen();
return;
}
view.showScreen();
subscribeToRooms();
subscribeToUser();
}
@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 = roomInteractor.getOpenRooms()
.distinctUntilChanged()
.subscribeOn(AndroidSchedulers.from(BackgroundLooper.get()))
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
rooms -> view.showRoomList(rooms)
);
addSubscription(subscription);
}
private void subscribeToUser() {
final Subscription subscription = userRepository.getCurrent()
.distinctUntilChanged()
.subscribeOn(AndroidSchedulers.from(BackgroundLooper.get()))
.observeOn(AndroidSchedulers.mainThread())
.subscribe(user -> view.showUser(user));
addSubscription(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; ...@@ -12,8 +12,8 @@ import com.trello.rxlifecycle.components.support.RxAppCompatDialogFragment;
import bolts.Task; import bolts.Task;
import chat.rocket.android.R; import chat.rocket.android.R;
import chat.rocket.android.api.MethodCallHelper; import chat.rocket.android.api.MethodCallHelper;
import chat.rocket.android.realm_helper.RealmHelper; import chat.rocket.persistence.realm.RealmHelper;
import chat.rocket.android.realm_helper.RealmStore; import chat.rocket.persistence.realm.RealmStore;
public abstract class AbstractAddRoomDialogFragment extends RxAppCompatDialogFragment { public abstract class AbstractAddRoomDialogFragment extends RxAppCompatDialogFragment {
......
...@@ -12,11 +12,11 @@ import bolts.Task; ...@@ -12,11 +12,11 @@ import bolts.Task;
import chat.rocket.android.R; import chat.rocket.android.R;
import chat.rocket.android.helper.TextUtils; import chat.rocket.android.helper.TextUtils;
import chat.rocket.android.layouthelper.sidebar.dialog.SuggestUserAdapter; import chat.rocket.android.layouthelper.sidebar.dialog.SuggestUserAdapter;
import chat.rocket.android.model.ddp.User; import chat.rocket.persistence.realm.models.ddp.RealmUser;
import chat.rocket.android.realm_helper.RealmAutoCompleteAdapter; import chat.rocket.persistence.realm.RealmAutoCompleteAdapter;
/** /**
* add Direct Message. * add Direct RealmMessage.
*/ */
public class AddDirectMessageDialogFragment extends AbstractAddRoomDialogFragment { public class AddDirectMessageDialogFragment extends AbstractAddRoomDialogFragment {
public static AddDirectMessageDialogFragment create(String hostname) { public static AddDirectMessageDialogFragment create(String hostname) {
...@@ -39,10 +39,10 @@ public class AddDirectMessageDialogFragment extends AbstractAddRoomDialogFragmen ...@@ -39,10 +39,10 @@ public class AddDirectMessageDialogFragment extends AbstractAddRoomDialogFragmen
AutoCompleteTextView autoCompleteTextView = AutoCompleteTextView autoCompleteTextView =
(AutoCompleteTextView) getDialog().findViewById(R.id.editor_username); (AutoCompleteTextView) getDialog().findViewById(R.id.editor_username);
RealmAutoCompleteAdapter<User> adapter = realmHelper.createAutoCompleteAdapter(getContext(), RealmAutoCompleteAdapter<RealmUser> adapter = realmHelper.createAutoCompleteAdapter(getContext(),
(realm, text) -> realm.where(User.class) (realm, text) -> realm.where(RealmUser.class)
.contains(User.USERNAME, text, Case.INSENSITIVE) .contains(RealmUser.USERNAME, text, Case.INSENSITIVE)
.findAllSorted(User.USERNAME), .findAllSorted(RealmUser.USERNAME),
context -> new SuggestUserAdapter(context, hostname)); context -> new SuggestUserAdapter(context, hostname));
autoCompleteTextView.setAdapter(adapter); autoCompleteTextView.setAdapter(adapter);
......
...@@ -14,10 +14,10 @@ import java.io.FileNotFoundException; ...@@ -14,10 +14,10 @@ import java.io.FileNotFoundException;
import java.io.IOException; import java.io.IOException;
import java.util.UUID; import java.util.UUID;
import chat.rocket.android.log.RCLog; import chat.rocket.android.log.RCLog;
import chat.rocket.android.model.SyncState; import chat.rocket.core.SyncState;
import chat.rocket.android.model.ddp.PublicSetting; import chat.rocket.persistence.realm.models.ddp.RealmPublicSetting;
import chat.rocket.android.model.internal.FileUploading; import chat.rocket.persistence.realm.models.internal.FileUploading;
import chat.rocket.android.realm_helper.RealmHelper; import chat.rocket.persistence.realm.RealmHelper;
/** /**
* utility class for uploading file. * utility class for uploading file.
...@@ -59,7 +59,7 @@ public class FileUploadHelper { ...@@ -59,7 +59,7 @@ public class FileUploadHelper {
Uri uri, String filename, long filesize, String mimeType) { Uri uri, String filename, long filesize, String mimeType) {
final String uplId = UUID.randomUUID().toString(); final String uplId = UUID.randomUUID().toString();
final String storageType = final String storageType =
PublicSetting.getString(realmHelper, "FileUpload_Storage_Type", null); RealmPublicSetting.getString(realmHelper, "FileUpload_Storage_Type", null);
realmHelper.executeTransaction(realm -> realmHelper.executeTransaction(realm ->
realm.createOrUpdateObjectFromJson(FileUploading.class, new JSONObject() realm.createOrUpdateObjectFromJson(FileUploading.class, new JSONObject()
......
...@@ -4,28 +4,28 @@ import io.realm.Realm; ...@@ -4,28 +4,28 @@ import io.realm.Realm;
import io.realm.RealmResults; import io.realm.RealmResults;
import java.util.List; import java.util.List;
import chat.rocket.android.model.ddp.PublicSetting; import chat.rocket.persistence.realm.models.ddp.RealmPublicSetting;
import chat.rocket.android.model.ddp.PublicSettingsConstants; import chat.rocket.core.PublicSettingsConstants;
/** /**
* utility class for getting value comprehensibly from public settings list. * utility class for getting value comprehensibly from public settings list.
*/ */
public class GcmPushSettingHelper { public class GcmPushSettingHelper {
public static RealmResults<PublicSetting> queryForGcmPushEnabled(Realm realm) { public static RealmResults<RealmPublicSetting> queryForGcmPushEnabled(Realm realm) {
return realm.where(PublicSetting.class) return realm.where(RealmPublicSetting.class)
.equalTo(PublicSetting.ID, PublicSettingsConstants.Push.ENABLE) .equalTo(RealmPublicSetting.ID, PublicSettingsConstants.Push.ENABLE)
.or() .or()
.equalTo(PublicSetting.ID, PublicSettingsConstants.Push.GCM_PROJECT_NUMBER) .equalTo(RealmPublicSetting.ID, PublicSettingsConstants.Push.GCM_PROJECT_NUMBER)
.findAll(); .findAll();
} }
public static boolean isGcmPushEnabled(List<PublicSetting> results) { public static boolean isGcmPushEnabled(List<RealmPublicSetting> results) {
return isPushEnabled(results) && hasValidGcmConfig(results); return isPushEnabled(results) && hasValidGcmConfig(results);
} }
private static boolean isPushEnabled(List<PublicSetting> results) { private static boolean isPushEnabled(List<RealmPublicSetting> results) {
for (PublicSetting setting : results) { for (RealmPublicSetting setting : results) {
if (PublicSettingsConstants.Push.ENABLE.equals(setting.getId())) { if (PublicSettingsConstants.Push.ENABLE.equals(setting.getId())) {
return "true".equals(setting.getValue()); return "true".equals(setting.getValue());
} }
...@@ -33,8 +33,8 @@ public class GcmPushSettingHelper { ...@@ -33,8 +33,8 @@ public class GcmPushSettingHelper {
return false; return false;
} }
private static boolean hasValidGcmConfig(List<PublicSetting> results) { private static boolean hasValidGcmConfig(List<RealmPublicSetting> results) {
for (PublicSetting setting : results) { for (RealmPublicSetting setting : results) {
if (PublicSettingsConstants.Push.GCM_PROJECT_NUMBER.equals(setting.getId())) { if (PublicSettingsConstants.Push.GCM_PROJECT_NUMBER.equals(setting.getId())) {
return !TextUtils.isEmpty(setting.getValue()); return !TextUtils.isEmpty(setting.getValue());
} }
......
...@@ -3,21 +3,20 @@ package chat.rocket.android.layouthelper; ...@@ -3,21 +3,20 @@ package chat.rocket.android.layouthelper;
import android.content.Context; import android.content.Context;
import android.support.annotation.LayoutRes; import android.support.annotation.LayoutRes;
import android.support.v7.util.ListUpdateCallback; import android.support.v7.util.ListUpdateCallback;
import io.realm.RealmObject;
import chat.rocket.android.realm_helper.RealmModelListAdapter; import chat.rocket.android.layouthelper.chatroom.ModelListAdapter;
import chat.rocket.android.realm_helper.RealmModelViewHolder; import chat.rocket.android.layouthelper.chatroom.ModelViewHolder;
@SuppressWarnings({"PMD.AbstractNaming", "PMD.GenericsNaming"}) @SuppressWarnings({"PMD.AbstractNaming", "PMD.GenericsNaming"})
/** /**
* RealmModelListAdapter with header and footer. * ModelListAdapter with header and footer.
*/ */
public abstract class ExtRealmModelListAdapter<T extends RealmObject, VM, public abstract class ExtModelListAdapter<T, VM,
VH extends RealmModelViewHolder<VM>> extends RealmModelListAdapter<T, VM, VH> { VH extends ModelViewHolder<VM>> extends ModelListAdapter<T, VM, VH> {
protected static final int VIEW_TYPE_HEADER = -1; protected static final int VIEW_TYPE_HEADER = -1;
protected static final int VIEW_TYPE_FOOTER = -2; protected static final int VIEW_TYPE_FOOTER = -2;
protected ExtRealmModelListAdapter(Context context) { protected ExtModelListAdapter(Context context) {
super(context); super(context);
} }
......
...@@ -7,26 +7,23 @@ import android.widget.TextView; ...@@ -7,26 +7,23 @@ import android.widget.TextView;
import chat.rocket.android.R; import chat.rocket.android.R;
import chat.rocket.android.helper.DateTime; import chat.rocket.android.helper.DateTime;
import chat.rocket.android.helper.TextUtils; import chat.rocket.android.helper.TextUtils;
import chat.rocket.android.model.SyncState; import chat.rocket.core.SyncState;
import chat.rocket.android.realm_helper.RealmModelViewHolder;
import chat.rocket.android.widget.RocketChatAvatar; import chat.rocket.android.widget.RocketChatAvatar;
public abstract class AbstractMessageViewHolder extends RealmModelViewHolder<PairedMessage> { public abstract class AbstractMessageViewHolder extends ModelViewHolder<PairedMessage> {
protected final RocketChatAvatar avatar; protected final RocketChatAvatar avatar;
protected final TextView username; protected final TextView username;
protected final TextView subUsername; protected final TextView subUsername;
protected final TextView timestamp; protected final TextView timestamp;
protected final View userAndTimeContainer; protected final View userAndTimeContainer;
protected final String hostname; protected final String hostname;
protected final String userId;
protected final String token;
protected final View newDayContainer; protected final View newDayContainer;
protected final TextView newDayText; protected final TextView newDayText;
/** /**
* constructor WITH hostname. * constructor WITH hostname.
*/ */
public AbstractMessageViewHolder(View itemView, String hostname, String userId, String token) { public AbstractMessageViewHolder(View itemView, String hostname) {
super(itemView); super(itemView);
avatar = (RocketChatAvatar) itemView.findViewById(R.id.user_avatar); avatar = (RocketChatAvatar) itemView.findViewById(R.id.user_avatar);
username = (TextView) itemView.findViewById(R.id.username); username = (TextView) itemView.findViewById(R.id.username);
...@@ -36,8 +33,6 @@ public abstract class AbstractMessageViewHolder extends RealmModelViewHolder<Pai ...@@ -36,8 +33,6 @@ public abstract class AbstractMessageViewHolder extends RealmModelViewHolder<Pai
newDayContainer = itemView.findViewById(R.id.newday_container); newDayContainer = itemView.findViewById(R.id.newday_container);
newDayText = (TextView) itemView.findViewById(R.id.newday_text); newDayText = (TextView) itemView.findViewById(R.id.newday_text);
this.hostname = hostname; this.hostname = hostname;
this.userId = userId;
this.token = token;
} }
/** /**
......
package chat.rocket.android.layouthelper.chatroom; package chat.rocket.android.layouthelper.chatroom;
import bolts.Task;
import chat.rocket.android.widget.message.MessageFormLayout; import chat.rocket.android.widget.message.MessageFormLayout;
/** /**
...@@ -29,22 +28,21 @@ public class MessageFormManager { ...@@ -29,22 +28,21 @@ public class MessageFormManager {
messageFormLayout.setText(""); messageFormLayout.setText("");
} }
public void onMessageSend() {
clearComposingText();
messageFormLayout.setEnabled(true);
}
private void sendMessage(String message) { private void sendMessage(String message) {
if (sendMessageCallback == null) { if (sendMessageCallback == null) {
return; return;
} }
messageFormLayout.setEnabled(false); messageFormLayout.setEnabled(false);
sendMessageCallback.onSubmitText(message).onSuccess(task -> { sendMessageCallback.onSubmitText(message);
clearComposingText();
return null;
}).continueWith(task -> {
messageFormLayout.setEnabled(true);
return null;
});
} }
public interface SendMessageCallback { public interface SendMessageCallback {
Task<Void> onSubmitText(String messageText); void onSubmitText(String messageText);
} }
} }
...@@ -9,30 +9,26 @@ import java.util.Collections; ...@@ -9,30 +9,26 @@ import java.util.Collections;
import java.util.List; import java.util.List;
import chat.rocket.android.R; import chat.rocket.android.R;
import chat.rocket.android.helper.TextUtils; import chat.rocket.android.helper.TextUtils;
import chat.rocket.android.layouthelper.ExtRealmModelListAdapter; import chat.rocket.android.layouthelper.ExtModelListAdapter;
import chat.rocket.android.model.ddp.Message; import chat.rocket.core.models.Message;
/** /**
* target list adapter for chat room. * target list adapter for chat room.
*/ */
public class MessageListAdapter public class MessageListAdapter
extends ExtRealmModelListAdapter<Message, PairedMessage, AbstractMessageViewHolder> { extends ExtModelListAdapter<Message, PairedMessage, AbstractMessageViewHolder> {
private static final int VIEW_TYPE_UNKNOWN = 0; private static final int VIEW_TYPE_UNKNOWN = 0;
private static final int VIEW_TYPE_NORMAL_MESSAGE = 1; private static final int VIEW_TYPE_NORMAL_MESSAGE = 1;
private static final int VIEW_TYPE_SYSTEM_MESSAGE = 2; private static final int VIEW_TYPE_SYSTEM_MESSAGE = 2;
private final String hostname; private final String hostname;
private final String userId;
private final String token;
private boolean hasNext; private boolean hasNext;
private boolean isLoaded; private boolean isLoaded;
public MessageListAdapter(Context context, String hostname, String userId, String token) { public MessageListAdapter(Context context, String hostname) {
super(context); super(context);
this.hostname = hostname; this.hostname = hostname;
this.userId = userId;
this.token = token;
} }
/** /**
...@@ -86,11 +82,11 @@ public class MessageListAdapter ...@@ -86,11 +82,11 @@ public class MessageListAdapter
protected AbstractMessageViewHolder onCreateRealmModelViewHolder(int viewType, View itemView) { protected AbstractMessageViewHolder onCreateRealmModelViewHolder(int viewType, View itemView) {
switch (viewType) { switch (viewType) {
case VIEW_TYPE_NORMAL_MESSAGE: case VIEW_TYPE_NORMAL_MESSAGE:
return new MessageNormalViewHolder(itemView, hostname, userId, token); return new MessageNormalViewHolder(itemView, hostname);
case VIEW_TYPE_SYSTEM_MESSAGE: case VIEW_TYPE_SYSTEM_MESSAGE:
return new MessageSystemViewHolder(itemView, hostname, userId, token); return new MessageSystemViewHolder(itemView, hostname);
default: default:
return new AbstractMessageViewHolder(itemView, hostname, userId, token) { return new AbstractMessageViewHolder(itemView, hostname) {
@Override @Override
protected void bindMessage(PairedMessage pairedMessage) { protected void bindMessage(PairedMessage pairedMessage) {
} }
......
...@@ -19,8 +19,8 @@ public class MessageNormalViewHolder extends AbstractMessageViewHolder { ...@@ -19,8 +19,8 @@ public class MessageNormalViewHolder extends AbstractMessageViewHolder {
/** /**
* constructor WITH hostname. * constructor WITH hostname.
*/ */
public MessageNormalViewHolder(View itemView, String hostname, String userId, String token) { public MessageNormalViewHolder(View itemView, String hostname) {
super(itemView, hostname, userId, token); super(itemView, hostname);
body = (RocketChatMessageLayout) itemView.findViewById(R.id.message_body); body = (RocketChatMessageLayout) itemView.findViewById(R.id.message_body);
urls = (RocketChatMessageUrlsLayout) itemView.findViewById(R.id.message_urls); urls = (RocketChatMessageUrlsLayout) itemView.findViewById(R.id.message_urls);
attachments = attachments =
...@@ -35,6 +35,6 @@ public class MessageNormalViewHolder extends AbstractMessageViewHolder { ...@@ -35,6 +35,6 @@ public class MessageNormalViewHolder extends AbstractMessageViewHolder {
.timestampInto(timestamp) .timestampInto(timestamp)
.bodyInto(body) .bodyInto(body)
.urlsInto(urls) .urlsInto(urls)
.attachmentsInto(attachments, hostname, userId, token); .attachmentsInto(attachments, hostname);
} }
} }
...@@ -15,8 +15,8 @@ public class MessageSystemViewHolder extends AbstractMessageViewHolder { ...@@ -15,8 +15,8 @@ public class MessageSystemViewHolder extends AbstractMessageViewHolder {
/** /**
* constructor WITH hostname. * constructor WITH hostname.
*/ */
public MessageSystemViewHolder(View itemView, String hostname, String userId, String token) { public MessageSystemViewHolder(View itemView, String hostname) {
super(itemView, hostname, userId, token); super(itemView, hostname);
body = (TextView) itemView.findViewById(R.id.message_body); body = (TextView) itemView.findViewById(R.id.message_body);
} }
......
...@@ -3,7 +3,7 @@ package chat.rocket.android.layouthelper.chatroom; ...@@ -3,7 +3,7 @@ package chat.rocket.android.layouthelper.chatroom;
import android.content.Context; import android.content.Context;
import chat.rocket.android.R; import chat.rocket.android.R;
import chat.rocket.android.model.ddp.Message; import chat.rocket.core.models.Message;
/** /**
* message type. * message type.
...@@ -69,7 +69,9 @@ public enum MessageType { ...@@ -69,7 +69,9 @@ public enum MessageType {
public static MessageType parse(String value) { public static MessageType parse(String value) {
for (MessageType type : MessageType.values()) { for (MessageType type : MessageType.values()) {
if (type.value.equals(value)) return type; if (type.value.equals(value)) {
return type;
}
} }
return UNSPECIFIED; return UNSPECIFIED;
} }
......
package chat.rocket.android.realm_helper; package chat.rocket.android.layouthelper.chatroom;
import android.content.Context; import android.content.Context;
import android.support.annotation.LayoutRes; import android.support.annotation.LayoutRes;
...@@ -8,46 +8,25 @@ import android.support.v7.widget.RecyclerView; ...@@ -8,46 +8,25 @@ import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import io.realm.RealmObject;
import java.util.List; import java.util.List;
public abstract class RealmModelListAdapter<T extends RealmObject, VM, @SuppressWarnings("PMD.GenericsNaming")
VH extends RealmModelViewHolder<VM>> extends RecyclerView.Adapter<VH> { public abstract class ModelListAdapter<T, VM, VH extends ModelViewHolder<VM>>
extends RecyclerView.Adapter<VH> {
protected final LayoutInflater inflater; protected final LayoutInflater inflater;
private RealmListObserver<T> realmListObserver;
private List<VM> adapterData; private List<VM> adapterData;
private OnItemClickListener<VM> onItemClickListener; private OnItemClickListener<VM> onItemClickListener;
protected RealmModelListAdapter(Context context) { protected ModelListAdapter(Context context) {
this.inflater = LayoutInflater.from(context); this.inflater = LayoutInflater.from(context);
} }
/*package*/ RealmModelListAdapter<T, VM, VH> initializeWith(final RealmHelper realmHelper,
RealmListObserver.Query<T> query) {
realmListObserver = new RealmListObserver<>(realmHelper, query)
.setOnUpdateListener(results -> updateData(realmHelper.copyFromRealm(results)));
return this;
}
@Override
public void onAttachedToRecyclerView(RecyclerView recyclerView) {
super.onAttachedToRecyclerView(recyclerView);
realmListObserver.sub();
}
@Override
public void onDetachedFromRecyclerView(RecyclerView recyclerView) {
realmListObserver.unsub();
super.onDetachedFromRecyclerView(recyclerView);
}
protected abstract int getRealmModelViewType(VM model); protected abstract int getRealmModelViewType(VM model);
protected abstract
@LayoutRes @LayoutRes
int getLayout(int viewType); protected abstract int getLayout(int viewType);
protected abstract VH onCreateRealmModelViewHolder(int viewType, View itemView); protected abstract VH onCreateRealmModelViewHolder(int viewType, View itemView);
...@@ -86,7 +65,7 @@ public abstract class RealmModelListAdapter<T extends RealmObject, VM, ...@@ -86,7 +65,7 @@ public abstract class RealmModelListAdapter<T extends RealmObject, VM,
return adapterData.get(position); return adapterData.get(position);
} }
private void updateData(List<T> newData) { public void updateData(List<T> newData) {
if (adapterData == null) { if (adapterData == null) {
adapterData = mapResultsToViewModel(newData); adapterData = mapResultsToViewModel(newData);
notifyDataSetChanged(); notifyDataSetChanged();
...@@ -133,8 +112,8 @@ public abstract class RealmModelListAdapter<T extends RealmObject, VM, ...@@ -133,8 +112,8 @@ public abstract class RealmModelListAdapter<T extends RealmObject, VM,
this.onItemClickListener = onItemClickListener; this.onItemClickListener = onItemClickListener;
} }
public interface Constructor<T extends RealmObject, VM, VH extends RealmModelViewHolder<VM>> { public interface Constructor<T, VM, VH extends ModelViewHolder<VM>> {
RealmModelListAdapter<T, VM, VH> getNewInstance(Context context); ModelListAdapter<T, VM, VH> getNewInstance(Context context);
} }
public interface OnItemClickListener<VM> { public interface OnItemClickListener<VM> {
......
package chat.rocket.android.realm_helper; package chat.rocket.android.layouthelper.chatroom;
import android.support.v7.widget.RecyclerView; import android.support.v7.widget.RecyclerView;
import android.view.View; import android.view.View;
public abstract class RealmModelViewHolder<T> extends RecyclerView.ViewHolder { public abstract class ModelViewHolder<T> extends RecyclerView.ViewHolder {
public RealmModelViewHolder(View itemView) { public ModelViewHolder(View itemView) {
super(itemView); super(itemView);
} }
......
package chat.rocket.android.layouthelper.chatroom; package chat.rocket.android.layouthelper.chatroom;
import chat.rocket.android.helper.DateTime; import chat.rocket.android.helper.DateTime;
import chat.rocket.android.model.ddp.Message; import chat.rocket.core.models.Message;
/** /**
* ViewData Model for messages in chatroom. * ViewData Model for messages in chatroom.
......
...@@ -4,7 +4,7 @@ import android.view.View; ...@@ -4,7 +4,7 @@ import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import chat.rocket.android.helper.TextUtils; import chat.rocket.android.helper.TextUtils;
import chat.rocket.android.model.ddp.RoomSubscription; import chat.rocket.core.models.Room;
import chat.rocket.android.widget.internal.RoomListItemView; import chat.rocket.android.widget.internal.RoomListItemView;
import java.util.List; import java.util.List;
...@@ -19,7 +19,7 @@ public class RoomListManager { ...@@ -19,7 +19,7 @@ public class RoomListManager {
private boolean unreadRoomMode = false; private boolean unreadRoomMode = false;
private List<RoomSubscription> roomSubscriptionList; private List<Room> roomList;
/** /**
* Callback interface for List item clicked. * Callback interface for List item clicked.
...@@ -54,8 +54,8 @@ public class RoomListManager { ...@@ -54,8 +54,8 @@ public class RoomListManager {
/** /**
* update ViewGroups with room list. * update ViewGroups with room list.
*/ */
public void setRooms(List<RoomSubscription> roomSubscriptionList) { public void setRooms(List<Room> roomList) {
this.roomSubscriptionList = roomSubscriptionList; this.roomList = roomList;
updateRoomsList(); updateRoomsList();
} }
...@@ -66,14 +66,14 @@ public class RoomListManager { ...@@ -66,14 +66,14 @@ public class RoomListManager {
this.listener = listener; 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--) { for (int index = parent.getChildCount() - 1; index >= 0; index--) {
RoomListItemView roomListItemView = (RoomListItemView) parent.getChildAt(index); RoomListItemView roomListItemView = (RoomListItemView) parent.getChildAt(index);
final String targetRoomName = roomListItemView.getRoomName(); final String targetRoomName = roomListItemView.getRoomName();
if (!TextUtils.isEmpty(targetRoomName)) { if (!TextUtils.isEmpty(targetRoomName)) {
boolean found = false; boolean found = false;
for (RoomSubscription roomSubscription : roomSubscriptionList) { for (Room room : roomList) {
if (targetRoomName.equals(roomSubscription.getName())) { if (targetRoomName.equals(room.getName())) {
found = true; found = true;
break; break;
} }
...@@ -90,15 +90,15 @@ public class RoomListManager { ...@@ -90,15 +90,15 @@ public class RoomListManager {
updateRoomsList(); updateRoomsList();
} }
private void insertOrUpdateItem(ViewGroup parent, RoomSubscription roomSubscription) { private void insertOrUpdateItem(ViewGroup parent, Room room) {
final String roomName = roomSubscription.getName(); final String roomName = room.getName();
int index; int index;
for (index = 0; index < parent.getChildCount(); index++) { for (index = 0; index < parent.getChildCount(); index++) {
RoomListItemView roomListItemView = (RoomListItemView) parent.getChildAt(index); RoomListItemView roomListItemView = (RoomListItemView) parent.getChildAt(index);
final String targetRoomName = roomListItemView.getRoomName(); final String targetRoomName = roomListItemView.getRoomName();
if (roomName.equals(targetRoomName)) { if (roomName.equals(targetRoomName)) {
updateRoomItemView(roomListItemView, roomSubscription); updateRoomItemView(roomListItemView, room);
return; return;
} }
if (roomName.compareToIgnoreCase(targetRoomName) < 0) { if (roomName.compareToIgnoreCase(targetRoomName) < 0) {
...@@ -107,7 +107,7 @@ public class RoomListManager { ...@@ -107,7 +107,7 @@ public class RoomListManager {
} }
RoomListItemView roomListItemView = new RoomListItemView(parent.getContext()); RoomListItemView roomListItemView = new RoomListItemView(parent.getContext());
updateRoomItemView(roomListItemView, roomSubscription); updateRoomItemView(roomListItemView, room);
if (index == parent.getChildCount()) { if (index == parent.getChildCount()) {
parent.addView(roomListItemView); parent.addView(roomListItemView);
} else { } else {
...@@ -116,13 +116,13 @@ public class RoomListManager { ...@@ -116,13 +116,13 @@ public class RoomListManager {
} }
private void updateRoomItemView(RoomListItemView roomListItemView, private void updateRoomItemView(RoomListItemView roomListItemView,
RoomSubscription roomSubscription) { Room room) {
roomListItemView roomListItemView
.setRoomId(roomSubscription.getRoomId()) .setRoomId(room.getRoomId())
.setRoomName(roomSubscription.getName()) .setRoomName(room.getName())
.setRoomType(roomSubscription.getType()) .setRoomType(room.getType())
.setAlert(roomSubscription.isAlert()) .setAlert(room.isAlert())
.setUnreadCount(roomSubscription.getUnread()); .setUnreadCount(room.getUnread());
roomListItemView.setOnClickListener(this::onItemClick); roomListItemView.setOnClickListener(this::onItemClick);
} }
...@@ -134,31 +134,35 @@ public class RoomListManager { ...@@ -134,31 +134,35 @@ public class RoomListManager {
} }
private void updateRoomsList() { private void updateRoomsList() {
removeDeletedItem(unreadRoomsContainer, roomSubscriptionList); if (roomList == null) {
removeDeletedItem(channelsContainer, roomSubscriptionList); return;
removeDeletedItem(dmContainer, roomSubscriptionList); }
removeDeletedItem(unreadRoomsContainer, roomList);
removeDeletedItem(channelsContainer, roomList);
removeDeletedItem(dmContainer, roomList);
for (RoomSubscription roomSubscription : roomSubscriptionList) { for (Room room : roomList) {
String name = roomSubscription.getName(); String name = room.getName();
if (TextUtils.isEmpty(name)) { if (TextUtils.isEmpty(name)) {
continue; continue;
} }
String type = roomSubscription.getType(); String type = room.getType();
if (unreadRoomMode && roomSubscription.isAlert()) { if (unreadRoomMode && room.isAlert()) {
insertOrUpdateItem(unreadRoomsContainer, roomSubscription); insertOrUpdateItem(unreadRoomsContainer, room);
removeItemIfExists(channelsContainer, name); removeItemIfExists(channelsContainer, name);
removeItemIfExists(dmContainer, name); removeItemIfExists(dmContainer, name);
} else if (RoomSubscription.TYPE_CHANNEL.equals(type) } else if (Room.TYPE_CHANNEL.equals(type)
|| RoomSubscription.TYPE_PRIVATE.equals(type)) { || Room.TYPE_PRIVATE.equals(type)) {
removeItemIfExists(unreadRoomsContainer, name); removeItemIfExists(unreadRoomsContainer, name);
insertOrUpdateItem(channelsContainer, roomSubscription); insertOrUpdateItem(channelsContainer, room);
removeItemIfExists(dmContainer, name); removeItemIfExists(dmContainer, name);
} else if (RoomSubscription.TYPE_DIRECT_MESSAGE.equals(type)) { } else if (Room.TYPE_DIRECT_MESSAGE.equals(type)) {
removeItemIfExists(unreadRoomsContainer, name); removeItemIfExists(unreadRoomsContainer, name);
removeItemIfExists(channelsContainer, name); removeItemIfExists(channelsContainer, name);
insertOrUpdateItem(dmContainer, roomSubscription); insertOrUpdateItem(dmContainer, room);
} }
} }
......
...@@ -9,8 +9,8 @@ import android.view.ViewGroup; ...@@ -9,8 +9,8 @@ import android.view.ViewGroup;
import java.util.List; import java.util.List;
import chat.rocket.android.R; import chat.rocket.android.R;
import chat.rocket.android.helper.TextUtils; import chat.rocket.android.helper.TextUtils;
import chat.rocket.android.model.ddp.User; import chat.rocket.persistence.realm.models.ddp.RealmUser;
import chat.rocket.android.realm_helper.RealmHelper; import chat.rocket.persistence.realm.RealmHelper;
import chat.rocket.android.renderer.UserRenderer; import chat.rocket.android.renderer.UserRenderer;
/** /**
...@@ -47,16 +47,16 @@ public class RoomUserAdapter extends RecyclerView.Adapter<RoomUserViewHolder> { ...@@ -47,16 +47,16 @@ public class RoomUserAdapter extends RecyclerView.Adapter<RoomUserViewHolder> {
return; return;
} }
User user = realmHelper.executeTransactionForRead(realm -> RealmUser user = realmHelper.executeTransactionForRead(realm ->
realm.where(User.class).equalTo(User.USERNAME, username).findFirst()); realm.where(RealmUser.class).equalTo(RealmUser.USERNAME, username).findFirst());
if (user == null) { if (user == null) {
user = new User(); user = new RealmUser();
user.setUsername(username); user.setUsername(username);
new UserRenderer(context, user) new UserRenderer(context, user.asUser())
.avatarInto(holder.avatar, hostname) .avatarInto(holder.avatar, hostname)
.usernameInto(holder.username); .usernameInto(holder.username);
} else { } else {
new UserRenderer(context, user) new UserRenderer(context, user.asUser())
.statusColorInto(holder.status) .statusColorInto(holder.status)
.avatarInto(holder.avatar, hostname) .avatarInto(holder.avatar, hostname)
.usernameInto(holder.username); .usernameInto(holder.username);
......
...@@ -7,15 +7,15 @@ import android.widget.ImageView; ...@@ -7,15 +7,15 @@ import android.widget.ImageView;
import java.util.Iterator; import java.util.Iterator;
import java.util.List; import java.util.List;
import chat.rocket.android.R; import chat.rocket.android.R;
import chat.rocket.android.model.ddp.User; import chat.rocket.persistence.realm.models.ddp.RealmUser;
import chat.rocket.android.realm_helper.RealmAutoCompleteAdapter; import chat.rocket.persistence.realm.RealmAutoCompleteAdapter;
import chat.rocket.android.renderer.UserRenderer; import chat.rocket.android.renderer.UserRenderer;
import chat.rocket.android.widget.RocketChatAvatar; import chat.rocket.android.widget.RocketChatAvatar;
/** /**
* adapter to suggest user names. * adapter to suggest user names.
*/ */
public class SuggestUserAdapter extends RealmAutoCompleteAdapter<User> { public class SuggestUserAdapter extends RealmAutoCompleteAdapter<RealmUser> {
private final String hostname; private final String hostname;
public SuggestUserAdapter(Context context, String hostname) { public SuggestUserAdapter(Context context, String hostname) {
...@@ -24,18 +24,18 @@ public class SuggestUserAdapter extends RealmAutoCompleteAdapter<User> { ...@@ -24,18 +24,18 @@ public class SuggestUserAdapter extends RealmAutoCompleteAdapter<User> {
} }
@Override @Override
protected void onBindItemView(View itemView, User user) { protected void onBindItemView(View itemView, RealmUser user) {
new UserRenderer(itemView.getContext(), user) new UserRenderer(itemView.getContext(), user.asUser())
.statusColorInto((ImageView) itemView.findViewById(R.id.room_user_status)) .statusColorInto((ImageView) itemView.findViewById(R.id.room_user_status))
.avatarInto((RocketChatAvatar) itemView.findViewById(R.id.room_user_avatar), hostname); .avatarInto((RocketChatAvatar) itemView.findViewById(R.id.room_user_avatar), hostname);
} }
@Override @Override
protected void filterList(List<User> users, String text) { protected void filterList(List<RealmUser> users, String text) {
Iterator<User> itUsers = users.iterator(); Iterator<RealmUser> itUsers = users.iterator();
final String prefix = text.toLowerCase(); final String prefix = text.toLowerCase();
while (itUsers.hasNext()) { while (itUsers.hasNext()) {
User user = itUsers.next(); RealmUser user = itUsers.next();
if (!user.getUsername().toLowerCase().startsWith(prefix)) { if (!user.getUsername().toLowerCase().startsWith(prefix)) {
itUsers.remove(); itUsers.remove();
} }
...@@ -43,7 +43,7 @@ public class SuggestUserAdapter extends RealmAutoCompleteAdapter<User> { ...@@ -43,7 +43,7 @@ public class SuggestUserAdapter extends RealmAutoCompleteAdapter<User> {
} }
@Override @Override
protected String getStringForSelectedItem(User user) { protected String getStringForSelectedItem(RealmUser user) {
return user.getUsername(); return user.getUsername();
} }
} }
...@@ -34,7 +34,7 @@ import java.util.Random; ...@@ -34,7 +34,7 @@ import java.util.Random;
import chat.rocket.android.activity.MainActivity; import chat.rocket.android.activity.MainActivity;
import chat.rocket.android.helper.ServerPolicyHelper; import chat.rocket.android.helper.ServerPolicyHelper;
import chat.rocket.android.service.ConnectivityManager; import chat.rocket.android.service.ConnectivityManager;
import chat.rocket.android.service.ServerInfo; import chat.rocket.core.models.ServerInfo;
public class PushNotificationHandler implements PushConstants { public class PushNotificationHandler implements PushConstants {
...@@ -661,7 +661,7 @@ public class PushNotificationHandler implements PushConstants { ...@@ -661,7 +661,7 @@ public class PushNotificationHandler implements PushConstants {
ConnectivityManager.getInstance(context.getApplicationContext()).getServerList(); ConnectivityManager.getInstance(context.getApplicationContext()).getServerList();
for (ServerInfo serverInfo : serverInfoList) { for (ServerInfo serverInfo : serverInfoList) {
if (serverInfo.hostname.equals(hostname)) { if (serverInfo.getHostname().equals(hostname)) {
return true; return true;
} }
} }
......
...@@ -4,12 +4,12 @@ import com.google.android.gms.iid.InstanceIDListenerService; ...@@ -4,12 +4,12 @@ import com.google.android.gms.iid.InstanceIDListenerService;
import java.util.List; import java.util.List;
import chat.rocket.android.helper.GcmPushSettingHelper; import chat.rocket.android.helper.GcmPushSettingHelper;
import chat.rocket.android.model.ddp.PublicSetting; import chat.rocket.persistence.realm.models.ddp.RealmPublicSetting;
import chat.rocket.android.model.internal.GcmPushRegistration; import chat.rocket.persistence.realm.models.internal.GcmPushRegistration;
import chat.rocket.android.realm_helper.RealmHelper; import chat.rocket.persistence.realm.RealmHelper;
import chat.rocket.android.realm_helper.RealmStore; import chat.rocket.persistence.realm.RealmStore;
import chat.rocket.android.service.ConnectivityManager; import chat.rocket.android.service.ConnectivityManager;
import chat.rocket.android.service.ServerInfo; import chat.rocket.core.models.ServerInfo;
public class GcmInstanceIDListenerService extends InstanceIDListenerService { public class GcmInstanceIDListenerService extends InstanceIDListenerService {
...@@ -18,7 +18,7 @@ public class GcmInstanceIDListenerService extends InstanceIDListenerService { ...@@ -18,7 +18,7 @@ public class GcmInstanceIDListenerService extends InstanceIDListenerService {
List<ServerInfo> serverInfoList = ConnectivityManager.getInstance(getApplicationContext()) List<ServerInfo> serverInfoList = ConnectivityManager.getInstance(getApplicationContext())
.getServerList(); .getServerList();
for (ServerInfo serverInfo : serverInfoList) { for (ServerInfo serverInfo : serverInfoList) {
RealmHelper realmHelper = RealmStore.get(serverInfo.hostname); RealmHelper realmHelper = RealmStore.get(serverInfo.getHostname());
if (realmHelper != null) { if (realmHelper != null) {
updateGcmToken(realmHelper); updateGcmToken(realmHelper);
} }
...@@ -26,7 +26,7 @@ public class GcmInstanceIDListenerService extends InstanceIDListenerService { ...@@ -26,7 +26,7 @@ public class GcmInstanceIDListenerService extends InstanceIDListenerService {
} }
private void updateGcmToken(RealmHelper realmHelper) { private void updateGcmToken(RealmHelper realmHelper) {
final List<PublicSetting> results = realmHelper.executeTransactionForReadResults( final List<RealmPublicSetting> results = realmHelper.executeTransactionForReadResults(
GcmPushSettingHelper::queryForGcmPushEnabled); GcmPushSettingHelper::queryForGcmPushEnabled);
final boolean gcmPushEnabled = GcmPushSettingHelper.isGcmPushEnabled(results); final boolean gcmPushEnabled = GcmPushSettingHelper.isGcmPushEnabled(results);
......
...@@ -4,7 +4,7 @@ import android.content.Context; ...@@ -4,7 +4,7 @@ import android.content.Context;
import android.widget.ProgressBar; import android.widget.ProgressBar;
import android.widget.TextView; import android.widget.TextView;
import chat.rocket.android.model.internal.FileUploading; import chat.rocket.persistence.realm.models.internal.FileUploading;
/** /**
* rendering FileUploading status. * rendering FileUploading status.
......
...@@ -5,20 +5,23 @@ import android.support.graphics.drawable.VectorDrawableCompat; ...@@ -5,20 +5,23 @@ import android.support.graphics.drawable.VectorDrawableCompat;
import android.view.View; import android.view.View;
import android.widget.TextView; import android.widget.TextView;
import java.util.List;
import chat.rocket.android.R; import chat.rocket.android.R;
import chat.rocket.android.helper.Avatar; import chat.rocket.android.helper.Avatar;
import chat.rocket.android.helper.DateTime; import chat.rocket.android.helper.DateTime;
import chat.rocket.android.helper.TextUtils; import chat.rocket.android.helper.TextUtils;
import chat.rocket.android.model.SyncState; import chat.rocket.core.SyncState;
import chat.rocket.android.model.ddp.Message; import chat.rocket.core.models.Attachment;
import chat.rocket.android.model.ddp.User; import chat.rocket.core.models.Message;
import chat.rocket.android.widget.RocketChatAvatar; import chat.rocket.android.widget.RocketChatAvatar;
import chat.rocket.android.widget.message.RocketChatMessageAttachmentsLayout; import chat.rocket.android.widget.message.RocketChatMessageAttachmentsLayout;
import chat.rocket.android.widget.message.RocketChatMessageLayout; import chat.rocket.android.widget.message.RocketChatMessageLayout;
import chat.rocket.android.widget.message.RocketChatMessageUrlsLayout; import chat.rocket.android.widget.message.RocketChatMessageUrlsLayout;
import chat.rocket.core.models.User;
import chat.rocket.core.models.WebContent;
/** /**
* Renderer for Message model. * Renderer for RealmMessage model.
*/ */
public class MessageRenderer extends AbstractRenderer<Message> { public class MessageRenderer extends AbstractRenderer<Message> {
...@@ -103,12 +106,12 @@ public class MessageRenderer extends AbstractRenderer<Message> { ...@@ -103,12 +106,12 @@ public class MessageRenderer extends AbstractRenderer<Message> {
return this; return this;
} }
String urls = object.getUrls(); List<WebContent> webContents = object.getWebContents();
if (TextUtils.isEmpty(urls)) { if (webContents == null || webContents.size() == 0) {
urlsLayout.setVisibility(View.GONE); urlsLayout.setVisibility(View.GONE);
} else { } else {
urlsLayout.setVisibility(View.VISIBLE); urlsLayout.setVisibility(View.VISIBLE);
urlsLayout.setUrls(urls); urlsLayout.setUrls(webContents);
} }
return this; return this;
...@@ -118,13 +121,13 @@ public class MessageRenderer extends AbstractRenderer<Message> { ...@@ -118,13 +121,13 @@ public class MessageRenderer extends AbstractRenderer<Message> {
* show urls in RocketChatMessageUrlsLayout. * show urls in RocketChatMessageUrlsLayout.
*/ */
public MessageRenderer attachmentsInto(RocketChatMessageAttachmentsLayout attachmentsLayout, public MessageRenderer attachmentsInto(RocketChatMessageAttachmentsLayout attachmentsLayout,
String hostname, String userId, String token) { String hostname) {
if (!shouldHandle(attachmentsLayout)) { if (!shouldHandle(attachmentsLayout)) {
return this; return this;
} }
String attachments = object.getAttachments(); List<Attachment> attachments = object.getAttachments();
if (TextUtils.isEmpty(attachments)) { if (attachments == null || attachments.size() == 0) {
attachmentsLayout.setVisibility(View.GONE); attachmentsLayout.setVisibility(View.GONE);
} else { } else {
attachmentsLayout.setVisibility(View.VISIBLE); attachmentsLayout.setVisibility(View.VISIBLE);
......
...@@ -7,11 +7,11 @@ import android.widget.TextView; ...@@ -7,11 +7,11 @@ import android.widget.TextView;
import chat.rocket.android.R; import chat.rocket.android.R;
import chat.rocket.android.helper.Avatar; import chat.rocket.android.helper.Avatar;
import chat.rocket.android.helper.TextUtils; import chat.rocket.android.helper.TextUtils;
import chat.rocket.android.model.ddp.User; import chat.rocket.core.models.User;
import chat.rocket.android.widget.RocketChatAvatar; import chat.rocket.android.widget.RocketChatAvatar;
/** /**
* Renderer for User model. * Renderer for RealmUser model.
*/ */
public class UserRenderer extends AbstractRenderer<User> { public class UserRenderer extends AbstractRenderer<User> {
......
...@@ -3,6 +3,7 @@ package chat.rocket.android.service; ...@@ -3,6 +3,7 @@ package chat.rocket.android.service;
import android.support.annotation.Nullable; import android.support.annotation.Nullable;
import java.util.List; import java.util.List;
import chat.rocket.core.models.ServerInfo;
import rx.Observable; import rx.Observable;
import rx.Single; import rx.Single;
......
package chat.rocket.android.service; package chat.rocket.android.service;
import java.util.List; import java.util.List;
import chat.rocket.core.models.ServerInfo;
/** /**
* interfaces used for RocketChatService and RocketChatwebSocketThread. * interfaces used for RocketChatService and RocketChatwebSocketThread.
......
...@@ -13,6 +13,8 @@ import java.util.Map; ...@@ -13,6 +13,8 @@ import java.util.Map;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import chat.rocket.android.helper.RxHelper; import chat.rocket.android.helper.RxHelper;
import chat.rocket.android.log.RCLog; import chat.rocket.android.log.RCLog;
import chat.rocket.core.models.ServerInfo;
import chat.rocket.persistence.realm.models.RealmBasedServerInfo;
import hugo.weaving.DebugLog; import hugo.weaving.DebugLog;
import rx.Observable; import rx.Observable;
import rx.Single; import rx.Single;
...@@ -41,7 +43,7 @@ import rx.subjects.PublishSubject; ...@@ -41,7 +43,7 @@ import rx.subjects.PublishSubject;
/*package*/ RealmBasedConnectivityManager setContext(Context appContext) { /*package*/ RealmBasedConnectivityManager setContext(Context appContext) {
this.appContext = appContext; this.appContext = appContext.getApplicationContext();
return this; return this;
} }
...@@ -49,7 +51,7 @@ import rx.subjects.PublishSubject; ...@@ -49,7 +51,7 @@ import rx.subjects.PublishSubject;
public void resetConnectivityStateList() { public void resetConnectivityStateList() {
serverConnectivityList.clear(); serverConnectivityList.clear();
for (ServerInfo serverInfo : RealmBasedServerInfo.getServerInfoList()) { for (ServerInfo serverInfo : RealmBasedServerInfo.getServerInfoList()) {
serverConnectivityList.put(serverInfo.hostname, ServerConnectivity.STATE_DISCONNECTED); serverConnectivityList.put(serverInfo.getHostname(), ServerConnectivity.STATE_DISCONNECTED);
} }
} }
...@@ -65,7 +67,8 @@ import rx.subjects.PublishSubject; ...@@ -65,7 +67,8 @@ import rx.subjects.PublishSubject;
public void ensureConnections() { public void ensureConnections() {
for (String hostname : serverConnectivityList.keySet()) { for (String hostname : serverConnectivityList.keySet()) {
connectToServerIfNeeded(hostname, true/* force connect */) connectToServerIfNeeded(hostname, true/* force connect */)
.subscribe(_val -> { }, RCLog::e); .subscribe(_val -> {
}, RCLog::e);
} }
} }
...@@ -77,7 +80,8 @@ import rx.subjects.PublishSubject; ...@@ -77,7 +80,8 @@ import rx.subjects.PublishSubject;
serverConnectivityList.put(hostname, ServerConnectivity.STATE_DISCONNECTED); serverConnectivityList.put(hostname, ServerConnectivity.STATE_DISCONNECTED);
} }
connectToServerIfNeeded(hostname, false) connectToServerIfNeeded(hostname, false)
.subscribe(_val -> { }, RCLog::e); .subscribe(_val -> {
}, RCLog::e);
} }
@Override @Override
...@@ -85,7 +89,8 @@ import rx.subjects.PublishSubject; ...@@ -85,7 +89,8 @@ import rx.subjects.PublishSubject;
RealmBasedServerInfo.remove(hostname); RealmBasedServerInfo.remove(hostname);
if (serverConnectivityList.containsKey(hostname)) { if (serverConnectivityList.containsKey(hostname)) {
disconnectFromServerIfNeeded(hostname) disconnectFromServerIfNeeded(hostname)
.subscribe(_val -> { }, RCLog::e); .subscribe(_val -> {
}, RCLog::e);
} }
} }
...@@ -185,7 +190,8 @@ import rx.subjects.PublishSubject; ...@@ -185,7 +190,8 @@ import rx.subjects.PublishSubject;
.filter(serverConnectivity -> hostname.equals(serverConnectivity.hostname)) .filter(serverConnectivity -> hostname.equals(serverConnectivity.hostname))
.map(serverConnectivity -> serverConnectivity.state) .map(serverConnectivity -> serverConnectivity.state)
.filter(state -> .filter(state ->
state == ServerConnectivity.STATE_CONNECTED || state == ServerConnectivity.STATE_DISCONNECTED) state == ServerConnectivity.STATE_CONNECTED
|| state == ServerConnectivity.STATE_DISCONNECTED)
.first() .first()
.toSingle() .toSingle()
.flatMap(state -> .flatMap(state ->
......
...@@ -14,9 +14,10 @@ import chat.rocket.android.api.MethodCallHelper; ...@@ -14,9 +14,10 @@ import chat.rocket.android.api.MethodCallHelper;
import chat.rocket.android.helper.LogcatIfError; import chat.rocket.android.helper.LogcatIfError;
import chat.rocket.android.helper.TextUtils; import chat.rocket.android.helper.TextUtils;
import chat.rocket.android.log.RCLog; import chat.rocket.android.log.RCLog;
import chat.rocket.android.model.internal.Session; import chat.rocket.core.models.ServerInfo;
import chat.rocket.android.realm_helper.RealmHelper; import chat.rocket.persistence.realm.models.internal.RealmSession;
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.ActiveUsersSubscriber;
import chat.rocket.android.service.ddp.base.LoginServiceConfigurationSubscriber; import chat.rocket.android.service.ddp.base.LoginServiceConfigurationSubscriber;
import chat.rocket.android.service.ddp.base.UserDataSubscriber; import chat.rocket.android.service.ddp.base.UserDataSubscriber;
...@@ -126,7 +127,7 @@ public class RocketChatWebSocketThread extends HandlerThread { ...@@ -126,7 +127,7 @@ public class RocketChatWebSocketThread extends HandlerThread {
private void forceInvalidateTokens() { private void forceInvalidateTokens() {
realmHelper.executeTransaction(realm -> { realmHelper.executeTransaction(realm -> {
Session session = Session.queryDefaultSession(realm).findFirst(); RealmSession session = RealmSession.queryDefaultSession(realm).findFirst();
if (session != null if (session != null
&& !TextUtils.isEmpty(session.getToken()) && !TextUtils.isEmpty(session.getToken())
&& (session.isTokenVerified() || !TextUtils.isEmpty(session.getError()))) { && (session.isTokenVerified() || !TextUtils.isEmpty(session.getError()))) {
...@@ -225,7 +226,7 @@ public class RocketChatWebSocketThread extends HandlerThread { ...@@ -225,7 +226,7 @@ public class RocketChatWebSocketThread extends HandlerThread {
.flatMap(_val -> Single.fromEmitter(emitter -> { .flatMap(_val -> Single.fromEmitter(emitter -> {
ServerInfo info = connectivityManager.getServerInfoForHost(hostname); ServerInfo info = connectivityManager.getServerInfoForHost(hostname);
RCLog.d("DDPClient#connect"); RCLog.d("DDPClient#connect");
ddpClient.connect(info.session, !info.insecure) ddpClient.connect(info.getSession(), info.isSecure())
.onSuccessTask(task -> { .onSuccessTask(task -> {
final String newSession = task.getResult().session; final String newSession = task.getResult().session;
connectivityManager.notifyConnectionEstablished(hostname, newSession); connectivityManager.notifyConnectionEstablished(hostname, newSession);
...@@ -239,10 +240,10 @@ public class RocketChatWebSocketThread extends HandlerThread { ...@@ -239,10 +240,10 @@ public class RocketChatWebSocketThread extends HandlerThread {
}); });
return realmHelper.executeTransaction(realm -> { return realmHelper.executeTransaction(realm -> {
Session sessionObj = Session.queryDefaultSession(realm).findFirst(); RealmSession sessionObj = RealmSession.queryDefaultSession(realm).findFirst();
if (sessionObj == null) { if (sessionObj == null) {
realm.createOrUpdateObjectFromJson(Session.class, realm.createOrUpdateObjectFromJson(RealmSession.class,
new JSONObject().put(Session.ID, Session.DEFAULT_ID)); new JSONObject().put(RealmSession.ID, RealmSession.DEFAULT_ID));
} else { } else {
// invalidate login token. // invalidate login token.
if (!TextUtils.isEmpty(sessionObj.getToken()) && sessionObj.isTokenVerified()) { if (!TextUtils.isEmpty(sessionObj.getToken()) && sessionObj.isTokenVerified()) {
......
package chat.rocket.android.service;
/**
* Stores information just for required for initializing connectivity manager.
*/
public class ServerInfo {
public final String hostname;
public final String name;
/*package*/ final String session;
public final boolean insecure;
public ServerInfo(String hostname, String name, String session, boolean insecure) {
this.hostname = hostname;
this.name = name;
this.session = session;
this.insecure = insecure;
}
}
...@@ -11,7 +11,7 @@ import org.json.JSONObject; ...@@ -11,7 +11,7 @@ import org.json.JSONObject;
import java.util.Iterator; import java.util.Iterator;
import chat.rocket.android.helper.LogcatIfError; import chat.rocket.android.helper.LogcatIfError;
import chat.rocket.android.log.RCLog; 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.DDPClientRef;
import chat.rocket.android.service.Registrable; import chat.rocket.android.service.Registrable;
import chat.rocket.android_ddp.DDPSubscription; import chat.rocket.android_ddp.DDPSubscription;
......
...@@ -3,7 +3,7 @@ package chat.rocket.android.service.ddp.base; ...@@ -3,7 +3,7 @@ package chat.rocket.android.service.ddp.base;
import android.content.Context; import android.content.Context;
import org.json.JSONArray; 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.DDPClientRef;
import chat.rocket.android.service.ddp.AbstractDDPDocEventSubscriber; import chat.rocket.android.service.ddp.AbstractDDPDocEventSubscriber;
......
...@@ -5,8 +5,8 @@ import io.realm.RealmObject; ...@@ -5,8 +5,8 @@ import io.realm.RealmObject;
import org.json.JSONException; import org.json.JSONException;
import org.json.JSONObject; import org.json.JSONObject;
import chat.rocket.android.model.ddp.User; import chat.rocket.persistence.realm.models.ddp.RealmUser;
import chat.rocket.android.realm_helper.RealmHelper; import chat.rocket.persistence.realm.RealmHelper;
import chat.rocket.android.service.DDPClientRef; import chat.rocket.android.service.DDPClientRef;
/** /**
...@@ -30,7 +30,7 @@ public class ActiveUsersSubscriber extends AbstractBaseSubscriber { ...@@ -30,7 +30,7 @@ public class ActiveUsersSubscriber extends AbstractBaseSubscriber {
@Override @Override
protected Class<? extends RealmObject> getModelClass() { protected Class<? extends RealmObject> getModelClass() {
return User.class; return RealmUser.class;
} }
@Override @Override
......
...@@ -3,8 +3,8 @@ package chat.rocket.android.service.ddp.base; ...@@ -3,8 +3,8 @@ package chat.rocket.android.service.ddp.base;
import android.content.Context; import android.content.Context;
import io.realm.RealmObject; import io.realm.RealmObject;
import chat.rocket.android.model.ddp.MeteorLoginServiceConfiguration; import chat.rocket.persistence.realm.models.ddp.RealmMeteorLoginServiceConfiguration;
import chat.rocket.android.realm_helper.RealmHelper; import chat.rocket.persistence.realm.RealmHelper;
import chat.rocket.android.service.DDPClientRef; import chat.rocket.android.service.DDPClientRef;
/** /**
...@@ -28,6 +28,6 @@ public class LoginServiceConfigurationSubscriber extends AbstractBaseSubscriber ...@@ -28,6 +28,6 @@ public class LoginServiceConfigurationSubscriber extends AbstractBaseSubscriber
@Override @Override
protected Class<? extends RealmObject> getModelClass() { protected Class<? extends RealmObject> getModelClass() {
return MeteorLoginServiceConfiguration.class; return RealmMeteorLoginServiceConfiguration.class;
} }
} }
...@@ -5,8 +5,8 @@ import io.realm.RealmObject; ...@@ -5,8 +5,8 @@ import io.realm.RealmObject;
import org.json.JSONException; import org.json.JSONException;
import org.json.JSONObject; import org.json.JSONObject;
import chat.rocket.android.model.ddp.User; import chat.rocket.persistence.realm.models.ddp.RealmUser;
import chat.rocket.android.realm_helper.RealmHelper; import chat.rocket.persistence.realm.RealmHelper;
import chat.rocket.android.service.DDPClientRef; import chat.rocket.android.service.DDPClientRef;
/** /**
...@@ -30,7 +30,7 @@ public class UserDataSubscriber extends AbstractBaseSubscriber { ...@@ -30,7 +30,7 @@ public class UserDataSubscriber extends AbstractBaseSubscriber {
@Override @Override
protected Class<? extends RealmObject> getModelClass() { protected Class<? extends RealmObject> getModelClass() {
return User.class; return RealmUser.class;
} }
@Override @Override
......
...@@ -7,7 +7,7 @@ import org.json.JSONObject; ...@@ -7,7 +7,7 @@ import org.json.JSONObject;
import chat.rocket.android.helper.LogcatIfError; import chat.rocket.android.helper.LogcatIfError;
import chat.rocket.android.log.RCLog; 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.DDPClientRef;
import chat.rocket.android.service.ddp.AbstractDDPDocEventSubscriber; import chat.rocket.android.service.ddp.AbstractDDPDocEventSubscriber;
import chat.rocket.android_ddp.DDPSubscription; import chat.rocket.android_ddp.DDPSubscription;
......
...@@ -2,7 +2,7 @@ package chat.rocket.android.service.ddp.stream; ...@@ -2,7 +2,7 @@ package chat.rocket.android.service.ddp.stream;
import android.content.Context; import android.content.Context;
import chat.rocket.android.realm_helper.RealmHelper; import chat.rocket.persistence.realm.RealmHelper;
import chat.rocket.android.service.DDPClientRef; import chat.rocket.android.service.DDPClientRef;
abstract class AbstractStreamNotifyUserEventSubscriber extends AbstractStreamNotifyEventSubscriber { abstract class AbstractStreamNotifyUserEventSubscriber extends AbstractStreamNotifyEventSubscriber {
......
...@@ -5,8 +5,8 @@ import io.realm.RealmObject; ...@@ -5,8 +5,8 @@ import io.realm.RealmObject;
import org.json.JSONException; import org.json.JSONException;
import org.json.JSONObject; import org.json.JSONObject;
import chat.rocket.android.model.ddp.RoomSubscription; import chat.rocket.persistence.realm.models.ddp.RealmRoom;
import chat.rocket.android.realm_helper.RealmHelper; import chat.rocket.persistence.realm.RealmHelper;
import chat.rocket.android.service.DDPClientRef; import chat.rocket.android.service.DDPClientRef;
public class StreamNotifyUserSubscriptionsChanged extends AbstractStreamNotifyUserEventSubscriber { public class StreamNotifyUserSubscriptionsChanged extends AbstractStreamNotifyUserEventSubscriber {
...@@ -23,12 +23,12 @@ public class StreamNotifyUserSubscriptionsChanged extends AbstractStreamNotifyUs ...@@ -23,12 +23,12 @@ public class StreamNotifyUserSubscriptionsChanged extends AbstractStreamNotifyUs
@Override @Override
protected Class<? extends RealmObject> getModelClass() { protected Class<? extends RealmObject> getModelClass() {
return RoomSubscription.class; return RealmRoom.class;
} }
@Override @Override
protected JSONObject customizeFieldJson(JSONObject json) throws JSONException { protected JSONObject customizeFieldJson(JSONObject json) throws JSONException {
return RoomSubscription.customizeJson(super.customizeFieldJson(json)); return RealmRoom.customizeJson(super.customizeFieldJson(json));
} }
@Override @Override
......
...@@ -5,8 +5,8 @@ import io.realm.RealmObject; ...@@ -5,8 +5,8 @@ import io.realm.RealmObject;
import org.json.JSONException; import org.json.JSONException;
import org.json.JSONObject; import org.json.JSONObject;
import chat.rocket.android.model.ddp.Message; import chat.rocket.persistence.realm.models.ddp.RealmMessage;
import chat.rocket.android.realm_helper.RealmHelper; import chat.rocket.persistence.realm.RealmHelper;
import chat.rocket.android.service.DDPClientRef; import chat.rocket.android.service.DDPClientRef;
/** /**
...@@ -33,7 +33,7 @@ public class StreamRoomMessage extends AbstractStreamNotifyEventSubscriber { ...@@ -33,7 +33,7 @@ public class StreamRoomMessage extends AbstractStreamNotifyEventSubscriber {
@Override @Override
protected Class<? extends RealmObject> getModelClass() { protected Class<? extends RealmObject> getModelClass() {
return Message.class; return RealmMessage.class;
} }
@Override @Override
...@@ -43,6 +43,6 @@ public class StreamRoomMessage extends AbstractStreamNotifyEventSubscriber { ...@@ -43,6 +43,6 @@ public class StreamRoomMessage extends AbstractStreamNotifyEventSubscriber {
@Override @Override
protected JSONObject customizeFieldJson(JSONObject json) throws JSONException { protected JSONObject customizeFieldJson(JSONObject json) throws JSONException {
return Message.customizeJson(super.customizeFieldJson(json)); return RealmMessage.customizeJson(super.customizeFieldJson(json));
} }
} }
...@@ -5,8 +5,8 @@ import android.content.SharedPreferences; ...@@ -5,8 +5,8 @@ import android.content.SharedPreferences;
import chat.rocket.android.RocketChatCache; import chat.rocket.android.RocketChatCache;
import chat.rocket.android.helper.TextUtils; import chat.rocket.android.helper.TextUtils;
import chat.rocket.android.model.ddp.RoomSubscription; import chat.rocket.persistence.realm.models.ddp.RealmRoom;
import chat.rocket.android.realm_helper.RealmHelper; import chat.rocket.persistence.realm.RealmHelper;
import chat.rocket.android.service.Registrable; import chat.rocket.android.service.Registrable;
public abstract class AbstractRocketChatCacheObserver implements Registrable { public abstract class AbstractRocketChatCacheObserver implements Registrable {
...@@ -28,8 +28,8 @@ public abstract class AbstractRocketChatCacheObserver implements Registrable { ...@@ -28,8 +28,8 @@ public abstract class AbstractRocketChatCacheObserver implements Registrable {
private void updateRoomIdWith(SharedPreferences prefs) { private void updateRoomIdWith(SharedPreferences prefs) {
String roomId = prefs.getString(RocketChatCache.KEY_SELECTED_ROOM_ID, null); String roomId = prefs.getString(RocketChatCache.KEY_SELECTED_ROOM_ID, null);
if (!TextUtils.isEmpty(roomId)) { if (!TextUtils.isEmpty(roomId)) {
RoomSubscription room = realmHelper.executeTransactionForRead(realm -> RealmRoom room = realmHelper.executeTransactionForRead(realm ->
realm.where(RoomSubscription.class).equalTo("rid", roomId).findFirst()); realm.where(RealmRoom.class).equalTo("rid", roomId).findFirst());
if (room != null) { if (room != null) {
if (this.roomId == null || !this.roomId.equals(roomId)) { if (this.roomId == null || !this.roomId.equals(roomId)) {
this.roomId = roomId; this.roomId = roomId;
......
...@@ -4,7 +4,7 @@ import android.content.Context; ...@@ -4,7 +4,7 @@ import android.content.Context;
import android.os.Handler; import android.os.Handler;
import android.os.Looper; 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.DDPClientRef;
import chat.rocket.android.service.Registrable; import chat.rocket.android.service.Registrable;
import chat.rocket.android.service.ddp.stream.StreamRoomMessage; import chat.rocket.android.service.ddp.stream.StreamRoomMessage;
......
...@@ -3,8 +3,8 @@ package chat.rocket.android.service.observer; ...@@ -3,8 +3,8 @@ package chat.rocket.android.service.observer;
import android.content.Context; import android.content.Context;
import io.realm.RealmObject; import io.realm.RealmObject;
import chat.rocket.android.realm_helper.RealmHelper; import chat.rocket.persistence.realm.RealmHelper;
import chat.rocket.android.realm_helper.RealmListObserver; import chat.rocket.persistence.realm.RealmListObserver;
import chat.rocket.android.service.DDPClientRef; import chat.rocket.android.service.DDPClientRef;
import chat.rocket.android.service.Registrable; import chat.rocket.android.service.Registrable;
......
...@@ -8,8 +8,8 @@ import java.util.ArrayList; ...@@ -8,8 +8,8 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
import chat.rocket.android.api.MethodCallHelper; import chat.rocket.android.api.MethodCallHelper;
import chat.rocket.android.helper.LogcatIfError; import chat.rocket.android.helper.LogcatIfError;
import chat.rocket.android.model.ddp.User; import chat.rocket.persistence.realm.models.ddp.RealmUser;
import chat.rocket.android.realm_helper.RealmHelper; import chat.rocket.persistence.realm.RealmHelper;
import chat.rocket.android.service.DDPClientRef; import chat.rocket.android.service.DDPClientRef;
import chat.rocket.android.service.Registrable; import chat.rocket.android.service.Registrable;
import chat.rocket.android.service.ddp.stream.StreamNotifyUserSubscriptionsChanged; import chat.rocket.android.service.ddp.stream.StreamNotifyUserSubscriptionsChanged;
...@@ -18,7 +18,7 @@ import hugo.weaving.DebugLog; ...@@ -18,7 +18,7 @@ import hugo.weaving.DebugLog;
/** /**
* observe the user with emails. * observe the user with emails.
*/ */
public class CurrentUserObserver extends AbstractModelObserver<User> { public class CurrentUserObserver extends AbstractModelObserver<RealmUser> {
private final MethodCallHelper methodCall; private final MethodCallHelper methodCall;
private boolean currentUserExists; private boolean currentUserExists;
private ArrayList<Registrable> listeners; private ArrayList<Registrable> listeners;
...@@ -31,12 +31,12 @@ public class CurrentUserObserver extends AbstractModelObserver<User> { ...@@ -31,12 +31,12 @@ public class CurrentUserObserver extends AbstractModelObserver<User> {
} }
@Override @Override
public RealmResults<User> queryItems(Realm realm) { public RealmResults<RealmUser> queryItems(Realm realm) {
return User.queryCurrentUser(realm).findAll(); return RealmUser.queryCurrentUser(realm).findAll();
} }
@Override @Override
public void onUpdateResults(List<User> results) { public void onUpdateResults(List<RealmUser> results) {
boolean exists = !results.isEmpty(); boolean exists = !results.isEmpty();
if (currentUserExists != exists) { if (currentUserExists != exists) {
...@@ -50,7 +50,7 @@ public class CurrentUserObserver extends AbstractModelObserver<User> { ...@@ -50,7 +50,7 @@ public class CurrentUserObserver extends AbstractModelObserver<User> {
} }
@DebugLog @DebugLog
private void onLogin(User user) { private void onLogin(RealmUser user) {
if (listeners != null) { if (listeners != null) {
onLogout(); onLogout();
} }
......
...@@ -15,9 +15,9 @@ import chat.rocket.android.api.FileUploadingHelper; ...@@ -15,9 +15,9 @@ import chat.rocket.android.api.FileUploadingHelper;
import chat.rocket.android.helper.LogcatIfError; import chat.rocket.android.helper.LogcatIfError;
import chat.rocket.android.helper.OkHttpHelper; import chat.rocket.android.helper.OkHttpHelper;
import chat.rocket.android.log.RCLog; import chat.rocket.android.log.RCLog;
import chat.rocket.android.model.SyncState; import chat.rocket.core.SyncState;
import chat.rocket.android.model.internal.FileUploading; import chat.rocket.persistence.realm.models.internal.FileUploading;
import chat.rocket.android.realm_helper.RealmHelper; import chat.rocket.persistence.realm.RealmHelper;
import chat.rocket.android.service.DDPClientRef; import chat.rocket.android.service.DDPClientRef;
import okhttp3.MediaType; import okhttp3.MediaType;
import okhttp3.MultipartBody; import okhttp3.MultipartBody;
......
...@@ -13,11 +13,11 @@ import chat.rocket.android.api.FileUploadingHelper; ...@@ -13,11 +13,11 @@ import chat.rocket.android.api.FileUploadingHelper;
import chat.rocket.android.helper.LogcatIfError; import chat.rocket.android.helper.LogcatIfError;
import chat.rocket.android.helper.OkHttpHelper; import chat.rocket.android.helper.OkHttpHelper;
import chat.rocket.android.log.RCLog; import chat.rocket.android.log.RCLog;
import chat.rocket.android.model.SyncState; import chat.rocket.core.SyncState;
import chat.rocket.android.model.ddp.User; import chat.rocket.persistence.realm.models.ddp.RealmUser;
import chat.rocket.android.model.internal.FileUploading; import chat.rocket.persistence.realm.models.internal.FileUploading;
import chat.rocket.android.model.internal.Session; import chat.rocket.persistence.realm.models.internal.RealmSession;
import chat.rocket.android.realm_helper.RealmHelper; import chat.rocket.persistence.realm.RealmHelper;
import chat.rocket.android.service.DDPClientRef; import chat.rocket.android.service.DDPClientRef;
import okhttp3.MediaType; import okhttp3.MediaType;
import okhttp3.Request; import okhttp3.Request;
...@@ -92,10 +92,10 @@ public class FileUploadingWithUfsObserver extends AbstractModelObserver<FileUplo ...@@ -92,10 +92,10 @@ public class FileUploadingWithUfsObserver extends AbstractModelObserver<FileUplo
return; return;
} }
User currentUser = realmHelper.executeTransactionForRead(realm -> RealmUser currentUser = realmHelper.executeTransactionForRead(realm ->
User.queryCurrentUser(realm).findFirst()); RealmUser.queryCurrentUser(realm).findFirst());
Session session = realmHelper.executeTransactionForRead(realm -> RealmSession session = realmHelper.executeTransactionForRead(realm ->
Session.queryDefaultSession(realm).findFirst()); RealmSession.queryDefaultSession(realm).findFirst());
if (currentUser == null || session == null) { if (currentUser == null || session == null) {
return; return;
} }
......
...@@ -13,12 +13,12 @@ import bolts.Task; ...@@ -13,12 +13,12 @@ import bolts.Task;
import chat.rocket.android.RocketChatCache; import chat.rocket.android.RocketChatCache;
import chat.rocket.android.api.RaixPushHelper; import chat.rocket.android.api.RaixPushHelper;
import chat.rocket.android.helper.LogcatIfError; import chat.rocket.android.helper.LogcatIfError;
import chat.rocket.android.model.SyncState; import chat.rocket.core.SyncState;
import chat.rocket.android.model.ddp.PublicSetting; import chat.rocket.persistence.realm.models.ddp.RealmPublicSetting;
import chat.rocket.android.model.ddp.PublicSettingsConstants; import chat.rocket.core.PublicSettingsConstants;
import chat.rocket.android.model.ddp.User; import chat.rocket.persistence.realm.models.ddp.RealmUser;
import chat.rocket.android.model.internal.GcmPushRegistration; import chat.rocket.persistence.realm.models.internal.GcmPushRegistration;
import chat.rocket.android.realm_helper.RealmHelper; import chat.rocket.persistence.realm.RealmHelper;
import chat.rocket.android.service.DDPClientRef; import chat.rocket.android.service.DDPClientRef;
/** /**
...@@ -66,12 +66,12 @@ public class GcmPushRegistrationObserver extends AbstractModelObserver<GcmPushRe ...@@ -66,12 +66,12 @@ public class GcmPushRegistrationObserver extends AbstractModelObserver<GcmPushRe
} }
private Task<Void> registerGcmTokenForServer() throws IOException { private Task<Void> registerGcmTokenForServer() throws IOException {
final String senderId = PublicSetting final String senderId = RealmPublicSetting
.getString(realmHelper, PublicSettingsConstants.Push.GCM_PROJECT_NUMBER, "").trim(); .getString(realmHelper, PublicSettingsConstants.Push.GCM_PROJECT_NUMBER, "").trim();
final String gcmToken = getGcmToken(senderId); final String gcmToken = getGcmToken(senderId);
final User currentUser = realmHelper.executeTransactionForRead(realm -> final RealmUser currentUser = realmHelper.executeTransactionForRead(realm ->
User.queryCurrentUser(realm).findFirst()); RealmUser.queryCurrentUser(realm).findFirst());
final String userId = currentUser != null ? currentUser.getId() : null; final String userId = currentUser != null ? currentUser.getId() : null;
final String pushId = RocketChatCache.getOrCreatePushId(context); final String pushId = RocketChatCache.getOrCreatePushId(context);
......
...@@ -9,9 +9,9 @@ import java.util.List; ...@@ -9,9 +9,9 @@ import java.util.List;
import bolts.Task; import bolts.Task;
import chat.rocket.android.api.MethodCallHelper; import chat.rocket.android.api.MethodCallHelper;
import chat.rocket.android.log.RCLog; import chat.rocket.android.log.RCLog;
import chat.rocket.android.model.SyncState; import chat.rocket.core.SyncState;
import chat.rocket.android.model.internal.GetUsersOfRoomsProcedure; import chat.rocket.persistence.realm.models.internal.GetUsersOfRoomsProcedure;
import chat.rocket.android.realm_helper.RealmHelper; import chat.rocket.persistence.realm.RealmHelper;
import chat.rocket.android.service.DDPClientRef; import chat.rocket.android.service.DDPClientRef;
/** /**
......
...@@ -10,10 +10,10 @@ import java.util.List; ...@@ -10,10 +10,10 @@ import java.util.List;
import bolts.Task; import bolts.Task;
import chat.rocket.android.api.MethodCallHelper; import chat.rocket.android.api.MethodCallHelper;
import chat.rocket.android.log.RCLog; import chat.rocket.android.log.RCLog;
import chat.rocket.android.model.SyncState; import chat.rocket.core.SyncState;
import chat.rocket.android.model.ddp.Message; import chat.rocket.persistence.realm.models.ddp.RealmMessage;
import chat.rocket.android.model.internal.LoadMessageProcedure; import chat.rocket.persistence.realm.models.internal.LoadMessageProcedure;
import chat.rocket.android.realm_helper.RealmHelper; import chat.rocket.persistence.realm.RealmHelper;
import chat.rocket.android.service.DDPClientRef; import chat.rocket.android.service.DDPClientRef;
/** /**
...@@ -56,11 +56,11 @@ public class LoadMessageProcedureObserver extends AbstractModelObserver<LoadMess ...@@ -56,11 +56,11 @@ public class LoadMessageProcedureObserver extends AbstractModelObserver<LoadMess
).onSuccessTask(task -> ).onSuccessTask(task ->
methodCall.loadHistory(roomId, isReset ? 0 : timestamp, count, lastSeen) methodCall.loadHistory(roomId, isReset ? 0 : timestamp, count, lastSeen)
.onSuccessTask(_task -> { .onSuccessTask(_task -> {
Message lastMessage = realmHelper.executeTransactionForRead(realm -> RealmMessage lastMessage = realmHelper.executeTransactionForRead(realm ->
realm.where(Message.class) realm.where(RealmMessage.class)
.equalTo(Message.ROOM_ID, roomId) .equalTo(RealmMessage.ROOM_ID, roomId)
.equalTo(Message.SYNC_STATE, SyncState.SYNCED) .equalTo(RealmMessage.SYNC_STATE, SyncState.SYNCED)
.findAllSorted(Message.TIMESTAMP, Sort.ASCENDING).first(null)); .findAllSorted(RealmMessage.TIMESTAMP, Sort.ASCENDING).first(null));
long lastTs = lastMessage != null ? lastMessage.getTimestamp() : 0; long lastTs = lastMessage != null ? lastMessage.getTimestamp() : 0;
int messageCount = _task.getResult().length(); int messageCount = _task.getResult().length();
return realmHelper.executeTransaction(realm -> return realmHelper.executeTransaction(realm ->
......
...@@ -8,9 +8,9 @@ import org.json.JSONObject; ...@@ -8,9 +8,9 @@ import org.json.JSONObject;
import java.util.List; import java.util.List;
import chat.rocket.android.helper.CheckSum; import chat.rocket.android.helper.CheckSum;
import chat.rocket.android.helper.LogcatIfError; import chat.rocket.android.helper.LogcatIfError;
import chat.rocket.android.model.SyncState; import chat.rocket.core.SyncState;
import chat.rocket.android.model.internal.MethodCall; import chat.rocket.persistence.realm.models.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.service.DDPClientRef;
import chat.rocket.android_ddp.DDPClientCallback; import chat.rocket.android_ddp.DDPClientCallback;
......
...@@ -9,15 +9,15 @@ import java.util.List; ...@@ -9,15 +9,15 @@ import java.util.List;
import chat.rocket.android.api.MethodCallHelper; import chat.rocket.android.api.MethodCallHelper;
import chat.rocket.android.helper.LogcatIfError; import chat.rocket.android.helper.LogcatIfError;
import chat.rocket.android.log.RCLog; import chat.rocket.android.log.RCLog;
import chat.rocket.android.model.SyncState; import chat.rocket.core.SyncState;
import chat.rocket.android.model.ddp.Message; import chat.rocket.persistence.realm.models.ddp.RealmMessage;
import chat.rocket.android.realm_helper.RealmHelper; import chat.rocket.persistence.realm.RealmHelper;
import chat.rocket.android.service.DDPClientRef; import chat.rocket.android.service.DDPClientRef;
/** /**
* Observe messages for sending. * Observe messages for sending.
*/ */
public class NewMessageObserver extends AbstractModelObserver<Message> { public class NewMessageObserver extends AbstractModelObserver<RealmMessage> {
private final MethodCallHelper methodCall; private final MethodCallHelper methodCall;
...@@ -28,10 +28,10 @@ public class NewMessageObserver extends AbstractModelObserver<Message> { ...@@ -28,10 +28,10 @@ public class NewMessageObserver extends AbstractModelObserver<Message> {
realmHelper.executeTransaction(realm -> { realmHelper.executeTransaction(realm -> {
// resume pending operations. // resume pending operations.
RealmResults<Message> pendingMethodCalls = realm.where(Message.class) RealmResults<RealmMessage> pendingMethodCalls = realm.where(RealmMessage.class)
.equalTo(Message.SYNC_STATE, SyncState.SYNCING) .equalTo(RealmMessage.SYNC_STATE, SyncState.SYNCING)
.findAll(); .findAll();
for (Message message : pendingMethodCalls) { for (RealmMessage message : pendingMethodCalls) {
message.setSyncState(SyncState.NOT_SYNCED); message.setSyncState(SyncState.NOT_SYNCED);
} }
...@@ -40,37 +40,37 @@ public class NewMessageObserver extends AbstractModelObserver<Message> { ...@@ -40,37 +40,37 @@ public class NewMessageObserver extends AbstractModelObserver<Message> {
} }
@Override @Override
public RealmResults<Message> queryItems(Realm realm) { public RealmResults<RealmMessage> queryItems(Realm realm) {
return realm.where(Message.class) return realm.where(RealmMessage.class)
.equalTo(Message.SYNC_STATE, SyncState.NOT_SYNCED) .equalTo(RealmMessage.SYNC_STATE, SyncState.NOT_SYNCED)
.isNotNull(Message.ROOM_ID) .isNotNull(RealmMessage.ROOM_ID)
.findAll(); .findAll();
} }
@Override @Override
public void onUpdateResults(List<Message> results) { public void onUpdateResults(List<RealmMessage> results) {
if (results.isEmpty()) { if (results.isEmpty()) {
return; return;
} }
final Message message = results.get(0); final RealmMessage message = results.get(0);
final String messageId = message.getId(); final String messageId = message.getId();
final String roomId = message.getRoomId(); final String roomId = message.getRoomId();
final String msg = message.getMessage(); final String msg = message.getMessage();
realmHelper.executeTransaction(realm -> realmHelper.executeTransaction(realm ->
realm.createOrUpdateObjectFromJson(Message.class, new JSONObject() realm.createOrUpdateObjectFromJson(RealmMessage.class, new JSONObject()
.put(Message.ID, messageId) .put(RealmMessage.ID, messageId)
.put(Message.SYNC_STATE, SyncState.SYNCING) .put(RealmMessage.SYNC_STATE, SyncState.SYNCING)
) )
).onSuccessTask(task -> methodCall.sendMessage(messageId, roomId, msg) ).onSuccessTask(task -> methodCall.sendMessage(messageId, roomId, msg)
).continueWith(task -> { ).continueWith(task -> {
if (task.isFaulted()) { if (task.isFaulted()) {
RCLog.w(task.getError()); RCLog.w(task.getError());
realmHelper.executeTransaction(realm -> realmHelper.executeTransaction(realm ->
realm.createOrUpdateObjectFromJson(Message.class, new JSONObject() realm.createOrUpdateObjectFromJson(RealmMessage.class, new JSONObject()
.put(Message.ID, messageId) .put(RealmMessage.ID, messageId)
.put(Message.SYNC_STATE, SyncState.FAILED))); .put(RealmMessage.SYNC_STATE, SyncState.FAILED)));
} }
return null; return null;
}); });
......
...@@ -6,12 +6,12 @@ import io.realm.RealmResults; ...@@ -6,12 +6,12 @@ import io.realm.RealmResults;
import java.util.List; import java.util.List;
import chat.rocket.android.helper.GcmPushSettingHelper; import chat.rocket.android.helper.GcmPushSettingHelper;
import chat.rocket.android.model.ddp.PublicSetting; import chat.rocket.persistence.realm.models.ddp.RealmPublicSetting;
import chat.rocket.android.model.internal.GcmPushRegistration; import chat.rocket.persistence.realm.models.internal.GcmPushRegistration;
import chat.rocket.android.realm_helper.RealmHelper; import chat.rocket.persistence.realm.RealmHelper;
import chat.rocket.android.service.DDPClientRef; import chat.rocket.android.service.DDPClientRef;
public class PushSettingsObserver extends AbstractModelObserver<PublicSetting> { public class PushSettingsObserver extends AbstractModelObserver<RealmPublicSetting> {
public PushSettingsObserver(Context context, String hostname, public PushSettingsObserver(Context context, String hostname,
RealmHelper realmHelper, DDPClientRef ddpClientRef) { RealmHelper realmHelper, DDPClientRef ddpClientRef) {
...@@ -19,12 +19,12 @@ public class PushSettingsObserver extends AbstractModelObserver<PublicSetting> { ...@@ -19,12 +19,12 @@ public class PushSettingsObserver extends AbstractModelObserver<PublicSetting> {
} }
@Override @Override
public RealmResults<PublicSetting> queryItems(Realm realm) { public RealmResults<RealmPublicSetting> queryItems(Realm realm) {
return GcmPushSettingHelper.queryForGcmPushEnabled(realm); return GcmPushSettingHelper.queryForGcmPushEnabled(realm);
} }
@Override @Override
public void onUpdateResults(List<PublicSetting> results) { public void onUpdateResults(List<RealmPublicSetting> results) {
boolean gcmPushEnabled = GcmPushSettingHelper.isGcmPushEnabled(results); boolean gcmPushEnabled = GcmPushSettingHelper.isGcmPushEnabled(results);
if (gcmPushEnabled) { if (gcmPushEnabled) {
......
...@@ -8,11 +8,11 @@ import java.util.List; ...@@ -8,11 +8,11 @@ import java.util.List;
import chat.rocket.android.RocketChatCache; import chat.rocket.android.RocketChatCache;
import chat.rocket.android.api.RaixPushHelper; import chat.rocket.android.api.RaixPushHelper;
import chat.rocket.android.helper.LogcatIfError; import chat.rocket.android.helper.LogcatIfError;
import chat.rocket.android.model.internal.GetUsersOfRoomsProcedure; import chat.rocket.persistence.realm.models.internal.GetUsersOfRoomsProcedure;
import chat.rocket.android.model.internal.LoadMessageProcedure; import chat.rocket.persistence.realm.models.internal.LoadMessageProcedure;
import chat.rocket.android.model.internal.MethodCall; import chat.rocket.persistence.realm.models.internal.MethodCall;
import chat.rocket.android.model.internal.Session; import chat.rocket.persistence.realm.models.internal.RealmSession;
import chat.rocket.android.realm_helper.RealmHelper; import chat.rocket.persistence.realm.RealmHelper;
import chat.rocket.android.service.DDPClientRef; import chat.rocket.android.service.DDPClientRef;
import chat.rocket.android.service.internal.StreamRoomMessageManager; import chat.rocket.android.service.internal.StreamRoomMessageManager;
import hugo.weaving.DebugLog; import hugo.weaving.DebugLog;
...@@ -20,7 +20,7 @@ import hugo.weaving.DebugLog; ...@@ -20,7 +20,7 @@ import hugo.weaving.DebugLog;
/** /**
* Observes user is logged into server. * Observes user is logged into server.
*/ */
public class SessionObserver extends AbstractModelObserver<Session> { public class SessionObserver extends AbstractModelObserver<RealmSession> {
private final StreamRoomMessageManager streamNotifyMessage; private final StreamRoomMessageManager streamNotifyMessage;
private final RaixPushHelper pushHelper; private final RaixPushHelper pushHelper;
private int count; private int count;
...@@ -38,16 +38,16 @@ public class SessionObserver extends AbstractModelObserver<Session> { ...@@ -38,16 +38,16 @@ public class SessionObserver extends AbstractModelObserver<Session> {
} }
@Override @Override
public RealmResults<Session> queryItems(Realm realm) { public RealmResults<RealmSession> queryItems(Realm realm) {
return realm.where(Session.class) return realm.where(RealmSession.class)
.isNotNull(Session.TOKEN) .isNotNull(RealmSession.TOKEN)
.equalTo(Session.TOKEN_VERIFIED, true) .equalTo(RealmSession.TOKEN_VERIFIED, true)
.isNull(Session.ERROR) .isNull(RealmSession.ERROR)
.findAll(); .findAll();
} }
@Override @Override
public void onUpdateResults(List<Session> results) { public void onUpdateResults(List<RealmSession> results) {
int origCount = count; int origCount = count;
count = results.size(); count = results.size();
if (origCount > 0 && count > 0) { if (origCount > 0 && count > 0) {
......
...@@ -7,11 +7,11 @@ import io.realm.RealmResults; ...@@ -7,11 +7,11 @@ import io.realm.RealmResults;
import java.util.List; import java.util.List;
import chat.rocket.android.api.MethodCallHelper; import chat.rocket.android.api.MethodCallHelper;
import chat.rocket.android.helper.LogcatIfError; import chat.rocket.android.helper.LogcatIfError;
import chat.rocket.android.model.internal.Session; import chat.rocket.persistence.realm.models.internal.RealmSession;
import chat.rocket.android.realm_helper.RealmHelper; import chat.rocket.persistence.realm.RealmHelper;
import chat.rocket.android.service.DDPClientRef; import chat.rocket.android.service.DDPClientRef;
public class TokenLoginObserver extends AbstractModelObserver<Session> { public class TokenLoginObserver extends AbstractModelObserver<RealmSession> {
private final MethodCallHelper methodCall; private final MethodCallHelper methodCall;
...@@ -22,21 +22,21 @@ public class TokenLoginObserver extends AbstractModelObserver<Session> { ...@@ -22,21 +22,21 @@ public class TokenLoginObserver extends AbstractModelObserver<Session> {
} }
@Override @Override
public RealmResults<Session> queryItems(Realm realm) { public RealmResults<RealmSession> queryItems(Realm realm) {
return realm.where(Session.class) return realm.where(RealmSession.class)
.isNotNull(Session.TOKEN) .isNotNull(RealmSession.TOKEN)
.equalTo(Session.TOKEN_VERIFIED, false) .equalTo(RealmSession.TOKEN_VERIFIED, false)
.isNull(Session.ERROR) .isNull(RealmSession.ERROR)
.findAll(); .findAll();
} }
@Override @Override
public void onUpdateResults(List<Session> results) { public void onUpdateResults(List<RealmSession> results) {
if (results.isEmpty()) { if (results.isEmpty()) {
return; return;
} }
Session session = results.get(0); RealmSession session = results.get(0);
methodCall.loginWithToken(session.getToken()).continueWith(new LogcatIfError()); methodCall.loginWithToken(session.getToken()).continueWith(new LogcatIfError());
} }
} }
package chat.rocket.android.shared;
import android.support.annotation.NonNull;
public interface BaseContract {
interface View {
}
interface Presenter<T extends View> {
void bindView(@NonNull T view);
void release();
}
}
package chat.rocket.android.shared;
import android.support.annotation.NonNull;
import rx.Subscription;
import rx.subscriptions.CompositeSubscription;
public abstract class BasePresenter<T extends BaseContract.View>
implements BaseContract.Presenter<T> {
protected T view;
private CompositeSubscription compositeSubscription = new CompositeSubscription();
@Override
public void bindView(@NonNull T view) {
this.view = view;
}
@Override
public void release() {
compositeSubscription.clear();
view = null;
}
protected void addSubscription(Subscription subscription) {
compositeSubscription.add(subscription);
}
protected void clearSubscripions() {
compositeSubscription.clear();
}
}
...@@ -3,7 +3,9 @@ ...@@ -3,7 +3,9 @@
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:theme="@style/AppTheme.Dark"> android:theme="@style/AppTheme.Dark"
android:visibility="invisible"
tools:visibility="visible">
<LinearLayout <LinearLayout
android:id="@+id/user_info_container" android:id="@+id/user_info_container"
......
...@@ -9,20 +9,20 @@ ...@@ -9,20 +9,20 @@
<exclude-pattern>.*/R.java</exclude-pattern> <exclude-pattern>.*/R.java</exclude-pattern>
<exclude-pattern>.*/gen/.*</exclude-pattern> <exclude-pattern>.*/gen/.*</exclude-pattern>
<rule ref="rulesets/java/android.xml"/> <rule ref="rulesets/java/android.xml" />
<rule ref="rulesets/java/clone.xml"/> <rule ref="rulesets/java/clone.xml" />
<rule ref="rulesets/java/finalizers.xml"/> <rule ref="rulesets/java/finalizers.xml" />
<rule ref="rulesets/java/imports.xml"> <rule ref="rulesets/java/imports.xml">
<!-- Espresso is designed this way !--> <!-- Espresso is designed this way !-->
<exclude name="TooManyStaticImports"/> <exclude name="TooManyStaticImports" />
</rule> </rule>
<rule ref="rulesets/java/basic.xml"/> <rule ref="rulesets/java/basic.xml" />
<rule ref="rulesets/java/naming.xml"> <rule ref="rulesets/java/naming.xml">
<!--<exclude name="AbstractNaming" />--> <exclude name="AbstractNaming" />
<exclude name="LongVariable"/> <exclude name="LongVariable" />
<!--exclude name="ShortMethodName" /--> <!--exclude name="ShortMethodName" /-->
<!--exclude name="ShortVariable" /--> <!--exclude name="ShortVariable" /-->
<!--<exclude name="ShortClassName" />--> <exclude name="ShortClassName" />
<!--<exclude name="VariableNamingConventions" />--> <!--<exclude name="VariableNamingConventions" />-->
</rule> </rule>
</ruleset> </ruleset>
\ No newline at end of file
...@@ -6,8 +6,12 @@ ...@@ -6,8 +6,12 @@
# http://www.gradle.org/docs/current/userguide/build_environment.html # http://www.gradle.org/docs/current/userguide/build_environment.html
# Specifies the JVM arguments used for the daemon process. # Specifies the JVM arguments used for the daemon process.
# The setting is particularly useful for tweaking memory settings. # The setting is particularly useful for tweaking memory settings.
org.gradle.jvmargs=-Xmx1536m # org.gradle.jvmargs=-Xmx1536m
# When configured, Gradle will run in incubating parallel mode. # When configured, Gradle will run in incubating parallel mode.
# This option should only be used with decoupled projects. More details, visit # This option should only be used with decoupled projects. More details, visit
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
# org.gradle.parallel=true # org.gradle.parallel=true
org.gradle.jvmargs=-Xmx6144M
#org.gradle.parallel=true
android.enableBuildCache=true
\ No newline at end of file
apply plugin: 'com.android.library' apply plugin: 'com.android.library'
apply plugin: 'realm-android' apply plugin: 'realm-android'
apply plugin: 'com.jakewharton.hugo'
apply plugin: 'me.tatarka.retrolambda' apply plugin: 'me.tatarka.retrolambda'
buildscript { buildscript {
...@@ -11,6 +12,7 @@ buildscript { ...@@ -11,6 +12,7 @@ buildscript {
classpath rootProject.ext.realmPlugin classpath rootProject.ext.realmPlugin
classpath rootProject.ext.retroLambdaPlugin classpath rootProject.ext.retroLambdaPlugin
classpath rootProject.ext.retroLambdaPatch classpath rootProject.ext.retroLambdaPatch
classpath 'com.jakewharton.hugo:hugo-plugin:1.2.1'
} }
} }
...@@ -39,6 +41,9 @@ android { ...@@ -39,6 +41,9 @@ android {
dependencies { dependencies {
testCompile 'junit:junit:4.12' testCompile 'junit:junit:4.12'
compile project(':log-wrapper') compile project(':log-wrapper')
compile project(':rocket-chat-core')
compile 'io.reactivex:rxjava:1.2.3'
compile 'io.reactivex:rxandroid:1.2.1'
compile rootProject.ext.boltsTask compile rootProject.ext.boltsTask
compile rootProject.ext.supportAnnotations compile rootProject.ext.supportAnnotations
compile rootProject.ext.supportAppCompat compile rootProject.ext.supportAppCompat
......
<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.Realm;
import io.realm.RealmChangeListener; import io.realm.RealmChangeListener;
......
package chat.rocket.android.realm_helper; package chat.rocket.persistence.realm;
import android.content.Context; import android.content.Context;
import android.support.annotation.NonNull; import android.support.annotation.NonNull;
......
package chat.rocket.android.realm_helper; package chat.rocket.persistence.realm;
import android.annotation.SuppressLint; import android.annotation.SuppressLint;
import android.content.Context; import android.content.Context;
import android.os.Looper; import android.os.Looper;
import android.support.v7.widget.RecyclerView;
import io.realm.Realm; import io.realm.Realm;
import io.realm.RealmConfiguration; import io.realm.RealmConfiguration;
import io.realm.RealmObject; import io.realm.RealmObject;
...@@ -158,12 +157,6 @@ public class RealmHelper { ...@@ -158,12 +157,6 @@ public class RealmHelper {
return new RealmObjectObserver<T>(this, query); return new RealmObjectObserver<T>(this, query);
} }
public <T extends RealmObject, VM, VH extends RealmModelViewHolder<VM>>
RecyclerView.Adapter<VH> createListAdapter(Context context, RealmListObserver.Query<T> query,
RealmModelListAdapter.Constructor<T, VM, VH> constructor) {
return constructor.getNewInstance(context).initializeWith(this, query);
}
public <T extends RealmObject> RealmAutoCompleteAdapter<T> createAutoCompleteAdapter( public <T extends RealmObject> RealmAutoCompleteAdapter<T> createAutoCompleteAdapter(
Context context, Context context,
RealmAutoCompleteAdapter.RealmFilter<T> filter, RealmAutoCompleteAdapter.RealmFilter<T> filter,
......
package chat.rocket.android.realm_helper; package chat.rocket.persistence.realm;
import io.realm.Realm; import io.realm.Realm;
import io.realm.RealmChangeListener; import io.realm.RealmChangeListener;
......
package chat.rocket.android.realm_helper; package chat.rocket.persistence.realm;
import io.realm.Realm; import io.realm.Realm;
import io.realm.RealmChangeListener; import io.realm.RealmChangeListener;
......
package chat.rocket.android.realm_helper; package chat.rocket.persistence.realm;
import io.realm.Realm;
import io.realm.RealmConfiguration; import io.realm.RealmConfiguration;
import java.util.HashMap; import java.util.HashMap;
import chat.rocket.persistence.realm.modules.RocketChatLibraryModule;
import chat.rocket.persistence.realm.modules.RocketChatServerModule;
public class RealmStore { public class RealmStore {
public static HashMap<String, RealmConfiguration> sStore = new HashMap<>(); public static HashMap<String, RealmConfiguration> sStore = new HashMap<>();
...@@ -10,6 +13,7 @@ public class RealmStore { ...@@ -10,6 +13,7 @@ public class RealmStore {
private static RealmConfiguration createConfigFor(String name) { private static RealmConfiguration createConfigFor(String name) {
return new RealmConfiguration.Builder() return new RealmConfiguration.Builder()
.name(name + ".realm") .name(name + ".realm")
.modules(new RocketChatLibraryModule())
.deleteRealmIfMigrationNeeded().build(); .deleteRealmIfMigrationNeeded().build();
} }
...@@ -35,4 +39,24 @@ public class RealmStore { ...@@ -35,4 +39,24 @@ public class RealmStore {
} }
return new RealmHelper(sStore.get(name)); return new RealmHelper(sStore.get(name));
} }
public static RealmHelper getOrCreateForServerScope(String name) {
if (!sStore.containsKey(name)) {
sStore.put(name, new RealmConfiguration.Builder()
.name(name + ".realm")
.modules(new RocketChatServerModule())
.deleteRealmIfMigrationNeeded().build());
}
return new RealmHelper(sStore.get(name));
}
public static Realm getRealm(String name) {
RealmHelper realmHelper = get(name);
if (realmHelper == null) {
return null;
}
return realmHelper.instance();
}
} }
package chat.rocket.persistence.realm;
import android.content.Context;
import io.realm.Realm;
import io.realm.RealmConfiguration;
import chat.rocket.persistence.realm.modules.RocketChatLibraryModule;
public class RocketChatPersistenceRealm {
public static void init(Context context) {
Realm.init(context);
Realm.setDefaultConfiguration(
new RealmConfiguration.Builder()
.name("rocket.chat.persistence.realm")
.modules(new RocketChatLibraryModule())
.deleteRealmIfMigrationNeeded()
.build());
}
}
package chat.rocket.persistence.realm.helpers;
import bolts.Continuation;
import bolts.Task;
import chat.rocket.android.log.RCLog;
/**
* Bolts-Task continuation for just logging if error occurred.
*/
public class LogcatIfError implements Continuation {
@Override
public Object then(Task task) throws Exception {
if (task.isFaulted()) {
RCLog.w(task.getError());
}
return task;
}
}
package chat.rocket.android.service; package chat.rocket.persistence.realm.models;
import android.support.annotation.Nullable; import android.support.annotation.Nullable;
import android.text.TextUtils; import android.text.TextUtils;
...@@ -9,14 +9,15 @@ import org.json.JSONObject; ...@@ -9,14 +9,15 @@ import org.json.JSONObject;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import chat.rocket.android.realm_helper.RealmHelper; import chat.rocket.core.models.ServerInfo;
import chat.rocket.android.realm_helper.RealmStore; import chat.rocket.persistence.realm.RealmHelper;
import chat.rocket.persistence.realm.RealmStore;
/** /**
* Backend implementation to store ServerInfo. * Backend implementation to store ServerInfo.
*/ */
public class RealmBasedServerInfo extends RealmObject { public class RealmBasedServerInfo extends RealmObject {
private static final String DB_NAME = "serverlist"; private static final String DB_NAME = "server.list";
@PrimaryKey private String hostname; @PrimaryKey private String hostname;
private String name; private String name;
...@@ -31,21 +32,26 @@ public class RealmBasedServerInfo extends RealmObject { ...@@ -31,21 +32,26 @@ public class RealmBasedServerInfo extends RealmObject {
} }
ServerInfo getServerInfo() { ServerInfo getServerInfo() {
return new ServerInfo(hostname, name, session, insecure); return ServerInfo.builder()
.setHostname(hostname)
.setName(name)
.setSession(session)
.setSecure(!insecure)
.build();
} }
static RealmHelper getRealm() { public static RealmHelper getRealm() {
return RealmStore.getOrCreate(DB_NAME); return RealmStore.getOrCreateForServerScope(DB_NAME);
} }
static void addOrUpdate(String hostname, String name) { public static void addOrUpdate(String hostname, String name) {
getRealm().executeTransaction(realm -> getRealm().executeTransaction(realm ->
realm.createOrUpdateObjectFromJson(RealmBasedServerInfo.class, new JSONObject() realm.createOrUpdateObjectFromJson(RealmBasedServerInfo.class, new JSONObject()
.put(ColumnName.HOSTNAME, hostname) .put(ColumnName.HOSTNAME, hostname)
.put(ColumnName.NAME, TextUtils.isEmpty(name) ? JSONObject.NULL : name))); .put(ColumnName.NAME, TextUtils.isEmpty(name) ? JSONObject.NULL : name)));
} }
static void remove(String hostname) { public static void remove(String hostname) {
getRealm().executeTransaction(realm -> { getRealm().executeTransaction(realm -> {
realm.where(RealmBasedServerInfo.class).equalTo(ColumnName.HOSTNAME, hostname) realm.where(RealmBasedServerInfo.class).equalTo(ColumnName.HOSTNAME, hostname)
.findAll() .findAll()
...@@ -54,7 +60,7 @@ public class RealmBasedServerInfo extends RealmObject { ...@@ -54,7 +60,7 @@ public class RealmBasedServerInfo extends RealmObject {
}); });
} }
static void updateSession(String hostname, String session) { public static void updateSession(String hostname, String session) {
RealmBasedServerInfo impl = getRealm().executeTransactionForRead(realm -> RealmBasedServerInfo impl = getRealm().executeTransactionForRead(realm ->
realm.where(RealmBasedServerInfo.class).equalTo(ColumnName.HOSTNAME, hostname).findFirst()); realm.where(RealmBasedServerInfo.class).equalTo(ColumnName.HOSTNAME, hostname).findFirst());
...@@ -67,13 +73,14 @@ public class RealmBasedServerInfo extends RealmObject { ...@@ -67,13 +73,14 @@ public class RealmBasedServerInfo extends RealmObject {
} }
} }
static @Nullable ServerInfo getServerInfoForHost(String hostname) { @Nullable
public static ServerInfo getServerInfoForHost(String hostname) {
RealmBasedServerInfo impl = getRealm().executeTransactionForRead(realm -> RealmBasedServerInfo impl = getRealm().executeTransactionForRead(realm ->
realm.where(RealmBasedServerInfo.class).equalTo(ColumnName.HOSTNAME, hostname).findFirst()); realm.where(RealmBasedServerInfo.class).equalTo(ColumnName.HOSTNAME, hostname).findFirst());
return impl == null ? null : impl.getServerInfo(); return impl == null ? null : impl.getServerInfo();
} }
static void setInsecure(String hostname, boolean insecure) { public static void setInsecure(String hostname, boolean insecure) {
RealmBasedServerInfo impl = getRealm().executeTransactionForRead(realm -> RealmBasedServerInfo impl = getRealm().executeTransactionForRead(realm ->
realm.where(RealmBasedServerInfo.class).equalTo(ColumnName.HOSTNAME, hostname).findFirst()); realm.where(RealmBasedServerInfo.class).equalTo(ColumnName.HOSTNAME, hostname).findFirst());
...@@ -86,7 +93,7 @@ public class RealmBasedServerInfo extends RealmObject { ...@@ -86,7 +93,7 @@ public class RealmBasedServerInfo extends RealmObject {
} }
} }
static List<ServerInfo> getServerInfoList() { public static List<ServerInfo> getServerInfoList() {
List<RealmBasedServerInfo> results = getRealm().executeTransactionForReadResults(realm -> List<RealmBasedServerInfo> results = getRealm().executeTransactionForReadResults(realm ->
realm.where(RealmBasedServerInfo.class).findAll()); realm.where(RealmBasedServerInfo.class).findAll());
ArrayList<ServerInfo> list = new ArrayList<>(); ArrayList<ServerInfo> list = new ArrayList<>();
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
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