diff --git a/app-base/src/main/res/values/strings.xml b/app-base/src/main/res/values/strings.xml index 014fa5d6..6be2fd67 100644 --- a/app-base/src/main/res/values/strings.xml +++ b/app-base/src/main/res/values/strings.xml @@ -162,6 +162,7 @@ Screen Wake up the phone and show a reminding screen + Pick Step Image Always Fullscreen Halt diff --git a/app-timer-edit/src/main/java/xyz/aprildown/timer/app/timer/edit/BehaviourSettingsView.kt b/app-timer-edit/src/main/java/xyz/aprildown/timer/app/timer/edit/BehaviourSettingsView.kt index 65006b9b..66eac550 100644 --- a/app-timer-edit/src/main/java/xyz/aprildown/timer/app/timer/edit/BehaviourSettingsView.kt +++ b/app-timer-edit/src/main/java/xyz/aprildown/timer/app/timer/edit/BehaviourSettingsView.kt @@ -99,9 +99,16 @@ internal fun MaterialPopupMenuBuilder.addVibrationItems( internal fun MaterialPopupMenuBuilder.addScreenItems( context: Context, action: ScreenAction, + onPickImageClick: () -> Unit, onFullscreenChanged: (Boolean) -> Unit ) { section { + item { + label = context.getString(RBase.string.screen_pick_image) + callback = { + onPickImageClick.invoke() + } + } switchItem { label = context.getString(RBase.string.screen_fullscreen) onBind = { diff --git a/app-timer-edit/src/main/java/xyz/aprildown/timer/app/timer/edit/EditActivity.kt b/app-timer-edit/src/main/java/xyz/aprildown/timer/app/timer/edit/EditActivity.kt index dfae6215..b515f3a2 100644 --- a/app-timer-edit/src/main/java/xyz/aprildown/timer/app/timer/edit/EditActivity.kt +++ b/app-timer-edit/src/main/java/xyz/aprildown/timer/app/timer/edit/EditActivity.kt @@ -2,6 +2,7 @@ package xyz.aprildown.timer.app.timer.edit import android.app.Activity import android.content.ClipboardManager +import android.content.Intent import android.graphics.Typeface import android.net.Uri import android.os.Bundle @@ -12,6 +13,7 @@ import android.view.View import androidx.activity.addCallback import androidx.activity.result.ActivityResult import androidx.activity.result.ActivityResultCallback +import androidx.activity.result.PickVisualMediaRequest import androidx.activity.result.contract.ActivityResultContracts import androidx.activity.viewModels import androidx.annotation.VisibleForTesting @@ -24,6 +26,7 @@ import androidx.core.view.WindowInsetsCompat import androidx.core.view.isVisible import androidx.core.view.updatePadding import androidx.core.widget.doAfterTextChanged +import androidx.documentfile.provider.DocumentFile import androidx.recyclerview.widget.ItemTouchHelper import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView @@ -68,6 +71,7 @@ import xyz.aprildown.timer.domain.usecases.Fruit import xyz.aprildown.timer.domain.utils.Constants import xyz.aprildown.timer.presentation.edit.EditViewModel import xyz.aprildown.timer.presentation.stream.accumulateTime +import xyz.aprildown.ultimateringtonepicker.getParcelableArrayExtraCompat import javax.inject.Inject import xyz.aprildown.timer.app.base.R as RBase @@ -95,6 +99,30 @@ class EditActivity : getRingtonePickerResultCallback() ) + private var imagePickerLauncherPosition = -1 + private val imagePickerLauncher = registerForActivityResult( + ActivityResultContracts.PickVisualMedia() + ) { uri -> + var title = "" + if (uri != null) { + val file = DocumentFile.fromSingleUri( + this@EditActivity, + uri + ) + title = file?.name ?: "" + } + + changeBehaviour(BehaviourType.SCREEN, imagePickerLauncherPosition) { + it + .toScreenAction() + .copy( + title = title, + uri = uri?.toString() ?: "" + ) + .toBehaviourEntity() + } + } + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = ActivityEditTimerBinding.inflate(layoutInflater) @@ -674,6 +702,16 @@ class EditActivity : addScreenItems( context = this@EditActivity, action = current.toScreenAction(), + onPickImageClick = { + imagePickerLauncherPosition = position + + imagePickerLauncher + .launch( + PickVisualMediaRequest( + ActivityResultContracts.PickVisualMedia.ImageOnly + ) + ) + }, onFullscreenChanged = { isChecked -> changeBehaviour(BehaviourType.SCREEN, position) { it.toScreenAction().copy(fullScreen = isChecked).toBehaviourEntity() diff --git a/app-timer-edit/src/main/java/xyz/aprildown/timer/app/timer/edit/UpdateStepDialog.kt b/app-timer-edit/src/main/java/xyz/aprildown/timer/app/timer/edit/UpdateStepDialog.kt index 9a642008..f53a596c 100644 --- a/app-timer-edit/src/main/java/xyz/aprildown/timer/app/timer/edit/UpdateStepDialog.kt +++ b/app-timer-edit/src/main/java/xyz/aprildown/timer/app/timer/edit/UpdateStepDialog.kt @@ -5,9 +5,12 @@ import android.net.Uri import android.os.Bundle import android.view.View import android.widget.EditText +import androidx.activity.result.PickVisualMediaRequest +import androidx.activity.result.contract.ActivityResultContracts import androidx.cardview.widget.CardView import androidx.core.net.toUri import androidx.core.widget.ImageViewCompat +import androidx.documentfile.provider.DocumentFile import androidx.fragment.app.DialogFragment import com.github.deweyreed.tools.helper.gone import com.github.deweyreed.tools.helper.toColorStateList @@ -179,6 +182,35 @@ class UpdateStepDialog : addScreenItems( context = context, action = current.toScreenAction(), + onPickImageClick = { + registerForActivityResult( + ActivityResultContracts.PickVisualMedia() + ) { uri -> + var title = "" + if (uri != null) { + val file = DocumentFile.fromSingleUri( + context, + uri + ) + title = file?.name ?: "" + } + + changeBehaviour(BehaviourType.SCREEN) { + it + .toScreenAction() + .copy( + title = title, + uri = uri.toString() + ) + .toBehaviourEntity() + } + } + .launch( + PickVisualMediaRequest( + ActivityResultContracts.PickVisualMedia.ImageOnly + ) + ) + }, onFullscreenChanged = { isChecked -> changeBehaviour(BehaviourType.SCREEN) { it.toScreenAction().copy(fullScreen = isChecked).toBehaviourEntity() diff --git a/app-timer-run/build.gradle b/app-timer-run/build.gradle index bb9ebf58..a5f93743 100644 --- a/app-timer-run/build.gradle +++ b/app-timer-run/build.gradle @@ -19,4 +19,6 @@ dependencies { implementation libs.hilt.android kapt libs.hilt.compiler + implementation libs.glide + annotationProcessor libs.compiler } diff --git a/app-timer-run/src/main/java/xyz/aprildown/timer/app/timer/run/MachineService.kt b/app-timer-run/src/main/java/xyz/aprildown/timer/app/timer/run/MachineService.kt index 9ca83c81..730bf54e 100644 --- a/app-timer-run/src/main/java/xyz/aprildown/timer/app/timer/run/MachineService.kt +++ b/app-timer-run/src/main/java/xyz/aprildown/timer/app/timer/run/MachineService.kt @@ -353,20 +353,21 @@ class MachineService : VibrateHelper.stop(this) } - override fun showScreen(timerItem: TimerEntity, currentStepName: String, fullScreen: Boolean) { + override fun showScreen(timerItem: TimerEntity, currentStepName: String, fullScreen: Boolean, imagePath: String) { if (fullScreen) { startActivity( ScreenActivity.intent( this, timerItem.id, timerItem.name, - currentStepName + currentStepName, + imagePath ).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) ) } else { notificationManager.notify( Constants.NOTIF_ID_SCREEN, - buildScreenNotificationBuilder(timerItem, currentStepName).build() + buildScreenNotificationBuilder(timerItem, currentStepName, imagePath).build() ) } } diff --git a/app-timer-run/src/main/java/xyz/aprildown/timer/app/timer/run/NotificationBuilders.kt b/app-timer-run/src/main/java/xyz/aprildown/timer/app/timer/run/NotificationBuilders.kt index 4cc02609..d64024e4 100644 --- a/app-timer-run/src/main/java/xyz/aprildown/timer/app/timer/run/NotificationBuilders.kt +++ b/app-timer-run/src/main/java/xyz/aprildown/timer/app/timer/run/NotificationBuilders.kt @@ -257,7 +257,8 @@ private fun Builder.withMediaStyleNotification(context: Context): Builder { */ internal fun Context.buildScreenNotificationBuilder( timerItem: TimerEntity, - currentStepName: String + currentStepName: String, + imagePath: String, ): Builder { val res = resources val actions = arrayListOf() @@ -280,7 +281,7 @@ internal fun Context.buildScreenNotificationBuilder( ) val showScreenIntent = - ScreenActivity.intent(this, timerId, timerItem.name, currentStepName) + ScreenActivity.intent(this, timerId, timerItem.name, currentStepName, imagePath) val pendingShowScreenIntent = pendingActivityIntent(showScreenIntent, timerId) // Full screen intent has flags so it is different than the content intent. diff --git a/app-timer-run/src/main/java/xyz/aprildown/timer/app/timer/run/screen/ScreenActivity.kt b/app-timer-run/src/main/java/xyz/aprildown/timer/app/timer/run/screen/ScreenActivity.kt index c77a4383..8b17ee06 100644 --- a/app-timer-run/src/main/java/xyz/aprildown/timer/app/timer/run/screen/ScreenActivity.kt +++ b/app-timer-run/src/main/java/xyz/aprildown/timer/app/timer/run/screen/ScreenActivity.kt @@ -6,6 +6,7 @@ import android.content.ComponentName import android.content.Context import android.content.Intent import android.content.ServiceConnection +import android.net.Uri import android.os.Build import android.os.Bundle import android.os.IBinder @@ -18,6 +19,7 @@ import androidx.core.view.WindowCompat import androidx.core.view.WindowInsetsCompat import androidx.core.view.updateLayoutParams import androidx.core.view.updatePadding +import com.bumptech.glide.Glide import com.github.deweyreed.tools.arch.observeEvent import com.github.deweyreed.tools.helper.startDrawableAnimation import com.github.deweyreed.tools.helper.stopDrawableAnimation @@ -30,6 +32,7 @@ import xyz.aprildown.timer.domain.entities.TimerEntity import xyz.aprildown.timer.domain.utils.Constants import xyz.aprildown.timer.presentation.screen.ScreenViewModel import xyz.aprildown.timer.presentation.stream.MachineContract +import java.io.File import com.github.deweyreed.tools.R as RTools @AndroidEntryPoint @@ -70,6 +73,17 @@ class ScreenActivity : BaseActivity() { } } + intent?.getStringExtra(EXTRA_IMAGE_PATH)?.let { imagePath -> + if (imagePath.isNotEmpty()) { + val image = File(imagePath) + if (image.extension == "gif") + Glide.with(this).asGif().load(Uri.parse(imagePath)).into(binding.image) + else + Glide.with(this).asBitmap().load(Uri.parse(imagePath)).into(binding.image) +// binding.image.setImageURI(Uri.parse(imagePath)) + } + } + viewModel.setTimerId( intent?.getIntExtra(Constants.EXTRA_TIMER_ID, TimerEntity.NULL_ID) ?: TimerEntity.NULL_ID @@ -162,13 +176,9 @@ class ScreenActivity : BaseActivity() { override fun onResume() { super.onResume() - binding.imageRingtone.post { - binding.imageRingtone.startDrawableAnimation() - } } override fun onPause() { - binding.imageRingtone.stopDrawableAnimation() super.onPause() } @@ -190,15 +200,17 @@ class ScreenActivity : BaseActivity() { companion object { private const val EXTRA_NAME = "extra_name" private const val EXTRA_STEP_NAME = "extra_step_name" + private const val EXTRA_IMAGE_PATH = "extra_image_path" @SuppressLint("StaticFieldLeak") var screen: Activity? = null - fun intent(context: Context, id: Int, timerName: String, stepName: String): Intent { + fun intent(context: Context, id: Int, timerName: String, stepName: String, imagePath: String): Intent { return Intent(context, ScreenActivity::class.java) .putExtra(Constants.EXTRA_TIMER_ID, id) .putExtra(EXTRA_NAME, timerName) .putExtra(EXTRA_STEP_NAME, stepName) + .putExtra(EXTRA_IMAGE_PATH, imagePath) } } } diff --git a/app-timer-run/src/main/res/layout-land/activity_screen.xml b/app-timer-run/src/main/res/layout-land/activity_screen.xml index d714d8eb..1f7ac23e 100644 --- a/app-timer-run/src/main/res/layout-land/activity_screen.xml +++ b/app-timer-run/src/main/res/layout-land/activity_screen.xml @@ -9,44 +9,35 @@ + android:scaleType="center" + app:layout_constraintEnd_toStartOf="@+id/btnStop" + app:layout_constraintStart_toEndOf="@+id/textStepInfo" + tools:layout_editor_absoluteY="21dp" />