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
05c4fcb0
Unverified
Commit
05c4fcb0
authored
Dec 26, 2017
by
Leonardo Aramaki
Committed by
GitHub
Dec 26, 2017
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'develop' into patch-5
parents
da33e61f
fcc9a2a5
Changes
12
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
12 changed files
with
376 additions
and
162 deletions
+376
-162
RocketChatCache.kt
app/src/main/java/chat/rocket/android/RocketChatCache.kt
+19
-0
RestApiHelper.kt
...c/main/java/chat/rocket/android/api/rest/RestApiHelper.kt
+53
-0
UserRegistrationDialogFragment.java
...ragment/server_config/UserRegistrationDialogFragment.java
+165
-110
GcmPushHelper.kt
...c/main/java/chat/rocket/android/push/gcm/GcmPushHelper.kt
+38
-0
RocketChatWebSocketThread.java
...hat/rocket/android/service/RocketChatWebSocketThread.java
+2
-2
CurrentUserObserver.java
.../rocket/android/service/observer/CurrentUserObserver.java
+5
-0
GcmPushRegistrationObserver.java
...android/service/observer/GcmPushRegistrationObserver.java
+60
-50
RocketChatMessageAttachmentsLayout.java
...id/widget/message/RocketChatMessageAttachmentsLayout.java
+2
-0
slide_in_left.xml
...-chat-android-widgets/src/main/res/anim/slide_in_left.xml
+8
-0
slide_in_right.xml
...chat-android-widgets/src/main/res/anim/slide_in_right.xml
+8
-0
slide_out_left.xml
...chat-android-widgets/src/main/res/anim/slide_out_left.xml
+8
-0
slide_out_right.xml
...hat-android-widgets/src/main/res/anim/slide_out_right.xml
+8
-0
No files found.
app/src/main/java/chat/rocket/android/RocketChatCache.kt
View file @
05c4fcb0
...
@@ -25,6 +25,9 @@ object RocketChatCache {
...
@@ -25,6 +25,9 @@ object RocketChatCache {
private
val
KEY_HOSTNAME_LIST
=
"KEY_HOSTNAME_LIST"
private
val
KEY_HOSTNAME_LIST
=
"KEY_HOSTNAME_LIST"
private
val
KEY_OPENED_ROOMS
=
"KEY_OPENED_ROOMS"
private
val
KEY_OPENED_ROOMS
=
"KEY_OPENED_ROOMS"
private
val
KEY_SESSION_TOKEN
=
"KEY_SESSION_TOKEN"
private
val
KEY_SESSION_TOKEN
=
"KEY_SESSION_TOKEN"
private
val
KEY_USER_ID
=
"KEY_USER_ID"
private
val
KEY_USER_NAME
=
"KEY_USER_NAME"
private
val
KEY_USER_USERNAME
=
"KEY_USER_USERNAME"
private
lateinit
var
sharedPreferences
:
SharedPreferences
private
lateinit
var
sharedPreferences
:
SharedPreferences
...
@@ -404,4 +407,20 @@ object RocketChatCache {
...
@@ -404,4 +407,20 @@ object RocketChatCache {
sharedPreferences
.
registerOnSharedPreferenceChangeListener
(
listener
)
sharedPreferences
.
registerOnSharedPreferenceChangeListener
(
listener
)
},
BackpressureStrategy
.
LATEST
)
},
BackpressureStrategy
.
LATEST
)
}
}
fun
setUserId
(
userId
:
String
)
=
setString
(
KEY_USER_ID
,
userId
)
fun
getUserId
():
String
?
=
getString
(
KEY_USER_ID
,
null
)
fun
setUserName
(
name
:
String
?)
{
name
?.
let
{
setString
(
KEY_USER_NAME
,
name
)
}
}
fun
getUserName
():
String
?
=
getString
(
KEY_USER_NAME
,
null
)
fun
setUserUsername
(
username
:
String
)
=
setString
(
KEY_USER_USERNAME
,
username
)
fun
getUserUsername
():
String
?
=
getString
(
KEY_USER_USERNAME
,
null
)
}
}
\ No newline at end of file
app/src/main/java/chat/rocket/android/api/rest/RestApiHelper.kt
View file @
05c4fcb0
package
chat.rocket.android.api.rest
package
chat.rocket.android.api.rest
import
chat.rocket.android.R
import
chat.rocket.android.RocketChatApplication
import
chat.rocket.android.helper.UrlHelper
import
chat.rocket.android.helper.UrlHelper
import
chat.rocket.android.push.gcm.GcmPushHelper
import
chat.rocket.core.models.Room
import
chat.rocket.core.models.Room
import
com.google.android.gms.gcm.GoogleCloudMessaging
import
com.google.android.gms.iid.InstanceID
import
okhttp3.HttpUrl
import
okhttp3.HttpUrl
import
okhttp3.MediaType
import
okhttp3.Request
import
okhttp3.Request
import
okhttp3.RequestBody
import
org.json.JSONObject
import
java.io.IOException
/**
/**
* Helper class for dealing with Rest API calls.
* Helper class for dealing with Rest API calls.
...
@@ -139,6 +148,30 @@ object RestApiHelper {
...
@@ -139,6 +148,30 @@ object RestApiHelper {
.
build
()
.
build
()
}
}
fun
getRequestForPushTokenRegistration
(
hostname
:
String
,
token
:
String
,
userId
:
String
):
Request
{
val
parsedHttpUrl
=
HttpUrl
.
parse
(
getEndpointUrlForPushToken
(
hostname
))
?.
newBuilder
()
?.
build
()
val
json
=
JSONObject
()
.
put
(
"type"
,
"gcm"
)
.
put
(
"appName"
,
"main"
)
.
put
(
"value"
,
GcmPushHelper
.
getGcmToken
())
val
requestBody
=
RequestBody
.
create
(
MediaType
.
parse
(
"application/json; charset=utf-8"
),
json
.
toString
())
return
Request
.
Builder
()
.
url
(
parsedHttpUrl
)
.
post
(
requestBody
)
.
addHeader
(
"X-Auth-Token"
,
token
)
.
addHeader
(
"X-User-Id"
,
userId
)
.
addHeader
(
"Content-Type"
,
"application/json"
)
.
build
()
}
/**
/**
* Returns a Rest API endpoint URL for favorite or pinned messages accordingly with the room type and the server hostname.
* Returns a Rest API endpoint URL for favorite or pinned messages accordingly with the room type and the server hostname.
*
*
...
@@ -169,6 +202,9 @@ object RestApiHelper {
...
@@ -169,6 +202,9 @@ object RestApiHelper {
fun
getEndpointUrlForMemberList
(
roomType
:
String
,
hostname
:
String
):
String
=
fun
getEndpointUrlForMemberList
(
roomType
:
String
,
hostname
:
String
):
String
=
UrlHelper
.
getSafeHostname
(
hostname
)
+
getRestApiUrlForMemberList
(
roomType
)
UrlHelper
.
getSafeHostname
(
hostname
)
+
getRestApiUrlForMemberList
(
roomType
)
fun
getEndpointUrlForPushToken
(
hostname
:
String
):
String
=
UrlHelper
.
getSafeHostname
(
hostname
)
+
getRestApiUrlForPushToken
()
/**
/**
* Returns the correspondent Rest API URL accordingly with the room type to get its favorite or pinned messages.
* Returns the correspondent Rest API URL accordingly with the room type to get its favorite or pinned messages.
*
*
...
@@ -216,4 +252,21 @@ object RestApiHelper {
...
@@ -216,4 +252,21 @@ object RestApiHelper {
}
}
return
restApiUrl
return
restApiUrl
}
}
/**
* Returns the correspondent Rest API URL for registration/deletion of Gcm Registration token.
*/
fun
getRestApiUrlForPushToken
():
String
{
return
"/api/v1/push.token"
}
@Throws
(
IOException
::
class
)
private
fun
getGcmToken
(
senderId
:
String
):
String
{
return
InstanceID
.
getInstance
(
RocketChatApplication
.
getInstance
())
.
getToken
(
senderId
,
GoogleCloudMessaging
.
INSTANCE_ID_SCOPE
,
null
)
}
private
fun
getSenderId
():
String
{
return
RocketChatApplication
.
getInstance
().
getString
(
R
.
string
.
gcm_sender_id
)
}
}
}
\ No newline at end of file
app/src/main/java/chat/rocket/android/fragment/server_config/UserRegistrationDialogFragment.java
View file @
05c4fcb0
This diff is collapsed.
Click to expand it.
app/src/main/java/chat/rocket/android/push/gcm/GcmPushHelper.kt
0 → 100644
View file @
05c4fcb0
package
chat.rocket.android.push.gcm
import
bolts.Task
import
chat.rocket.android.R
import
chat.rocket.android.RocketChatApplication
import
chat.rocket.android.RocketChatCache
import
chat.rocket.android.api.RaixPushHelper
import
chat.rocket.persistence.realm.RealmHelper
import
chat.rocket.persistence.realm.models.ddp.RealmUser
import
com.google.android.gms.gcm.GoogleCloudMessaging
import
com.google.android.gms.iid.InstanceID
import
java.io.IOException
object
GcmPushHelper
{
fun
getGcmToken
():
String
?
=
getGcmToken
(
getSenderId
())
@Throws
(
IOException
::
class
)
private
fun
registerGcmTokenForServer
(
realmHelper
:
RealmHelper
):
Task
<
Void
>
{
val
gcmToken
=
getGcmToken
(
getSenderId
())
val
currentUser
=
realmHelper
.
executeTransactionForRead
({
realm
->
RealmUser
.
queryCurrentUser
(
realm
).
findFirst
()
})
val
userId
=
if
(
currentUser
!=
null
)
currentUser
.
getId
()
else
null
val
pushId
=
RocketChatCache
.
getOrCreatePushId
()
return
RaixPushHelper
(
realmHelper
)
.
pushUpdate
(
pushId
!!
,
gcmToken
,
userId
)
}
@Throws
(
IOException
::
class
)
private
fun
getGcmToken
(
senderId
:
String
):
String
{
return
InstanceID
.
getInstance
(
RocketChatApplication
.
getInstance
())
.
getToken
(
senderId
,
GoogleCloudMessaging
.
INSTANCE_ID_SCOPE
,
null
)
}
private
fun
getSenderId
():
String
{
return
RocketChatApplication
.
getInstance
().
getString
(
R
.
string
.
gcm_sender_id
)
}
}
\ No newline at end of file
app/src/main/java/chat/rocket/android/service/RocketChatWebSocketThread.java
View file @
05c4fcb0
...
@@ -70,10 +70,10 @@ public class RocketChatWebSocketThread extends HandlerThread {
...
@@ -70,10 +70,10 @@ public class RocketChatWebSocketThread extends HandlerThread {
private
final
String
hostname
;
private
final
String
hostname
;
private
final
RealmHelper
realmHelper
;
private
final
RealmHelper
realmHelper
;
private
final
ConnectivityManagerInternal
connectivityManager
;
private
final
ConnectivityManagerInternal
connectivityManager
;
private
final
ArrayList
<
Registrable
>
listeners
=
new
ArrayList
<>();
private
volatile
ArrayList
<
Registrable
>
listeners
=
new
ArrayList
<>();
private
final
CompositeDisposable
heartbeatDisposable
=
new
CompositeDisposable
();
private
final
CompositeDisposable
heartbeatDisposable
=
new
CompositeDisposable
();
private
final
CompositeDisposable
reconnectDisposable
=
new
CompositeDisposable
();
private
final
CompositeDisposable
reconnectDisposable
=
new
CompositeDisposable
();
private
boolean
listenersRegistered
;
private
volatile
boolean
listenersRegistered
;
private
RocketChatWebSocketThread
(
Context
appContext
,
String
hostname
)
{
private
RocketChatWebSocketThread
(
Context
appContext
,
String
hostname
)
{
super
(
"RC_thread_"
+
hostname
);
super
(
"RC_thread_"
+
hostname
);
...
...
app/src/main/java/chat/rocket/android/service/observer/CurrentUserObserver.java
View file @
05c4fcb0
...
@@ -5,6 +5,7 @@ import android.content.Context;
...
@@ -5,6 +5,7 @@ import android.content.Context;
import
java.util.ArrayList
;
import
java.util.ArrayList
;
import
java.util.List
;
import
java.util.List
;
import
chat.rocket.android.RocketChatCache
;
import
chat.rocket.android.api.MethodCallHelper
;
import
chat.rocket.android.api.MethodCallHelper
;
import
chat.rocket.android.helper.LogIfError
;
import
chat.rocket.android.helper.LogIfError
;
import
chat.rocket.android.service.Registrable
;
import
chat.rocket.android.service.Registrable
;
...
@@ -56,6 +57,10 @@ public class CurrentUserObserver extends AbstractModelObserver<RealmUser> {
...
@@ -56,6 +57,10 @@ public class CurrentUserObserver extends AbstractModelObserver<RealmUser> {
}
}
listeners
=
new
ArrayList
<>();
listeners
=
new
ArrayList
<>();
RocketChatCache
.
INSTANCE
.
setUserId
(
user
.
getId
());
RocketChatCache
.
INSTANCE
.
setUserUsername
(
user
.
getUsername
());
RocketChatCache
.
INSTANCE
.
setUserName
(
user
.
getName
());
final
String
userId
=
user
.
getId
();
final
String
userId
=
user
.
getId
();
// get and observe Room subscriptions.
// get and observe Room subscriptions.
...
...
app/src/main/java/chat/rocket/android/service/observer/GcmPushRegistrationObserver.java
View file @
05c4fcb0
...
@@ -13,6 +13,7 @@ import chat.rocket.android.R;
...
@@ -13,6 +13,7 @@ import chat.rocket.android.R;
import
chat.rocket.android.RocketChatCache
;
import
chat.rocket.android.RocketChatCache
;
import
chat.rocket.android.api.RaixPushHelper
;
import
chat.rocket.android.api.RaixPushHelper
;
import
chat.rocket.android.helper.LogIfError
;
import
chat.rocket.android.helper.LogIfError
;
import
chat.rocket.android.push.gcm.GcmPushHelper
;
import
chat.rocket.core.SyncState
;
import
chat.rocket.core.SyncState
;
import
chat.rocket.persistence.realm.RealmHelper
;
import
chat.rocket.persistence.realm.RealmHelper
;
import
chat.rocket.persistence.realm.models.ddp.RealmUser
;
import
chat.rocket.persistence.realm.models.ddp.RealmUser
;
...
@@ -24,63 +25,72 @@ import io.realm.RealmResults;
...
@@ -24,63 +25,72 @@ import io.realm.RealmResults;
* call raix:push-update if needed.
* call raix:push-update if needed.
*/
*/
public
class
GcmPushRegistrationObserver
extends
AbstractModelObserver
<
GcmPushRegistration
>
{
public
class
GcmPushRegistrationObserver
extends
AbstractModelObserver
<
GcmPushRegistration
>
{
public
GcmPushRegistrationObserver
(
Context
context
,
String
hostname
,
RealmHelper
realmHelper
)
{
super
(
context
,
hostname
,
realmHelper
);
}
@Override
public
GcmPushRegistrationObserver
(
Context
context
,
String
hostname
,
public
RealmResults
<
GcmPushRegistration
>
queryItems
(
Realm
realm
)
{
RealmHelper
realmHelper
)
{
return
GcmPushRegistration
.
queryDefault
(
realm
)
super
(
context
,
hostname
,
realmHelper
);
.
equalTo
(
GcmPushRegistration
.
SYNC_STATE
,
SyncState
.
NOT_SYNCED
)
}
.
equalTo
(
GcmPushRegistration
.
GCM_PUSH_ENABLED
,
true
)
.
findAll
();
}
@Override
@Override
public
void
onUpdateResults
(
List
<
GcmPushRegistration
>
results
)
{
public
RealmResults
<
GcmPushRegistration
>
queryItems
(
Realm
realm
)
{
if
(
results
.
isEmpty
())
{
return
GcmPushRegistration
.
queryDefault
(
realm
)
return
;
.
equalTo
(
GcmPushRegistration
.
SYNC_STATE
,
SyncState
.
NOT_SYNCED
)
.
equalTo
(
GcmPushRegistration
.
GCM_PUSH_ENABLED
,
true
)
.
findAll
();
}
}
realmHelper
.
executeTransaction
(
realm
->
{
@Override
GcmPushRegistration
.
queryDefault
(
realm
).
findFirst
().
setSyncState
(
SyncState
.
SYNCING
);
public
void
onUpdateResults
(
List
<
GcmPushRegistration
>
results
)
{
return
null
;
String
gcmToken
=
GcmPushHelper
.
INSTANCE
.
getGcmToken
();
}).
onSuccessTask
(
_task
->
registerGcmTokenForServer
()
if
(
gcmToken
!=
null
&&
!
gcmToken
.
isEmpty
())
{
).
onSuccessTask
(
_task
->
// We already have gcm token, so try to register it.
realmHelper
.
executeTransaction
(
realm
->
{
try
{
GcmPushRegistration
.
queryDefault
(
realm
).
findFirst
().
setSyncState
(
SyncState
.
SYNCED
);
tryToRegisterToken
();
return
null
;
}
catch
(
Exception
e
)
{
})
e
.
printStackTrace
();
).
continueWith
(
task
->
{
}
if
(
task
.
isFaulted
())
{
}
realmHelper
.
executeTransaction
(
realm
->
{
}
GcmPushRegistration
.
queryDefault
(
realm
).
findFirst
().
setSyncState
(
SyncState
.
FAILED
);
return
null
;
}).
continueWith
(
new
LogIfError
());
}
return
null
;
});
}
private
Task
<
Void
>
registerGcmTokenForServer
()
throws
IOException
{
private
Task
<
Void
>
tryToRegisterToken
()
{
final
String
gcmToken
=
getGcmToken
(
getSenderId
());
return
realmHelper
.
executeTransaction
(
realm
->
{
final
RealmUser
currentUser
=
realmHelper
.
executeTransactionForRead
(
realm
->
GcmPushRegistration
.
queryDefault
(
realm
).
findFirst
().
setSyncState
(
SyncState
.
SYNCING
);
RealmUser
.
queryCurrentUser
(
realm
).
findFirst
());
return
null
;
final
String
userId
=
currentUser
!=
null
?
currentUser
.
getId
()
:
null
;
}).
onSuccessTask
(
_task
->
registerGcmTokenForServer
()
final
String
pushId
=
RocketChatCache
.
INSTANCE
.
getOrCreatePushId
();
).
onSuccessTask
(
_task
->
realmHelper
.
executeTransaction
(
realm
->
{
GcmPushRegistration
.
queryDefault
(
realm
).
findFirst
().
setSyncState
(
SyncState
.
SYNCED
);
return
null
;
})
).
continueWith
(
task
->
{
if
(
task
.
isFaulted
())
{
realmHelper
.
executeTransaction
(
realm
->
{
GcmPushRegistration
.
queryDefault
(
realm
).
findFirst
().
setSyncState
(
SyncState
.
FAILED
);
return
null
;
}).
continueWith
(
new
LogIfError
());
}
return
null
;
});
}
return
new
RaixPushHelper
(
realmHelper
)
private
Task
<
Void
>
registerGcmTokenForServer
()
throws
IOException
{
.
pushUpdate
(
pushId
,
gcmToken
,
userId
);
final
String
gcmToken
=
getGcmToken
(
getSenderId
());
}
final
RealmUser
currentUser
=
realmHelper
.
executeTransactionForRead
(
realm
->
RealmUser
.
queryCurrentUser
(
realm
).
findFirst
());
final
String
userId
=
currentUser
!=
null
?
currentUser
.
getId
()
:
null
;
final
String
pushId
=
RocketChatCache
.
INSTANCE
.
getOrCreatePushId
();
private
String
getGcmToken
(
String
senderId
)
throws
IOException
{
return
new
RaixPushHelper
(
realmHelper
)
return
InstanceID
.
getInstance
(
context
)
.
pushUpdate
(
pushId
,
gcmToken
,
userId
);
.
getToken
(
senderId
,
GoogleCloudMessaging
.
INSTANCE_ID_SCOPE
,
null
);
}
}
private
String
getSenderId
()
{
private
String
getGcmToken
(
String
senderId
)
throws
IOException
{
return
context
.
getString
(
R
.
string
.
gcm_sender_id
);
return
InstanceID
.
getInstance
(
context
)
}
.
getToken
(
senderId
,
GoogleCloudMessaging
.
INSTANCE_ID_SCOPE
,
null
);
}
private
String
getSenderId
()
{
return
context
.
getString
(
R
.
string
.
gcm_sender_id
);
}
}
}
rocket-chat-android-widgets/src/main/java/chat/rocket/android/widget/message/RocketChatMessageAttachmentsLayout.java
View file @
05c4fcb0
...
@@ -173,6 +173,8 @@ public class RocketChatMessageAttachmentsLayout extends LinearLayout {
...
@@ -173,6 +173,8 @@ public class RocketChatMessageAttachmentsLayout extends LinearLayout {
public
void
onClick
(
View
view
)
{
public
void
onClick
(
View
view
)
{
new
CustomTabsIntent
.
Builder
()
new
CustomTabsIntent
.
Builder
()
.
setToolbarColor
(
ContextCompat
.
getColor
(
getContext
(),
R
.
color
.
colorPrimary
))
.
setToolbarColor
(
ContextCompat
.
getColor
(
getContext
(),
R
.
color
.
colorPrimary
))
.
setStartAnimations
(
getContext
(),
R
.
anim
.
slide_in_right
,
R
.
anim
.
slide_out_left
)
.
setExitAnimations
(
getContext
(),
R
.
anim
.
slide_in_left
,
R
.
anim
.
slide_out_right
)
.
build
()
.
build
()
.
launchUrl
(
getContext
(),
Uri
.
parse
(
link
));
.
launchUrl
(
getContext
(),
Uri
.
parse
(
link
));
}
}
...
...
rocket-chat-android-widgets/src/main/res/anim/slide_in_left.xml
0 → 100644
View file @
05c4fcb0
<?xml version="1.0" encoding="utf-8"?>
<set
xmlns:android=
"http://schemas.android.com/apk/res/android"
>
<translate
android:fromXDelta=
"-100%p"
android:toXDelta=
"0"
android:duration=
"@android:integer/config_mediumAnimTime"
/>
</set>
\ No newline at end of file
rocket-chat-android-widgets/src/main/res/anim/slide_in_right.xml
0 → 100644
View file @
05c4fcb0
<?xml version="1.0" encoding="utf-8"?>
<set
xmlns:android=
"http://schemas.android.com/apk/res/android"
>
<translate
android:fromXDelta=
"100%p"
android:toXDelta=
"0"
android:duration=
"@android:integer/config_mediumAnimTime"
/>
</set>
\ No newline at end of file
rocket-chat-android-widgets/src/main/res/anim/slide_out_left.xml
0 → 100644
View file @
05c4fcb0
<?xml version="1.0" encoding="utf-8"?>
<set
xmlns:android=
"http://schemas.android.com/apk/res/android"
>
<translate
android:fromXDelta=
"0"
android:toXDelta=
"-100%p"
android:duration=
"@android:integer/config_mediumAnimTime"
/>
</set>
\ No newline at end of file
rocket-chat-android-widgets/src/main/res/anim/slide_out_right.xml
0 → 100644
View file @
05c4fcb0
<?xml version="1.0" encoding="utf-8"?>
<set
xmlns:android=
"http://schemas.android.com/apk/res/android"
>
<translate
android:fromXDelta=
"0"
android:toXDelta=
"100%p"
android:duration=
"@android:integer/config_mediumAnimTime"
/>
</set>
\ 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