From 9b6adfbb9b47e142e645fb920aa2237b5719f1cb Mon Sep 17 00:00:00 2001 From: mtkw0127 Date: Mon, 29 Jul 2024 23:35:04 +0900 Subject: [PATCH 1/6] Show play store icon --- .../com/app/body_manage/ui/top/TopActivity.kt | 13 ++++ .../com/app/body_manage/ui/top/TopScreen.kt | 25 +++++-- .../res/drawable/icons8_google_play_store.xml | 67 +++++++++++++++++++ 3 files changed, 100 insertions(+), 5 deletions(-) create mode 100644 app/src/main/res/drawable/icons8_google_play_store.xml diff --git a/app/src/main/java/com/app/body_manage/ui/top/TopActivity.kt b/app/src/main/java/com/app/body_manage/ui/top/TopActivity.kt index 3e78607d..dc517e1a 100644 --- a/app/src/main/java/com/app/body_manage/ui/top/TopActivity.kt +++ b/app/src/main/java/com/app/body_manage/ui/top/TopActivity.kt @@ -2,6 +2,7 @@ package com.app.body_manage.ui.top import android.content.Context import android.content.Intent +import android.net.Uri import android.os.Bundle import android.widget.Toast import androidx.activity.addCallback @@ -247,11 +248,23 @@ class TopActivity : AppCompatActivity() { LocalDate.now() ) ) + }, + onClickStore = { + openPlayStore() } ) } } + private fun openPlayStore() { + startActivity( + Intent( + Intent.ACTION_VIEW, + Uri.parse("market://details?id=$packageName") + ) + ) + } + companion object { fun createIntent( context: Context diff --git a/app/src/main/java/com/app/body_manage/ui/top/TopScreen.kt b/app/src/main/java/com/app/body_manage/ui/top/TopScreen.kt index 129c2c7f..f7eb4572 100644 --- a/app/src/main/java/com/app/body_manage/ui/top/TopScreen.kt +++ b/app/src/main/java/com/app/body_manage/ui/top/TopScreen.kt @@ -54,6 +54,7 @@ import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.colorResource +import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.Dp @@ -98,6 +99,7 @@ fun TopScreen( onClickAddTraining: () -> Unit = {}, onClickSetGoal: () -> Unit = {}, onClickSetting: () -> Unit = {}, + onClickStore: () -> Unit = {}, ) { val scope = rememberCoroutineScope() var openMultiFb by remember { @@ -216,7 +218,7 @@ fun TopScreen( val label = stringResource(id = R.string.label_registered_date) Text( text = "$label: $mmdd", - fontSize = 14.sp, + fontSize = 12.sp, color = Color.Gray, ) } @@ -224,17 +226,30 @@ fun TopScreen( (lastMeasure?.tall)?.let { tall -> Text( text = tall.toCentiMeter(), - fontSize = 14.sp, + fontSize = 12.sp, color = Color.Gray, ) } Spacer(modifier = Modifier.size(10.dp)) + Icon( + painter = painterResource(id = R.drawable.icons8_google_play_store), + contentDescription = null, + modifier = Modifier + .clickable { + onClickStore() + } + .size(20.dp), + tint = Color.Unspecified + ) + Spacer(modifier = Modifier.size(5.dp)) Icon( imageVector = Icons.Default.Settings, contentDescription = null, - modifier = Modifier.clickable { - onClickSetting() - } + modifier = Modifier + .clickable { + onClickSetting() + } + .size(20.dp) ) } Spacer(modifier = Modifier.size(10.dp)) diff --git a/app/src/main/res/drawable/icons8_google_play_store.xml b/app/src/main/res/drawable/icons8_google_play_store.xml new file mode 100644 index 00000000..58893f74 --- /dev/null +++ b/app/src/main/res/drawable/icons8_google_play_store.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From ebf86635885cc31ed94a8565b97b27092f5c8aaa Mon Sep 17 00:00:00 2001 From: mtkw0127 Date: Mon, 29 Jul 2024 23:39:32 +0900 Subject: [PATCH 2/6] Initial settings are true --- .../body_manage/ui/top/UserPreferenceSettingViewModel.kt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/com/app/body_manage/ui/top/UserPreferenceSettingViewModel.kt b/app/src/main/java/com/app/body_manage/ui/top/UserPreferenceSettingViewModel.kt index 701084bb..27417128 100644 --- a/app/src/main/java/com/app/body_manage/ui/top/UserPreferenceSettingViewModel.kt +++ b/app/src/main/java/com/app/body_manage/ui/top/UserPreferenceSettingViewModel.kt @@ -46,8 +46,8 @@ data class UserPreferenceSettingViewModelState( val name: String? = null, val gender: Gender = Gender.MALE, val birth: TextFieldValue = TextFieldValue(), - val hasMealFeature: Boolean = false, - val hasTrainingFeature: Boolean = false, + val hasMealFeature: Boolean = true, + val hasTrainingFeature: Boolean = true, ) { fun toUiState(): UiState { val setBirth = try { @@ -62,8 +62,8 @@ data class UserPreferenceSettingViewModelState( } val isNotYet = name.isNullOrBlank() || - setBirth.not() || - birth.text.isEmpty() + setBirth.not() || + birth.text.isEmpty() return if (isNotYet) { UiState.NotYet( From 1418961cf3e3af5b62eb9552b3918bf65f57fd3b Mon Sep 17 00:00:00 2001 From: mtkw0127 Date: Tue, 30 Jul 2024 10:03:49 +0900 Subject: [PATCH 3/6] Create the link to update --- app/build.gradle.kts | 7 +- .../com/app/body_manage/ui/top/TopActivity.kt | 11 +++ .../com/app/body_manage/ui/top/TopScreen.kt | 95 ++++++++++++++----- .../app/body_manage/ui/top/TopViewModel.kt | 8 ++ app/src/main/res/values-b+en/strings.xml | 1 + app/src/main/res/values/strings.xml | 1 + 6 files changed, 96 insertions(+), 27 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 3dacd755..bf4bfc0c 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -26,14 +26,14 @@ android { applicationId = "com.app.calendar" minSdk = 27 targetSdk = 35 - versionCode = 47 + versionCode = 1 versionName = "2.0.0" applicationId = "com.app.body_manage" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } buildTypes { named("release") { - isMinifyEnabled = false + isMinifyEnabled = true setProguardFiles( listOf( getDefaultProguardFile("proguard-android-optimize.txt"), @@ -80,6 +80,9 @@ play { dependencies { detektPlugins("io.gitlab.arturbosch.detekt:detekt-formatting:1.23.6") + implementation("com.google.android.play:app-update:2.1.0") + implementation("com.google.android.play:app-update-ktx:2.1.0") + implementation("androidx.core:core-ktx:1.13.1") implementation("androidx.appcompat:appcompat:1.7.0") implementation("com.google.android.material:material:1.12.0") diff --git a/app/src/main/java/com/app/body_manage/ui/top/TopActivity.kt b/app/src/main/java/com/app/body_manage/ui/top/TopActivity.kt index dc517e1a..0adbe62b 100644 --- a/app/src/main/java/com/app/body_manage/ui/top/TopActivity.kt +++ b/app/src/main/java/com/app/body_manage/ui/top/TopActivity.kt @@ -38,6 +38,7 @@ import com.app.body_manage.ui.photoList.PhotoListActivity import com.app.body_manage.ui.top.UserPreferenceSettingDialog.Companion.REQUEST_KEY import com.app.body_manage.ui.trainingForm.form.TrainingFormActivity import com.app.body_manage.ui.trainingMenu.TrainingMenuListActivity +import com.google.android.play.core.appupdate.AppUpdateManagerFactory import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.launch import java.time.LocalDate @@ -176,16 +177,26 @@ class TopActivity : AppCompatActivity() { } } + val appUpdateManager = AppUpdateManagerFactory.create(this) + + val appUpdateInfoTask = appUpdateManager.appUpdateInfo + appUpdateInfoTask.addOnSuccessListener { appUpdateInfo -> + viewModel.setStoreLatestVersion(appUpdateInfo.availableVersionCode()) + } + setContent { val userPreference by viewModel.userPreference.collectAsState() val lastMeasure by viewModel.lastMeasure.collectAsState() val initialMeasure by viewModel.initialMeasure.collectAsState() val todayMeasure by viewModel.todayMeasure.collectAsState() + val enableUpdate by viewModel.enableUpdate.collectAsState(false) + TopScreen( userPreference = userPreference, lastMeasure = lastMeasure, initialMeasure = initialMeasure, todayMeasure = todayMeasure, + enableUpdate = enableUpdate, bottomSheetDataList = bottomSheetDataList, onClickSeeTrainingMenu = { launcher.launch(TrainingMenuListActivity.createIntent(this)) diff --git a/app/src/main/java/com/app/body_manage/ui/top/TopScreen.kt b/app/src/main/java/com/app/body_manage/ui/top/TopScreen.kt index f7eb4572..f74fc98a 100644 --- a/app/src/main/java/com/app/body_manage/ui/top/TopScreen.kt +++ b/app/src/main/java/com/app/body_manage/ui/top/TopScreen.kt @@ -56,6 +56,7 @@ import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.colorResource import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp @@ -74,6 +75,7 @@ import com.app.body_manage.extension.toCentiMeter import com.app.body_manage.extension.toMMDDEE import com.app.body_manage.extension.toWeight import com.app.body_manage.extension.withPercent +import com.app.body_manage.style.Colors.Companion.accentColor import com.app.body_manage.style.Colors.Companion.background import com.app.body_manage.style.Colors.Companion.theme import com.app.body_manage.ui.common.ColumTextWithLabelAndIcon @@ -89,6 +91,7 @@ fun TopScreen( lastMeasure: BodyMeasure?, initialMeasure: BodyMeasure?, todayMeasure: TodayMeasure, + enableUpdate: Boolean, bottomSheetDataList: List, onClickSeeTrainingMenu: () -> Unit = {}, onClickCompare: () -> Unit = {}, @@ -199,7 +202,10 @@ fun TopScreen( .fillMaxHeight() ) { item { - Row(verticalAlignment = Alignment.Bottom) { + Row( + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.Start, + ) { if (lastMeasure?.weight != null) { Text( text = lastMeasure.weight.toString(), @@ -214,32 +220,27 @@ fun TopScreen( ) } Spacer(modifier = Modifier.size(10.dp)) - lastMeasure?.time?.toLocalDate()?.toMMDDEE()?.let { mmdd -> - val label = stringResource(id = R.string.label_registered_date) - Text( - text = "$label: $mmdd", - fontSize = 12.sp, - color = Color.Gray, - ) + Column { + (lastMeasure?.tall)?.let { tall -> + Text( + text = tall.toCentiMeter(), + fontSize = 11.sp, + color = Color.Gray, + ) + } + lastMeasure?.time?.toLocalDate()?.toMMDDEE()?.let { mmdd -> + val label = stringResource(id = R.string.label_registered_date) + Text( + text = "$label: $mmdd", + fontSize = 11.sp, + color = Color.Gray, + ) + } } Spacer(modifier = Modifier.weight(1F)) - (lastMeasure?.tall)?.let { tall -> - Text( - text = tall.toCentiMeter(), - fontSize = 12.sp, - color = Color.Gray, - ) - } - Spacer(modifier = Modifier.size(10.dp)) - Icon( - painter = painterResource(id = R.drawable.icons8_google_play_store), - contentDescription = null, - modifier = Modifier - .clickable { - onClickStore() - } - .size(20.dp), - tint = Color.Unspecified + UpdateIcon( + enableUpdate = enableUpdate, + onClickStore = onClickStore, ) Spacer(modifier = Modifier.size(5.dp)) Icon( @@ -330,6 +331,50 @@ fun TopScreen( } } +@Composable +private fun UpdateIcon( + enableUpdate: Boolean, + onClickStore: () -> Unit, +) { + if (enableUpdate) { + Row( + verticalAlignment = Alignment.CenterVertically, + modifier = Modifier + .clickable { + onClickStore() + } + .background(accentColor, RoundedCornerShape(5.dp)) + .border(1.dp, Color.Blue, RoundedCornerShape(5.dp)) + .padding(vertical = 3.dp, horizontal = 6.dp), + ) { + Text( + text = stringResource(id = R.string.enable_update), + fontSize = 11.sp, + color = Color.White, + fontWeight = FontWeight.Bold, + ) + Spacer(modifier = Modifier.size(3.dp)) + Icon( + painter = painterResource(id = R.drawable.icons8_google_play_store), + contentDescription = null, + modifier = Modifier.size(20.dp), + tint = Color.Unspecified + ) + } + } else { + Icon( + painter = painterResource(id = R.drawable.icons8_google_play_store), + contentDescription = null, + modifier = Modifier + .clickable { + onClickStore() + } + .size(20.dp), + tint = Color.Unspecified + ) + } +} + @Composable private fun FabItem( @StringRes textRes: Int, diff --git a/app/src/main/java/com/app/body_manage/ui/top/TopViewModel.kt b/app/src/main/java/com/app/body_manage/ui/top/TopViewModel.kt index d6808a4d..905a7edb 100644 --- a/app/src/main/java/com/app/body_manage/ui/top/TopViewModel.kt +++ b/app/src/main/java/com/app/body_manage/ui/top/TopViewModel.kt @@ -2,6 +2,7 @@ package com.app.body_manage.ui.top import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope +import com.app.body_manage.BuildConfig import com.app.body_manage.data.entity.toModel import com.app.body_manage.data.local.UserPreference import com.app.body_manage.data.local.UserPreferenceRepository @@ -49,6 +50,9 @@ class TopViewModel( private val _initialMeasure: MutableStateFlow = MutableStateFlow(null) val initialMeasure = _initialMeasure.stateIn(viewModelScope, SharingStarted.Eagerly, null) + private val _enableUpdate: MutableStateFlow = MutableStateFlow(false) + val enableUpdate = _enableUpdate.asSharedFlow() + // 当日の測定 private val _todayMeasure: MutableStateFlow = MutableStateFlow( TodayMeasure( @@ -137,4 +141,8 @@ class TopViewModel( load() } } + + fun setStoreLatestVersion(availableVersionCode: Int) { + _enableUpdate.value = availableVersionCode > BuildConfig.VERSION_CODE + } } diff --git a/app/src/main/res/values-b+en/strings.xml b/app/src/main/res/values-b+en/strings.xml index 93ec0a9b..7e6c598d 100644 --- a/app/src/main/res/values-b+en/strings.xml +++ b/app/src/main/res/values-b+en/strings.xml @@ -36,6 +36,7 @@ S increase decrease + Update User Name diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 488fc373..c3b44eed 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -36,6 +36,7 @@ 増加 減少 + アップデート可能 ▪️ユーザ名 From 55a0cd8548d3406ef58fe1df0e6dbc395754d9f7 Mon Sep 17 00:00:00 2001 From: mtkw0127 Date: Tue, 30 Jul 2024 10:06:12 +0900 Subject: [PATCH 4/6] Fix lint error --- .../app/body_manage/ui/top/UserPreferenceSettingViewModel.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/app/body_manage/ui/top/UserPreferenceSettingViewModel.kt b/app/src/main/java/com/app/body_manage/ui/top/UserPreferenceSettingViewModel.kt index 27417128..d52925de 100644 --- a/app/src/main/java/com/app/body_manage/ui/top/UserPreferenceSettingViewModel.kt +++ b/app/src/main/java/com/app/body_manage/ui/top/UserPreferenceSettingViewModel.kt @@ -62,8 +62,8 @@ data class UserPreferenceSettingViewModelState( } val isNotYet = name.isNullOrBlank() || - setBirth.not() || - birth.text.isEmpty() + setBirth.not() || + birth.text.isEmpty() return if (isNotYet) { UiState.NotYet( From 4385e164148e5eff5e6ddc3138fb78dd73c71295 Mon Sep 17 00:00:00 2001 From: mtkw0127 Date: Tue, 30 Jul 2024 11:19:09 +0900 Subject: [PATCH 5/6] Delete in-app-api --- app/build.gradle.kts | 7 ++----- .../com/app/body_manage/dialog/FloatNumberPickerDialog.kt | 2 +- .../main/java/com/app/body_manage/ui/top/TopActivity.kt | 8 -------- .../main/java/com/app/body_manage/ui/top/TopViewModel.kt | 5 ----- 4 files changed, 3 insertions(+), 19 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index bf4bfc0c..f0c21067 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -26,7 +26,7 @@ android { applicationId = "com.app.calendar" minSdk = 27 targetSdk = 35 - versionCode = 1 + versionCode = 47 versionName = "2.0.0" applicationId = "com.app.body_manage" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" @@ -80,9 +80,6 @@ play { dependencies { detektPlugins("io.gitlab.arturbosch.detekt:detekt-formatting:1.23.6") - implementation("com.google.android.play:app-update:2.1.0") - implementation("com.google.android.play:app-update-ktx:2.1.0") - implementation("androidx.core:core-ktx:1.13.1") implementation("androidx.appcompat:appcompat:1.7.0") implementation("com.google.android.material:material:1.12.0") @@ -97,7 +94,7 @@ dependencies { implementation("com.facebook.soloader:soloader:0.11.0") // lifecycle - implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:2.8.3") + implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:2.8.4") // In-App-Review implementation("com.google.android.play:review:2.0.1") diff --git a/app/src/main/java/com/app/body_manage/dialog/FloatNumberPickerDialog.kt b/app/src/main/java/com/app/body_manage/dialog/FloatNumberPickerDialog.kt index c8a77943..129b6ce0 100644 --- a/app/src/main/java/com/app/body_manage/dialog/FloatNumberPickerDialog.kt +++ b/app/src/main/java/com/app/body_manage/dialog/FloatNumberPickerDialog.kt @@ -44,7 +44,7 @@ class FloatNumberPickerDialog : DialogFragment() { private var number: Float = 50F private var unit: String = "" private var label: String = "" - private lateinit var callBack: (weight: Float) -> Unit + private var callBack: (weight: Float) -> Unit = { _ -> } // 初期値 private var hundredsPlace: String = "" diff --git a/app/src/main/java/com/app/body_manage/ui/top/TopActivity.kt b/app/src/main/java/com/app/body_manage/ui/top/TopActivity.kt index 0adbe62b..5555a51f 100644 --- a/app/src/main/java/com/app/body_manage/ui/top/TopActivity.kt +++ b/app/src/main/java/com/app/body_manage/ui/top/TopActivity.kt @@ -38,7 +38,6 @@ import com.app.body_manage.ui.photoList.PhotoListActivity import com.app.body_manage.ui.top.UserPreferenceSettingDialog.Companion.REQUEST_KEY import com.app.body_manage.ui.trainingForm.form.TrainingFormActivity import com.app.body_manage.ui.trainingMenu.TrainingMenuListActivity -import com.google.android.play.core.appupdate.AppUpdateManagerFactory import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.launch import java.time.LocalDate @@ -177,13 +176,6 @@ class TopActivity : AppCompatActivity() { } } - val appUpdateManager = AppUpdateManagerFactory.create(this) - - val appUpdateInfoTask = appUpdateManager.appUpdateInfo - appUpdateInfoTask.addOnSuccessListener { appUpdateInfo -> - viewModel.setStoreLatestVersion(appUpdateInfo.availableVersionCode()) - } - setContent { val userPreference by viewModel.userPreference.collectAsState() val lastMeasure by viewModel.lastMeasure.collectAsState() diff --git a/app/src/main/java/com/app/body_manage/ui/top/TopViewModel.kt b/app/src/main/java/com/app/body_manage/ui/top/TopViewModel.kt index 905a7edb..c896b791 100644 --- a/app/src/main/java/com/app/body_manage/ui/top/TopViewModel.kt +++ b/app/src/main/java/com/app/body_manage/ui/top/TopViewModel.kt @@ -2,7 +2,6 @@ package com.app.body_manage.ui.top import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope -import com.app.body_manage.BuildConfig import com.app.body_manage.data.entity.toModel import com.app.body_manage.data.local.UserPreference import com.app.body_manage.data.local.UserPreferenceRepository @@ -141,8 +140,4 @@ class TopViewModel( load() } } - - fun setStoreLatestVersion(availableVersionCode: Int) { - _enableUpdate.value = availableVersionCode > BuildConfig.VERSION_CODE - } } From e0dd76198677e61f066e240582e951f0d3be5774 Mon Sep 17 00:00:00 2001 From: mtkw0127 Date: Tue, 30 Jul 2024 19:23:36 +0900 Subject: [PATCH 6/6] Bump up --- app/build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 3dacd755..ad126fa7 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -26,7 +26,7 @@ android { applicationId = "com.app.calendar" minSdk = 27 targetSdk = 35 - versionCode = 47 + versionCode = 48 versionName = "2.0.0" applicationId = "com.app.body_manage" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"