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
0833e3d0
Commit
0833e3d0
authored
Mar 12, 2018
by
Shailesh Baldaniya
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
feat: Add sorting option for chatrooms
parent
2176c0ce
Changes
9
Hide whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
245 additions
and
3 deletions
+245
-3
RocketChatApplication.kt
...ain/java/chat/rocket/android/app/RocketChatApplication.kt
+7
-2
ChatRoomsPresenter.kt
...cket/android/chatrooms/presentation/ChatRoomsPresenter.kt
+54
-1
ChatRoomsFragment.kt
...ava/chat/rocket/android/chatrooms/ui/ChatRoomsFragment.kt
+56
-0
Constants.kt
app/src/main/java/chat/rocket/android/helper/Constants.kt
+17
-0
SharedPreferenceHelper.kt
...java/chat/rocket/android/helper/SharedPreferenceHelper.kt
+48
-0
ic_sort.xml
app/src/main/res/drawable/ic_sort.xml
+9
-0
chatroom_sort_dialog.xml
app/src/main/res/layout/chatroom_sort_dialog.xml
+40
-0
chatrooms.xml
app/src/main/res/menu/chatrooms.xml
+6
-0
strings.xml
app/src/main/res/values/strings.xml
+8
-0
No files found.
app/src/main/java/chat/rocket/android/app/RocketChatApplication.kt
View file @
0833e3d0
...
@@ -39,6 +39,7 @@ import kotlinx.coroutines.experimental.CommonPool
...
@@ -39,6 +39,7 @@ import kotlinx.coroutines.experimental.CommonPool
import
kotlinx.coroutines.experimental.launch
import
kotlinx.coroutines.experimental.launch
import
kotlinx.coroutines.experimental.runBlocking
import
kotlinx.coroutines.experimental.runBlocking
import
timber.log.Timber
import
timber.log.Timber
import
java.lang.ref.WeakReference
import
javax.inject.Inject
import
javax.inject.Inject
...
@@ -86,6 +87,7 @@ class RocketChatApplication : Application(), HasActivityInjector, HasServiceInje
...
@@ -86,6 +87,7 @@ class RocketChatApplication : Application(), HasActivityInjector, HasServiceInje
// TODO - remove this on the future, temporary migration stuff for pre-release versions.
// TODO - remove this on the future, temporary migration stuff for pre-release versions.
migrateInternalTokens
()
migrateInternalTokens
()
context
=
WeakReference
(
applicationContext
)
AndroidThreeTen
.
init
(
this
)
AndroidThreeTen
.
init
(
this
)
EmojiRepository
.
load
(
this
)
EmojiRepository
.
load
(
this
)
...
@@ -256,8 +258,11 @@ class RocketChatApplication : Application(), HasActivityInjector, HasServiceInje
...
@@ -256,8 +258,11 @@ class RocketChatApplication : Application(), HasActivityInjector, HasServiceInje
return
serviceDispatchingAndroidInjector
return
serviceDispatchingAndroidInjector
}
}
override
fun
broadcastReceiverInjector
():
AndroidInjector
<
BroadcastReceiver
>
{
companion
object
{
return
broadcastReceiverInjector
var
context
:
WeakReference
<
Context
>?
=
null
fun
getAppContext
():
Context
?
{
return
context
?.
get
()
}
}
}
}
}
...
...
app/src/main/java/chat/rocket/android/chatrooms/presentation/ChatRoomsPresenter.kt
View file @
0833e3d0
...
@@ -3,6 +3,9 @@ package chat.rocket.android.chatrooms.presentation
...
@@ -3,6 +3,9 @@ package chat.rocket.android.chatrooms.presentation
import
chat.rocket.android.chatroom.viewmodel.ViewModelMapper
import
chat.rocket.android.chatroom.viewmodel.ViewModelMapper
import
chat.rocket.android.core.lifecycle.CancelStrategy
import
chat.rocket.android.core.lifecycle.CancelStrategy
import
chat.rocket.android.main.presentation.MainNavigator
import
chat.rocket.android.main.presentation.MainNavigator
import
chat.rocket.android.helper.ChatRoomsSortOrder
import
chat.rocket.android.helper.Constants
import
chat.rocket.android.helper.SharedPreferenceHelper
import
chat.rocket.android.server.domain.*
import
chat.rocket.android.server.domain.*
import
chat.rocket.android.server.infraestructure.ConnectionManager
import
chat.rocket.android.server.infraestructure.ConnectionManager
import
chat.rocket.android.server.infraestructure.ConnectionManagerFactory
import
chat.rocket.android.server.infraestructure.ConnectionManagerFactory
...
@@ -20,12 +23,15 @@ import chat.rocket.core.internal.realtime.StreamMessage
...
@@ -20,12 +23,15 @@ import chat.rocket.core.internal.realtime.StreamMessage
import
chat.rocket.core.internal.realtime.Type
import
chat.rocket.core.internal.realtime.Type
import
chat.rocket.core.internal.rest.spotlight
import
chat.rocket.core.internal.rest.spotlight
import
chat.rocket.core.model.ChatRoom
import
chat.rocket.core.model.ChatRoom
import
chat.rocket.core.model.Message
import
chat.rocket.core.model.Room
import
chat.rocket.core.model.Room
import
kotlinx.coroutines.experimental.*
import
kotlinx.coroutines.experimental.*
import
kotlinx.coroutines.experimental.android.UI
import
kotlinx.coroutines.experimental.android.UI
import
kotlinx.coroutines.experimental.channels.Channel
import
kotlinx.coroutines.experimental.channels.Channel
import
timber.log.Timber
import
timber.log.Timber
import
javax.inject.Inject
import
javax.inject.Inject
import
kotlin.reflect.KProperty
import
kotlin.reflect.KProperty1
class
ChatRoomsPresenter
@Inject
constructor
(
private
val
view
:
ChatRoomsView
,
class
ChatRoomsPresenter
@Inject
constructor
(
private
val
view
:
ChatRoomsView
,
private
val
strategy
:
CancelStrategy
,
private
val
strategy
:
CancelStrategy
,
...
@@ -164,9 +170,56 @@ class ChatRoomsPresenter @Inject constructor(private val view: ChatRoomsView,
...
@@ -164,9 +170,56 @@ class ChatRoomsPresenter @Inject constructor(private val view: ChatRoomsView,
return
getChatRoomsWithPreviews
(
sortedRooms
)
return
getChatRoomsWithPreviews
(
sortedRooms
)
}
}
fun
updatedSortedChatRooms
()
{
val
currentServer
=
serverInteractor
.
get
()
!!
launchUI
(
strategy
)
{
val
roomList
=
getChatRoomsInteractor
.
get
(
currentServer
)
view
.
updateChatRooms
(
sortRooms
(
roomList
))
}
}
private
fun
sortRooms
(
chatRooms
:
List
<
ChatRoom
>):
List
<
ChatRoom
>
{
private
fun
sortRooms
(
chatRooms
:
List
<
ChatRoom
>):
List
<
ChatRoom
>
{
val
sortType
=
SharedPreferenceHelper
.
getInt
(
Constants
.
CHATROOM_SORT_TYPE_KEY
,
ChatRoomsSortOrder
.
ACTIVITY
)
val
groupByType
=
SharedPreferenceHelper
.
getBoolean
(
Constants
.
CHATROOM_GROUP_BY_TYPE_KEY
,
false
)
val
openChatRooms
=
getOpenChatRooms
(
chatRooms
)
val
openChatRooms
=
getOpenChatRooms
(
chatRooms
)
return
sortChatRooms
(
openChatRooms
)
return
when
(
sortType
)
{
ChatRoomsSortOrder
.
ALPHABETICAL
->
{
when
(
groupByType
)
{
true
->
openChatRooms
.
sortedWith
(
compareBy
(
ChatRoom
::
type
).
thenBy
{
it
.
name
})
false
->
openChatRooms
.
sortedWith
(
compareBy
(
ChatRoom
::
name
))
}
}
ChatRoomsSortOrder
.
ACTIVITY
->
{
when
(
groupByType
)
{
true
->
openChatRooms
.
sortedWith
(
compareBy
(
ChatRoom
::
type
).
thenByDescending
{
it
.
lastMessage
?.
timestamp
})
false
->
openChatRooms
.
sortedByDescending
{
chatRoom
->
chatRoom
.
lastMessage
?.
timestamp
}
}
}
else
->
{
openChatRooms
}
}
}
private
fun
compareBy
(
selector
:
KProperty
<
Message
?
>):
Comparator
<
ChatRoom
>
{
return
Comparator
{
a
,
b
->
(
a
.
lastMessage
?.
timestamp
!!
-
b
.
lastMessage
?.
timestamp
!!
).
toInt
()
}
}
private
fun
compareBy
(
selector
:
KProperty1
<
ChatRoom
,
RoomType
>):
Comparator
<
ChatRoom
>
{
return
Comparator
{
a
,
b
->
getTypeConstant
(
a
.
type
)
-
getTypeConstant
(
b
.
type
)
}
}
private
fun
getTypeConstant
(
roomType
:
RoomType
):
Int
{
return
when
(
roomType
)
{
is
RoomType
.
Channel
->
Constants
.
CHATROOM_CHANNEL
is
RoomType
.
PrivateGroup
->
Constants
.
CHATROOM_PRIVATE_GROUP
is
RoomType
.
DirectMessage
->
Constants
.
CHATROOM_DM
else
->
0
}
}
}
private
fun
updateRooms
()
{
private
fun
updateRooms
()
{
...
...
app/src/main/java/chat/rocket/android/chatrooms/ui/ChatRoomsFragment.kt
View file @
0833e3d0
package
chat.rocket.android.chatrooms.ui
package
chat.rocket.android.chatrooms.ui
import
android.app.AlertDialog
import
android.content.Context
import
android.content.SharedPreferences
import
android.os.Bundle
import
android.os.Bundle
import
android.os.Handler
import
android.os.Handler
import
android.support.v4.app.Fragment
import
android.support.v4.app.Fragment
...
@@ -9,10 +12,15 @@ import android.support.v7.widget.DefaultItemAnimator
...
@@ -9,10 +12,15 @@ import android.support.v7.widget.DefaultItemAnimator
import
android.support.v7.widget.LinearLayoutManager
import
android.support.v7.widget.LinearLayoutManager
import
android.support.v7.widget.SearchView
import
android.support.v7.widget.SearchView
import
android.view.*
import
android.view.*
import
android.widget.CheckBox
import
android.widget.RadioGroup
import
chat.rocket.android.R
import
chat.rocket.android.R
import
chat.rocket.android.chatrooms.presentation.ChatRoomsPresenter
import
chat.rocket.android.chatrooms.presentation.ChatRoomsPresenter
import
chat.rocket.android.chatrooms.presentation.ChatRoomsView
import
chat.rocket.android.chatrooms.presentation.ChatRoomsView
import
chat.rocket.android.infrastructure.LocalRepository
import
chat.rocket.android.infrastructure.LocalRepository
import
chat.rocket.android.helper.ChatRoomsSortOrder
import
chat.rocket.android.helper.Constants
import
chat.rocket.android.helper.SharedPreferenceHelper
import
chat.rocket.android.server.domain.GetCurrentServerInteractor
import
chat.rocket.android.server.domain.GetCurrentServerInteractor
import
chat.rocket.android.server.domain.SettingsRepository
import
chat.rocket.android.server.domain.SettingsRepository
import
chat.rocket.android.util.extensions.*
import
chat.rocket.android.util.extensions.*
...
@@ -28,11 +36,13 @@ import kotlinx.coroutines.experimental.async
...
@@ -28,11 +36,13 @@ import kotlinx.coroutines.experimental.async
import
kotlinx.coroutines.experimental.launch
import
kotlinx.coroutines.experimental.launch
import
javax.inject.Inject
import
javax.inject.Inject
class
ChatRoomsFragment
:
Fragment
(),
ChatRoomsView
{
class
ChatRoomsFragment
:
Fragment
(),
ChatRoomsView
{
@Inject
lateinit
var
presenter
:
ChatRoomsPresenter
@Inject
lateinit
var
presenter
:
ChatRoomsPresenter
@Inject
lateinit
var
serverInteractor
:
GetCurrentServerInteractor
@Inject
lateinit
var
serverInteractor
:
GetCurrentServerInteractor
@Inject
lateinit
var
settingsRepository
:
SettingsRepository
@Inject
lateinit
var
settingsRepository
:
SettingsRepository
@Inject
lateinit
var
localRepository
:
LocalRepository
@Inject
lateinit
var
localRepository
:
LocalRepository
private
lateinit
var
preferences
:
SharedPreferences
private
var
searchView
:
SearchView
?
=
null
private
var
searchView
:
SearchView
?
=
null
private
val
handler
=
Handler
()
private
val
handler
=
Handler
()
...
@@ -46,6 +56,7 @@ class ChatRoomsFragment : Fragment(), ChatRoomsView {
...
@@ -46,6 +56,7 @@ class ChatRoomsFragment : Fragment(), ChatRoomsView {
super
.
onCreate
(
savedInstanceState
)
super
.
onCreate
(
savedInstanceState
)
AndroidSupportInjection
.
inject
(
this
)
AndroidSupportInjection
.
inject
(
this
)
setHasOptionsMenu
(
true
)
setHasOptionsMenu
(
true
)
preferences
=
context
?.
getSharedPreferences
(
"temp"
,
Context
.
MODE_PRIVATE
)
!!
}
}
override
fun
onDestroy
()
{
override
fun
onDestroy
()
{
...
@@ -87,6 +98,51 @@ class ChatRoomsFragment : Fragment(), ChatRoomsView {
...
@@ -87,6 +98,51 @@ class ChatRoomsFragment : Fragment(), ChatRoomsView {
})
})
}
}
override
fun
onOptionsItemSelected
(
item
:
MenuItem
?):
Boolean
{
when
(
item
?.
itemId
)
{
R
.
id
.
action_sort
->
{
val
dialogLayout
=
layoutInflater
.
inflate
(
R
.
layout
.
chatroom_sort_dialog
,
null
)
val
sortType
=
SharedPreferenceHelper
.
getInt
(
Constants
.
CHATROOM_SORT_TYPE_KEY
,
ChatRoomsSortOrder
.
ACTIVITY
)
val
groupByType
=
SharedPreferenceHelper
.
getBoolean
(
Constants
.
CHATROOM_GROUP_BY_TYPE_KEY
,
false
)
val
radioGroup
=
dialogLayout
.
findViewById
<
RadioGroup
>(
R
.
id
.
radio_group_sort
)
val
groupByTypeCheckBox
=
dialogLayout
.
findViewById
<
CheckBox
>(
R
.
id
.
checkbox_group_by_type
)
radioGroup
.
check
(
when
(
sortType
)
{
0
->
R
.
id
.
radio_sort_alphabetical
else
->
R
.
id
.
radio_sort_activity
})
radioGroup
.
setOnCheckedChangeListener
({
_
,
checkedId
->
run
{
SharedPreferenceHelper
.
putInt
(
Constants
.
CHATROOM_SORT_TYPE_KEY
,
when
(
checkedId
)
{
R
.
id
.
radio_sort_alphabetical
->
0
R
.
id
.
radio_sort_activity
->
1
else
->
1
})
presenter
.
updatedSortedChatRooms
()
recycler_view
.
scrollTo
(
0
,
0
)
}
})
groupByTypeCheckBox
.
isChecked
=
groupByType
groupByTypeCheckBox
.
setOnCheckedChangeListener
({
_
,
isChecked
->
SharedPreferenceHelper
.
putBoolean
(
Constants
.
CHATROOM_GROUP_BY_TYPE_KEY
,
isChecked
)
presenter
.
updatedSortedChatRooms
()
recycler_view
.
scrollTo
(
0
,
0
)
})
val
dialogSort
=
AlertDialog
.
Builder
(
context
)
.
setTitle
(
R
.
string
.
dialog_sort_title
)
.
setView
(
dialogLayout
)
.
setPositiveButton
(
"Done"
,
{
dialog
,
_
->
dialog
.
dismiss
()
})
dialogSort
.
show
()
}
}
return
super
.
onOptionsItemSelected
(
item
)
}
override
suspend
fun
updateChatRooms
(
newDataSet
:
List
<
ChatRoom
>)
{
override
suspend
fun
updateChatRooms
(
newDataSet
:
List
<
ChatRoom
>)
{
activity
?.
apply
{
activity
?.
apply
{
listJob
?.
cancel
()
listJob
?.
cancel
()
...
...
app/src/main/java/chat/rocket/android/helper/Constants.kt
0 → 100644
View file @
0833e3d0
package
chat.rocket.android.helper
object
Constants
{
const
val
CHATROOM_SORT_TYPE_KEY
:
String
=
"chatroom_sort_type"
const
val
CHATROOM_GROUP_BY_TYPE_KEY
:
String
=
"chatroom_group_by_type"
const
val
CHATROOM_GROUP_FAVOURITES_KEY
:
String
=
"chatroom_group_favourites"
//Used to sort chat rooms
const
val
CHATROOM_CHANNEL
=
0
const
val
CHATROOM_PRIVATE_GROUP
=
1
const
val
CHATROOM_DM
=
2
}
object
ChatRoomsSortOrder
{
const
val
ALPHABETICAL
:
Int
=
0
const
val
ACTIVITY
:
Int
=
1
}
\ No newline at end of file
app/src/main/java/chat/rocket/android/helper/SharedPreferenceHelper.kt
0 → 100644
View file @
0833e3d0
package
chat.rocket.android.helper
import
android.content.SharedPreferences
import
android.preference.PreferenceManager
import
chat.rocket.android.app.RocketChatApplication
object
SharedPreferenceHelper
{
private
var
sharedPreferences
:
SharedPreferences
=
PreferenceManager
.
getDefaultSharedPreferences
(
RocketChatApplication
.
getAppContext
())
private
var
editor
:
SharedPreferences
.
Editor
?
=
sharedPreferences
.
edit
()
//Add more methods for other types if needed
fun
putInt
(
key
:
String
,
value
:
Int
)
{
editor
!!
.
putInt
(
key
,
value
).
apply
()
}
fun
getInt
(
key
:
String
,
defaultValue
:
Int
):
Int
{
return
sharedPreferences
.
getInt
(
key
,
defaultValue
)
}
fun
putLong
(
key
:
String
,
value
:
Long
)
{
editor
!!
.
putLong
(
key
,
value
).
apply
()
}
fun
getLong
(
key
:
String
,
defaultValue
:
Long
):
Long
{
return
sharedPreferences
.
getLong
(
key
,
defaultValue
)
}
fun
putString
(
key
:
String
,
value
:
String
)
{
editor
!!
.
putString
(
key
,
value
).
apply
()
}
fun
getString
(
key
:
String
,
defaultValue
:
String
):
String
?
{
return
sharedPreferences
.
getString
(
key
,
defaultValue
)
}
fun
putBoolean
(
key
:
String
,
value
:
Boolean
)
{
editor
!!
.
putBoolean
(
key
,
value
).
apply
()
}
fun
getBoolean
(
key
:
String
,
defaultValue
:
Boolean
):
Boolean
{
return
sharedPreferences
.
getBoolean
(
key
,
defaultValue
)
}
fun
remove
(
key
:
String
)
{
editor
!!
.
remove
(
key
).
apply
()
}
}
\ No newline at end of file
app/src/main/res/drawable/ic_sort.xml
0 → 100644
View file @
0833e3d0
<vector
xmlns:android=
"http://schemas.android.com/apk/res/android"
android:width=
"24dp"
android:height=
"24dp"
android:viewportHeight=
"24.0"
android:viewportWidth=
"24.0"
>
<path
android:fillColor=
"#FFFFFFFF"
android:pathData=
"M3,18h6v-2L3,16v2zM3,6v2h18L21,6L3,6zM3,13h12v-2L3,11v2z"
/>
</vector>
app/src/main/res/layout/chatroom_sort_dialog.xml
0 → 100644
View file @
0833e3d0
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android=
"http://schemas.android.com/apk/res/android"
android:layout_width=
"match_parent"
android:layout_height=
"match_parent"
android:orientation=
"vertical"
android:padding=
"24dp"
>
<RadioGroup
android:id=
"@+id/radio_group_sort"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
>
<RadioButton
android:id=
"@+id/radio_sort_alphabetical"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:padding=
"8dp"
android:text=
"@string/dialog_sort_by_alphabet"
android:textSize=
"18sp"
/>
<RadioButton
android:id=
"@+id/radio_sort_activity"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:padding=
"8dp"
android:text=
"@string/dialog_sort_by_activity"
android:textSize=
"18sp"
/>
</RadioGroup>
<CheckBox
android:id=
"@+id/checkbox_group_by_type"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:layout_marginTop=
"6dp"
android:padding=
"8dp"
android:text=
"@string/dialog_group_by_type"
android:textSize=
"18sp"
/>
<!--TODO Add checkbox for "Group favourites after sdk support"-->
</LinearLayout>
\ No newline at end of file
app/src/main/res/menu/chatrooms.xml
View file @
0833e3d0
...
@@ -9,4 +9,10 @@
...
@@ -9,4 +9,10 @@
app:actionViewClass=
"android.support.v7.widget.SearchView"
app:actionViewClass=
"android.support.v7.widget.SearchView"
app:showAsAction=
"ifRoom|collapseActionView"
/>
app:showAsAction=
"ifRoom|collapseActionView"
/>
<item
android:id=
"@+id/action_sort"
android:icon=
"@drawable/ic_sort"
android:title=
"@string/menu_chatroom_sort"
app:showAsAction=
"always"
/>
</menu>
</menu>
\ No newline at end of file
app/src/main/res/values/strings.xml
View file @
0833e3d0
...
@@ -150,4 +150,12 @@
...
@@ -150,4 +150,12 @@
<!-- Emoji message-->
<!-- Emoji message-->
<string
name=
"msg_no_recent_emoji"
>
No recent emoji
</string>
<string
name=
"msg_no_recent_emoji"
>
No recent emoji
</string>
<!-- Sorting and grouping-->
<string
name=
"menu_chatroom_sort"
>
Sort
</string>
<string
name=
"dialog_sort_title"
>
Sort by
</string>
<string
name=
"dialog_sort_by_alphabet"
>
Alphabetical
</string>
<string
name=
"dialog_sort_by_activity"
>
Activity
</string>
<string
name=
"dialog_group_by_type"
>
Group by type
</string>
<string
name=
"dialog_group_favourites"
>
Group favourites
</string>
</resources>
</resources>
\ 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