Skip to content

Commit d44fead

Browse files
committed
Support trimming step duration by the music file
1 parent 77ff18a commit d44fead

File tree

10 files changed

+90
-44
lines changed

10 files changed

+90
-44
lines changed

app-base/src/main/res/values-zh-rCN/strings.xml

+1
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,7 @@
133133
<string name="music_loop">循环</string>
134134
<string name="music_saf_pick">SAF音乐选择</string>
135135
<string name="music_saf_pick_desp">如果你想在不授予权限的情况下挑选音乐,或者默认的铃声挑选器不显示你的音乐,启用此选项可能有帮助。</string>
136+
<string name="music_trim_step_duration">裁剪步骤时长</string>
136137
<string name="behaviour_vibration">振动</string>
137138
<string name="behaviour_vibration_help">在此步骤振动手机</string>
138139
<string name="vibration_count">次数</string>

app-base/src/main/res/values-zh-rHK/strings.xml

+1
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,7 @@
133133
<string name="music_loop">循環</string>
134134
<string name="music_saf_pick">SAF音樂選擇</string>
135135
<string name="music_saf_pick_desp">如果你想在不授予權限的情況下挑選音樂,或者默認的鈴聲挑選器不顯示你的音樂,啓用此選項可能有幫助。</string>
136+
<string name="music_trim_step_duration">裁剪步驟時長</string>
136137
<string name="behaviour_vibration">震動</string>
137138
<string name="behaviour_vibration_help">在此步驟震動手機</string>
138139
<string name="vibration_count">次數</string>

app-base/src/main/res/values-zh-rTW/strings.xml

+1
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,7 @@
133133
<string name="music_loop">循環</string>
134134
<string name="music_saf_pick">SAF音樂選擇</string>
135135
<string name="music_saf_pick_desp">如果你想在不授予許可權的情況下挑選音樂,或者預設的鈴聲挑選器不顯示你的音樂,啟用此選項可能有幫助。</string>
136+
<string name="music_trim_step_duration">裁剪步驟時長</string>
136137
<string name="behaviour_vibration">振動</string>
137138
<string name="behaviour_vibration_help">在此步驟振動手機</string>
138139
<string name="vibration_count">次數</string>

app-base/src/main/res/values/strings.xml

+1
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,7 @@
147147
<string name="music_loop">Loop</string>
148148
<string name="music_saf_pick">SAF Pick</string>
149149
<string name="music_saf_pick_desp">If you would like to pick music without granting permission, or the default ringtone picker doesn\'t show your music, enabling this option might help.</string>
150+
<string name="music_trim_step_duration">Trim step duration</string>
150151

151152
<string name="behaviour_vibration">Vibration</string>
152153
<string name="behaviour_vibration_help">Vibrate the phone at this step</string>

app-timer-edit/src/main/java/xyz/aprildown/timer/app/timer/edit/BehaviourSettingsView.kt

+27-1
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,13 @@ import com.github.zawadz88.materialpopupmenu.MaterialPopupMenuBuilder
1414
import xyz.aprildown.timer.app.base.data.PreferenceData.storedAudioFocusType
1515
import xyz.aprildown.timer.app.base.data.PreferenceData.storedAudioTypeValue
1616
import xyz.aprildown.timer.app.base.data.PreferenceData.useVoiceContent2
17+
import xyz.aprildown.timer.app.base.media.getMediaDuration
1718
import xyz.aprildown.timer.app.timer.edit.media.BeepDialog
1819
import xyz.aprildown.timer.app.timer.edit.media.HalfDialog
1920
import xyz.aprildown.timer.app.timer.edit.media.VibrationDialog
2021
import xyz.aprildown.timer.app.timer.edit.media.VoiceDialog
2122
import xyz.aprildown.timer.app.timer.edit.voice.VoiceVariableDialog
23+
import xyz.aprildown.timer.component.key.ListItem
2224
import xyz.aprildown.timer.component.key.SimpleInputDialog
2325
import xyz.aprildown.timer.component.key.switchItem
2426
import xyz.aprildown.timer.domain.entities.BeepAction
@@ -32,12 +34,14 @@ import xyz.aprildown.timer.domain.entities.VoiceAction
3234
import xyz.aprildown.timer.domain.utils.Constants
3335
import xyz.aprildown.tools.helper.safeSharedPreference
3436
import xyz.aprildown.timer.app.base.R as RBase
37+
import xyz.aprildown.timer.component.key.R as RComponent
3538

3639
internal fun MaterialPopupMenuBuilder.addMusicItems(
3740
context: Context,
3841
action: MusicAction,
3942
onPickMusicClick: () -> Unit,
40-
onLoopChanged: (Boolean) -> Unit
43+
onLoopChanged: (Boolean) -> Unit,
44+
onTrimStepDuration: (Long) -> Unit,
4145
) {
4246
section {
4347
item {
@@ -55,6 +59,28 @@ internal fun MaterialPopupMenuBuilder.addMusicItems(
5559
onLoopChanged.invoke(isChecked)
5660
}
5761
}
62+
customItem {
63+
layoutResId = RComponent.layout.layout_list_item
64+
val uri = action.uri.takeIf { it.isNotBlank() }?.toUri()
65+
viewBoundCallback = { view ->
66+
val listItem = view as ListItem
67+
listItem.setPrimaryText(RBase.string.music_trim_step_duration)
68+
listItem.isEnabled = uri != null
69+
}
70+
if (uri != null) {
71+
callback = {
72+
val duration = uri.getMediaDuration(context)
73+
var result = duration / 1000L * 1000L
74+
if (result < duration) {
75+
result += 1000L
76+
}
77+
if (duration >= 1000L) {
78+
onTrimStepDuration(duration)
79+
}
80+
}
81+
}
82+
dismissOnSelect = false
83+
}
5884
}
5985
}
6086

app-timer-edit/src/main/java/xyz/aprildown/timer/app/timer/edit/EditActivity.kt

+18-9
Original file line numberDiff line numberDiff line change
@@ -389,17 +389,23 @@ class EditActivity :
389389
hideKeyboard()
390390

391391
DurationPicker(this) { hours, minutes, seconds ->
392-
val time = (hours * 3600L + minutes * 60L + seconds) * 1000L
393-
val item = getStepFromFastAdapter(position)
394-
if (item.stepType == StepType.NOTIFIER) {
395-
viewModel.notifier = viewModel.notifier.copy(length = time)
396-
}
397-
item.length = time
398-
fastAdapter.notifyAdapterItemChanged(position, EditableStep.Event.Length)
399-
postUpdateTotalTime()
392+
updateStepLength(
393+
position = position,
394+
length = (hours * 3600L + minutes * 60L + seconds) * 1000L,
395+
)
400396
}.show()
401397
}
402398

399+
private fun updateStepLength(position: Int, length: Long) {
400+
val item = getStepFromFastAdapter(position)
401+
if (item.stepType == StepType.NOTIFIER) {
402+
viewModel.notifier = viewModel.notifier.copy(length = length)
403+
}
404+
item.length = length
405+
fastAdapter.notifyAdapterItemChanged(position, EditableStep.Event.Length)
406+
postUpdateTotalTime()
407+
}
408+
403409
override fun onAddBtnClick(view: View, position: Int) {
404410
hideKeyboard()
405411

@@ -666,7 +672,10 @@ class EditActivity :
666672
changeBehaviour(BehaviourType.MUSIC, position) {
667673
it.toMusicAction().copy(loop = isChecked).toBehaviourEntity()
668674
}
669-
}
675+
},
676+
onTrimStepDuration = { duration ->
677+
updateStepLength(position = position, length = duration)
678+
},
670679
)
671680
}
672681
BehaviourType.VIBRATION -> {

app-timer-edit/src/main/java/xyz/aprildown/timer/app/timer/edit/UpdateStepDialog.kt

+33-34
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,8 @@ import android.content.Intent
55
import android.net.Uri
66
import android.os.Bundle
77
import android.view.View
8-
import android.widget.EditText
98
import androidx.activity.result.PickVisualMediaRequest
109
import androidx.activity.result.contract.ActivityResultContracts
11-
import androidx.cardview.widget.CardView
1210
import androidx.core.net.toUri
1311
import androidx.core.widget.ImageViewCompat
1412
import androidx.fragment.app.DialogFragment
@@ -21,8 +19,9 @@ import xyz.aprildown.timer.app.base.data.PreferenceData.getTypeColor
2119
import xyz.aprildown.timer.app.base.ui.AppNavigator
2220
import xyz.aprildown.timer.app.base.ui.StepUpdater
2321
import xyz.aprildown.timer.app.base.utils.produceTime
22+
import xyz.aprildown.timer.app.timer.edit.databinding.DialogUpdateStepBinding
23+
import xyz.aprildown.timer.app.timer.edit.databinding.ItemEditStepBinding
2424
import xyz.aprildown.timer.component.key.DurationPicker
25-
import xyz.aprildown.timer.component.key.RoundTextView
2625
import xyz.aprildown.timer.component.key.behaviour.EditableBehaviourLayout
2726
import xyz.aprildown.timer.domain.entities.BehaviourEntity
2827
import xyz.aprildown.timer.domain.entities.BehaviourType
@@ -50,8 +49,7 @@ class UpdateStepDialog :
5049
@Inject
5150
lateinit var appNavigator: AppNavigator
5251

53-
private lateinit var editName: EditText
54-
private lateinit var behaviourLayout: EditableBehaviourLayout
52+
private lateinit var binding: ItemEditStepBinding
5553

5654
private var length = 0L
5755

@@ -75,64 +73,64 @@ class UpdateStepDialog :
7573

7674
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
7775
val context = requireContext()
78-
val view = View.inflate(context, R.layout.dialog_update_step, null)
76+
val dialogBinding = DialogUpdateStepBinding.inflate(layoutInflater)
77+
binding = dialogBinding.layoutStep
7978
val step = step
8079
val onUpdate = onUpdate
8180
if (step == null || onUpdate == null) {
8281
dismiss()
8382
return super.onCreateDialog(savedInstanceState)
8483
}
85-
view.setUpUpdateStepView(step)
84+
binding.setUpUpdateStepView(step)
8685
return MaterialAlertDialogBuilder(context)
8786
.setCancelable(false)
8887
.setTitle(RBase.string.edit_step)
8988
.setView(view)
9089
.setPositiveButton(android.R.string.ok) { _, _ ->
9190
onUpdate.invoke(
9291
StepEntity.Step(
93-
editName.text.toString(),
94-
length,
95-
behaviourLayout.getBehaviours(),
96-
step.type
92+
label = binding.editStepName.text.toString(),
93+
length = length,
94+
behaviour = binding.layoutBehaviour.getBehaviours(),
95+
type = step.type,
9796
)
9897
)
9998
}
10099
.setNegativeButton(android.R.string.cancel, null)
101100
.create()
102101
}
103102

104-
private fun View.setUpUpdateStepView(step: StepEntity.Step) {
105-
val context = context
103+
private fun ItemEditStepBinding.setUpUpdateStepView(step: StepEntity.Step) {
104+
val context = root.context
106105

107-
findViewById<CardView>(R.id.cardEditStep).cardElevation = 0f
106+
cardEditStep.cardElevation = 0f
108107

109108
val color = step.type.getTypeColor(context)
110-
ImageViewCompat.setImageTintList(findViewById(R.id.colorStep), color.toColorStateList())
111-
findViewById<View>(R.id.viewStepGroupIndicatorStart).gone()
112-
findViewById<View>(R.id.viewStepGroupIndicatorEnd).gone()
109+
ImageViewCompat.setImageTintList(colorStep, color.toColorStateList())
110+
viewStepGroupIndicatorStart.gone()
111+
viewStepGroupIndicatorEnd.gone()
113112

114-
editName = findViewById(R.id.editStepName)
115-
editName.setText(step.label)
113+
editStepName.setText(step.label)
114+
115+
textStepLength.setBgColor(color)
116116

117-
val lengthLabel = findViewById<RoundTextView>(R.id.textStepLength)
118-
lengthLabel.setBgColor(color)
119-
fun updateLength(length: Long) {
120-
lengthLabel.text = length.produceTime()
121-
this@UpdateStepDialog.length = length
122-
}
123117
updateLength(step.length)
124-
lengthLabel.setOnClickListener {
118+
textStepLength.setOnClickListener {
125119
DurationPicker(context) { hours, minutes, seconds ->
126120
updateLength((hours * 3600L + minutes * 60L + seconds) * 1000L)
127121
}.show()
128122
}
129123

130-
findViewById<View>(R.id.btnStepAdd).gone()
124+
btnStepAdd.gone()
125+
126+
layoutBehaviour.setEnabledColor(color)
127+
layoutBehaviour.setBehaviours(step.behaviour)
128+
layoutBehaviour.setListener(this@UpdateStepDialog)
129+
}
131130

132-
behaviourLayout = findViewById(R.id.layoutBehaviour)
133-
behaviourLayout.setEnabledColor(color)
134-
behaviourLayout.setBehaviours(step.behaviour)
135-
behaviourLayout.setListener(this@UpdateStepDialog)
131+
private fun updateLength(length: Long) {
132+
binding.textStepLength.text = length.produceTime()
133+
this@UpdateStepDialog.length = length
136134
}
137135

138136
override fun showBehaviourSettingsView(
@@ -177,7 +175,8 @@ class UpdateStepDialog :
177175
changeBehaviour(BehaviourType.MUSIC) {
178176
it.toMusicAction().copy(loop = isChecked).toBehaviourEntity()
179177
}
180-
}
178+
},
179+
onTrimStepDuration = ::updateLength,
181180
)
182181
}
183182
BehaviourType.VIBRATION -> {
@@ -318,7 +317,7 @@ class UpdateStepDialog :
318317
) {
319318
var found = false
320319
val newBehaviours = mutableListOf<BehaviourEntity>()
321-
behaviourLayout.getBehaviours().forEach {
320+
binding.layoutBehaviour.getBehaviours().forEach {
322321
if (it.type == type) {
323322
newBehaviours += transform.invoke(it)
324323
found = true
@@ -329,7 +328,7 @@ class UpdateStepDialog :
329328
if (!found) {
330329
newBehaviours += transform(BehaviourEntity(type))
331330
}
332-
behaviourLayout.setBehaviours(newBehaviours)
331+
binding.layoutBehaviour.setBehaviours(newBehaviours)
333332
}
334333

335334
companion object : StepUpdater {

app-timer-edit/src/main/res/layout/dialog_update_step.xml

+1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
android:layout_height="wrap_content">
55

66
<include
7+
android:id="@+id/layoutStep"
78
layout="@layout/item_edit_step"
89
android:layout_width="match_parent"
910
android:layout_height="wrap_content"

component-key/src/main/java/xyz/aprildown/timer/component/key/ListItem.kt

+6
Original file line numberDiff line numberDiff line change
@@ -85,4 +85,10 @@ class ListItem(
8585
minimumHeight = res.getDimensionPixelSize(R.dimen.list_item_two_lines_height)
8686
}
8787
}
88+
89+
override fun setEnabled(enabled: Boolean) {
90+
super.setEnabled(enabled)
91+
primaryTextView.isEnabled = enabled
92+
secondaryTextView.isEnabled = enabled
93+
}
8894
}

component-key/src/main/java/xyz/aprildown/timer/component/key/ListItemWithLayout.kt

+1
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ class ListItemWithLayout(
6767

6868
override fun setEnabled(enabled: Boolean) {
6969
super.setEnabled(enabled)
70+
listItem.isEnabled = enabled
7071
inflatedView?.isEnabled = enabled
7172
}
7273

0 commit comments

Comments
 (0)