diff --git a/app/src/main/java/org/futo/circles/feature/timeline/InternalLinkMovementMethod.kt b/app/src/main/java/org/futo/circles/feature/timeline/InternalLinkMovementMethod.kt new file mode 100644 index 0000000000000000000000000000000000000000..6392c6c69fb2ea6e830e34e352cb0e1cd73c7f49 --- /dev/null +++ b/app/src/main/java/org/futo/circles/feature/timeline/InternalLinkMovementMethod.kt @@ -0,0 +1,46 @@ +package org.futo.circles.feature.timeline + +import android.text.Spannable +import android.text.method.LinkMovementMethod +import android.text.style.URLSpan +import android.util.Patterns +import android.view.MotionEvent +import android.widget.TextView +import org.futo.circles.feature.timeline.list.OnLinkClickedListener +import org.matrix.android.sdk.api.extensions.tryOrNull + +class InternalLinkMovementMethod(private val onLinkClickedListener: OnLinkClickedListener) : + LinkMovementMethod() { + override fun onTouchEvent(widget: TextView, buffer: Spannable, event: MotionEvent): Boolean { + val action = event.action + + if (action == MotionEvent.ACTION_UP) { + var x = event.x.toInt() + var y = event.y.toInt() + x -= widget.totalPaddingLeft + y -= widget.totalPaddingTop + x += widget.scrollX + y += widget.scrollY + val layout = widget.layout + val line = layout.getLineForVertical(y) + val off = layout.getOffsetForHorizontal(line, x.toFloat()) + val link = buffer.getSpans(off, off, URLSpan::class.java) + + link.getOrNull(0)?.let { span -> + val spanStart = buffer.getSpanStart(span) + val spanEnd = buffer.getSpanEnd(span) + val message = tryOrNull { buffer.subSequence(spanStart, spanEnd).toString() } + val url = span.url + return if (message != url && !url.startsWith("tel")) { + onLinkClickedListener.onLinkClicked(url) + true + } else { + super.onTouchEvent(widget, buffer, event) + } + + } + } + return super.onTouchEvent(widget, buffer, event) + } +} + diff --git a/app/src/main/java/org/futo/circles/feature/timeline/list/OnLinkClickedListener.kt b/app/src/main/java/org/futo/circles/feature/timeline/list/OnLinkClickedListener.kt new file mode 100644 index 0000000000000000000000000000000000000000..79507c5732303e1408a512b35a82ced10250f143 --- /dev/null +++ b/app/src/main/java/org/futo/circles/feature/timeline/list/OnLinkClickedListener.kt @@ -0,0 +1,6 @@ +package org.futo.circles.feature.timeline.list + + +interface OnLinkClickedListener { + fun onLinkClicked(url: String) +} \ No newline at end of file diff --git a/app/src/main/java/org/futo/circles/feature/timeline/list/TimelineViewHolder.kt b/app/src/main/java/org/futo/circles/feature/timeline/list/TimelineViewHolder.kt index 699b0b1d8bae49b3f9f3db832e4276097c46ba42..fd2366a96746e65a7cb701a4e0ae2531dac2a95f 100644 --- a/app/src/main/java/org/futo/circles/feature/timeline/list/TimelineViewHolder.kt +++ b/app/src/main/java/org/futo/circles/feature/timeline/list/TimelineViewHolder.kt @@ -1,13 +1,17 @@ package org.futo.circles.feature.timeline.list import android.annotation.SuppressLint -import android.text.method.LinkMovementMethod +import android.content.Context +import android.content.Intent +import android.net.Uri import android.view.MotionEvent import android.view.View import android.view.ViewGroup import android.widget.TextView import androidx.core.view.updateLayoutParams import androidx.recyclerview.widget.RecyclerView +import com.google.android.material.dialog.MaterialAlertDialogBuilder +import org.futo.circles.R import org.futo.circles.core.base.list.ViewBindingHolder import org.futo.circles.core.extensions.gone import org.futo.circles.core.extensions.loadEncryptedThumbOrFullIntoWithAspect @@ -20,9 +24,11 @@ import org.futo.circles.core.model.Post import org.futo.circles.core.model.TextContent import org.futo.circles.databinding.ViewPollPostBinding import org.futo.circles.databinding.ViewTextMediaPostBinding -import org.futo.circles.model.* +import org.futo.circles.feature.timeline.InternalLinkMovementMethod +import org.futo.circles.model.PostItemPayload import org.futo.circles.view.PostLayout import org.futo.circles.view.PostOptionsListener +import org.matrix.android.sdk.api.extensions.tryOrNull sealed class PostViewHolder(view: View, private val isThread: Boolean) : @@ -60,7 +66,11 @@ class TextMediaPostViewHolder( @SuppressLint("ClickableViewAccessibility") private fun handleTextClick() { binding.tvTextContent.apply { - movementMethod = LinkMovementMethod.getInstance() + movementMethod = InternalLinkMovementMethod(object : OnLinkClickedListener { + override fun onLinkClicked(url: String) { + showLinkConfirmation(context, url) + } + }) setOnTouchListener { v, event -> if (event.action == MotionEvent.ACTION_DOWN) v.requestFocus() false @@ -68,6 +78,22 @@ class TextMediaPostViewHolder( } } + private fun showLinkConfirmation(context: Context, url: String) { + MaterialAlertDialogBuilder(context) + .setTitle(R.string.do_you_want_to_open_this_url) + .setMessage(url) + .setPositiveButton(android.R.string.ok) { dialogInterface, _ -> + tryOrNull { + context.startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(url))) + } + dialogInterface.dismiss() + } + .setNegativeButton(android.R.string.cancel) { dialogInterface, _ -> + dialogInterface.dismiss() + } + .show() + } + override fun bind(post: Post, userPowerLevel: Int) { super.bind(post, userPowerLevel) binding.vLoadingView.gone() diff --git a/app/src/main/java/org/futo/circles/feature/timeline/post/create/CreatePostDialogFragment.kt b/app/src/main/java/org/futo/circles/feature/timeline/post/create/CreatePostDialogFragment.kt index 37b629d3aaeda0588c4623ce8598d9d707f9e43d..c333babbd9e0e75299e7a082673372b0eab7343f 100644 --- a/app/src/main/java/org/futo/circles/feature/timeline/post/create/CreatePostDialogFragment.kt +++ b/app/src/main/java/org/futo/circles/feature/timeline/post/create/CreatePostDialogFragment.kt @@ -1,17 +1,24 @@ package org.futo.circles.feature.timeline.post.create +import android.app.Dialog import android.content.Context +import android.content.DialogInterface +import android.graphics.Color import android.net.Uri import android.os.Bundle +import android.view.LayoutInflater import android.view.View +import android.view.ViewGroup import android.view.WindowManager import androidx.fragment.app.viewModels import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.navArgs +import com.google.android.material.bottomsheet.BottomSheetBehavior +import com.google.android.material.bottomsheet.BottomSheetDialog +import com.google.android.material.bottomsheet.BottomSheetDialogFragment import dagger.hilt.android.AndroidEntryPoint import org.futo.circles.R import org.futo.circles.core.base.NetworkObserver -import org.futo.circles.core.base.fragment.BaseFullscreenDialogFragment import org.futo.circles.core.extensions.navigateSafe import org.futo.circles.core.extensions.observeData import org.futo.circles.core.extensions.showError @@ -23,17 +30,13 @@ import org.futo.circles.core.model.TextContent import org.futo.circles.databinding.DialogFragmentCreatePostBinding import org.futo.circles.feature.timeline.post.emoji.EmojiPickerListener import org.futo.circles.model.CreatePostContent -import java.util.* @AndroidEntryPoint -class CreatePostDialogFragment : - BaseFullscreenDialogFragment(DialogFragmentCreatePostBinding::inflate), - PreviewPostListener, EmojiPickerListener { +class CreatePostDialogFragment : BottomSheetDialogFragment(), PreviewPostListener, + EmojiPickerListener { + private var binding: DialogFragmentCreatePostBinding? = null private val args: CreatePostDialogFragmentArgs by navArgs() - private val binding by lazy { - getBinding() as DialogFragmentCreatePostBinding - } private val viewModel by viewModels<CreatePostViewModel>() private val mediaPickerHelper = MediaPickerHelper(this, isVideoAvailable = true) @@ -45,6 +48,40 @@ class CreatePostDialogFragment : parentFragmentManager.fragments.lastOrNull { it is CreatePostListener } as? CreatePostListener } + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? + ): View? { + binding = DialogFragmentCreatePostBinding.inflate(inflater, container, false) + return binding?.root + } + + override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { + val dialog = super.onCreateDialog(savedInstanceState) as BottomSheetDialog + dialog.setOnShowListener { setupBottomSheet(it) } + return dialog + } + + private fun setupBottomSheet(dialogInterface: DialogInterface) { + val bottomSheetDialog = dialogInterface as BottomSheetDialog + val bottomSheet = bottomSheetDialog.findViewById<View>( + com.google.android.material.R.id.design_bottom_sheet + ) ?: return + bottomSheet.setBackgroundColor(Color.TRANSPARENT) + bottomSheet.layoutParams.height = ViewGroup.LayoutParams.MATCH_PARENT + BottomSheetBehavior.from(bottomSheet).apply { + peekHeight = resources.displayMetrics.heightPixels + state = BottomSheetBehavior.STATE_EXPANDED + addBottomSheetCallback(object : BottomSheetBehavior.BottomSheetCallback() { + override fun onStateChanged(bottomSheet: View, newState: Int) { + if (newState == BottomSheetBehavior.STATE_HALF_EXPANDED) dismiss() + } + + override fun onSlide(bottomSheet: View, slideOffset: Float) {} + + }) + } + } + @Suppress("DEPRECATION") override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) @@ -55,31 +92,30 @@ class CreatePostDialogFragment : private fun setupViews() { setToolbarTitle() - with(binding) { - vPostPreview.setup(this@CreatePostDialogFragment, args.roomId, args.isEdit) - } + binding?.btnClose?.setOnClickListener { dismiss() } + binding?.vPostPreview?.setup(this@CreatePostDialogFragment, args.roomId, args.isEdit) } private fun setupObservers() { viewModel.postToEditContentLiveData.observeData(this) { when (it.type) { PostContentType.IMAGE_CONTENT, PostContentType.VIDEO_CONTENT -> - binding.vPostPreview.setMediaFromExistingPost(it as MediaContent) + binding?.vPostPreview?.setMediaFromExistingPost(it as MediaContent) - else -> binding.vPostPreview.setText((it as TextContent).message) + else -> binding?.vPostPreview?.setText((it as TextContent).message) } } } private fun setToolbarTitle() { - binding.toolbar.title = when { + binding?.tvTitle?.text = when { args.isEdit -> getString(R.string.edit_post) else -> getString(R.string.create_post) } } private fun onMediaSelected(uri: Uri, type: MediaType) { - binding.vPostPreview.setMedia(uri, type) + binding?.vPostPreview?.setMedia(uri, type) } private fun sendPost(content: CreatePostContent) { @@ -109,7 +145,7 @@ class CreatePostDialogFragment : override fun onAddLinkClicked() { AddLinkDialog(requireContext()) { title, link -> - binding.vPostPreview.insertLink(title, link) + binding?.vPostPreview?.insertLink(title, link) }.show() } @@ -123,6 +159,11 @@ class CreatePostDialogFragment : } override fun onEmojiSelected(roomId: String?, eventId: String?, emoji: String) { - binding.vPostPreview.insertEmoji(emoji) + binding?.vPostPreview?.insertEmoji(emoji) + } + + override fun onDestroyView() { + super.onDestroyView() + binding = null } } \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_fragment_create_post.xml b/app/src/main/res/layout/dialog_fragment_create_post.xml index ac9ce83e80201a992489b57dc0f8e32cbc3ba6c5..f3c76d3a8f4cc348d95b94b21691390c67a07dc7 100644 --- a/app/src/main/res/layout/dialog_fragment_create_post.xml +++ b/app/src/main/res/layout/dialog_fragment_create_post.xml @@ -1,52 +1,60 @@ <?xml version="1.0" encoding="utf-8"?> -<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" + android:background="@drawable/bg_top_rounded_corners" android:orientation="vertical"> - <com.google.android.material.appbar.MaterialToolbar - android:id="@+id/toolbar" - android:layout_width="0dp" - android:layout_height="?attr/actionBarSize" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toTopOf="parent" - app:navigationIcon="?attr/homeAsUpIndicator" - app:title="@string/create_post" - app:titleCentered="true" /> + <View + android:id="@+id/vTopLine" + android:layout_width="48dp" + android:layout_height="2dp" + android:layout_gravity="center" + android:layout_marginTop="4dp" + android:background="@color/divider_color" /> + + <FrameLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:orientation="horizontal"> + + <TextView + android:id="@+id/tvTitle" + style="@style/title2" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="center" + android:text="@string/create_post" /> + + <ImageButton + android:id="@+id/btnClose" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="end|center" + android:background="?selectableItemBackgroundBorderless" + android:padding="6dp" + android:src="@drawable/ic_close" /> + + </FrameLayout> + <View android:id="@+id/divider" - android:layout_width="0dp" + android:layout_width="match_parent" android:layout_height="@dimen/divider_height" - android:background="@color/divider_color" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@id/toolbar" /> + android:layout_marginTop="4dp" + android:background="@color/divider_color" /> + - <androidx.constraintlayout.widget.ConstraintLayout + <org.futo.circles.view.PreviewPostView + android:id="@+id/vPostPreview" android:layout_width="match_parent" - android:layout_height="0dp" - android:clipChildren="false" - android:clipToPadding="false" - android:orientation="vertical" + android:layout_height="match_parent" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@id/divider"> - - <org.futo.circles.view.PreviewPostView - android:id="@+id/vPostPreview" - android:layout_width="match_parent" - android:layout_height="0dp" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toTopOf="parent" /> - - - </androidx.constraintlayout.widget.ConstraintLayout> + app:layout_constraintTop_toBottomOf="@id/divider" /> -</androidx.constraintlayout.widget.ConstraintLayout> \ No newline at end of file +</LinearLayout> \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 4e073536a5f31ded2d8192ba00c8317dd78f5720..6671828e677883d1c4e0a2af91ad4427954b89fb 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -60,6 +60,7 @@ <string name="request_to_follow">Request to follow</string> <string name="select_circles_in_which_you_want_to_follow_this_timeline">Select circles in which you want to follow this timeline</string> <string name="accept_invite">Accept invite</string> + <string name="do_you_want_to_open_this_url">Do you want to open this url?</string> <string name="save_to_device">Save to device</string> <string name="save_to_gallery">Save to gallery</string> <string name="notifications">Notifications</string> diff --git a/core/build.gradle b/core/build.gradle index c57fdb924f37507989c23897316d10e0496200fb..0847aa87598b3631bc84606b763ff472b1c205ab 100644 --- a/core/build.gradle +++ b/core/build.gradle @@ -112,7 +112,7 @@ dependencies { api "io.noties.markwon:ext-strikethrough:$markwon_version" api "io.noties.markwon:ext-tasklist:$markwon_version" - api 'io.element.android:wysiwyg:2.32.0' + api 'io.element.android:wysiwyg:2.33.0' //Shake detection implementation 'com.squareup:seismic:1.0.3' diff --git a/core/src/main/java/org/futo/circles/core/base/fragment/BaseFullscreenDialogFragment.kt b/core/src/main/java/org/futo/circles/core/base/fragment/BaseFullscreenDialogFragment.kt index 9019e7d4e3e7a25cd45303ace473fa2640c027a2..d744f45575062dd8ccaf57e956ba24836882e1e4 100644 --- a/core/src/main/java/org/futo/circles/core/base/fragment/BaseFullscreenDialogFragment.kt +++ b/core/src/main/java/org/futo/circles/core/base/fragment/BaseFullscreenDialogFragment.kt @@ -9,8 +9,8 @@ import android.view.WindowManager import androidx.appcompat.app.AppCompatDialogFragment import androidx.viewbinding.ViewBinding import com.google.android.material.appbar.MaterialToolbar -import org.futo.circles.core.base.NoInternetConnectionViewPresenter import org.futo.circles.core.R +import org.futo.circles.core.base.NoInternetConnectionViewPresenter import org.futo.circles.core.extensions.onBackPressed @@ -32,6 +32,7 @@ abstract class BaseFullscreenDialogFragment( ): View? { _binding = inflate.invoke(inflater, container, false) dialog?.window?.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN) + dialog?.window?.attributes?.windowAnimations = R.style.DialogSlideAnimation return _binding?.root } diff --git a/core/src/main/java/org/futo/circles/core/view/LoadingRecyclerView.kt b/core/src/main/java/org/futo/circles/core/view/LoadingRecyclerView.kt index 63a3ba757898c3e5e52ac8e5796568decd25fa29..6d9c50ee26cd9dd7b38bc9bd253039dcfdb0e4b9 100644 --- a/core/src/main/java/org/futo/circles/core/view/LoadingRecyclerView.kt +++ b/core/src/main/java/org/futo/circles/core/view/LoadingRecyclerView.kt @@ -4,7 +4,7 @@ import android.content.Context import android.util.AttributeSet import android.view.LayoutInflater import android.view.View -import androidx.constraintlayout.widget.ConstraintLayout +import android.widget.FrameLayout import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView.ItemDecoration import com.google.android.material.floatingactionbutton.FloatingActionButton @@ -18,7 +18,7 @@ import org.matrix.android.sdk.api.extensions.tryOrNull class LoadingRecyclerView( context: Context, attrs: AttributeSet? = null -) : ConstraintLayout(context, attrs) { +) : FrameLayout(context, attrs) { private val binding = ViewLoadingRecyclerBinding.inflate(LayoutInflater.from(context), this) @@ -62,7 +62,7 @@ class LoadingRecyclerView( fun bindToFab(fab: FloatingActionButton) = binding.rvList.bindToFab(fab) - fun setIsPageLoading(isLoading:Boolean) = binding.pageLoading.setIsVisible(isLoading) + fun setIsPageLoading(isLoading: Boolean) = binding.pageLoading.setIsVisible(isLoading) private fun setupDataObserver() { with(binding) { diff --git a/core/src/main/res/anim/alpha_show.xml b/core/src/main/res/anim/alpha_show.xml new file mode 100644 index 0000000000000000000000000000000000000000..8731e7dbc74d84f18bb17c413f05df5b24f632a5 --- /dev/null +++ b/core/src/main/res/anim/alpha_show.xml @@ -0,0 +1,8 @@ +<set xmlns:android="http://schemas.android.com/apk/res/android" + android:shareInterpolator="false"> + <alpha + android:duration="@android:integer/config_shortAnimTime" + android:fromAlpha="0" + android:interpolator="@android:anim/linear_interpolator" + android:toAlpha="1" /> +</set> \ No newline at end of file diff --git a/core/src/main/res/anim/slide_out.xml b/core/src/main/res/anim/slide_out.xml new file mode 100644 index 0000000000000000000000000000000000000000..092cb1ecedd047e38bf2f809ae3523776688a4f5 --- /dev/null +++ b/core/src/main/res/anim/slide_out.xml @@ -0,0 +1,8 @@ +<set xmlns:android="http://schemas.android.com/apk/res/android" + android:shareInterpolator="false"> + <translate + android:duration="@android:integer/config_shortAnimTime" + android:fromXDelta="0%" + android:interpolator="@android:anim/linear_interpolator" + android:toXDelta="100%" /> +</set> \ No newline at end of file diff --git a/core/src/main/res/drawable/bg_top_rounded_corners.xml b/core/src/main/res/drawable/bg_top_rounded_corners.xml new file mode 100644 index 0000000000000000000000000000000000000000..06ea43007348afcfc944ba72f91d61926c8953ed --- /dev/null +++ b/core/src/main/res/drawable/bg_top_rounded_corners.xml @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="UTF-8"?> +<shape xmlns:android="http://schemas.android.com/apk/res/android"> + <solid android:color="?android:colorBackground" /> + <corners + android:bottomLeftRadius="0dp" + android:bottomRightRadius="0dp" + android:topLeftRadius="16dp" + android:topRightRadius="16dp" /> +</shape> \ No newline at end of file diff --git a/core/src/main/res/layout/view_loading_recycler.xml b/core/src/main/res/layout/view_loading_recycler.xml index 34a975989c8d996dd3ea8ba3ab804b01fc0bcc8c..a8fb03b3b2351b51723a8eba1331075ea8b5443c 100644 --- a/core/src/main/res/layout/view_loading_recycler.xml +++ b/core/src/main/res/layout/view_loading_recycler.xml @@ -4,27 +4,23 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" - tools:parentTag="androidx.constraintlayout.widget.ConstraintLayout"> + android:orientation="vertical" + tools:parentTag="android.widget.FrameLayout"> <androidx.recyclerview.widget.RecyclerView android:id="@+id/rvList" - android:layout_width="0dp" - android:layout_height="0dp" - app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toTopOf="parent" /> + android:layout_width="match_parent" + android:layout_height="match_parent" + app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" /> <FrameLayout android:id="@+id/pageLoading" - android:layout_width="0dp" + android:layout_width="match_parent" android:layout_height="wrap_content" + android:layout_gravity="bottom" android:background="?android:colorBackground" android:visibility="gone" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintStart_toStartOf="parent"> + tools:visibility="visible"> <ProgressBar android:layout_width="wrap_content" @@ -39,20 +35,13 @@ android:layout_height="wrap_content" android:layout_gravity="center" android:visibility="gone" - app:layout_constraintBottom_toBottomOf="@id/rvList" - app:layout_constraintEnd_toEndOf="@id/rvList" - app:layout_constraintStart_toStartOf="@id/rvList" - app:layout_constraintTop_toTopOf="@id/rvList" tools:visibility="visible" /> <FrameLayout android:id="@+id/lEmptyViewContainer" android:layout_width="match_parent" android:layout_height="match_parent" - android:visibility="gone" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toTopOf="parent" /> + android:layout_gravity="center" + android:visibility="gone" /> </merge> \ No newline at end of file diff --git a/core/src/main/res/values/styles.xml b/core/src/main/res/values/styles.xml index 5fa6d0b130729f2b23b3bd1ec6d48bef3c955eab..abbec47bfc87fc89001c3a34d38596c4837accc3 100644 --- a/core/src/main/res/values/styles.xml +++ b/core/src/main/res/values/styles.xml @@ -91,4 +91,9 @@ <item name="android:paddingTop">8dp</item> </style> + <style name="DialogSlideAnimation"> + <item name="android:windowEnterAnimation">@anim/alpha_show</item> + <item name="android:windowExitAnimation">@anim/slide_out</item> + </style> + </resources> \ No newline at end of file diff --git a/fastlane/metadata/android/en-US/changelogs/3801.txt b/fastlane/metadata/android/en-US/changelogs/3801.txt new file mode 100644 index 0000000000000000000000000000000000000000..367de86d33dbf663f9ba87660093d9dad964c3f1 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/3801.txt @@ -0,0 +1,3 @@ +- Circle's timelines filter +- Screens animation +- Bug fixes and performance improvements \ No newline at end of file