Skip to content

Commit 7c4d40c

Browse files
authored
Merge pull request #15 from mrtry/feature/logout
Feature/logout
2 parents 6e65bec + 78c64a1 commit 7c4d40c

File tree

14 files changed

+155
-1
lines changed

14 files changed

+155
-1
lines changed

app/src/main/java/io/github/mrtry/todolist/app/splash/ui/SplashActivity.kt

+5
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package io.github.mrtry.todolist.app.splash.ui
22

3+
import android.content.Context
34
import android.content.Intent
45
import android.os.Bundle
56
import androidx.appcompat.app.AppCompatActivity
@@ -17,6 +18,10 @@ import io.github.mrtry.todolist.misc.ui.binding.Bindable
1718
import javax.inject.Inject
1819

1920
class SplashActivity : AppCompatActivity(), Injectable<LoginComponent>, Bindable<ActivitySplashBinding> {
21+
companion object {
22+
fun createIntent(context: Context): Intent =
23+
Intent(context, SplashActivity::class.java)
24+
}
2025

2126
@Inject
2227
internal lateinit var viewModel: SplashViewModel

app/src/main/java/io/github/mrtry/todolist/app/todo/ui/ToDoActivity.kt

+15
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,16 @@ package io.github.mrtry.todolist.app.todo.ui
33
import android.content.Context
44
import android.content.Intent
55
import android.os.Bundle
6+
import android.view.Menu
7+
import android.view.MenuInflater
8+
import android.view.MenuItem
69
import androidx.appcompat.app.AppCompatActivity
710
import androidx.databinding.DataBindingUtil
811
import androidx.recyclerview.widget.LinearLayoutManager
912
import io.github.mrtry.todolist.MainApplication
1013
import io.github.mrtry.todolist.R
1114
import io.github.mrtry.todolist.app.todo.ui.adapter.ToDoAdapter
15+
import io.github.mrtry.todolist.app.todo.ui.menu.ToDoMenuAction
1216
import io.github.mrtry.todolist.app.todo.ui.navigator.ToDoNavigator
1317
import io.github.mrtry.todolist.app.todo.viewmodel.ToDoViewModel
1418
import io.github.mrtry.todolist.databinding.ActivityToDoBinding
@@ -67,6 +71,17 @@ class ToDoActivity : AppCompatActivity(), Injectable<ToDoComponent>, Bindable<Ac
6771
viewModel.load()
6872
}
6973

74+
override fun onCreateOptionsMenu(menu: Menu?): Boolean {
75+
val inflater: MenuInflater = menuInflater
76+
inflater.inflate(R.menu.menu_activity_to_do, menu)
77+
return true
78+
}
79+
80+
override fun onOptionsItemSelected(item: MenuItem): Boolean = ToDoMenuAction
81+
.valueOf(item.itemId)
82+
.getActionHandler(component)
83+
.handleAction() || super.onOptionsItemSelected(item)
84+
7085
override fun onStop() {
7186
super.onStop()
7287
coroutineScope.coroutineContext.cancelChildren()
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package io.github.mrtry.todolist.app.todo.ui.menu
2+
3+
import io.github.mrtry.todolist.R
4+
import io.github.mrtry.todolist.di.component.ToDoComponent
5+
import io.github.mrtry.todolist.misc.ui.menu.MenuAction
6+
7+
enum class ToDoMenuAction(override val menuId: Int) : MenuAction<ToDoMenuActionHandler, ToDoComponent> {
8+
LOGOUT(R.id.menu_logout) {
9+
override fun getActionHandler(component: ToDoComponent): ToDoMenuActionHandler =
10+
component.toDoMenuLogoutActionHandler
11+
};
12+
13+
companion object {
14+
fun valueOf(menuId: Int) =
15+
values().first { it.menuId == menuId }
16+
}
17+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package io.github.mrtry.todolist.app.todo.ui.menu
2+
3+
import io.github.mrtry.todolist.misc.ui.menu.ActionHandler
4+
5+
interface ToDoMenuActionHandler : ActionHandler
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package io.github.mrtry.todolist.app.todo.ui.menu
2+
3+
import io.github.mrtry.todolist.app.todo.ui.navigator.ToDoNavigator
4+
import io.github.mrtry.todolist.auth.repository.AccountRepository
5+
import io.github.mrtry.todolist.di.scope.ActivityScope
6+
import javax.inject.Inject
7+
8+
@ActivityScope
9+
class ToDoMenuLogoutActionHandler
10+
@Inject constructor(
11+
private val repository: AccountRepository,
12+
private val navigator: ToDoNavigator
13+
) : ToDoMenuActionHandler {
14+
override fun handleAction(): Boolean {
15+
navigator.showLogoutAlert() {
16+
repository.logout()
17+
navigator.navigateToSplash()
18+
}
19+
return true
20+
}
21+
}
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package io.github.mrtry.todolist.app.todo.ui.navigator
22

33
import android.app.Activity
4+
import io.github.mrtry.todolist.R
5+
import io.github.mrtry.todolist.app.splash.ui.SplashActivity
46
import io.github.mrtry.todolist.di.scope.ActivityScope
57
import io.github.mrtry.todolist.misc.ui.navigator.AbsNavigator
68
import javax.inject.Inject
@@ -9,4 +11,19 @@ import javax.inject.Inject
911
class ToDoNavigator
1012
@Inject constructor(
1113
private val activity: Activity
12-
) : AbsNavigator(activity)
14+
) : AbsNavigator(activity) {
15+
fun navigateToSplash() {
16+
val intent = SplashActivity.createIntent(activity)
17+
activity.startActivity(intent)
18+
finishCurrentActivity()
19+
}
20+
21+
fun showLogoutAlert(func: () -> Unit) {
22+
showAlert(
23+
R.string.to_do_activity_alert_logout,
24+
android.R.string.ok,
25+
{ _, _ -> func() },
26+
android.R.string.cancel
27+
)
28+
}
29+
}

app/src/main/java/io/github/mrtry/todolist/auth/repository/AccountRepository.kt

+2
Original file line numberDiff line numberDiff line change
@@ -10,4 +10,6 @@ class AccountRepository
1010
private val firebaseAuth = FirebaseAuth.getInstance()
1111

1212
fun isLoggedIn() = firebaseAuth.currentUser != null
13+
14+
fun logout() = firebaseAuth.signOut()
1315
}

app/src/main/java/io/github/mrtry/todolist/di/component/ToDoComponent.kt

+3
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package io.github.mrtry.todolist.di.component
22

33
import dagger.Subcomponent
44
import io.github.mrtry.todolist.app.todo.ui.ToDoActivity
5+
import io.github.mrtry.todolist.app.todo.ui.menu.ToDoMenuLogoutActionHandler
56
import io.github.mrtry.todolist.di.module.ActivityModule
67
import io.github.mrtry.todolist.di.scope.ActivityScope
78

@@ -10,4 +11,6 @@ import io.github.mrtry.todolist.di.scope.ActivityScope
1011
interface ToDoComponent : Component {
1112

1213
fun inject(activity: ToDoActivity)
14+
15+
val toDoMenuLogoutActionHandler: ToDoMenuLogoutActionHandler
1316
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package io.github.mrtry.todolist.misc.ui.menu
2+
3+
interface ActionHandler {
4+
fun handleAction(): Boolean
5+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package io.github.mrtry.todolist.misc.ui.menu
2+
3+
interface MenuAction<T : ActionHandler, C> {
4+
val menuId: Int
5+
fun getActionHandler(component: C): T
6+
}

app/src/main/java/io/github/mrtry/todolist/misc/ui/navigator/AbsNavigator.kt

+18
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
package io.github.mrtry.todolist.misc.ui.navigator
22

33
import android.app.Activity
4+
import android.content.DialogInterface
45
import android.content.Intent
56
import android.view.View
67
import android.view.inputmethod.InputMethodManager
78
import androidx.annotation.StringRes
9+
import androidx.appcompat.app.AlertDialog
810
import androidx.databinding.ViewDataBinding
911
import com.google.android.material.snackbar.Snackbar
1012
import io.github.mrtry.todolist.misc.ui.binding.Bindable
@@ -36,6 +38,22 @@ abstract class AbsNavigator(private val activity: Activity) {
3638
activity.finish()
3739
}
3840

41+
fun showAlert(
42+
@StringRes messageId: Int,
43+
@StringRes positiveLabel: Int = android.R.string.ok,
44+
action: ((DialogInterface, Int) -> Unit)? = null,
45+
@StringRes negativeLabel: Int = android.R.string.cancel,
46+
negativeAction: ((DialogInterface, Int) -> Unit)? = null,
47+
cancelable: Boolean = true
48+
) {
49+
AlertDialog.Builder(activity)
50+
.setMessage(activity.getString(messageId))
51+
.setCancelable(cancelable)
52+
.setPositiveButton(positiveLabel, action)
53+
.setNegativeButton(negativeLabel, negativeAction)
54+
.show()
55+
}
56+
3957
open fun showSnackBar(
4058
@StringRes messageId: Int, length: Int = Snackbar.LENGTH_SHORT
4159
) {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<menu xmlns:android="http://schemas.android.com/apk/res/android">
3+
<item
4+
android:id="@+id/menu_logout"
5+
android:title="@string/to_do_activity_menu_title_account_logout" />
6+
</menu>

app/src/main/res/values/strings.xml

+2
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,6 @@
44
<string name="to_do_activity_error_add_task_failed">登録に失敗しました。再度お試しください。</string>
55
<string name="to_do_activity_error_update_task_failed">更新に失敗しました。再度お試しください。</string>
66
<string name="to_do_activity_error_get_task_failed">取得に失敗しました。再度お試しください。</string>
7+
<string name="to_do_activity_menu_title_account_logout">ログアウト</string>
8+
<string name="to_do_activity_alert_logout">ログアウトしますか?</string>
79
</resources>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package io.github.mrtry.todolist.app.todo.ui.menu
2+
3+
import com.nhaarman.mockitokotlin2.any
4+
import com.nhaarman.mockitokotlin2.mock
5+
import com.nhaarman.mockitokotlin2.times
6+
import com.nhaarman.mockitokotlin2.verify
7+
import io.github.mrtry.todolist.app.todo.ui.navigator.ToDoNavigator
8+
import org.junit.Before
9+
import org.junit.Test
10+
11+
class ToDoMenuLogoutActionHandlerTest {
12+
lateinit var actionHandler: ToDoMenuLogoutActionHandler
13+
14+
lateinit var mockNavigator: ToDoNavigator
15+
16+
@Before
17+
fun setUp() {
18+
mockNavigator = mock()
19+
20+
actionHandler = ToDoMenuLogoutActionHandler(
21+
mock(),
22+
mockNavigator
23+
)
24+
}
25+
26+
@Test
27+
fun handleAction() {
28+
actionHandler.handleAction()
29+
30+
verify(mockNavigator, times(1)).showLogoutAlert(any())
31+
}
32+
}

0 commit comments

Comments
 (0)