Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
A
AloqaIM-Android
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Administrator
AloqaIM-Android
Commits
3de8d825
Commit
3de8d825
authored
Feb 17, 2017
by
Tiago Cunha
Committed by
GitHub
Feb 17, 2017
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #209 from RocketChat/feature/untengle-modules
Untagles the modules and updates dependencies
parents
761e843b
2ff44a32
Changes
46
Hide whitespace changes
Inline
Side-by-side
Showing
46 changed files
with
570 additions
and
569 deletions
+570
-569
.travis.yml
.travis.yml
+1
-1
build.gradle
android-ddp/build.gradle
+39
-31
DDPClient.java
...-ddp/src/main/java/chat/rocket/android_ddp/DDPClient.java
+2
-2
DDPClientImpl.java
.../src/main/java/chat/rocket/android_ddp/DDPClientImpl.java
+39
-41
RxWebSocket.java
...src/main/java/chat/rocket/android_ddp/rx/RxWebSocket.java
+14
-12
build.gradle
app/build.gradle
+38
-26
AbstractFragmentActivity.java
...hat/rocket/android/activity/AbstractFragmentActivity.java
+2
-1
LoginPresenter.java
...ain/java/chat/rocket/android/activity/LoginPresenter.java
+4
-3
MainActivity.java
.../main/java/chat/rocket/android/activity/MainActivity.java
+2
-2
MainContract.java
.../main/java/chat/rocket/android/activity/MainContract.java
+1
-1
MainPresenter.java
...main/java/chat/rocket/android/activity/MainPresenter.java
+11
-8
DDPClientWrapper.java
...c/main/java/chat/rocket/android/api/DDPClientWrapper.java
+2
-2
DefaultServerPolicyApi.java
.../chat/rocket/android/api/rest/DefaultServerPolicyApi.java
+13
-12
ServerPolicyApi.java
...in/java/chat/rocket/android/api/rest/ServerPolicyApi.java
+3
-4
AbstractFragment.java
...n/java/chat/rocket/android/fragment/AbstractFragment.java
+1
-1
InputHostnamePresenter.java
...t/android/fragment/add_server/InputHostnamePresenter.java
+6
-5
RoomFragment.java
...a/chat/rocket/android/fragment/chatroom/RoomFragment.java
+3
-1
RoomPresenter.java
.../chat/rocket/android/fragment/chatroom/RoomPresenter.java
+20
-18
SidebarMainFragment.java
.../rocket/android/fragment/sidebar/SidebarMainFragment.java
+6
-3
SidebarMainPresenter.java
...rocket/android/fragment/sidebar/SidebarMainPresenter.java
+6
-5
AbstractAddRoomDialogFragment.java
...ragment/sidebar/dialog/AbstractAddRoomDialogFragment.java
+2
-1
AddChannelDialogFragment.java
...oid/fragment/sidebar/dialog/AddChannelDialogFragment.java
+4
-3
AddDirectMessageDialogFragment.java
...agment/sidebar/dialog/AddDirectMessageDialogFragment.java
+9
-8
ServerPolicyApiValidationHelper.java
...ocket/android/helper/ServerPolicyApiValidationHelper.java
+3
-2
ServerPolicyHelper.java
...n/java/chat/rocket/android/helper/ServerPolicyHelper.java
+2
-3
AbstractDDPDocEventSubscriber.java
...et/android/service/ddp/AbstractDDPDocEventSubscriber.java
+4
-4
BasePresenter.java
...c/main/java/chat/rocket/android/shared/BasePresenter.java
+5
-5
circle.yml
circle.yml
+2
-2
dependencies.gradle
dependencies.gradle
+7
-47
build.gradle
log-wrapper/build.gradle
+5
-9
build.gradle
persistence-realm/build.gradle
+47
-37
RealmMessageRepository.java
...ersistence/realm/repositories/RealmMessageRepository.java
+67
-83
RealmRepository.java
...ocket/persistence/realm/repositories/RealmRepository.java
+3
-0
RealmRoomRepository.java
...t/persistence/realm/repositories/RealmRoomRepository.java
+52
-65
RealmSessionRepository.java
...ersistence/realm/repositories/RealmSessionRepository.java
+31
-33
RealmUserRepository.java
...t/persistence/realm/repositories/RealmUserRepository.java
+26
-28
build.gradle
rocket-chat-android-widgets/build.gradle
+29
-20
build.gradle
rocket-chat-core/build.gradle
+3
-1
CanCreateRoomInteractor.java
...chat/rocket/core/interactors/CanCreateRoomInteractor.java
+6
-6
MessageInteractor.java
.../java/chat/rocket/core/interactors/MessageInteractor.java
+5
-4
RoomInteractor.java
...ain/java/chat/rocket/core/interactors/RoomInteractor.java
+14
-10
SessionInteractor.java
.../java/chat/rocket/core/interactors/SessionInteractor.java
+10
-5
MessageRepository.java
...java/chat/rocket/core/repositories/MessageRepository.java
+6
-4
RoomRepository.java
...in/java/chat/rocket/core/repositories/RoomRepository.java
+6
-5
SessionRepository.java
...java/chat/rocket/core/repositories/SessionRepository.java
+5
-3
UserRepository.java
...in/java/chat/rocket/core/repositories/UserRepository.java
+4
-2
No files found.
.travis.yml
View file @
3de8d825
...
...
@@ -7,7 +7,7 @@ before_script:
-
echo y | android update sdk --no-ui --all --filter android-25
-
echo y | android update sdk --no-ui --all --filter extra-android-m2repository,extra-android-support
-
echo y | android update sdk --no-ui --all --filter extra-google-m2repository,extra-google-google_play_services
-
echo y | android update sdk --no-ui --all --filter build-tools-25.0.
1
-
echo y | android update sdk --no-ui --all --filter build-tools-25.0.
2
-
./gradlew dependencies
-
sed -i -e 's/minSdkVersion = 21/minSdkVersion = 17/g' dependencies.gradle
...
...
android-ddp/build.gradle
View file @
3de8d825
...
...
@@ -2,42 +2,50 @@ apply plugin: 'com.android.library'
apply
plugin:
'me.tatarka.retrolambda'
buildscript
{
repositories
{
jcenter
()
}
dependencies
{
classpath
rootProject
.
ext
.
androidPlugin
classpath
rootProject
.
ext
.
retroLambdaPlugin
classpath
rootProject
.
ext
.
retroLambdaPatch
}
repositories
{
jcenter
()
}
dependencies
{
classpath
'com.android.tools.build:gradle:2.2.3'
classpath
'me.tatarka:gradle-retrolambda:3.5.0'
classpath
'me.tatarka.retrolambda.projectlombok:lombok.ast:0.2.3.a2'
}
}
android
{
compileSdkVersion
rootProject
.
ext
.
compileSdkVersion
buildToolsVersion
rootProject
.
ext
.
buildToolsVersion
compileOptions
{
sourceCompatibility
JavaVersion
.
VERSION_1_8
targetCompatibility
JavaVersion
.
VERSION_1_8
}
defaultConfig
{
minSdkVersion
rootProject
.
ext
.
minSdkVersion
targetSdkVersion
rootProject
.
ext
.
compileSdkVersion
versionCode
1
versionName
"0.0.8"
}
buildTypes
{
release
{
minifyEnabled
false
proguardFiles
getDefaultProguardFile
(
'proguard-android.txt'
),
'proguard-rules.pro'
compileSdkVersion
25
buildToolsVersion
'25.0.2'
compileOptions
{
sourceCompatibility
JavaVersion
.
VERSION_1_8
targetCompatibility
JavaVersion
.
VERSION_1_8
}
defaultConfig
{
minSdkVersion
16
targetSdkVersion
25
versionCode
1
versionName
"0.0.8"
}
buildTypes
{
release
{
minifyEnabled
false
proguardFiles
getDefaultProguardFile
(
'proguard-android.txt'
),
'proguard-rules.pro'
}
}
}
}
ext
{
supportVersion
=
'25.1.1'
}
dependencies
{
compile
project
(
':log-wrapper'
)
compile
rootProject
.
ext
.
supportAnnotations
compile
rootProject
.
ext
.
okhttp3
compile
rootProject
.
ext
.
rxJava
compile
rootProject
.
ext
.
boltsTask
compile
project
(
':log-wrapper'
)
compile
"com.android.support:support-annotations:$supportVersion"
compile
'com.squareup.okhttp3:okhttp:3.6.0'
compile
'io.reactivex.rxjava2:rxjava:2.0.6'
compile
'com.parse.bolts:bolts-tasks:1.4.0'
}
android-ddp/src/main/java/chat/rocket/android_ddp/DDPClient.java
View file @
3de8d825
package
chat
.
rocket
.
android_ddp
;
import
android.support.annotation.Nullable
;
import
io.reactivex.Flowable
;
import
org.json.JSONArray
;
import
bolts.Task
;
import
bolts.TaskCompletionSource
;
import
chat.rocket.android_ddp.rx.RxWebSocketCallback
;
import
okhttp3.OkHttpClient
;
import
rx.Observable
;
public
class
DDPClient
{
// reference: https://github.com/eddflrs/meteor-ddp/blob/master/meteor-ddp.js
...
...
@@ -53,7 +53,7 @@ public class DDPClient {
return
task
.
getTask
();
}
public
Observ
able
<
DDPSubscription
.
Event
>
getSubscriptionCallback
()
{
public
Flow
able
<
DDPSubscription
.
Event
>
getSubscriptionCallback
()
{
return
impl
.
getDDPSubscription
();
}
...
...
android-ddp/src/main/java/chat/rocket/android_ddp/DDPClientImpl.java
View file @
3de8d825
...
...
@@ -3,6 +3,8 @@ package chat.rocket.android_ddp;
import
android.support.annotation.NonNull
;
import
android.support.annotation.Nullable
;
import
android.text.TextUtils
;
import
io.reactivex.Flowable
;
import
io.reactivex.disposables.CompositeDisposable
;
import
org.json.JSONArray
;
import
org.json.JSONException
;
import
org.json.JSONObject
;
...
...
@@ -15,15 +17,12 @@ import chat.rocket.android.log.RCLog;
import
chat.rocket.android_ddp.rx.RxWebSocket
;
import
chat.rocket.android_ddp.rx.RxWebSocketCallback
;
import
okhttp3.OkHttpClient
;
import
rx.Observable
;
import
rx.functions.Func1
;
import
rx.subscriptions.CompositeSubscription
;
public
class
DDPClientImpl
{
private
final
DDPClient
client
;
private
final
RxWebSocket
websocket
;
private
Observable
<
RxWebSocketCallback
.
Base
>
observ
able
;
private
Composite
Subscription
subscriptions
;
private
Flowable
<
RxWebSocketCallback
.
Base
>
flow
able
;
private
Composite
Disposable
subscriptions
;
public
DDPClientImpl
(
DDPClient
self
,
OkHttpClient
client
)
{
websocket
=
new
RxWebSocket
(
client
);
...
...
@@ -52,10 +51,10 @@ public class DDPClientImpl {
public
void
connect
(
final
TaskCompletionSource
<
DDPClientCallback
.
Connect
>
task
,
final
String
url
,
String
session
)
{
try
{
observ
able
=
websocket
.
connect
(
url
).
autoConnect
();
Composite
Subscription
subscriptions
=
new
CompositeSubscription
();
flow
able
=
websocket
.
connect
(
url
).
autoConnect
();
Composite
Disposable
subscriptions
=
new
CompositeDisposable
();
subscriptions
.
add
(
observ
able
.
filter
(
callback
->
callback
instanceof
RxWebSocketCallback
.
Open
)
subscriptions
.
add
(
flow
able
.
filter
(
callback
->
callback
instanceof
RxWebSocketCallback
.
Open
)
.
subscribe
(
callback
->
{
sendMessage
(
"connect"
,
json
->
(
TextUtils
.
isEmpty
(
session
)
?
json
:
json
.
put
(
"session"
,
session
)).
put
(
...
...
@@ -65,7 +64,7 @@ public class DDPClientImpl {
}));
subscriptions
.
add
(
observ
able
.
filter
(
callback
->
callback
instanceof
RxWebSocketCallback
.
Message
)
flow
able
.
filter
(
callback
->
callback
instanceof
RxWebSocketCallback
.
Message
)
.
map
(
callback
->
((
RxWebSocketCallback
.
Message
)
callback
).
responseBodyString
)
.
map
(
DDPClientImpl:
:
toJson
)
.
timeout
(
7
,
TimeUnit
.
SECONDS
)
...
...
@@ -74,15 +73,15 @@ public class DDPClientImpl {
if
(
"connected"
.
equals
(
msg
)
&&
!
response
.
isNull
(
"session"
))
{
task
.
trySetResult
(
new
DDPClientCallback
.
Connect
(
client
,
response
.
optString
(
"session"
)));
subscriptions
.
unsubscrib
e
();
subscriptions
.
dispos
e
();
}
else
if
(
"error"
.
equals
(
msg
)
&&
"Already connected"
.
equals
(
response
.
optString
(
"reason"
)))
{
task
.
trySetResult
(
new
DDPClientCallback
.
Connect
(
client
,
null
));
subscriptions
.
unsubscrib
e
();
subscriptions
.
dispos
e
();
}
else
if
(
"failed"
.
equals
(
msg
))
{
task
.
trySetError
(
new
DDPClientCallback
.
Connect
.
Failed
(
client
,
response
.
optString
(
"version"
)));
subscriptions
.
unsubscrib
e
();
subscriptions
.
dispos
e
();
}
},
err
->
{
task
.
trySetError
(
new
DDPClientCallback
.
Connect
.
Timeout
(
client
));
...
...
@@ -104,10 +103,10 @@ public class DDPClientImpl {
sendMessage
(
"ping"
,
json
->
json
.
put
(
"id"
,
id
));
if
(
requested
)
{
Composite
Subscription
subscriptions
=
new
CompositeSubscription
();
Composite
Disposable
subscriptions
=
new
CompositeDisposable
();
subscriptions
.
add
(
observ
able
.
filter
(
callback
->
callback
instanceof
RxWebSocketCallback
.
Message
)
flow
able
.
filter
(
callback
->
callback
instanceof
RxWebSocketCallback
.
Message
)
.
map
(
callback
->
((
RxWebSocketCallback
.
Message
)
callback
).
responseBodyString
)
.
map
(
DDPClientImpl:
:
toJson
)
.
timeout
(
4
,
TimeUnit
.
SECONDS
)
...
...
@@ -116,12 +115,12 @@ public class DDPClientImpl {
if
(
"pong"
.
equals
(
msg
))
{
if
(
response
.
isNull
(
"id"
))
{
task
.
setResult
(
new
DDPClientCallback
.
Ping
(
client
,
null
));
subscriptions
.
unsubscrib
e
();
subscriptions
.
dispos
e
();
}
else
{
String
_id
=
response
.
optString
(
"id"
);
if
(
id
.
equals
(
_id
))
{
task
.
setResult
(
new
DDPClientCallback
.
Ping
(
client
,
id
));
subscriptions
.
unsubscrib
e
();
subscriptions
.
dispos
e
();
}
}
}
...
...
@@ -141,10 +140,10 @@ public class DDPClientImpl {
sendMessage
(
"sub"
,
json
->
json
.
put
(
"id"
,
id
).
put
(
"name"
,
name
).
put
(
"params"
,
params
));
if
(
requested
)
{
Composite
Subscription
subscriptions
=
new
CompositeSubscription
();
Composite
Disposable
subscriptions
=
new
CompositeDisposable
();
subscriptions
.
add
(
observ
able
.
filter
(
callback
->
callback
instanceof
RxWebSocketCallback
.
Message
)
flow
able
.
filter
(
callback
->
callback
instanceof
RxWebSocketCallback
.
Message
)
.
map
(
callback
->
((
RxWebSocketCallback
.
Message
)
callback
).
responseBodyString
)
.
map
(
DDPClientImpl:
:
toJson
)
.
subscribe
(
response
->
{
...
...
@@ -155,7 +154,7 @@ public class DDPClientImpl {
String
_id
=
ids
.
optString
(
i
);
if
(
id
.
equals
(
_id
))
{
task
.
setResult
(
new
DDPSubscription
.
Ready
(
client
,
id
));
subscriptions
.
unsubscrib
e
();
subscriptions
.
dispos
e
();
break
;
}
}
...
...
@@ -165,7 +164,7 @@ public class DDPClientImpl {
if
(
id
.
equals
(
_id
))
{
task
.
setError
(
new
DDPSubscription
.
NoSub
.
Error
(
client
,
id
,
response
.
optJSONObject
(
"error"
)));
subscriptions
.
unsubscrib
e
();
subscriptions
.
dispos
e
();
}
}
},
err
->
{
...
...
@@ -183,10 +182,10 @@ public class DDPClientImpl {
final
boolean
requested
=
sendMessage
(
"unsub"
,
json
->
json
.
put
(
"id"
,
id
));
if
(
requested
)
{
Composite
Subscription
subscriptions
=
new
CompositeSubscription
();
Composite
Disposable
subscriptions
=
new
CompositeDisposable
();
subscriptions
.
add
(
observ
able
.
filter
(
callback
->
callback
instanceof
RxWebSocketCallback
.
Message
)
flow
able
.
filter
(
callback
->
callback
instanceof
RxWebSocketCallback
.
Message
)
.
map
(
callback
->
((
RxWebSocketCallback
.
Message
)
callback
).
responseBodyString
)
.
map
(
DDPClientImpl:
:
toJson
)
.
subscribe
(
response
->
{
...
...
@@ -195,7 +194,7 @@ public class DDPClientImpl {
String
_id
=
response
.
optString
(
"id"
);
if
(
id
.
equals
(
_id
))
{
task
.
setResult
(
new
DDPSubscription
.
NoSub
(
client
,
id
));
subscriptions
.
unsubscrib
e
();
subscriptions
.
dispos
e
();
}
}
},
err
->
{
...
...
@@ -214,10 +213,10 @@ public class DDPClientImpl {
json
->
json
.
put
(
"method"
,
method
).
put
(
"params"
,
params
).
put
(
"id"
,
id
));
if
(
requested
)
{
Composite
Subscription
subscriptions
=
new
CompositeSubscription
();
Composite
Disposable
subscriptions
=
new
CompositeDisposable
();
subscriptions
.
add
(
observ
able
.
filter
(
callback
->
callback
instanceof
RxWebSocketCallback
.
Message
)
flow
able
.
filter
(
callback
->
callback
instanceof
RxWebSocketCallback
.
Message
)
.
map
(
callback
->
((
RxWebSocketCallback
.
Message
)
callback
).
responseBodyString
)
.
map
(
DDPClientImpl:
:
toJson
)
.
timeout
(
timeoutMs
,
TimeUnit
.
MILLISECONDS
)
...
...
@@ -233,7 +232,7 @@ public class DDPClientImpl {
String
result
=
response
.
optString
(
"result"
);
task
.
setResult
(
new
DDPClientCallback
.
RPC
(
client
,
id
,
result
));
}
subscriptions
.
unsubscrib
e
();
subscriptions
.
dispos
e
();
}
}
},
err
->
{
...
...
@@ -250,13 +249,13 @@ public class DDPClientImpl {
private
void
subscribeBaseListeners
()
{
if
(
subscriptions
!=
null
&&
subscriptions
.
hasSubscriptions
()
&&
!
subscriptions
.
isUnsubscrib
ed
())
{
subscriptions
.
size
()
>
0
&&
!
subscriptions
.
isDispos
ed
())
{
return
;
}
subscriptions
=
new
Composite
Subscription
();
subscriptions
=
new
Composite
Disposable
();
subscriptions
.
add
(
observ
able
.
filter
(
callback
->
callback
instanceof
RxWebSocketCallback
.
Message
)
flow
able
.
filter
(
callback
->
callback
instanceof
RxWebSocketCallback
.
Message
)
.
map
(
callback
->
((
RxWebSocketCallback
.
Message
)
callback
).
responseBodyString
)
.
map
(
DDPClientImpl:
:
toJson
)
.
subscribe
(
response
->
{
...
...
@@ -272,9 +271,9 @@ public class DDPClientImpl {
}));
}
public
Observ
able
<
DDPSubscription
.
Event
>
getDDPSubscription
()
{
public
Flow
able
<
DDPSubscription
.
Event
>
getDDPSubscription
()
{
String
[]
targetMsgs
=
{
"added"
,
"changed"
,
"removed"
,
"addedBefore"
,
"movedBefore"
};
return
observ
able
.
filter
(
callback
->
callback
instanceof
RxWebSocketCallback
.
Message
)
return
flow
able
.
filter
(
callback
->
callback
instanceof
RxWebSocketCallback
.
Message
)
.
map
(
callback
->
((
RxWebSocketCallback
.
Message
)
callback
).
responseBodyString
)
.
map
(
DDPClientImpl:
:
toJson
)
.
filter
(
response
->
{
...
...
@@ -286,7 +285,7 @@ public class DDPClientImpl {
}
return
false
;
})
.
map
(
(
Func1
<
JSONObject
,
DDPSubscription
.
Event
>)
response
->
{
.
map
(
response
->
{
String
msg
=
extractMsg
(
response
);
if
(
"added"
.
equals
(
msg
))
{
return
new
DDPSubscription
.
Added
(
client
,
response
.
optString
(
"collection"
),
...
...
@@ -312,20 +311,19 @@ public class DDPClientImpl {
}
return
null
;
})
.
asObservable
();
});
}
public
void
unsubscribeBaseListeners
()
{
if
(
subscriptions
.
hasSubscriptions
()
&&
!
subscriptions
.
isUnsubscrib
ed
())
{
subscriptions
.
unsubscrib
e
();
if
(
subscriptions
.
size
()
>
0
||
!
subscriptions
.
isDispos
ed
())
{
subscriptions
.
dispos
e
();
}
}
public
Task
<
RxWebSocketCallback
.
Close
>
getOnCloseCallback
()
{
TaskCompletionSource
<
RxWebSocketCallback
.
Close
>
task
=
new
TaskCompletionSource
<>();
observ
able
.
filter
(
callback
->
callback
instanceof
RxWebSocketCallback
.
Close
)
flow
able
.
filter
(
callback
->
callback
instanceof
RxWebSocketCallback
.
Close
)
.
cast
(
RxWebSocketCallback
.
Close
.
class
)
.
subscribe
(
task:
:
setResult
,
err
->
{
if
(
err
instanceof
Exception
)
{
...
...
@@ -353,17 +351,17 @@ public class DDPClientImpl {
}
private
void
sendMessage
(
String
msg
,
@Nullable
JSONBuilder
json
,
TaskCompletionSource
<?>
taskForSetError
)
{
TaskCompletionSource
<?>
taskForSetError
)
{
if
(!
sendMessage
(
msg
,
json
))
{
taskForSetError
.
trySetError
(
new
DDPClientCallback
.
Closed
(
client
));
}
}
private
void
addErrorCallback
(
Composite
Subscription
subscriptions
,
TaskCompletionSource
<?>
task
)
{
subscriptions
.
add
(
observ
able
.
subscribe
(
base
->
{
private
void
addErrorCallback
(
Composite
Disposable
subscriptions
,
TaskCompletionSource
<?>
task
)
{
subscriptions
.
add
(
flow
able
.
subscribe
(
base
->
{
},
err
->
{
task
.
trySetError
(
new
Exception
(
err
));
subscriptions
.
unsubscrib
e
();
subscriptions
.
dispos
e
();
}));
}
...
...
android-ddp/src/main/java/chat/rocket/android_ddp/rx/RxWebSocket.java
View file @
3de8d825
package
chat
.
rocket
.
android_ddp
.
rx
;
import
io.reactivex.BackpressureStrategy
;
import
io.reactivex.Flowable
;
import
io.reactivex.FlowableEmitter
;
import
io.reactivex.FlowableOnSubscribe
;
import
io.reactivex.exceptions.OnErrorNotImplementedException
;
import
io.reactivex.flowables.ConnectableFlowable
;
import
java.io.IOException
;
import
chat.rocket.android.log.RCLog
;
import
okhttp3.OkHttpClient
;
...
...
@@ -7,11 +14,6 @@ import okhttp3.Request;
import
okhttp3.Response
;
import
okhttp3.WebSocket
;
import
okhttp3.WebSocketListener
;
import
rx.Emitter
;
import
rx.Observable
;
import
rx.exceptions.OnErrorNotImplementedException
;
import
rx.functions.Action1
;
import
rx.observables.ConnectableObservable
;
public
class
RxWebSocket
{
private
OkHttpClient
httpClient
;
...
...
@@ -21,13 +23,14 @@ public class RxWebSocket {
httpClient
=
client
;
}
public
Connectable
Observ
able
<
RxWebSocketCallback
.
Base
>
connect
(
String
url
)
{
public
Connectable
Flow
able
<
RxWebSocketCallback
.
Base
>
connect
(
String
url
)
{
final
Request
request
=
new
Request
.
Builder
().
url
(
url
).
build
();
return
Observable
.
fromEmitter
(
new
Action1
<
Emitter
<
RxWebSocketCallback
.
Base
>
>()
{
return
Flowable
.
create
(
new
FlowableOnSubscribe
<
RxWebSocketCallback
.
Base
>()
{
@Override
public
void
call
(
Emitter
<
RxWebSocketCallback
.
Base
>
emitter
)
{
public
void
subscribe
(
FlowableEmitter
<
RxWebSocketCallback
.
Base
>
emitter
)
throws
Exception
{
httpClient
.
newWebSocket
(
request
,
new
WebSocketListener
()
{
@Override
public
void
onOpen
(
WebSocket
webSocket
,
Response
response
)
{
...
...
@@ -52,12 +55,11 @@ public class RxWebSocket {
@Override
public
void
onClosed
(
WebSocket
webSocket
,
int
code
,
String
reason
)
{
emitter
.
onNext
(
new
RxWebSocketCallback
.
Close
(
webSocket
,
code
,
reason
));
emitter
.
onComplete
d
();
emitter
.
onComplete
();
}
});
}
},
Emitter
.
BackpressureMode
.
BUFFER
},
BackpressureStrategy
.
BUFFER
).
publish
();
}
...
...
app/build.gradle
View file @
3de8d825
...
...
@@ -10,13 +10,13 @@ buildscript {
mavenCentral
()
}
dependencies
{
classpath
rootProject
.
ext
.
androidPlugin
classpath
'com.android.tools.build:gradle:2.2.3'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
classpath
rootProject
.
ext
.
retroLambdaPlugin
classpath
rootProject
.
ext
.
retroLambdaPatch
classpath
rootProject
.
ext
.
realmPlugin
classpath
'me.tatarka:gradle-retrolambda:3.5.0'
classpath
'me.tatarka.retrolambda.projectlombok:lombok.ast:0.2.3.a2'
classpath
'io.realm:realm-gradle-plugin:2.3.1'
classpath
'com.jakewharton.hugo:hugo-plugin:1.2.1'
classpath
'com.google.gms:google-services:3.0.0'
classpath
'com.github.triplet.gradle:play-publisher:1.1.5'
...
...
@@ -27,12 +27,12 @@ buildscript {
}
android
{
compileSdkVersion
rootProject
.
ext
.
compileSdkVersion
buildToolsVersion
rootProject
.
ext
.
buildToolsVersion
compileSdkVersion
25
buildToolsVersion
'25.0.2'
defaultConfig
{
applicationId
"chat.rocket.android"
minSdkVersion
rootProject
.
ext
.
minSdkVersion
targetSdkVersion
rootProject
.
ext
.
compileSdkVersion
minSdkVersion
16
targetSdkVersion
25
versionCode
9
versionName
"1.0.0"
testInstrumentationRunner
"android.support.test.runner.AndroidJUnitRunner"
...
...
@@ -66,6 +66,7 @@ android {
packagingOptions
{
exclude
'META-INF/LICENSE.txt'
exclude
'META-INF/NOTICE.txt'
exclude
'META-INF/rxjava.properties'
}
compileOptions
{
sourceCompatibility
JavaVersion
.
VERSION_1_8
...
...
@@ -81,45 +82,56 @@ play {
track
=
"${track}"
}
ext
{
supportVersion
=
'25.1.1'
playLibVersion
=
'10.2.0'
stethoVersion
=
'1.4.2'
rxbindingVersion
=
'1.0.0'
rxlifecycleVersion
=
'2.0.1'
icepickVersion
=
'3.2.0'
permissionsdispatcherVersion
=
'2.3.1'
}
dependencies
{
compile
project
(
':log-wrapper'
)
compile
project
(
':android-ddp'
)
compile
project
(
':rocket-chat-core'
)
compile
project
(
':rocket-chat-android-widgets'
)
compile
project
(
':persistence-realm'
)
compile
rootProject
.
ext
.
supportAppCompat
compile
rootProject
.
ext
.
supportDesign
compile
"com.android.support:appcompat-v7:$supportVersion"
compile
"com.android.support:design:$supportVersion"
qaCompile
(
'com.instabug.library:instabug:3.1.0'
)
{
exclude
group:
'io.reactivex'
}
compile
'com.android.support:multidex:1.0.1'
compile
'com.google.firebase:firebase-core:10.2.0'
compile
'com.google.firebase:firebase-crash:10.2.0'
compile
"com.google.firebase:firebase-core:$playLibVersion"
compile
"com.google.firebase:firebase-crash:$playLibVersion"
compile
'com.google.android.gms:play-services-gcm:10.2.0'
compile
"com.google.android.gms:play-services-gcm:$playLibVersion"
compile
rootProject
.
ext
.
okhttp3
compile
'com.squareup.okhttp3:okhttp:3.6.0'
compile
'com.facebook.stetho:stetho:1.4.1'
compile
'com.facebook.stetho:stetho-okhttp3:1.4.1'
compile
"com.facebook.stetho:stetho:$stethoVersion"
compile
"com.facebook.stetho:stetho-okhttp3:$stethoVersion"
compile
'com.uphyca:stetho_realm:2.0.1'
compile
'com.jakewharton.rxbinding:rxbinding:1.0.0'
compile
'com.jakewharton.rxbinding:rxbinding-support-v4:1.0.0'
compile
"com.jakewharton.rxbinding:rxbinding:$rxbindingVersion"
compile
"com.jakewharton.rxbinding:rxbinding-support-v4:$rxbindingVersion"
compile
'com.trello:rxlifecycle:1.0'
compile
'com.trello:rxlifecycle-android:1.0'
compile
'com.trello:rxlifecycle-components:1.0'
compile
"com.trello.rxlifecycle2:rxlifecycle:$rxlifecycleVersion"
compile
"com.trello.rxlifecycle2:rxlifecycle-android:$rxlifecycleVersion"
compile
"com.trello.rxlifecycle2:rxlifecycle-components:$rxlifecycleVersion"
compile
rootProject
.
ext
.
textDrawable
compile
'com.amulyakhare:com.amulyakhare.textdrawable:1.0.1'
compile
'frankiesardo:icepick:3.2.0'
provided
'frankiesardo:icepick-processor:3.2.0'
compile
"frankiesardo:icepick:$icepickVersion"
provided
"frankiesardo:icepick-processor:$icepickVersion"
compile
'com.github.hotchemi:permissionsdispatcher:2.3.0'
annotationProcessor
'com.github.hotchemi:permissionsdispatcher-processor:2.3.0'
compile
"com.github.hotchemi:permissionsdispatcher:$permissionsdispatcherVersion"
annotationProcessor
"com.github.hotchemi:permissionsdispatcher-processor:$permissionsdispatcherVersion"
}
apply
plugin:
'com.google.gms.google-services'
app/src/main/java/chat/rocket/android/activity/AbstractFragmentActivity.java
View file @
3de8d825
...
...
@@ -6,7 +6,8 @@ import android.support.annotation.Nullable;
import
android.support.v4.app.Fragment
;
import
android.support.v4.app.FragmentManager
;
import
android.view.MotionEvent
;
import
com.trello.rxlifecycle.components.support.RxAppCompatActivity
;
import
com.trello.rxlifecycle2.components.support.RxAppCompatActivity
;
import
chat.rocket.android.helper.OnBackPressListener
;
import
chat.rocket.android.log.RCLog
;
...
...
app/src/main/java/chat/rocket/android/activity/LoginPresenter.java
View file @
3de8d825
...
...
@@ -2,12 +2,13 @@ package chat.rocket.android.activity;
import
android.support.annotation.NonNull
;
import
io.reactivex.android.schedulers.AndroidSchedulers
;
import
io.reactivex.disposables.Disposable
;
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
{
...
...
@@ -45,7 +46,7 @@ public class LoginPresenter extends BasePresenter<LoginContract.View>
}
private
void
loadSessionState
()
{
final
Subscription
subscription
=
sessionInteractor
.
getSessionState
()
final
Disposable
subscription
=
sessionInteractor
.
getSessionState
()
.
distinctUntilChanged
()
.
subscribeOn
(
AndroidSchedulers
.
from
(
BackgroundLooper
.
get
()))
.
observeOn
(
AndroidSchedulers
.
mainThread
())
...
...
app/src/main/java/chat/rocket/android/activity/MainActivity.java
View file @
3de8d825
...
...
@@ -219,10 +219,10 @@ public class MainActivity extends AbstractAuthedActivity implements MainContract
}
@Override
public
void
showUnreadCount
(
int
roomsCount
,
int
mentionsCount
)
{
public
void
showUnreadCount
(
long
roomsCount
,
int
mentionsCount
)
{
RoomToolbar
toolbar
=
(
RoomToolbar
)
findViewById
(
R
.
id
.
activity_main_toolbar
);
if
(
toolbar
!=
null
)
{
toolbar
.
setUnreadBudge
(
roomsCount
,
mentionsCount
);
toolbar
.
setUnreadBudge
(
(
int
)
roomsCount
,
mentionsCount
);
}
}
...
...
app/src/main/java/chat/rocket/android/activity/MainContract.java
View file @
3de8d825
...
...
@@ -10,7 +10,7 @@ public interface MainContract {
void
showRoom
(
String
hostname
,
String
roomId
);
void
showUnreadCount
(
int
roomsCount
,
int
mentionsCount
);
void
showUnreadCount
(
long
roomsCount
,
int
mentionsCount
);
void
showLoginScreen
();
...
...
app/src/main/java/chat/rocket/android/activity/MainPresenter.java
View file @
3de8d825
...
...
@@ -3,14 +3,16 @@ package chat.rocket.android.activity;
import
android.support.annotation.NonNull
;
import
android.support.v4.util.Pair
;
import
io.reactivex.Flowable
;
import
io.reactivex.android.schedulers.AndroidSchedulers
;
import
io.reactivex.disposables.Disposable
;
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
;
import
chat.rocket.core.models.Session
;
public
class
MainPresenter
extends
BasePresenter
<
MainContract
.
View
>
implements
MainContract
.
Presenter
{
...
...
@@ -37,7 +39,7 @@ public class MainPresenter extends BasePresenter<MainContract.View>
@Override
public
void
onOpenRoom
(
String
hostname
,
String
roomId
)
{
final
Subscription
subscription
=
canCreateRoomInteractor
.
canCreate
(
roomId
)
final
Disposable
subscription
=
canCreateRoomInteractor
.
canCreate
(
roomId
)
.
subscribeOn
(
AndroidSchedulers
.
from
(
BackgroundLooper
.
get
()))
.
observeOn
(
AndroidSchedulers
.
mainThread
())
.
subscribe
(
allowed
->
{
...
...
@@ -53,14 +55,14 @@ public class MainPresenter extends BasePresenter<MainContract.View>
@Override
public
void
onRetryLogin
()
{
final
Subscription
subscription
=
sessionInteractor
.
retryLogin
()
final
Disposable
subscription
=
sessionInteractor
.
retryLogin
()
.
subscribe
();
addSubscription
(
subscription
);
}
private
void
subscribeToUnreadCount
()
{
final
Subscription
subscription
=
Observ
able
.
combineLatest
(
final
Disposable
subscription
=
Flow
able
.
combineLatest
(
roomInteractor
.
getTotalUnreadRoomsCount
(),
roomInteractor
.
getTotalUnreadMentionsCount
(),
(
Pair:
:
new
)
...
...
@@ -73,10 +75,11 @@ public class MainPresenter extends BasePresenter<MainContract.View>
}
private
void
subscribeToSession
()
{
final
Subscription
subscription
=
sessionInteractor
.
getDefault
()
final
Disposable
subscription
=
sessionInteractor
.
getDefault
()
.
subscribeOn
(
AndroidSchedulers
.
from
(
BackgroundLooper
.
get
()))
.
observeOn
(
AndroidSchedulers
.
mainThread
())
.
subscribe
(
session
->
{
.
subscribe
(
sessionOptional
->
{
Session
session
=
sessionOptional
.
orNull
();
if
(
session
==
null
||
session
.
getToken
()
==
null
)
{
view
.
showLoginScreen
();
return
;
...
...
app/src/main/java/chat/rocket/android/api/DDPClientWrapper.java
View file @
3de8d825
package
chat
.
rocket
.
android
.
api
;
import
android.support.annotation.Nullable
;
import
io.reactivex.Flowable
;
import
org.json.JSONArray
;
import
org.json.JSONException
;
...
...
@@ -12,7 +13,6 @@ import chat.rocket.android.log.RCLog;
import
chat.rocket.android_ddp.DDPClient
;
import
chat.rocket.android_ddp.DDPClientCallback
;
import
chat.rocket.android_ddp.DDPSubscription
;
import
rx.Observable
;
/**
* DDP client wrapper.
...
...
@@ -69,7 +69,7 @@ public class DDPClientWrapper {
/**
* Returns Observable for handling DDP subscription.
*/
public
Observ
able
<
DDPSubscription
.
Event
>
getSubscriptionCallback
()
{
public
Flow
able
<
DDPSubscription
.
Event
>
getSubscriptionCallback
()
{
return
ddpClient
.
getSubscriptionCallback
();
}
...
...
app/src/main/java/chat/rocket/android/api/rest/DefaultServerPolicyApi.java
View file @
3de8d825
...
...
@@ -2,6 +2,9 @@ package chat.rocket.android.api.rest;
import
android.support.annotation.NonNull
;
import
io.reactivex.BackpressureStrategy
;
import
io.reactivex.Flowable
;
import
io.reactivex.FlowableEmitter
;
import
org.json.JSONObject
;
import
java.io.IOException
;
...
...
@@ -9,8 +12,6 @@ import okhttp3.Call;
import
okhttp3.OkHttpClient
;
import
okhttp3.Request
;
import
okhttp3.ResponseBody
;
import
rx.Emitter
;
import
rx.Observable
;
public
class
DefaultServerPolicyApi
implements
ServerPolicyApi
{
...
...
@@ -25,23 +26,23 @@ public class DefaultServerPolicyApi implements ServerPolicyApi {
}
@Override
public
Observ
able
<
Response
<
JSONObject
>>
getApiInfoSecurely
()
{
public
Flow
able
<
Response
<
JSONObject
>>
getApiInfoSecurely
()
{
return
getApiInfo
(
SECURE_PROTOCOL
);
}
@Override
public
Observ
able
<
Response
<
JSONObject
>>
getApiInfoInsecurely
()
{
public
Flow
able
<
Response
<
JSONObject
>>
getApiInfoInsecurely
()
{
return
getApiInfo
(
INSECURE_PROTOCOL
);
}
private
Observ
able
<
Response
<
JSONObject
>>
getApiInfo
(
@NonNull
String
protocol
)
{
return
Observable
.
fromEmitter
(
responseEmitter
->
{
private
Flow
able
<
Response
<
JSONObject
>>
getApiInfo
(
@NonNull
String
protocol
)
{
return
Flowable
.
create
(
responseEmitter
->
{
final
Call
call
=
client
.
newCall
(
createRequest
(
protocol
));
call
.
enqueue
(
getOkHttpCallback
(
responseEmitter
,
protocol
));
responseEmitter
.
setCancella
tion
(
call:
:
cancel
);
},
Emitter
.
BackpressureMode
.
LATEST
);
responseEmitter
.
setCancella
ble
(
call:
:
cancel
);
},
BackpressureStrategy
.
LATEST
);
}
private
Request
createRequest
(
@NonNull
String
protocol
)
{
...
...
@@ -51,7 +52,7 @@ public class DefaultServerPolicyApi implements ServerPolicyApi {
.
build
();
}
private
okhttp3
.
Callback
getOkHttpCallback
(
@NonNull
Emitter
<
Response
<
JSONObject
>>
emitter
,
private
okhttp3
.
Callback
getOkHttpCallback
(
@NonNull
Flowable
Emitter
<
Response
<
JSONObject
>>
emitter
,
@NonNull
String
protocol
)
{
return
new
okhttp3
.
Callback
()
{
@Override
...
...
@@ -63,14 +64,14 @@ public class DefaultServerPolicyApi implements ServerPolicyApi {
public
void
onResponse
(
Call
call
,
okhttp3
.
Response
response
)
throws
IOException
{
if
(!
response
.
isSuccessful
())
{
emitter
.
onNext
(
new
Response
<>(
false
,
protocol
,
null
));
emitter
.
onComplete
d
();
emitter
.
onComplete
();
return
;
}
final
ResponseBody
body
=
response
.
body
();
if
(
body
==
null
||
body
.
contentLength
()
==
0
)
{
emitter
.
onNext
(
new
Response
<>(
false
,
protocol
,
null
));
emitter
.
onComplete
d
();
emitter
.
onComplete
();
return
;
}
...
...
@@ -80,7 +81,7 @@ public class DefaultServerPolicyApi implements ServerPolicyApi {
emitter
.
onNext
(
new
Response
<>(
false
,
protocol
,
null
));
}
emitter
.
onComplete
d
();
emitter
.
onComplete
();
}
};
}
...
...
app/src/main/java/chat/rocket/android/api/rest/ServerPolicyApi.java
View file @
3de8d825
package
chat
.
rocket
.
android
.
api
.
rest
;
import
io.reactivex.Flowable
;
import
org.json.JSONObject
;
import
rx.Observable
;
public
interface
ServerPolicyApi
{
String
SECURE_PROTOCOL
=
"https://"
;
String
INSECURE_PROTOCOL
=
"http://"
;
Observ
able
<
Response
<
JSONObject
>>
getApiInfoSecurely
();
Flow
able
<
Response
<
JSONObject
>>
getApiInfoSecurely
();
Observ
able
<
Response
<
JSONObject
>>
getApiInfoInsecurely
();
Flow
able
<
Response
<
JSONObject
>>
getApiInfoInsecurely
();
}
app/src/main/java/chat/rocket/android/fragment/AbstractFragment.java
View file @
3de8d825
...
...
@@ -6,7 +6,7 @@ import android.support.annotation.Nullable;
import
android.view.LayoutInflater
;
import
android.view.View
;
import
android.view.ViewGroup
;
import
com.trello.rxlifecycle.components.support.RxFragment
;
import
com.trello.rxlifecycle
2
.components.support.RxFragment
;
/**
* Fragment base class for this Application.
...
...
app/src/main/java/chat/rocket/android/fragment/add_server/InputHostnamePresenter.java
View file @
3de8d825
...
...
@@ -2,6 +2,10 @@ package chat.rocket.android.fragment.add_server;
import
android.content.SharedPreferences
;
import
io.reactivex.android.schedulers.AndroidSchedulers
;
import
io.reactivex.disposables.Disposable
;
import
io.reactivex.schedulers.Schedulers
;
import
chat.rocket.android.RocketChatCache
;
import
chat.rocket.android.api.rest.DefaultServerPolicyApi
;
import
chat.rocket.android.api.rest.ServerPolicyApi
;
...
...
@@ -10,9 +14,6 @@ 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
{
...
...
@@ -40,9 +41,9 @@ public class InputHostnamePresenter extends BasePresenter<InputHostnameContract.
final
ServerPolicyApiValidationHelper
validationHelper
=
new
ServerPolicyApiValidationHelper
(
serverPolicyApi
);
clearSubscripions
();
clearSubscrip
t
ions
();
final
Subscription
subscription
=
ServerPolicyHelper
.
isApiVersionValid
(
validationHelper
)
final
Disposable
subscription
=
ServerPolicyHelper
.
isApiVersionValid
(
validationHelper
)
.
subscribeOn
(
Schedulers
.
io
())
.
observeOn
(
AndroidSchedulers
.
mainThread
())
.
doOnTerminate
(()
->
view
.
hideLoader
())
...
...
app/src/main/java/chat/rocket/android/fragment/chatroom/RoomFragment.java
View file @
3de8d825
...
...
@@ -19,6 +19,7 @@ import android.support.v7.app.AlertDialog;
import
android.support.v7.widget.LinearLayoutManager
;
import
android.support.v7.widget.RecyclerView
;
import
android.view.View
;
import
com.jakewharton.rxbinding.support.v4.widget.RxDrawerLayout
;
import
java.lang.reflect.Field
;
...
...
@@ -56,6 +57,7 @@ import chat.rocket.persistence.realm.RealmStore;
import
chat.rocket.android.service.ConnectivityManager
;
import
chat.rocket.android.widget.internal.ExtraActionPickerDialogFragment
;
import
chat.rocket.android.widget.message.MessageFormLayout
;
import
hu.akarnokd.rxjava.interop.RxJavaInterop
;
import
permissions.dispatcher.NeedsPermission
;
import
permissions.dispatcher.RuntimePermissions
;
...
...
@@ -233,7 +235,7 @@ public class RoomFragment extends AbstractChatRoomFragment
DrawerLayout
drawerLayout
=
(
DrawerLayout
)
rootView
.
findViewById
(
R
.
id
.
drawer_layout
);
SlidingPaneLayout
pane
=
(
SlidingPaneLayout
)
getActivity
().
findViewById
(
R
.
id
.
sliding_pane
);
if
(
drawerLayout
!=
null
&&
pane
!=
null
)
{
Rx
DrawerLayout
.
drawerOpen
(
drawerLayout
,
GravityCompat
.
END
)
Rx
JavaInterop
.
toV2Flowable
(
RxDrawerLayout
.
drawerOpen
(
drawerLayout
,
GravityCompat
.
END
)
)
.
compose
(
bindToLifecycle
())
.
subscribe
(
opened
->
{
try
{
...
...
app/src/main/java/chat/rocket/android/fragment/chatroom/RoomPresenter.java
View file @
3de8d825
...
...
@@ -4,6 +4,11 @@ import android.support.annotation.NonNull;
import
android.support.annotation.Nullable
;
import
android.support.v4.util.Pair
;
import
com.fernandocejas.arrow.optional.Optional
;
import
io.reactivex.Single
;
import
io.reactivex.android.schedulers.AndroidSchedulers
;
import
io.reactivex.disposables.Disposable
;
import
chat.rocket.android.BackgroundLooper
;
import
chat.rocket.android.api.MethodCallHelper
;
import
chat.rocket.android.helper.LogIfError
;
...
...
@@ -16,9 +21,6 @@ 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
{
...
...
@@ -55,7 +57,7 @@ public class RoomPresenter extends BasePresenter<RoomContract.View>
@Override
public
void
loadMessages
()
{
final
Subscription
subscription
=
getSingleRoom
()
final
Disposable
subscription
=
getSingleRoom
()
.
flatMap
(
messageInteractor:
:
loadMessages
)
.
subscribeOn
(
AndroidSchedulers
.
from
(
BackgroundLooper
.
get
()))
.
observeOn
(
AndroidSchedulers
.
mainThread
())
...
...
@@ -71,7 +73,7 @@ public class RoomPresenter extends BasePresenter<RoomContract.View>
@Override
public
void
loadMoreMessages
()
{
final
Subscription
subscription
=
getSingleRoom
()
final
Disposable
subscription
=
getSingleRoom
()
.
flatMap
(
messageInteractor:
:
loadMoreMessages
)
.
subscribeOn
(
AndroidSchedulers
.
from
(
BackgroundLooper
.
get
()))
.
observeOn
(
AndroidSchedulers
.
mainThread
())
...
...
@@ -97,7 +99,7 @@ public class RoomPresenter extends BasePresenter<RoomContract.View>
@Override
public
void
sendMessage
(
String
messageText
)
{
final
Subscription
subscription
=
getRoomUserPair
()
final
Disposable
subscription
=
getRoomUserPair
()
.
flatMap
(
pair
->
messageInteractor
.
send
(
pair
.
first
,
pair
.
second
,
messageText
))
.
subscribeOn
(
AndroidSchedulers
.
from
(
BackgroundLooper
.
get
()))
.
observeOn
(
AndroidSchedulers
.
mainThread
())
...
...
@@ -112,7 +114,7 @@ public class RoomPresenter extends BasePresenter<RoomContract.View>
@Override
public
void
resendMessage
(
Message
message
)
{
final
Subscription
subscription
=
messageInteractor
.
resend
(
message
)
final
Disposable
subscription
=
messageInteractor
.
resend
(
message
)
.
subscribeOn
(
AndroidSchedulers
.
from
(
BackgroundLooper
.
get
()))
.
observeOn
(
AndroidSchedulers
.
mainThread
())
.
subscribe
();
...
...
@@ -122,7 +124,7 @@ public class RoomPresenter extends BasePresenter<RoomContract.View>
@Override
public
void
deleteMessage
(
Message
message
)
{
final
Subscription
subscription
=
messageInteractor
.
delete
(
message
)
final
Disposable
subscription
=
messageInteractor
.
delete
(
message
)
.
subscribeOn
(
AndroidSchedulers
.
from
(
BackgroundLooper
.
get
()))
.
observeOn
(
AndroidSchedulers
.
mainThread
())
.
subscribe
();
...
...
@@ -132,7 +134,7 @@ public class RoomPresenter extends BasePresenter<RoomContract.View>
@Override
public
void
onUnreadCount
()
{
final
Subscription
subscription
=
getRoomUserPair
()
final
Disposable
subscription
=
getRoomUserPair
()
.
flatMap
(
roomUserPair
->
messageInteractor
.
unreadCountFor
(
roomUserPair
.
first
,
roomUserPair
.
second
))
.
subscribeOn
(
AndroidSchedulers
.
from
(
BackgroundLooper
.
get
()))
...
...
@@ -146,8 +148,8 @@ public class RoomPresenter extends BasePresenter<RoomContract.View>
@Override
public
void
onMarkAsRead
()
{
final
Subscription
subscription
=
roomRepository
.
getById
(
roomId
)
.
first
()
final
Disposable
subscription
=
roomRepository
.
getById
(
roomId
)
.
first
Element
()
.
filter
(
room
->
room
!=
null
&&
room
.
isAlert
())
.
subscribeOn
(
AndroidSchedulers
.
from
(
BackgroundLooper
.
get
()))
.
observeOn
(
AndroidSchedulers
.
mainThread
())
...
...
@@ -160,7 +162,7 @@ public class RoomPresenter extends BasePresenter<RoomContract.View>
}
private
void
getRoomInfo
()
{
final
Subscription
subscription
=
roomRepository
.
getById
(
roomId
)
final
Disposable
subscription
=
roomRepository
.
getById
(
roomId
)
.
distinctUntilChanged
()
.
subscribeOn
(
AndroidSchedulers
.
from
(
BackgroundLooper
.
get
()))
.
observeOn
(
AndroidSchedulers
.
mainThread
())
...
...
@@ -172,7 +174,7 @@ public class RoomPresenter extends BasePresenter<RoomContract.View>
}
private
void
getRoomHistoryStateInfo
()
{
final
Subscription
subscription
=
roomRepository
.
getHistoryStateByRoomId
(
roomId
)
final
Disposable
subscription
=
roomRepository
.
getHistoryStateByRoomId
(
roomId
)
.
distinctUntilChanged
()
.
subscribeOn
(
AndroidSchedulers
.
from
(
BackgroundLooper
.
get
()))
.
observeOn
(
AndroidSchedulers
.
mainThread
())
...
...
@@ -190,8 +192,7 @@ public class RoomPresenter extends BasePresenter<RoomContract.View>
}
private
void
getMessages
()
{
final
Subscription
subscription
=
roomRepository
.
getById
(
roomId
)
.
first
()
final
Disposable
subscription
=
roomRepository
.
getById
(
roomId
)
.
flatMap
(
messageInteractor:
:
getAllFrom
)
.
subscribeOn
(
AndroidSchedulers
.
from
(
BackgroundLooper
.
get
()))
.
observeOn
(
AndroidSchedulers
.
mainThread
())
...
...
@@ -204,8 +205,9 @@ public class RoomPresenter extends BasePresenter<RoomContract.View>
return
Single
.
zip
(
getSingleRoom
(),
userRepository
.
getCurrent
()
.
filter
(
user
->
user
!=
null
)
.
first
()
.
filter
(
Optional:
:
isPresent
)
.
map
(
Optional:
:
get
)
.
firstElement
()
.
toSingle
(),
Pair:
:
new
);
...
...
@@ -213,7 +215,7 @@ public class RoomPresenter extends BasePresenter<RoomContract.View>
private
Single
<
Room
>
getSingleRoom
()
{
return
roomRepository
.
getById
(
roomId
)
.
first
()
.
first
Element
()
.
toSingle
();
}
}
app/src/main/java/chat/rocket/android/fragment/sidebar/SidebarMainFragment.java
View file @
3de8d825
...
...
@@ -8,7 +8,6 @@ import android.widget.CompoundButton;
import
android.widget.ImageView
;
import
android.widget.LinearLayout
;
import
android.widget.TextView
;
import
com.jakewharton.rxbinding.view.RxView
;
import
com.jakewharton.rxbinding.widget.RxCompoundButton
;
import
java.util.List
;
...
...
@@ -29,6 +28,7 @@ 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
hu.akarnokd.rxjava.interop.RxJavaInterop
;
public
class
SidebarMainFragment
extends
AbstractFragment
implements
SidebarMainContract
.
View
{
...
...
@@ -115,9 +115,12 @@ public class SidebarMainFragment extends AbstractFragment implements SidebarMain
rootView
.
findViewById
(
R
.
id
.
user_info_container
).
setOnClickListener
(
view
->
{
toggleUserAction
.
toggle
();
});
Rx
CompoundButton
.
checkedChanges
(
toggleUserAction
)
Rx
JavaInterop
.
toV2Flowable
(
RxCompoundButton
.
checkedChanges
(
toggleUserAction
)
)
.
compose
(
bindToLifecycle
())
.
subscribe
(
RxView
.
visibility
(
rootView
.
findViewById
(
R
.
id
.
user_action_outer_container
)));
.
subscribe
(
aBoolean
->
{
rootView
.
findViewById
(
R
.
id
.
user_action_outer_container
)
.
setVisibility
(
aBoolean
?
View
.
VISIBLE
:
View
.
GONE
);
});
}
private
void
setupUserStatusButtons
()
{
...
...
app/src/main/java/chat/rocket/android/fragment/sidebar/SidebarMainPresenter.java
View file @
3de8d825
...
...
@@ -2,6 +2,9 @@ package chat.rocket.android.fragment.sidebar;
import
android.support.annotation.NonNull
;
import
io.reactivex.android.schedulers.AndroidSchedulers
;
import
io.reactivex.disposables.Disposable
;
import
chat.rocket.android.BackgroundLooper
;
import
chat.rocket.android.api.MethodCallHelper
;
import
chat.rocket.android.helper.LogIfError
;
...
...
@@ -10,8 +13,6 @@ 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
{
...
...
@@ -72,7 +73,7 @@ public class SidebarMainPresenter extends BasePresenter<SidebarMainContract.View
}
private
void
subscribeToRooms
()
{
final
Subscription
subscription
=
roomInteractor
.
getOpenRooms
()
final
Disposable
subscription
=
roomInteractor
.
getOpenRooms
()
.
distinctUntilChanged
()
.
subscribeOn
(
AndroidSchedulers
.
from
(
BackgroundLooper
.
get
()))
.
observeOn
(
AndroidSchedulers
.
mainThread
())
...
...
@@ -84,11 +85,11 @@ public class SidebarMainPresenter extends BasePresenter<SidebarMainContract.View
}
private
void
subscribeToUser
()
{
final
Subscription
subscription
=
userRepository
.
getCurrent
()
final
Disposable
subscription
=
userRepository
.
getCurrent
()
.
distinctUntilChanged
()
.
subscribeOn
(
AndroidSchedulers
.
from
(
BackgroundLooper
.
get
()))
.
observeOn
(
AndroidSchedulers
.
mainThread
())
.
subscribe
(
user
->
view
.
showUser
(
user
));
.
subscribe
(
user
Optional
->
view
.
showUser
(
userOptional
.
orNull
()
));
addSubscription
(
subscription
);
}
...
...
app/src/main/java/chat/rocket/android/fragment/sidebar/dialog/AbstractAddRoomDialogFragment.java
View file @
3de8d825
...
...
@@ -7,7 +7,8 @@ import android.support.annotation.NonNull;
import
android.support.annotation.Nullable
;
import
android.view.View
;
import
android.widget.Toast
;
import
com.trello.rxlifecycle.components.support.RxAppCompatDialogFragment
;
import
com.trello.rxlifecycle2.components.support.RxAppCompatDialogFragment
;
import
bolts.Task
;
import
chat.rocket.android.R
;
...
...
app/src/main/java/chat/rocket/android/fragment/sidebar/dialog/AddChannelDialogFragment.java
View file @
3de8d825
...
...
@@ -4,12 +4,12 @@ import android.os.Bundle;
import
android.view.View
;
import
android.widget.CompoundButton
;
import
android.widget.TextView
;
import
com.jakewharton.rxbinding.view.RxView
;
import
com.jakewharton.rxbinding.widget.RxTextView
;
import
bolts.Task
;
import
chat.rocket.android.R
;
import
chat.rocket.android.helper.TextUtils
;
import
hu.akarnokd.rxjava.interop.RxJavaInterop
;
/**
* add Channel, add Private-group.
...
...
@@ -36,10 +36,11 @@ public class AddChannelDialogFragment extends AbstractAddRoomDialogFragment {
protected
void
onSetupDialog
()
{
View
buttonAddChannel
=
getDialog
().
findViewById
(
R
.
id
.
btn_add_channel
);
RxTextView
.
textChanges
((
TextView
)
getDialog
().
findViewById
(
R
.
id
.
editor_channel_name
))
RxJavaInterop
.
toV2Flowable
(
RxTextView
.
textChanges
((
TextView
)
getDialog
().
findViewById
(
R
.
id
.
editor_channel_name
)))
.
map
(
text
->
!
TextUtils
.
isEmpty
(
text
))
.
compose
(
bindToLifecycle
())
.
subscribe
(
RxView
.
enabled
(
buttonAddChannel
)
);
.
subscribe
(
buttonAddChannel:
:
setEnabled
);
buttonAddChannel
.
setOnClickListener
(
view
->
createRoom
());
}
...
...
app/src/main/java/chat/rocket/android/fragment/sidebar/dialog/AddDirectMessageDialogFragment.java
View file @
3de8d825
...
...
@@ -4,7 +4,6 @@ import android.os.Bundle;
import
android.view.View
;
import
android.widget.AutoCompleteTextView
;
import
android.widget.TextView
;
import
com.jakewharton.rxbinding.view.RxView
;
import
com.jakewharton.rxbinding.widget.RxTextView
;
import
io.realm.Case
;
...
...
@@ -14,6 +13,7 @@ import chat.rocket.android.helper.TextUtils;
import
chat.rocket.android.layouthelper.sidebar.dialog.SuggestUserAdapter
;
import
chat.rocket.persistence.realm.models.ddp.RealmUser
;
import
chat.rocket.persistence.realm.RealmAutoCompleteAdapter
;
import
hu.akarnokd.rxjava.interop.RxJavaInterop
;
/**
* add Direct RealmMessage.
...
...
@@ -39,17 +39,18 @@ public class AddDirectMessageDialogFragment extends AbstractAddRoomDialogFragmen
AutoCompleteTextView
autoCompleteTextView
=
(
AutoCompleteTextView
)
getDialog
().
findViewById
(
R
.
id
.
editor_username
);
RealmAutoCompleteAdapter
<
RealmUser
>
adapter
=
realmHelper
.
createAutoCompleteAdapter
(
getContext
(),
(
realm
,
text
)
->
realm
.
where
(
RealmUser
.
class
)
.
contains
(
RealmUser
.
USERNAME
,
text
,
Case
.
INSENSITIVE
)
.
findAllSorted
(
RealmUser
.
USERNAME
),
context
->
new
SuggestUserAdapter
(
context
,
hostname
));
RealmAutoCompleteAdapter
<
RealmUser
>
adapter
=
realmHelper
.
createAutoCompleteAdapter
(
getContext
(),
(
realm
,
text
)
->
realm
.
where
(
RealmUser
.
class
)
.
contains
(
RealmUser
.
USERNAME
,
text
,
Case
.
INSENSITIVE
)
.
findAllSorted
(
RealmUser
.
USERNAME
),
context
->
new
SuggestUserAdapter
(
context
,
hostname
));
autoCompleteTextView
.
setAdapter
(
adapter
);
Rx
TextView
.
textChanges
(
autoCompleteTextView
)
Rx
JavaInterop
.
toV2Flowable
(
RxTextView
.
textChanges
(
autoCompleteTextView
)
)
.
map
(
text
->
!
TextUtils
.
isEmpty
(
text
))
.
compose
(
bindToLifecycle
())
.
subscribe
(
RxView
.
enabled
(
buttonAddDirectMessage
)
);
.
subscribe
(
buttonAddDirectMessage:
:
setEnabled
);
buttonAddDirectMessage
.
setOnClickListener
(
view
->
createRoom
());
}
...
...
app/src/main/java/chat/rocket/android/helper/ServerPolicyApiValidationHelper.java
View file @
3de8d825
...
...
@@ -2,8 +2,9 @@ package chat.rocket.android.helper;
import
android.support.annotation.NonNull
;
import
io.reactivex.Flowable
;
import
chat.rocket.android.api.rest.ServerPolicyApi
;
import
rx.Observable
;
public
class
ServerPolicyApiValidationHelper
{
...
...
@@ -13,7 +14,7 @@ public class ServerPolicyApiValidationHelper {
this
.
serverPolicyApi
=
serverPolicyApi
;
}
public
Observ
able
<
ServerPolicyHelper
.
ServerInfoResponse
>
getApiVersion
()
{
public
Flow
able
<
ServerPolicyHelper
.
ServerInfoResponse
>
getApiVersion
()
{
return
serverPolicyApi
.
getApiInfoSecurely
()
.
onErrorResumeNext
(
serverPolicyApi
.
getApiInfoInsecurely
())
.
map
(
response
->
new
ServerPolicyHelper
.
ServerInfoResponse
(
...
...
app/src/main/java/chat/rocket/android/helper/ServerPolicyHelper.java
View file @
3de8d825
...
...
@@ -2,10 +2,9 @@ package chat.rocket.android.helper;
import
android.support.annotation.NonNull
;
import
io.reactivex.Flowable
;
import
org.json.JSONObject
;
import
rx.Observable
;
public
class
ServerPolicyHelper
{
private
static
final
String
DEFAULT_HOST
=
".rocket.chat"
;
...
...
@@ -19,7 +18,7 @@ public class ServerPolicyHelper {
return
removeTrailingSlash
(
removeProtocol
(
enforceDefaultHost
(
hostname
)));
}
public
static
Observ
able
<
ServerValidation
>
isApiVersionValid
(
public
static
Flow
able
<
ServerValidation
>
isApiVersionValid
(
@NonNull
ServerPolicyApiValidationHelper
serverPolicyApiValidationHelper
)
{
return
serverPolicyApiValidationHelper
.
getApiVersion
()
.
map
(
serverInfo
->
...
...
app/src/main/java/chat/rocket/android/service/ddp/AbstractDDPDocEventSubscriber.java
View file @
3de8d825
...
...
@@ -2,6 +2,7 @@ package chat.rocket.android.service.ddp;
import
android.content.Context
;
import
android.text.TextUtils
;
import
io.reactivex.disposables.Disposable
;
import
io.realm.Realm
;
import
io.realm.RealmObject
;
import
org.json.JSONArray
;
...
...
@@ -15,7 +16,6 @@ import chat.rocket.persistence.realm.RealmHelper;
import
chat.rocket.android.service.DDPClientRef
;
import
chat.rocket.android.service.Registrable
;
import
chat.rocket.android_ddp.DDPSubscription
;
import
rx.Subscription
;
public
abstract
class
AbstractDDPDocEventSubscriber
implements
Registrable
{
protected
final
Context
context
;
...
...
@@ -24,7 +24,7 @@ public abstract class AbstractDDPDocEventSubscriber implements Registrable {
protected
final
DDPClientRef
ddpClientRef
;
private
boolean
isUnsubscribed
;
private
String
subscriptionId
;
private
Subscription
rxSubscription
;
private
Disposable
rxSubscription
;
protected
AbstractDDPDocEventSubscriber
(
Context
context
,
String
hostname
,
RealmHelper
realmHelper
,
DDPClientRef
ddpClientRef
)
{
...
...
@@ -94,7 +94,7 @@ public abstract class AbstractDDPDocEventSubscriber implements Registrable {
onRegister
();
}
protected
Subscription
subscribe
()
{
protected
Disposable
subscribe
()
{
return
ddpClientRef
.
get
().
getSubscriptionCallback
()
.
filter
(
event
->
event
instanceof
DDPSubscription
.
DocEvent
)
.
cast
(
DDPSubscription
.
DocEvent
.
class
)
...
...
@@ -179,7 +179,7 @@ public abstract class AbstractDDPDocEventSubscriber implements Registrable {
isUnsubscribed
=
true
;
onUnregister
();
if
(
rxSubscription
!=
null
)
{
rxSubscription
.
unsubscrib
e
();
rxSubscription
.
dispos
e
();
}
if
(!
TextUtils
.
isEmpty
(
subscriptionId
))
{
ddpClientRef
.
get
().
unsubscribe
(
subscriptionId
).
continueWith
(
new
LogIfError
());
...
...
app/src/main/java/chat/rocket/android/shared/BasePresenter.java
View file @
3de8d825
...
...
@@ -2,14 +2,14 @@ package chat.rocket.android.shared;
import
android.support.annotation.NonNull
;
import
rx.Subscription
;
import
rx.subscriptions.CompositeSubscription
;
import
io.reactivex.disposables.CompositeDisposable
;
import
io.reactivex.disposables.Disposable
;
public
abstract
class
BasePresenter
<
T
extends
BaseContract
.
View
>
implements
BaseContract
.
Presenter
<
T
>
{
protected
T
view
;
private
Composite
Subscription
compositeSubscription
=
new
CompositeSubscription
();
private
Composite
Disposable
compositeSubscription
=
new
CompositeDisposable
();
@Override
public
void
bindView
(
@NonNull
T
view
)
{
...
...
@@ -22,11 +22,11 @@ public abstract class BasePresenter<T extends BaseContract.View>
view
=
null
;
}
protected
void
addSubscription
(
Subscription
subscription
)
{
protected
void
addSubscription
(
Disposable
subscription
)
{
compositeSubscription
.
add
(
subscription
);
}
protected
void
clearSubscripions
()
{
protected
void
clearSubscrip
t
ions
()
{
compositeSubscription
.
clear
();
}
}
circle.yml
View file @
3de8d825
...
...
@@ -26,10 +26,10 @@ dependencies:
-
echo y | android update sdk --no-ui --all --filter android-25
-
echo y | android update sdk --no-ui --all --filter extra-android-m2repository,extra-android-support
-
echo y | android update sdk --no-ui --all --filter extra-google-m2repository,extra-google-google_play_services
-
echo y | android update sdk --no-ui --all --filter build-tools-25.0.
1
-
echo y | android update sdk --no-ui --all --filter build-tools-25.0.
2
cache_directories
:
-
/usr/local/android-sdk-linux/tools
-
/usr/local/android-sdk-linux/build-tools/25.0.
1
-
/usr/local/android-sdk-linux/build-tools/25.0.
2
test
:
override
:
...
...
dependencies.gradle
View file @
3de8d825
ext
{
androidPlugin
=
'com.android.tools.build:gradle:2.2.3'
realmPlugin
=
'io.realm:realm-gradle-plugin:2.2.1'
retroLambdaPlugin
=
'me.tatarka:gradle-retrolambda:3.3.1'
retroLambdaPatch
=
'me.tatarka.retrolambda.projectlombok:lombok.ast:0.2.3.a2'
compileSdkVersion
=
25
buildToolsVersion
=
'25.0.1'
minSdkVersion
=
16
supportVersion
=
'25.0.1'
supportAnnotations
=
"com.android.support:support-annotations:$supportVersion"
supportRecyclerView
=
"com.android.support:recyclerview-v7:$supportVersion"
supportAppCompat
=
"com.android.support:appcompat-v7:$supportVersion"
supportV13
=
"com.android.support:support-v13:$supportVersion"
supportDesign
=
"com.android.support:design:$supportVersion"
frescoVersion
=
'1.0.1'
frescoBase
=
"com.facebook.fresco:fresco:$frescoVersion"
frescoAnimatedGif
=
"com.facebook.fresco:animated-gif:$frescoVersion"
frescoAnimatedWebp
=
"com.facebook.fresco:animated-webp:$frescoVersion"
frescoWebp
=
"com.facebook.fresco:webpsupport:$frescoVersion"
frescoImagePipelineOkHttp3
=
"com.facebook.fresco:imagepipeline-okhttp3:$frescoVersion"
rxJava
=
'io.reactivex:rxjava:1.2.3'
boltsTask
=
'com.parse.bolts:bolts-tasks:1.4.0'
okhttp3
=
'com.squareup.okhttp3:okhttp:3.5.0'
textDrawable
=
'com.amulyakhare:com.amulyakhare.textdrawable:1.0.1'
preDexLibs
=
!
"true"
.
equals
(
System
.
getenv
(
"CI"
))
}
subprojects
{
project
->
project
.
configurations
.
all
{
resolutionStrategy
{
eachDependency
{
details
->
if
(
details
.
requested
.
group
==
'com.android.support'
&&
details
.
requested
.
name
.
indexOf
(
"multidex"
)
==
-
1
)
{
details
.
useVersion
(
rootProject
.
ext
.
supportVersion
)
}
}
}
}
preDexLibs
=
!
"true"
.
equals
(
System
.
getenv
(
"CI"
))
}
subprojects
{
project
.
plugins
.
whenPluginAdded
{
plugin
->
if
(
"com.android.build.gradle.AppPlugin"
.
equals
(
plugin
.
class
.
name
))
{
project
.
android
.
dexOptions
.
preDexLibraries
=
rootProject
.
ext
.
preDexLibs
}
else
if
(
"com.android.build.gradle.LibraryPlugin"
.
equals
(
plugin
.
class
.
name
))
{
project
.
android
.
dexOptions
.
preDexLibraries
=
rootProject
.
ext
.
preDexLibs
project
.
plugins
.
whenPluginAdded
{
plugin
->
if
(
"com.android.build.gradle.AppPlugin"
.
equals
(
plugin
.
class
.
name
))
{
project
.
android
.
dexOptions
.
preDexLibraries
=
rootProject
.
ext
.
preDexLibs
}
else
if
(
"com.android.build.gradle.LibraryPlugin"
.
equals
(
plugin
.
class
.
name
))
{
project
.
android
.
dexOptions
.
preDexLibraries
=
rootProject
.
ext
.
preDexLibs
}
}
}
}
\ No newline at end of file
log-wrapper/build.gradle
View file @
3de8d825
...
...
@@ -5,17 +5,17 @@ buildscript {
jcenter
()
}
dependencies
{
classpath
rootProject
.
ext
.
androidPlugin
classpath
'com.android.tools.build:gradle:2.2.3'
}
}
android
{
compileSdkVersion
rootProject
.
ext
.
compileSdkVersion
buildToolsVersion
rootProject
.
ext
.
buildToolsVersion
compileSdkVersion
25
buildToolsVersion
'25.0.2'
defaultConfig
{
minSdkVersion
rootProject
.
ext
.
minSdkVersion
targetSdkVersion
rootProject
.
ext
.
compileSdkVersion
minSdkVersion
16
targetSdkVersion
25
versionCode
1
versionName
"1"
}
...
...
@@ -26,7 +26,3 @@ android {
}
}
}
dependencies
{
compile
rootProject
.
ext
.
supportAnnotations
}
\ No newline at end of file
persistence-realm/build.gradle
View file @
3de8d825
...
...
@@ -4,48 +4,58 @@ apply plugin: 'com.jakewharton.hugo'
apply
plugin:
'me.tatarka.retrolambda'
buildscript
{
repositories
{
jcenter
()
}
dependencies
{
classpath
rootProject
.
ext
.
androidPlugin
classpath
rootProject
.
ext
.
realmPlugin
classpath
rootProject
.
ext
.
retroLambdaPlugin
classpath
rootProject
.
ext
.
retroLambdaPatch
classpath
'com.jakewharton.hugo:hugo-plugin:1.2.1'
}
repositories
{
jcenter
()
}
dependencies
{
classpath
'com.android.tools.build:gradle:2.2.3'
classpath
'io.realm:realm-gradle-plugin:2.3.1'
classpath
'me.tatarka:gradle-retrolambda:3.5.0'
classpath
'me.tatarka.retrolambda.projectlombok:lombok.ast:0.2.3.a2'
classpath
'com.jakewharton.hugo:hugo-plugin:1.2.1'
}
}
android
{
compileSdkVersion
rootProject
.
ext
.
compileSdkVersion
buildToolsVersion
rootProject
.
ext
.
buildToolsVersion
compileOptions
{
sourceCompatibility
JavaVersion
.
VERSION_1_8
targetCompatibility
JavaVersion
.
VERSION_1_8
}
defaultConfig
{
minSdkVersion
rootProject
.
ext
.
minSdkVersion
targetSdkVersion
rootProject
.
ext
.
compileSdkVersion
versionCode
1
versionName
"1"
}
buildTypes
{
release
{
minifyEnabled
false
proguardFiles
getDefaultProguardFile
(
'proguard-android.txt'
),
'proguard-rules.pro'
compileSdkVersion
25
buildToolsVersion
'25.0.2'
compileOptions
{
sourceCompatibility
JavaVersion
.
VERSION_1_8
targetCompatibility
JavaVersion
.
VERSION_1_8
}
}
defaultConfig
{
minSdkVersion
16
targetSdkVersion
25
versionCode
1
versionName
"1"
}
buildTypes
{
release
{
minifyEnabled
false
proguardFiles
getDefaultProguardFile
(
'proguard-android.txt'
),
'proguard-rules.pro'
}
}
}
ext
{
supportVersion
=
'25.1.1'
}
dependencies
{
testCompile
'junit:junit:4.12'
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
.
supportAnnotations
compile
rootProject
.
ext
.
supportAppCompat
compile
rootProject
.
ext
.
supportDesign
compile
project
(
':log-wrapper'
)
compile
project
(
':rocket-chat-core'
)
compile
"com.android.support:support-annotations:$supportVersion"
compile
"com.android.support:appcompat-v7:$supportVersion"
compile
"com.android.support:design:$supportVersion"
compile
'io.reactivex.rxjava2:rxjava:2.0.6'
compile
'io.reactivex.rxjava2:rxandroid:2.0.1'
compile
'com.github.akarnokd:rxjava2-interop:0.9.1'
compile
'com.parse.bolts:bolts-tasks:1.4.0'
testCompile
'junit:junit:4.12'
}
persistence-realm/src/main/java/chat/rocket/persistence/realm/repositories/RealmMessageRepository.java
View file @
3de8d825
package
chat
.
rocket
.
persistence
.
realm
.
repositories
;
import
android.os.Looper
;
import
android.support.v4.util.Pair
;
import
com.fernandocejas.arrow.optional.Optional
;
import
io.reactivex.Flowable
;
import
io.reactivex.Single
;
import
io.reactivex.android.schedulers.AndroidSchedulers
;
import
io.realm.Realm
;
import
io.realm.RealmResults
;
import
io.realm.Sort
;
...
...
@@ -14,9 +19,7 @@ import chat.rocket.core.repositories.MessageRepository;
import
chat.rocket.persistence.realm.RealmStore
;
import
chat.rocket.persistence.realm.models.ddp.RealmMessage
;
import
chat.rocket.persistence.realm.models.ddp.RealmUser
;
import
rx.Observable
;
import
rx.Single
;
import
rx.android.schedulers.AndroidSchedulers
;
import
hu.akarnokd.rxjava.interop.RxJavaInterop
;
public
class
RealmMessageRepository
extends
RealmRepository
implements
MessageRepository
{
...
...
@@ -27,34 +30,28 @@ public class RealmMessageRepository extends RealmRepository implements MessageRe
}
@Override
public
Single
<
Message
>
getById
(
String
messageId
)
{
return
Single
.
defer
(()
->
{
final
Realm
realm
=
RealmStore
.
getRealm
(
hostname
);
final
Looper
looper
=
Looper
.
myLooper
();
if
(
realm
==
null
||
looper
==
null
)
{
return
Single
.
just
(
null
);
}
final
RealmMessage
realmMessage
=
realm
.
where
(
RealmMessage
.
class
)
.
equalTo
(
RealmMessage
.
ID
,
messageId
)
.
findFirst
();
if
(
realmMessage
==
null
)
{
realm
.
close
();
return
Single
.
just
(
null
);
}
return
realmMessage
.<
RealmMessage
>
asObservable
()
.
unsubscribeOn
(
AndroidSchedulers
.
from
(
looper
))
.
doOnUnsubscribe
(()
->
close
(
realm
,
looper
))
.
filter
(
it
->
it
!=
null
&&
it
.
isLoaded
()
&&
it
.
isValid
())
.
first
()
.
toSingle
()
.
map
(
RealmMessage:
:
asMessage
);
});
public
Single
<
Optional
<
Message
>>
getById
(
String
messageId
)
{
return
Single
.
defer
(()
->
Flowable
.
using
(
()
->
new
Pair
<>(
RealmStore
.
getRealm
(
hostname
),
Looper
.
myLooper
()),
pair
->
RxJavaInterop
.
toV2Flowable
(
pair
.
first
.
where
(
RealmMessage
.
class
)
.
equalTo
(
RealmMessage
.
ID
,
messageId
)
.
findAll
()
.<
RealmResults
<
RealmMessage
>>
asObservable
()),
pair
->
close
(
pair
.
first
,
pair
.
second
)
)
.
unsubscribeOn
(
AndroidSchedulers
.
from
(
Looper
.
myLooper
()))
.
filter
(
it
->
it
!=
null
&&
it
.
isLoaded
()
&&
it
.
isValid
())
.
map
(
realmMessages
->
{
if
(
realmMessages
.
size
()
>
0
)
{
return
Optional
.
of
(
realmMessages
.
get
(
0
).
asMessage
());
}
return
Optional
.<
Message
>
absent
();
})
.
firstElement
()
.
toSingle
());
}
@Override
...
...
@@ -92,13 +89,13 @@ public class RealmMessageRepository extends RealmRepository implements MessageRe
realm
.
beginTransaction
();
return
realm
.
copyToRealmOrUpdate
(
realmMessage
)
.
asObservable
()
.
unsubscribeOn
(
AndroidSchedulers
.
from
(
looper
))
.
doOnUnsubscribe
(()
->
close
(
realm
,
looper
))
return
RxJavaInterop
.
toV2Flowable
(
realm
.
copyToRealmOrUpdate
(
realmMessage
)
.
asObservable
())
.
filter
(
it
->
it
!=
null
&&
it
.
isLoaded
()
&&
it
.
isValid
())
.
first
()
.
doOnNext
(
it
->
realm
.
commitTransaction
())
.
firstElement
()
.
doOnSuccess
(
it
->
realm
.
commitTransaction
())
.
doOnError
(
throwable
->
realm
.
cancelTransaction
())
.
doOnEvent
((
realmObject
,
throwable
)
->
close
(
realm
,
looper
))
.
toSingle
()
.
map
(
realmObject
->
true
);
});
...
...
@@ -116,71 +113,58 @@ public class RealmMessageRepository extends RealmRepository implements MessageRe
realm
.
beginTransaction
();
return
realm
.
where
(
RealmMessage
.
class
)
return
RxJavaInterop
.
toV2Flowable
(
realm
.
where
(
RealmMessage
.
class
)
.
equalTo
(
RealmMessage
.
ID
,
message
.
getId
())
.
findAll
()
.<
RealmResults
<
RealmMessage
>>
asObservable
()
.
unsubscribeOn
(
AndroidSchedulers
.
from
(
looper
))
.
doOnUnsubscribe
(()
->
close
(
realm
,
looper
))
.<
RealmResults
<
RealmMessage
>>
asObservable
())
.
filter
(
realmObject
->
realmObject
!=
null
&&
realmObject
.
isLoaded
()
&&
realmObject
.
isValid
())
.
first
()
.
first
Element
()
.
toSingle
()
.
flatMap
(
realmMessages
->
Single
.
just
(
realmMessages
.
deleteAllFromRealm
()))
.
doOnE
ach
(
notification
->
{
if
(
notification
.
getValue
()
)
{
.
doOnE
vent
((
success
,
throwable
)
->
{
if
(
success
)
{
realm
.
commitTransaction
();
}
else
{
realm
.
cancelTransaction
();
}
close
(
realm
,
looper
);
});
});
}
@Override
public
Observable
<
List
<
Message
>>
getAllFrom
(
Room
room
)
{
return
Observable
.
defer
(()
->
{
final
Realm
realm
=
RealmStore
.
getRealm
(
hostname
);
final
Looper
looper
=
Looper
.
myLooper
();
if
(
realm
==
null
||
looper
==
null
)
{
return
Observable
.
just
(
null
);
}
return
realm
.
where
(
RealmMessage
.
class
)
.
equalTo
(
RealmMessage
.
ROOM_ID
,
room
.
getRoomId
())
.
findAllSorted
(
RealmMessage
.
TIMESTAMP
,
Sort
.
DESCENDING
)
.
asObservable
()
.
unsubscribeOn
(
AndroidSchedulers
.
from
(
looper
))
.
doOnUnsubscribe
(()
->
close
(
realm
,
looper
))
.
filter
(
it
->
it
!=
null
&&
it
.
isLoaded
()
&&
it
.
isValid
())
.
map
(
this
::
toList
);
});
public
Flowable
<
List
<
Message
>>
getAllFrom
(
Room
room
)
{
return
Flowable
.
defer
(()
->
Flowable
.
using
(
()
->
new
Pair
<>(
RealmStore
.
getRealm
(
hostname
),
Looper
.
myLooper
()),
pair
->
RxJavaInterop
.
toV2Flowable
(
pair
.
first
.
where
(
RealmMessage
.
class
)
.
equalTo
(
RealmMessage
.
ROOM_ID
,
room
.
getRoomId
())
.
findAllSorted
(
RealmMessage
.
TIMESTAMP
,
Sort
.
DESCENDING
)
.
asObservable
()),
pair
->
close
(
pair
.
first
,
pair
.
second
)
)
.
unsubscribeOn
(
AndroidSchedulers
.
from
(
Looper
.
myLooper
()))
.
filter
(
it
->
it
!=
null
&&
it
.
isLoaded
()
&&
it
.
isValid
())
.
map
(
this
::
toList
));
}
@Override
public
Single
<
Integer
>
unreadCountFor
(
Room
room
,
User
user
)
{
return
Single
.
defer
(()
->
{
final
Realm
realm
=
RealmStore
.
getRealm
(
hostname
);
final
Looper
looper
=
Looper
.
myLooper
();
if
(
realm
==
null
||
looper
==
null
)
{
return
Single
.
just
(
0
);
}
return
realm
.
where
(
RealmMessage
.
class
)
.
equalTo
(
RealmMessage
.
ROOM_ID
,
room
.
getId
())
.
greaterThanOrEqualTo
(
RealmMessage
.
TIMESTAMP
,
room
.
getLastSeen
())
.
notEqualTo
(
RealmMessage
.
USER_ID
,
user
.
getId
())
.
findAll
()
.
asObservable
()
.
unsubscribeOn
(
AndroidSchedulers
.
from
(
looper
))
.
doOnUnsubscribe
(()
->
close
(
realm
,
looper
))
.
map
(
RealmResults:
:
size
)
.
first
()
.
toSingle
();
});
return
Single
.
defer
(()
->
Flowable
.
using
(
()
->
new
Pair
<>(
RealmStore
.
getRealm
(
hostname
),
Looper
.
myLooper
()),
pair
->
RxJavaInterop
.
toV2Flowable
(
pair
.
first
.
where
(
RealmMessage
.
class
)
.
equalTo
(
RealmMessage
.
ROOM_ID
,
room
.
getId
())
.
greaterThanOrEqualTo
(
RealmMessage
.
TIMESTAMP
,
room
.
getLastSeen
())
.
notEqualTo
(
RealmMessage
.
USER_ID
,
user
.
getId
())
.
findAll
()
.
asObservable
()),
pair
->
close
(
pair
.
first
,
pair
.
second
)
)
.
unsubscribeOn
(
AndroidSchedulers
.
from
(
Looper
.
myLooper
()))
.
map
(
RealmResults:
:
size
)
.
firstElement
()
.
toSingle
());
}
private
List
<
Message
>
toList
(
RealmResults
<
RealmMessage
>
realmMessages
)
{
...
...
persistence-realm/src/main/java/chat/rocket/persistence/realm/repositories/RealmRepository.java
View file @
3de8d825
...
...
@@ -7,6 +7,9 @@ import io.realm.Realm;
public
class
RealmRepository
{
protected
void
close
(
Realm
realm
,
Looper
looper
)
{
if
(
realm
==
null
||
looper
==
null
)
{
return
;
}
new
Handler
(
looper
).
post
(
realm:
:
close
);
}
}
persistence-realm/src/main/java/chat/rocket/persistence/realm/repositories/RealmRoomRepository.java
View file @
3de8d825
package
chat
.
rocket
.
persistence
.
realm
.
repositories
;
import
android.os.Looper
;
import
android.support.v4.util.Pair
;
import
io.reactivex.Flowable
;
import
io.reactivex.Single
;
import
io.reactivex.android.schedulers.AndroidSchedulers
;
import
io.realm.Realm
;
import
io.realm.RealmResults
;
...
...
@@ -12,9 +16,7 @@ import chat.rocket.core.repositories.RoomRepository;
import
chat.rocket.persistence.realm.RealmStore
;
import
chat.rocket.persistence.realm.models.ddp.RealmRoom
;
import
chat.rocket.persistence.realm.models.internal.LoadMessageProcedure
;
import
rx.Observable
;
import
rx.Single
;
import
rx.android.schedulers.AndroidSchedulers
;
import
hu.akarnokd.rxjava.interop.RxJavaInterop
;
public
class
RealmRoomRepository
extends
RealmRepository
implements
RoomRepository
{
...
...
@@ -25,68 +27,53 @@ public class RealmRoomRepository extends RealmRepository implements RoomReposito
}
@Override
public
Observable
<
List
<
Room
>>
getAll
()
{
return
Observable
.
defer
(()
->
{
final
Realm
realm
=
RealmStore
.
getRealm
(
hostname
);
final
Looper
looper
=
Looper
.
myLooper
();
if
(
realm
==
null
||
looper
==
null
)
{
return
Observable
.
just
(
null
);
}
return
realm
.
where
(
RealmRoom
.
class
)
.
findAll
()
.
asObservable
()
.
unsubscribeOn
(
AndroidSchedulers
.
from
(
looper
))
.
doOnUnsubscribe
(()
->
close
(
realm
,
looper
))
.
filter
(
roomSubscriptions
->
roomSubscriptions
!=
null
&&
roomSubscriptions
.
isLoaded
()
&&
roomSubscriptions
.
isValid
())
.
map
(
this
::
toList
);
});
public
Flowable
<
List
<
Room
>>
getAll
()
{
return
Flowable
.
defer
(()
->
Flowable
.
using
(
()
->
new
Pair
<>(
RealmStore
.
getRealm
(
hostname
),
Looper
.
myLooper
()),
pair
->
RxJavaInterop
.
toV2Flowable
(
pair
.
first
.
where
(
RealmRoom
.
class
)
.
findAll
()
.
asObservable
()),
pair
->
close
(
pair
.
first
,
pair
.
second
)
)
.
unsubscribeOn
(
AndroidSchedulers
.
from
(
Looper
.
myLooper
()))
.
filter
(
roomSubscriptions
->
roomSubscriptions
!=
null
&&
roomSubscriptions
.
isLoaded
()
&&
roomSubscriptions
.
isValid
())
.
map
(
this
::
toList
));
}
@Override
public
Observable
<
Room
>
getById
(
String
roomId
)
{
return
Observable
.
defer
(()
->
{
final
Realm
realm
=
RealmStore
.
getRealm
(
hostname
);
final
Looper
looper
=
Looper
.
myLooper
();
if
(
realm
==
null
||
looper
==
null
)
{
return
Observable
.
just
(
null
);
}
return
realm
.
where
(
RealmRoom
.
class
)
.
equalTo
(
RealmRoom
.
ROOM_ID
,
roomId
)
.
findFirst
()
.<
RealmRoom
>
asObservable
()
.
unsubscribeOn
(
AndroidSchedulers
.
from
(
looper
))
.
doOnUnsubscribe
(()
->
close
(
realm
,
looper
))
.
filter
(
roomSubscription
->
roomSubscription
!=
null
&&
roomSubscription
.
isLoaded
()
&&
roomSubscription
.
isValid
())
.
map
(
RealmRoom:
:
asRoom
);
});
public
Flowable
<
Room
>
getById
(
String
roomId
)
{
return
Flowable
.
defer
(()
->
Flowable
.
using
(
()
->
new
Pair
<>(
RealmStore
.
getRealm
(
hostname
),
Looper
.
myLooper
()),
pair
->
RxJavaInterop
.
toV2Flowable
(
pair
.
first
.
where
(
RealmRoom
.
class
)
.
equalTo
(
RealmRoom
.
ROOM_ID
,
roomId
)
.
findFirst
()
.<
RealmRoom
>
asObservable
()
.
filter
(
roomSubscription
->
roomSubscription
!=
null
&&
roomSubscription
.
isLoaded
()
&&
roomSubscription
.
isValid
())),
pair
->
close
(
pair
.
first
,
pair
.
second
)
)
.
unsubscribeOn
(
AndroidSchedulers
.
from
(
Looper
.
myLooper
()))
.
map
(
RealmRoom:
:
asRoom
));
}
@Override
public
Observable
<
RoomHistoryState
>
getHistoryStateByRoomId
(
String
roomId
)
{
return
Observable
.
defer
(()
->
{
final
Realm
realm
=
RealmStore
.
getRealm
(
hostname
);
final
Looper
looper
=
Looper
.
myLooper
();
if
(
realm
==
null
||
looper
==
null
)
{
return
Observable
.
just
(
null
);
}
return
realm
.
where
(
LoadMessageProcedure
.
class
)
.
equalTo
(
LoadMessageProcedure
.
ID
,
roomId
)
.
findFirst
()
.<
LoadMessageProcedure
>
asObservable
()
.
unsubscribeOn
(
AndroidSchedulers
.
from
(
looper
))
.
doOnUnsubscribe
(()
->
close
(
realm
,
looper
))
.
filter
(
loadMessageProcedure
->
loadMessageProcedure
!=
null
&&
loadMessageProcedure
.
isLoaded
()
&&
loadMessageProcedure
.
isValid
())
.
map
(
LoadMessageProcedure:
:
asRoomHistoryState
);
});
public
Flowable
<
RoomHistoryState
>
getHistoryStateByRoomId
(
String
roomId
)
{
return
Flowable
.
defer
(()
->
Flowable
.
using
(
()
->
new
Pair
<>(
RealmStore
.
getRealm
(
hostname
),
Looper
.
myLooper
()),
pair
->
RxJavaInterop
.
toV2Flowable
(
pair
.
first
.
where
(
LoadMessageProcedure
.
class
)
.
equalTo
(
LoadMessageProcedure
.
ID
,
roomId
)
.
findFirst
()
.<
LoadMessageProcedure
>
asObservable
()
.
filter
(
loadMessageProcedure
->
loadMessageProcedure
!=
null
&&
loadMessageProcedure
.
isLoaded
()
&&
loadMessageProcedure
.
isValid
())),
pair
->
close
(
pair
.
first
,
pair
.
second
)
)
.
unsubscribeOn
(
AndroidSchedulers
.
from
(
Looper
.
myLooper
()))
.
map
(
LoadMessageProcedure:
:
asRoomHistoryState
));
}
@Override
...
...
@@ -109,14 +96,14 @@ public class RealmRoomRepository extends RealmRepository implements RoomReposito
realm
.
beginTransaction
();
return
realm
.
copyToRealmOrUpdate
(
loadMessage
)
.
asObservable
()
.
unsubscribeOn
(
AndroidSchedulers
.
from
(
looper
))
.
doOnUnsubscribe
(()
->
close
(
realm
,
looper
))
return
RxJavaInterop
.
toV2Flowable
(
realm
.
copyToRealmOrUpdate
(
loadMessage
)
.
asObservable
())
.
filter
(
realmObject
->
realmObject
!=
null
&&
realmObject
.
isLoaded
()
&&
realmObject
.
isValid
())
.
first
()
.
doOnNext
(
realmObject
->
realm
.
commitTransaction
())
.
firstElement
()
.
doOnSuccess
(
it
->
realm
.
commitTransaction
())
.
doOnError
(
throwable
->
realm
.
cancelTransaction
())
.
doOnEvent
((
realmObject
,
throwable
)
->
close
(
realm
,
looper
))
.
toSingle
()
.
map
(
realmObject
->
true
);
});
...
...
persistence-realm/src/main/java/chat/rocket/persistence/realm/repositories/RealmSessionRepository.java
View file @
3de8d825
package
chat
.
rocket
.
persistence
.
realm
.
repositories
;
import
android.os.Looper
;
import
android.support.v4.util.Pair
;
import
com.fernandocejas.arrow.optional.Optional
;
import
io.reactivex.Flowable
;
import
io.reactivex.Single
;
import
io.reactivex.android.schedulers.AndroidSchedulers
;
import
io.realm.Realm
;
import
chat.rocket.core.models.Session
;
import
chat.rocket.core.repositories.SessionRepository
;
import
chat.rocket.persistence.realm.RealmStore
;
import
chat.rocket.persistence.realm.models.internal.RealmSession
;
import
rx.Observable
;
import
rx.Single
;
import
rx.android.schedulers.AndroidSchedulers
;
import
hu.akarnokd.rxjava.interop.RxJavaInterop
;
public
class
RealmSessionRepository
extends
RealmRepository
implements
SessionRepository
{
...
...
@@ -20,29 +23,24 @@ public class RealmSessionRepository extends RealmRepository implements SessionRe
}
@Override
public
Observable
<
Session
>
getById
(
int
id
)
{
return
Observable
.
defer
(()
->
{
final
Realm
realm
=
RealmStore
.
getRealm
(
hostname
);
final
Looper
looper
=
Looper
.
myLooper
();
if
(
realm
==
null
||
looper
==
null
)
{
return
Observable
.
just
(
null
);
}
return
realm
.
where
(
RealmSession
.
class
)
.
equalTo
(
RealmSession
.
ID
,
id
)
.
findAll
()
.<
RealmSession
>
asObservable
()
.
unsubscribeOn
(
AndroidSchedulers
.
from
(
looper
))
.
doOnUnsubscribe
(()
->
close
(
realm
,
looper
))
.
filter
(
it
->
it
!=
null
&&
it
.
isLoaded
()
&&
it
.
isValid
())
.
map
(
realmSessions
->
{
if
(
realmSessions
.
size
()
==
0
)
{
return
null
;
}
return
realmSessions
.
get
(
0
).
asSession
();
});
});
public
Flowable
<
Optional
<
Session
>>
getById
(
int
id
)
{
return
Flowable
.
defer
(()
->
Flowable
.
using
(
()
->
new
Pair
<>(
RealmStore
.
getRealm
(
hostname
),
Looper
.
myLooper
()),
pair
->
RxJavaInterop
.
toV2Flowable
(
pair
.
first
.
where
(
RealmSession
.
class
)
.
equalTo
(
RealmSession
.
ID
,
id
)
.
findAll
()
.<
RealmSession
>
asObservable
()),
pair
->
close
(
pair
.
first
,
pair
.
second
)
)
.
unsubscribeOn
(
AndroidSchedulers
.
from
(
Looper
.
myLooper
()))
.
filter
(
it
->
it
!=
null
&&
it
.
isLoaded
()
&&
it
.
isValid
())
.
map
(
realmSessions
->
{
if
(
realmSessions
.
size
()
==
0
)
{
return
Optional
.
absent
();
}
return
Optional
.
of
(
realmSessions
.
get
(
0
).
asSession
());
}));
}
@Override
...
...
@@ -52,7 +50,7 @@ public class RealmSessionRepository extends RealmRepository implements SessionRe
final
Looper
looper
=
Looper
.
myLooper
();
if
(
realm
==
null
||
looper
==
null
)
{
return
Single
.
just
(
null
);
return
Single
.
just
(
false
);
}
RealmSession
realmSession
=
realm
.
where
(
RealmSession
.
class
)
...
...
@@ -72,13 +70,13 @@ public class RealmSessionRepository extends RealmRepository implements SessionRe
realm
.
beginTransaction
();
return
realm
.
copyToRealmOrUpdate
(
realmSession
)
.
asObservable
()
.
unsubscribeOn
(
AndroidSchedulers
.
from
(
looper
))
.
doOnUnsubscribe
(()
->
close
(
realm
,
looper
))
return
RxJavaInterop
.
toV2Flowable
(
realm
.
copyToRealmOrUpdate
(
realmSession
)
.
asObservable
())
.
filter
(
it
->
it
!=
null
&&
it
.
isLoaded
()
&&
it
.
isValid
())
.
first
()
.
doOnNext
(
it
->
realm
.
commitTransaction
())
.
firstElement
()
.
doOnSuccess
(
it
->
realm
.
commitTransaction
())
.
doOnError
(
throwable
->
realm
.
cancelTransaction
())
.
doOnEvent
((
realmObject
,
throwable
)
->
close
(
realm
,
looper
))
.
toSingle
()
.
map
(
realmObject
->
true
);
});
...
...
persistence-realm/src/main/java/chat/rocket/persistence/realm/repositories/RealmUserRepository.java
View file @
3de8d825
package
chat
.
rocket
.
persistence
.
realm
.
repositories
;
import
android.os.Looper
;
import
io.realm.Realm
;
import
android.support.v4.util.Pair
;
import
com.fernandocejas.arrow.optional.Optional
;
import
io.reactivex.Flowable
;
import
io.reactivex.android.schedulers.AndroidSchedulers
;
import
io.realm.RealmResults
;
import
chat.rocket.core.models.User
;
import
chat.rocket.core.repositories.UserRepository
;
import
chat.rocket.persistence.realm.RealmStore
;
import
chat.rocket.persistence.realm.models.ddp.RealmUser
;
import
rx.Observable
;
import
rx.android.schedulers.AndroidSchedulers
;
import
hu.akarnokd.rxjava.interop.RxJavaInterop
;
public
class
RealmUserRepository
extends
RealmRepository
implements
UserRepository
{
...
...
@@ -19,30 +22,25 @@ public class RealmUserRepository extends RealmRepository implements UserReposito
}
@Override
public
Observable
<
User
>
getCurrent
()
{
return
Observable
.
defer
(()
->
{
final
Realm
realm
=
RealmStore
.
getRealm
(
hostname
);
final
Looper
looper
=
Looper
.
myLooper
();
if
(
realm
==
null
||
looper
==
null
)
{
return
Observable
.
just
(
null
);
}
final
RealmUser
realmUser
=
realm
.
where
(
RealmUser
.
class
)
.
isNotEmpty
(
RealmUser
.
EMAILS
)
.
findFirst
();
if
(
realmUser
==
null
)
{
realm
.
close
();
return
Observable
.
just
(
null
);
}
return
realmUser
.<
RealmUser
>
asObservable
()
.
unsubscribeOn
(
AndroidSchedulers
.
from
(
looper
))
.
doOnUnsubscribe
(()
->
close
(
realm
,
looper
))
.
filter
(
it
->
it
!=
null
&&
it
.
isLoaded
()
&&
it
.
isValid
())
.
map
(
RealmUser:
:
asUser
);
});
public
Flowable
<
Optional
<
User
>>
getCurrent
()
{
return
Flowable
.
defer
(()
->
Flowable
.
using
(
()
->
new
Pair
<>(
RealmStore
.
getRealm
(
hostname
),
Looper
.
myLooper
()),
pair
->
RxJavaInterop
.
toV2Flowable
(
pair
.
first
.
where
(
RealmUser
.
class
)
.
isNotEmpty
(
RealmUser
.
EMAILS
)
.
findAll
()
.<
RealmResults
<
RealmUser
>>
asObservable
()),
pair
->
close
(
pair
.
first
,
pair
.
second
)
)
.
unsubscribeOn
(
AndroidSchedulers
.
from
(
Looper
.
myLooper
()))
.
filter
(
it
->
it
!=
null
&&
it
.
isLoaded
()
&&
it
.
isValid
())
.
map
(
realmUsers
->
{
if
(
realmUsers
.
size
()
>
0
)
{
return
Optional
.
of
(
realmUsers
.
get
(
0
).
asUser
());
}
return
Optional
.<
User
>
absent
();
}));
}
}
rocket-chat-android-widgets/build.gradle
View file @
3de8d825
...
...
@@ -5,17 +5,17 @@ buildscript {
jcenter
()
}
dependencies
{
classpath
rootProject
.
ext
.
androidPlugin
classpath
'com.android.tools.build:gradle:2.2.3'
}
}
android
{
compileSdkVersion
rootProject
.
ext
.
compileSdkVersion
buildToolsVersion
rootProject
.
ext
.
buildToolsVersion
compileSdkVersion
25
buildToolsVersion
'25.0.2'
defaultConfig
{
minSdkVersion
rootProject
.
ext
.
minSdkVersion
targetSdkVersion
rootProject
.
ext
.
compileSdkVersion
minSdkVersion
16
targetSdkVersion
25
versionCode
1
versionName
"1"
...
...
@@ -29,27 +29,36 @@ android {
}
}
dependencies
{
testCompile
'junit:junit:4.12'
compile
rootProject
.
ext
.
supportAnnotations
compile
rootProject
.
ext
.
supportAppCompat
compile
rootProject
.
ext
.
supportV13
compile
rootProject
.
ext
.
supportDesign
ext
{
supportVersion
=
'25.1.1'
frescoVersion
=
'1.1.0'
}
dependencies
{
compile
project
(
':rocket-chat-core'
)
compile
'org.nibor.autolink:autolink:0.5.0'
compile
"com.android.support:support-annotations:$supportVersion"
compile
"com.android.support:appcompat-v7:$supportVersion"
compile
"com.android.support:support-v13:$supportVersion"
compile
"com.android.support:design:$supportVersion"
compile
'org.nibor.autolink:autolink:0.6.0'
compile
rootProject
.
ext
.
textDrawable
compile
rootProject
.
ext
.
okhttp3
compile
rootProject
.
ext
.
boltsTask
compile
'com.amulyakhare:com.amulyakhare.textdrawable:1.0.1'
compile
'com.squareup.okhttp3:okhttp:3.6.0'
compile
'com.parse.bolts:bolts-tasks:1.4.0'
compile
'com.github.yusukeiwaki.android-widget:widget-fontawesome:0.0.1'
compile
rootProject
.
ext
.
frescoBase
compile
rootProject
.
ext
.
frescoAnimatedGif
compile
rootProject
.
ext
.
frescoAnimatedWebp
compile
rootProject
.
ext
.
frescoWebp
compile
rootProject
.
ext
.
frescoImagePipelineOkHttp3
compile
"com.facebook.fresco:fresco:$frescoVersion"
compile
"com.facebook.fresco:animated-gif:$frescoVersion"
compile
"com.facebook.fresco:animated-webp:$frescoVersion"
compile
"com.facebook.fresco:webpsupport:$frescoVersion"
compile
"com.facebook.fresco:imagepipeline-okhttp3:$frescoVersion"
compile
'com.caverock:androidsvg:1.2.1'
testCompile
'junit:junit:4.12'
}
rocket-chat-core/build.gradle
View file @
3de8d825
...
...
@@ -11,7 +11,9 @@ dependencies {
compile
'com.google.code.findbugs:jsr305:3.0.1'
compile
'io.reactivex:rxjava:1.2.3'
compile
'io.reactivex.rxjava2:rxjava:2.0.6'
compile
'com.fernandocejas:arrow:1.0.0'
compile
'com.google.auto.value:auto-value:1.3'
apt
'com.google.auto.value:auto-value:1.3'
...
...
rocket-chat-core/src/main/java/chat/rocket/core/interactors/CanCreateRoomInteractor.java
View file @
3de8d825
package
chat
.
rocket
.
core
.
interactors
;
import
io.reactivex.Flowable
;
import
io.reactivex.Single
;
import
chat.rocket.core.repositories.UserRepository
;
import
rx.Observable
;
import
rx.Single
;
public
class
CanCreateRoomInteractor
{
...
...
@@ -16,13 +17,12 @@ public class CanCreateRoomInteractor {
}
public
Single
<
Boolean
>
canCreate
(
String
roomId
)
{
return
Observ
able
.
zip
(
return
Flow
able
.
zip
(
userRepository
.
getCurrent
(),
sessionInteractor
.
getDefault
(),
Observ
able
.
just
(
roomId
),
Flow
able
.
just
(
roomId
),
(
user
,
session
,
room
)
->
user
!=
null
&&
session
!=
null
&&
room
!=
null
)
.
first
()
.
toSingle
();
.
first
(
false
);
}
}
rocket-chat-core/src/main/java/chat/rocket/core/interactors/MessageInteractor.java
View file @
3de8d825
package
chat
.
rocket
.
core
.
interactors
;
import
io.reactivex.Flowable
;
import
io.reactivex.Single
;
import
java.util.List
;
import
java.util.UUID
;
import
chat.rocket.core.SyncState
;
...
...
@@ -9,8 +12,6 @@ import chat.rocket.core.models.RoomHistoryState;
import
chat.rocket.core.models.User
;
import
chat.rocket.core.repositories.MessageRepository
;
import
chat.rocket.core.repositories.RoomRepository
;
import
rx.Observable
;
import
rx.Single
;
public
class
MessageInteractor
{
...
...
@@ -42,7 +43,7 @@ public class MessageInteractor {
return
!
roomHistoryState
.
isComplete
()
&&
(
syncState
==
SyncState
.
SYNCED
||
syncState
==
SyncState
.
FAILED
);
})
.
first
()
.
first
Element
()
.
toSingle
()
.
flatMap
(
roomHistoryState
->
roomRepository
.
setHistoryState
(
roomHistoryState
.
withSyncState
(
SyncState
.
NOT_SYNCED
)));
...
...
@@ -75,7 +76,7 @@ public class MessageInteractor {
return
messageRepository
.
unreadCountFor
(
room
,
user
);
}
public
Observ
able
<
List
<
Message
>>
getAllFrom
(
Room
room
)
{
public
Flow
able
<
List
<
Message
>>
getAllFrom
(
Room
room
)
{
return
messageRepository
.
getAllFrom
(
room
);
}
}
rocket-chat-core/src/main/java/chat/rocket/core/interactors/RoomInteractor.java
View file @
3de8d825
package
chat
.
rocket
.
core
.
interactors
;
import
io.reactivex.Flowable
;
import
java.util.List
;
import
chat.rocket.core.models.Room
;
import
chat.rocket.core.repositories.RoomRepository
;
import
rx.Observable
;
public
class
RoomInteractor
{
...
...
@@ -13,26 +14,29 @@ public class RoomInteractor {
this
.
roomRepository
=
roomRepository
;
}
public
Observ
able
<
Integer
>
getTotalUnreadMentionsCount
()
{
public
Flow
able
<
Integer
>
getTotalUnreadMentionsCount
()
{
return
roomRepository
.
getAll
()
.
flatMap
(
rooms
->
Observable
.
from
(
rooms
)
.
flatMap
(
rooms
->
Flowable
.
fromIterable
(
rooms
)
.
filter
(
room
->
room
.
isOpen
()
&&
room
.
isAlert
())
.
map
(
Room:
:
getUnread
)
.
defaultIfEmpty
(
0
)
.
reduce
((
unreadCount
,
unreadCount2
)
->
unreadCount
+
unreadCount2
));
.
reduce
((
unreadCount
,
unreadCount2
)
->
unreadCount
+
unreadCount2
)
.
toFlowable
());
}
public
Observable
<
Integer
>
getTotalUnreadRoomsCount
()
{
public
Flowable
<
Long
>
getTotalUnreadRoomsCount
()
{
return
roomRepository
.
getAll
()
.
flatMap
(
rooms
->
Observable
.
from
(
rooms
)
.
flatMap
(
rooms
->
Flowable
.
fromIterable
(
rooms
)
.
filter
(
room
->
room
.
isOpen
()
&&
room
.
isAlert
())
.
count
());
.
count
()
.
toFlowable
());
}
public
Observ
able
<
List
<
Room
>>
getOpenRooms
()
{
public
Flow
able
<
List
<
Room
>>
getOpenRooms
()
{
return
roomRepository
.
getAll
()
.
flatMap
(
rooms
->
Observable
.
from
(
rooms
)
.
flatMap
(
rooms
->
Flowable
.
fromIterable
(
rooms
)
.
filter
(
Room:
:
isOpen
)
.
toList
());
.
toList
()
.
toFlowable
());
}
}
rocket-chat-core/src/main/java/chat/rocket/core/interactors/SessionInteractor.java
View file @
3de8d825
package
chat
.
rocket
.
core
.
interactors
;
import
com.fernandocejas.arrow.optional.Optional
;
import
io.reactivex.Flowable
;
import
io.reactivex.Single
;
import
chat.rocket.core.models.Session
;
import
chat.rocket.core.repositories.SessionRepository
;
import
rx.Observable
;
import
rx.Single
;
public
class
SessionInteractor
{
...
...
@@ -15,20 +17,23 @@ public class SessionInteractor {
this
.
sessionRepository
=
sessionRepository
;
}
public
Observable
<
Session
>
getDefault
()
{
public
Flowable
<
Optional
<
Session
>
>
getDefault
()
{
return
sessionRepository
.
getById
(
DEFAULT_ID
);
}
public
Observ
able
<
Session
.
State
>
getSessionState
()
{
public
Flow
able
<
Session
.
State
>
getSessionState
()
{
return
getDefault
()
.
map
(
this
::
getStateFrom
);
.
map
(
sessionOptional
->
getStateFrom
(
sessionOptional
.
orNull
())
);
}
public
Single
<
Boolean
>
retryLogin
()
{
return
getDefault
()
.
filter
(
Optional:
:
isPresent
)
.
map
(
Optional:
:
get
)
.
filter
(
session
->
session
.
getToken
()
!=
null
&&
(!
session
.
isTokenVerified
()
||
session
.
getError
()
!=
null
))
.
map
(
session
->
session
.
withTokenVerified
(
false
).
withError
(
null
))
.
firstElement
()
.
toSingle
()
.
flatMap
(
sessionRepository:
:
save
);
}
...
...
rocket-chat-core/src/main/java/chat/rocket/core/repositories/MessageRepository.java
View file @
3de8d825
package
chat
.
rocket
.
core
.
repositories
;
import
com.fernandocejas.arrow.optional.Optional
;
import
io.reactivex.Flowable
;
import
io.reactivex.Single
;
import
java.util.List
;
import
chat.rocket.core.models.Message
;
import
chat.rocket.core.models.Room
;
import
chat.rocket.core.models.User
;
import
rx.Observable
;
import
rx.Single
;
public
interface
MessageRepository
{
Single
<
Message
>
getById
(
String
messageId
);
Single
<
Optional
<
Message
>
>
getById
(
String
messageId
);
Single
<
Boolean
>
save
(
Message
message
);
Single
<
Boolean
>
delete
(
Message
message
);
Observ
able
<
List
<
Message
>>
getAllFrom
(
Room
room
);
Flow
able
<
List
<
Message
>>
getAllFrom
(
Room
room
);
Single
<
Integer
>
unreadCountFor
(
Room
room
,
User
user
);
}
rocket-chat-core/src/main/java/chat/rocket/core/repositories/RoomRepository.java
View file @
3de8d825
package
chat
.
rocket
.
core
.
repositories
;
import
io.reactivex.Flowable
;
import
io.reactivex.Single
;
import
java.util.List
;
import
chat.rocket.core.models.Room
;
import
chat.rocket.core.models.RoomHistoryState
;
import
rx.Observable
;
import
rx.Single
;
public
interface
RoomRepository
{
Observ
able
<
List
<
Room
>>
getAll
();
Flow
able
<
List
<
Room
>>
getAll
();
Observ
able
<
Room
>
getById
(
String
roomId
);
Flow
able
<
Room
>
getById
(
String
roomId
);
Observ
able
<
RoomHistoryState
>
getHistoryStateByRoomId
(
String
roomId
);
Flow
able
<
RoomHistoryState
>
getHistoryStateByRoomId
(
String
roomId
);
Single
<
Boolean
>
setHistoryState
(
RoomHistoryState
roomHistoryState
);
}
rocket-chat-core/src/main/java/chat/rocket/core/repositories/SessionRepository.java
View file @
3de8d825
package
chat
.
rocket
.
core
.
repositories
;
import
com.fernandocejas.arrow.optional.Optional
;
import
io.reactivex.Flowable
;
import
io.reactivex.Single
;
import
chat.rocket.core.models.Session
;
import
rx.Observable
;
import
rx.Single
;
public
interface
SessionRepository
{
Observable
<
Session
>
getById
(
int
id
);
Flowable
<
Optional
<
Session
>
>
getById
(
int
id
);
Single
<
Boolean
>
save
(
Session
session
);
}
rocket-chat-core/src/main/java/chat/rocket/core/repositories/UserRepository.java
View file @
3de8d825
package
chat
.
rocket
.
core
.
repositories
;
import
com.fernandocejas.arrow.optional.Optional
;
import
io.reactivex.Flowable
;
import
chat.rocket.core.models.User
;
import
rx.Observable
;
public
interface
UserRepository
{
Observable
<
User
>
getCurrent
();
Flowable
<
Optional
<
User
>
>
getCurrent
();
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment