diff --git a/app/src/main/kotlin/jackall/overlaymulticounter/activity/MainActivity.kt b/app/src/main/kotlin/jackall/overlaymulticounter/activity/MainActivity.kt index f376290..99c8992 100644 --- a/app/src/main/kotlin/jackall/overlaymulticounter/activity/MainActivity.kt +++ b/app/src/main/kotlin/jackall/overlaymulticounter/activity/MainActivity.kt @@ -4,7 +4,9 @@ import android.os.Bundle import android.support.v7.app.AppCompatActivity import jackall.overlaymulticounter.R +import jackall.overlaymulticounter.db.CounterRealmHelper import jackall.overlaymulticounter.service.MainService +import jackall.overlaymulticounter.vo.Counter class MainActivity : AppCompatActivity() { @@ -12,6 +14,14 @@ super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) + if (CounterRealmHelper().getNextId() == 0) { + CounterRealmHelper().insert( + Counter(CounterRealmHelper().getNextId(), + "カウンター1", + 0) + ) + } + // TODO: RuntimePermissionの処理 startService(Intent(this, MainService::class.java)) } diff --git a/app/src/main/kotlin/jackall/overlaymulticounter/contract/CounterContract.kt b/app/src/main/kotlin/jackall/overlaymulticounter/contract/CounterContract.kt new file mode 100644 index 0000000..a70ccde --- /dev/null +++ b/app/src/main/kotlin/jackall/overlaymulticounter/contract/CounterContract.kt @@ -0,0 +1,10 @@ +package jackall.overlaymulticounter.contract + +/** + * Created by matsumoto_k on 2017/11/09. + */ +interface CounterContract { + fun plus(id: Int) + fun minus(id: Int) + fun reset(id: Int) +} \ No newline at end of file diff --git a/app/src/main/kotlin/jackall/overlaymulticounter/db/CounterRealmHelper.kt b/app/src/main/kotlin/jackall/overlaymulticounter/db/CounterRealmHelper.kt index 06d5ccf..000d8c0 100644 --- a/app/src/main/kotlin/jackall/overlaymulticounter/db/CounterRealmHelper.kt +++ b/app/src/main/kotlin/jackall/overlaymulticounter/db/CounterRealmHelper.kt @@ -21,18 +21,37 @@ } fun plus(id: Int) { - query.equalTo("id", id).findFirst().apply { - count++ + realm.executeTransaction { + query.equalTo("id", id).findFirst().apply { + count++ + } } } fun minus(id: Int) { - query.equalTo("id", id).findFirst().apply { - count-- + realm.executeTransaction { + query.equalTo("id", id).findFirst().apply { + if (count > 0) + count-- + } + } + } + + fun reset(id: Int) { + realm.executeTransaction { + query.equalTo("id", id).findFirst().apply { + count = 0 + } } } override fun findAll(): RealmResults { return query.findAll() } + + fun getNextId(): Int { + if (query.count() == 0L) + return 0 + return query.count().toInt() + 1 + } } \ No newline at end of file diff --git a/app/src/main/kotlin/jackall/overlaymulticounter/service/MainService.kt b/app/src/main/kotlin/jackall/overlaymulticounter/service/MainService.kt index 5bb350c..8dcd3be 100644 --- a/app/src/main/kotlin/jackall/overlaymulticounter/service/MainService.kt +++ b/app/src/main/kotlin/jackall/overlaymulticounter/service/MainService.kt @@ -189,6 +189,7 @@ if (counterBinding.root.isShown) { windowManager.removeView(counterBinding.root) } + overlayCounterViewModel.onDestory() } override fun finish() { diff --git a/app/src/main/kotlin/jackall/overlaymulticounter/viewmodel/CounterItemViewModel.kt b/app/src/main/kotlin/jackall/overlaymulticounter/viewmodel/CounterItemViewModel.kt index b484624..feea98c 100644 --- a/app/src/main/kotlin/jackall/overlaymulticounter/viewmodel/CounterItemViewModel.kt +++ b/app/src/main/kotlin/jackall/overlaymulticounter/viewmodel/CounterItemViewModel.kt @@ -4,12 +4,13 @@ import android.databinding.ObservableField import android.view.View import io.realm.RealmChangeListener +import jackall.overlaymulticounter.contract.CounterContract import jackall.overlaymulticounter.vo.Counter /** * Created by matsumoto_k on 2017/11/08. */ -class CounterItemViewModel(val counter: Counter) : BaseObservable() { +class CounterItemViewModel(val counter: Counter, val counterContract: CounterContract) : BaseObservable() { val id = counter.id val title = ObservableField(counter.title) val count = ObservableField(counter.count.toString()) @@ -23,14 +24,14 @@ } fun onClickPlus(view: View) { - counter.count++ + counterContract.plus(id) } fun onClickMinus(view: View) { - counter.count-- + counterContract.minus(id) } fun onClickReset(view: View) { - counter.count = 0 + counterContract.reset(id) } } \ No newline at end of file diff --git a/app/src/main/kotlin/jackall/overlaymulticounter/viewmodel/OverlayCounterViewModel.kt b/app/src/main/kotlin/jackall/overlaymulticounter/viewmodel/OverlayCounterViewModel.kt index 9c83f3a..6250afd 100644 --- a/app/src/main/kotlin/jackall/overlaymulticounter/viewmodel/OverlayCounterViewModel.kt +++ b/app/src/main/kotlin/jackall/overlaymulticounter/viewmodel/OverlayCounterViewModel.kt @@ -1,9 +1,70 @@ package jackall.overlaymulticounter.viewmodel import android.databinding.BaseObservable +import android.databinding.BindingAdapter +import android.support.v7.widget.LinearLayoutManager +import android.support.v7.widget.RecyclerView +import io.realm.OrderedRealmCollectionChangeListener +import io.realm.RealmResults +import jackall.overlaymulticounter.App +import jackall.overlaymulticounter.CounterAdapter +import jackall.overlaymulticounter.contract.CounterContract +import jackall.overlaymulticounter.db.CounterRealmHelper +import jackall.overlaymulticounter.vo.Counter +import java.util.* /** * Created by matsumoto_k on 2017/11/08. */ -class OverlayCounterViewModel : BaseObservable() { +class OverlayCounterViewModel : BaseObservable(), CounterContract { + + var counterAdapter: CounterAdapter? = null + var counterRealmHelper = CounterRealmHelper() + var realmChangeListener: OrderedRealmCollectionChangeListener> + + init { + val items = ArrayList() + realmChangeListener = OrderedRealmCollectionChangeListener { results, changeSet -> + changeSet.insertions.forEach { + counterAdapter?.insert(CounterItemViewModel(results.get(it), this@OverlayCounterViewModel as CounterContract)) + } + changeSet.deletions.forEach { + counterAdapter?.remove(it) + } + } + counterRealmHelper.findAll().apply { + forEachIndexed { index, counter -> + items.add(CounterItemViewModel(counter, this@OverlayCounterViewModel as CounterContract)) + } + addChangeListener(realmChangeListener) + } + counterAdapter = CounterAdapter(App.get(), items) + } + + override fun plus(id: Int) { + counterRealmHelper.plus(id) + } + + override fun minus(id: Int) { + counterRealmHelper.minus(id) + } + + override fun reset(id: Int) { + counterRealmHelper.reset(id) + } + + fun onDestory() { + counterRealmHelper.close() + } + + object Adapter { + @JvmStatic + @BindingAdapter("android:setCounterAdapter") + fun setCounterAdapter(recyclerView: RecyclerView, counterAdapter: CounterAdapter?) { + if (counterAdapter == null) + return + recyclerView.layoutManager = LinearLayoutManager(App.get()) + recyclerView.adapter = counterAdapter + } + } } \ No newline at end of file diff --git a/app/src/main/res/layout/overlay_counter.xml b/app/src/main/res/layout/overlay_counter.xml index 5e8d1f2..837b4ee 100644 --- a/app/src/main/res/layout/overlay_counter.xml +++ b/app/src/main/res/layout/overlay_counter.xml @@ -20,24 +20,61 @@