diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 4d249f4..af0fefd 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -12,14 +12,15 @@ android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> - + + + - diff --git a/app/src/main/kotlin/jackall/moncalc/Const.kt b/app/src/main/kotlin/jackall/moncalc/Const.kt index 316a126..21905c3 100644 --- a/app/src/main/kotlin/jackall/moncalc/Const.kt +++ b/app/src/main/kotlin/jackall/moncalc/Const.kt @@ -10,5 +10,6 @@ const val questDataVersion = 0 const val moveButtonActiveAlpha = 1.0f const val moveButtonInactiveAlpha = 0.7f + const val develop = false } } \ No newline at end of file diff --git a/app/src/main/kotlin/jackall/moncalc/activity/MainActivity.kt b/app/src/main/kotlin/jackall/moncalc/activity/MainActivity.kt index 6cd637c..4c22dbc 100644 --- a/app/src/main/kotlin/jackall/moncalc/activity/MainActivity.kt +++ b/app/src/main/kotlin/jackall/moncalc/activity/MainActivity.kt @@ -6,6 +6,7 @@ import android.support.v7.app.AppCompatActivity import com.google.gson.Gson import com.google.gson.stream.JsonReader +import io.realm.RealmList import jackall.moncalc.Const import jackall.moncalc.R import jackall.moncalc.adapter.MainFragmentPagerAdapter @@ -13,11 +14,15 @@ import jackall.moncalc.common.PreferenceNames import jackall.moncalc.databinding.ActivityMainBinding import jackall.moncalc.db.MonstDataRealmHelper +import jackall.moncalc.db.QuestRecordRealmHelper import jackall.moncalc.utils.MySharedPref import jackall.moncalc.viewmodel.MainViewModel +import jackall.moncalc.vo.Drop import jackall.moncalc.vo.MonstData +import jackall.moncalc.vo.QuestRecord import kotlinx.android.synthetic.main.activity_main.view.* import java.io.InputStreamReader +import java.util.* /** * Created by matsumoto_k on 2017/11/03. @@ -45,6 +50,49 @@ println("db update") } + if (Const.develop) { + for (i in 0..1000) { + + val dateStart = Calendar.getInstance() + dateStart.set(2017, 9, 1) + + // 終了日 + val dateEnd = Calendar.getInstance() + + // 期間日数 + val dateDiff = (dateEnd.timeInMillis - dateStart.timeInMillis) / (1000 * 60 * 60 * 24) + + // ランダムな年月日の生成 + val dateRandom = Calendar.getInstance() + dateRandom.add(dateEnd.get(Calendar.DATE), -Random().nextInt(dateDiff.toInt())) + + val drops = RealmList() + val grade = Random().nextInt(6) + drops.add( + Drop( + fruitId = Random().nextInt(15), + gradeId = grade + ) + ) + var specialCount: Int + if (grade < 3) { + specialCount = 1 + } else { + specialCount = 0 + } + QuestRecordRealmHelper().insert( + QuestRecord( + attribute = Random().nextInt(5), + templeId = Random().nextInt(20), + specialCount = specialCount, + dropCount = drops.count(), + drops = drops, + createAt = dateRandom.time + ) + ) + } + } + mainBinding.root.main_view_pager.offscreenPageLimit = 3 mainBinding.mainViewModel = mainViewModel lifecycle.addObserver(mainViewModel) mainBinding.root.main_view_pager.adapter = MainFragmentPagerAdapter(supportFragmentManager, this) diff --git a/app/src/main/kotlin/jackall/moncalc/activity/TestActivity.kt b/app/src/main/kotlin/jackall/moncalc/activity/TestActivity.kt index 19e424f..a627877 100644 --- a/app/src/main/kotlin/jackall/moncalc/activity/TestActivity.kt +++ b/app/src/main/kotlin/jackall/moncalc/activity/TestActivity.kt @@ -1,22 +1,14 @@ package jackall.moncalc.activity -import android.app.ActivityManager -import android.content.Context -import android.content.Intent +import android.databinding.DataBindingUtil import android.os.Bundle import android.support.v7.app.AppCompatActivity -import com.google.gson.Gson -import com.google.gson.stream.JsonReader -import jackall.moncalc.Const import jackall.moncalc.R -import jackall.moncalc.common.PreferenceKeys import jackall.moncalc.common.PreferenceNames +import jackall.moncalc.databinding.ActivityTestBinding import jackall.moncalc.db.MonstDataRealmHelper -import jackall.moncalc.service.MainService import jackall.moncalc.utils.MySharedPref -import jackall.moncalc.vo.MonstData -import kotlinx.android.synthetic.main.activity_test.* -import java.io.InputStreamReader +import jackall.moncalc.viewmodel.TestViewModel class TestActivity : AppCompatActivity() { @@ -26,47 +18,12 @@ override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - setContentView(R.layout.activity_test) - - // TODO:レイアウトを決めてdatbinding,viewModelProvidersを有効にする - val intent = Intent(this, MainService::class.java) - if ((mySharedPref.getValue(PreferenceKeys.QUESTDATAVERSION, Int::class.java, -1) as Int) < Const.questDataVersion) { - val inputStream = assets.open("data.json") - val jsonReader = JsonReader(InputStreamReader(inputStream)) - val monstData = Gson().fromJson(jsonReader, MonstData::class.java) - - monstDataRealmHelper.update(monstData.fruit) - monstDataRealmHelper.update(monstData.temple) - monstDataRealmHelper.update(monstData.grade) - - mySharedPref.putValue(PreferenceKeys.QUESTDATAVERSION, Int::class.java, Const.questDataVersion) - - println("db update") - } - - start_service_btn.setOnClickListener { - if (!isMainServiceRunning()) - startService(intent) - } - - stop_service_btn.setOnClickListener { - if (isMainServiceRunning()) - stopService(intent) - } + val binding = DataBindingUtil.setContentView(this, R.layout.activity_test) + binding.viewModel = TestViewModel() } override fun onDestroy() { super.onDestroy() monstDataRealmHelper.close() } - - private fun isMainServiceRunning(): Boolean { - val manager = getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager - for (serviceInfo in manager.getRunningServices(Integer.MAX_VALUE)) { - if (MainService::class.java.getName() == serviceInfo.service.className) { - return true - } - } - return false - } } diff --git a/app/src/main/kotlin/jackall/moncalc/db/QuestRecordRealmHelper.kt b/app/src/main/kotlin/jackall/moncalc/db/QuestRecordRealmHelper.kt index 1ca4054..82a2105 100644 --- a/app/src/main/kotlin/jackall/moncalc/db/QuestRecordRealmHelper.kt +++ b/app/src/main/kotlin/jackall/moncalc/db/QuestRecordRealmHelper.kt @@ -3,7 +3,6 @@ import io.realm.RealmResults import jackall.moncalc.vo.QuestRecord import java.util.* -import kotlin.collections.ArrayList /** * Created by matsumoto_k on 2017/11/03. @@ -61,7 +60,6 @@ fun countGrade(fruitId: Int, gradeId: Int): Int { val results = realm.where(QuestRecord::class.java).equalTo("drops.fruitId", fruitId).equalTo("drops.gradeId", gradeId).findAll() - println("${fruitId}:${gradeId}") var count = 0 results.forEach { it.drops.forEach { diff --git a/app/src/main/kotlin/jackall/moncalc/fragment/FruitAnalyze.kt b/app/src/main/kotlin/jackall/moncalc/fragment/FruitAnalyze.kt index ef6d35e..cd65d96 100644 --- a/app/src/main/kotlin/jackall/moncalc/fragment/FruitAnalyze.kt +++ b/app/src/main/kotlin/jackall/moncalc/fragment/FruitAnalyze.kt @@ -25,5 +25,6 @@ binding = DataBindingUtil.inflate(inflater, R.layout.fragment_analyze_fruit, container, false) binding.fruitAnalyzeViewModel = fruitAnalyzeViewModel return binding.root + return null } } \ No newline at end of file diff --git a/app/src/main/kotlin/jackall/moncalc/fragment/TempleAnalyze.kt b/app/src/main/kotlin/jackall/moncalc/fragment/TempleAnalyze.kt index 86d3d26..e91146a 100644 --- a/app/src/main/kotlin/jackall/moncalc/fragment/TempleAnalyze.kt +++ b/app/src/main/kotlin/jackall/moncalc/fragment/TempleAnalyze.kt @@ -26,5 +26,6 @@ binding = DataBindingUtil.inflate(inflater, R.layout.fragment_analyze_temple, container, false) binding.templeAnalyzeViewModel = templeAnalyzeViewModel return binding.root + return null } } \ No newline at end of file diff --git a/app/src/main/kotlin/jackall/moncalc/viewmodel/FruitAnalyzeViewModel.kt b/app/src/main/kotlin/jackall/moncalc/viewmodel/FruitAnalyzeViewModel.kt index 04fad73..01d1811 100644 --- a/app/src/main/kotlin/jackall/moncalc/viewmodel/FruitAnalyzeViewModel.kt +++ b/app/src/main/kotlin/jackall/moncalc/viewmodel/FruitAnalyzeViewModel.kt @@ -3,6 +3,7 @@ import android.arch.lifecycle.ViewModel import android.arch.lifecycle.ViewModelProvider import android.databinding.BindingAdapter +import android.databinding.ObservableField import android.graphics.Color import android.support.v7.widget.LinearLayoutManager import android.support.v7.widget.RecyclerView @@ -20,6 +21,7 @@ import jackall.moncalc.model.PieChartModel import jackall.moncalc.vo.Fruit import jackall.moncalc.vo.Grade +import kotlin.concurrent.thread /** * Created by matsumoto_k on 2017/11/04. @@ -27,54 +29,58 @@ class FruitAnalyzeViewModel : LifecycleViewModel() { val questRealmHelper = QuestRecordRealmHelper() val monstDataRealmHelper = MonstDataRealmHelper() - var pieData: PieData - var pieChartModel: PieChartModel - var items: ArrayList + val pieData = ObservableField() + val pieChartModel = ObservableField() + val items = ObservableField>() init { - val entries = ArrayList() - for (fruitId in 0..5) { - val count = questRealmHelper.countGradeById(fruitId) - if (count > 0) { - entries.add(PieEntry(count.toFloat(), monstDataRealmHelper.findNameById(Grade::class.java, fruitId))) + thread { + val entries = ArrayList() + for (fruitId in 0..5) { + val count = questRealmHelper.countGradeById(fruitId) + if (count > 0) { + entries.add(PieEntry(count.toFloat(), monstDataRealmHelper.findNameById(Grade::class.java, fruitId))) + } } - } - pieChartModel = PieChartModel(entries.apply { sortByDescending { it.value } }, "") - this.pieData = pieChartModel.pieData + pieChartModel.set(PieChartModel(entries.apply { sortByDescending { it.value } }, "")) + this.pieData.set(pieChartModel.get().pieData) - val items = ArrayList() - items.add( - FruitAnalyzeItemViewModel( - "総合", - questRealmHelper.countGradeById(0).toString(), - questRealmHelper.countGradeById(1).toString(), - questRealmHelper.countGradeById(2).toString(), - questRealmHelper.countGradeById(3).toString(), - questRealmHelper.countGradeById(4).toString(), - questRealmHelper.countGradeById(5).toString() - ) - ) + val items = ArrayList() + items.add( + FruitAnalyzeItemViewModel( + "総合", + questRealmHelper.countGradeById(0).toString(), + questRealmHelper.countGradeById(1).toString(), + questRealmHelper.countGradeById(2).toString(), + questRealmHelper.countGradeById(3).toString(), + questRealmHelper.countGradeById(4).toString(), + questRealmHelper.countGradeById(5).toString() + ) + ) // リストビューに入れる - monstDataRealmHelper.findAll(Fruit::class.java).forEach { - if (!questRealmHelper.isDrop(it.id)) - return@forEach - val item = FruitAnalyzeItemViewModel() - item.fruitName = monstDataRealmHelper.findNameById(Fruit::class.java, it.id) - item.grade0 = questRealmHelper.countGrade(it.id, 0).toString() - item.grade1 = questRealmHelper.countGrade(it.id, 1).toString() - item.grade2 = questRealmHelper.countGrade(it.id, 2).toString() - item.grade3 = questRealmHelper.countGrade(it.id, 3).toString() - item.grade4 = questRealmHelper.countGrade(it.id, 4).toString() - item.grade5 = questRealmHelper.countGrade(it.id, 5).toString() - items.add(item) + monstDataRealmHelper.findAll(Fruit::class.java).forEach { + if (!questRealmHelper.isDrop(it.id)) + return@forEach + val item = FruitAnalyzeItemViewModel() + item.fruitName = monstDataRealmHelper.findNameById(Fruit::class.java, it.id) + item.grade0 = questRealmHelper.countGrade(it.id, 0).toString() + item.grade1 = questRealmHelper.countGrade(it.id, 1).toString() + item.grade2 = questRealmHelper.countGrade(it.id, 2).toString() + item.grade3 = questRealmHelper.countGrade(it.id, 3).toString() + item.grade4 = questRealmHelper.countGrade(it.id, 4).toString() + item.grade5 = questRealmHelper.countGrade(it.id, 5).toString() + items.add(item) + } + this.items.set(items.apply { sortByDescending { it.count() } }) } - this.items = items.apply { sortByDescending { it.count() } } } object Adapter { @JvmStatic @BindingAdapter("android:fruitPieChart") - fun hoge(mChart: PieChart, pieData: PieData) { + fun hoge(mChart: PieChart, pieData: PieData?) { + if (pieData == null) + return mChart.setEntryLabelColor(Color.BLACK) mChart.isDrawHoleEnabled = false mChart.legend.verticalAlignment = Legend.LegendVerticalAlignment.TOP @@ -88,11 +94,14 @@ }) mChart.description.text = "わくわくの実ドロップ数" mChart.data = pieData + mChart.invalidate() } @JvmStatic @BindingAdapter("android:setFruitTempleList") - fun setAnalyzeFruitList(view: RecyclerView, items: ArrayList) { + fun setAnalyzeFruitList(view: RecyclerView, items: ArrayList?) { + if (items == null) + return view.layoutManager = LinearLayoutManager(App.instance) view.adapter = AnalyzeFruitAdapter(App.instance, items) } diff --git a/app/src/main/kotlin/jackall/moncalc/viewmodel/TempleAnalyzeViewModel.kt b/app/src/main/kotlin/jackall/moncalc/viewmodel/TempleAnalyzeViewModel.kt index ea3da71..e329a2f 100644 --- a/app/src/main/kotlin/jackall/moncalc/viewmodel/TempleAnalyzeViewModel.kt +++ b/app/src/main/kotlin/jackall/moncalc/viewmodel/TempleAnalyzeViewModel.kt @@ -3,6 +3,7 @@ import android.arch.lifecycle.ViewModel import android.arch.lifecycle.ViewModelProvider import android.databinding.BindingAdapter +import android.databinding.ObservableField import android.graphics.Color import android.support.v7.widget.LinearLayoutManager import android.support.v7.widget.RecyclerView @@ -20,6 +21,7 @@ import jackall.moncalc.db.QuestRecordRealmHelper import jackall.moncalc.model.PieChartModel import jackall.moncalc.vo.Temple +import kotlin.concurrent.thread /** @@ -30,50 +32,56 @@ val questRealmHelper = QuestRecordRealmHelper() val monstDataRealmHelper = MonstDataRealmHelper() val baseTempleName by lazy { App.instance.resources.getStringArray(R.array.base_temple_name) } - var pieData: PieData - var pieChartModel: PieChartModel - var items: ArrayList + val pieData = ObservableField() + val pieChartModel = ObservableField() + val items = ObservableField>() init { - val entries = ArrayList() - for (attribute in 0..4) { - val count = questRealmHelper.countByAttribute(attribute) - if (count > 0) { - entries.add(PieEntry(count.toFloat(), baseTempleName.get(attribute))) + thread { + val start = System.currentTimeMillis() + val entries = ArrayList() + for (attribute in 0..4) { + val count = questRealmHelper.countByAttribute(attribute) + if (count > 0) { + entries.add(PieEntry(count.toFloat(), baseTempleName.get(attribute))) + } } - } - pieChartModel = PieChartModel(entries.apply { sortByDescending { it.value } }, "") - this.pieData = pieChartModel.pieData + pieChartModel.set(PieChartModel(entries.apply { sortByDescending { it.value } }, "")) + this.pieData.set(pieChartModel.get().pieData) - val items = ArrayList() - val specialPercent = questRealmHelper.getAllSpecialPercent() - items.add( - TempleAnalyzeItemViewModel( - "総合", - questRealmHelper.findAll().size.toString(), - "${if (specialPercent.isNaN()) 0 else String.format("%.1f", specialPercent)}%" - ) - ) - //リストビューに入れる - monstDataRealmHelper.findAll(Temple::class.java).forEach { - val count = questRealmHelper.countById(it.id) - if (count == 0) - return@forEach + val items = ArrayList() + val specialPercent = questRealmHelper.getAllSpecialPercent() items.add( TempleAnalyzeItemViewModel( - monstDataRealmHelper.findNameById(Temple::class.java, it.id), - count.toString(), - "${String.format("%.1f", questRealmHelper.getSpecialPercent(it.id))}%" + "総合", + questRealmHelper.findAll().size.toString(), + "${if (specialPercent.isNaN()) 0 else String.format("%.1f", specialPercent)}%" ) ) + //リストビューに入れる + monstDataRealmHelper.findAll(Temple::class.java).forEach { + val count = questRealmHelper.countById(it.id) + if (count == 0) + return@forEach + items.add( + TempleAnalyzeItemViewModel( + monstDataRealmHelper.findNameById(Temple::class.java, it.id), + count.toString(), + "${String.format("%.1f", questRealmHelper.getSpecialPercent(it.id))}%" + ) + ) + } + this.items.set(items.apply { sortByDescending { it.count() } }) } - this.items = items.apply { sortByDescending { it.count() } } } object Adapter { @JvmStatic @BindingAdapter("android:pieChart") - fun hoge(mChart: PieChart, pieData: PieData) { + fun hoge(mChart: PieChart, pieData: PieData?) { + if (pieData == null) + return + val start = System.currentTimeMillis() mChart.setEntryLabelColor(Color.BLACK) mChart.isDrawHoleEnabled = false mChart.legend.verticalAlignment = Legend.LegendVerticalAlignment.TOP @@ -91,7 +99,9 @@ @JvmStatic @BindingAdapter("android:setAnalyzeTempleList") - fun setAnalyzeTempleList(view: RecyclerView, items: ArrayList) { + fun setAnalyzeTempleList(view: RecyclerView, items: ArrayList?) { + if (items == null) + return view.layoutManager = LinearLayoutManager(App.instance) view.adapter = AnalyzeTempleAdapter(App.instance, items) } diff --git a/app/src/main/kotlin/jackall/moncalc/viewmodel/TestViewModel.kt b/app/src/main/kotlin/jackall/moncalc/viewmodel/TestViewModel.kt new file mode 100644 index 0000000..26c0cbd --- /dev/null +++ b/app/src/main/kotlin/jackall/moncalc/viewmodel/TestViewModel.kt @@ -0,0 +1,53 @@ +package jackall.moncalc.viewmodel + +import android.databinding.BindingAdapter +import android.databinding.ObservableField +import android.view.View +import kotlin.concurrent.thread + +/** + * Created by matsumoto_k on 2017/11/05. + */ +class TestViewModel { + var hogehoge = ObservableField("aaa") + + init { + thread { + try { + Thread.sleep(1000) + } catch (e: Exception) { + + } + hogehoge.set("bbb") + + try { + Thread.sleep(1000) + } catch (e: Exception) { + + } + hogehoge.set("ccc") + + try { + Thread.sleep(1000) + } catch (e: Exception) { + + } + hogehoge.set("eee") + + try { + Thread.sleep(1000) + } catch (e: Exception) { + + } + hogehoge.set("fff") + } + } + + object Adapter { + @JvmStatic + @BindingAdapter("android:hogehoge") + fun hoge(view: View, hogehoge: String) { + println(hogehoge) + } + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_service_button.xml b/app/src/main/res/drawable/shape_service_button.xml new file mode 100644 index 0000000..91f4ddd --- /dev/null +++ b/app/src/main/res/drawable/shape_service_button.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + \ 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 f23c8d1..113b122 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -17,8 +17,14 @@ android:id="@+id/start_service_button" android:layout_width="match_parent" android:layout_height="wrap_content" + android:layout_marginBottom="4dp" + android:layout_marginEnd="4dp" + android:layout_marginStart="4dp" + android:background="@drawable/shape_service_button" android:onClick="@{mainViewModel.onClickServiceButton}" android:text="@={mainViewModel.serviceButtonText}" + android:textColor="#ffffff" + android:textSize="20dp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" /> @@ -26,9 +32,7 @@ + android:layout_height="50dp" /> - + -