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
9ff47c86
Unverified
Commit
9ff47c86
authored
Mar 06, 2018
by
Lucio Maciel
Committed by
GitHub
Mar 06, 2018
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'develop-2.x' into release/2.0.0-beta7
parents
0083464a
fd036b3c
Changes
37
Hide whitespace changes
Inline
Side-by-side
Showing
37 changed files
with
722 additions
and
48 deletions
+722
-48
AndroidManifest.xml
app/src/main/AndroidManifest.xml
+4
-0
LoginFragment.kt
...t/rocket/android/authentication/login/ui/LoginFragment.kt
+30
-24
ChatRoomActivity.kt
.../java/chat/rocket/android/chatroom/ui/ChatRoomActivity.kt
+25
-0
ChatRoomsAdapter.kt
...java/chat/rocket/android/chatrooms/ui/ChatRoomsAdapter.kt
+26
-4
ActivityBuilder.kt
...java/chat/rocket/android/dagger/module/ActivityBuilder.kt
+6
-0
MainNavigator.kt
...va/chat/rocket/android/main/presentation/MainNavigator.kt
+7
-0
MainPresenter.kt
...va/chat/rocket/android/main/presentation/MainPresenter.kt
+2
-0
MainActivity.kt
...src/main/java/chat/rocket/android/main/ui/MainActivity.kt
+9
-0
ProfilePresenter.kt
...t/rocket/android/profile/presentation/ProfilePresenter.kt
+7
-3
ProfileFragment.kt
...in/java/chat/rocket/android/profile/ui/ProfileFragment.kt
+23
-11
SettingsFragmentModule.kt
...chat/rocket/android/settings/di/SettingsFragmentModule.kt
+29
-0
SettingsFragmentProvider.kt
...at/rocket/android/settings/di/SettingsFragmentProvider.kt
+11
-0
PasswordFragmentModule.kt
...et/android/settings/password/di/PasswordFragmentModule.kt
+29
-0
PasswordFragmentProvider.kt
.../android/settings/password/di/PasswordFragmentProvider.kt
+11
-0
PasswordPresenter.kt
...droid/settings/password/presentation/PasswordPresenter.kt
+35
-0
PasswordView.kt
...et/android/settings/password/presentation/PasswordView.kt
+16
-0
PasswordActivity.kt
...t/rocket/android/settings/password/ui/PasswordActivity.kt
+52
-0
PasswordFragment.kt
...t/rocket/android/settings/password/ui/PasswordFragment.kt
+108
-0
SettingsView.kt
...chat/rocket/android/settings/presentation/SettingsView.kt
+3
-0
SettingsFragment.kt
.../java/chat/rocket/android/settings/ui/SettingsFragment.kt
+54
-0
ic_link_black_24dp.xml
app/src/main/res/drawable/ic_link_black_24dp.xml
+10
-0
ic_room_channel.xml
app/src/main/res/drawable/ic_room_channel.xml
+9
-0
ic_room_dm.xml
app/src/main/res/drawable/ic_room_dm.xml
+9
-0
ic_room_lock.xml
app/src/main/res/drawable/ic_room_lock.xml
+9
-0
activity_password.xml
app/src/main/res/layout/activity_password.xml
+16
-0
app_bar_chat_room.xml
app/src/main/res/layout/app_bar_chat_room.xml
+1
-0
app_bar_password.xml
app/src/main/res/layout/app_bar_password.xml
+35
-0
fragment_password.xml
app/src/main/res/layout/fragment_password.xml
+70
-0
fragment_profile.xml
app/src/main/res/layout/fragment_profile.xml
+8
-0
fragment_settings.xml
app/src/main/res/layout/fragment_settings.xml
+10
-0
item_chat.xml
app/src/main/res/layout/item_chat.xml
+1
-0
navigation.xml
app/src/main/res/menu/navigation.xml
+5
-6
password.xml
app/src/main/res/menu/password.xml
+8
-0
strings.xml
app/src/main/res/values-pt-rBR/strings.xml
+11
-0
dimens.xml
app/src/main/res/values/dimens.xml
+2
-0
strings.xml
app/src/main/res/values/strings.xml
+11
-0
styles.xml
app/src/main/res/values/styles.xml
+20
-0
No files found.
app/src/main/AndroidManifest.xml
View file @
9ff47c86
...
...
@@ -55,6 +55,10 @@
android:windowSoftInputMode=
"adjustResize|stateAlwaysHidden"
android:theme=
"@style/AppTheme"
/>
<activity
android:name=
".settings.password.ui.PasswordActivity"
android:theme=
"@style/AppTheme"
/>
<receiver
android:name=
"com.google.android.gms.gcm.GcmReceiver"
android:exported=
"true"
...
...
app/src/main/java/chat/rocket/android/authentication/login/ui/LoginFragment.kt
View file @
9ff47c86
...
...
@@ -12,6 +12,7 @@ import android.view.ViewGroup
import
android.view.ViewTreeObserver
import
android.widget.ImageButton
import
android.widget.ScrollView
import
chat.rocket.android.R
import
chat.rocket.android.authentication.login.presentation.LoginPresenter
import
chat.rocket.android.authentication.login.presentation.LoginView
...
...
@@ -22,6 +23,7 @@ import chat.rocket.android.util.extensions.inflate
import
chat.rocket.android.util.extensions.setVisible
import
chat.rocket.android.util.extensions.showToast
import
chat.rocket.android.util.extensions.textContent
import
dagger.android.support.AndroidSupportInjection
import
kotlinx.android.synthetic.main.fragment_authentication_log_in.*
import
javax.inject.Inject
...
...
@@ -31,18 +33,9 @@ class LoginFragment : Fragment(), LoginView {
@Inject
lateinit
var
appContext
:
Context
// TODO we really need it? Check alternatives...
private
val
layoutListener
=
ViewTreeObserver
.
OnGlobalLayoutListener
{
if
(
KeyboardHelper
.
isSoftKeyboardShown
(
scroll_view
.
rootView
))
{
showSignUpView
(
false
)
showOauthView
(
false
)
showLoginButton
(
true
)
}
else
{
if
(
isEditTextEmpty
())
{
showSignUpView
(
true
)
showOauthView
(
true
)
showLoginButton
(
false
)
}
}
areLoginOptionsNeeded
()
}
private
var
isGlobalLayoutListenerSetUp
=
false
companion
object
{
...
...
@@ -74,15 +67,10 @@ class LoginFragment : Fragment(), LoginView {
setupSignUpListener
()
}
private
fun
showThreeSocialMethods
()
{
var
count
=
0
for
(
i
in
0
..
social_accounts_container
.
childCount
)
{
val
view
=
social_accounts_container
.
getChildAt
(
i
)
as
?
ImageButton
?:
continue
if
(
view
.
isEnabled
&&
count
<
3
)
{
view
.
visibility
=
View
.
VISIBLE
count
++
}
}
override
fun
onViewStateRestored
(
savedInstanceState
:
Bundle
?)
{
super
.
onViewStateRestored
(
savedInstanceState
)
areLoginOptionsNeeded
()
}
override
fun
onDestroyView
()
{
...
...
@@ -179,6 +167,17 @@ class LoginFragment : Fragment(), LoginView {
override
fun
showNoInternetConnection
()
=
showMessage
(
getString
(
R
.
string
.
msg_no_internet_connection
))
private
fun
areLoginOptionsNeeded
()
{
if
(!
isEditTextEmpty
()
||
KeyboardHelper
.
isSoftKeyboardShown
(
scroll_view
.
rootView
))
{
showSignUpView
(
false
)
showOauthView
(
false
)
showLoginButton
(
true
)
}
else
{
showSignUpView
(
true
)
showOauthView
(
true
)
showLoginButton
(
false
)
}
}
private
fun
tintEditTextDrawableStart
()
{
activity
?.
apply
{
...
...
@@ -213,10 +212,6 @@ class LoginFragment : Fragment(), LoginView {
button_log_in
.
isEnabled
=
value
text_username_or_email
.
isEnabled
=
value
text_password
.
isEnabled
=
value
if
(!
isEditTextEmpty
())
{
showSignUpView
(
value
)
showOauthView
(
value
)
}
}
// Returns true if *all* EditTexts are empty.
...
...
@@ -231,6 +226,17 @@ class LoginFragment : Fragment(), LoginView {
},
1000
)
}
private
fun
showThreeSocialMethods
()
{
var
count
=
0
for
(
i
in
0
..
social_accounts_container
.
childCount
)
{
val
view
=
social_accounts_container
.
getChildAt
(
i
)
as
?
ImageButton
?:
continue
if
(
view
.
isEnabled
&&
count
<
3
)
{
view
.
visibility
=
View
.
VISIBLE
count
++
}
}
}
private
fun
scrollToBottom
()
{
scroll_view
.
postDelayed
({
scroll_view
.
fullScroll
(
ScrollView
.
FOCUS_DOWN
)
...
...
app/src/main/java/chat/rocket/android/chatroom/ui/ChatRoomActivity.kt
View file @
9ff47c86
package
chat.rocket.android.chatroom.ui
import
DrawableHelper
import
android.content.Context
import
android.content.Intent
import
android.graphics.drawable.Drawable
import
android.os.Bundle
import
android.support.v4.app.Fragment
import
android.support.v7.app.AppCompatActivity
...
...
@@ -10,6 +12,7 @@ import chat.rocket.android.server.domain.GetCurrentServerInteractor
import
chat.rocket.android.server.infraestructure.ConnectionManagerFactory
import
chat.rocket.android.util.extensions.addFragment
import
chat.rocket.android.util.extensions.textContent
import
chat.rocket.common.model.RoomType
import
dagger.android.AndroidInjection
import
dagger.android.AndroidInjector
import
dagger.android.DispatchingAndroidInjector
...
...
@@ -82,6 +85,28 @@ class ChatRoomActivity : AppCompatActivity(), HasSupportFragmentInjector {
private
fun
setupToolbar
()
{
setSupportActionBar
(
toolbar
)
supportActionBar
?.
setDisplayShowTitleEnabled
(
false
)
text_room_name
.
textContent
=
chatRoomName
var
drawable
:
Drawable
?
=
null
when
(
chatRoomType
)
{
RoomType
.
CHANNEL
.
toString
()
->
{
drawable
=
DrawableHelper
.
getDrawableFromId
(
R
.
drawable
.
ic_room_channel
,
this
)
}
RoomType
.
PRIVATE_GROUP
.
toString
()
->
{
drawable
=
DrawableHelper
.
getDrawableFromId
(
R
.
drawable
.
ic_room_lock
,
this
)
}
RoomType
.
DIRECT_MESSAGE
.
toString
()
->
{
drawable
=
DrawableHelper
.
getDrawableFromId
(
R
.
drawable
.
ic_room_dm
,
this
)
}
}
drawable
?.
let
{
val
wrappedDrawable
=
DrawableHelper
.
wrapDrawable
(
it
)
val
mutableDrawable
=
wrappedDrawable
.
mutate
()
DrawableHelper
.
tintDrawable
(
mutableDrawable
,
this
,
R
.
color
.
white
)
DrawableHelper
.
compoundDrawable
(
text_room_name
,
mutableDrawable
)
}
toolbar
.
setNavigationOnClickListener
{
finishActivity
()
}
...
...
app/src/main/java/chat/rocket/android/chatrooms/ui/ChatRoomsAdapter.kt
View file @
9ff47c86
package
chat.rocket.android.chatrooms.ui
import
DateTimeHelper
import
DrawableHelper
import
android.content.Context
import
android.graphics.drawable.Drawable
import
android.support.v4.content.ContextCompat
import
android.support.v7.widget.RecyclerView
import
android.view.View
...
...
@@ -72,10 +74,30 @@ class ChatRoomsAdapter(private val context: Context,
}
private
fun
bindName
(
chatRoom
:
ChatRoom
,
textView
:
TextView
)
{
if
(
chatRoom
.
type
is
RoomType
.
DirectMessage
&&
settings
.
useRealName
())
{
textView
.
content
=
chatRoom
.
fullName
?:
chatRoom
.
name
}
else
{
textView
.
content
=
chatRoom
.
name
textView
.
textContent
=
chatRoom
.
name
var
drawable
:
Drawable
?
=
null
when
(
chatRoom
.
type
)
{
is
RoomType
.
Channel
->
{
drawable
=
DrawableHelper
.
getDrawableFromId
(
R
.
drawable
.
ic_room_channel
,
context
)
}
is
RoomType
.
PrivateGroup
->
{
drawable
=
DrawableHelper
.
getDrawableFromId
(
R
.
drawable
.
ic_room_lock
,
context
)
}
is
RoomType
.
DirectMessage
->
{
drawable
=
DrawableHelper
.
getDrawableFromId
(
R
.
drawable
.
ic_room_dm
,
context
)
}
}
drawable
?.
let
{
val
wrappedDrawable
=
DrawableHelper
.
wrapDrawable
(
it
)
val
mutableDrawable
=
wrappedDrawable
.
mutate
()
DrawableHelper
.
tintDrawable
(
mutableDrawable
,
context
,
when
(
chatRoom
.
alert
||
chatRoom
.
unread
>
0
)
{
true
->
R
.
color
.
colorPrimaryText
false
->
R
.
color
.
colorSecondaryText
})
DrawableHelper
.
compoundDrawable
(
textView
,
mutableDrawable
)
}
}
...
...
app/src/main/java/chat/rocket/android/dagger/module/ActivityBuilder.kt
View file @
9ff47c86
...
...
@@ -18,6 +18,8 @@ import chat.rocket.android.main.di.MainModule
import
chat.rocket.android.main.ui.MainActivity
import
chat.rocket.android.members.di.MembersFragmentProvider
import
chat.rocket.android.profile.di.ProfileFragmentProvider
import
chat.rocket.android.settings.password.di.PasswordFragmentProvider
import
chat.rocket.android.settings.password.ui.PasswordActivity
import
dagger.Module
import
dagger.android.ContributesAndroidInjector
...
...
@@ -49,4 +51,8 @@ abstract class ActivityBuilder {
@PerActivity
@ContributesAndroidInjector
(
modules
=
[
PinnedMessagesFragmentProvider
::
class
])
abstract
fun
bindPinnedMessagesActivity
():
PinnedMessagesActivity
@PerActivity
@ContributesAndroidInjector
(
modules
=
[
PasswordFragmentProvider
::
class
])
abstract
fun
bindPasswordActivity
():
PasswordActivity
}
\ No newline at end of file
app/src/main/java/chat/rocket/android/main/presentation/MainNavigator.kt
View file @
9ff47c86
...
...
@@ -5,6 +5,7 @@ import chat.rocket.android.R
import
chat.rocket.android.chatrooms.ui.ChatRoomsFragment
import
chat.rocket.android.main.ui.MainActivity
import
chat.rocket.android.profile.ui.ProfileFragment
import
chat.rocket.android.settings.ui.SettingsFragment
import
chat.rocket.android.util.extensions.addFragment
class
MainNavigator
(
internal
val
activity
:
MainActivity
,
internal
val
context
:
Context
)
{
...
...
@@ -20,4 +21,10 @@ class MainNavigator(internal val activity: MainActivity, internal val context: C
ProfileFragment
.
newInstance
()
}
}
fun
toSettings
()
{
activity
.
addFragment
(
"SettingsFragment"
,
R
.
id
.
fragment_container
)
{
SettingsFragment
.
newInstance
()
}
}
}
\ No newline at end of file
app/src/main/java/chat/rocket/android/main/presentation/MainPresenter.kt
View file @
9ff47c86
...
...
@@ -24,6 +24,8 @@ class MainPresenter @Inject constructor(private val navigator: MainNavigator,
fun
toUserProfile
()
=
navigator
.
toUserProfile
()
fun
toSettings
()
=
navigator
.
toSettings
()
/**
* Logout from current server.
*/
...
...
app/src/main/java/chat/rocket/android/main/ui/MainActivity.kt
View file @
9ff47c86
...
...
@@ -7,10 +7,16 @@ import android.support.v7.app.AppCompatActivity
import
android.view.Gravity
import
android.view.MenuItem
import
chat.rocket.android.R
import
chat.rocket.android.chatrooms.ui.ChatRoomsFragment
import
chat.rocket.android.profile.ui.ProfileFragment
import
chat.rocket.android.settings.ui.SettingsFragment
import
chat.rocket.android.util.extensions.addFragment
import
chat.rocket.android.authentication.ui.AuthenticationActivity
import
chat.rocket.android.main.presentation.MainPresenter
import
chat.rocket.android.main.presentation.MainView
import
chat.rocket.android.util.extensions.showToast
import
dagger.android.AndroidInjection
import
dagger.android.AndroidInjector
import
dagger.android.DispatchingAndroidInjector
...
...
@@ -89,6 +95,9 @@ class MainActivity : AppCompatActivity(), MainView, HasSupportFragmentInjector {
R
.
id
.
action_profile
->
{
presenter
.
toUserProfile
()
}
R
.
id
.
action_settings
->
{
presenter
.
toSettings
()
}
R
.
id
.
action_logout
->
{
presenter
.
logout
()
}
...
...
app/src/main/java/chat/rocket/android/profile/presentation/ProfilePresenter.kt
View file @
9ff47c86
...
...
@@ -9,6 +9,7 @@ import chat.rocket.common.RocketChatException
import
chat.rocket.common.util.ifNull
import
chat.rocket.core.RocketChatClient
import
chat.rocket.core.internal.rest.me
import
chat.rocket.core.internal.rest.setAvatar
import
chat.rocket.core.internal.rest.updateProfile
import
javax.inject.Inject
...
...
@@ -45,10 +46,13 @@ class ProfilePresenter @Inject constructor (private val view: ProfileView,
}
}
fun
updateUserProfile
(
email
:
String
,
name
:
String
,
username
:
String
)
{
fun
updateUserProfile
(
email
:
String
,
name
:
String
,
username
:
String
,
avatarUrl
:
String
=
""
)
{
launchUI
(
strategy
)
{
view
.
showLoading
()
try
{
if
(
avatarUrl
!=
""
)
{
client
.
setAvatar
(
avatarUrl
)
}
val
user
=
client
.
updateProfile
(
myselfId
,
email
,
name
,
username
)
view
.
showProfileUpdateSuccessfullyMessage
()
loadUserProfile
()
...
...
@@ -56,8 +60,8 @@ class ProfilePresenter @Inject constructor (private val view: ProfileView,
exception
.
message
?.
let
{
view
.
showMessage
(
it
)
}.
ifNull
{
view
.
showGenericErrorMessage
()
}
view
.
showGenericErrorMessage
()
}
}
finally
{
view
.
hideLoading
()
}
...
...
app/src/main/java/chat/rocket/android/profile/ui/ProfileFragment.kt
View file @
9ff47c86
...
...
@@ -6,7 +6,6 @@ import android.os.Bundle
import
android.support.v4.app.Fragment
import
android.support.v7.view.ActionMode
import
android.view.*
import
android.widget.Toast
import
chat.rocket.android.R
import
chat.rocket.android.main.ui.MainActivity
import
chat.rocket.android.profile.presentation.ProfilePresenter
...
...
@@ -24,6 +23,7 @@ class ProfileFragment : Fragment(), ProfileView, ActionMode.Callback {
private
lateinit
var
currentName
:
String
private
lateinit
var
currentUsername
:
String
private
lateinit
var
currentEmail
:
String
private
lateinit
var
currentAvatar
:
String
private
var
actionMode
:
ActionMode
?
=
null
companion
object
{
...
...
@@ -54,10 +54,12 @@ class ProfileFragment : Fragment(), ProfileView, ActionMode.Callback {
text_name
.
textContent
=
name
text_username
.
textContent
=
username
text_email
.
textContent
=
email
text_avatar_url
.
textContent
=
""
currentName
=
name
currentUsername
=
username
currentEmail
=
email
currentAvatar
=
avatarUrl
profile_container
.
setVisible
(
true
)
...
...
@@ -93,7 +95,7 @@ class ProfileFragment : Fragment(), ProfileView, ActionMode.Callback {
override
fun
onActionItemClicked
(
mode
:
ActionMode
,
menuItem
:
MenuItem
):
Boolean
{
return
when
(
menuItem
.
itemId
)
{
R
.
id
.
action_profile
->
{
presenter
.
updateUserProfile
(
text_email
.
textContent
,
text_name
.
textContent
,
text_username
.
textContent
)
presenter
.
updateUserProfile
(
text_email
.
textContent
,
text_name
.
textContent
,
text_username
.
textContent
,
text_avatar_url
.
textContent
)
mode
.
finish
()
true
}
...
...
@@ -116,22 +118,31 @@ class ProfileFragment : Fragment(), ProfileView, ActionMode.Callback {
val
personDrawable
=
DrawableHelper
.
getDrawableFromId
(
R
.
drawable
.
ic_person_black_24dp
,
this
)
val
atDrawable
=
DrawableHelper
.
getDrawableFromId
(
R
.
drawable
.
ic_at_black_24dp
,
this
)
val
emailDrawable
=
DrawableHelper
.
getDrawableFromId
(
R
.
drawable
.
ic_email_black_24dp
,
this
)
val
linkDrawable
=
DrawableHelper
.
getDrawableFromId
(
R
.
drawable
.
ic_link_black_24dp
,
this
)
val
drawables
=
arrayOf
(
personDrawable
,
atDrawable
,
emailDrawable
)
val
drawables
=
arrayOf
(
personDrawable
,
atDrawable
,
emailDrawable
,
linkDrawable
)
DrawableHelper
.
wrapDrawables
(
drawables
)
DrawableHelper
.
tintDrawables
(
drawables
,
this
,
R
.
color
.
colorDrawableTintGrey
)
DrawableHelper
.
compoundDrawables
(
arrayOf
(
text_name
,
text_username
,
text_email
),
drawables
)
DrawableHelper
.
compoundDrawables
(
arrayOf
(
text_name
,
text_username
,
text_email
,
text_avatar_url
),
drawables
)
}
}
private
fun
listenToChanges
()
{
Observables
.
combineLatest
(
text_name
.
asObservable
(),
text_username
.
asObservable
(),
text_email
.
asObservable
()).
subscribe
({
t
->
if
(
t
.
first
.
toString
()
!=
currentName
||
t
.
second
.
toString
()
!=
currentUsername
||
t
.
third
.
toString
()
!=
currentEmail
)
{
startActionMode
()
}
else
{
finishActionMode
()
}
})
Observables
.
combineLatest
(
text_name
.
asObservable
(),
text_username
.
asObservable
(),
text_email
.
asObservable
(),
text_avatar_url
.
asObservable
())
{
text_name
,
text_username
,
text_email
,
text_avatar_url
->
return
@combineLatest
(
text_name
.
toString
()
!=
currentName
||
text_username
.
toString
()
!=
currentUsername
||
text_email
.
toString
()
!=
currentEmail
||
(
text_avatar_url
.
toString
()
!=
""
&&
text_avatar_url
.
toString
()!=
currentAvatar
))
}.
subscribe
({
isValid
->
if
(
isValid
)
{
startActionMode
()
}
else
{
finishActionMode
()
}
})
}
private
fun
startActionMode
()
{
...
...
@@ -146,5 +157,6 @@ class ProfileFragment : Fragment(), ProfileView, ActionMode.Callback {
text_name
.
isEnabled
=
value
text_username
.
isEnabled
=
value
text_email
.
isEnabled
=
value
text_avatar_url
.
isEnabled
=
value
}
}
app/src/main/java/chat/rocket/android/settings/di/SettingsFragmentModule.kt
0 → 100644
View file @
9ff47c86
package
chat.rocket.android.settings.di
import
android.arch.lifecycle.LifecycleOwner
import
chat.rocket.android.core.lifecycle.CancelStrategy
import
chat.rocket.android.dagger.scope.PerFragment
import
chat.rocket.android.settings.presentation.SettingsView
import
chat.rocket.android.settings.ui.SettingsFragment
import
dagger.Module
import
dagger.Provides
import
kotlinx.coroutines.experimental.Job
@Module
@PerFragment
class
SettingsFragmentModule
{
@Provides
fun
settingsView
(
frag
:
SettingsFragment
):
SettingsView
{
return
frag
}
@Provides
fun
settingsLifecycleOwner
(
frag
:
SettingsFragment
):
LifecycleOwner
{
return
frag
}
@Provides
fun
provideCancelStrategy
(
owner
:
LifecycleOwner
,
jobs
:
Job
):
CancelStrategy
{
return
CancelStrategy
(
owner
,
jobs
)
}
}
\ No newline at end of file
app/src/main/java/chat/rocket/android/settings/di/SettingsFragmentProvider.kt
0 → 100644
View file @
9ff47c86
package
chat.rocket.android.settings.di
import
chat.rocket.android.settings.ui.SettingsFragment
import
dagger.Module
import
dagger.android.ContributesAndroidInjector
@Module
abstract
class
SettingsFragmentProvider
{
@ContributesAndroidInjector
(
modules
=
[
SettingsFragmentModule
::
class
])
abstract
fun
provideSettingsFragment
():
SettingsFragment
}
\ No newline at end of file
app/src/main/java/chat/rocket/android/settings/password/di/PasswordFragmentModule.kt
0 → 100644
View file @
9ff47c86
package
chat.rocket.android.settings.password.di
import
android.arch.lifecycle.LifecycleOwner
import
chat.rocket.android.core.lifecycle.CancelStrategy
import
chat.rocket.android.dagger.scope.PerFragment
import
chat.rocket.android.settings.password.presentation.PasswordView
import
chat.rocket.android.settings.password.ui.PasswordFragment
import
dagger.Module
import
dagger.Provides
import
kotlinx.coroutines.experimental.Job
@Module
@PerFragment
class
PasswordFragmentModule
{
@Provides
fun
passwordView
(
frag
:
PasswordFragment
):
PasswordView
{
return
frag
}
@Provides
fun
settingsLifecycleOwner
(
frag
:
PasswordFragment
):
LifecycleOwner
{
return
frag
}
@Provides
fun
provideCancelStrategy
(
owner
:
LifecycleOwner
,
jobs
:
Job
):
CancelStrategy
{
return
CancelStrategy
(
owner
,
jobs
)
}
}
app/src/main/java/chat/rocket/android/settings/password/di/PasswordFragmentProvider.kt
0 → 100644
View file @
9ff47c86
package
chat.rocket.android.settings.password.di
import
chat.rocket.android.settings.password.ui.PasswordFragment
import
dagger.Module
import
dagger.android.ContributesAndroidInjector
@Module
abstract
class
PasswordFragmentProvider
{
@ContributesAndroidInjector
(
modules
=
[
PasswordFragmentModule
::
class
])
abstract
fun
providePasswordFragment
():
PasswordFragment
}
\ No newline at end of file
app/src/main/java/chat/rocket/android/settings/password/presentation/PasswordPresenter.kt
0 → 100644
View file @
9ff47c86
package
chat.rocket.android.settings.password.presentation
import
chat.rocket.android.core.lifecycle.CancelStrategy
import
chat.rocket.android.server.domain.GetCurrentServerInteractor
import
chat.rocket.android.server.infraestructure.RocketChatClientFactory
import
chat.rocket.android.util.extensions.launchUI
import
chat.rocket.common.RocketChatException
import
chat.rocket.core.RocketChatClient
import
chat.rocket.core.internal.rest.me
import
chat.rocket.core.internal.rest.updateProfile
import
javax.inject.Inject
class
PasswordPresenter
@Inject
constructor
(
private
val
view
:
PasswordView
,
private
val
strategy
:
CancelStrategy
,
serverInteractor
:
GetCurrentServerInteractor
,
factory
:
RocketChatClientFactory
){
private
val
serverUrl
=
serverInteractor
.
get
()
!!
private
val
client
:
RocketChatClient
=
factory
.
create
(
serverUrl
)
fun
updatePassword
(
password
:
String
)
{
launchUI
(
strategy
)
{
try
{
view
.
showLoading
()
client
.
updateProfile
(
client
.
me
().
id
,
null
,
null
,
password
,
null
)
view
.
showPasswordSuccessfullyUpdatedMessage
()
view
.
hideLoading
()
}
catch
(
exception
:
RocketChatException
)
{
view
.
showPasswordFailsUpdateMessage
(
exception
.
message
)
view
.
hideLoading
()
}
}
}
}
\ No newline at end of file
app/src/main/java/chat/rocket/android/settings/password/presentation/PasswordView.kt
0 → 100644
View file @
9ff47c86
package
chat.rocket.android.settings.password.presentation
import
chat.rocket.android.core.behaviours.LoadingView
interface
PasswordView
:
LoadingView
{
/**
* Shows a message when a user's password is successfully updated
*/
fun
showPasswordSuccessfullyUpdatedMessage
()
/**
* Shows a message when the user's password fails to update
* @param error is a String containing the failure message
*/
fun
showPasswordFailsUpdateMessage
(
error
:
String
?)
}
app/src/main/java/chat/rocket/android/settings/password/ui/PasswordActivity.kt
0 → 100644
View file @
9ff47c86
package
chat.rocket.android.settings.password.ui
import
android.os.Bundle
import
android.support.v4.app.Fragment
import
android.support.v7.app.AppCompatActivity
import
chat.rocket.android.R
import
chat.rocket.android.chatrooms.ui.ChatRoomsFragment
import
chat.rocket.android.util.extensions.addFragment
import
chat.rocket.android.util.extensions.textContent
import
dagger.android.AndroidInjection
import
dagger.android.AndroidInjector
import
dagger.android.DispatchingAndroidInjector
import
dagger.android.support.HasSupportFragmentInjector
import
kotlinx.android.synthetic.main.app_bar_password.*
import
javax.inject.Inject
class
PasswordActivity
:
AppCompatActivity
(),
HasSupportFragmentInjector
{
@Inject
lateinit
var
fragmentDispatchingAndroidInjector
:
DispatchingAndroidInjector
<
Fragment
>
override
fun
onCreate
(
savedInstanceState
:
Bundle
?)
{
AndroidInjection
.
inject
(
this
)
super
.
onCreate
(
savedInstanceState
)
setContentView
(
R
.
layout
.
activity_password
)
setupToolbar
()
addFragment
(
"PasswordFragment"
)
}
override
fun
onBackPressed
()
{
super
.
onBackPressed
()
finish
()
overridePendingTransition
(
R
.
anim
.
close_enter
,
R
.
anim
.
close_exit
)
}
override
fun
onSupportNavigateUp
():
Boolean
{
onBackPressed
()
return
super
.
onNavigateUp
()
}
override
fun
supportFragmentInjector
():
AndroidInjector
<
Fragment
>
=
fragmentDispatchingAndroidInjector
private
fun
addFragment
(
tag
:
String
)
{
addFragment
(
tag
,
R
.
id
.
fragment_container
)
{
PasswordFragment
.
newInstance
()
}
}
private
fun
setupToolbar
()
{
setSupportActionBar
(
toolbar
)
text_change_password
.
textContent
=
resources
.
getString
(
R
.
string
.
title_password
)
}
}
app/src/main/java/chat/rocket/android/settings/password/ui/PasswordFragment.kt
0 → 100644
View file @
9ff47c86
package
chat.rocket.android.settings.password.ui
import
android.os.Bundle
import
android.support.v4.app.Fragment
import
android.view.*
import
android.widget.Toast
import
chat.rocket.android.R
import
chat.rocket.android.settings.password.presentation.PasswordPresenter
import
chat.rocket.android.settings.password.presentation.PasswordView
import
chat.rocket.android.util.extensions.asObservable
import
chat.rocket.android.util.extensions.inflate
import
chat.rocket.android.util.extensions.textContent
import
android.support.v7.view.ActionMode
import
dagger.android.support.AndroidSupportInjection
import
io.reactivex.rxkotlin.Observables
import
kotlinx.android.synthetic.main.fragment_password.*
import
javax.inject.Inject
class
PasswordFragment
:
Fragment
(),
PasswordView
,
android
.
support
.
v7
.
view
.
ActionMode
.
Callback
{
@Inject
lateinit
var
presenter
:
PasswordPresenter
private
var
actionMode
:
ActionMode
?
=
null
companion
object
{
fun
newInstance
()
=
PasswordFragment
()
}
override
fun
onCreate
(
savedInstanceState
:
Bundle
?)
{
AndroidSupportInjection
.
inject
(
this
)
super
.
onCreate
(
savedInstanceState
)
}
override
fun
onCreateView
(
inflater
:
LayoutInflater
,
container
:
ViewGroup
?,
savedInstanceState
:
Bundle
?):
View
?
=
container
?.
inflate
(
R
.
layout
.
fragment_password
)
override
fun
onViewCreated
(
view
:
View
,
savedInstanceState
:
Bundle
?)
{
super
.
onViewCreated
(
view
,
savedInstanceState
)
listenToChanges
()
}
override
fun
hideLoading
()
{
layout_new_password
.
visibility
=
View
.
VISIBLE
layout_confirm_password
.
visibility
=
View
.
VISIBLE
view_loading
.
visibility
=
View
.
GONE
}
override
fun
onActionItemClicked
(
mode
:
ActionMode
,
menuItem
:
MenuItem
):
Boolean
{
return
when
(
menuItem
.
itemId
)
{
R
.
id
.
action_password
->
{
presenter
.
updatePassword
(
text_new_password
.
textContent
)
mode
.
finish
()
return
true
}
else
->
{
false
}
}
}
override
fun
onCreateActionMode
(
mode
:
ActionMode
,
menu
:
Menu
?):
Boolean
{
mode
.
menuInflater
.
inflate
(
R
.
menu
.
password
,
menu
)
mode
.
title
=
resources
.
getString
(
R
.
string
.
action_confirm_password
)
return
true
}
override
fun
onPrepareActionMode
(
mode
:
ActionMode
?,
menu
:
Menu
?):
Boolean
=
false
override
fun
onDestroyActionMode
(
mode
:
ActionMode
?)
{
actionMode
=
null
}
override
fun
showLoading
()
{
layout_new_password
.
visibility
=
View
.
GONE
layout_confirm_password
.
visibility
=
View
.
GONE
view_loading
.
visibility
=
View
.
VISIBLE
}
override
fun
showPasswordFailsUpdateMessage
(
error
:
String
?)
{
showToast
(
"Password fails to update: "
+
error
)
}
override
fun
showPasswordSuccessfullyUpdatedMessage
()
{
showToast
(
"Password was successfully updated!"
)
}
private
fun
finishActionMode
()
=
actionMode
?.
finish
()
private
fun
listenToChanges
()
{
Observables
.
combineLatest
(
text_new_password
.
asObservable
(),
text_confirm_password
.
asObservable
()).
subscribe
{
val
textPassword
=
text_new_password
.
textContent
val
textConfirmPassword
=
text_confirm_password
.
textContent
if
(
textPassword
.
length
>
5
&&
textConfirmPassword
.
length
>
5
&&
textPassword
.
equals
(
textConfirmPassword
))
startActionMode
()
else
finishActionMode
()
}
}
private
fun
showToast
(
msg
:
String
?)
{
Toast
.
makeText
(
context
,
msg
,
Toast
.
LENGTH_LONG
).
show
()
}
private
fun
startActionMode
()
{
if
(
actionMode
==
null
)
{
actionMode
=
(
activity
as
PasswordActivity
).
startSupportActionMode
(
this
)
}
}
}
\ No newline at end of file
app/src/main/java/chat/rocket/android/settings/presentation/SettingsView.kt
0 → 100644
View file @
9ff47c86
package
chat.rocket.android.settings.presentation
interface
SettingsView
app/src/main/java/chat/rocket/android/settings/ui/SettingsFragment.kt
0 → 100644
View file @
9ff47c86
package
chat.rocket.android.settings.ui
import
android.content.Intent
import
android.os.Bundle
import
android.support.v4.app.Fragment
import
android.support.v7.app.AppCompatActivity
import
android.view.LayoutInflater
import
android.view.View
import
android.view.ViewGroup
import
android.widget.AdapterView
import
chat.rocket.android.R
import
chat.rocket.android.main.ui.MainActivity
import
chat.rocket.android.settings.password.ui.PasswordActivity
import
chat.rocket.android.settings.presentation.SettingsView
import
chat.rocket.android.util.extensions.inflate
import
kotlinx.android.synthetic.main.app_bar.*
import
kotlinx.android.synthetic.main.fragment_settings.*
import
kotlin.reflect.KClass
class
SettingsFragment
:
Fragment
(),
SettingsView
,
AdapterView
.
OnItemClickListener
{
companion
object
{
fun
newInstance
()
=
SettingsFragment
()
}
override
fun
onCreateView
(
inflater
:
LayoutInflater
,
container
:
ViewGroup
?,
savedInstanceState
:
Bundle
?):
View
?
=
container
?.
inflate
(
R
.
layout
.
fragment_settings
)
override
fun
onViewCreated
(
view
:
View
,
savedInstanceState
:
Bundle
?)
{
super
.
onViewCreated
(
view
,
savedInstanceState
)
setupToolbar
()
setupListView
()
}
override
fun
onItemClick
(
parent
:
AdapterView
<
*
>?,
view
:
View
?,
position
:
Int
,
id
:
Long
)
{
when
(
parent
?.
getItemAtPosition
(
position
).
toString
())
{
"Change Password"
->
{
startNewActivity
(
PasswordActivity
::
class
)
}
}
}
private
fun
setupListView
()
{
settings_list
.
onItemClickListener
=
this
}
private
fun
setupToolbar
()
{
(
activity
as
MainActivity
).
toolbar
.
title
=
getString
(
R
.
string
.
title_settings
)
}
private
fun
startNewActivity
(
classType
:
KClass
<
out
AppCompatActivity
>)
{
startActivity
(
Intent
(
activity
,
classType
.
java
))
activity
?.
overridePendingTransition
(
R
.
anim
.
open_enter
,
R
.
anim
.
open_exit
)
}
}
app/src/main/res/drawable/ic_link_black_24dp.xml
0 → 100644
View file @
9ff47c86
<vector
xmlns:android=
"http://schemas.android.com/apk/res/android"
android:width=
"24dp"
android:height=
"24dp"
android:viewportWidth=
"24.0"
android:viewportHeight=
"24.0"
>
<path
android:fillColor=
"#FF000000"
android:pathData=
"M3.9,12c0,-1.71 1.39,-3.1 3.1,-3.1h4L11,7L7,7c-2.76,0 -5,2.24 -5,5s2.24,5 5,5h4v-1.9L7,15.1c-1.71,0 -3.1,-1.39 -3.1,-3.1zM8,13h8v-2L8,11v2zM17,7h-4v1.9h4c1.71,0 3.1,1.39 3.1,3.1s-1.39,3.1 -3.1,3.1h-4L13,17h4c2.76,0 5,-2.24 5,-5s-2.24,-5 -5,-5z"
/>
</vector>
app/src/main/res/drawable/ic_room_channel.xml
0 → 100644
View file @
9ff47c86
<vector
xmlns:android=
"http://schemas.android.com/apk/res/android"
android:width=
"16dp"
android:height=
"16dp"
android:viewportHeight=
"24.0"
android:viewportWidth=
"24.0"
>
<path
android:fillColor=
"#FF000000"
android:pathData=
"M22.548,9l0.452,-2h-5.364l1.364,-6h-2l-1.364,6h-5l1.364,-6h-2l-1.364,6h-6.184l-0.452,2h6.182l-1.364,6h-5.36l-0.458,2h5.364l-1.364,6h2l1.364,-6h5l-1.364,6h2l1.364,-6h6.185l0.451,-2h-6.182l1.364,-6h5.366zM13.818,15h-5l1.364,-6h5l-1.364,6z"
/>
</vector>
app/src/main/res/drawable/ic_room_dm.xml
0 → 100644
View file @
9ff47c86
<vector
xmlns:android=
"http://schemas.android.com/apk/res/android"
android:width=
"16dp"
android:height=
"16dp"
android:viewportHeight=
"20.0"
android:viewportWidth=
"20.0"
>
<path
android:fillColor=
"#FF000000"
android:pathData=
"M13.6,13.47c-0.91,0.953 -2.191,1.545 -3.61,1.545 -2.756,0 -4.99,-2.234 -4.99,-4.99 0,-0.009 0,-0.018 0,-0.026v0.001c0,-2.761 2.239,-5 5,-5 1.131,0 2.175,0.376 3.013,1.009l-0.013,-0.009v-1h2v6.5c0,0.828 0.672,1.5 1.5,1.5s1.5,-0.672 1.5,-1.5v0,-1.5c-0.003,-4.416 -3.584,-7.994 -8,-7.994 -4.418,0 -8,3.582 -8,8s3.582,8 8,8c1.305,0 2.537,-0.312 3.625,-0.867l-0.045,0.021 0.9,1.79c-1.305,0.668 -2.847,1.06 -4.48,1.06 -5.523,0 -10,-4.477 -10,-10s4.477,-10 10,-10c5.519,0 9.994,4.472 10,9.99v0.001h-0.01v1.5c0,0.003 0,0.007 0,0.01 0,1.933 -1.567,3.5 -3.5,3.5 -1.202,0 -2.262,-0.606 -2.892,-1.528l-0.008,-0.012zM10,13c1.657,0 3,-1.343 3,-3s-1.343,-3 -3,-3v0c-1.657,0 -3,1.343 -3,3s1.343,3 3,3v0z"
/>
</vector>
app/src/main/res/drawable/ic_room_lock.xml
0 → 100644
View file @
9ff47c86
<vector
xmlns:android=
"http://schemas.android.com/apk/res/android"
android:width=
"16dp"
android:height=
"16dp"
android:viewportHeight=
"24.0"
android:viewportWidth=
"24.0"
>
<path
android:fillColor=
"#FF000000"
android:pathData=
"M18,10v-4c0,-3.313 -2.687,-6 -6,-6s-6,2.687 -6,6v4h-3v14h18v-14h-3zM8,6c0,-2.206 1.794,-4 4,-4s4,1.794 4,4v4h-8v-4zM19,22h-14v-10h14v10z"
/>
</vector>
app/src/main/res/layout/activity_password.xml
0 → 100644
View file @
9ff47c86
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android=
"http://schemas.android.com/apk/res/android"
xmlns:tools=
"http://schemas.android.com/tools"
android:layout_width=
"match_parent"
android:layout_height=
"match_parent"
android:orientation=
"vertical"
android:theme=
"@style/AppTheme"
tools:context=
".settings.password.ui.PasswordActivity"
>
<include
android:id=
"@+id/layout_app_bar"
layout=
"@layout/app_bar_password"
/>
<FrameLayout
android:id=
"@+id/fragment_container"
android:layout_width=
"match_parent"
android:layout_height=
"match_parent"
/>
</LinearLayout>
\ No newline at end of file
app/src/main/res/layout/app_bar_chat_room.xml
View file @
9ff47c86
...
...
@@ -37,6 +37,7 @@
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_marginStart=
"10dp"
android:drawablePadding=
"@dimen/text_view_drawable_padding"
android:ellipsize=
"end"
android:maxLines=
"1"
android:textColor=
"@color/white"
...
...
app/src/main/res/layout/app_bar_password.xml
0 → 100644
View file @
9ff47c86
<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.AppBarLayout
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=
"wrap_content"
android:background=
"@color/colorPrimary"
android:theme=
"@style/Theme.AppCompat.Light.NoActionBar"
>
<android.support.v7.widget.Toolbar
android:id=
"@+id/toolbar"
android:layout_width=
"match_parent"
android:layout_height=
"?attr/actionBarSize"
app:layout_scrollFlags=
"scroll|enterAlways"
app:navigationIcon=
"?android:attr/homeAsUpIndicator"
app:popupTheme=
"@style/ThemeOverlay.AppCompat.Light"
app:theme=
"@style/ActionModeStyle"
>
<RelativeLayout
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
>
<TextView
android:id=
"@+id/text_change_password"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_alignParentStart=
"true"
android:ellipsize=
"end"
android:maxLines=
"1"
android:textColor=
"@color/white"
android:textSize=
"18sp"
android:textStyle=
"bold"
tools:text=
"@string/title_password"
/>
</RelativeLayout>
</android.support.v7.widget.Toolbar>
</android.support.design.widget.AppBarLayout>
\ No newline at end of file
app/src/main/res/layout/fragment_password.xml
0 → 100644
View file @
9ff47c86
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
xmlns:android=
"http://schemas.android.com/apk/res/android"
android:layout_width=
"match_parent"
android:layout_height=
"match_parent"
xmlns:app=
"http://schemas.android.com/apk/res-auto"
>
<android.support.design.widget.TextInputLayout
android:id=
"@+id/layout_new_password"
android:layout_width=
"0dp"
android:layout_height=
"wrap_content"
android:theme=
"@style/EditText.Password"
app:layout_constraintBottom_toTopOf=
"@id/middle_guide"
app:layout_constraintStart_toEndOf=
"@id/start_guide"
app:layout_constraintEnd_toStartOf=
"@id/end_guide"
>
<EditText
android:id=
"@+id/text_new_password"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:hint=
"@string/msg_new_password"
android:inputType=
"textPassword"
/>
</android.support.design.widget.TextInputLayout>
<android.support.design.widget.TextInputLayout
android:id=
"@+id/layout_confirm_password"
android:layout_width=
"0dp"
android:layout_height=
"wrap_content"
android:theme=
"@style/EditText.Password"
app:layout_constraintTop_toBottomOf=
"@id/middle_guide"
app:layout_constraintStart_toEndOf=
"@id/start_guide"
app:layout_constraintEnd_toStartOf=
"@id/end_guide"
>
<EditText
android:id=
"@+id/text_confirm_password"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:hint=
"@string/msg_confirm_password"
android:inputType=
"textPassword"
/>
</android.support.design.widget.TextInputLayout>
<com.wang.avi.AVLoadingIndicatorView
android:id=
"@+id/view_loading"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:visibility=
"gone"
app:layout_constraintTop_toBottomOf=
"@id/middle_guide"
app:layout_constraintStart_toEndOf=
"@id/start_guide"
app:layout_constraintEnd_toStartOf=
"@id/end_guide"
app:indicatorColor=
"@color/black"
app:indicatorName=
"BallPulseIndicator"
/>
<android.support.constraint.Guideline
android:id=
"@+id/middle_guide"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:orientation=
"horizontal"
app:layout_constraintGuide_percent=
"0.2"
/>
<android.support.constraint.Guideline
android:id=
"@+id/start_guide"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:orientation=
"vertical"
app:layout_constraintGuide_percent=
"0.05"
/>
<android.support.constraint.Guideline
android:id=
"@+id/end_guide"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:orientation=
"vertical"
app:layout_constraintGuide_percent=
"0.95"
/>
</android.support.constraint.ConstraintLayout>
\ No newline at end of file
app/src/main/res/layout/fragment_profile.xml
View file @
9ff47c86
...
...
@@ -46,6 +46,14 @@
android:drawableStart=
"@drawable/ic_email_black_24dp"
android:hint=
"@string/msg_email"
android:inputType=
"textEmailAddress"
/>
<EditText
android:id=
"@+id/text_avatar_url"
style=
"@style/EditText.Profile"
android:layout_marginTop=
"16dp"
android:drawableStart=
"@drawable/ic_link_black_24dp"
android:hint=
"@string/msg_avatar_url"
android:inputType=
"text"
/>
</LinearLayout>
<com.wang.avi.AVLoadingIndicatorView
...
...
app/src/main/res/layout/fragment_settings.xml
0 → 100644
View file @
9ff47c86
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android=
"http://schemas.android.com/apk/res/android"
android:layout_width=
"match_parent"
android:layout_height=
"match_parent"
>
<ListView
android:id=
"@+id/settings_list"
android:layout_width=
"match_parent"
android:layout_height=
"match_parent"
android:entries=
"@array/settings_actions"
/>
</RelativeLayout>
\ No newline at end of file
app/src/main/res/layout/item_chat.xml
View file @
9ff47c86
...
...
@@ -31,6 +31,7 @@
style=
"@style/ChatRoom.Name.TextView"
android:layout_width=
"0dp"
android:layout_height=
"wrap_content"
android:drawablePadding=
"@dimen/text_view_drawable_padding"
app:layout_constraintLeft_toLeftOf=
"parent"
app:layout_constraintRight_toLeftOf=
"@+id/text_last_message_date_time"
app:layout_constraintTop_toTopOf=
"parent"
...
...
app/src/main/res/menu/navigation.xml
View file @
9ff47c86
...
...
@@ -15,17 +15,16 @@
android:id=
"@+id/action_profile"
android:icon=
"@drawable/ic_person_black_24dp"
android:title=
"@string/title_profile"
/>
</group>
<group
android:id=
"@+id/menu_section_2"
android:checkableBehavior=
"none"
>
<item
android:id=
"@+id/action_settings"
android:icon=
"@drawable/ic_settings_black_24dp"
android:title=
"@string/action_settings"
/>
android:title=
"@string/title_settings"
/>
</group>
<group
android:id=
"@+id/menu_section_2"
android:checkableBehavior=
"none"
>
<item
android:id=
"@+id/action_logout"
android:icon=
"@drawable/ic_exit_to_app_black_24dp"
...
...
app/src/main/res/menu/password.xml
0 → 100644
View file @
9ff47c86
<?xml version="1.0" encoding="utf-8"?>
<menu
xmlns:android=
"http://schemas.android.com/apk/res/android"
>
<item
android:id=
"@+id/action_password"
android:icon=
"@drawable/ic_check_white_24dp"
android:title=
"@string/action_confirm_password"
/>
</menu>
\ No newline at end of file
app/src/main/res/values-pt-rBR/strings.xml
View file @
9ff47c86
...
...
@@ -8,6 +8,8 @@
<string
name=
"title_chats"
>
Chats
</string>
<string
name=
"title_profile"
>
Perfil
</string>
<string
name=
"title_members"
>
Membros (%d)
</string>
<string
name=
"title_settings"
>
Configurações
</string>
<string
name=
"title_password"
>
Alterar senha
</string>
<string
name=
"title_update_profile"
>
Editar perfil
</string>
<!-- Actions -->
...
...
@@ -19,6 +21,12 @@
<string
name=
"action_settings"
>
Configurações
</string>
<string
name=
"action_logout"
>
Sair
</string>
<string
name=
"action_files"
>
Arquivos
</string>
<string
name=
"action_confirm_password"
>
Confirme a nova senha
</string>
<!-- Settings List -->
<string-array
name=
"settings_actions"
>
<item
name=
"item_password"
>
Alterar senha
</item>
</string-array>
<!-- Regular information messages -->
<string
name=
"msg_no_internet_connection"
>
Sem conexão à internet
</string>
...
...
@@ -30,6 +38,7 @@
<string
name=
"msg_password"
>
senha
</string>
<string
name=
"msg_name"
>
nome
</string>
<string
name=
"msg_email"
>
email
</string>
<string
name=
"msg_avatar_url"
>
URL do avatar
</string>
<string
name=
"msg_or_continue_using_social_accounts"
>
Ou continue através de contas sociais
</string>
<string
name=
"msg_new_user"
>
Novo usuário? %1$s
</string>
<string
name=
"msg_new_user_agreement"
>
Ao proceder você concorda com nossos %1$s e %2$s
</string>
...
...
@@ -53,6 +62,8 @@
<string
name=
"msg_unknown"
>
Desconhecido
</string>
<string
name=
"msg_email_address"
>
Endereço de e-mail
</string>
<string
name=
"msg_utc_offset"
>
Deslocamento de UTC
</string>
<string
name=
"msg_new_password"
>
Informe a nova senha
</string>
<string
name=
"msg_confirm_password"
>
Confirme a nova senha
</string>
<!-- System messages -->
<string
name=
"message_room_name_changed"
>
Nome da sala alterado para: %1$s por %2$s
</string>
...
...
app/src/main/res/values/dimens.xml
View file @
9ff47c86
...
...
@@ -7,6 +7,8 @@
<dimen
name=
"edit_text_margin"
>
10dp
</dimen>
<dimen
name=
"edit_text_drawable_padding"
>
16dp
</dimen>
<dimen
name=
"text_view_drawable_padding"
>
4dp
</dimen>
<dimen
name=
"fab_elevation"
>
6dp
</dimen>
<dimen
name=
"divider_item_decorator_bound_start"
>
72dp
</dimen>
...
...
app/src/main/res/values/strings.xml
View file @
9ff47c86
...
...
@@ -9,6 +9,8 @@
<string
name=
"title_chats"
>
Chats
</string>
<string
name=
"title_profile"
>
Profile
</string>
<string
name=
"title_members"
>
Members (%d)
</string>
<string
name=
"title_settings"
>
Settings
</string>
<string
name=
"title_password"
>
Change Password
</string>
<string
name=
"title_update_profile"
>
Update profile
</string>
<!-- Actions -->
...
...
@@ -20,6 +22,12 @@
<string
name=
"action_settings"
>
Settings
</string>
<string
name=
"action_logout"
>
Logout
</string>
<string
name=
"action_files"
>
Files
</string>
<string
name=
"action_confirm_password"
>
Confirm Password Change
</string>
<!-- Settings List -->
<string-array
name=
"settings_actions"
>
<item
name=
"item_password"
>
Change Password
</item>
</string-array>
<!-- Regular information messages -->
<string
name=
"msg_no_internet_connection"
>
No internet connection
</string>
...
...
@@ -31,6 +39,7 @@
<string
name=
"msg_password"
>
password
</string>
<string
name=
"msg_name"
>
name
</string>
<string
name=
"msg_email"
>
email
</string>
<string
name=
"msg_avatar_url"
>
avatar URL
</string>
<string
name=
"msg_or_continue_using_social_accounts"
>
Or continue using social accounts
</string>
<string
name=
"msg_new_user"
>
New user? %1$s
</string>
<string
name=
"msg_new_user_agreement"
>
By proceeding you are agreeing to our\n%1$s and %2$s
</string>
...
...
@@ -55,6 +64,8 @@
<string
name=
"msg_unknown"
>
Unknown
</string>
<string
name=
"msg_email_address"
>
E-mail address
</string>
<string
name=
"msg_utc_offset"
>
UTC offset
</string>
<string
name=
"msg_new_password"
>
Enter New Password
</string>
<string
name=
"msg_confirm_password"
>
Confirm New Password
</string>
<!-- System messages -->
<string
name=
"message_room_name_changed"
>
Room name changed to: %1$s by %2$s
</string>
...
...
app/src/main/res/values/styles.xml
View file @
9ff47c86
...
...
@@ -56,6 +56,21 @@
<item
name=
"android:background"
>
@drawable/effect_ripple
</item>
</style>
<style
name=
"EditText.Password"
parent=
"TextAppearance.AppCompat"
>
<!-- Hint color and label color in FALSE state -->
<item
name=
"android:textColorHint"
>
@color/colorPrimaryDark
</item>
<item
name=
"colorAccent"
>
@color/colorPrimaryDark
</item>
<item
name=
"colorControlNormal"
>
@color/colorPrimaryDark
</item>
<item
name=
"colorControlActivated"
>
@color/colorPrimaryDark
</item>
</style>
<style
name=
"AuthenticationLabel"
parent=
"TextAppearance.AppCompat.Medium"
>
<item
name=
"android:layout_width"
>
wrap_content
</item>
<item
name=
"android:layout_height"
>
50dp
</item>
<item
name=
"android:layout_marginStart"
>
@dimen/screen_edge_left_and_right_margins
</item>
<item
name=
"android:paddingStart"
>
@dimen/edit_text_margin
</item>
</style>
<style
name=
"ChatRoom.Name.TextView"
parent=
"TextAppearance.AppCompat.Title"
>
<item
name=
"android:ellipsize"
>
end
</item>
<item
name=
"android:maxLines"
>
1
</item>
...
...
@@ -81,4 +96,9 @@
<item
name=
"android:background"
>
@drawable/style_edit_text_profile
</item>
</style>
<style
name=
"ActionModeStyle"
parent=
"ThemeOverlay.AppCompat.Dark.ActionBar"
>
<item
name=
"android:actionModeCloseDrawable"
>
@drawable/ic_close_white_24dp
</item>
<item
name=
"actionModeCloseDrawable"
>
@drawable/ic_close_white_24dp
</item>
</style>
</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