diff --git a/app/build.gradle b/app/build.gradle index 90bb764..6ceb76a 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -39,10 +39,12 @@ // Data Binding kapt 'com.android.databinding:compiler:3.0.1' - // Android Architecture Components for Lifecycles, LiveData, and ViewModel + // Android Architecture Components for Lifecycles, LiveData, Room, and ViewModel compile "android.arch.lifecycle:runtime:1.1.0" compile "android.arch.lifecycle:extensions:1.1.0" annotationProcessor "android.arch.lifecycle:compiler:1.1.0" + implementation "android.arch.persistence.room:runtime:1.0.0" + annotationProcessor "android.arch.persistence.room:compiler:1.0.0" // Dagger2 implementation "com.google.dagger:dagger:$dagger_version" diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 271f73d..02dcb56 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -17,6 +17,7 @@ + \ No newline at end of file diff --git a/app/src/main/java/keijumt/todoapp/addtask/AddEditTaskActivity.kt b/app/src/main/java/keijumt/todoapp/addtask/AddEditTaskActivity.kt new file mode 100644 index 0000000..89797b1 --- /dev/null +++ b/app/src/main/java/keijumt/todoapp/addtask/AddEditTaskActivity.kt @@ -0,0 +1,25 @@ +package keijumt.todoapp.addtask + +import android.os.Bundle +import android.support.v4.app.Fragment +import dagger.android.AndroidInjector +import dagger.android.support.HasSupportFragmentInjector +import keijumt.todoapp.BaseActivity +import keijumt.todoapp.R +import keijumt.todoapp.di.Injectable + +/** + * タスク追加のActivity + * Created by matsumoto_k on 2018/03/06. + */ +class AddEditTaskActivity : BaseActivity(), HasSupportFragmentInjector, Injectable { + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_add_edit_task) + } + + override fun supportFragmentInjector(): AndroidInjector { + return androidInjector + } +} diff --git a/app/src/main/java/keijumt/todoapp/addtask/AddEditTaskFragment.kt b/app/src/main/java/keijumt/todoapp/addtask/AddEditTaskFragment.kt new file mode 100644 index 0000000..bc51f0b --- /dev/null +++ b/app/src/main/java/keijumt/todoapp/addtask/AddEditTaskFragment.kt @@ -0,0 +1,29 @@ +package keijumt.todoapp.addtask + +import android.arch.lifecycle.ViewModelProviders +import android.databinding.DataBindingUtil +import android.os.Bundle +import android.support.v4.app.Fragment +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import keijumt.todoapp.R +import keijumt.todoapp.databinding.FragmentAddEditTaskBinding + +/** + * タスク追加のFragment + * Created by matsumoto_k on 2018/03/06. + */ +class AddEditTaskFragment : Fragment() { + + lateinit var binding: FragmentAddEditTaskBinding + lateinit var addEditTaskViewModel: AddEditTaskViewModel + + override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? { + binding = DataBindingUtil.inflate(inflater, R.layout.fragment_add_edit_task, null, false) + addEditTaskViewModel = ViewModelProviders.of(activity).get(AddEditTaskViewModel::class.java) + binding.addEditTaskViewModel = addEditTaskViewModel + lifecycle.addObserver(addEditTaskViewModel) + return binding.root + } +} \ No newline at end of file diff --git a/app/src/main/java/keijumt/todoapp/addtask/AddEditTaskViewModel.kt b/app/src/main/java/keijumt/todoapp/addtask/AddEditTaskViewModel.kt new file mode 100644 index 0000000..41103ac --- /dev/null +++ b/app/src/main/java/keijumt/todoapp/addtask/AddEditTaskViewModel.kt @@ -0,0 +1,15 @@ +package keijumt.todoapp.addtask + +import android.databinding.ObservableField +import keijumt.todoapp.BaseViewModel +import javax.inject.Inject + +/** + * タスク追加のViewModel + * Created by matsumoto_k on 2018/03/06. + */ +class AddEditTaskViewModel @Inject constructor() : BaseViewModel() { + + val taskTitle = ObservableField() + val taskDetails = ObservableField() +} \ No newline at end of file diff --git a/app/src/main/java/keijumt/todoapp/databinding/SingleLiveEvent.kt b/app/src/main/java/keijumt/todoapp/databinding/SingleLiveEvent.kt new file mode 100644 index 0000000..00a6a81 --- /dev/null +++ b/app/src/main/java/keijumt/todoapp/databinding/SingleLiveEvent.kt @@ -0,0 +1,59 @@ +package keijumt.todoapp.databinding + +import android.arch.lifecycle.LifecycleOwner +import android.arch.lifecycle.MutableLiveData +import android.arch.lifecycle.Observer +import android.support.annotation.MainThread +import android.util.Log +import java.util.concurrent.atomic.AtomicBoolean + +/** + * A lifecycle-aware observable that sends only new updates after subscription, used for events like + * navigation and Snackbar messages. + * + * + * This avoids a common problem with events: on configuration change (like rotation) an update + * can be emitted if the observer is active. This LiveData only calls the observable if there's an + * explicit call to setValue() or call(). + * + * + * Note that only one observer is going to be notified of changes. + */ +class SingleLiveEvent : MutableLiveData() { + + private val mPending = AtomicBoolean(false) + + @MainThread + override fun observe(owner: LifecycleOwner, observer: Observer) { + + if (hasActiveObservers()) { + Log.w(TAG, "Multiple observers registered but only one will be notified of changes.") + } + + // Observe the internal MutableLiveData + super.observe(owner, Observer { t -> + if (mPending.compareAndSet(true, false)) { + observer.onChanged(t) + } + }) + } + + @MainThread + override fun setValue(t: T?) { + mPending.set(true) + super.setValue(t) + } + + /** + * Used for cases where T is Void, to make calls cleaner. + */ + @MainThread + fun call() { + value = null + } + + companion object { + + private val TAG = "SingleLiveEvent" + } +} diff --git a/app/src/main/java/keijumt/todoapp/di/ActivityModule.kt b/app/src/main/java/keijumt/todoapp/di/ActivityModule.kt index 9d4e7b1..7bf5c2d 100644 --- a/app/src/main/java/keijumt/todoapp/di/ActivityModule.kt +++ b/app/src/main/java/keijumt/todoapp/di/ActivityModule.kt @@ -2,6 +2,7 @@ import dagger.Module import dagger.android.ContributesAndroidInjector +import keijumt.todoapp.addtask.AddEditTaskActivity import keijumt.todoapp.main.MainActivity /** @@ -12,4 +13,7 @@ @ContributesAndroidInjector internal abstract fun contributeMainActivity(): MainActivity + + @ContributesAndroidInjector + internal abstract fun contributeAddEditActivity(): AddEditTaskActivity } \ No newline at end of file diff --git a/app/src/main/java/keijumt/todoapp/di/FragmentBuildersModule.kt b/app/src/main/java/keijumt/todoapp/di/FragmentBuildersModule.kt index 174e813..b62d67a 100644 --- a/app/src/main/java/keijumt/todoapp/di/FragmentBuildersModule.kt +++ b/app/src/main/java/keijumt/todoapp/di/FragmentBuildersModule.kt @@ -1,10 +1,14 @@ package keijumt.todoapp.di import dagger.Module +import dagger.android.ContributesAndroidInjector +import keijumt.todoapp.addtask.AddEditTaskFragment /** * DIするFragment */ @Module abstract class FragmentBuildersModule { + @ContributesAndroidInjector + abstract fun contributeAddEditTaskFragment(): AddEditTaskFragment } \ No newline at end of file diff --git a/app/src/main/java/keijumt/todoapp/di/ViewModelModule.kt b/app/src/main/java/keijumt/todoapp/di/ViewModelModule.kt index b6e0bc4..a6413ba 100644 --- a/app/src/main/java/keijumt/todoapp/di/ViewModelModule.kt +++ b/app/src/main/java/keijumt/todoapp/di/ViewModelModule.kt @@ -5,6 +5,7 @@ import dagger.Binds import dagger.Module import dagger.multibindings.IntoMap +import keijumt.todoapp.addtask.AddEditTaskViewModel import keijumt.todoapp.main.MainViewModel /** @@ -19,5 +20,11 @@ internal abstract fun bindMainViewModel(mainViewModel: MainViewModel): ViewModel @Binds + @IntoMap + @ViewModelKey(AddEditTaskViewModel::class) + internal abstract fun bindAddTaskViewModel(addTaskViewModel: AddEditTaskViewModel): ViewModel + + + @Binds internal abstract fun bindViewModelFactory(factory: ViewModelFactory): ViewModelProvider.Factory } \ No newline at end of file diff --git a/app/src/main/java/keijumt/todoapp/main/MainActivity.kt b/app/src/main/java/keijumt/todoapp/main/MainActivity.kt index f7f05f0..a1a6a14 100644 --- a/app/src/main/java/keijumt/todoapp/main/MainActivity.kt +++ b/app/src/main/java/keijumt/todoapp/main/MainActivity.kt @@ -1,6 +1,8 @@ package keijumt.todoapp.main +import android.arch.lifecycle.Observer import android.arch.lifecycle.ViewModelProviders +import android.content.Intent import android.databinding.DataBindingUtil import android.os.Bundle import android.support.v4.app.Fragment @@ -8,6 +10,7 @@ import dagger.android.support.HasSupportFragmentInjector import keijumt.todoapp.BaseActivity import keijumt.todoapp.R +import keijumt.todoapp.addtask.AddEditTaskActivity import keijumt.todoapp.databinding.ActivityMainBinding import keijumt.todoapp.di.Injectable @@ -24,7 +27,15 @@ super.onCreate(savedInstanceState) binding = DataBindingUtil.setContentView(this, R.layout.activity_main) mainViewModel = ViewModelProviders.of(this, viewModelFactory).get(MainViewModel::class.java) + binding.viewModel = mainViewModel lifecycle.addObserver(mainViewModel) + subscribe() + } + + fun subscribe() { + mainViewModel.newTaskEvent.observe(this, Observer { + startActivity(Intent(this, AddEditTaskActivity::class.java)) + }) } override fun supportFragmentInjector(): AndroidInjector { diff --git a/app/src/main/java/keijumt/todoapp/main/MainViewModel.kt b/app/src/main/java/keijumt/todoapp/main/MainViewModel.kt index cb17245..c3dc875 100644 --- a/app/src/main/java/keijumt/todoapp/main/MainViewModel.kt +++ b/app/src/main/java/keijumt/todoapp/main/MainViewModel.kt @@ -1,6 +1,7 @@ package keijumt.todoapp.main import keijumt.todoapp.BaseViewModel +import keijumt.todoapp.databinding.SingleLiveEvent import javax.inject.Inject /** @@ -8,4 +9,13 @@ * Created by matsumoto_k on 2018/03/06. */ class MainViewModel @Inject constructor() : BaseViewModel() { + + val newTaskEvent = SingleLiveEvent() + + /** + * タスク追加(fab)クリック + */ + fun onClickNewTask() { + newTaskEvent.call() + } } \ No newline at end of file diff --git a/app/src/main/res/drawable-hdpi/ic_add.png b/app/src/main/res/drawable-hdpi/ic_add.png new file mode 100644 index 0000000..e74eccf --- /dev/null +++ b/app/src/main/res/drawable-hdpi/ic_add.png Binary files differ diff --git a/app/src/main/res/drawable-hdpi/ic_check.png b/app/src/main/res/drawable-hdpi/ic_check.png new file mode 100644 index 0000000..947bfcc --- /dev/null +++ b/app/src/main/res/drawable-hdpi/ic_check.png Binary files differ diff --git a/app/src/main/res/drawable-mdpi/ic_add.png b/app/src/main/res/drawable-mdpi/ic_add.png new file mode 100644 index 0000000..41784d3 --- /dev/null +++ b/app/src/main/res/drawable-mdpi/ic_add.png Binary files differ diff --git a/app/src/main/res/drawable-mdpi/ic_check.png b/app/src/main/res/drawable-mdpi/ic_check.png new file mode 100644 index 0000000..9acf69d --- /dev/null +++ b/app/src/main/res/drawable-mdpi/ic_check.png Binary files differ diff --git a/app/src/main/res/drawable-xhdpi/ic_add.png b/app/src/main/res/drawable-xhdpi/ic_add.png new file mode 100644 index 0000000..ac17961 --- /dev/null +++ b/app/src/main/res/drawable-xhdpi/ic_add.png Binary files differ diff --git a/app/src/main/res/drawable-xhdpi/ic_check.png b/app/src/main/res/drawable-xhdpi/ic_check.png new file mode 100644 index 0000000..d6880cd --- /dev/null +++ b/app/src/main/res/drawable-xhdpi/ic_check.png Binary files differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_add.png b/app/src/main/res/drawable-xxhdpi/ic_add.png new file mode 100644 index 0000000..876df78 --- /dev/null +++ b/app/src/main/res/drawable-xxhdpi/ic_add.png Binary files differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_check.png b/app/src/main/res/drawable-xxhdpi/ic_check.png new file mode 100644 index 0000000..610875c --- /dev/null +++ b/app/src/main/res/drawable-xxhdpi/ic_check.png Binary files differ diff --git a/app/src/main/res/layout/activity_add_edit_task.xml b/app/src/main/res/layout/activity_add_edit_task.xml new file mode 100644 index 0000000..4688e3e --- /dev/null +++ b/app/src/main/res/layout/activity_add_edit_task.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index d1dcfef..ba87699 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -1,5 +1,6 @@ - + @@ -12,5 +13,16 @@ android:layout_width="match_parent" android:layout_height="match_parent"> + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_add_edit_task.xml b/app/src/main/res/layout/fragment_add_edit_task.xml new file mode 100644 index 0000000..18a1c1a --- /dev/null +++ b/app/src/main/res/layout/fragment_add_edit_task.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 06baf8c..d155284 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,3 +1,5 @@ ToDoApp + Task title + Task details