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
8d4e96c6
Unverified
Commit
8d4e96c6
authored
Dec 15, 2017
by
Leonardo Aramaki
Committed by
GitHub
Dec 15, 2017
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'develop' into patch-2
parents
106791db
a2603630
Changes
71
Expand all
Show whitespace changes
Inline
Side-by-side
Showing
71 changed files
with
4218 additions
and
2866 deletions
+4218
-2866
build.gradle
android-ddp/build.gradle
+6
-5
DDPClient.java
...-ddp/src/main/java/chat/rocket/android_ddp/DDPClient.java
+5
-1
DDPClientImpl.java
.../src/main/java/chat/rocket/android_ddp/DDPClientImpl.java
+426
-399
build.gradle
app/build.gradle
+39
-34
OkHttpHelper.kt
...src/debug/java/chat/rocket/android/helper/OkHttpHelper.kt
+4
-5
AndroidManifest.xml
app/src/main/AndroidManifest.xml
+31
-26
ConnectionStatusManager.kt
.../main/java/chat/rocket/android/ConnectionStatusManager.kt
+90
-0
RocketChatApplication.java
.../main/java/chat/rocket/android/RocketChatApplication.java
+5
-2
RocketChatCache.java
app/src/main/java/chat/rocket/android/RocketChatCache.java
+0
-298
RocketChatCache.kt
app/src/main/java/chat/rocket/android/RocketChatCache.kt
+407
-0
RocketChatJobCreator.kt
...src/main/java/chat/rocket/android/RocketChatJobCreator.kt
+14
-0
AbstractAuthedActivity.java
.../chat/rocket/android/activity/AbstractAuthedActivity.java
+189
-190
LoginActivity.java
...main/java/chat/rocket/android/activity/LoginActivity.java
+74
-66
LoginPresenter.java
...ain/java/chat/rocket/android/activity/LoginPresenter.java
+1
-1
MainActivity.java
.../main/java/chat/rocket/android/activity/MainActivity.java
+87
-32
MainPresenter.java
...main/java/chat/rocket/android/activity/MainPresenter.java
+21
-17
MethodCallHelper.java
...c/main/java/chat/rocket/android/api/MethodCallHelper.java
+585
-536
DefaultCookieProvider.java
...a/chat/rocket/android/api/rest/DefaultCookieProvider.java
+27
-32
HelperExtensions.kt
...n/java/chat/rocket/android/extensions/HelperExtensions.kt
+9
-0
InputHostnameFragment.java
...et/android/fragment/add_server/InputHostnameFragment.java
+2
-3
InputHostnamePresenter.java
...t/android/fragment/add_server/InputHostnamePresenter.java
+3
-5
AbstractChatRoomFragment.java
...t/android/fragment/chatroom/AbstractChatRoomFragment.java
+1
-1
HomeFragment.java
...a/chat/rocket/android/fragment/chatroom/HomeFragment.java
+0
-18
HomeFragment.kt
...ava/chat/rocket/android/fragment/chatroom/HomeFragment.kt
+14
-0
RoomContract.java
...a/chat/rocket/android/fragment/chatroom/RoomContract.java
+0
-79
RoomContract.kt
...ava/chat/rocket/android/fragment/chatroom/RoomContract.kt
+76
-0
RoomFragment.java
...a/chat/rocket/android/fragment/chatroom/RoomFragment.java
+24
-23
RoomPresenter.java
.../chat/rocket/android/fragment/chatroom/RoomPresenter.java
+391
-362
MessageOptionsDialogFragment.java
...ragment/chatroom/dialog/MessageOptionsDialogFragment.java
+114
-116
OAuthPresenter.java
...va/chat/rocket/android/fragment/oauth/OAuthPresenter.java
+1
-1
AbstractServerConfigFragment.java
.../fragment/server_config/AbstractServerConfigFragment.java
+1
-1
LoginContract.java
.../rocket/android/fragment/server_config/LoginContract.java
+14
-10
LoginFragment.java
.../rocket/android/fragment/server_config/LoginFragment.java
+0
-143
LoginFragment.kt
...at/rocket/android/fragment/server_config/LoginFragment.kt
+133
-0
LoginPresenter.java
...rocket/android/fragment/server_config/LoginPresenter.java
+0
-98
LoginPresenter.kt
...t/rocket/android/fragment/server_config/LoginPresenter.kt
+114
-0
RetryLoginPresenter.java
...t/android/fragment/server_config/RetryLoginPresenter.java
+1
-1
SidebarMainFragment.java
.../rocket/android/fragment/sidebar/SidebarMainFragment.java
+1
-4
SidebarMainPresenter.java
...rocket/android/fragment/sidebar/SidebarMainPresenter.java
+11
-14
AddChannelDialogFragment.java
...oid/fragment/sidebar/dialog/AddChannelDialogFragment.java
+1
-1
AddDirectMessageDialogFragment.java
...agment/sidebar/dialog/AddDirectMessageDialogFragment.java
+2
-2
Logger.java
app/src/main/java/chat/rocket/android/helper/Logger.java
+0
-12
Logger.kt
app/src/main/java/chat/rocket/android/helper/Logger.kt
+16
-0
MessagePopup.java
...at/rocket/android/layouthelper/chatroom/MessagePopup.java
+3
-5
RoomListItemViewHolder.java
...ayouthelper/chatroom/roomlist/RoomListItemViewHolder.java
+1
-1
PushManager.kt
app/src/main/java/chat/rocket/android/push/PushManager.kt
+10
-6
ConnectivityManagerApi.java
...a/chat/rocket/android/service/ConnectivityManagerApi.java
+4
-0
KeepAliveJob.kt
...src/main/java/chat/rocket/android/service/KeepAliveJob.kt
+53
-0
RealmBasedConnectivityManager.java
...rocket/android/service/RealmBasedConnectivityManager.java
+17
-6
RocketChatService.java
...n/java/chat/rocket/android/service/RocketChatService.java
+8
-6
RocketChatWebSocketThread.java
...hat/rocket/android/service/RocketChatWebSocketThread.java
+27
-21
ServerConnectivity.java
.../java/chat/rocket/android/service/ServerConnectivity.java
+45
-45
AbstractRocketChatCacheObserver.java
...oid/service/internal/AbstractRocketChatCacheObserver.java
+2
-6
StreamRoomMessageManager.java
...et/android/service/internal/StreamRoomMessageManager.java
+47
-49
GcmPushRegistrationObserver.java
...android/service/observer/GcmPushRegistrationObserver.java
+1
-1
SessionObserver.java
...chat/rocket/android/service/observer/SessionObserver.java
+4
-1
rotation.xml
app/src/main/res/anim/rotation.xml
+9
-0
community.xml
app/src/main/res/drawable/community.xml
+782
-0
ic_loading.xml
app/src/main/res/drawable/ic_loading.xml
+20
-0
ic_loading_animated.xml
app/src/main/res/drawable/ic_loading_animated.xml
+10
-0
crouton_status_ticker.xml
app/src/main/res/layout/crouton_status_ticker.xml
+36
-0
fragment_login.xml
app/src/main/res/layout/fragment_login.xml
+132
-132
colors.xml
app/src/main/res/values/colors.xml
+1
-0
strings.xml
app/src/main/res/values/strings.xml
+1
-1
styles.xml
app/src/main/res/values/styles.xml
+0
-2
OkHttpHelper.kt
...c/release/java/chat/rocket/android/helper/OkHttpHelper.kt
+2
-2
build.gradle
build.gradle
+2
-2
dependencies.gradle
dependencies.gradle
+20
-3
build.gradle
persistence-realm/build.gradle
+14
-13
build.gradle
rocket-chat-android-widgets/build.gradle
+21
-21
build.gradle
rocket-chat-core/build.gradle
+6
-5
No files found.
android-ddp/build.gradle
View file @
8d4e96c6
...
...
@@ -21,9 +21,10 @@ android {
}
}
dependencies
{
compile
project
(
':log-wrapper'
)
compile
extraDependencies
.
okHTTP
compile
extraDependencies
.
rxJava
compile
extraDependencies
.
boltTask
compile
supportDependencies
.
annotation
api
project
(
':log-wrapper'
)
implementation
extraDependencies
.
okHTTP
implementation
extraDependencies
.
rxJava
implementation
extraDependencies
.
rxKotlin
implementation
extraDependencies
.
boltTask
implementation
supportDependencies
.
annotation
}
\ No newline at end of file
android-ddp/src/main/java/chat/rocket/android_ddp/DDPClient.java
View file @
8d4e96c6
...
...
@@ -84,7 +84,11 @@ public class DDPClient {
}
public
void
close
()
{
impl
.
close
(
REASON_CLOSED_BY_USER
,
"closed by DDPClient#close()"
);
close
(
REASON_CLOSED_BY_USER
);
}
public
void
close
(
int
reason
)
{
impl
.
close
(
reason
,
"closed by DDPClient#close()"
);
}
/**
...
...
android-ddp/src/main/java/chat/rocket/android_ddp/DDPClientImpl.java
View file @
8d4e96c6
...
...
@@ -28,7 +28,7 @@ public class DDPClientImpl {
private
CompositeDisposable
disposables
;
private
String
currentSession
;
public
DDPClientImpl
(
DDPClient
self
,
OkHttpClient
client
)
{
/* package */
DDPClientImpl
(
DDPClient
self
,
OkHttpClient
client
)
{
websocket
=
new
RxWebSocket
(
client
);
this
.
client
=
self
;
}
...
...
@@ -65,8 +65,8 @@ public class DDPClientImpl {
sendMessage
(
"connect"
,
json
->
(
TextUtils
.
isEmpty
(
session
)
?
json
:
json
.
put
(
"session"
,
DDPClientImpl
.
this
.
currentSession
))
.
put
(
"version"
,
"pre2
"
)
.
put
(
"support"
,
new
JSONArray
(
).
put
(
"pre2"
).
put
(
"pre1"
)),
"version"
,
"1
"
)
.
put
(
"support"
,
new
JSONArray
().
put
(
"1"
).
put
(
"pre2"
).
put
(
"pre1"
)),
task
),
RCLog:
:
e
)
...
...
@@ -95,7 +95,13 @@ public class DDPClientImpl {
disposables
.
clear
();
}
},
err
->
task
.
trySetError
(
new
DDPClientCallback
.
Connect
.
Timeout
(
client
))
err
->
{
if
(
err
instanceof
TimeoutException
)
{
task
.
trySetError
(
new
Exception
(
"Your connection seems off…"
));
}
else
{
task
.
trySetError
(
new
Exception
(
"Ooops. Something's up!"
));
}
}
)
);
...
...
@@ -107,7 +113,7 @@ public class DDPClientImpl {
}
}
public
Maybe
<
DDPClientCallback
.
Base
>
ping
(
@Nullable
final
String
id
)
{
/* package */
Maybe
<
DDPClientCallback
.
Base
>
ping
(
@Nullable
final
String
id
)
{
final
boolean
requested
=
(
TextUtils
.
isEmpty
(
id
))
?
sendMessage
(
"ping"
,
null
)
:
...
...
@@ -145,7 +151,7 @@ public class DDPClientImpl {
}
}
public
void
ping
(
final
TaskCompletionSource
<
DDPClientCallback
.
Ping
>
task
,
/* package */
void
ping
(
final
TaskCompletionSource
<
DDPClientCallback
.
Ping
>
task
,
@Nullable
final
String
id
)
{
final
boolean
requested
=
(
TextUtils
.
isEmpty
(
id
))
?
...
...
@@ -175,7 +181,13 @@ public class DDPClientImpl {
disposables
.
clear
();
}
},
err
->
task
.
trySetError
(
new
DDPClientCallback
.
Ping
.
Timeout
(
client
))
err
->
{
if
(
err
instanceof
TimeoutException
)
{
task
.
trySetError
(
new
Exception
(
"Your connection seems off…"
));
}
else
{
task
.
trySetError
(
new
Exception
(
"Ooops. Something's up!"
));
}
}
)
);
...
...
@@ -185,7 +197,9 @@ public class DDPClientImpl {
}
}
public
void
sub
(
final
TaskCompletionSource
<
DDPSubscription
.
Ready
>
task
,
String
name
,
/* package */
void
sub
(
final
TaskCompletionSource
<
DDPSubscription
.
Ready
>
task
,
String
name
,
JSONArray
params
,
String
id
)
{
final
boolean
requested
=
sendMessage
(
"sub"
,
json
->
json
.
put
(
"id"
,
id
).
put
(
"name"
,
name
).
put
(
"params"
,
params
));
...
...
@@ -220,7 +234,13 @@ public class DDPClientImpl {
}
}
},
RCLog:
:
e
err
->
{
if
(
err
instanceof
TimeoutException
)
{
task
.
trySetError
(
new
Exception
(
"Your connection seems off…"
));
}
else
{
task
.
trySetError
(
new
Exception
(
"Ooops. Something's up!"
));
}
}
)
);
...
...
@@ -230,7 +250,7 @@ public class DDPClientImpl {
}
}
public
void
unsub
(
final
TaskCompletionSource
<
DDPSubscription
.
NoSub
>
task
,
/* package */
void
unsub
(
final
TaskCompletionSource
<
DDPSubscription
.
NoSub
>
task
,
@Nullable
final
String
id
)
{
final
boolean
requested
=
sendMessage
(
"unsub"
,
json
->
json
.
put
(
"id"
,
id
));
...
...
@@ -254,6 +274,11 @@ public class DDPClientImpl {
}
},
err
->
{
if
(
err
instanceof
TimeoutException
)
{
task
.
trySetError
(
new
Exception
(
"Your connection seems off…"
));
}
else
{
task
.
trySetError
(
new
Exception
(
"Ooops. Something's up!"
));
}
}
)
);
...
...
@@ -264,7 +289,7 @@ public class DDPClientImpl {
}
}
public
void
rpc
(
final
TaskCompletionSource
<
DDPClientCallback
.
RPC
>
task
,
String
method
,
/* package */
void
rpc
(
final
TaskCompletionSource
<
DDPClientCallback
.
RPC
>
task
,
String
method
,
JSONArray
params
,
String
id
,
long
timeoutMs
)
{
final
boolean
requested
=
sendMessage
(
"method"
,
...
...
@@ -297,7 +322,9 @@ public class DDPClientImpl {
},
err
->
{
if
(
err
instanceof
TimeoutException
)
{
task
.
trySetError
(
new
DDPClientCallback
.
RPC
.
Timeout
(
client
));
task
.
trySetError
(
new
Exception
(
"Your connection seems off…"
));
}
else
{
task
.
trySetError
(
new
Exception
(
"Ooops. Something's up!"
));
}
}
)
...
...
@@ -336,7 +363,7 @@ public class DDPClientImpl {
);
}
public
Flowable
<
DDPSubscription
.
Event
>
getDDPSubscription
()
{
/* package */
Flowable
<
DDPSubscription
.
Event
>
getDDPSubscription
()
{
String
[]
targetMsgs
=
{
"added"
,
"changed"
,
"removed"
,
"addedBefore"
,
"movedBefore"
};
return
flowable
.
filter
(
callback
->
callback
instanceof
RxWebSocketCallback
.
Message
)
.
map
(
callback
->
((
RxWebSocketCallback
.
Message
)
callback
).
responseBodyString
)
...
...
@@ -379,13 +406,13 @@ public class DDPClientImpl {
});
}
public
void
unsubscribeBaseListeners
()
{
/* package */
void
unsubscribeBaseListeners
()
{
if
(
disposables
.
size
()
>
0
||
!
disposables
.
isDisposed
())
{
disposables
.
clear
();
}
}
public
Task
<
RxWebSocketCallback
.
Close
>
getOnCloseCallback
()
{
/* package */
Task
<
RxWebSocketCallback
.
Close
>
getOnCloseCallback
()
{
TaskCompletionSource
<
RxWebSocketCallback
.
Close
>
task
=
new
TaskCompletionSource
<>();
flowable
.
filter
(
callback
->
callback
instanceof
RxWebSocketCallback
.
Close
)
...
...
app/build.gradle
View file @
8d4e96c6
...
...
@@ -21,8 +21,8 @@ android {
applicationId
"chat.rocket.android"
minSdkVersion
16
targetSdkVersion
rootProject
.
ext
.
targetSdkVersion
versionCode
5
6
versionName
"1.
0.33
"
versionCode
5
7
versionName
"1.
1.0
"
testInstrumentationRunner
"android.support.test.runner.AndroidJUnitRunner"
vectorDrawables
.
useSupportLibrary
=
true
multiDexEnabled
true
...
...
@@ -98,7 +98,6 @@ play {
track
=
"${track}"
}
ext
{
playLibVersion
=
'11.6.0'
stethoVersion
=
'1.5.0'
stethoOkhttp3Version
=
'1.5.0'
stethoRealmVersion
=
'2.2.2'
...
...
@@ -109,43 +108,49 @@ ext {
}
dependencies
{
compile
project
(
':android-ddp'
)
compile
project
(
':rocket-chat-android-widgets'
)
compile
project
(
':persistence-realm'
)
compile
extraDependencies
.
okHTTP
compile
extraDependencies
.
rxJava
compile
extraDependencies
.
boltTask
compile
supportDependencies
.
multidex
compile
supportDependencies
.
designSupportLibrary
compile
supportDependencies
.
annotation
compile
rxbindingDependencies
.
rxBinding
compile
rxbindingDependencies
.
rxBindingSupport
compile
rxbindingDependencies
.
rxBindingAppcompact
compile
"org.jetbrains.kotlin:kotlin-stdlib-jre7:$rootProject.ext.kotlinVersion"
compile
"com.google.firebase:firebase-core:$playLibVersion"
compile
"com.google.firebase:firebase-crash:$playLibVersion"
compile
"com.google.android.gms:play-services-gcm:$playLibVersion"
compile
"com.trello.rxlifecycle2:rxlifecycle:$rxlifecycleVersion"
compile
"com.trello.rxlifecycle2:rxlifecycle-android:$rxlifecycleVersion"
compile
"com.trello.rxlifecycle2:rxlifecycle-components:$rxlifecycleVersion"
compile
'nl.littlerobots.rxlint:rxlint:1.2'
compile
"frankiesardo:icepick:$icepickVersion"
api
project
(
':android-ddp'
)
api
project
(
':rocket-chat-android-widgets'
)
api
project
(
':persistence-realm'
)
implementation
extraDependencies
.
okHTTP
implementation
extraDependencies
.
rxJava
implementation
extraDependencies
.
rxKotlin
implementation
extraDependencies
.
boltTask
implementation
supportDependencies
.
multidex
implementation
supportDependencies
.
designSupportLibrary
implementation
supportDependencies
.
annotation
implementation
rxbindingDependencies
.
rxBinding
implementation
rxbindingDependencies
.
rxBindingSupport
implementation
rxbindingDependencies
.
rxBindingAppcompact
api
"org.jetbrains.kotlin:kotlin-stdlib-jre8:$rootProject.ext.kotlinVersion"
implementation
"com.google.firebase:firebase-core:$rootProject.ext.playLibVersion"
implementation
"com.google.firebase:firebase-crash:$rootProject.ext.playLibVersion"
implementation
"com.google.android.gms:play-services-gcm:$rootProject.ext.playLibVersion"
implementation
"com.trello.rxlifecycle2:rxlifecycle:$rxlifecycleVersion"
implementation
"com.trello.rxlifecycle2:rxlifecycle-android:$rxlifecycleVersion"
implementation
"com.trello.rxlifecycle2:rxlifecycle-components:$rxlifecycleVersion"
implementation
'nl.littlerobots.rxlint:rxlint:1.2'
implementation
"frankiesardo:icepick:$icepickVersion"
annotationProcessor
"frankiesardo:icepick-processor:$icepickVersion"
compile
"com.github.hotchemi:permissionsdispatcher:$permissionsdispatcherVersion"
implementation
"com.github.hotchemi:permissionsdispatcher:$permissionsdispatcherVersion"
annotationProcessor
"com.github.hotchemi:permissionsdispatcher-processor:$permissionsdispatcherVersion"
compile
(
'com.crashlytics.sdk.android:crashlytics:2.6.8@aar'
)
{
implementation
(
'com.crashlytics.sdk.android:crashlytics:2.6.8@aar'
)
{
transitive
=
true
;
}
debugCompile
"com.facebook.stetho:stetho:$stethoVersion"
implementation
(
extraDependencies
.
crouton
)
{
exclude
group:
'com.android.support'
,
module:
'support-v4'
}
implementation
extraDependencies
.
androidJob
implementation
extraDependencies
.
jstate
debugImplementation
"com.facebook.stetho:stetho:$stethoVersion"
debugCompile
"com.facebook.stetho:stetho-okhttp3:$stethoOkhttp3Version"
debugCompile
"com.uphyca:stetho_realm:$stethoRealmVersion"
debugCompile
"com.tspoon.traceur:traceur:1.0.1"
test
Compile
'junit:junit:4.12'
test
Compile
'org.robolectric:robolectric:3.3'
test
Compile
"org.jetbrains.kotlin:kotlin-test:$rootProject.ext.kotlinVersion"
test
Compile
"org.jetbrains.kotlin:kotlin-test-junit:$rootProject.ext.kotlinVersion"
test
Compile
"org.jetbrains.kotlin:kotlin-reflect:$rootProject.ext.kotlinVersion"
test
Compile
"com.nhaarman:mockito-kotlin:1.5.0"
test
Compile
'org.amshove.kluent:kluent:1.14'
test
Implementation
'junit:junit:4.12'
test
Implementation
'org.robolectric:robolectric:3.3'
test
Implementation
"org.jetbrains.kotlin:kotlin-test:$rootProject.ext.kotlinVersion"
test
Implementation
"org.jetbrains.kotlin:kotlin-test-junit:$rootProject.ext.kotlinVersion"
test
Implementation
"org.jetbrains.kotlin:kotlin-reflect:$rootProject.ext.kotlinVersion"
test
Implementation
"com.nhaarman:mockito-kotlin:1.5.0"
test
Implementation
'org.amshove.kluent:kluent:1.14'
}
apply
plugin:
'com.google.gms.google-services'
app/src/debug/java/chat/rocket/android/helper/OkHttpHelper.kt
View file @
8d4e96c6
package
chat.rocket.android.helper
import
android.content.Context
import
chat.rocket.android.RocketChatCache
import
chat.rocket.android.api.rest.CookieInterceptor
import
chat.rocket.android.api.rest.DefaultCookieProvider
import
com.facebook.stetho.okhttp3.StethoInterceptor
...
...
@@ -24,17 +22,18 @@ object OkHttpHelper {
return
httpClientForUploadFile
?:
throw
AssertionError
(
"httpClientForUploadFile set to null by another thread"
)
}
fun
getClientForDownloadFile
(
context
:
Context
):
OkHttpClient
{
if
(
httpClientForDownloadFile
==
null
)
{
fun
getClientForDownloadFile
():
OkHttpClient
{
if
(
httpClientForDownloadFile
==
null
)
{
httpClientForDownloadFile
=
OkHttpClient
.
Builder
()
.
addNetworkInterceptor
(
StethoInterceptor
())
.
followRedirects
(
true
)
.
followSslRedirects
(
true
)
.
addInterceptor
(
CookieInterceptor
(
DefaultCookieProvider
(
RocketChatCache
(
context
)
)))
.
addInterceptor
(
CookieInterceptor
(
DefaultCookieProvider
()))
.
build
()
}
return
httpClientForDownloadFile
?:
throw
AssertionError
(
"httpClientForDownloadFile set to null by another thread"
)
}
/**
* Returns the OkHttpClient instance for WebSocket connection.
* @return The OkHttpClient WebSocket connection instance.
...
...
app/src/main/AndroidManifest.xml
View file @
8d4e96c6
<manifest
xmlns:android=
"http://schemas.android.com/apk/res/android"
package=
"chat.rocket.android"
>
<uses-permission
android:name=
"android.permission.INTERNET"
/>
<uses-permission
android:name=
"android.permission.ACCESS_NETWORK_STATE"
/>
<uses-permission
android:name=
"android.permission.READ_EXTERNAL_STORAGE"
/>
<uses-permission
android:name=
"android.permission.WAKE_LOCK"
/>
<uses-permission
android:name=
"android.permission.VIBRATE"
/>
<uses-permission
android:name=
"android.permission.INTERNET"
/>
<uses-permission
android:name=
"android.permission.ACCESS_NETWORK_STATE"
/>
<uses-permission
android:name=
"android.permission.READ_EXTERNAL_STORAGE"
/>
<uses-permission
android:name=
"android.permission.RECEIVE_BOOT_COMPLETED"
/>
<uses-permission
android:name=
"android.permission.WAKE_LOCK"
/>
<uses-permission
android:name=
"android.permission.VIBRATE"
/>
<permission
android:name=
"chat.rocket.android.permission.C2D_MESSAGE"
android:protectionLevel=
"signature"
/>
android:protectionLevel=
"signature"
/>
<uses-permission
android:name=
"chat.rocket.android.permission.C2D_MESSAGE"
/>
<uses-permission
android:name=
"chat.rocket.android.permission.C2D_MESSAGE"
/>
<application
android:name=
".RocketChatApplication"
...
...
@@ -26,39 +27,40 @@
android:configChanges=
"orientation|screenSize"
android:windowSoftInputMode=
"adjustResize"
>
<intent-filter>
<action
android:name=
"android.intent.action.MAIN"
/>
<action
android:name=
"android.intent.action.MAIN"
/>
<category
android:name=
"android.intent.category.DEFAULT"
/>
<category
android:name=
"android.intent.category.LAUNCHER"
/>
<category
android:name=
"android.intent.category.DEFAULT"
/>
<category
android:name=
"android.intent.category.LAUNCHER"
/>
</intent-filter>
</activity>
<activity
android:name=
".activity.room.RoomActivity"
android:configChanges=
"orientation|screenSize"
android:windowSoftInputMode=
"adjustResize"
/>
android:windowSoftInputMode=
"adjustResize"
/>
<activity
android:name=
".activity.AddServerActivity"
android:configChanges=
"orientation|screenSize"
android:
windowSoftInputMode=
"adjustResize
"
android:
launchMode=
"singleTop"
/>
android:
launchMode=
"singleTop
"
android:
windowSoftInputMode=
"adjustResize"
/>
<activity
android:name=
".activity.LoginActivity"
android:configChanges=
"orientation|screenSize"
android:windowSoftInputMode=
"adjustResize"
/>
android:windowSoftInputMode=
"adjustResize"
/>
<service
android:name=
".service.RocketChatService"
/>
<service
android:name=
".service.RocketChatService"
/>
<receiver
android:name=
"com.google.android.gms.gcm.GcmReceiver"
android:exported=
"true"
android:permission=
"com.google.android.c2dm.permission.SEND"
>
<intent-filter>
<action
android:name=
"com.google.android.c2dm.intent.RECEIVE"
/>
<action
android:name=
"com.google.android.c2dm.intent.REGISTRATION"
/>
<category
android:name=
"chat.rocket.android"
/>
<action
android:name=
"com.google.android.c2dm.intent.RECEIVE"
/>
<action
android:name=
"com.google.android.c2dm.intent.REGISTRATION"
/>
<category
android:name=
"chat.rocket.android"
/>
</intent-filter>
</receiver>
...
...
@@ -67,8 +69,8 @@
android:exported=
"true"
android:permission=
"com.google.android.c2dm.permission.SEND"
>
<intent-filter>
<action
android:name=
"com.google.android.c2dm.intent.RECEIVE"
/>
<category
android:name=
"chat.rocket.android"
/>
<action
android:name=
"com.google.android.c2dm.intent.RECEIVE"
/>
<category
android:name=
"chat.rocket.android"
/>
</intent-filter>
</receiver>
...
...
@@ -76,7 +78,8 @@
android:name=
"com.google.firebase.iid.FirebaseInstanceIdInternalReceiver"
android:exported=
"false"
/>
<service
android:name=
"com.google.firebase.iid.FirebaseInstanceIdService"
<service
android:name=
"com.google.firebase.iid.FirebaseInstanceIdService"
android:exported=
"true"
>
<intent-filter
android:priority=
"-500"
>
<action
android:name=
"com.google.firebase.INSTANCE_ID_EVENT"
/>
...
...
@@ -87,7 +90,7 @@
android:name=
".push.gcm.GCMIntentService"
android:exported=
"false"
>
<intent-filter>
<action
android:name=
"com.google.android.c2dm.intent.RECEIVE"
/>
<action
android:name=
"com.google.android.c2dm.intent.RECEIVE"
/>
</intent-filter>
</service>
...
...
@@ -95,14 +98,16 @@
android:name=
".push.gcm.GcmInstanceIDListenerService"
android:exported=
"false"
>
<intent-filter>
<action
android:name=
"com.google.android.gms.iid.InstanceID"
/>
<action
android:name=
"com.google.android.gms.iid.InstanceID"
/>
</intent-filter>
</service>
<receiver
android:name=
".push.PushManager$DeleteReceiver"
<receiver
android:name=
".push.PushManager$DeleteReceiver"
android:exported=
"false"
/>
<receiver
android:name=
".push.PushManager$ReplyReceiver"
<receiver
android:name=
".push.PushManager$ReplyReceiver"
android:exported=
"false"
/>
<meta-data
...
...
app/src/main/java/chat/rocket/android/ConnectionStatusManager.kt
0 → 100644
View file @
8d4e96c6
package
chat.rocket.android
import
chat.rocket.android.extensions.printStackTraceOnDebug
import
chat.rocket.android.service.KeepAliveJob
import
unquietcode.tools.esm.EnumStateMachine
import
unquietcode.tools.esm.TransitionException
object
ConnectionStatusManager
{
enum
class
State
{
OFFLINE
,
CONNECTING
,
ONLINE
}
private
const
val
DEBUG
=
false
private
val
DEFAULT_CALLBACK
=
object
:
TransitionCallback
{
override
fun
onTransitioned
(
success
:
Boolean
)
{
}
}
private
val
stateMachine
:
EnumStateMachine
<
State
>
init
{
stateMachine
=
EnumStateMachine
(
State
.
OFFLINE
)
stateMachine
.
addTransitions
(
State
.
OFFLINE
,
State
.
CONNECTING
)
stateMachine
.
addTransitions
(
State
.
CONNECTING
,
State
.
ONLINE
,
State
.
OFFLINE
)
stateMachine
.
addTransitions
(
State
.
ONLINE
,
State
.
OFFLINE
)
}
@Synchronized
fun
transitionCount
()
=
stateMachine
.
transitionCount
()
@Synchronized
fun
currentState
()
=
stateMachine
.
currentState
()
@Synchronized
fun
setOnline
(
callback
:
TransitionCallback
=
DEFAULT_CALLBACK
)
{
KeepAliveJob
.
cancelPendingJobRequests
()
tryTransitionTo
(
State
.
ONLINE
,
callback
)
}
@Synchronized
fun
setOnline
()
{
KeepAliveJob
.
cancelPendingJobRequests
()
tryTransitionTo
(
State
.
ONLINE
,
DEFAULT_CALLBACK
)
}
@Synchronized
fun
setConnecting
(
callback
:
TransitionCallback
=
DEFAULT_CALLBACK
)
{
KeepAliveJob
.
cancelPendingJobRequests
()
tryTransitionTo
(
State
.
CONNECTING
,
callback
)
}
@Synchronized
fun
setConnecting
()
{
KeepAliveJob
.
cancelPendingJobRequests
()
tryTransitionTo
(
State
.
CONNECTING
,
DEFAULT_CALLBACK
)
}
@Synchronized
fun
setConnectionError
(
callback
:
TransitionCallback
=
DEFAULT_CALLBACK
)
{
KeepAliveJob
.
schedule
()
tryTransitionTo
(
State
.
OFFLINE
,
callback
)
}
@Synchronized
fun
setConnectionError
()
{
KeepAliveJob
.
schedule
()
tryTransitionTo
(
State
.
OFFLINE
,
DEFAULT_CALLBACK
)
}
@Synchronized
fun
setOffline
()
{
stateMachine
.
reset
()
}
private
fun
tryTransitionTo
(
newState
:
State
,
callback
:
TransitionCallback
)
{
try
{
stateMachine
.
transition
(
newState
)
callback
.
onTransitioned
(
true
)
}
catch
(
e
:
TransitionException
)
{
if
(
DEBUG
)
{
e
.
printStackTraceOnDebug
()
}
callback
.
onTransitioned
(
false
)
}
}
interface
TransitionCallback
{
fun
onTransitioned
(
success
:
Boolean
)
}
}
\ No newline at end of file
app/src/main/java/chat/rocket/android/RocketChatApplication.java
View file @
8d4e96c6
...
...
@@ -5,6 +5,7 @@ import android.support.multidex.MultiDexApplication;
import
android.support.v7.app.AppCompatDelegate
;
import
com.crashlytics.android.Crashlytics
;
import
com.evernote.android.job.JobManager
;
import
java.util.List
;
...
...
@@ -34,6 +35,8 @@ public class RocketChatApplication extends MultiDexApplication {
@Override
public
void
onCreate
()
{
super
.
onCreate
();
RocketChatCache
.
INSTANCE
.
initialize
(
this
);
JobManager
.
create
(
this
).
addJobCreator
(
new
RocketChatJobCreator
());
DDPClient
.
initialize
(
OkHttpHelper
.
INSTANCE
.
getClientForWebSocket
());
Fabric
.
with
(
this
,
new
Crashlytics
());
...
...
@@ -44,7 +47,7 @@ public class RocketChatApplication extends MultiDexApplication {
RealmStore
.
put
(
serverInfo
.
getHostname
());
}
RocketChatWidgets
.
initialize
(
this
,
OkHttpHelper
.
INSTANCE
.
getClientForDownloadFile
(
this
));
RocketChatWidgets
.
initialize
(
this
,
OkHttpHelper
.
INSTANCE
.
getClientForDownloadFile
());
if
(
Build
.
VERSION
.
SDK_INT
<
Build
.
VERSION_CODES
.
LOLLIPOP
)
{
AppCompatDelegate
.
setCompatVectorFromResourcesEnabled
(
true
);
...
...
@@ -57,7 +60,7 @@ public class RocketChatApplication extends MultiDexApplication {
if
(
BuildConfig
.
DEBUG
)
{
e
.
printStackTrace
();
}
Logger
.
report
(
e
);
Logger
.
INSTANCE
.
report
(
e
);
});
instance
=
this
;
...
...
app/src/main/java/chat/rocket/android/RocketChatCache.java
deleted
100644 → 0
View file @
106791db
package
chat
.
rocket
.
android
;
import
android.content.Context
;
import
android.content.SharedPreferences
;
import
com.hadisatrio.optional.Optional
;
import
org.json.JSONException
;
import
org.json.JSONObject
;
import
java.util.ArrayList
;
import
java.util.Collections
;
import
java.util.Iterator
;
import
java.util.List
;
import
java.util.UUID
;
import
chat.rocket.android.helper.Logger
;
import
chat.rocket.android.helper.TextUtils
;
import
chat.rocket.android.log.RCLog
;
import
chat.rocket.core.utils.Pair
;
import
io.reactivex.BackpressureStrategy
;
import
io.reactivex.Flowable
;
import
io.reactivex.annotations.NonNull
;
import
io.reactivex.annotations.Nullable
;
import
okhttp3.HttpUrl
;
/**
* sharedpreference-based cache.
*/
public
class
RocketChatCache
{
private
static
final
String
KEY_SELECTED_SERVER_HOSTNAME
=
"KEY_SELECTED_SERVER_HOSTNAME"
;
private
static
final
String
KEY_SELECTED_SITE_URL
=
"KEY_SELECTED_SITE_URL"
;
private
static
final
String
KEY_SELECTED_SITE_NAME
=
"KEY_SELECTED_SITE_NAME"
;
private
static
final
String
KEY_SELECTED_ROOM_ID
=
"KEY_SELECTED_ROOM_ID"
;
private
static
final
String
KEY_PUSH_ID
=
"KEY_PUSH_ID"
;
private
static
final
String
KEY_HOSTNAME_LIST
=
"KEY_HOSTNAME_LIST"
;
private
Context
context
;
public
RocketChatCache
(
Context
context
)
{
this
.
context
=
context
.
getApplicationContext
();
}
public
String
getSelectedServerHostname
()
{
return
getString
(
KEY_SELECTED_SERVER_HOSTNAME
,
null
);
}
public
void
setSelectedServerHostname
(
String
hostname
)
{
String
newHostname
=
null
;
if
(
hostname
!=
null
)
{
newHostname
=
hostname
.
toLowerCase
();
}
setString
(
KEY_SELECTED_SERVER_HOSTNAME
,
newHostname
);
}
public
void
addHostSiteName
(
@NonNull
String
currentHostname
,
@NonNull
String
siteName
)
{
try
{
String
hostSiteNamesJson
=
getHostSiteNamesJson
();
JSONObject
jsonObject
=
(
hostSiteNamesJson
==
null
)
?
new
JSONObject
()
:
new
JSONObject
(
hostSiteNamesJson
);
jsonObject
.
put
(
currentHostname
,
siteName
);
setString
(
KEY_SELECTED_SITE_NAME
,
jsonObject
.
toString
());
}
catch
(
JSONException
e
)
{
RCLog
.
e
(
e
);
}
}
public
@NonNull
String
getHostSiteName
(
@NonNull
String
host
)
{
if
(
host
.
startsWith
(
"http"
))
{
HttpUrl
url
=
HttpUrl
.
parse
(
host
);
if
(
url
!=
null
)
{
host
=
url
.
host
();
}
}
try
{
String
hostSiteNamesJson
=
getHostSiteNamesJson
();
JSONObject
jsonObject
=
(
hostSiteNamesJson
==
null
)
?
new
JSONObject
()
:
new
JSONObject
(
hostSiteNamesJson
);
host
=
getSiteUrlFor
(
host
);
return
jsonObject
.
optString
(
host
);
}
catch
(
JSONException
e
)
{
RCLog
.
e
(
e
);
}
return
""
;
}
private
@Nullable
String
getHostSiteNamesJson
()
{
return
getString
(
KEY_SELECTED_SITE_NAME
,
null
);
}
public
void
addHostnameSiteUrl
(
@Nullable
String
hostnameAlias
,
@NonNull
String
currentHostname
)
{
String
alias
=
null
;
if
(
hostnameAlias
!=
null
)
{
alias
=
hostnameAlias
.
toLowerCase
();
}
try
{
String
selectedHostnameAliasJson
=
getLoginHostnamesJson
();
JSONObject
jsonObject
=
selectedHostnameAliasJson
==
null
?
new
JSONObject
()
:
new
JSONObject
(
selectedHostnameAliasJson
);
jsonObject
.
put
(
alias
,
currentHostname
);
setString
(
KEY_SELECTED_SITE_URL
,
jsonObject
.
toString
());
}
catch
(
JSONException
e
)
{
RCLog
.
e
(
e
);
}
}
public
@Nullable
String
getSiteUrlFor
(
String
hostname
)
{
try
{
String
selectedServerHostname
=
getSelectedServerHostname
();
if
(
getLoginHostnamesJson
()
==
null
||
getLoginHostnamesJson
().
isEmpty
())
{
return
null
;
}
return
new
JSONObject
(
getLoginHostnamesJson
())
.
optString
(
hostname
,
selectedServerHostname
);
}
catch
(
JSONException
e
)
{
RCLog
.
e
(
e
);
}
return
null
;
}
private
@Nullable
String
getLoginHostnamesJson
()
{
return
getString
(
KEY_SELECTED_SITE_URL
,
null
);
}
public
void
addHostname
(
@NonNull
String
hostname
,
@Nullable
String
hostnameAvatarUri
,
String
siteName
)
{
String
hostnameList
=
getString
(
KEY_HOSTNAME_LIST
,
null
);
try
{
JSONObject
json
;
if
(
hostnameList
==
null
)
{
json
=
new
JSONObject
();
}
else
{
json
=
new
JSONObject
(
hostnameList
);
}
JSONObject
serverInfoJson
=
new
JSONObject
();
serverInfoJson
.
put
(
"avatar"
,
hostnameAvatarUri
);
serverInfoJson
.
put
(
"sitename"
,
siteName
);
// Replace server avatar uri if exists.
json
.
put
(
hostname
,
hostnameAvatarUri
==
null
?
JSONObject
.
NULL
:
serverInfoJson
);
setString
(
KEY_HOSTNAME_LIST
,
json
.
toString
());
}
catch
(
JSONException
e
)
{
RCLog
.
e
(
e
);
}
}
public
List
<
Pair
<
String
,
Pair
<
String
,
String
>>>
getServerList
()
{
String
json
=
getString
(
KEY_HOSTNAME_LIST
,
null
);
if
(
json
==
null
)
{
return
Collections
.
emptyList
();
}
try
{
JSONObject
jsonObj
=
new
JSONObject
(
json
);
List
<
Pair
<
String
,
Pair
<
String
,
String
>>>
serverList
=
new
ArrayList
<>();
for
(
Iterator
<
String
>
iter
=
jsonObj
.
keys
();
iter
.
hasNext
();)
{
String
hostname
=
iter
.
next
();
JSONObject
serverInfoJson
=
jsonObj
.
getJSONObject
(
hostname
);
serverList
.
add
(
new
Pair
<>(
hostname
,
new
Pair
<>(
"http://"
+
hostname
+
"/"
+
serverInfoJson
.
getString
(
"avatar"
),
serverInfoJson
.
getString
(
"sitename"
))));
}
return
serverList
;
}
catch
(
JSONException
e
)
{
RCLog
.
e
(
e
);
}
return
Collections
.
emptyList
();
}
public
void
removeHostname
(
String
hostname
)
{
String
json
=
getString
(
KEY_HOSTNAME_LIST
,
null
);
if
(
TextUtils
.
isEmpty
(
json
))
{
return
;
}
try
{
JSONObject
jsonObj
=
new
JSONObject
(
json
);
jsonObj
.
remove
(
hostname
);
String
result
=
jsonObj
.
length
()
==
0
?
null
:
jsonObj
.
toString
();
setString
(
KEY_HOSTNAME_LIST
,
result
);
}
catch
(
JSONException
e
)
{
RCLog
.
e
(
e
);
}
}
@Nullable
public
String
getFirstLoggedHostnameIfAny
()
{
String
json
=
getString
(
KEY_HOSTNAME_LIST
,
null
);
if
(
json
!=
null
)
{
try
{
JSONObject
jsonObj
=
new
JSONObject
(
json
);
if
(
jsonObj
.
length
()
>
0
&&
jsonObj
.
keys
().
hasNext
())
{
// Returns the first hostname on the list.
return
jsonObj
.
keys
().
next
();
}
}
catch
(
JSONException
e
)
{
RCLog
.
e
(
e
);
}
}
return
null
;
}
public
String
getSelectedRoomId
()
{
try
{
JSONObject
jsonObject
=
getSelectedRoomIdJsonObject
();
return
jsonObject
.
optString
(
getSelectedServerHostname
(),
null
);
}
catch
(
JSONException
e
)
{
RCLog
.
e
(
e
);
Logger
.
report
(
e
);
}
return
null
;
}
public
void
setSelectedRoomId
(
String
roomId
)
{
try
{
JSONObject
jsonObject
=
getSelectedRoomIdJsonObject
();
jsonObject
.
put
(
getSelectedServerHostname
(),
roomId
);
setString
(
KEY_SELECTED_ROOM_ID
,
jsonObject
.
toString
());
}
catch
(
JSONException
e
)
{
RCLog
.
e
(
e
);
Logger
.
report
(
e
);
}
}
private
JSONObject
getSelectedRoomIdJsonObject
()
throws
JSONException
{
String
json
=
getString
(
KEY_SELECTED_ROOM_ID
,
null
);
if
(
json
==
null
)
{
return
new
JSONObject
();
}
return
new
JSONObject
(
json
);
}
public
String
getOrCreatePushId
()
{
SharedPreferences
preferences
=
getSharedPreferences
();
if
(!
preferences
.
contains
(
KEY_PUSH_ID
))
{
// generates one and save
String
newId
=
UUID
.
randomUUID
().
toString
().
replace
(
"-"
,
""
);
preferences
.
edit
()
.
putString
(
KEY_PUSH_ID
,
newId
)
.
apply
();
return
newId
;
}
return
preferences
.
getString
(
KEY_PUSH_ID
,
null
);
}
public
Flowable
<
Optional
<
String
>>
getSelectedServerHostnamePublisher
()
{
return
getValuePublisher
(
KEY_SELECTED_SERVER_HOSTNAME
);
}
public
Flowable
<
Optional
<
String
>>
getSelectedRoomIdPublisher
()
{
return
getValuePublisher
(
KEY_SELECTED_ROOM_ID
)
.
filter
(
Optional:
:
isPresent
)
.
map
(
Optional:
:
get
)
.
map
(
roomValue
->
Optional
.
ofNullable
(
new
JSONObject
(
roomValue
).
optString
(
getSelectedServerHostname
(),
null
)));
}
private
SharedPreferences
getSharedPreferences
()
{
return
context
.
getSharedPreferences
(
"cache"
,
Context
.
MODE_PRIVATE
);
}
private
SharedPreferences
.
Editor
getEditor
()
{
return
getSharedPreferences
().
edit
();
}
public
String
getString
(
String
key
,
String
defaultValue
)
{
return
getSharedPreferences
().
getString
(
key
,
defaultValue
);
}
private
void
setString
(
String
key
,
String
value
)
{
getEditor
().
putString
(
key
,
value
).
apply
();
}
private
Flowable
<
Optional
<
String
>>
getValuePublisher
(
final
String
key
)
{
return
Flowable
.
create
(
emitter
->
{
SharedPreferences
.
OnSharedPreferenceChangeListener
listener
=
(
sharedPreferences
,
changedKey
)
->
{
if
(
key
.
equals
(
changedKey
)
&&
!
emitter
.
isCancelled
())
{
String
value
=
getString
(
key
,
null
);
emitter
.
onNext
(
Optional
.
ofNullable
(
value
));
}
};
emitter
.
setCancellable
(()
->
getSharedPreferences
()
.
unregisterOnSharedPreferenceChangeListener
(
listener
));
getSharedPreferences
().
registerOnSharedPreferenceChangeListener
(
listener
);
},
BackpressureStrategy
.
LATEST
);
}
public
void
removeSelectedRoomId
(
String
currentHostname
)
{
try
{
JSONObject
selectedRoomIdJsonObject
=
getSelectedRoomIdJsonObject
();
selectedRoomIdJsonObject
.
remove
(
currentHostname
);
String
result
=
selectedRoomIdJsonObject
.
length
()
==
0
?
null
:
selectedRoomIdJsonObject
.
toString
();
setString
(
KEY_SELECTED_ROOM_ID
,
result
);
}
catch
(
JSONException
e
)
{
Logger
.
report
(
e
);
RCLog
.
e
(
e
);
}
}
}
app/src/main/java/chat/rocket/android/RocketChatCache.kt
0 → 100644
View file @
8d4e96c6
This diff is collapsed.
Click to expand it.
app/src/main/java/chat/rocket/android/RocketChatJobCreator.kt
0 → 100644
View file @
8d4e96c6
package
chat.rocket.android
import
chat.rocket.android.service.KeepAliveJob
import
com.evernote.android.job.Job
import
com.evernote.android.job.JobCreator
class
RocketChatJobCreator
:
JobCreator
{
override
fun
create
(
tag
:
String
):
Job
?
{
when
(
tag
)
{
KeepAliveJob
.
TAG
->
return
KeepAliveJob
()
else
->
return
null
}
}
}
\ No newline at end of file
app/src/main/java/chat/rocket/android/activity/AbstractAuthedActivity.java
View file @
8d4e96c6
...
...
@@ -24,10 +24,11 @@ import io.reactivex.schedulers.Schedulers;
import
okhttp3.HttpUrl
;
abstract
class
AbstractAuthedActivity
extends
AbstractFragmentActivity
{
@State
protected
String
hostname
;
@State
protected
String
roomId
;
@State
protected
String
hostname
;
@State
protected
String
roomId
;
private
RocketChatCache
rocketChatCache
;
private
CompositeDisposable
compositeDisposable
=
new
CompositeDisposable
();
private
boolean
isNotification
;
...
...
@@ -36,13 +37,11 @@ abstract class AbstractAuthedActivity extends AbstractFragmentActivity {
protected
void
onCreate
(
@Nullable
Bundle
savedInstanceState
)
{
super
.
onCreate
(
savedInstanceState
);
rocketChatCache
=
new
RocketChatCache
(
this
);
if
(
savedInstanceState
==
null
)
{
handleIntent
(
getIntent
());
}
updateHostnameIfNeeded
(
rocketChatCache
.
getSelectedServerHostname
());
updateHostnameIfNeeded
(
RocketChatCache
.
INSTANCE
.
getSelectedServerHostname
());
}
@Override
...
...
@@ -61,16 +60,16 @@ abstract class AbstractAuthedActivity extends AbstractFragmentActivity {
HttpUrl
url
=
HttpUrl
.
parse
(
hostname
);
if
(
url
!=
null
)
{
String
hostnameFromPush
=
url
.
host
();
String
loginHostname
=
rocketChatCache
.
getSiteUrlFor
(
hostnameFromPush
);
rocketChatCache
.
setSelectedServerHostname
(
loginHostname
);
String
loginHostname
=
RocketChatCache
.
INSTANCE
.
getSiteUrlFor
(
hostnameFromPush
);
RocketChatCache
.
INSTANCE
.
setSelectedServerHostname
(
loginHostname
);
if
(
intent
.
hasExtra
(
PushManager
.
EXTRA_ROOM_ID
))
{
rocketChatCache
.
setSelectedRoomId
(
intent
.
getStringExtra
(
PushManager
.
EXTRA_ROOM_ID
));
RocketChatCache
.
INSTANCE
.
setSelectedRoomId
(
intent
.
getStringExtra
(
PushManager
.
EXTRA_ROOM_ID
));
}
}
PushManager
.
INSTANCE
.
clearNotificationsByHost
(
hostname
);
}
else
{
updateHostnameIfNeeded
(
rocketChatCache
.
getSelectedServerHostname
());
updateHostnameIfNeeded
(
RocketChatCache
.
INSTANCE
.
getSelectedServerHostname
());
}
if
(
intent
.
hasExtra
(
PushManager
.
EXTRA_NOT_ID
)
&&
intent
.
hasExtra
(
PushManager
.
EXTRA_HOSTNAME
))
{
...
...
@@ -80,7 +79,7 @@ abstract class AbstractAuthedActivity extends AbstractFragmentActivity {
HttpUrl
url
=
HttpUrl
.
parse
(
hostname
);
if
(
url
!=
null
)
{
String
hostnameFromPush
=
url
.
host
();
String
loginHostname
=
rocketChatCache
.
getSiteUrlFor
(
hostnameFromPush
);
String
loginHostname
=
RocketChatCache
.
INSTANCE
.
getSiteUrlFor
(
hostnameFromPush
);
PushManager
.
INSTANCE
.
clearNotificationsByHostAndNotificationId
(
loginHostname
,
notificationId
);
}
else
{
PushManager
.
INSTANCE
.
clearNotificationsByNotificationId
(
notificationId
);
...
...
@@ -93,14 +92,14 @@ abstract class AbstractAuthedActivity extends AbstractFragmentActivity {
if
(
hostname
==
null
)
{
if
(
newHostname
!=
null
&&
assertServerRealmStoreExists
(
newHostname
))
{
updateHostname
(
newHostname
);
updateRoomIdIfNeeded
(
rocketChatCache
.
getSelectedRoomId
());
updateRoomIdIfNeeded
(
RocketChatCache
.
INSTANCE
.
getSelectedRoomId
());
}
else
{
recoverFromHostnameError
();
}
}
else
{
if
(
hostname
.
equals
(
newHostname
))
{
updateHostname
(
newHostname
);
updateRoomIdIfNeeded
(
rocketChatCache
.
getSelectedRoomId
());
updateRoomIdIfNeeded
(
RocketChatCache
.
INSTANCE
.
getSelectedRoomId
());
return
;
}
...
...
@@ -135,8 +134,8 @@ abstract class AbstractAuthedActivity extends AbstractFragmentActivity {
// just connect to the first available
final
ServerInfo
serverInfo
=
serverInfoList
.
get
(
0
);
rocketChatCache
.
setSelectedServerHostname
(
serverInfo
.
getHostname
());
rocketChatCache
.
setSelectedRoomId
(
null
);
RocketChatCache
.
INSTANCE
.
setSelectedServerHostname
(
serverInfo
.
getHostname
());
RocketChatCache
.
INSTANCE
.
setSelectedRoomId
(
null
);
}
private
void
updateRoomIdIfNeeded
(
String
newRoomId
)
{
...
...
@@ -159,7 +158,7 @@ abstract class AbstractAuthedActivity extends AbstractFragmentActivity {
RealmRoom
room
=
RealmStore
.
get
(
hostname
).
executeTransactionForRead
(
realm
->
realm
.
where
(
RealmRoom
.
class
).
equalTo
(
RealmRoom
.
ROOM_ID
,
roomId
).
findFirst
());
if
(
room
==
null
)
{
rocketChatCache
.
setSelectedRoomId
(
null
);
RocketChatCache
.
INSTANCE
.
setSelectedRoomId
(
null
);
return
false
;
}
return
true
;
...
...
@@ -184,8 +183,8 @@ abstract class AbstractAuthedActivity extends AbstractFragmentActivity {
ConnectivityManager
.
getInstance
(
getApplicationContext
()).
keepAliveServer
();
if
(
isNotification
)
{
updateHostnameIfNeeded
(
rocketChatCache
.
getSelectedServerHostname
());
updateRoomIdIfNeeded
(
rocketChatCache
.
getSelectedRoomId
());
updateHostnameIfNeeded
(
RocketChatCache
.
INSTANCE
.
getSelectedServerHostname
());
updateRoomIdIfNeeded
(
RocketChatCache
.
INSTANCE
.
getSelectedRoomId
());
isNotification
=
false
;
}
}
...
...
@@ -204,26 +203,26 @@ abstract class AbstractAuthedActivity extends AbstractFragmentActivity {
private
void
subscribeToConfigChanges
()
{
compositeDisposable
.
add
(
rocketChatCache
.
getSelectedServerHostnamePublisher
()
RocketChatCache
.
INSTANCE
.
getSelectedServerHostnamePublisher
()
.
map
(
Optional:
:
get
)
.
distinctUntilChanged
()
.
subscribeOn
(
Schedulers
.
io
())
.
observeOn
(
AndroidSchedulers
.
mainThread
())
.
subscribe
(
this
::
updateHostnameIfNeeded
,
Logger
:
:
report
Logger
.
INSTANCE
::
report
)
);
compositeDisposable
.
add
(
rocketChatCache
.
getSelectedRoomIdPublisher
()
RocketChatCache
.
INSTANCE
.
getSelectedRoomIdPublisher
()
.
filter
(
Optional:
:
isPresent
)
.
map
(
Optional:
:
get
)
.
subscribeOn
(
Schedulers
.
io
())
.
observeOn
(
AndroidSchedulers
.
mainThread
())
.
subscribe
(
this
::
updateRoomIdIfNeeded
,
Logger
:
:
report
Logger
.
INSTANCE
::
report
)
);
}
...
...
app/src/main/java/chat/rocket/android/activity/LoginActivity.java
View file @
8d4e96c6
...
...
@@ -89,4 +89,12 @@ public class LoginActivity extends AbstractFragmentActivity implements LoginCont
finish
();
overridePendingTransition
(
android
.
R
.
anim
.
fade_in
,
android
.
R
.
anim
.
fade_out
);
}
@Override
protected
boolean
onBackPress
()
{
LoginFragment
loginFragment
=
(
LoginFragment
)
getSupportFragmentManager
()
.
findFragmentById
(
getLayoutContainerForFragment
());
loginFragment
.
goBack
();
return
true
;
}
}
app/src/main/java/chat/rocket/android/activity/LoginPresenter.java
View file @
8d4e96c6
...
...
@@ -66,7 +66,7 @@ public class LoginPresenter extends BasePresenter<LoginContract.View>
view
.
closeView
();
}
},
Logger:
:
report
Logger
.
INSTANCE
::
report
);
addSubscription
(
subscription
);
...
...
app/src/main/java/chat/rocket/android/activity/MainActivity.java
View file @
8d4e96c6
This diff is collapsed.
Click to expand it.
app/src/main/java/chat/rocket/android/activity/MainPresenter.java
View file @
8d4e96c6
...
...
@@ -41,7 +41,6 @@ public class MainPresenter extends BasePresenter<MainContract.View>
private
final
SessionInteractor
sessionInteractor
;
private
final
MethodCallHelper
methodCallHelper
;
private
final
ConnectivityManagerApi
connectivityManagerApi
;
private
final
RocketChatCache
rocketChatCache
;
private
final
PublicSettingRepository
publicSettingRepository
;
public
MainPresenter
(
RoomInteractor
roomInteractor
,
...
...
@@ -49,13 +48,12 @@ public class MainPresenter extends BasePresenter<MainContract.View>
SessionInteractor
sessionInteractor
,
MethodCallHelper
methodCallHelper
,
ConnectivityManagerApi
connectivityManagerApi
,
RocketChatCache
rocketChatCache
,
PublicSettingRepository
publicSettingRepository
)
{
PublicSettingRepository
publicSettingRepository
)
{
this
.
roomInteractor
=
roomInteractor
;
this
.
canCreateRoomInteractor
=
canCreateRoomInteractor
;
this
.
sessionInteractor
=
sessionInteractor
;
this
.
methodCallHelper
=
methodCallHelper
;
this
.
connectivityManagerApi
=
connectivityManagerApi
;
this
.
rocketChatCache
=
rocketChatCache
;
this
.
publicSettingRepository
=
publicSettingRepository
;
}
...
...
@@ -97,12 +95,13 @@ public class MainPresenter extends BasePresenter<MainContract.View>
subscribeToNetworkChanges
();
subscribeToUnreadCount
();
subscribeToSession
();
setUserOnline
();
}
@Override
public
void
release
()
{
if
(
RocketChatCache
.
INSTANCE
.
getSessionToken
()
!=
null
)
{
setUserAway
();
}
super
.
release
();
}
...
...
@@ -120,7 +119,7 @@ public class MainPresenter extends BasePresenter<MainContract.View>
view
.
showHome
();
}
},
Logger:
:
report
Logger
.
INSTANCE
::
report
);
addSubscription
(
subscription
);
...
...
@@ -157,13 +156,13 @@ public class MainPresenter extends BasePresenter<MainContract.View>
String
logoUrl
=
(
jsonObject
.
has
(
"url"
))
?
jsonObject
.
optString
(
"url"
)
:
jsonObject
.
optString
(
"defaultUrl"
);
String
siteName
=
serverInfoPair
.
second
;
rocketChatCache
.
addHostname
(
hostname
.
toLowerCase
(),
logoUrl
,
siteName
);
return
rocketChatCache
.
getServerList
();
RocketChatCache
.
INSTANCE
.
addHostname
(
hostname
.
toLowerCase
(),
logoUrl
,
siteName
);
return
RocketChatCache
.
INSTANCE
.
getServerList
();
}
private
void
openRoom
()
{
String
hostname
=
rocketChatCache
.
getSelectedServerHostname
();
String
roomId
=
rocketChatCache
.
getSelectedRoomId
();
String
hostname
=
RocketChatCache
.
INSTANCE
.
getSelectedServerHostname
();
String
roomId
=
RocketChatCache
.
INSTANCE
.
getSelectedRoomId
();
if
(
roomId
==
null
||
roomId
.
length
()
==
0
)
{
view
.
showHome
();
...
...
@@ -183,7 +182,7 @@ public class MainPresenter extends BasePresenter<MainContract.View>
.
observeOn
(
AndroidSchedulers
.
mainThread
())
.
subscribe
(
pair
->
view
.
showUnreadCount
(
pair
.
first
,
pair
.
second
),
Logger:
:
report
Logger
.
INSTANCE
::
report
);
addSubscription
(
subscription
);
...
...
@@ -211,10 +210,11 @@ public class MainPresenter extends BasePresenter<MainContract.View>
view
.
showConnecting
();
return
;
}
view
.
showConnectionOk
();
// TODO: Should we remove below and above calls to view?
// view.showConnectionOk();
RocketChatCache
.
INSTANCE
.
setSessionToken
(
session
.
getToken
());
},
Logger:
:
report
Logger
.
INSTANCE
::
report
);
addSubscription
(
subscription
);
...
...
@@ -227,17 +227,21 @@ public class MainPresenter extends BasePresenter<MainContract.View>
.
subscribe
(
connectivity
->
{
if
(
connectivity
.
state
==
ServerConnectivity
.
STATE_CONNECTED
)
{
view
.
showConnectionOk
();
view
.
refreshRoom
();
//TODO: notify almost connected or something like that.
// view.showConnectionOk
();
}
else
if
(
connectivity
.
state
==
ServerConnectivity
.
STATE_DISCONNECTED
)
{
if
(
connectivity
.
code
==
DDPClient
.
REASON_NETWORK_ERROR
)
{
view
.
showConnectionError
();
}
}
else
if
(
connectivity
.
state
==
ServerConnectivity
.
STATE_SESSION_ESTABLISHED
)
{
setUserOnline
();
view
.
refreshRoom
();
view
.
showConnectionOk
();
}
else
{
view
.
showConnecting
();
}
},
Logger:
:
report
RCLog:
:
e
);
addSubscription
(
disposable
);
...
...
app/src/main/java/chat/rocket/android/api/MethodCallHelper.java
View file @
8d4e96c6
...
...
@@ -7,6 +7,7 @@ import org.json.JSONArray;
import
org.json.JSONException
;
import
org.json.JSONObject
;
import
java.util.Iterator
;
import
java.util.UUID
;
import
bolts.Continuation
;
...
...
@@ -14,6 +15,7 @@ import bolts.Task;
import
chat.rocket.android.RocketChatCache
;
import
chat.rocket.android.helper.CheckSum
;
import
chat.rocket.android.helper.TextUtils
;
import
chat.rocket.android.log.RCLog
;
import
chat.rocket.android.service.ConnectivityManager
;
import
chat.rocket.android_ddp.DDPClient
;
import
chat.rocket.android_ddp.DDPClientCallback
;
...
...
@@ -32,11 +34,12 @@ import chat.rocket.persistence.realm.models.ddp.RealmSpotlightUser;
import
chat.rocket.persistence.realm.models.internal.MethodCall
;
import
chat.rocket.persistence.realm.models.internal.RealmSession
;
import
hugo.weaving.DebugLog
;
import
io.realm.RealmQuery
;
import
okhttp3.HttpUrl
;
/**
* Utility class for creating/handling MethodCall or RPC.
*
*
<p>
* TODO: separate method into several manager classes (SubscriptionManager, MessageManager, ...).
*/
public
class
MethodCallHelper
{
...
...
@@ -115,7 +118,7 @@ public class MethodCallHelper {
}
else
if
(
exception
instanceof
DDPClientCallback
.
RPC
.
Timeout
)
{
return
Task
.
forError
(
new
MethodCall
.
Timeout
());
}
else
if
(
exception
instanceof
DDPClientCallback
.
Closed
)
{
return
Task
.
forError
(
new
Exception
(
"Oops, your connection seems off..."
));
return
Task
.
forError
(
new
Exception
(
exception
.
getMessage
()
));
}
else
{
return
Task
.
forError
(
exception
);
}
...
...
@@ -299,6 +302,27 @@ public class MethodCallHelper {
realm
.
delete
(
RealmRoom
.
class
);
realm
.
createOrUpdateAllFromJson
(
RealmRoom
.
class
,
result
);
JSONObject
openedRooms
=
RocketChatCache
.
INSTANCE
.
getOpenedRooms
();
RealmQuery
<
RealmRoom
>
query
=
realm
.
where
(
RealmRoom
.
class
);
Iterator
<
String
>
keys
=
openedRooms
.
keys
();
while
(
keys
.
hasNext
())
{
String
rid
=
keys
.
next
();
RealmRoom
realmRoom
=
query
.
equalTo
(
RealmRoom
.
ID
,
rid
).
findFirst
();
if
(
realmRoom
==
null
)
{
RocketChatCache
.
INSTANCE
.
removeOpenedRoom
(
rid
);
}
else
{
loadMissedMessages
(
rid
,
realmRoom
.
getLastSeen
())
.
continueWithTask
(
task1
->
{
if
(
task1
.
isFaulted
())
{
Exception
error
=
task1
.
getError
();
RCLog
.
e
(
error
);
}
return
null
;
});
}
}
return
null
;
});
}
catch
(
JSONException
exception
)
{
...
...
@@ -307,6 +331,32 @@ public class MethodCallHelper {
});
}
public
Task
<
JSONArray
>
loadMissedMessages
(
final
String
roomId
,
final
long
timestamp
)
{
return
call
(
"loadMissedMessages"
,
TIMEOUT_MS
,
()
->
new
JSONArray
()
.
put
(
roomId
)
.
put
(
timestamp
>
0
?
new
JSONObject
().
put
(
"$date"
,
timestamp
)
:
JSONObject
.
NULL
)
).
onSuccessTask
(
CONVERT_TO_JSON_ARRAY
)
.
onSuccessTask
(
task
->
{
JSONArray
result
=
task
.
getResult
();
for
(
int
i
=
0
;
i
<
result
.
length
();
i
++)
{
RealmMessage
.
customizeJson
(
result
.
getJSONObject
(
i
));
}
return
realmHelper
.
executeTransaction
(
realm
->
{
if
(
timestamp
==
0
)
{
realm
.
where
(
RealmMessage
.
class
)
.
equalTo
(
"rid"
,
roomId
)
.
equalTo
(
"syncstate"
,
SyncState
.
SYNCED
)
.
findAll
().
deleteAllFromRealm
();
}
if
(
result
.
length
()
>
0
)
{
realm
.
createOrUpdateAllFromJson
(
RealmMessage
.
class
,
result
);
}
return
null
;
}).
onSuccessTask
(
_task
->
Task
.
forResult
(
result
));
});
}
/**
* Load messages for room.
*/
...
...
@@ -406,7 +456,7 @@ public class MethodCallHelper {
.
put
(
"_id"
,
messageID
);
return
deleteMessage
(
messageJson
);
}
catch
(
JSONException
exception
)
{
}
catch
(
JSONException
exception
)
{
return
Task
.
forError
(
exception
);
}
}
...
...
@@ -458,9 +508,8 @@ public class MethodCallHelper {
HttpUrl
httpSiteUrl
=
HttpUrl
.
parse
(
siteUrl
);
if
(
httpSiteUrl
!=
null
)
{
String
host
=
httpSiteUrl
.
host
();
RocketChatCache
rocketChatCache
=
new
RocketChatCache
(
context
);
rocketChatCache
.
addHostnameSiteUrl
(
host
,
currentHostname
);
rocketChatCache
.
addHostSiteName
(
currentHostname
,
siteName
);
RocketChatCache
.
INSTANCE
.
addSiteUrl
(
host
,
currentHostname
);
RocketChatCache
.
INSTANCE
.
addSiteName
(
currentHostname
,
siteName
);
}
}
...
...
app/src/main/java/chat/rocket/android/api/rest/DefaultCookieProvider.java
View file @
8d4e96c6
...
...
@@ -8,11 +8,6 @@ import chat.rocket.persistence.realm.models.internal.RealmSession;
public
class
DefaultCookieProvider
implements
CookieProvider
{
private
RocketChatCache
rocketChatCache
;
public
DefaultCookieProvider
(
RocketChatCache
rocketChatCache
)
{
this
.
rocketChatCache
=
rocketChatCache
;
}
@Override
public
String
getHostname
()
{
...
...
@@ -44,6 +39,6 @@ public class DefaultCookieProvider implements CookieProvider {
}
private
String
getHostnameFromCache
()
{
return
rocketChatCache
.
getSelectedServerHostname
();
return
RocketChatCache
.
INSTANCE
.
getSelectedServerHostname
();
}
}
app/src/main/java/chat/rocket/android/extensions/HelperExtensions.kt
0 → 100644
View file @
8d4e96c6
package
chat.rocket.android.extensions
import
chat.rocket.android.BuildConfig
fun
Throwable
.
printStackTraceOnDebug
()
{
if
(
BuildConfig
.
DEBUG
)
{
this
.
printStackTrace
()
}
}
\ No newline at end of file
app/src/main/java/chat/rocket/android/fragment/add_server/InputHostnameFragment.java
View file @
8d4e96c6
...
...
@@ -12,7 +12,6 @@ import android.widget.TextView;
import
chat.rocket.android.BuildConfig
;
import
chat.rocket.android.LaunchUtil
;
import
chat.rocket.android.R
;
import
chat.rocket.android.RocketChatCache
;
import
chat.rocket.android.fragment.AbstractFragment
;
import
chat.rocket.android.helper.TextUtils
;
import
chat.rocket.android.service.ConnectivityManager
;
...
...
@@ -34,7 +33,7 @@ public class InputHostnameFragment extends AbstractFragment implements InputHost
super
.
onCreate
(
savedInstanceState
);
Context
appContext
=
getContext
().
getApplicationContext
();
presenter
=
new
InputHostnamePresenter
(
new
RocketChatCache
(
appContext
),
ConnectivityManager
.
getInstance
(
appContext
));
presenter
=
new
InputHostnamePresenter
(
ConnectivityManager
.
getInstance
(
appContext
));
}
@Override
...
...
@@ -52,7 +51,7 @@ public class InputHostnameFragment extends AbstractFragment implements InputHost
}
private
void
setupVersionInfo
()
{
TextView
versionInfoView
=
(
TextView
)
rootView
.
findViewById
(
R
.
id
.
version_info
);
TextView
versionInfoView
=
rootView
.
findViewById
(
R
.
id
.
version_info
);
versionInfoView
.
setText
(
getString
(
R
.
string
.
version_info_text
,
BuildConfig
.
VERSION_NAME
));
}
...
...
app/src/main/java/chat/rocket/android/fragment/add_server/InputHostnamePresenter.java
View file @
8d4e96c6
...
...
@@ -14,12 +14,10 @@ import io.reactivex.android.schedulers.AndroidSchedulers;
import
io.reactivex.disposables.Disposable
;
public
class
InputHostnamePresenter
extends
BasePresenter
<
InputHostnameContract
.
View
>
implements
InputHostnameContract
.
Presenter
{
private
final
RocketChatCache
rocketChatCache
;
private
final
ConnectivityManagerApi
connectivityManager
;
private
boolean
isValidServerUrl
=
false
;
public
InputHostnamePresenter
(
RocketChatCache
rocketChatCache
,
ConnectivityManagerApi
connectivityManager
)
{
this
.
rocketChatCache
=
rocketChatCache
;
public
InputHostnamePresenter
(
ConnectivityManagerApi
connectivityManager
)
{
this
.
connectivityManager
=
connectivityManager
;
}
...
...
@@ -49,14 +47,14 @@ public class InputHostnamePresenter extends BasePresenter<InputHostnameContract.
}
},
throwable
->
{
Logger
.
report
(
throwable
);
Logger
.
INSTANCE
.
report
(
throwable
);
view
.
showConnectionError
();
});
addSubscription
(
subscription
);
}
private
void
onServerValid
(
String
hostname
,
boolean
usesSecureConnection
)
{
rocketChatCache
.
setSelectedServerHostname
(
hostname
);
RocketChatCache
.
INSTANCE
.
setSelectedServerHostname
(
hostname
);
String
server
=
hostname
.
replace
(
"/"
,
"."
);
connectivityManager
.
addOrUpdateServer
(
server
,
server
,
!
usesSecureConnection
);
...
...
app/src/main/java/chat/rocket/android/fragment/chatroom/AbstractChatRoomFragment.java
View file @
8d4e96c6
...
...
@@ -11,7 +11,7 @@ import chat.rocket.android.fragment.AbstractFragment;
import
chat.rocket.android.widget.RoomToolbar
;
import
chat.rocket.core.models.User
;
abstract
class
AbstractChatRoomFragment
extends
AbstractFragment
{
public
abstract
class
AbstractChatRoomFragment
extends
AbstractFragment
{
private
RoomToolbar
roomToolbar
;
@Nullable
...
...
app/src/main/java/chat/rocket/android/fragment/chatroom/HomeFragment.java
deleted
100644 → 0
View file @
106791db
package
chat
.
rocket
.
android
.
fragment
.
chatroom
;
import
chat.rocket.android.R
;
public
class
HomeFragment
extends
AbstractChatRoomFragment
{
public
HomeFragment
()
{}
@Override
protected
int
getLayout
()
{
return
R
.
layout
.
fragment_home
;
}
@Override
protected
void
onSetupView
()
{
setToolbarTitle
(
getText
(
R
.
string
.
home_fragment_title
));
}
}
\ No newline at end of file
app/src/main/java/chat/rocket/android/fragment/chatroom/HomeFragment.kt
0 → 100644
View file @
8d4e96c6
package
chat.rocket.android.fragment.chatroom
import
chat.rocket.android.R
class
HomeFragment
:
AbstractChatRoomFragment
()
{
override
fun
getLayout
():
Int
{
return
R
.
layout
.
fragment_home
}
override
fun
onSetupView
()
{
setToolbarTitle
(
getText
(
R
.
string
.
home_fragment_title
))
}
}
\ No newline at end of file
app/src/main/java/chat/rocket/android/fragment/chatroom/RoomContract.java
deleted
100644 → 0
View file @
106791db
package
chat
.
rocket
.
android
.
fragment
.
chatroom
;
import
android.support.annotation.NonNull
;
import
android.support.annotation.Nullable
;
import
java.util.List
;
import
chat.rocket.android.shared.BaseContract
;
import
chat.rocket.android.widget.AbsoluteUrl
;
import
chat.rocket.core.models.Message
;
import
chat.rocket.core.models.Room
;
import
chat.rocket.core.models.User
;
public
interface
RoomContract
{
interface
View
extends
BaseContract
.
View
{
void
setupWith
(
RocketChatAbsoluteUrl
rocketChatAbsoluteUrl
);
void
render
(
Room
room
);
void
showUserStatus
(
User
user
);
void
updateHistoryState
(
boolean
hasNext
,
boolean
isLoaded
);
void
onMessageSendSuccessfully
();
void
disableMessageInput
();
void
enableMessageInput
();
void
showUnreadCount
(
int
count
);
void
showMessages
(
List
<
Message
>
messages
);
void
showMessageSendFailure
(
Message
message
);
void
showMessageDeleteFailure
(
Message
message
);
void
autoloadImages
();
void
manualLoadImages
();
void
onReply
(
AbsoluteUrl
absoluteUrl
,
String
markdown
,
Message
message
);
void
onCopy
(
String
message
);
void
showMessageActions
(
Message
message
);
}
interface
Presenter
extends
BaseContract
.
Presenter
<
View
>
{
void
loadMessages
();
void
loadMoreMessages
();
void
onMessageSelected
(
@Nullable
Message
message
);
void
onMessageTap
(
@Nullable
Message
message
);
void
sendMessage
(
String
messageText
);
void
resendMessage
(
@NonNull
Message
message
);
void
updateMessage
(
@NonNull
Message
message
,
String
content
);
void
deleteMessage
(
@NonNull
Message
message
);
void
onUnreadCount
();
void
onMarkAsRead
();
void
refreshRoom
();
void
replyMessage
(
@NonNull
Message
message
,
boolean
justQuote
);
void
acceptMessageDeleteFailure
(
Message
message
);
}
}
app/src/main/java/chat/rocket/android/fragment/chatroom/RoomContract.kt
0 → 100644
View file @
8d4e96c6
package
chat.rocket.android.fragment.chatroom
import
chat.rocket.android.shared.BaseContract
import
chat.rocket.android.widget.AbsoluteUrl
import
chat.rocket.core.models.Message
import
chat.rocket.core.models.Room
import
chat.rocket.core.models.User
interface
RoomContract
{
interface
View
:
BaseContract
.
View
{
fun
setupWith
(
rocketChatAbsoluteUrl
:
RocketChatAbsoluteUrl
)
fun
render
(
room
:
Room
)
fun
showUserStatus
(
user
:
User
)
fun
updateHistoryState
(
hasNext
:
Boolean
,
isLoaded
:
Boolean
)
fun
onMessageSendSuccessfully
()
fun
disableMessageInput
()
fun
enableMessageInput
()
fun
showUnreadCount
(
count
:
Int
)
fun
showMessages
(
messages
:
List
<
Message
>)
fun
showMessageSendFailure
(
message
:
Message
)
fun
showMessageDeleteFailure
(
message
:
Message
)
fun
autoloadImages
()
fun
manualLoadImages
()
fun
onReply
(
absoluteUrl
:
AbsoluteUrl
,
markdown
:
String
,
message
:
Message
)
fun
onCopy
(
message
:
String
)
fun
showMessageActions
(
message
:
Message
)
}
interface
Presenter
:
BaseContract
.
Presenter
<
View
>
{
fun
loadMessages
()
fun
loadMoreMessages
()
fun
onMessageSelected
(
message
:
Message
?)
fun
onMessageTap
(
message
:
Message
?)
fun
sendMessage
(
messageText
:
String
)
fun
resendMessage
(
message
:
Message
)
fun
updateMessage
(
message
:
Message
,
content
:
String
)
fun
deleteMessage
(
message
:
Message
)
fun
onUnreadCount
()
fun
onMarkAsRead
()
fun
refreshRoom
()
fun
replyMessage
(
message
:
Message
,
justQuote
:
Boolean
)
fun
acceptMessageDeleteFailure
(
message
:
Message
)
fun
loadMissedMessages
()
}
}
app/src/main/java/chat/rocket/android/fragment/chatroom/RoomFragment.java
View file @
8d4e96c6
...
...
@@ -131,7 +131,7 @@ public class RoomFragment extends AbstractChatRoomFragment implements
private
MethodCallHelper
methodCallHelper
;
private
AbsoluteUrlHelper
absoluteUrlHelper
;
private
Message
edit
t
ingMessage
=
null
;
private
Message
editingMessage
=
null
;
private
RoomToolbar
toolbar
;
...
...
@@ -344,7 +344,7 @@ public class RoomFragment extends AbstractChatRoomFragment implements
optionalPane
.
ifPresent
(
pane
->
pane
.
setPanelSlideListener
(
new
SlidingPaneLayout
.
PanelSlideListener
()
{
@Override
public
void
onPanelSlide
(
View
view
,
float
v
)
{
public
void
onPanelSlide
(
@NonNull
View
view
,
float
v
)
{
messageFormManager
.
enableComposingText
(
false
);
sidebarFragment
.
clearSearchViewFocus
();
//Ref: ActionBarDrawerToggle#setProgress
...
...
@@ -352,12 +352,12 @@ public class RoomFragment extends AbstractChatRoomFragment implements
}
@Override
public
void
onPanelOpened
(
View
view
)
{
public
void
onPanelOpened
(
@NonNull
View
view
)
{
toolbar
.
setNavigationIconVerticalMirror
(
true
);
}
@Override
public
void
onPanelClosed
(
View
view
)
{
public
void
onPanelClosed
(
@NonNull
View
view
)
{
messageFormManager
.
enableComposingText
(
true
);
toolbar
.
setNavigationIconVerticalMirror
(
false
);
subPane
.
closePane
();
...
...
@@ -487,8 +487,8 @@ public class RoomFragment extends AbstractChatRoomFragment implements
@Override
public
boolean
onBackPressed
()
{
if
(
edit
t
ingMessage
!=
null
)
{
edit
t
ingMessage
=
null
;
if
(
editingMessage
!=
null
)
{
editingMessage
=
null
;
messageFormManager
.
clearComposingText
();
}
return
false
;
...
...
@@ -540,22 +540,22 @@ public class RoomFragment extends AbstractChatRoomFragment implements
inputContentInfo
.
releasePermission
();
}
catch
(
Exception
e
)
{
RCLog
.
e
(
e
);
Logger
.
report
(
e
);
Logger
.
INSTANCE
.
report
(
e
);
}
return
true
;
}
private
void
sendMessage
(
String
messageText
)
{
if
(
edit
t
ingMessage
==
null
)
{
if
(
editingMessage
==
null
)
{
presenter
.
sendMessage
(
messageText
);
}
else
{
presenter
.
updateMessage
(
edit
t
ingMessage
,
messageText
);
presenter
.
updateMessage
(
editingMessage
,
messageText
);
}
}
@Override
public
void
setupWith
(
RocketChatAbsoluteUrl
rocketChatAbsoluteUrl
)
{
public
void
setupWith
(
@NonNull
RocketChatAbsoluteUrl
rocketChatAbsoluteUrl
)
{
if
(
rocketChatAbsoluteUrl
!=
null
)
{
token
=
rocketChatAbsoluteUrl
.
getToken
();
userId
=
rocketChatAbsoluteUrl
.
getUserId
();
...
...
@@ -564,7 +564,7 @@ public class RoomFragment extends AbstractChatRoomFragment implements
}
@Override
public
void
render
(
Room
room
)
{
public
void
render
(
@NonNull
Room
room
)
{
roomType
=
room
.
getType
();
setToolbarTitle
(
room
.
getName
());
...
...
@@ -589,7 +589,7 @@ public class RoomFragment extends AbstractChatRoomFragment implements
}
@Override
public
void
showUserStatus
(
User
user
)
{
public
void
showUserStatus
(
@NonNull
User
user
)
{
showToolbarUserStatuslIcon
(
user
.
getStatus
());
}
...
...
@@ -610,7 +610,7 @@ public class RoomFragment extends AbstractChatRoomFragment implements
public
void
onMessageSendSuccessfully
()
{
scrollToLatestMessage
();
messageFormManager
.
onMessageSend
();
edit
t
ingMessage
=
null
;
editingMessage
=
null
;
}
@Override
...
...
@@ -629,15 +629,16 @@ public class RoomFragment extends AbstractChatRoomFragment implements
}
@Override
public
void
showMessages
(
List
<
Message
>
messages
)
{
public
void
showMessages
(
@NonNull
List
<?
extends
Message
>
messages
)
{
if
(
messageListAdapter
==
null
)
{
return
;
}
messageListAdapter
.
updateData
(
messages
);
messageListAdapter
.
updateData
((
List
<
Message
>)
messages
);
}
@Override
public
void
showMessageSendFailure
(
Message
message
)
{
public
void
showMessageSendFailure
(
@NonNull
Message
message
)
{
new
AlertDialog
.
Builder
(
getContext
())
.
setPositiveButton
(
R
.
string
.
resend
,
(
dialog
,
which
)
->
presenter
.
resendMessage
(
message
))
...
...
@@ -648,7 +649,7 @@ public class RoomFragment extends AbstractChatRoomFragment implements
}
@Override
public
void
showMessageDeleteFailure
(
Message
message
)
{
public
void
showMessageDeleteFailure
(
@NonNull
Message
message
)
{
new
AlertDialog
.
Builder
(
getContext
())
.
setTitle
(
getContext
().
getString
(
R
.
string
.
failed_to_delete
))
.
setMessage
(
getContext
().
getString
(
R
.
string
.
failed_to_delete_message
))
...
...
@@ -667,12 +668,12 @@ public class RoomFragment extends AbstractChatRoomFragment implements
}
@Override
public
void
onReply
(
AbsoluteUrl
absoluteUrl
,
String
markdown
,
Message
message
)
{
public
void
onReply
(
@NonNull
AbsoluteUrl
absoluteUrl
,
@NonNull
String
markdown
,
@NonNull
Message
message
)
{
messageFormManager
.
setReply
(
absoluteUrl
,
markdown
,
message
);
}
@Override
public
void
onCopy
(
String
message
)
{
public
void
onCopy
(
@NonNull
String
message
)
{
RocketChatApplication
context
=
RocketChatApplication
.
getInstance
();
ClipboardManager
clipboardManager
=
(
ClipboardManager
)
context
.
getSystemService
(
Context
.
CLIPBOARD_SERVICE
);
...
...
@@ -680,7 +681,7 @@ public class RoomFragment extends AbstractChatRoomFragment implements
}
@Override
public
void
showMessageActions
(
Message
message
)
{
public
void
showMessageActions
(
@NonNull
Message
message
)
{
Activity
context
=
getActivity
();
if
(
context
!=
null
&&
context
instanceof
MainActivity
)
{
MessagePopup
.
take
(
message
)
...
...
@@ -694,7 +695,7 @@ public class RoomFragment extends AbstractChatRoomFragment implements
}
private
void
onEditMessage
(
Message
message
)
{
edit
t
ingMessage
=
message
;
editingMessage
=
message
;
messageFormManager
.
setEditMessage
(
message
.
getMessage
());
}
...
...
@@ -716,7 +717,7 @@ public class RoomFragment extends AbstractChatRoomFragment implements
}
}
public
void
loadMessages
()
{
presenter
.
loadMessages
();
public
void
loadM
issedM
essages
()
{
presenter
.
loadM
issedM
essages
();
}
}
\ No newline at end of file
app/src/main/java/chat/rocket/android/fragment/chatroom/RoomPresenter.java
View file @
8d4e96c6
...
...
@@ -6,11 +6,17 @@ import android.support.v4.util.Pair;
import
com.hadisatrio.optional.Optional
;
import
org.json.JSONException
;
import
org.json.JSONObject
;
import
chat.rocket.android.BackgroundLooper
;
import
chat.rocket.android.RocketChatApplication
;
import
chat.rocket.android.RocketChatCache
;
import
chat.rocket.android.api.MethodCallHelper
;
import
chat.rocket.android.helper.AbsoluteUrlHelper
;
import
chat.rocket.android.helper.LogIfError
;
import
chat.rocket.android.helper.Logger
;
import
chat.rocket.android.log.RCLog
;
import
chat.rocket.android.service.ConnectivityManagerApi
;
import
chat.rocket.android.shared.BasePresenter
;
import
chat.rocket.core.SyncState
;
...
...
@@ -38,7 +44,7 @@ public class RoomPresenter extends BasePresenter<RoomContract.View>
private
final
ConnectivityManagerApi
connectivityManagerApi
;
private
Room
currentRoom
;
public
RoomPresenter
(
String
roomId
,
/* package */
RoomPresenter
(
String
roomId
,
UserRepository
userRepository
,
MessageInteractor
messageInteractor
,
RoomRepository
roomRepository
,
...
...
@@ -81,7 +87,7 @@ public class RoomPresenter extends BasePresenter<RoomContract.View>
connectivityManagerApi
.
keepAliveServer
();
}
},
Logger
:
:
report
Logger
.
INSTANCE
::
report
);
addSubscription
(
subscription
);
...
...
@@ -99,7 +105,7 @@ public class RoomPresenter extends BasePresenter<RoomContract.View>
connectivityManagerApi
.
keepAliveServer
();
}
},
Logger
:
:
report
Logger
.
INSTANCE
::
report
);
addSubscription
(
subscription
);
...
...
@@ -146,8 +152,10 @@ public class RoomPresenter extends BasePresenter<RoomContract.View>
view
.
onReply
(
absoluteUrl
,
buildReplyOrQuoteMarkdown
(
baseUrl
,
message
,
justQuote
),
message
);
}
},
Logger
:
:
report
Logger
.
INSTANCE
::
report
);
addSubscription
(
subscription
);
}
public
void
acceptMessageDeleteFailure
(
Message
message
)
{
...
...
@@ -159,6 +167,23 @@ public class RoomPresenter extends BasePresenter<RoomContract.View>
addSubscription
(
subscription
);
}
@Override
public
void
loadMissedMessages
()
{
RocketChatApplication
appContext
=
RocketChatApplication
.
getInstance
();
JSONObject
openedRooms
=
RocketChatCache
.
INSTANCE
.
getOpenedRooms
();
if
(
openedRooms
.
has
(
roomId
))
{
try
{
JSONObject
room
=
openedRooms
.
getJSONObject
(
roomId
);
String
rid
=
room
.
optString
(
"rid"
);
long
ls
=
room
.
optLong
(
"ls"
);
methodCallHelper
.
loadMissedMessages
(
rid
,
ls
)
.
continueWith
(
new
LogIfError
());
}
catch
(
JSONException
e
)
{
RCLog
.
e
(
e
);
}
}
}
private
String
buildReplyOrQuoteMarkdown
(
String
baseUrl
,
Message
message
,
boolean
justQuote
)
{
if
(
currentRoom
==
null
||
message
.
getUser
()
==
null
)
{
return
""
;
...
...
@@ -192,7 +217,7 @@ public class RoomPresenter extends BasePresenter<RoomContract.View>
},
throwable
->
{
view
.
enableMessageInput
();
Logger
.
report
(
throwable
);
Logger
.
INSTANCE
.
report
(
throwable
);
}
);
...
...
@@ -226,7 +251,7 @@ public class RoomPresenter extends BasePresenter<RoomContract.View>
},
throwable
->
{
view
.
enableMessageInput
();
Logger
.
report
(
throwable
);
Logger
.
INSTANCE
.
report
(
throwable
);
}
);
...
...
@@ -252,7 +277,7 @@ public class RoomPresenter extends BasePresenter<RoomContract.View>
.
observeOn
(
AndroidSchedulers
.
mainThread
())
.
subscribe
(
count
->
view
.
showUnreadCount
(
count
),
Logger
:
:
report
Logger
.
INSTANCE
::
report
);
addSubscription
(
subscription
);
...
...
@@ -270,7 +295,7 @@ public class RoomPresenter extends BasePresenter<RoomContract.View>
.
subscribe
(
room
->
methodCallHelper
.
readMessages
(
room
.
getRoomId
())
.
continueWith
(
new
LogIfError
()),
Logger
:
:
report
Logger
.
INSTANCE
::
report
);
addSubscription
(
subscription
);
...
...
@@ -287,7 +312,7 @@ public class RoomPresenter extends BasePresenter<RoomContract.View>
.
map
(
Optional:
:
get
)
.
subscribeOn
(
AndroidSchedulers
.
from
(
BackgroundLooper
.
get
()))
.
observeOn
(
AndroidSchedulers
.
mainThread
())
.
subscribe
(
this
::
processRoom
,
Logger
:
:
report
);
.
subscribe
(
this
::
processRoom
,
Logger
.
INSTANCE
::
report
);
addSubscription
(
subscription
);
}
...
...
@@ -307,7 +332,7 @@ public class RoomPresenter extends BasePresenter<RoomContract.View>
.
map
(
Optional:
:
get
)
.
subscribeOn
(
AndroidSchedulers
.
from
(
BackgroundLooper
.
get
()))
.
observeOn
(
AndroidSchedulers
.
mainThread
())
.
subscribe
(
view:
:
showUserStatus
,
Logger
:
:
report
);
.
subscribe
(
view:
:
showUserStatus
,
Logger
.
INSTANCE
::
report
);
addSubscription
(
disposable
);
}
...
...
@@ -326,7 +351,7 @@ public class RoomPresenter extends BasePresenter<RoomContract.View>
syncState
==
SyncState
.
SYNCED
||
syncState
==
SyncState
.
FAILED
);
},
Logger
:
:
report
Logger
.
INSTANCE
::
report
);
addSubscription
(
subscription
);
...
...
@@ -343,12 +368,16 @@ public class RoomPresenter extends BasePresenter<RoomContract.View>
})
.
filter
(
Optional:
:
isPresent
)
.
map
(
Optional:
:
get
)
.
map
(
room
->
{
RocketChatCache
.
INSTANCE
.
addOpenedRoom
(
room
.
getRoomId
(),
room
.
getLastSeen
());
return
room
;
})
.
flatMap
(
messageInteractor:
:
getAllFrom
)
.
subscribeOn
(
AndroidSchedulers
.
from
(
BackgroundLooper
.
get
()))
.
observeOn
(
AndroidSchedulers
.
mainThread
())
.
subscribe
(
view:
:
showMessages
,
Logger
:
:
report
Logger
.
INSTANCE
::
report
);
addSubscription
(
subscription
);
...
...
@@ -373,7 +402,7 @@ public class RoomPresenter extends BasePresenter<RoomContract.View>
view
.
manualLoadImages
();
}
},
Logger
:
:
report
Logger
.
INSTANCE
::
report
);
addSubscription
(
subscription
);
...
...
@@ -385,7 +414,7 @@ public class RoomPresenter extends BasePresenter<RoomContract.View>
.
observeOn
(
AndroidSchedulers
.
mainThread
())
.
subscribe
(
it
->
view
.
setupWith
(
it
.
orNull
()),
Logger
:
:
report
Logger
.
INSTANCE
::
report
);
addSubscription
(
subscription
);
...
...
app/src/main/java/chat/rocket/android/fragment/chatroom/dialog/MessageOptionsDialogFragment.java
View file @
8d4e96c6
...
...
@@ -91,9 +91,7 @@ public class MessageOptionsDialogFragment extends BottomSheetDialogFragment {
}
private
void
setUpDialog
(
final
BottomSheetDialog
bottomSheetDialog
,
String
messageId
)
{
RocketChatCache
cache
=
new
RocketChatCache
(
bottomSheetDialog
.
getContext
());
String
hostname
=
cache
.
getSelectedServerHostname
();
String
hostname
=
RocketChatCache
.
INSTANCE
.
getSelectedServerHostname
();
EditMessageInteractor
editMessageInteractor
=
getEditMessageInteractor
(
hostname
);
...
...
@@ -132,7 +130,7 @@ public class MessageOptionsDialogFragment extends BottomSheetDialogFragment {
((
TextView
)
bottomSheetDialog
.
findViewById
(
R
.
id
.
message_options_info
))
.
setText
(
R
.
string
.
message_options_no_message_info
);
Logger
.
report
(
throwable
);
Logger
.
INSTANCE
.
report
(
throwable
);
}
);
...
...
app/src/main/java/chat/rocket/android/fragment/oauth/OAuthPresenter.java
View file @
8d4e96c6
...
...
@@ -37,7 +37,7 @@ public class OAuthPresenter extends BasePresenter<OAuthContract.View>
view
.
close
();
}
},
Logger:
:
report
Logger
.
INSTANCE
::
report
)
);
}
...
...
app/src/main/java/chat/rocket/android/fragment/server_config/AbstractServerConfigFragment.java
View file @
8d4e96c6
...
...
@@ -8,7 +8,7 @@ import chat.rocket.android.R;
import
chat.rocket.android.fragment.AbstractFragment
;
import
chat.rocket.android.helper.TextUtils
;
abstract
class
AbstractServerConfigFragment
extends
AbstractFragment
{
public
abstract
class
AbstractServerConfigFragment
extends
AbstractFragment
{
public
static
final
String
KEY_HOSTNAME
=
"hostname"
;
protected
String
hostname
;
...
...
app/src/main/java/chat/rocket/android/fragment/server_config/LoginContract.java
View file @
8d4e96c6
...
...
@@ -18,10 +18,14 @@ public interface LoginContract {
void
showLoginServices
(
List
<
LoginServiceConfiguration
>
loginServiceList
);
void
showTwoStepAuth
();
void
goBack
();
}
interface
Presenter
extends
BaseContract
.
Presenter
<
View
>
{
void
login
(
String
username
,
String
password
);
void
goBack
();
}
}
app/src/main/java/chat/rocket/android/fragment/server_config/LoginFragment.java
deleted
100644 → 0
View file @
106791db
package
chat
.
rocket
.
android
.
fragment
.
server_config
;
import
android.os.Bundle
;
import
android.support.annotation.Nullable
;
import
android.support.constraint.ConstraintLayout
;
import
android.support.design.widget.Snackbar
;
import
android.support.v4.app.Fragment
;
import
android.view.View
;
import
android.widget.Button
;
import
android.widget.TextView
;
import
java.util.HashMap
;
import
java.util.List
;
import
chat.rocket.android.R
;
import
chat.rocket.android.api.MethodCallHelper
;
import
chat.rocket.android.layouthelper.oauth.OAuthProviderInfo
;
import
chat.rocket.android.log.RCLog
;
import
chat.rocket.core.models.LoginServiceConfiguration
;
import
chat.rocket.persistence.realm.repositories.RealmLoginServiceConfigurationRepository
;
import
chat.rocket.persistence.realm.repositories.RealmPublicSettingRepository
;
/**
* Login screen.
*/
public
class
LoginFragment
extends
AbstractServerConfigFragment
implements
LoginContract
.
View
{
private
LoginContract
.
Presenter
presenter
;
private
ConstraintLayout
container
;
private
View
waitingView
;
private
TextView
txtUsername
;
private
TextView
txtPasswd
;
@Override
protected
int
getLayout
()
{
return
R
.
layout
.
fragment_login
;
}
@Override
public
void
onCreate
(
@Nullable
Bundle
savedInstanceState
)
{
super
.
onCreate
(
savedInstanceState
);
presenter
=
new
LoginPresenter
(
new
RealmLoginServiceConfigurationRepository
(
hostname
),
new
RealmPublicSettingRepository
(
hostname
),
new
MethodCallHelper
(
getContext
(),
hostname
)
);
}
@Override
protected
void
onSetupView
()
{
container
=
rootView
.
findViewById
(
R
.
id
.
container
);
Button
btnEmail
=
rootView
.
findViewById
(
R
.
id
.
btn_login_with_email
);
Button
btnUserRegistration
=
rootView
.
findViewById
(
R
.
id
.
btn_user_registration
);
txtUsername
=
rootView
.
findViewById
(
R
.
id
.
editor_username
);
txtPasswd
=
rootView
.
findViewById
(
R
.
id
.
editor_passwd
);
waitingView
=
rootView
.
findViewById
(
R
.
id
.
waiting
);
btnEmail
.
setOnClickListener
(
view
->
presenter
.
login
(
txtUsername
.
getText
().
toString
(),
txtPasswd
.
getText
().
toString
()));
btnUserRegistration
.
setOnClickListener
(
view
->
UserRegistrationDialogFragment
.
create
(
hostname
,
txtUsername
.
getText
().
toString
(),
txtPasswd
.
getText
().
toString
())
.
show
(
getFragmentManager
(),
"UserRegistrationDialogFragment"
));
}
@Override
public
void
showLoader
()
{
container
.
setVisibility
(
View
.
GONE
);
waitingView
.
setVisibility
(
View
.
VISIBLE
);
}
@Override
public
void
hideLoader
()
{
waitingView
.
setVisibility
(
View
.
GONE
);
container
.
setVisibility
(
View
.
VISIBLE
);
}
@Override
public
void
showError
(
String
message
)
{
Snackbar
.
make
(
rootView
,
message
,
Snackbar
.
LENGTH_SHORT
).
show
();
}
@Override
public
void
showLoginServices
(
List
<
LoginServiceConfiguration
>
loginServiceList
)
{
HashMap
<
String
,
View
>
viewMap
=
new
HashMap
<>();
HashMap
<
String
,
Boolean
>
supportedMap
=
new
HashMap
<>();
for
(
OAuthProviderInfo
info
:
OAuthProviderInfo
.
LIST
)
{
viewMap
.
put
(
info
.
serviceName
,
rootView
.
findViewById
(
info
.
buttonId
));
supportedMap
.
put
(
info
.
serviceName
,
false
);
}
for
(
LoginServiceConfiguration
authProvider
:
loginServiceList
)
{
for
(
OAuthProviderInfo
info
:
OAuthProviderInfo
.
LIST
)
{
if
(!
supportedMap
.
get
(
info
.
serviceName
)
&&
info
.
serviceName
.
equals
(
authProvider
.
getService
()))
{
supportedMap
.
put
(
info
.
serviceName
,
true
);
viewMap
.
get
(
info
.
serviceName
).
setOnClickListener
(
view
->
{
Fragment
fragment
=
null
;
try
{
fragment
=
info
.
fragmentClass
.
newInstance
();
}
catch
(
Exception
exception
)
{
RCLog
.
w
(
exception
,
"failed to build new Fragment"
);
}
if
(
fragment
!=
null
)
{
Bundle
args
=
new
Bundle
();
args
.
putString
(
"hostname"
,
hostname
);
fragment
.
setArguments
(
args
);
showFragmentWithBackStack
(
fragment
);
}
});
viewMap
.
get
(
info
.
serviceName
).
setVisibility
(
View
.
VISIBLE
);
}
}
}
for
(
OAuthProviderInfo
info
:
OAuthProviderInfo
.
LIST
)
{
if
(!
supportedMap
.
get
(
info
.
serviceName
))
{
viewMap
.
get
(
info
.
serviceName
).
setVisibility
(
View
.
GONE
);
}
}
}
@Override
public
void
showTwoStepAuth
()
{
showFragmentWithBackStack
(
TwoStepAuthFragment
.
create
(
hostname
,
txtUsername
.
getText
().
toString
(),
txtPasswd
.
getText
().
toString
()
));
}
@Override
public
void
onResume
()
{
super
.
onResume
();
presenter
.
bindView
(
this
);
}
@Override
public
void
onPause
()
{
presenter
.
release
();
super
.
onPause
();
}
}
app/src/main/java/chat/rocket/android/fragment/server_config/LoginFragment.kt
0 → 100644
View file @
8d4e96c6
package
chat.rocket.android.fragment.server_config
import
android.os.Bundle
import
android.support.constraint.ConstraintLayout
import
android.support.design.widget.Snackbar
import
android.support.v4.app.Fragment
import
android.view.View
import
android.widget.Button
import
android.widget.TextView
import
chat.rocket.android.R
import
chat.rocket.android.api.MethodCallHelper
import
chat.rocket.android.layouthelper.oauth.OAuthProviderInfo
import
chat.rocket.android.log.RCLog
import
chat.rocket.core.models.LoginServiceConfiguration
import
chat.rocket.persistence.realm.repositories.RealmLoginServiceConfigurationRepository
import
chat.rocket.persistence.realm.repositories.RealmPublicSettingRepository
import
java.util.*
/**
* Login screen.
*/
class
LoginFragment
:
AbstractServerConfigFragment
(),
LoginContract
.
View
{
private
lateinit
var
presenter
:
LoginContract
.
Presenter
private
lateinit
var
container
:
ConstraintLayout
private
lateinit
var
waitingView
:
View
private
lateinit
var
txtUsername
:
TextView
private
lateinit
var
txtPasswd
:
TextView
override
fun
getLayout
():
Int
{
return
R
.
layout
.
fragment_login
}
override
fun
onCreate
(
savedInstanceState
:
Bundle
?)
{
super
.
onCreate
(
savedInstanceState
)
presenter
=
LoginPresenter
(
RealmLoginServiceConfigurationRepository
(
hostname
),
RealmPublicSettingRepository
(
hostname
),
MethodCallHelper
(
context
,
hostname
)
)
}
override
fun
onSetupView
()
{
container
=
rootView
.
findViewById
(
R
.
id
.
container
)
val
btnEmail
=
rootView
.
findViewById
<
Button
>(
R
.
id
.
btn_login_with_email
)
val
btnUserRegistration
=
rootView
.
findViewById
<
Button
>(
R
.
id
.
btn_user_registration
)
txtUsername
=
rootView
.
findViewById
(
R
.
id
.
editor_username
)
txtPasswd
=
rootView
.
findViewById
(
R
.
id
.
editor_passwd
)
waitingView
=
rootView
.
findViewById
(
R
.
id
.
waiting
)
btnEmail
.
setOnClickListener
{
_
->
presenter
.
login
(
txtUsername
.
text
.
toString
(),
txtPasswd
.
text
.
toString
())
}
btnUserRegistration
.
setOnClickListener
{
_
->
UserRegistrationDialogFragment
.
create
(
hostname
,
txtUsername
.
text
.
toString
(),
txtPasswd
.
text
.
toString
())
.
show
(
fragmentManager
!!
,
"UserRegistrationDialogFragment"
)
}
}
override
fun
showLoader
()
{
container
.
visibility
=
View
.
GONE
waitingView
.
visibility
=
View
.
VISIBLE
}
override
fun
hideLoader
()
{
waitingView
.
visibility
=
View
.
GONE
container
.
visibility
=
View
.
VISIBLE
}
override
fun
showError
(
message
:
String
)
{
Snackbar
.
make
(
rootView
,
message
,
Snackbar
.
LENGTH_SHORT
).
show
()
}
override
fun
showLoginServices
(
loginServiceList
:
List
<
LoginServiceConfiguration
>)
{
val
viewMap
=
HashMap
<
String
,
View
>()
val
supportedMap
=
HashMap
<
String
,
Boolean
>()
for
(
info
in
OAuthProviderInfo
.
LIST
)
{
viewMap
.
put
(
info
.
serviceName
,
rootView
.
findViewById
(
info
.
buttonId
))
supportedMap
.
put
(
info
.
serviceName
,
false
)
}
for
(
authProvider
in
loginServiceList
)
{
for
(
info
in
OAuthProviderInfo
.
LIST
)
{
if
(
supportedMap
[
info
.
serviceName
]
==
false
&&
info
.
serviceName
==
authProvider
.
service
)
{
supportedMap
.
put
(
info
.
serviceName
,
true
)
viewMap
[
info
.
serviceName
]
?.
setOnClickListener
{
_
->
var
fragment
:
Fragment
?
=
null
try
{
fragment
=
info
.
fragmentClass
.
newInstance
()
}
catch
(
exception
:
Exception
)
{
RCLog
.
w
(
exception
,
"failed to build new Fragment"
)
}
fragment
?.
let
{
val
args
=
Bundle
()
args
.
putString
(
"hostname"
,
hostname
)
fragment
.
arguments
=
args
showFragmentWithBackStack
(
fragment
)
}
}
viewMap
[
info
.
serviceName
]
?.
visibility
=
View
.
VISIBLE
}
}
}
for
(
info
in
OAuthProviderInfo
.
LIST
)
{
if
(
supportedMap
[
info
.
serviceName
]
==
false
)
{
viewMap
[
info
.
serviceName
]
?.
visibility
=
View
.
GONE
}
}
}
override
fun
showTwoStepAuth
()
{
showFragmentWithBackStack
(
TwoStepAuthFragment
.
create
(
hostname
,
txtUsername
.
text
.
toString
(),
txtPasswd
.
text
.
toString
()
))
}
override
fun
onResume
()
{
super
.
onResume
()
presenter
.
bindView
(
this
)
}
override
fun
onPause
()
{
presenter
.
release
()
super
.
onPause
()
}
override
fun
goBack
()
{
presenter
.
goBack
()
}
}
app/src/main/java/chat/rocket/android/fragment/server_config/LoginPresenter.java
deleted
100644 → 0
View file @
106791db
package
chat
.
rocket
.
android
.
fragment
.
server_config
;
import
android.support.annotation.NonNull
;
import
com.hadisatrio.optional.Optional
;
import
bolts.Task
;
import
chat.rocket.android.BackgroundLooper
;
import
chat.rocket.android.api.MethodCallHelper
;
import
chat.rocket.android.api.TwoStepAuthException
;
import
chat.rocket.android.helper.Logger
;
import
chat.rocket.android.helper.TextUtils
;
import
chat.rocket.android.shared.BasePresenter
;
import
chat.rocket.core.PublicSettingsConstants
;
import
chat.rocket.core.models.PublicSetting
;
import
chat.rocket.core.repositories.LoginServiceConfigurationRepository
;
import
chat.rocket.core.repositories.PublicSettingRepository
;
import
io.reactivex.android.schedulers.AndroidSchedulers
;
public
class
LoginPresenter
extends
BasePresenter
<
LoginContract
.
View
>
implements
LoginContract
.
Presenter
{
private
final
LoginServiceConfigurationRepository
loginServiceConfigurationRepository
;
private
final
PublicSettingRepository
publicSettingRepository
;
private
final
MethodCallHelper
methodCallHelper
;
public
LoginPresenter
(
LoginServiceConfigurationRepository
loginServiceConfigurationRepository
,
PublicSettingRepository
publicSettingRepository
,
MethodCallHelper
methodCallHelper
)
{
this
.
loginServiceConfigurationRepository
=
loginServiceConfigurationRepository
;
this
.
publicSettingRepository
=
publicSettingRepository
;
this
.
methodCallHelper
=
methodCallHelper
;
}
@Override
public
void
bindView
(
@NonNull
LoginContract
.
View
view
)
{
super
.
bindView
(
view
);
getLoginServices
();
}
@Override
public
void
login
(
String
username
,
String
password
)
{
if
(
TextUtils
.
isEmpty
(
username
)
||
TextUtils
.
isEmpty
(
password
))
{
return
;
}
view
.
showLoader
();
addSubscription
(
publicSettingRepository
.
getById
(
PublicSettingsConstants
.
LDAP
.
ENABLE
)
.
subscribeOn
(
AndroidSchedulers
.
from
(
BackgroundLooper
.
get
()))
.
observeOn
(
AndroidSchedulers
.
mainThread
())
.
subscribe
(
publicSettingOptional
->
doLogin
(
username
,
password
,
publicSettingOptional
),
Logger:
:
report
)
);
}
private
void
getLoginServices
()
{
addSubscription
(
loginServiceConfigurationRepository
.
getAll
()
.
subscribeOn
(
AndroidSchedulers
.
from
(
BackgroundLooper
.
get
()))
.
observeOn
(
AndroidSchedulers
.
mainThread
())
.
subscribe
(
loginServiceConfigurations
->
view
.
showLoginServices
(
loginServiceConfigurations
),
Logger:
:
report
)
);
}
private
void
doLogin
(
String
username
,
String
password
,
Optional
<
PublicSetting
>
optional
)
{
call
(
username
,
password
,
optional
)
.
continueWith
(
task
->
{
if
(
task
.
isFaulted
())
{
view
.
hideLoader
();
final
Exception
error
=
task
.
getError
();
if
(
error
instanceof
TwoStepAuthException
)
{
view
.
showTwoStepAuth
();
}
else
{
view
.
showError
(
error
.
getMessage
());
}
}
return
null
;
},
Task
.
UI_THREAD_EXECUTOR
);
}
private
Task
<
Void
>
call
(
String
username
,
String
password
,
Optional
<
PublicSetting
>
optional
)
{
if
(
optional
.
isPresent
()
&&
optional
.
get
().
getValueAsBoolean
())
{
return
methodCallHelper
.
loginWithLdap
(
username
,
password
);
}
return
methodCallHelper
.
loginWithEmail
(
username
,
password
);
}
}
app/src/main/java/chat/rocket/android/fragment/server_config/LoginPresenter.kt
0 → 100644
View file @
8d4e96c6
package
chat.rocket.android.fragment.server_config
import
bolts.Continuation
import
bolts.Task
import
chat.rocket.android.BackgroundLooper
import
chat.rocket.android.LaunchUtil
import
chat.rocket.android.RocketChatApplication
import
chat.rocket.android.RocketChatCache
import
chat.rocket.android.api.MethodCallHelper
import
chat.rocket.android.api.TwoStepAuthException
import
chat.rocket.android.helper.Logger
import
chat.rocket.android.helper.TextUtils
import
chat.rocket.android.service.ConnectivityManager
import
chat.rocket.android.shared.BasePresenter
import
chat.rocket.core.PublicSettingsConstants
import
chat.rocket.core.models.PublicSetting
import
chat.rocket.core.repositories.LoginServiceConfigurationRepository
import
chat.rocket.core.repositories.PublicSettingRepository
import
com.hadisatrio.optional.Optional
import
io.reactivex.Completable
import
io.reactivex.android.schedulers.AndroidSchedulers
import
io.reactivex.rxkotlin.subscribeBy
class
LoginPresenter
(
private
val
loginServiceConfigurationRepository
:
LoginServiceConfigurationRepository
,
private
val
publicSettingRepository
:
PublicSettingRepository
,
private
val
methodCallHelper
:
MethodCallHelper
)
:
BasePresenter
<
LoginContract
.
View
>(),
LoginContract
.
Presenter
{
override
fun
bindView
(
view
:
LoginContract
.
View
)
{
super
.
bindView
(
view
)
getLoginServices
()
}
override
fun
goBack
()
{
val
context
=
RocketChatApplication
.
getInstance
()
val
hostname
=
RocketChatCache
.
getSelectedServerHostname
()
hostname
?.
let
{
ConnectivityManager
.
getInstance
(
context
).
removeServer
(
hostname
)
RocketChatCache
.
clearSelectedHostnameReferences
()
}
LaunchUtil
.
showMainActivity
(
context
)
}
override
fun
login
(
username
:
String
,
password
:
String
)
{
if
(
TextUtils
.
isEmpty
(
username
)
||
TextUtils
.
isEmpty
(
password
))
{
return
}
view
.
showLoader
()
addSubscription
(
publicSettingRepository
.
getById
(
PublicSettingsConstants
.
LDAP
.
ENABLE
)
.
subscribeOn
(
AndroidSchedulers
.
from
(
BackgroundLooper
.
get
()))
.
observeOn
(
AndroidSchedulers
.
mainThread
())
.
subscribeBy
(
onSuccess
=
{
publicSettingOptional
->
doLogin
(
username
,
password
,
publicSettingOptional
)
},
onError
=
{
Logger
.
report
(
it
)
}
)
)
}
private
fun
getLoginServices
()
{
addSubscription
(
loginServiceConfigurationRepository
.
all
.
subscribeOn
(
AndroidSchedulers
.
from
(
BackgroundLooper
.
get
()))
.
observeOn
(
AndroidSchedulers
.
mainThread
())
.
subscribeBy
(
onNext
=
{
loginServiceConfigurations
->
view
.
showLoginServices
(
loginServiceConfigurations
);
},
onError
=
{
Logger
.
report
(
it
)
}
)
)
}
private
fun
doLogin
(
username
:
String
,
password
:
String
,
optional
:
Optional
<
PublicSetting
>)
{
addSubscription
(
Completable
.
create
{
call
(
username
,
password
,
optional
)
.
continueWith
(
object
:
Continuation
<
Void
,
Any
?>
{
override
fun
then
(
task
:
Task
<
Void
>?):
Any
?
{
if
(
task
!=
null
&&
task
.
isFaulted
())
{
view
.
hideLoader
()
val
error
=
task
.
getError
()
error
?.
let
{
if
(
error
is
TwoStepAuthException
)
{
view
.
showTwoStepAuth
()
}
else
{
view
.
showError
(
error
.
message
)
}
}
return
Completable
.
complete
()
}
return
null
}
},
Task
.
UI_THREAD_EXECUTOR
)
}.
subscribeBy
(
onError
=
{
view
.
showError
(
it
.
message
)
}
)
)
}
private
fun
call
(
username
:
String
,
password
:
String
,
optional
:
Optional
<
PublicSetting
>):
Task
<
Void
>
{
return
if
(
optional
.
isPresent
&&
optional
.
get
().
valueAsBoolean
)
{
methodCallHelper
.
loginWithLdap
(
username
,
password
)
}
else
methodCallHelper
.
loginWithEmail
(
username
,
password
)
}
}
app/src/main/java/chat/rocket/android/fragment/server_config/RetryLoginPresenter.java
View file @
8d4e96c6
...
...
@@ -52,7 +52,7 @@ public class RetryLoginPresenter extends BasePresenter<RetryLoginContract.View>
.
observeOn
(
AndroidSchedulers
.
mainThread
())
.
subscribe
(
this
::
onSession
,
Logger:
:
report
Logger
.
INSTANCE
::
report
)
);
}
...
...
app/src/main/java/chat/rocket/android/fragment/sidebar/SidebarMainFragment.java
View file @
8d4e96c6
...
...
@@ -24,7 +24,6 @@ import java.util.List;
import
chat.rocket.android.BuildConfig
;
import
chat.rocket.android.R
;
import
chat.rocket.android.RocketChatCache
;
import
chat.rocket.android.activity.MainActivity
;
import
chat.rocket.android.api.MethodCallHelper
;
import
chat.rocket.android.fragment.AbstractFragment
;
...
...
@@ -94,13 +93,11 @@ public class SidebarMainFragment extends AbstractFragment implements SidebarMain
new
SessionInteractor
(
new
RealmSessionRepository
(
hostname
))
);
RocketChatCache
rocketChatCache
=
new
RocketChatCache
(
getContext
().
getApplicationContext
());
presenter
=
new
SidebarMainPresenter
(
hostname
,
new
RoomInteractor
(
new
RealmRoomRepository
(
hostname
)),
userRepository
,
rocketChatCache
,
absoluteUrlHelper
,
new
MethodCallHelper
(
getContext
(),
hostname
),
new
RealmSpotlightRepository
(
hostname
)
...
...
@@ -239,7 +236,7 @@ public class SidebarMainFragment extends AbstractFragment implements SidebarMain
.
compose
(
bindToLifecycle
())
.
subscribe
(
this
::
showUserActionContainer
,
Logger:
:
report
Logger
.
INSTANCE
::
report
);
}
...
...
app/src/main/java/chat/rocket/android/fragment/sidebar/SidebarMainPresenter.java
View file @
8d4e96c6
...
...
@@ -38,7 +38,6 @@ public class SidebarMainPresenter extends BasePresenter<SidebarMainContract.View
private
final
String
hostname
;
private
final
RoomInteractor
roomInteractor
;
private
final
UserRepository
userRepository
;
private
final
RocketChatCache
rocketChatCache
;
private
final
AbsoluteUrlHelper
absoluteUrlHelper
;
private
final
MethodCallHelper
methodCallHelper
;
private
SpotlightRepository
realmSpotlightRepository
;
...
...
@@ -47,14 +46,12 @@ public class SidebarMainPresenter extends BasePresenter<SidebarMainContract.View
public
SidebarMainPresenter
(
String
hostname
,
RoomInteractor
roomInteractor
,
UserRepository
userRepository
,
RocketChatCache
rocketChatCache
,
AbsoluteUrlHelper
absoluteUrlHelper
,
MethodCallHelper
methodCallHelper
,
RealmSpotlightRepository
realmSpotlightRepository
)
{
this
.
hostname
=
hostname
;
this
.
roomInteractor
=
roomInteractor
;
this
.
userRepository
=
userRepository
;
this
.
rocketChatCache
=
rocketChatCache
;
this
.
absoluteUrlHelper
=
absoluteUrlHelper
;
this
.
methodCallHelper
=
methodCallHelper
;
this
.
realmSpotlightRepository
=
realmSpotlightRepository
;
...
...
@@ -80,14 +77,14 @@ public class SidebarMainPresenter extends BasePresenter<SidebarMainContract.View
)
.
subscribeOn
(
AndroidSchedulers
.
from
(
BackgroundLooper
.
get
()))
.
observeOn
(
AndroidSchedulers
.
mainThread
())
.
subscribe
(
pair
->
view
.
show
(
pair
.
first
.
orNull
()),
Logger:
:
report
);
.
subscribe
(
pair
->
view
.
show
(
pair
.
first
.
orNull
()),
Logger
.
INSTANCE
::
report
);
addSubscription
(
subscription
);
}
@Override
public
void
onRoomSelected
(
RoomSidebar
roomSidebar
)
{
rocketChatCache
.
setSelectedRoomId
(
roomSidebar
.
getRoomId
());
RocketChatCache
.
INSTANCE
.
setSelectedRoomId
(
roomSidebar
.
getRoomId
());
}
@Override
...
...
@@ -103,7 +100,7 @@ public class SidebarMainPresenter extends BasePresenter<SidebarMainContract.View
methodCallHelper
.
createDirectMessage
(
username
)
.
continueWithTask
(
task
->
{
if
(
task
.
isCompleted
())
{
rocketChatCache
.
setSelectedRoomId
(
task
.
getResult
());
RocketChatCache
.
INSTANCE
.
setSelectedRoomId
(
task
.
getResult
());
}
return
null
;
});
...
...
@@ -111,7 +108,7 @@ public class SidebarMainPresenter extends BasePresenter<SidebarMainContract.View
methodCallHelper
.
joinRoom
(
spotlight
.
getId
())
.
continueWithTask
(
task
->
{
if
(
task
.
isCompleted
())
{
rocketChatCache
.
setSelectedRoomId
(
spotlight
.
getId
());
RocketChatCache
.
INSTANCE
.
setSelectedRoomId
(
spotlight
.
getId
());
}
return
null
;
});
...
...
@@ -142,7 +139,7 @@ public class SidebarMainPresenter extends BasePresenter<SidebarMainContract.View
public
void
onLogout
(
Continuation
<
Void
,
Object
>
continuation
)
{
methodCallHelper
.
logout
().
continueWith
(
task
->
{
if
(
task
.
isFaulted
())
{
Logger
.
report
(
task
.
getError
());
Logger
.
INSTANCE
.
report
(
task
.
getError
());
return
Task
.
forError
(
task
.
getError
());
}
return
task
.
onSuccess
(
continuation
);
...
...
@@ -157,12 +154,12 @@ public class SidebarMainPresenter extends BasePresenter<SidebarMainContract.View
}
clearSubscriptions
();
String
currentHostname
=
rocketChatCache
.
getSelectedServerHostname
();
String
currentHostname
=
RocketChatCache
.
INSTANCE
.
getSelectedServerHostname
();
RealmHelper
realmHelper
=
RealmStore
.
getOrCreate
(
currentHostname
);
return
realmHelper
.
executeTransaction
(
realm
->
{
rocketChatCache
.
removeHostname
(
currentHostname
);
rocketChatCache
.
removeSelectedRoomId
(
currentHostname
);
rocketChatCache
.
setSelectedServerHostname
(
rocketChatCache
.
getFirstLoggedHostnameIfAny
());
RocketChatCache
.
INSTANCE
.
removeHostname
(
currentHostname
);
RocketChatCache
.
INSTANCE
.
removeSelectedRoomId
(
currentHostname
);
RocketChatCache
.
INSTANCE
.
setSelectedServerHostname
(
RocketChatCache
.
INSTANCE
.
getFirstLoggedHostnameIfAny
());
realm
.
executeTransactionAsync
(
Realm:
:
deleteAll
);
view
.
onPreparedToLogOut
();
ConnectivityManager
.
getInstance
(
RocketChatApplication
.
getInstance
())
...
...
@@ -183,7 +180,7 @@ public class SidebarMainPresenter extends BasePresenter<SidebarMainContract.View
.
distinctUntilChanged
()
.
subscribeOn
(
AndroidSchedulers
.
from
(
BackgroundLooper
.
get
()))
.
observeOn
(
AndroidSchedulers
.
mainThread
())
.
subscribe
(
this
::
processRooms
,
Logger:
:
report
);
.
subscribe
(
this
::
processRooms
,
Logger
.
INSTANCE
::
report
);
addSubscription
(
subscription
);
}
...
...
@@ -227,7 +224,7 @@ public class SidebarMainPresenter extends BasePresenter<SidebarMainContract.View
.
distinctUntilChanged
()
.
subscribeOn
(
AndroidSchedulers
.
from
(
BackgroundLooper
.
get
()))
.
observeOn
(
AndroidSchedulers
.
mainThread
())
.
subscribe
(
this
::
processUsers
,
Logger:
:
report
);
.
subscribe
(
this
::
processUsers
,
Logger
.
INSTANCE
::
report
);
addSubscription
(
subscription
);
}
...
...
app/src/main/java/chat/rocket/android/fragment/sidebar/dialog/AddChannelDialogFragment.java
View file @
8d4e96c6
...
...
@@ -47,7 +47,7 @@ public class AddChannelDialogFragment extends AbstractAddRoomDialogFragment {
.
compose
(
bindToLifecycle
())
.
subscribe
(
buttonAddChannel:
:
setEnabled
,
Logger:
:
report
Logger
.
INSTANCE
::
report
);
buttonAddChannel
.
setOnClickListener
(
view
->
createRoom
());
...
...
app/src/main/java/chat/rocket/android/fragment/sidebar/dialog/AddDirectMessageDialogFragment.java
View file @
8d4e96c6
...
...
@@ -68,7 +68,7 @@ public class AddDirectMessageDialogFragment extends AbstractAddRoomDialogFragmen
.
observeOn
(
AndroidSchedulers
.
mainThread
())
.
subscribe
(
this
::
setupView
,
Logger:
:
report
Logger
.
INSTANCE
::
report
)
);
...
...
@@ -77,7 +77,7 @@ public class AddDirectMessageDialogFragment extends AbstractAddRoomDialogFragmen
.
compose
(
bindToLifecycle
())
.
subscribe
(
buttonAddDirectMessage:
:
setEnabled
,
Logger:
:
report
Logger
.
INSTANCE
::
report
);
buttonAddDirectMessage
.
setOnClickListener
(
view
->
createRoom
());
...
...
app/src/main/java/chat/rocket/android/helper/Logger.java
deleted
100644 → 0
View file @
106791db
package
chat
.
rocket
.
android
.
helper
;
import
com.crashlytics.android.Crashlytics
;
import
com.google.firebase.crash.FirebaseCrash
;
public
class
Logger
{
public
static
void
report
(
Throwable
throwable
)
{
FirebaseCrash
.
report
(
throwable
);
Crashlytics
.
logException
(
throwable
);
}
}
app/src/main/java/chat/rocket/android/helper/Logger.kt
0 → 100644
View file @
8d4e96c6
package
chat.rocket.android.helper
import
chat.rocket.android.BuildConfig
import
com.crashlytics.android.Crashlytics
import
com.google.firebase.crash.FirebaseCrash
object
Logger
{
fun
report
(
throwable
:
Throwable
)
{
if
(
BuildConfig
.
DEBUG
)
{
throwable
.
printStackTrace
()
}
FirebaseCrash
.
report
(
throwable
)
Crashlytics
.
logException
(
throwable
)
}
}
app/src/main/java/chat/rocket/android/layouthelper/chatroom/MessagePopup.java
View file @
8d4e96c6
...
...
@@ -48,9 +48,7 @@ public class MessagePopup {
}
private
void
showAvailableActionsOnly
(
Context
context
)
{
RocketChatCache
cache
=
new
RocketChatCache
(
context
.
getApplicationContext
());
String
hostname
=
cache
.
getSelectedServerHostname
();
String
hostname
=
RocketChatCache
.
INSTANCE
.
getSelectedServerHostname
();
EditMessageInteractor
editMessageInteractor
=
getEditMessageInteractor
(
hostname
);
...
...
@@ -102,7 +100,7 @@ public class MessagePopup {
.
create
()
.
show
();
},
Logger:
:
report
Logger
.
INSTANCE
::
report
);
compositeDisposable
.
add
(
disposable
);
}
...
...
@@ -167,7 +165,7 @@ public class MessagePopup {
}
public
MessagePopup
setDeleteAction
(
ActionListener
actionListener
)
{
DELETE_ACTION_INFO
.
actionListener
=
actionListener
;
DELETE_ACTION_INFO
.
actionListener
=
actionListener
;
return
singleton
;
}
...
...
app/src/main/java/chat/rocket/android/layouthelper/chatroom/roomlist/RoomListItemViewHolder.java
View file @
8d4e96c6
...
...
@@ -101,7 +101,7 @@ public class RoomListItemViewHolder extends RecyclerView.ViewHolder {
break
;
default
:
{
itemView
.
showPrivateChannelIcon
();
Logger
.
report
(
new
AssertionError
(
"Room type doesn't satisfies the method documentation. Room type is:"
+
roomType
));
Logger
.
INSTANCE
.
report
(
new
AssertionError
(
"Room type doesn't satisfies the method documentation. Room type is:"
+
roomType
));
}
}
}
...
...
app/src/main/java/chat/rocket/android/push/PushManager.kt
View file @
8d4e96c6
package
chat.rocket.android.push
import
android.annotation.SuppressLint
import
android.app.Notification
import
android.app.NotificationChannel
import
android.app.NotificationManager
...
...
@@ -137,6 +138,7 @@ object PushManager {
return
group
}
@SuppressLint
(
"NewApi"
)
internal
fun
showNotification
(
context
:
Context
,
lastPushMessage
:
PushMessage
)
{
if
(
lastPushMessage
.
host
==
null
||
lastPushMessage
.
message
==
null
||
lastPushMessage
.
title
==
null
)
{
return
...
...
@@ -202,7 +204,7 @@ object PushManager {
.
setDeleteIntent
(
deleteIntent
)
.
setMessageNotification
()
val
subText
=
RocketChatCache
(
context
)
.
getHostSiteName
(
host
)
val
subText
=
RocketChatCache
.
getHostSiteName
(
host
)
if
(
subText
.
isNotEmpty
())
{
builder
.
setSubText
(
subText
)
}
...
...
@@ -257,6 +259,7 @@ object PushManager {
}
}
@SuppressLint
(
"NewApi"
)
@RequiresApi
(
Build
.
VERSION_CODES
.
N
)
internal
fun
createGroupNotificationForNougatAndAbove
(
context
:
Context
,
lastPushMessage
:
PushMessage
):
Notification
?
{
with
(
lastPushMessage
)
{
...
...
@@ -289,7 +292,7 @@ object PushManager {
manager
.
createNotificationChannel
(
groupChannel
)
}
val
subText
=
RocketChatCache
(
context
)
.
getHostSiteName
(
host
)
val
subText
=
RocketChatCache
.
getHostSiteName
(
host
)
if
(
subText
.
isNotEmpty
())
{
builder
.
setSubText
(
subText
)
}
...
...
@@ -344,7 +347,7 @@ object PushManager {
.
setContentIntent
(
contentIntent
)
.
setMessageNotification
()
val
subText
=
RocketChatCache
(
context
)
.
getHostSiteName
(
host
)
val
subText
=
RocketChatCache
.
getHostSiteName
(
host
)
if
(
subText
.
isNotEmpty
())
{
builder
.
setSubText
(
subText
)
}
...
...
@@ -370,6 +373,7 @@ object PushManager {
}
}
@SuppressLint
(
"NewApi"
)
@RequiresApi
(
Build
.
VERSION_CODES
.
N
)
internal
fun
createSingleNotificationForNougatAndAbove
(
context
:
Context
,
lastPushMessage
:
PushMessage
):
Notification
?
{
val
manager
:
NotificationManager
=
...
...
@@ -404,7 +408,7 @@ object PushManager {
manager
.
createNotificationChannel
(
channel
)
}
val
subText
=
RocketChatCache
(
context
)
.
getHostSiteName
(
host
)
val
subText
=
RocketChatCache
.
getHostSiteName
(
host
)
if
(
subText
.
isNotEmpty
())
{
builder
.
setSubText
(
subText
)
}
...
...
@@ -503,6 +507,7 @@ object PushManager {
setAutoCancel
(
true
)
setShowWhen
(
true
)
setColor
(
res
.
getColor
(
R
.
color
.
colorRed400
,
ctx
.
theme
))
setDefaults
(
Notification
.
DEFAULT_ALL
)
setSmallIcon
(
smallIcon
)
})
return
this
...
...
@@ -646,7 +651,7 @@ object PushManager {
}
val
httpUrl
=
HttpUrl
.
parse
(
pushMessage
.
host
)
httpUrl
?.
let
{
val
siteUrl
=
RocketChatCache
(
context
)
.
getSiteUrlFor
(
httpUrl
.
host
())
val
siteUrl
=
RocketChatCache
.
getSiteUrlFor
(
httpUrl
.
host
())
if
(
siteUrl
!=
null
)
{
sendMessage
(
siteUrl
,
message
,
pushMessage
.
rid
)
}
...
...
@@ -693,7 +698,6 @@ object PushManager {
.
subscribe
({
_
->
// Empty
},
{
throwable
->
throwable
.
printStackTrace
()
Logger
.
report
(
throwable
)
})
}
...
...
app/src/main/java/chat/rocket/android/service/ConnectivityManagerApi.java
View file @
8d4e96c6
...
...
@@ -28,4 +28,8 @@ public interface ConnectivityManagerApi {
int
getConnectivityState
(
@NonNull
String
hostname
);
void
resetConnectivityStateList
();
void
notifySessionEstablished
(
String
hostname
);
void
notifyConnecting
(
String
hostname
);
}
app/src/main/java/chat/rocket/android/service/KeepAliveJob.kt
0 → 100644
View file @
8d4e96c6
package
chat.rocket.android.service
import
chat.rocket.android.ConnectionStatusManager
import
chat.rocket.android.RocketChatApplication
import
com.evernote.android.job.Job
import
com.evernote.android.job.JobManager
import
com.evernote.android.job.JobRequest
import
java.util.concurrent.TimeUnit
class
KeepAliveJob
:
Job
()
{
private
val
connectivityManager
:
ConnectivityManagerApi
companion
object
{
val
TAG
=
"chat.rocket.android.service.KeepAliveJob"
fun
schedule
()
{
JobRequest
.
Builder
(
TAG
)
.
setExecutionWindow
(
TimeUnit
.
SECONDS
.
toMillis
(
3L
),
TimeUnit
.
SECONDS
.
toMillis
(
10L
))
.
setBackoffCriteria
(
10L
,
JobRequest
.
BackoffPolicy
.
EXPONENTIAL
)
.
setUpdateCurrent
(
true
)
.
setRequiredNetworkType
(
JobRequest
.
NetworkType
.
CONNECTED
)
.
setRequiresCharging
(
false
)
.
setRequirementsEnforced
(
true
)
.
build
()
.
schedule
()
}
fun
cancelPendingJobRequests
()
{
val
allJobRequests
=
JobManager
.
instance
().
getAllJobRequestsForTag
(
TAG
)
allJobRequests
.
forEach
{
jobRequest
->
jobRequest
.
cancelAndEdit
()
}
}
}
init
{
val
context
=
RocketChatApplication
.
getInstance
()
connectivityManager
=
ConnectivityManager
.
getInstance
(
context
)
}
override
fun
onRunJob
(
params
:
Params
):
Result
{
if
(
ConnectionStatusManager
.
transitionCount
()
==
0L
)
{
return
Result
.
SUCCESS
}
when
(
ConnectionStatusManager
.
currentState
())
{
ConnectionStatusManager
.
State
.
CONNECTING
,
ConnectionStatusManager
.
State
.
ONLINE
->
{
cancel
()
}
else
->
connectivityManager
.
keepAliveServer
()
}
return
Result
.
SUCCESS
}
}
\ No newline at end of file
app/src/main/java/chat/rocket/android/service/RealmBasedConnectivityManager.java
View file @
8d4e96c6
...
...
@@ -14,6 +14,7 @@ import java.util.Map;
import
java.util.concurrent.ConcurrentHashMap
;
import
java.util.concurrent.TimeUnit
;
import
chat.rocket.android.ConnectionStatusManager
;
import
chat.rocket.android.RocketChatCache
;
import
chat.rocket.android.helper.RxHelper
;
import
chat.rocket.android.log.RCLog
;
...
...
@@ -74,7 +75,7 @@ import io.reactivex.subjects.BehaviorSubject;
@DebugLog
@Override
public
void
ensureConnections
()
{
String
hostname
=
new
RocketChatCache
(
appContext
)
.
getSelectedServerHostname
();
String
hostname
=
RocketChatCache
.
INSTANCE
.
getSelectedServerHostname
();
if
(
hostname
==
null
)
{
return
;
}
...
...
@@ -107,7 +108,7 @@ import io.reactivex.subjects.BehaviorSubject;
public
void
removeServer
(
String
hostname
)
{
RealmBasedServerInfo
.
remove
(
hostname
);
if
(
serverConnectivityList
.
containsKey
(
hostname
))
{
disconnectFromServerIfNeeded
(
hostname
)
disconnectFromServerIfNeeded
(
hostname
,
DDPClient
.
REASON_CLOSED_BY_USER
)
.
subscribe
(
_val
->
{
},
RCLog:
:
e
);
}
...
...
@@ -136,6 +137,13 @@ import io.reactivex.subjects.BehaviorSubject;
return
list
;
}
@Override
public
void
notifySessionEstablished
(
String
hostname
)
{
serverConnectivityList
.
put
(
hostname
,
ServerConnectivity
.
STATE_SESSION_ESTABLISHED
);
connectivitySubject
.
onNext
(
new
ServerConnectivity
(
hostname
,
ServerConnectivity
.
STATE_SESSION_ESTABLISHED
));
}
@DebugLog
@Override
public
void
notifyConnectionEstablished
(
String
hostname
,
String
session
)
{
...
...
@@ -200,7 +208,7 @@ import io.reactivex.subjects.BehaviorSubject;
});
}
private
Single
<
Boolean
>
disconnectFromServerIfNeeded
(
String
hostname
)
{
private
Single
<
Boolean
>
disconnectFromServerIfNeeded
(
String
hostname
,
int
reason
)
{
return
Single
.
defer
(()
->
{
final
int
connectivity
=
serverConnectivityList
.
get
(
hostname
);
if
(
connectivity
==
ServerConnectivity
.
STATE_DISCONNECTED
)
{
...
...
@@ -209,8 +217,8 @@ import io.reactivex.subjects.BehaviorSubject;
if
(
connectivity
==
ServerConnectivity
.
STATE_CONNECTING
)
{
return
waitForConnected
(
hostname
)
.
doOnError
(
err
->
notifyConnectionLost
(
hostname
,
DDPClient
.
REASON_NETWORK_ERRO
R
))
.
flatMap
(
_val
->
disconnectFromServerIfNeeded
(
hostname
));
// .doOnError(err -> notifyConnectionLost(hostname, DDPClient.REASON_CLOSED_BY_USE
R))
.
flatMap
(
_val
->
disconnectFromServerIfNeeded
(
hostname
,
DDPClient
.
REASON_CLOSED_BY_USER
));
}
if
(
connectivity
==
ServerConnectivity
.
STATE_DISCONNECTING
)
{
...
...
@@ -253,6 +261,7 @@ import io.reactivex.subjects.BehaviorSubject;
private
Single
<
Boolean
>
connectToServer
(
String
hostname
)
{
return
Single
.
defer
(()
->
{
if
(!
serverConnectivityList
.
containsKey
(
hostname
))
{
ConnectionStatusManager
.
INSTANCE
.
setConnectionError
();
return
Single
.
error
(
new
IllegalArgumentException
(
"hostname not found"
));
}
...
...
@@ -263,8 +272,10 @@ import io.reactivex.subjects.BehaviorSubject;
}
if
(
serviceInterface
!=
null
)
{
ConnectionStatusManager
.
INSTANCE
.
setConnecting
();
return
serviceInterface
.
ensureConnectionToServer
(
hostname
);
}
else
{
ConnectionStatusManager
.
INSTANCE
.
setConnectionError
();
return
Single
.
error
(
new
ThreadLooperNotPreparedException
(
"not prepared"
));
}
});
...
...
app/src/main/java/chat/rocket/android/service/RocketChatService.java
View file @
8d4e96c6
...
...
@@ -38,7 +38,8 @@ public class RocketChatService extends Service implements ConnectivityServiceInt
/**
* ensure RocketChatService alive.
*/
/*package*/
static
void
keepAlive
(
Context
context
)
{
/*package*/
static
void
keepAlive
(
Context
context
)
{
context
.
startService
(
new
Intent
(
context
,
RocketChatService
.
class
));
}
...
...
@@ -80,7 +81,7 @@ public class RocketChatService extends Service implements ConnectivityServiceInt
}
if
(
currentWebSocketThread
!=
null
)
{
return
currentWebSocketThread
.
terminate
()
return
currentWebSocketThread
.
terminate
(
false
)
// after disconnection from server
.
doAfterTerminate
(()
->
{
currentWebSocketThread
=
null
;
...
...
@@ -99,14 +100,15 @@ public class RocketChatService extends Service implements ConnectivityServiceInt
return
Single
.
defer
(()
->
{
webSocketThreadLock
.
acquire
();
int
connectivityState
=
ConnectivityManager
.
getInstance
(
getApplicationContext
()).
getConnectivityState
(
hostname
);
boolean
isDisconnected
=
connectivityState
!=
ServerConnectivity
.
STATE_CONNECTED
;
boolean
isDisconnected
=
connectivityState
<
ServerConnectivity
.
STATE_CONNECTED
;
if
(
currentWebSocketThread
!=
null
&&
existsThreadForHostname
(
hostname
)
&&
!
isDisconnected
)
{
webSocketThreadLock
.
release
();
return
Single
.
just
(
currentWebSocketThread
);
}
if
(
currentWebSocketThread
!=
null
)
{
return
currentWebSocketThread
.
terminate
()
boolean
hasFailed
=
existsThreadForHostname
(
hostname
);
return
currentWebSocketThread
.
terminate
(
hasFailed
)
.
doAfterTerminate
(()
->
currentWebSocketThread
=
null
)
.
flatMap
(
terminated
->
RocketChatWebSocketThread
.
getStarted
(
getApplicationContext
(),
hostname
)
...
...
@@ -117,7 +119,7 @@ public class RocketChatService extends Service implements ConnectivityServiceInt
.
doOnError
(
throwable
->
{
currentWebSocketThread
=
null
;
RCLog
.
e
(
throwable
);
Logger
.
report
(
throwable
);
Logger
.
INSTANCE
.
report
(
throwable
);
webSocketThreadLock
.
release
();
})
);
...
...
@@ -131,7 +133,7 @@ public class RocketChatService extends Service implements ConnectivityServiceInt
.
doOnError
(
throwable
->
{
currentWebSocketThread
=
null
;
RCLog
.
e
(
throwable
);
Logger
.
report
(
throwable
);
Logger
.
INSTANCE
.
report
(
throwable
);
webSocketThreadLock
.
release
();
});
});
...
...
app/src/main/java/chat/rocket/android/service/RocketChatWebSocketThread.java
View file @
8d4e96c6
...
...
@@ -14,6 +14,7 @@ import java.util.concurrent.TimeUnit;
import
java.util.concurrent.TimeoutException
;
import
bolts.Task
;
import
chat.rocket.android.ConnectionStatusManager
;
import
chat.rocket.android.api.MethodCallHelper
;
import
chat.rocket.android.helper.LogIfError
;
import
chat.rocket.android.helper.RxHelper
;
...
...
@@ -29,7 +30,6 @@ import chat.rocket.android.service.observer.FileUploadingWithUfsObserver;
import
chat.rocket.android.service.observer.GcmPushRegistrationObserver
;
import
chat.rocket.android.service.observer.GetUsersOfRoomsProcedureObserver
;
import
chat.rocket.android.service.observer.LoadMessageProcedureObserver
;
import
chat.rocket.android.service.observer.MethodCallObserver
;
import
chat.rocket.android.service.observer.NewMessageObserver
;
import
chat.rocket.android.service.observer.PushSettingsObserver
;
import
chat.rocket.android.service.observer.SessionObserver
;
...
...
@@ -54,8 +54,7 @@ public class RocketChatWebSocketThread extends HandlerThread {
LoginServiceConfigurationSubscriber
.
class
,
ActiveUsersSubscriber
.
class
,
UserDataSubscriber
.
class
,
MethodCallObserver
.
class
,
SessionObserver
.
class
,
// MethodCallObserver.class,
LoadMessageProcedureObserver
.
class
,
GetUsersOfRoomsProcedureObserver
.
class
,
NewMessageObserver
.
class
,
...
...
@@ -125,21 +124,26 @@ public class RocketChatWebSocketThread extends HandlerThread {
}
/**
* terminate WebSocket thread.
* Terminate WebSocket thread. If {@code hasFailed} is {@code true} it means that a connection was
* in progress but failed and got offline. If it's {@code false} means that the user explicitly
* disconnected from server either by logging out or by means of changing servers.
*
* @param hasFailed {@code true} if the termination is due to a network error, otherwise
* return false
*/
@DebugLog
/* package */
Single
<
Boolean
>
terminate
()
{
/* package */
Single
<
Boolean
>
terminate
(
boolean
hasFailed
)
{
if
(
isAlive
())
{
return
Single
.
create
(
emitter
->
{
new
Handler
(
getLooper
()).
post
(()
->
{
return
Single
.
create
(
emitter
->
new
Handler
(
getLooper
()).
post
(()
->
{
RCLog
.
d
(
"thread %s: terminated()"
,
Thread
.
currentThread
().
getId
());
unregisterListenersAndClose
();
connectivityManager
.
notifyConnectionLost
(
hostname
,
DDPClient
.
REASON_CLOSED_BY_USER
);
int
reason
=
(
hasFailed
)
?
DDPClient
.
REASON_NETWORK_ERROR
:
DDPClient
.
REASON_CLOSED_BY_USER
;
unregisterListenersAndClose
(
reason
);
connectivityManager
.
notifyConnectionLost
(
hostname
,
reason
);
RocketChatWebSocketThread
.
super
.
quit
();
ConnectionStatusManager
.
INSTANCE
.
setOffline
();
emitter
.
onSuccess
(
true
);
});
});
}));
}
else
{
connectivityManager
.
notifyConnectionLost
(
hostname
,
DDPClient
.
REASON_NETWORK_ERROR
);
...
...
@@ -163,7 +167,7 @@ public class RocketChatWebSocketThread extends HandlerThread {
@DebugLog
/* package */
Single
<
Boolean
>
keepAlive
()
{
return
checkIfConnectionAlive
()
.
flatMap
(
alive
->
alive
?
Single
.
just
(
true
)
:
connectWithExponentialBackoff
());
.
flatMap
(
alive
->
connectWithExponentialBackoff
());
}
@DebugLog
...
...
@@ -224,13 +228,11 @@ public class RocketChatWebSocketThread extends HandlerThread {
.
onSuccessTask
(
task
->
{
final
String
newSession
=
task
.
getResult
().
session
;
connectivityManager
.
notifyConnectionEstablished
(
hostname
,
newSession
);
// handling WebSocket#onClose() callback.
task
.
getResult
().
client
.
getOnCloseCallback
().
onSuccess
(
_task
->
{
RxWebSocketCallback
.
Close
result
=
_task
.
getResult
();
if
(
result
.
code
==
DDPClient
.
REASON_NETWORK_ERROR
)
{
reconnect
();
}
else
{
unregisterListenersAndClose
();
}
return
null
;
});
...
...
@@ -382,6 +384,10 @@ public class RocketChatWebSocketThread extends HandlerThread {
RCLog
.
w
(
exception
,
"Failed to register listeners!!"
);
}
}
// Register SessionObserver late.
SessionObserver
sessionObserver
=
new
SessionObserver
(
appContext
,
hostname
,
realmHelper
);
sessionObserver
.
register
();
listeners
.
add
(
sessionObserver
);
listenersRegistered
=
true
;
startHeartBeat
();
}
...
...
@@ -410,9 +416,9 @@ public class RocketChatWebSocketThread extends HandlerThread {
}
@DebugLog
private
void
unregisterListenersAndClose
()
{
private
void
unregisterListenersAndClose
(
int
reason
)
{
unregisterListeners
();
DDPClient
.
get
().
close
();
DDPClient
.
get
().
close
(
reason
);
}
@DebugLog
...
...
app/src/main/java/chat/rocket/android/service/ServerConnectivity.java
View file @
8d4e96c6
...
...
@@ -5,12 +5,12 @@ package chat.rocket.android.service;
*/
public
class
ServerConnectivity
{
public
static
final
int
STATE_CONNECTED
=
1
;
public
static
final
int
STATE_DISCONNECTED
=
2
;
public
static
final
int
STATE_CONNECTING
=
3
;
/*package*/
static
final
int
STATE_DISCONNECTING
=
4
;
public
static
final
ServerConnectivity
CONNECTED
=
new
ServerConnectivity
(
null
,
STATE_CONNECTED
);
public
static
final
int
STATE_DISCONNECTED
=
0
;
/* package */
static
final
int
STATE_DISCONNECTING
=
1
;
/* package */
static
final
int
STATE_CONNECTING
=
2
;
public
static
final
int
STATE_CONNECTED
=
3
;
public
static
final
int
STATE_SESSION_ESTABLISHED
=
4
;
/* package */
static
final
ServerConnectivity
CONNECTED
=
new
ServerConnectivity
(
null
,
STATE_CONNECTED
);
public
final
String
hostname
;
public
final
int
state
;
...
...
@@ -46,8 +46,8 @@ public class ServerConnectivity {
/**
* This exception should be thrown when connection is lost during waiting for CONNECTED.
*/
public
static
class
DisconnectedException
extends
Exception
{
public
DisconnectedException
()
{
/* package */
static
class
DisconnectedException
extends
Exception
{
/* package */
DisconnectedException
()
{
super
(
"Disconnected"
);
}
}
...
...
app/src/main/java/chat/rocket/android/service/internal/AbstractRocketChatCacheObserver.java
View file @
8d4e96c6
package
chat
.
rocket
.
android
.
service
.
internal
;
import
android.content.Context
;
import
com.hadisatrio.optional.Optional
;
import
chat.rocket.android.RocketChatCache
;
...
...
@@ -13,13 +11,11 @@ import chat.rocket.persistence.realm.models.ddp.RealmRoom;
import
io.reactivex.disposables.CompositeDisposable
;
public
abstract
class
AbstractRocketChatCacheObserver
implements
Registrable
{
private
final
Context
context
;
private
final
RealmHelper
realmHelper
;
private
String
roomId
;
private
CompositeDisposable
compositeDisposable
=
new
CompositeDisposable
();
protected
AbstractRocketChatCacheObserver
(
Context
context
,
RealmHelper
realmHelper
)
{
this
.
context
=
context
;
protected
AbstractRocketChatCacheObserver
(
RealmHelper
realmHelper
)
{
this
.
realmHelper
=
realmHelper
;
}
...
...
@@ -47,7 +43,7 @@ public abstract class AbstractRocketChatCacheObserver implements Registrable {
@Override
public
final
void
register
()
{
compositeDisposable
.
add
(
new
RocketChatCache
(
context
)
RocketChatCache
.
INSTANCE
.
getSelectedRoomIdPublisher
()
.
filter
(
Optional:
:
isPresent
)
.
map
(
Optional:
:
get
)
...
...
app/src/main/java/chat/rocket/android/service/internal/StreamRoomMessageManager.java
View file @
8d4e96c6
...
...
@@ -18,7 +18,6 @@ public class StreamRoomMessageManager implements Registrable {
private
final
RealmHelper
realmHelper
;
private
final
AbstractRocketChatCacheObserver
cacheObserver
;
private
final
Handler
handler
;
private
final
RocketChatCache
rocketChatCache
;
private
StreamRoomMessage
streamRoomMessage
;
public
StreamRoomMessageManager
(
Context
context
,
String
hostname
,
...
...
@@ -26,9 +25,8 @@ public class StreamRoomMessageManager implements Registrable {
this
.
context
=
context
;
this
.
hostname
=
hostname
;
this
.
realmHelper
=
realmHelper
;
this
.
rocketChatCache
=
new
RocketChatCache
(
context
);
cacheObserver
=
new
AbstractRocketChatCacheObserver
(
context
,
realmHelper
)
{
cacheObserver
=
new
AbstractRocketChatCacheObserver
(
realmHelper
)
{
@Override
protected
void
onRoomIdUpdated
(
String
roomId
)
{
unregisterStreamNotifyMessageIfNeeded
();
...
...
@@ -57,7 +55,7 @@ public class StreamRoomMessageManager implements Registrable {
@Override
public
void
register
()
{
cacheObserver
.
register
();
String
selectedRoomId
=
rocketChatCache
.
getSelectedRoomId
();
String
selectedRoomId
=
RocketChatCache
.
INSTANCE
.
getSelectedRoomId
();
if
(
selectedRoomId
==
null
)
{
return
;
}
...
...
app/src/main/java/chat/rocket/android/service/observer/GcmPushRegistrationObserver.java
View file @
8d4e96c6
...
...
@@ -68,7 +68,7 @@ public class GcmPushRegistrationObserver extends AbstractModelObserver<GcmPushRe
final
RealmUser
currentUser
=
realmHelper
.
executeTransactionForRead
(
realm
->
RealmUser
.
queryCurrentUser
(
realm
).
findFirst
());
final
String
userId
=
currentUser
!=
null
?
currentUser
.
getId
()
:
null
;
final
String
pushId
=
new
RocketChatCache
(
context
)
.
getOrCreatePushId
();
final
String
pushId
=
RocketChatCache
.
INSTANCE
.
getOrCreatePushId
();
return
new
RaixPushHelper
(
realmHelper
)
.
pushUpdate
(
pushId
,
gcmToken
,
userId
);
...
...
app/src/main/java/chat/rocket/android/service/observer/SessionObserver.java
View file @
8d4e96c6
...
...
@@ -7,6 +7,7 @@ import java.util.List;
import
chat.rocket.android.RocketChatCache
;
import
chat.rocket.android.api.RaixPushHelper
;
import
chat.rocket.android.helper.LogIfError
;
import
chat.rocket.android.service.ConnectivityManager
;
import
chat.rocket.android.service.internal.StreamRoomMessageManager
;
import
chat.rocket.persistence.realm.RealmHelper
;
import
chat.rocket.persistence.realm.models.internal.GetUsersOfRoomsProcedure
;
...
...
@@ -73,8 +74,10 @@ public class SessionObserver extends AbstractModelObserver<RealmSession> {
// update push info
pushHelper
.
pushSetUser
(
new
RocketChatCache
(
context
)
.
getOrCreatePushId
())
.
pushSetUser
(
RocketChatCache
.
INSTANCE
.
getOrCreatePushId
())
.
continueWith
(
new
LogIfError
());
ConnectivityManager
.
getInstance
(
context
).
notifySessionEstablished
(
hostname
);
}
@DebugLog
...
...
app/src/main/res/anim/rotation.xml
0 → 100644
View file @
8d4e96c6
<?xml version="1.0" encoding="utf-8"?>
<set
xmlns:android=
"http://schemas.android.com/apk/res/android"
>
<objectAnimator
android:duration=
"1000"
android:propertyName=
"rotation"
android:repeatCount=
"-1"
android:valueFrom=
"0"
android:valueTo=
"360"
/>
</set>
\ No newline at end of file
app/src/main/res/drawable/community.xml
0 → 100644
View file @
8d4e96c6
This diff is collapsed.
Click to expand it.
app/src/main/res/drawable/ic_loading.xml
0 → 100644
View file @
8d4e96c6
<vector
xmlns:android=
"http://schemas.android.com/apk/res/android"
android:width=
"16dp"
android:height=
"16dp"
android:viewportHeight=
"100.0"
android:viewportWidth=
"100.0"
>
<group
android:name=
"rotationGroup"
android:pivotX=
"50"
android:pivotY=
"50"
android:rotation=
"90"
>
<path
android:fillColor=
"#00000000"
android:pathData=
"M85,50A35,35 108.96,1 0,74.79 74.79"
android:strokeColor=
"#FFFFFF"
android:strokeWidth=
"12"
/>
<path
android:fillColor=
"#FFFFFF"
android:pathData=
"M105,49L70,49L85,65L100,49"
/>
</group>
</vector>
app/src/main/res/drawable/ic_loading_animated.xml
0 → 100644
View file @
8d4e96c6
<?xml version="1.0" encoding="utf-8"?>
<animated-vector
xmlns:tools=
"http://schemas.android.com/tools"
xmlns:android=
"http://schemas.android.com/apk/res/android"
tools:targetApi=
"lollipop"
android:drawable=
"@drawable/ic_loading"
>
<target
android:name=
"rotationGroup"
android:animation=
"@anim/rotation"
/>
</animated-vector>
\ No newline at end of file
app/src/main/res/layout/crouton_status_ticker.xml
0 → 100644
View file @
8d4e96c6
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
xmlns:android=
"http://schemas.android.com/apk/res/android"
xmlns:app=
"http://schemas.android.com/apk/res-auto"
xmlns:tools=
"http://schemas.android.com/tools"
android:layout_width=
"match_parent"
android:layout_height=
"match_parent"
android:background=
"#030000"
>
<TextView
android:id=
"@+id/text_view_status"
android:layout_width=
"wrap_content"
android:layout_height=
"32dp"
android:background=
"@color/connection_crouton_background"
android:gravity=
"center"
android:text=
"@string/server_config_activity_authenticating"
android:textAlignment=
"center"
android:textColor=
"@android:color/white"
android:textSize=
"16sp"
android:textStyle=
"bold"
app:layout_constraintBottom_toBottomOf=
"parent"
app:layout_constraintEnd_toEndOf=
"parent"
app:layout_constraintStart_toStartOf=
"parent"
app:layout_constraintTop_toTopOf=
"parent"
tools:text=
"Authenticating…"
/>
<ImageView
android:id=
"@+id/try_again_image"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_marginLeft=
"8dp"
android:layout_marginStart=
"8dp"
app:layout_constraintBottom_toBottomOf=
"@+id/text_view_status"
app:layout_constraintStart_toEndOf=
"@+id/text_view_status"
app:layout_constraintTop_toTopOf=
"@+id/text_view_status"
tools:src=
"@drawable/ic_loading"
/>
</android.support.constraint.ConstraintLayout>
\ No newline at end of file
app/src/main/res/layout/fragment_login.xml
View file @
8d4e96c6
...
...
@@ -11,84 +11,84 @@
<ScrollView
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
app:layout_constraintTop_toTopOf=
"parent"
app:layout_constraintBottom_toBottomOf=
"parent"
app:layout_constraintLeft_toLeftOf=
"parent"
app:layout_constraintRight_toRightOf=
"parent"
>
app:layout_constraintRight_toRightOf=
"parent"
app:layout_constraintTop_toTopOf=
"parent"
>
<android.support.constraint.ConstraintLayout
android:id=
"@+id/container"
android:layout_width=
"wrap_content"
android:minWidth=
"280dp"
android:layout_height=
"wrap_content"
android:paddingStart=
"@dimen/margin_16"
android:paddingLeft=
"@dimen/margin_16"
android:background=
"@drawable/container_bg"
android:minWidth=
"280dp"
android:paddingBottom=
"@dimen/margin_8"
android:paddingEnd=
"@dimen/margin_16"
android:paddingLeft=
"@dimen/margin_16"
android:paddingRight=
"@dimen/margin_16"
android:paddingStart=
"@dimen/margin_16"
android:paddingTop=
"@dimen/margin_8"
android:paddingBottom=
"@dimen/margin_8"
android:background=
"@drawable/container_bg"
app:layout_constraintTop_toTopOf=
"parent"
app:layout_constraintBottom_toBottomOf=
"parent"
app:layout_constraintLeft_toLeftOf=
"parent"
app:layout_constraintRight_toRightOf=
"parent"
app:layout_constraintLeft_toLeft
Of=
"parent"
>
app:layout_constraintTop_toTop
Of=
"parent"
>
<ImageButton
android:id=
"@+id/btn_login_with_twitter"
android:layout_width=
"48dp"
android:layout_height=
"48dp"
android:background=
"?attr/selectableItemBackgroundBorderless"
android:scaleType=
"fitXY"
app:srcCompat=
"@drawable/ic_button_twitter_24dp"
app:layout_constraintTop_toTopOf=
"parent"
app:layout_constraintBottom_toTopOf=
"@+id/text_input_username"
app:layout_constraintLeft_toLeftOf=
"parent"
app:layout_constraintRight_toLeftOf=
"@+id/btn_login_with_facebook"
android:background=
"?attr/selectableItemBackgroundBorderless"
/>
app:layout_constraintTop_toTopOf=
"parent"
app:srcCompat=
"@drawable/ic_button_twitter_24dp"
/>
<ImageButton
android:id=
"@+id/btn_login_with_facebook"
android:layout_width=
"48dp"
android:layout_height=
"48dp"
android:background=
"?attr/selectableItemBackgroundBorderless"
android:scaleType=
"fitXY"
app:srcCompat=
"@drawable/ic_button_facebook_24dp"
app:layout_constraintTop_toTopOf=
"parent"
app:layout_constraintBottom_toTopOf=
"@+id/text_input_username"
app:layout_constraintLeft_toRightOf=
"@+id/btn_login_with_twitter"
app:layout_constraintRight_toLeftOf=
"@+id/btn_login_with_github"
android:background=
"?attr/selectableItemBackgroundBorderless"
/>
app:layout_constraintTop_toTopOf=
"parent"
app:srcCompat=
"@drawable/ic_button_facebook_24dp"
/>
<ImageButton
android:id=
"@+id/btn_login_with_github"
android:layout_width=
"48dp"
android:layout_height=
"48dp"
android:background=
"?attr/selectableItemBackgroundBorderless"
android:scaleType=
"fitXY"
app:srcCompat=
"@drawable/ic_button_github_24dp"
app:layout_constraintTop_toTopOf=
"parent"
app:layout_constraintBottom_toTopOf=
"@+id/text_input_username"
app:layout_constraintLeft_toRightOf=
"@+id/btn_login_with_facebook"
app:layout_constraintRight_toLeftOf=
"@+id/btn_login_with_google"
android:background=
"?attr/selectableItemBackgroundBorderless"
/>
app:layout_constraintTop_toTopOf=
"parent"
app:srcCompat=
"@drawable/ic_button_github_24dp"
/>
<ImageButton
android:id=
"@+id/btn_login_with_google"
android:layout_width=
"48dp"
android:layout_height=
"48dp"
android:background=
"?attr/selectableItemBackgroundBorderless"
android:scaleType=
"fitXY"
app:srcCompat=
"@drawable/ic_button_google_24dp"
app:layout_constraintTop_toTopOf=
"parent"
app:layout_constraintBottom_toTopOf=
"@+id/text_input_username"
app:layout_constraintLeft_toRightOf=
"@+id/btn_login_with_github"
app:layout_constraintRight_toRightOf=
"parent"
android:background=
"?attr/selectableItemBackgroundBorderless"
/>
app:layout_constraintTop_toTopOf=
"parent"
app:srcCompat=
"@drawable/ic_button_google_24dp"
/>
<android.support.design.widget.TextInputLayout
android:id=
"@+id/text_input_username"
android:layout_width=
"0dp"
android:layout_height=
"wrap_content"
app:layout_constraintTop_toBottomOf=
"@+id/btn_login_with_twitter"
app:layout_constraintBottom_toTopOf=
"@+id/text_input_passwd"
app:layout_constraintLeft_toLeftOf=
"parent"
app:layout_constraintRight_toRightOf=
"parent"
>
app:layout_constraintRight_toRightOf=
"parent"
app:layout_constraintTop_toBottomOf=
"@+id/btn_login_with_twitter"
>
<android.support.design.widget.TextInputEditText
android:id=
"@+id/editor_username"
...
...
@@ -104,10 +104,10 @@
android:id=
"@+id/text_input_passwd"
android:layout_width=
"0dp"
android:layout_height=
"wrap_content"
app:layout_constraintTop_toBottomOf=
"@+id/text_input_username"
app:layout_constraintBottom_toTopOf=
"@+id/btn_user_registration"
app:layout_constraintLeft_toLeftOf=
"parent"
app:layout_constraintRight_toRightOf=
"parent"
>
app:layout_constraintRight_toRightOf=
"parent"
app:layout_constraintTop_toBottomOf=
"@+id/text_input_username"
>
<android.support.design.widget.TextInputEditText
android:id=
"@+id/editor_passwd"
...
...
@@ -121,27 +121,27 @@
<Button
android:id=
"@+id/btn_user_registration"
style=
"@style/Widget.AppCompat.Button.Colored"
android:layout_width=
"0dp"
android:layout_height=
"wrap_content"
android:layout_marginTop=
"@dimen/margin_8"
android:text=
"@string/fragment_login_sign_up"
app:layout_constraintTop_toBottomOf=
"@+id/text_input_passwd"
app:layout_constraintRight_toLeftOf=
"@+id/btn_login_with_email"
app:layout_constraintLeft_toLeftOf=
"parent"
app:layout_constraintBottom_toBottomOf=
"parent"
style=
"@style/Widget.AppCompat.Button.Colored"
/>
app:layout_constraintLeft_toLeftOf=
"parent"
app:layout_constraintRight_toLeftOf=
"@+id/btn_login_with_email"
app:layout_constraintTop_toBottomOf=
"@+id/text_input_passwd"
/>
<Button
android:id=
"@+id/btn_login_with_email"
style=
"@style/Widget.AppCompat.Button.Colored"
android:layout_width=
"0dp"
android:layout_height=
"wrap_content"
android:layout_marginTop=
"@dimen/margin_8"
android:text=
"@string/fragment_login_sign_in"
app:layout_constraintTop_toBottomOf=
"@+id/text_input_passwd"
app:layout_constraintRight_toRightOf=
"parent"
app:layout_constraintLeft_toRightOf=
"@+id/btn_user_registration"
app:layout_constraintBottom_toBottomOf=
"parent"
style=
"@style/Widget.AppCompat.Button.Colored"
/>
app:layout_constraintLeft_toRightOf=
"@+id/btn_user_registration"
app:layout_constraintRight_toRightOf=
"parent"
app:layout_constraintTop_toBottomOf=
"@+id/text_input_passwd"
/>
</android.support.constraint.ConstraintLayout>
</ScrollView>
...
...
app/src/main/res/values/colors.xml
View file @
8d4e96c6
...
...
@@ -13,4 +13,5 @@
<color
name=
"colorSecondaryTextDark"
>
#8A000000
</color>
<color
name=
"colorDivider"
>
#1F000000
</color>
<color
name=
"connection_crouton_background"
>
#030000
</color>
</resources>
\ No newline at end of file
app/src/main/res/values/strings.xml
View file @
8d4e96c6
...
...
@@ -55,7 +55,7 @@
<string
name=
"fragment_login_sign_up"
>
SIGN UP
</string>
<string
name=
"fragment_login_sign_in"
>
SIGN IN
</string>
<string
name=
"fragment_retry_login_retry_title"
>
RETRY
</string>
<string
name=
"fragment_retry_login_error_title"
>
Connection Error
</string>
<string
name=
"fragment_retry_login_error_title"
>
Your connection seems off…
</string>
<string
name=
"server_config_activity_authenticating"
>
Authenticating…
</string>
<string
name=
"home_fragment_title"
>
Rocket.Chat - Home
</string>
<string
name=
"fragment_sidebar_main_unread_rooms_title"
>
UNREAD ROOMS
</string>
...
...
app/src/main/res/values/styles.xml
View file @
8d4e96c6
...
...
@@ -12,7 +12,6 @@
<item
name=
"actionModeBackground"
>
?attr/colorPrimaryDark
</item>
<item
name=
"android:statusBarColor"
tools:targetApi=
"21"
>
?attr/colorPrimaryDark
</item>
<item
name=
"android:navigationBarColor"
tools:targetApi=
"21"
>
?attr/colorPrimaryDark
</item>
<item
name=
"android:windowBackground"
>
@android:color/white
</item>
</style>
...
...
@@ -27,7 +26,6 @@
<item
name=
"actionModeBackground"
>
?attr/colorPrimaryDark
</item>
<item
name=
"android:statusBarColor"
tools:targetApi=
"21"
>
?attr/colorPrimaryDark
</item>
<item
name=
"android:navigationBarColor"
tools:targetApi=
"21"
>
?attr/colorPrimaryDark
</item>
</style>
<style
name=
"AppTheme.Dialog"
parent=
"Theme.AppCompat.Light.Dialog"
>
...
...
app/src/release/java/chat/rocket/android/helper/OkHttpHelper.kt
View file @
8d4e96c6
...
...
@@ -23,12 +23,12 @@ object OkHttpHelper {
return
httpClientForUploadFile
?:
throw
AssertionError
(
"httpClientForUploadFile set to null by another thread"
)
}
fun
getClientForDownloadFile
(
context
:
Context
):
OkHttpClient
{
fun
getClientForDownloadFile
():
OkHttpClient
{
if
(
httpClientForDownloadFile
==
null
)
{
httpClientForDownloadFile
=
OkHttpClient
.
Builder
()
.
followRedirects
(
true
)
.
followSslRedirects
(
true
)
.
addInterceptor
(
CookieInterceptor
(
DefaultCookieProvider
(
RocketChatCache
(
context
)
)))
.
addInterceptor
(
CookieInterceptor
(
DefaultCookieProvider
()))
.
build
()
}
return
httpClientForDownloadFile
?:
throw
AssertionError
(
"httpClientForDownloadFile set to null by another thread"
)
...
...
build.gradle
View file @
8d4e96c6
...
...
@@ -16,10 +16,10 @@ buildscript {
}
dependencies
{
classpath
'com.android.tools.build:gradle:3.0.1'
classpath
"org.jetbrains.kotlin:kotlin-gradle-plugin:1.
1.6
0"
classpath
"org.jetbrains.kotlin:kotlin-gradle-plugin:1.
2.
0"
classpath
'io.realm:realm-gradle-plugin:4.2.0'
classpath
'com.jakewharton.hugo:hugo-plugin:1.2.1'
classpath
'com.google.gms:google-services:3.
0
.0'
classpath
'com.google.gms:google-services:3.
1
.0'
classpath
'com.github.triplet.gradle:play-publisher:1.1.5'
classpath
'io.fabric.tools:gradle:1.+'
}
...
...
dependencies.gradle
View file @
8d4e96c6
ext
{
preDexLibs
=
"true"
!=
System
.
getenv
(
"CI"
)
supportLibraryVersion
=
"27.0.1"
playLibVersion
=
'11.6.2'
constraintLayoutVersion
=
"1.0.2"
kotlinVersion
=
"1.
1.51
"
kotlinVersion
=
"1.
2.0
"
okHttpVersion
=
"3.9.0"
rxbindingVersion
=
'2.0.0'
rxJavaVersion
=
"2.1.0"
supportDependencies
=
[
designSupportLibrary:
"com.android.support:design:${supportLibraryVersion}"
,
...
...
@@ -15,14 +17,20 @@ ext {
multidex
:
"com.android.support:multidex:1.0.2"
,
customTabs
:
"com.android.support:customtabs:${supportLibraryVersion}"
]
extraDependencies
=
[
okHTTP
:
"com.squareup.okhttp3:okhttp:${okHttpVersion}"
,
rxJava
:
"io.reactivex.rxjava2:rxjava:2.1.0"
,
rxJava
:
"io.reactivex.rxjava2:rxjava:${rxJavaVersion}"
,
rxKotlin
:
"io.reactivex.rxjava2:rxkotlin:${rxJavaVersion}"
,
boltTask
:
"com.parse.bolts:bolts-tasks:1.4.0"
,
rxAndroid
:
"io.reactivex.rxjava2:rxandroid:2.0.1"
,
textDrawable
:
"com.github.rocketchat:textdrawable:1.0.2"
,
optional
:
"com.hadisatrio:Optional:v1.0.1"
optional
:
"com.hadisatrio:Optional:v1.0.1"
,
androidJob
:
"com.evernote:android-job:1.2.1"
,
jstate
:
"com.unquietcode.tools.jstate:jstate:2.1"
,
crouton
:
"de.keyboardsurfer.android.widget:crouton:1.8.5@aar"
]
rxbindingDependencies
=
[
rxBinding
:
"com.jakewharton.rxbinding2:rxbinding:${rxbindingVersion}"
,
rxBindingSupport
:
"com.jakewharton.rxbinding2:rxbinding-support-v4:${rxbindingVersion}"
,
...
...
@@ -38,5 +46,14 @@ subprojects {
project
.
android
.
dexOptions
.
preDexLibraries
=
rootProject
.
ext
.
preDexLibs
}
}
project
.
configurations
.
all
{
resolutionStrategy
.
eachDependency
{
details
->
if
(
details
.
requested
.
group
==
'com.android.support'
&&
!
details
.
requested
.
name
.
contains
(
'multidex'
)
)
{
details
.
useVersion
"${supportLibraryVersion}"
}
}
}
}
persistence-realm/build.gradle
View file @
8d4e96c6
...
...
@@ -30,17 +30,18 @@ android {
}
}
dependencies
{
compile
project
(
':log-wrapper'
)
compile
project
(
':rocket-chat-core'
)
compile
extraDependencies
.
rxJava
compile
extraDependencies
.
boltTask
compile
supportDependencies
.
annotation
compile
supportDependencies
.
designSupportLibrary
compile
extraDependencies
.
rxAndroid
provided
extraDependencies
.
optional
testCompile
"org.jetbrains.kotlin:kotlin-test:$rootProject.ext.kotlinVersion"
testCompile
"org.jetbrains.kotlin:kotlin-test-junit:$rootProject.ext.kotlinVersion"
testCompile
'org.json:json:20170516'
testCompile
'org.skyscreamer:jsonassert:1.5.0'
testCompile
'junit:junit:4.12'
api
project
(
':log-wrapper'
)
api
project
(
':rocket-chat-core'
)
implementation
extraDependencies
.
rxJava
implementation
extraDependencies
.
rxKotlin
implementation
extraDependencies
.
boltTask
implementation
supportDependencies
.
annotation
implementation
supportDependencies
.
designSupportLibrary
implementation
extraDependencies
.
rxAndroid
implementation
extraDependencies
.
optional
testImplementation
"org.jetbrains.kotlin:kotlin-test:$rootProject.ext.kotlinVersion"
testImplementation
"org.jetbrains.kotlin:kotlin-test-junit:$rootProject.ext.kotlinVersion"
testImplementation
'org.json:json:20170516'
testImplementation
'org.skyscreamer:jsonassert:1.5.0'
testImplementation
'junit:junit:4.12'
}
rocket-chat-android-widgets/build.gradle
View file @
8d4e96c6
...
...
@@ -31,25 +31,25 @@ ext {
frescoVersion
=
'1.4.0'
}
dependencies
{
compile
project
(
':rocket-chat-core'
)
compile
extraDependencies
.
okHTTP
compile
extraDependencies
.
textDrawable
compile
supportDependencies
.
annotation
compile
supportDependencies
.
cardView
compile
supportDependencies
.
designSupportLibrary
compile
supportDependencies
.
constraintLayout
compile
supportDependencies
.
supportV13
compile
supportDependencies
.
customTabs
compile
rxbindingDependencies
.
rxBinding
compile
rxbindingDependencies
.
rxBindingSupport
compile
"org.jetbrains.kotlin:kotlin-stdlib-jre7
:$rootProject.ext.kotlinVersion"
compile
'org.nibor.autolink:autolink:0.6.0'
compile
'com.github.yusukeiwaki.android-widget:widget-fontawesome:0.0.1'
compile
"com.facebook.fresco:fresco:$frescoVersion"
compile
"com.facebook.fresco:imagepipeline-okhttp3:$frescoVersion"
compile
'com.caverock:androidsvg:1.2.1'
test
Compile
"org.jetbrains.kotlin:kotlin-test-junit:$rootProject.ext.kotlinVersion"
test
Compile
"org.jetbrains.kotlin:kotlin-test:$rootProject.ext.kotlinVersion"
test
Compile
'junit:junit:4.12'
test
Compile
"org.mockito:mockito-core:2.7.19
"
api
project
(
':rocket-chat-core'
)
api
extraDependencies
.
okHTTP
api
extraDependencies
.
textDrawable
api
supportDependencies
.
annotation
api
supportDependencies
.
cardView
api
supportDependencies
.
designSupportLibrary
api
supportDependencies
.
constraintLayout
api
supportDependencies
.
supportV13
api
supportDependencies
.
customTabs
api
rxbindingDependencies
.
rxBinding
api
rxbindingDependencies
.
rxBindingSupport
api
"org.jetbrains.kotlin:kotlin-stdlib-jre8
:$rootProject.ext.kotlinVersion"
implementation
'org.nibor.autolink:autolink:0.6.0'
implementation
'com.github.yusukeiwaki.android-widget:widget-fontawesome:0.0.1'
api
"com.facebook.fresco:fresco:$frescoVersion"
api
"com.facebook.fresco:imagepipeline-okhttp3:$frescoVersion"
implementation
'com.caverock:androidsvg:1.2.1'
test
Implementation
"org.jetbrains.kotlin:kotlin-test-junit:$rootProject.ext.kotlinVersion"
test
Implementation
"org.jetbrains.kotlin:kotlin-test:$rootProject.ext.kotlinVersion"
test
Implementation
'junit:junit:4.12'
test
Implementation
"org.mockito:mockito-core:2.10.0
"
}
rocket-chat-core/build.gradle
View file @
8d4e96c6
...
...
@@ -4,14 +4,15 @@ apply plugin: 'java'
dependencies
{
compile
extraDependencies
.
rxJava
compile
extraDependencies
.
rxKotlin
compile
extraDependencies
.
optional
compile
"org.jetbrains.kotlin:kotlin-stdlib-jre
7
:$rootProject.ext.kotlinVersion"
compile
"org.jetbrains.kotlin:kotlin-stdlib-jre
8
:$rootProject.ext.kotlinVersion"
compile
'com.google.code.findbugs:jsr305:3.0.2'
compileOnly
'com.google.auto.value:auto-value:1.3'
kapt
'com.google.auto.value:auto-value:1.3'
kapt
'com.gabrielittner.auto.value:auto-value-with:1.0.0'
test
Compile
'junit:junit:4.12'
test
Compile
"org.mockito:mockito-inline:2.8.9"
test
Implementation
'junit:junit:4.12'
test
Implementation
"org.mockito:mockito-inline:2.8.9"
}
sourceCompatibility
=
"1.7"
targetCompatibility
=
"1.7"
\ No newline at end of file
sourceCompatibility
=
"1.8"
targetCompatibility
=
"1.8"
\ No newline at end of file
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