diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 05f713d..6b57243 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -21,7 +21,7 @@ diff --git a/app/src/main/assets/bnb-resources/luts/C1.png b/app/src/main/assets/bnb-resources/luts/C1.png new file mode 100644 index 0000000..2154a9f Binary files /dev/null and b/app/src/main/assets/bnb-resources/luts/C1.png differ diff --git a/app/src/main/assets/bnb-resources/luts/C2.png b/app/src/main/assets/bnb-resources/luts/C2.png new file mode 100644 index 0000000..a8c7b97 Binary files /dev/null and b/app/src/main/assets/bnb-resources/luts/C2.png differ diff --git a/app/src/main/java/com/banuba/example/integrationapp/videoeditor/custom/CustomRecordingAnimationProvider.kt b/app/src/main/java/com/banuba/example/integrationapp/videoeditor/custom/CustomRecordingAnimationProvider.kt new file mode 100644 index 0000000..4cea266 --- /dev/null +++ b/app/src/main/java/com/banuba/example/integrationapp/videoeditor/custom/CustomRecordingAnimationProvider.kt @@ -0,0 +1,73 @@ +package com.banuba.example.integrationapp.videoeditor.custom + +import android.content.Context +import android.view.ViewGroup +import com.banuba.example.integrationapp.R +import com.banuba.example.integrationapp.videoeditor.custom.widget.CustomRecordingButtonView +import com.banuba.sdk.cameraui.data.CameraRecordingAnimationProvider +import com.banuba.sdk.core.ui.ext.dimenPx + +class CustomRecordingAnimationProvider (context: Context) : CameraRecordingAnimationProvider { + + private val animationView = CustomRecordingButtonView(context).apply { + val defaultButtonSize = context.dimenPx(R.dimen.record_button_size) + layoutParams = ViewGroup.LayoutParams(defaultButtonSize, defaultButtonSize) + isFocusable = true + isClickable = true + } + + private var onEndTakenPictureAnimationCallback: () -> Unit = {} + private var onStartRecordingAnimationCallback: () -> Unit = {} + private var onEndRecordingAnimationCallback: () -> Unit = {} + + override fun provideView() = animationView + + override fun setOnStartRecordingAnimationCallback(callback: () -> Unit) { + onStartRecordingAnimationCallback = callback + } + + override fun setOnEndRecordingAnimationCallback(callback: () -> Unit) { + onEndRecordingAnimationCallback = callback + } + + override fun setOnEndTakenPictureAnimationCallback(callback: () -> Unit) { + onEndTakenPictureAnimationCallback = callback + } + + override fun animatePauseRecording() { + animationView.pauseAnimation() + } + + override fun animateResumeRecording() { + animationView.resumeAnimation() + } + + override fun setRecordingPhotoState(state: CameraRecordingAnimationProvider.PhotoState) { + when (state) { + CameraRecordingAnimationProvider.PhotoState.Idle -> animationView.reset() + CameraRecordingAnimationProvider.PhotoState.Capture -> animationView.animateTakePhoto { + onEndTakenPictureAnimationCallback() + } + } + } + + override fun setRecordingVideoState(state: CameraRecordingAnimationProvider.VideoState) { + when (state) { + is CameraRecordingAnimationProvider.VideoState.Idle -> animationView.reset() + is CameraRecordingAnimationProvider.VideoState.StartRecord -> { + if (state.availableDurationMs <= 0) return + animationView.animateStartVideoRecord( + availableDurationMs = state.availableDurationMs, + maxDurationMs = state.maxDurationMs + ) { + onStartRecordingAnimationCallback() + } + } + is CameraRecordingAnimationProvider.VideoState.StopRecord -> { + animationView.animateStopVideoRecord { + onEndRecordingAnimationCallback() + } + } + } + } +} diff --git a/app/src/main/java/com/banuba/example/integrationapp/videoeditor/content/GlideImageLoader.kt b/app/src/main/java/com/banuba/example/integrationapp/videoeditor/custom/GlideImageLoader.kt similarity index 98% rename from app/src/main/java/com/banuba/example/integrationapp/videoeditor/content/GlideImageLoader.kt rename to app/src/main/java/com/banuba/example/integrationapp/videoeditor/custom/GlideImageLoader.kt index 1edfa76..bfab6bd 100644 --- a/app/src/main/java/com/banuba/example/integrationapp/videoeditor/content/GlideImageLoader.kt +++ b/app/src/main/java/com/banuba/example/integrationapp/videoeditor/custom/GlideImageLoader.kt @@ -1,4 +1,4 @@ -package com.banuba.example.integrationapp.videoeditor.content +package com.banuba.example.integrationapp.videoeditor.custom import android.app.Activity import android.content.Context diff --git a/app/src/main/java/com/banuba/example/integrationapp/videoeditor/custom/widget/CustomRecordingButtonOuterView.kt b/app/src/main/java/com/banuba/example/integrationapp/videoeditor/custom/widget/CustomRecordingButtonOuterView.kt new file mode 100644 index 0000000..bbd68ad --- /dev/null +++ b/app/src/main/java/com/banuba/example/integrationapp/videoeditor/custom/widget/CustomRecordingButtonOuterView.kt @@ -0,0 +1,124 @@ +package com.banuba.example.integrationapp.videoeditor.custom.widget + +import android.animation.ValueAnimator +import android.content.Context +import android.graphics.* +import android.util.AttributeSet +import android.view.View +import android.view.animation.LinearInterpolator +import com.banuba.example.integrationapp.R +import com.banuba.sdk.core.ui.ext.dimen + +class CustomRecordingButtonOuterView @JvmOverloads constructor( + context: Context, + attr: AttributeSet? = null, + defStyle: Int = 0 +) : View(context, attr, defStyle) { + + companion object { + private const val ANGLE_END = 360F + private const val ANGLE_START = 0F + private const val INIT_VIEW_ROTATION = -90F + } + + private var circleWidth = context.dimen(R.dimen.record_button_circle_idle_width) + set(value) { + field = value + gradientPaint.strokeWidth = value + whitePaint.strokeWidth = value + isDrawAreaMeasured = false + } + private val circleColors = context.resources.getIntArray(R.array.progress_gradient_colors) + private var circleDrawArea = RectF() + + private var isDrawAreaMeasured = false + + private val gradientPaint by lazy(LazyThreadSafetyMode.NONE) { + Paint().apply { + isAntiAlias = true + style = Paint.Style.STROKE + strokeWidth = circleWidth + shader = SweepGradient( + measuredWidth.toFloat() / 2, + measuredHeight.toFloat() / 2, + circleColors, + null + ) + } + } + private val whitePaint by lazy(LazyThreadSafetyMode.NONE) { + Paint().apply { + color = Color.WHITE + isAntiAlias = true + style = Paint.Style.STROKE + strokeWidth = circleWidth + } + } + + private var gradientSweepAngle = 0F + + private val animator = ValueAnimator().apply { + repeatCount = 0 + setFloatValues(ANGLE_START, ANGLE_END) + interpolator = LinearInterpolator() + addUpdateListener { + gradientSweepAngle = it.animatedValue as Float + invalidate() + } + } + + init { + // Because 0 degrees angle correspond to 3 o'clock on a watch + rotation = INIT_VIEW_ROTATION + } + + override fun onDraw(canvas: Canvas) { + if (!isDrawAreaMeasured) { + isDrawAreaMeasured = true + circleDrawArea = RectF( + 0f + circleWidth, + 0f + circleWidth, + measuredWidth.toFloat() - circleWidth, + measuredHeight.toFloat() - circleWidth + ) + } + with(canvas) { + save() + rotate(gradientSweepAngle, measuredWidth.toFloat() / 2, measuredHeight.toFloat() / 2) + drawArc(circleDrawArea, ANGLE_START, ANGLE_END, false, gradientPaint) + restore() + drawArc( + circleDrawArea, + gradientSweepAngle, + ANGLE_END - gradientSweepAngle, + false, + whitePaint + ) + } + } + + fun startAnimation( + availableDurationMs: Long, + maxDurationMs: Long + ) { + circleWidth = context.dimen(R.dimen.record_button_circle_progress_width) + animator.duration = maxDurationMs + animator.cancel() + animator.currentPlayTime = maxDurationMs - availableDurationMs + } + + fun stopAnimation() { + circleWidth = context.dimen(R.dimen.record_button_circle_idle_width) + animator.cancel() + gradientSweepAngle = 0F + invalidate() + } + + fun pauseAnimation() { + animator.pause() + } + + fun resumeAnimation() { + animator.start() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/banuba/example/integrationapp/videoeditor/custom/widget/CustomRecordingButtonView.kt b/app/src/main/java/com/banuba/example/integrationapp/videoeditor/custom/widget/CustomRecordingButtonView.kt new file mode 100644 index 0000000..73d2f06 --- /dev/null +++ b/app/src/main/java/com/banuba/example/integrationapp/videoeditor/custom/widget/CustomRecordingButtonView.kt @@ -0,0 +1,196 @@ +package com.banuba.example.integrationapp.videoeditor.custom.widget + +import android.animation.AnimatorSet +import android.animation.ObjectAnimator +import android.animation.PropertyValuesHolder +import android.animation.ValueAnimator +import android.content.Context +import android.util.AttributeSet +import android.view.Gravity +import android.view.View +import android.view.animation.LinearInterpolator +import android.widget.FrameLayout +import androidx.core.animation.doOnEnd +import com.banuba.example.integrationapp.R +import com.banuba.sdk.core.ui.ext.dimenPx +import com.banuba.sdk.veui.ui.widget.animator.ReverseInterpolator + +class CustomRecordingButtonView @JvmOverloads constructor( + context: Context, + attributeSet: AttributeSet? = null, + defStyleAttrs: Int = 0 +) : FrameLayout(context, attributeSet, defStyleAttrs) { + + companion object { + + private const val DEFAULT_DURATION_MS = 300L + private const val FINISH_RECORD_DELAY = 200L + + private const val PHOTO_SHOOT_ANIMATION_SCALE_START = 1F + private const val PHOTO_SHOOT_ANIMATION_SCALE_END = 0.875F + + private const val VIDEO_SHOOT_INNER_ANIMATION_SCALE_START = 1F + private const val VIDEO_SHOOT_INNER_ANIMATION_SCALE_END = 0F + + private const val VIDEO_SHOOT_INNER_ANIMATION_REPEAT_COUNT = 0 + + private const val PHOTO_SHOOT_OUTER_ANIMATION_START = 1F + private const val PHOTO_SHOOT_OUTER_ANIMATION_END = 1.5F + } + + private val outerPart = CustomRecordingButtonOuterView(context) + + private val innerOvalPart = View(context).apply { + setBackgroundResource(R.drawable.bg_record_button_inner_oval) + elevation = context.dimenPx(R.dimen.record_button_elevation).toFloat() + } + private val innerSquarePart = View(context).apply { + val size = context.dimenPx(R.dimen.record_button_inner_part_size) + layoutParams = LayoutParams(size, size).apply { + gravity = Gravity.CENTER + } + setBackgroundResource(R.drawable.bg_record_button_inner_square) + elevation = context.dimenPx(R.dimen.record_button_elevation).toFloat() + } + + private val photoShootAnimation = ObjectAnimator.ofPropertyValuesHolder( + innerOvalPart, + PropertyValuesHolder.ofFloat( + "scaleX", + PHOTO_SHOOT_ANIMATION_SCALE_START, + PHOTO_SHOOT_ANIMATION_SCALE_END + ), + PropertyValuesHolder.ofFloat( + "scaleY", + PHOTO_SHOOT_ANIMATION_SCALE_START, + PHOTO_SHOOT_ANIMATION_SCALE_END + ) + ).apply { + duration = DEFAULT_DURATION_MS + repeatCount = 1 + repeatMode = ValueAnimator.REVERSE + } + + private val videoShootInnerAnimation = AnimatorSet().apply { + val ovalAnim = ObjectAnimator.ofPropertyValuesHolder( + innerOvalPart, + PropertyValuesHolder.ofFloat( + "scaleX", + VIDEO_SHOOT_INNER_ANIMATION_SCALE_START, + VIDEO_SHOOT_INNER_ANIMATION_SCALE_END + ), + PropertyValuesHolder.ofFloat( + "scaleY", + VIDEO_SHOOT_INNER_ANIMATION_SCALE_START, + VIDEO_SHOOT_INNER_ANIMATION_SCALE_END + ) + ).apply { + duration = DEFAULT_DURATION_MS + repeatCount = VIDEO_SHOOT_INNER_ANIMATION_REPEAT_COUNT + } + val squareAnim = ObjectAnimator.ofPropertyValuesHolder( + innerSquarePart, + PropertyValuesHolder.ofFloat( + "scaleX", + VIDEO_SHOOT_INNER_ANIMATION_SCALE_END, + VIDEO_SHOOT_INNER_ANIMATION_SCALE_START + ), + PropertyValuesHolder.ofFloat( + "scaleY", + VIDEO_SHOOT_INNER_ANIMATION_SCALE_END, + VIDEO_SHOOT_INNER_ANIMATION_SCALE_START + ) + ).apply { + duration = DEFAULT_DURATION_MS + repeatCount = VIDEO_SHOOT_INNER_ANIMATION_REPEAT_COUNT + } + playTogether(ovalAnim, squareAnim) + } + private val videoShootOuterAnimation = AnimatorSet().apply { + val circleAnim = ObjectAnimator.ofPropertyValuesHolder( + outerPart, + PropertyValuesHolder.ofFloat( + "scaleX", + PHOTO_SHOOT_OUTER_ANIMATION_START, + PHOTO_SHOOT_OUTER_ANIMATION_END + ), + PropertyValuesHolder.ofFloat( + "scaleY", + PHOTO_SHOOT_OUTER_ANIMATION_START, + PHOTO_SHOOT_OUTER_ANIMATION_END + ) + ).apply { + duration = DEFAULT_DURATION_MS + repeatCount = 0 + } + playTogether(circleAnim) + } + + init { + val outerPartSize = context.dimenPx(R.dimen.record_button_progress_size) + addView(outerPart, LayoutParams(outerPartSize, outerPartSize).apply { + gravity = Gravity.CENTER + }) + addView(innerSquarePart) + addView(innerOvalPart) + } + + fun reset() { + photoShootAnimation.cancel() + videoShootInnerAnimation.cancel() + } + + fun animateTakePhoto(onEndCallback: () -> Unit) { + with(photoShootAnimation) { + doOnEnd { onEndCallback() } + start() + } + } + + fun animateStartVideoRecord( + availableDurationMs: Long, + maxDurationMs: Long, + onEndCallback: () -> Unit + ) { + outerPart.startAnimation( + availableDurationMs = availableDurationMs, + maxDurationMs = maxDurationMs + ) + with(videoShootInnerAnimation) { + interpolator = LinearInterpolator() + removeAllListeners() + doOnEnd { onEndCallback() } + start() + } + with(videoShootOuterAnimation) { + interpolator = LinearInterpolator() + start() + } + } + + fun animateStopVideoRecord(onEndCallback: () -> Unit) { + outerPart.stopAnimation() + with(videoShootInnerAnimation) { + interpolator = ReverseInterpolator() + removeAllListeners() + doOnEnd { + postDelayed({ + onEndCallback() + }, FINISH_RECORD_DELAY) + } + start() + } + with(videoShootOuterAnimation) { + interpolator = ReverseInterpolator() + start() + } + } + + fun pauseAnimation() { + outerPart.pauseAnimation() + } + + fun resumeAnimation() { + outerPart.resumeAnimation() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/banuba/example/integrationapp/videoeditor/di/VideoeditorKoinModule.kt b/app/src/main/java/com/banuba/example/integrationapp/videoeditor/di/VideoeditorKoinModule.kt index d0355ad..2b37822 100644 --- a/app/src/main/java/com/banuba/example/integrationapp/videoeditor/di/VideoeditorKoinModule.kt +++ b/app/src/main/java/com/banuba/example/integrationapp/videoeditor/di/VideoeditorKoinModule.kt @@ -6,9 +6,11 @@ import android.view.View import androidx.fragment.app.Fragment import com.banuba.android.sdk.camera.BanubaCameraSdkManager import com.banuba.android.sdk.camera.CameraSdkManager -import com.banuba.example.integrationapp.videoeditor.content.GlideImageLoader +import com.banuba.example.integrationapp.videoeditor.custom.CustomRecordingAnimationProvider +import com.banuba.example.integrationapp.videoeditor.custom.GlideImageLoader import com.banuba.example.integrationapp.videoeditor.export.IntegrationAppExportFlowManager import com.banuba.example.integrationapp.videoeditor.export.IntegrationAppExportResultHandler +import com.banuba.sdk.cameraui.data.CameraRecordingAnimationProvider import com.banuba.sdk.core.AREffectPlayerProvider import com.banuba.sdk.core.IUtilityManager import com.banuba.sdk.core.domain.ImageLoader @@ -77,4 +79,12 @@ class VideoeditorKoinModule : FlowEditorModule() { } } + /** + * Override it to customize recording button view and setup custom animation to it + */ + override val cameraRecordingAnimationProvider: BeanDefinition = + factory(override = true) { + CustomRecordingAnimationProvider(context = get()) + } + } \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_alert_negative_button.xml b/app/src/main/res/drawable/bg_alert_negative_button.xml new file mode 100644 index 0000000..71bf16e --- /dev/null +++ b/app/src/main/res/drawable/bg_alert_negative_button.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_alert_positive_button.xml b/app/src/main/res/drawable/bg_alert_positive_button.xml new file mode 100644 index 0000000..4b6bb16 --- /dev/null +++ b/app/src/main/res/drawable/bg_alert_positive_button.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_btn_next.xml b/app/src/main/res/drawable/bg_btn_next.xml new file mode 100644 index 0000000..7c10310 --- /dev/null +++ b/app/src/main/res/drawable/bg_btn_next.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_effect_normal.xml b/app/src/main/res/drawable/bg_effect_normal.xml new file mode 100644 index 0000000..00043ac --- /dev/null +++ b/app/src/main/res/drawable/bg_effect_normal.xml @@ -0,0 +1,19 @@ + + + + + diff --git a/app/src/main/res/drawable/bg_gallery_button.xml b/app/src/main/res/drawable/bg_gallery_button.xml new file mode 100644 index 0000000..e02e414 --- /dev/null +++ b/app/src/main/res/drawable/bg_gallery_button.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_progress_view.xml b/app/src/main/res/drawable/bg_progress_view.xml new file mode 100644 index 0000000..395b6d4 --- /dev/null +++ b/app/src/main/res/drawable/bg_progress_view.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_record_button_inner_oval.xml b/app/src/main/res/drawable/bg_record_button_inner_oval.xml new file mode 100644 index 0000000..e9e973e --- /dev/null +++ b/app/src/main/res/drawable/bg_record_button_inner_oval.xml @@ -0,0 +1,11 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_record_button_inner_square.xml b/app/src/main/res/drawable/bg_record_button_inner_square.xml new file mode 100644 index 0000000..5694fe0 --- /dev/null +++ b/app/src/main/res/drawable/bg_record_button_inner_square.xml @@ -0,0 +1,9 @@ + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_speed_option_item.xml b/app/src/main/res/drawable/bg_speed_option_item.xml new file mode 100644 index 0000000..e6a33a1 --- /dev/null +++ b/app/src/main/res/drawable/bg_speed_option_item.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_toast.xml b/app/src/main/res/drawable/bg_toast.xml new file mode 100644 index 0000000..1a13d15 --- /dev/null +++ b/app/src/main/res/drawable/bg_toast.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/c1.png b/app/src/main/res/drawable/c1.png new file mode 100644 index 0000000..5dfc82a Binary files /dev/null and b/app/src/main/res/drawable/c1.png differ diff --git a/app/src/main/res/drawable/c2.png b/app/src/main/res/drawable/c2.png new file mode 100644 index 0000000..f8b0240 Binary files /dev/null and b/app/src/main/res/drawable/c2.png differ diff --git a/app/src/main/res/drawable/ic_audio.xml b/app/src/main/res/drawable/ic_audio.xml new file mode 100644 index 0000000..5183e19 --- /dev/null +++ b/app/src/main/res/drawable/ic_audio.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_audio_on.xml b/app/src/main/res/drawable/ic_audio_on.xml new file mode 100644 index 0000000..5988b8a --- /dev/null +++ b/app/src/main/res/drawable/ic_audio_on.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_beauty.xml b/app/src/main/res/drawable/ic_beauty.xml new file mode 100644 index 0000000..4085e23 --- /dev/null +++ b/app/src/main/res/drawable/ic_beauty.xml @@ -0,0 +1,27 @@ + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_beauty_on.xml b/app/src/main/res/drawable/ic_beauty_on.xml new file mode 100644 index 0000000..c22bfaf --- /dev/null +++ b/app/src/main/res/drawable/ic_beauty_on.xml @@ -0,0 +1,27 @@ + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_cam_back.xml b/app/src/main/res/drawable/ic_cam_back.xml new file mode 100644 index 0000000..2ade0de --- /dev/null +++ b/app/src/main/res/drawable/ic_cam_back.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_cam_front.xml b/app/src/main/res/drawable/ic_cam_front.xml new file mode 100644 index 0000000..3e6963d --- /dev/null +++ b/app/src/main/res/drawable/ic_cam_front.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_delete_videopart.xml b/app/src/main/res/drawable/ic_delete_videopart.xml new file mode 100644 index 0000000..34de4b4 --- /dev/null +++ b/app/src/main/res/drawable/ic_delete_videopart.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_filters.xml b/app/src/main/res/drawable/ic_filters.xml new file mode 100644 index 0000000..345b2ac --- /dev/null +++ b/app/src/main/res/drawable/ic_filters.xml @@ -0,0 +1,13 @@ + + + + diff --git a/app/src/main/res/drawable/ic_filters_on.xml b/app/src/main/res/drawable/ic_filters_on.xml new file mode 100644 index 0000000..1650482 --- /dev/null +++ b/app/src/main/res/drawable/ic_filters_on.xml @@ -0,0 +1,13 @@ + + + + diff --git a/app/src/main/res/drawable/ic_flash.xml b/app/src/main/res/drawable/ic_flash.xml new file mode 100644 index 0000000..8e0de77 --- /dev/null +++ b/app/src/main/res/drawable/ic_flash.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_flash_on.xml b/app/src/main/res/drawable/ic_flash_on.xml new file mode 100644 index 0000000..64a3233 --- /dev/null +++ b/app/src/main/res/drawable/ic_flash_on.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_masks.xml b/app/src/main/res/drawable/ic_masks.xml new file mode 100644 index 0000000..bd984b6 --- /dev/null +++ b/app/src/main/res/drawable/ic_masks.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_masks_on.xml b/app/src/main/res/drawable/ic_masks_on.xml new file mode 100644 index 0000000..68722a3 --- /dev/null +++ b/app/src/main/res/drawable/ic_masks_on.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_mic.xml b/app/src/main/res/drawable/ic_mic.xml new file mode 100644 index 0000000..39220f4 --- /dev/null +++ b/app/src/main/res/drawable/ic_mic.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_mic_off.xml b/app/src/main/res/drawable/ic_mic_off.xml new file mode 100644 index 0000000..8a4bdca --- /dev/null +++ b/app/src/main/res/drawable/ic_mic_off.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_nav_back_arrow.xml b/app/src/main/res/drawable/ic_nav_back_arrow.xml new file mode 100644 index 0000000..8c65f64 --- /dev/null +++ b/app/src/main/res/drawable/ic_nav_back_arrow.xml @@ -0,0 +1,13 @@ + + + + diff --git a/app/src/main/res/drawable/ic_nav_close.xml b/app/src/main/res/drawable/ic_nav_close.xml new file mode 100644 index 0000000..7d0549f --- /dev/null +++ b/app/src/main/res/drawable/ic_nav_close.xml @@ -0,0 +1,13 @@ + + + + diff --git a/app/src/main/res/drawable/ic_speed_0_5x.xml b/app/src/main/res/drawable/ic_speed_0_5x.xml new file mode 100644 index 0000000..495cfa4 --- /dev/null +++ b/app/src/main/res/drawable/ic_speed_0_5x.xml @@ -0,0 +1,21 @@ + + + + + + + diff --git a/app/src/main/res/drawable/ic_speed_1x.xml b/app/src/main/res/drawable/ic_speed_1x.xml new file mode 100644 index 0000000..f64e029 --- /dev/null +++ b/app/src/main/res/drawable/ic_speed_1x.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_speed_2x.xml b/app/src/main/res/drawable/ic_speed_2x.xml new file mode 100644 index 0000000..810d145 --- /dev/null +++ b/app/src/main/res/drawable/ic_speed_2x.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_speed_3x.xml b/app/src/main/res/drawable/ic_speed_3x.xml new file mode 100644 index 0000000..bb3e10d --- /dev/null +++ b/app/src/main/res/drawable/ic_speed_3x.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_stopwatch_off.xml b/app/src/main/res/drawable/ic_stopwatch_off.xml new file mode 100644 index 0000000..84b8f8f --- /dev/null +++ b/app/src/main/res/drawable/ic_stopwatch_off.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_stopwatch_on.xml b/app/src/main/res/drawable/ic_stopwatch_on.xml new file mode 100644 index 0000000..2fe3de9 --- /dev/null +++ b/app/src/main/res/drawable/ic_stopwatch_on.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/layout/fragment_dialog_alert.xml b/app/src/main/res/layout/fragment_dialog_alert.xml new file mode 100644 index 0000000..00345a7 --- /dev/null +++ b/app/src/main/res/layout/fragment_dialog_alert.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values-night/themes.xml b/app/src/main/res/values-night/themes.xml deleted file mode 100644 index 8ccbad5..0000000 --- a/app/src/main/res/values-night/themes.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - \ No newline at end of file diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index f8c6127..18b2f75 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -1,10 +1,18 @@ - #FFBB86FC - #FF6200EE - #FF3700B3 - #FF03DAC5 - #FF018786 #FF000000 #FFFFFFFF + + + #06BCC1 + #6606BCC1 + #12263A + #FA3E76 + #E3E9F1 + + + @color/egg_blue + @color/white + @color/egg_blue + \ No newline at end of file diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml new file mode 100644 index 0000000..55f160e --- /dev/null +++ b/app/src/main/res/values/dimens.xml @@ -0,0 +1,10 @@ + + + + + 96dp + 40dp + 82dp + 3dp + 5dp + \ No newline at end of file diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml index c70998f..6c8dee3 100644 --- a/app/src/main/res/values/themes.xml +++ b/app/src/main/res/values/themes.xml @@ -1,16 +1,250 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file