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
83b4d94c
Unverified
Commit
83b4d94c
authored
Mar 31, 2018
by
Rafael Kellermann Streit
Committed by
GitHub
Mar 31, 2018
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #887 from Shailesh351/sort
[NEW] feat: Add sorting option for chatrooms
parents
fa6fdd04
392faa90
Changes
13
Hide whitespace changes
Inline
Side-by-side
Showing
13 changed files
with
495 additions
and
8 deletions
+495
-8
RocketChatApplication.kt
...ain/java/chat/rocket/android/app/RocketChatApplication.kt
+9
-0
ChatRoomsPresenter.kt
...cket/android/chatrooms/presentation/ChatRoomsPresenter.kt
+51
-1
ChatRoomsFragment.kt
...ava/chat/rocket/android/chatrooms/ui/ChatRoomsFragment.kt
+109
-7
SimpleSectionedRecyclerViewAdapter.kt
...ndroid/chatrooms/ui/SimpleSectionedRecyclerViewAdapter.kt
+142
-0
Constants.kt
app/src/main/java/chat/rocket/android/helper/Constants.kt
+18
-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
item_chatroom_header.xml
app/src/main/res/layout/item_chatroom_header.xml
+27
-0
chatrooms.xml
app/src/main/res/menu/chatrooms.xml
+6
-0
strings.xml
app/src/main/res/values-pt-rBR/strings.xml
+16
-0
strings.xml
app/src/main/res/values/strings.xml
+16
-0
styles.xml
app/src/main/res/values/styles.xml
+4
-0
No files found.
app/src/main/java/chat/rocket/android/app/RocketChatApplication.kt
View file @
83b4d94c
...
...
@@ -39,6 +39,7 @@ import kotlinx.coroutines.experimental.CommonPool
import
kotlinx.coroutines.experimental.launch
import
kotlinx.coroutines.experimental.runBlocking
import
timber.log.Timber
import
java.lang.ref.WeakReference
import
javax.inject.Inject
...
...
@@ -86,6 +87,7 @@ class RocketChatApplication : Application(), HasActivityInjector, HasServiceInje
// TODO - remove this on the future, temporary migration stuff for pre-release versions.
migrateInternalTokens
()
context
=
WeakReference
(
applicationContext
)
AndroidThreeTen
.
init
(
this
)
EmojiRepository
.
load
(
this
)
...
...
@@ -259,6 +261,13 @@ class RocketChatApplication : Application(), HasActivityInjector, HasServiceInje
override
fun
broadcastReceiverInjector
():
AndroidInjector
<
BroadcastReceiver
>
{
return
broadcastReceiverInjector
}
companion
object
{
var
context
:
WeakReference
<
Context
>?
=
null
fun
getAppContext
():
Context
?
{
return
context
?.
get
()
}
}
}
private
fun
LocalRepository
.
setMigrated
(
migrated
:
Boolean
)
{
...
...
app/src/main/java/chat/rocket/android/chatrooms/presentation/ChatRoomsPresenter.kt
View file @
83b4d94c
...
...
@@ -3,6 +3,9 @@ package chat.rocket.android.chatrooms.presentation
import
chat.rocket.android.chatroom.viewmodel.ViewModelMapper
import
chat.rocket.android.core.lifecycle.CancelStrategy
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.infraestructure.ConnectionManager
import
chat.rocket.android.server.infraestructure.ConnectionManagerFactory
...
...
@@ -20,12 +23,15 @@ import chat.rocket.core.internal.realtime.StreamMessage
import
chat.rocket.core.internal.realtime.Type
import
chat.rocket.core.internal.rest.spotlight
import
chat.rocket.core.model.ChatRoom
import
chat.rocket.core.model.Message
import
chat.rocket.core.model.Room
import
kotlinx.coroutines.experimental.*
import
kotlinx.coroutines.experimental.android.UI
import
kotlinx.coroutines.experimental.channels.Channel
import
timber.log.Timber
import
javax.inject.Inject
import
kotlin.reflect.KProperty
import
kotlin.reflect.KProperty1
class
ChatRoomsPresenter
@Inject
constructor
(
private
val
view
:
ChatRoomsView
,
private
val
strategy
:
CancelStrategy
,
...
...
@@ -164,9 +170,53 @@ class ChatRoomsPresenter @Inject constructor(private val view: ChatRoomsView,
return
getChatRoomsWithPreviews
(
sortedRooms
)
}
fun
updateSortedChatRooms
()
{
val
currentServer
=
serverInteractor
.
get
()
!!
launchUI
(
strategy
)
{
val
roomList
=
getChatRoomsInteractor
.
get
(
currentServer
)
view
.
updateChatRooms
(
sortRooms
(
roomList
))
}
}
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
)
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
:
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
is
RoomType
.
Livechat
->
Constants
.
CHATROOM_LIVE_CHAT
else
->
0
}
}
private
fun
updateRooms
()
{
...
...
app/src/main/java/chat/rocket/android/chatrooms/ui/ChatRoomsFragment.kt
View file @
83b4d94c
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.Handler
import
android.support.v4.app.Fragment
...
...
@@ -9,14 +12,20 @@ import android.support.v7.widget.DefaultItemAnimator
import
android.support.v7.widget.LinearLayoutManager
import
android.support.v7.widget.SearchView
import
android.view.*
import
android.widget.CheckBox
import
android.widget.RadioGroup
import
chat.rocket.android.R
import
chat.rocket.android.chatrooms.presentation.ChatRoomsPresenter
import
chat.rocket.android.chatrooms.presentation.ChatRoomsView
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.SettingsRepository
import
chat.rocket.android.util.extensions.*
import
chat.rocket.android.widget.DividerItemDecoration
import
chat.rocket.common.model.RoomType
import
chat.rocket.core.internal.realtime.State
import
chat.rocket.core.model.ChatRoom
import
dagger.android.support.AndroidSupportInjection
...
...
@@ -28,15 +37,18 @@ import kotlinx.coroutines.experimental.async
import
kotlinx.coroutines.experimental.launch
import
javax.inject.Inject
class
ChatRoomsFragment
:
Fragment
(),
ChatRoomsView
{
@Inject
lateinit
var
presenter
:
ChatRoomsPresenter
@Inject
lateinit
var
serverInteractor
:
GetCurrentServerInteractor
@Inject
lateinit
var
settingsRepository
:
SettingsRepository
@Inject
lateinit
var
localRepository
:
LocalRepository
private
lateinit
var
preferences
:
SharedPreferences
private
var
searchView
:
SearchView
?
=
null
private
val
handler
=
Handler
()
private
var
listJob
:
Job
?
=
null
private
var
sectionedAdapter
:
SimpleSectionedRecyclerViewAdapter
?
=
null
companion
object
{
fun
newInstance
()
=
ChatRoomsFragment
()
...
...
@@ -46,6 +58,7 @@ class ChatRoomsFragment : Fragment(), ChatRoomsView {
super
.
onCreate
(
savedInstanceState
)
AndroidSupportInjection
.
inject
(
this
)
setHasOptionsMenu
(
true
)
preferences
=
context
?.
getSharedPreferences
(
"temp"
,
Context
.
MODE_PRIVATE
)
!!
}
override
fun
onDestroy
()
{
...
...
@@ -87,20 +100,76 @@ 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
.
updateSortedChatRooms
()
invalidateQueryOnSearch
()
}
})
groupByTypeCheckBox
.
isChecked
=
groupByType
groupByTypeCheckBox
.
setOnCheckedChangeListener
({
_
,
isChecked
->
SharedPreferenceHelper
.
putBoolean
(
Constants
.
CHATROOM_GROUP_BY_TYPE_KEY
,
isChecked
)
presenter
.
updateSortedChatRooms
()
invalidateQueryOnSearch
()
})
val
dialogSort
=
AlertDialog
.
Builder
(
context
)
.
setTitle
(
R
.
string
.
dialog_sort_title
)
.
setView
(
dialogLayout
)
.
setPositiveButton
(
"Done"
,
{
dialog
,
_
->
dialog
.
dismiss
()
})
dialogSort
.
show
()
}
}
return
super
.
onOptionsItemSelected
(
item
)
}
private
fun
invalidateQueryOnSearch
(){
searchView
?.
let
{
if
(!
searchView
!!
.
isIconified
){
queryChatRoomsByName
(
searchView
!!
.
query
.
toString
())
}
}
}
override
suspend
fun
updateChatRooms
(
newDataSet
:
List
<
ChatRoom
>)
{
activity
?.
apply
{
listJob
?.
cancel
()
listJob
=
launch
(
UI
)
{
val
adapter
=
recycler_view
.
adapter
as
ChatRooms
Adapter
val
adapter
=
recycler_view
.
adapter
as
SimpleSectionedRecyclerView
Adapter
// FIXME https://fabric.io/rocketchat3/android/apps/chat.rocket.android.dev/issues/5a90d4718cb3c2fa63b3f557?time=last-seven-days
// TODO - fix this bug to reenable DiffUtil
val
diff
=
async
(
CommonPool
)
{
DiffUtil
.
calculateDiff
(
RoomsDiffCallback
(
adapter
.
dataSet
,
newDataSet
))
DiffUtil
.
calculateDiff
(
RoomsDiffCallback
(
adapter
.
baseAdapter
.
dataSet
,
newDataSet
))
}.
await
()
if
(
isActive
)
{
adapter
.
updateRooms
(
newDataSet
)
adapter
.
baseAdapter
.
updateRooms
(
newDataSet
)
diff
.
dispatchUpdatesTo
(
adapter
)
//Set sections always after data set is updated
setSections
()
}
}
}
...
...
@@ -162,12 +231,45 @@ class ChatRoomsFragment : Fragment(), ChatRoomsView {
resources
.
getDimensionPixelSize
(
R
.
dimen
.
divider_item_decorator_bound_end
)))
recycler_view
.
itemAnimator
=
DefaultItemAnimator
()
// TODO - use a ViewModel Mapper instead of using settings on the adapter
recycler_view
.
adapter
=
ChatRoomsAdapter
(
this
,
settingsRepository
.
get
(
serverInteractor
.
get
()
!!
),
localRepository
)
{
chatRoom
->
presenter
.
loadChatRoom
(
chatRoom
)
val
baseAdapter
=
ChatRoomsAdapter
(
this
,
settingsRepository
.
get
(
serverInteractor
.
get
()
!!
),
localRepository
)
{
chatRoom
->
presenter
.
loadChatRoom
(
chatRoom
)
}
sectionedAdapter
=
SimpleSectionedRecyclerViewAdapter
(
this
,
R
.
layout
.
item_chatroom_header
,
R
.
id
.
text_chatroom_header
,
baseAdapter
!!
)
recycler_view
.
adapter
=
sectionedAdapter
}
}
private
fun
setSections
()
{
//Don't add section if not grouping by RoomType
if
(!
SharedPreferenceHelper
.
getBoolean
(
Constants
.
CHATROOM_GROUP_BY_TYPE_KEY
,
false
))
{
sectionedAdapter
?.
clearSections
()
return
}
val
sections
=
ArrayList
<
SimpleSectionedRecyclerViewAdapter
.
Section
>()
sectionedAdapter
?.
baseAdapter
?.
dataSet
?.
let
{
var
previousChatRoomType
=
""
for
((
position
,
chatRoom
)
in
it
.
withIndex
())
{
val
type
=
chatRoom
.
type
.
toString
()
if
(
type
!=
previousChatRoomType
)
{
val
title
=
when
(
type
)
{
RoomType
.
CHANNEL
.
toString
()
->
resources
.
getString
(
R
.
string
.
header_channel
)
RoomType
.
PRIVATE_GROUP
.
toString
()
->
resources
.
getString
(
R
.
string
.
header_private_groups
)
RoomType
.
DIRECT_MESSAGE
.
toString
()
->
resources
.
getString
(
R
.
string
.
header_direct_messages
)
RoomType
.
LIVECHAT
.
toString
()
->
resources
.
getString
(
R
.
string
.
header_live_chats
)
else
->
resources
.
getString
(
R
.
string
.
header_unknown
)
}
sections
.
add
(
SimpleSectionedRecyclerViewAdapter
.
Section
(
position
,
title
))
}
previousChatRoomType
=
chatRoom
.
type
.
toString
()
}
}
val
dummy
=
arrayOfNulls
<
SimpleSectionedRecyclerViewAdapter
.
Section
>(
sections
.
size
)
sectionedAdapter
?.
setSections
(
sections
.
toArray
(
dummy
))
}
private
fun
queryChatRoomsByName
(
name
:
String
?):
Boolean
{
...
...
app/src/main/java/chat/rocket/android/chatrooms/ui/SimpleSectionedRecyclerViewAdapter.kt
0 → 100644
View file @
83b4d94c
package
chat.rocket.android.chatrooms.ui
import
android.content.Context
import
android.support.v7.widget.RecyclerView
import
android.util.SparseArray
import
android.view.LayoutInflater
import
android.view.View
import
android.view.ViewGroup
import
android.widget.TextView
import
java.util.*
class
SimpleSectionedRecyclerViewAdapter
(
private
val
context
:
Context
,
private
val
sectionResourceId
:
Int
,
private
val
textResourceId
:
Int
,
val
baseAdapter
:
ChatRoomsAdapter
)
:
RecyclerView
.
Adapter
<
RecyclerView
.
ViewHolder
>()
{
private
var
isValid
=
true
private
val
sectionsHeaders
=
SparseArray
<
Section
>()
init
{
baseAdapter
.
registerAdapterDataObserver
(
object
:
RecyclerView
.
AdapterDataObserver
()
{
override
fun
onChanged
()
{
isValid
=
baseAdapter
.
itemCount
>
0
notifyDataSetChanged
()
}
override
fun
onItemRangeChanged
(
positionStart
:
Int
,
itemCount
:
Int
)
{
isValid
=
baseAdapter
.
itemCount
>
0
notifyItemRangeChanged
(
positionStart
,
itemCount
)
}
override
fun
onItemRangeInserted
(
positionStart
:
Int
,
itemCount
:
Int
)
{
isValid
=
baseAdapter
.
itemCount
>
0
notifyItemRangeInserted
(
positionStart
,
itemCount
)
}
override
fun
onItemRangeRemoved
(
positionStart
:
Int
,
itemCount
:
Int
)
{
isValid
=
baseAdapter
.
itemCount
>
0
notifyItemRangeRemoved
(
positionStart
,
itemCount
)
}
})
}
class
SectionViewHolder
(
view
:
View
,
textResourceId
:
Int
)
:
RecyclerView
.
ViewHolder
(
view
)
{
var
title
:
TextView
=
view
.
findViewById
<
View
>(
textResourceId
)
as
TextView
}
override
fun
onCreateViewHolder
(
parent
:
ViewGroup
,
typeView
:
Int
):
RecyclerView
.
ViewHolder
{
return
if
(
typeView
==
SECTION_TYPE
)
{
val
view
=
LayoutInflater
.
from
(
context
).
inflate
(
sectionResourceId
,
parent
,
false
)
SectionViewHolder
(
view
,
textResourceId
)
}
else
{
baseAdapter
.
onCreateViewHolder
(
parent
,
typeView
-
1
)
}
}
override
fun
onBindViewHolder
(
viewHolder
:
RecyclerView
.
ViewHolder
,
position
:
Int
)
{
if
(
isSectionHeaderPosition
(
position
))
{
(
viewHolder
as
SectionViewHolder
).
title
.
text
=
sectionsHeaders
.
get
(
position
).
title
}
else
{
baseAdapter
.
onBindViewHolder
(
viewHolder
as
ChatRoomsAdapter
.
ViewHolder
,
sectionedPositionToPosition
(
position
))
}
}
override
fun
getItemViewType
(
position
:
Int
):
Int
{
return
if
(
isSectionHeaderPosition
(
position
))
SECTION_TYPE
else
baseAdapter
.
getItemViewType
(
sectionedPositionToPosition
(
position
))
+
1
}
class
Section
(
internal
var
firstPosition
:
Int
,
var
title
:
CharSequence
)
{
internal
var
sectionedPosition
:
Int
=
0
}
fun
setSections
(
sections
:
Array
<
Section
>)
{
sectionsHeaders
.
clear
()
Arrays
.
sort
(
sections
)
{
section1
,
section2
->
when
{
section1
.
firstPosition
==
section2
.
firstPosition
->
0
section1
.
firstPosition
<
section2
.
firstPosition
->
-
1
else
->
1
}
}
for
((
offset
,
section
)
in
sections
.
withIndex
())
{
section
.
sectionedPosition
=
section
.
firstPosition
+
offset
sectionsHeaders
.
append
(
section
.
sectionedPosition
,
section
)
}
notifyDataSetChanged
()
}
fun
clearSections
(){
sectionsHeaders
.
clear
()
notifyDataSetChanged
()
}
fun
positionToSectionedPosition
(
position
:
Int
):
Int
{
var
offset
=
0
for
(
i
in
0
until
sectionsHeaders
.
size
())
{
if
(
sectionsHeaders
.
valueAt
(
i
).
firstPosition
>
position
)
{
break
}
++
offset
}
return
position
+
offset
}
private
fun
sectionedPositionToPosition
(
sectionedPosition
:
Int
):
Int
{
if
(
isSectionHeaderPosition
(
sectionedPosition
))
{
return
RecyclerView
.
NO_POSITION
}
var
offset
=
0
for
(
i
in
0
until
sectionsHeaders
.
size
())
{
if
(
sectionsHeaders
.
valueAt
(
i
).
sectionedPosition
>
sectionedPosition
)
{
break
}
--
offset
}
return
sectionedPosition
+
offset
}
private
fun
isSectionHeaderPosition
(
position
:
Int
):
Boolean
{
return
sectionsHeaders
.
get
(
position
)
!=
null
}
override
fun
getItemId
(
position
:
Int
):
Long
{
return
when
(
isSectionHeaderPosition
(
position
))
{
true
->
(
Integer
.
MAX_VALUE
-
sectionsHeaders
.
indexOfKey
(
position
)).
toLong
()
false
->
baseAdapter
.
getItemId
(
sectionedPositionToPosition
(
position
))
}
}
override
fun
getItemCount
():
Int
{
return
if
(
isValid
)
baseAdapter
.
itemCount
+
sectionsHeaders
.
size
()
else
0
}
companion
object
{
private
const
val
SECTION_TYPE
=
0
}
}
app/src/main/java/chat/rocket/android/helper/Constants.kt
0 → 100644
View file @
83b4d94c
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
const
val
CHATROOM_LIVE_CHAT
=
3
}
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 @
83b4d94c
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 @
83b4d94c
<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 @
83b4d94c
<?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/layout/item_chatroom_header.xml
0 → 100644
View file @
83b4d94c
<?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=
"wrap_content"
android:orientation=
"vertical"
>
<View
android:layout_width=
"match_parent"
android:layout_height=
"1dp"
android:background=
"@color/darkGray"
/>
<TextView
android:id=
"@+id/text_chatroom_header"
style=
"@style/ChatRooms.Header"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:padding=
"8dp"
android:paddingEnd=
"@dimen/screen_edge_left_and_right_padding"
android:paddingStart=
"@dimen/screen_edge_left_and_right_padding"
android:text=
"@string/chatroom_header"
/>
<View
android:layout_width=
"match_parent"
android:layout_height=
"1dp"
android:background=
"@color/darkGray"
/>
</LinearLayout>
\ No newline at end of file
app/src/main/res/menu/chatrooms.xml
View file @
83b4d94c
...
...
@@ -9,4 +9,10 @@
app:actionViewClass=
"android.support.v7.widget.SearchView"
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>
\ No newline at end of file
app/src/main/res/values-pt-rBR/strings.xml
View file @
83b4d94c
...
...
@@ -149,4 +149,20 @@
<!-- Emoji message-->
<string
name=
"msg_no_recent_emoji"
>
Nenhum emoji recente
</string>
<!-- Sorting and grouping-->
<string
name=
"menu_chatroom_sort"
>
Ordenar
</string>
<string
name=
"dialog_sort_title"
>
Ordenar por
</string>
<string
name=
"dialog_sort_by_alphabet"
>
Alfabeticamente
</string>
<string
name=
"dialog_sort_by_activity"
>
Atividade
</string>
<string
name=
"dialog_group_by_type"
>
Agrupar por tipo
</string>
<string
name=
"dialog_group_favourites"
>
Grupos favoritos
</string>
<string
name=
"chatroom_header"
>
Cabeçalho
</string>
<!--ChatRooms Headers-->
<string
name=
"header_channel"
>
Canais
</string>
<string
name=
"header_private_groups"
>
Grupos Privados
</string>
<string
name=
"header_direct_messages"
>
Mensagens diretas
</string>
<string
name=
"header_live_chats"
>
Live Chats
</string>
<string
name=
"header_unknown"
>
Desconhecido
</string>
</resources>
\ No newline at end of file
app/src/main/res/values/strings.xml
View file @
83b4d94c
...
...
@@ -150,4 +150,20 @@
<!-- Emoji message-->
<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>
<string
name=
"chatroom_header"
>
Header
</string>
<!--ChatRooms Headers-->
<string
name=
"header_channel"
>
Channels
</string>
<string
name=
"header_private_groups"
>
Private Groups
</string>
<string
name=
"header_direct_messages"
>
Direct Messages
</string>
<string
name=
"header_live_chats"
>
Live Chats
</string>
<string
name=
"header_unknown"
>
Unknown
</string>
</resources>
\ No newline at end of file
app/src/main/res/values/styles.xml
View file @
83b4d94c
...
...
@@ -71,6 +71,10 @@
<item
name=
"android:paddingStart"
>
@dimen/edit_text_margin
</item>
</style>
<style
name=
"ChatRooms.Header"
parent=
"TextAppearance.AppCompat.Headline"
>
<item
name=
"android:textSize"
>
16sp
</item>
</style>
<style
name=
"ChatRoom.Name.TextView"
parent=
"TextAppearance.AppCompat.Title"
>
<item
name=
"android:ellipsize"
>
end
</item>
<item
name=
"android:maxLines"
>
1
</item>
...
...
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