From bb170c2b7a33da5dab58593446fcac0b967973af Mon Sep 17 00:00:00 2001 From: Artem Umerov Date: Sat, 27 May 2023 14:29:34 +0300 Subject: [PATCH] 29 29 --- .../ragnarok/fenrir/activity/MainActivity.kt | 2 +- .../adapters/FeedbackVKOfficialDtoAdapter.kt | 16 +++- .../fenrir/api/impl/StoriesShortVideosApi.kt | 16 ++-- .../api/interfaces/IStoriesShortVideosApi.kt | 8 +- .../{StoryResponse.kt => StoriesResponse.kt} | 2 +- .../services/IStoriesShortVideosService.kt | 14 ++-- .../domain/IStoriesShortVideosInteractor.kt | 4 +- .../impl/StoriesShortVideosInteractor.kt | 8 +- .../FeedbackVKOfficialAdapter.kt | 8 +- .../FeedbackVKOfficialFragment.kt | 37 ++++++--- .../fenrir/fragment/wall/AbsWallPresenter.kt | 4 +- .../wall/groupwall/GroupWallPresenter.kt | 2 +- .../wall/userwall/UserWallPresenter.kt | 2 +- .../dev/ragnarok/fenrir/link/LinkHelper.kt | 15 ++++ .../dev/ragnarok/fenrir/link/VKLinkParser.kt | 24 ++++++ .../dev/ragnarok/fenrir/link/types/AbsLink.kt | 3 +- .../ragnarok/fenrir/link/types/StoryLink.kt | 11 +++ .../fenrir/model/FeedbackVKOfficial.kt | 19 ++++- .../fenrir/push/message/LikeFCMMessage.kt | 1 + .../fragment/PreferencesFragment.kt | 6 ++ build.gradle | 18 ++-- .../camera2/internal/Camera2CameraImpl.java | 2 +- .../jni/animation/libyuv/source/row_neon.cc | 14 ++-- .../jni/animation/libyuv/source/row_rvv.cc | 22 +++-- .../main/jni/animation/libyuv/source/scale.cc | 13 +-- .../src/main/jni/rlottie/rlottie-master.zip | Bin 4206157 -> 4205579 bytes .../jni/rlottie/src/lottie/lottieitem.cpp | 53 +++++++++--- .../main/jni/rlottie/src/lottie/lottieitem.h | 22 +++++ .../thorvg/src/lib/sw_engine/tvgSwRasterAvx.h | 4 +- .../widget/AsyncDifferConfig.java | 2 + .../widget/GridLayoutManager.java | 67 +-------------- .../widget/LinearLayoutManager.java | 55 ------------ .../recyclerview/widget/RecyclerView.java | 78 ++++-------------- .../widget/StaggeredGridLayoutManager.java | 50 +---------- 34 files changed, 279 insertions(+), 323 deletions(-) rename app_fenrir/src/main/kotlin/dev/ragnarok/fenrir/api/model/response/{StoryResponse.kt => StoriesResponse.kt} (95%) create mode 100644 app_fenrir/src/main/kotlin/dev/ragnarok/fenrir/link/types/StoryLink.kt diff --git a/app_fenrir/src/main/kotlin/dev/ragnarok/fenrir/activity/MainActivity.kt b/app_fenrir/src/main/kotlin/dev/ragnarok/fenrir/activity/MainActivity.kt index 5f8a90c78..3874f52f6 100644 --- a/app_fenrir/src/main/kotlin/dev/ragnarok/fenrir/activity/MainActivity.kt +++ b/app_fenrir/src/main/kotlin/dev/ragnarok/fenrir/activity/MainActivity.kt @@ -691,7 +691,7 @@ open class MainActivity : AppCompatActivity(), NavigationDrawerCallbacks, OnSect 2 -> { mCompositeDisposable.add(InteractorFactory.createStoriesInteractor() - .getStory( + .getStories( Settings.get().accounts().current, null ) diff --git a/app_fenrir/src/main/kotlin/dev/ragnarok/fenrir/api/adapters/FeedbackVKOfficialDtoAdapter.kt b/app_fenrir/src/main/kotlin/dev/ragnarok/fenrir/api/adapters/FeedbackVKOfficialDtoAdapter.kt index 2f6c28e7c..262b72fea 100644 --- a/app_fenrir/src/main/kotlin/dev/ragnarok/fenrir/api/adapters/FeedbackVKOfficialDtoAdapter.kt +++ b/app_fenrir/src/main/kotlin/dev/ragnarok/fenrir/api/adapters/FeedbackVKOfficialDtoAdapter.kt @@ -56,10 +56,15 @@ class FeedbackVKOfficialDtoAdapter : val dto = FeedbackVKOfficial() if (hasObject(root_item, "action")) { val action_item = root_item["action"]?.jsonObject - if ("authorize" == optString(action_item, "type") || "custom" == optString( + if ("authorize" == optString(action_item, "type")) { + dto.action = ActionBrowserURL(optString(action_item, "url")) + } else if ("custom" == optString( action_item, "type" - ) && optString(root_item, "icon_type") == "friend_found" + ) && optString( + root_item, + "icon_type" + ) == "friend_found" ) { dto.action = ActionURL(optString(action_item, "url")) } else if ("message_open" == optString( @@ -182,6 +187,13 @@ class FeedbackVKOfficialDtoAdapter : kJson.decodeFromJsonElement(ImageAdditional.serializer(), s) dto.images?.add(imgh) } + + if (hasObject(additional_item, "action")) { + val action_item = additional_item["action"]?.jsonObject + if ("custom" == optString(action_item, "type")) { + dto.images_action = ActionURL(optString(action_item, "url")) + } + } } if ("photo" == optString(additional_item, "type")) { attachments.add( diff --git a/app_fenrir/src/main/kotlin/dev/ragnarok/fenrir/api/impl/StoriesShortVideosApi.kt b/app_fenrir/src/main/kotlin/dev/ragnarok/fenrir/api/impl/StoriesShortVideosApi.kt index f33a83c02..56f84ce4d 100644 --- a/app_fenrir/src/main/kotlin/dev/ragnarok/fenrir/api/impl/StoriesShortVideosApi.kt +++ b/app_fenrir/src/main/kotlin/dev/ragnarok/fenrir/api/impl/StoriesShortVideosApi.kt @@ -9,8 +9,8 @@ import dev.ragnarok.fenrir.api.model.Items import dev.ragnarok.fenrir.api.model.VKApiNarratives import dev.ragnarok.fenrir.api.model.VKApiStory import dev.ragnarok.fenrir.api.model.response.ShortVideosResponse +import dev.ragnarok.fenrir.api.model.response.StoriesResponse import dev.ragnarok.fenrir.api.model.response.StoryGetResponse -import dev.ragnarok.fenrir.api.model.response.StoryResponse import dev.ragnarok.fenrir.api.model.response.ViewersListResponse import dev.ragnarok.fenrir.api.model.server.VKApiStoryUploadServer import dev.ragnarok.fenrir.api.services.IStoriesShortVideosService @@ -19,10 +19,14 @@ import io.reactivex.rxjava3.core.Single internal class StoriesShortVideosApi(accountId: Long, provider: IServiceProvider) : AbsApi(accountId, provider), IStoriesShortVideosApi { - override fun getStory(owner_id: Long?, extended: Int?, fields: String?): Single { + override fun getStories( + owner_id: Long?, + extended: Int?, + fields: String? + ): Single { return provideService(IStoriesShortVideosService(), TokenType.USER, TokenType.COMMUNITY) .flatMap { service -> - service.getStory(owner_id, extended, fields) + service.getStories(owner_id, extended, fields) .map(extractResponseWithErrorHandling()) } } @@ -67,16 +71,16 @@ internal class StoriesShortVideosApi(accountId: Long, provider: IServiceProvider } } - override fun searchStory( + override fun searchStories( q: String?, mentioned_id: Long?, count: Int?, extended: Int?, fields: String? - ): Single { + ): Single { return provideService(IStoriesShortVideosService(), TokenType.USER, TokenType.COMMUNITY) .flatMap { service -> - service.searchStory(q, mentioned_id, count, extended, fields) + service.searchStories(q, mentioned_id, count, extended, fields) .map(extractResponseWithErrorHandling()) } } diff --git a/app_fenrir/src/main/kotlin/dev/ragnarok/fenrir/api/interfaces/IStoriesShortVideosApi.kt b/app_fenrir/src/main/kotlin/dev/ragnarok/fenrir/api/interfaces/IStoriesShortVideosApi.kt index 45a2ee2ca..fc1144d25 100644 --- a/app_fenrir/src/main/kotlin/dev/ragnarok/fenrir/api/interfaces/IStoriesShortVideosApi.kt +++ b/app_fenrir/src/main/kotlin/dev/ragnarok/fenrir/api/interfaces/IStoriesShortVideosApi.kt @@ -6,8 +6,8 @@ import dev.ragnarok.fenrir.api.model.Items import dev.ragnarok.fenrir.api.model.VKApiNarratives import dev.ragnarok.fenrir.api.model.VKApiStory import dev.ragnarok.fenrir.api.model.response.ShortVideosResponse +import dev.ragnarok.fenrir.api.model.response.StoriesResponse import dev.ragnarok.fenrir.api.model.response.StoryGetResponse -import dev.ragnarok.fenrir.api.model.response.StoryResponse import dev.ragnarok.fenrir.api.model.response.ViewersListResponse import dev.ragnarok.fenrir.api.model.server.VKApiStoryUploadServer import io.reactivex.rxjava3.core.Single @@ -40,7 +40,7 @@ interface IStoriesShortVideosApi { fun stories_save(upload_results: String?): Single> @CheckResult - fun getStory(owner_id: Long?, extended: Int?, fields: String?): Single + fun getStories(owner_id: Long?, extended: Int?, fields: String?): Single @CheckResult fun getNarratives(owner_id: Long, offset: Int?, count: Int?): Single> @@ -53,13 +53,13 @@ interface IStoriesShortVideosApi { ): Single @CheckResult - fun searchStory( + fun searchStories( q: String?, mentioned_id: Long?, count: Int?, extended: Int?, fields: String? - ): Single + ): Single @CheckResult fun getShortVideos( diff --git a/app_fenrir/src/main/kotlin/dev/ragnarok/fenrir/api/model/response/StoryResponse.kt b/app_fenrir/src/main/kotlin/dev/ragnarok/fenrir/api/model/response/StoriesResponse.kt similarity index 95% rename from app_fenrir/src/main/kotlin/dev/ragnarok/fenrir/api/model/response/StoryResponse.kt rename to app_fenrir/src/main/kotlin/dev/ragnarok/fenrir/api/model/response/StoriesResponse.kt index 386c8e43f..9b7cf18ca 100644 --- a/app_fenrir/src/main/kotlin/dev/ragnarok/fenrir/api/model/response/StoryResponse.kt +++ b/app_fenrir/src/main/kotlin/dev/ragnarok/fenrir/api/model/response/StoriesResponse.kt @@ -6,7 +6,7 @@ import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @Serializable -class StoryResponse { +class StoriesResponse { @SerialName("items") var items: List? = null diff --git a/app_fenrir/src/main/kotlin/dev/ragnarok/fenrir/api/services/IStoriesShortVideosService.kt b/app_fenrir/src/main/kotlin/dev/ragnarok/fenrir/api/services/IStoriesShortVideosService.kt index 4e7af1ded..7aa0fe0b6 100644 --- a/app_fenrir/src/main/kotlin/dev/ragnarok/fenrir/api/services/IStoriesShortVideosService.kt +++ b/app_fenrir/src/main/kotlin/dev/ragnarok/fenrir/api/services/IStoriesShortVideosService.kt @@ -5,8 +5,8 @@ import dev.ragnarok.fenrir.api.model.VKApiNarratives import dev.ragnarok.fenrir.api.model.VKApiStory import dev.ragnarok.fenrir.api.model.response.BaseResponse import dev.ragnarok.fenrir.api.model.response.ShortVideosResponse +import dev.ragnarok.fenrir.api.model.response.StoriesResponse import dev.ragnarok.fenrir.api.model.response.StoryGetResponse -import dev.ragnarok.fenrir.api.model.response.StoryResponse import dev.ragnarok.fenrir.api.model.response.ViewersListResponse import dev.ragnarok.fenrir.api.model.server.VKApiStoryUploadServer import dev.ragnarok.fenrir.api.rest.IServiceRest @@ -82,17 +82,17 @@ class IStoriesShortVideosService : IServiceRest() { ) } - fun getStory( + fun getStories( owner_id: Long?, extended: Int?, fields: String? - ): Single> { + ): Single> { return rest.request( "stories.get", form( "owner_id" to owner_id, "extended" to extended, "fields" to fields - ), base(StoryResponse.serializer()) + ), base(StoriesResponse.serializer()) ) } @@ -124,13 +124,13 @@ class IStoriesShortVideosService : IServiceRest() { ) } - fun searchStory( + fun searchStories( q: String?, mentioned_id: Long?, count: Int?, extended: Int?, fields: String? - ): Single> { + ): Single> { return rest.request( "stories.search", form( "q" to q, @@ -138,7 +138,7 @@ class IStoriesShortVideosService : IServiceRest() { "count" to count, "extended" to extended, "fields" to fields - ), base(StoryResponse.serializer()) + ), base(StoriesResponse.serializer()) ) } diff --git a/app_fenrir/src/main/kotlin/dev/ragnarok/fenrir/domain/IStoriesShortVideosInteractor.kt b/app_fenrir/src/main/kotlin/dev/ragnarok/fenrir/domain/IStoriesShortVideosInteractor.kt index 20519c43a..83502a716 100644 --- a/app_fenrir/src/main/kotlin/dev/ragnarok/fenrir/domain/IStoriesShortVideosInteractor.kt +++ b/app_fenrir/src/main/kotlin/dev/ragnarok/fenrir/domain/IStoriesShortVideosInteractor.kt @@ -16,8 +16,8 @@ interface IStoriesShortVideosInteractor { offset: Int ): Single>> - fun searchStory(accountId: Long, q: String?, mentioned_id: Long?): Single> - fun getStory(accountId: Long, owner_id: Long?): Single> + fun searchStories(accountId: Long, q: String?, mentioned_id: Long?): Single> + fun getStories(accountId: Long, owner_id: Long?): Single> fun stories_delete(accountId: Long, owner_id: Long, story_id: Int): Single fun getNarratives( accountId: Long, diff --git a/app_fenrir/src/main/kotlin/dev/ragnarok/fenrir/domain/impl/StoriesShortVideosInteractor.kt b/app_fenrir/src/main/kotlin/dev/ragnarok/fenrir/domain/impl/StoriesShortVideosInteractor.kt index 4d3f58ca4..a0f6db391 100644 --- a/app_fenrir/src/main/kotlin/dev/ragnarok/fenrir/domain/impl/StoriesShortVideosInteractor.kt +++ b/app_fenrir/src/main/kotlin/dev/ragnarok/fenrir/domain/impl/StoriesShortVideosInteractor.kt @@ -121,10 +121,10 @@ class StoriesShortVideosInteractor( .stories().stories_delete(owner_id, story_id) } - override fun getStory(accountId: Long, owner_id: Long?): Single> { + override fun getStories(accountId: Long, owner_id: Long?): Single> { return networker.vkDefault(accountId) .stories() - .getStory(owner_id, 1, Fields.FIELDS_BASE_OWNER) + .getStories(owner_id, 1, Fields.FIELDS_BASE_OWNER) .flatMap { story -> val dtos_multy = listEmptyIfNull(story.items) val dtos: MutableList = ArrayList() @@ -156,14 +156,14 @@ class StoriesShortVideosInteractor( } } - override fun searchStory( + override fun searchStories( accountId: Long, q: String?, mentioned_id: Long? ): Single> { return networker.vkDefault(accountId) .stories() - .searchStory(q, mentioned_id, 1000, 1, Fields.FIELDS_BASE_OWNER) + .searchStories(q, mentioned_id, 1000, 1, Fields.FIELDS_BASE_OWNER) .flatMap { story -> val dtos_multy = listEmptyIfNull(story.items) val dtos: MutableList = ArrayList() diff --git a/app_fenrir/src/main/kotlin/dev/ragnarok/fenrir/fragment/feedback/feedbackvkofficial/FeedbackVKOfficialAdapter.kt b/app_fenrir/src/main/kotlin/dev/ragnarok/fenrir/fragment/feedback/feedbackvkofficial/FeedbackVKOfficialAdapter.kt index 725a67d39..a311025f8 100644 --- a/app_fenrir/src/main/kotlin/dev/ragnarok/fenrir/fragment/feedback/feedbackvkofficial/FeedbackVKOfficialAdapter.kt +++ b/app_fenrir/src/main/kotlin/dev/ragnarok/fenrir/fragment/feedback/feedbackvkofficial/FeedbackVKOfficialAdapter.kt @@ -231,9 +231,15 @@ class FeedbackVKOfficialAdapter( holder.time.text = AppTextUtils.getDateFromUnixTime(context, Page.time) val Img = Page.getImage(256) if (Img == null) { + holder.additional.setOnClickListener { } holder.additional.visibility = View.GONE with().cancelRequest(holder.additional) } else { + holder.additional.setOnClickListener { + Page.images_action.requireNonNull { sc -> + clickListener?.openAction(sc) + } + } holder.additional.visibility = View.VISIBLE with() .load(Img.url) @@ -297,7 +303,7 @@ class FeedbackVKOfficialAdapter( } } Page.action.ifNonNull({ - if (it.getActionType() == FeedbackVKOfficial.Action_Types.URL) { + if (it.getActionType() == FeedbackVKOfficial.Action_Types.URL || it.getActionType() == FeedbackVKOfficial.Action_Types.BROWSER_URL) { holder.actionButton.setText(R.string.more_info) } else { holder.actionButton.setText(R.string.open) diff --git a/app_fenrir/src/main/kotlin/dev/ragnarok/fenrir/fragment/feedback/feedbackvkofficial/FeedbackVKOfficialFragment.kt b/app_fenrir/src/main/kotlin/dev/ragnarok/fenrir/fragment/feedback/feedbackvkofficial/FeedbackVKOfficialFragment.kt index fcf8a22f7..616b4c080 100644 --- a/app_fenrir/src/main/kotlin/dev/ragnarok/fenrir/fragment/feedback/feedbackvkofficial/FeedbackVKOfficialFragment.kt +++ b/app_fenrir/src/main/kotlin/dev/ragnarok/fenrir/fragment/feedback/feedbackvkofficial/FeedbackVKOfficialFragment.kt @@ -24,6 +24,7 @@ import dev.ragnarok.fenrir.listener.EndlessRecyclerOnScrollListener import dev.ragnarok.fenrir.listener.OnSectionResumeCallback import dev.ragnarok.fenrir.listener.PicassoPauseOnScrollListener import dev.ragnarok.fenrir.model.FeedbackVKOfficial +import dev.ragnarok.fenrir.model.FeedbackVKOfficial.ActionBrowserURL import dev.ragnarok.fenrir.model.FeedbackVKOfficial.ActionMessage import dev.ragnarok.fenrir.model.FeedbackVKOfficial.ActionURL import dev.ragnarok.fenrir.model.FeedbackVKOfficialList @@ -154,16 +155,32 @@ class FeedbackVKOfficialFragment : } override fun openAction(action: FeedbackVKOfficial.Action) { - if (action.getActionType() == FeedbackVKOfficial.Action_Types.URL) { - LinkHelper.openLinkInBrowser(requireActivity(), (action as ActionURL).getUrl()) - } else if (action.getActionType() == FeedbackVKOfficial.Action_Types.MESSAGE) { - val msg = action as ActionMessage - getMessagesLookupPlace( - Settings.get().accounts().current, - msg.getPeerId(), - msg.getMessageId(), - null - ).tryOpenWith(requireActivity()) + when (action.getActionType()) { + FeedbackVKOfficial.Action_Types.BROWSER_URL -> { + LinkHelper.openLinkInBrowser( + requireActivity(), + (action as ActionBrowserURL).getUrl() + ) + } + + FeedbackVKOfficial.Action_Types.URL -> { + LinkHelper.openUrl( + requireActivity(), + Settings.get().accounts().current, + (action as ActionURL).getUrl(), + false + ) + } + + FeedbackVKOfficial.Action_Types.MESSAGE -> { + val msg = action as ActionMessage + getMessagesLookupPlace( + Settings.get().accounts().current, + msg.getPeerId(), + msg.getMessageId(), + null + ).tryOpenWith(requireActivity()) + } } } diff --git a/app_fenrir/src/main/kotlin/dev/ragnarok/fenrir/fragment/wall/AbsWallPresenter.kt b/app_fenrir/src/main/kotlin/dev/ragnarok/fenrir/fragment/wall/AbsWallPresenter.kt index 27ce19d7f..cb643b2d2 100644 --- a/app_fenrir/src/main/kotlin/dev/ragnarok/fenrir/fragment/wall/AbsWallPresenter.kt +++ b/app_fenrir/src/main/kotlin/dev/ragnarok/fenrir/fragment/wall/AbsWallPresenter.kt @@ -472,7 +472,7 @@ abstract class AbsWallPresenter internal constructor( cacheCompositeDisposable.clear() requestWall(0) if (!Settings.get().other().isDisable_history) { - appendDisposable(storiesInteractor.getStory( + appendDisposable(storiesInteractor.getStories( accountId, if (accountId == ownerId) null else ownerId ) @@ -904,7 +904,7 @@ abstract class AbsWallPresenter internal constructor( storiesInteractor = InteractorFactory.createStoriesInteractor() loadWallCachedData() if (!Settings.get().other().isDisable_history) { - appendDisposable(storiesInteractor.getStory( + appendDisposable(storiesInteractor.getStories( accountId, if (accountId == ownerId) null else ownerId ) diff --git a/app_fenrir/src/main/kotlin/dev/ragnarok/fenrir/fragment/wall/groupwall/GroupWallPresenter.kt b/app_fenrir/src/main/kotlin/dev/ragnarok/fenrir/fragment/wall/groupwall/GroupWallPresenter.kt index 1f637aa91..0786d997f 100644 --- a/app_fenrir/src/main/kotlin/dev/ragnarok/fenrir/fragment/wall/groupwall/GroupWallPresenter.kt +++ b/app_fenrir/src/main/kotlin/dev/ragnarok/fenrir/fragment/wall/groupwall/GroupWallPresenter.kt @@ -573,7 +573,7 @@ class GroupWallPresenter( } override fun searchStory(ByName: Boolean) { - appendDisposable(storiesInteractor.searchStory( + appendDisposable(storiesInteractor.searchStories( accountId, if (ByName) community.fullName else null, if (ByName) null else ownerId diff --git a/app_fenrir/src/main/kotlin/dev/ragnarok/fenrir/fragment/wall/userwall/UserWallPresenter.kt b/app_fenrir/src/main/kotlin/dev/ragnarok/fenrir/fragment/wall/userwall/UserWallPresenter.kt index 7952bb960..6047d3d3f 100644 --- a/app_fenrir/src/main/kotlin/dev/ragnarok/fenrir/fragment/wall/userwall/UserWallPresenter.kt +++ b/app_fenrir/src/main/kotlin/dev/ragnarok/fenrir/fragment/wall/userwall/UserWallPresenter.kt @@ -749,7 +749,7 @@ class UserWallPresenter( } override fun searchStory(ByName: Boolean) { - appendDisposable(storiesInteractor.searchStory( + appendDisposable(storiesInteractor.searchStories( accountId, if (ByName) user.fullName else null, if (ByName) null else ownerId diff --git a/app_fenrir/src/main/kotlin/dev/ragnarok/fenrir/link/LinkHelper.kt b/app_fenrir/src/main/kotlin/dev/ragnarok/fenrir/link/LinkHelper.kt index e30f52eec..761f1d1a6 100644 --- a/app_fenrir/src/main/kotlin/dev/ragnarok/fenrir/link/LinkHelper.kt +++ b/app_fenrir/src/main/kotlin/dev/ragnarok/fenrir/link/LinkHelper.kt @@ -13,6 +13,7 @@ import androidx.browser.customtabs.CustomTabsIntent import androidx.browser.customtabs.CustomTabsService import com.google.android.material.dialog.MaterialAlertDialogBuilder import dev.ragnarok.fenrir.R +import dev.ragnarok.fenrir.api.model.AccessIdPair import dev.ragnarok.fenrir.domain.InteractorFactory import dev.ragnarok.fenrir.fragment.fave.FaveTabsFragment import dev.ragnarok.fenrir.fragment.photos.vkphotos.IVKPhotosView @@ -23,6 +24,7 @@ import dev.ragnarok.fenrir.link.types.* import dev.ragnarok.fenrir.link.types.FaveLink import dev.ragnarok.fenrir.media.music.MusicPlaybackService.Companion.startForPlayList import dev.ragnarok.fenrir.model.* +import dev.ragnarok.fenrir.place.PlaceFactory import dev.ragnarok.fenrir.place.PlaceFactory.getArtistPlace import dev.ragnarok.fenrir.place.PlaceFactory.getAudiosInAlbumPlace import dev.ragnarok.fenrir.place.PlaceFactory.getAudiosPlace @@ -352,6 +354,19 @@ object LinkHelper { }) { e -> createCustomToast(context).showToastThrowable(e) } } + AbsLink.STORY -> { + val storyLink = link as StoryLink + InteractorFactory.createStoriesInteractor().getStoryById( + accountId, + listOf(AccessIdPair(storyLink.storyId, storyLink.ownerId, storyLink.access_key)) + ) + .fromIOToMain() + .subscribe({ + PlaceFactory.getHistoryVideoPreviewPlace(accountId, ArrayList(it), 0) + .tryOpenWith(context) + }) { e -> createCustomToast(context).showToastThrowable(e) } + } + else -> return false } return true diff --git a/app_fenrir/src/main/kotlin/dev/ragnarok/fenrir/link/VKLinkParser.kt b/app_fenrir/src/main/kotlin/dev/ragnarok/fenrir/link/VKLinkParser.kt index 2b22d887b..450451ae4 100644 --- a/app_fenrir/src/main/kotlin/dev/ragnarok/fenrir/link/VKLinkParser.kt +++ b/app_fenrir/src/main/kotlin/dev/ragnarok/fenrir/link/VKLinkParser.kt @@ -41,6 +41,7 @@ object VKLinkParser { val PATTERN_PLAYLIST_ALT: Pattern = Pattern.compile("vk\\.com/.+(?:act=|z=)audio_playlist(-?\\d*)_(\\d*)(?:&access_hash=(\\w+))?") val PATTERN_DOC: Pattern = Pattern.compile("vk\\.com/doc(-?\\d*)_(\\d*)") //+ + val PATTERN_STORY: Pattern = Pattern.compile("vk\\.com/story(-?\\d*)_(\\d*)") //+ val PATTERN_TOPIC: Pattern = Pattern.compile("vk\\.com/topic-(\\d*)_(\\d*)") //+ val PATTERN_FAVE: Pattern = Pattern.compile("vk\\.com/fave") val PATTERN_GROUP_ID: Pattern = Pattern.compile("vk\\.com/(club|event|public)(\\d+)$") //+ @@ -252,6 +253,10 @@ object VKLinkParser { if (vkLink != null) { return vkLink } + vkLink = parseStory(string) + if (vkLink != null) { + return vkLink + } vkLink = parsePhotos(string) if (vkLink != null) { return vkLink @@ -664,6 +669,25 @@ object VKLinkParser { return null } + private fun parseStory(string: String): AbsLink? { + val matcher = patterns.PATTERN_STORY.matcher(string) + try { + if (matcher.find()) { + return matcher.group(1)?.let { + matcher.group(2)?.let { it1 -> + StoryLink( + it.toLong(), + it1.toInt(), + parseAccessKey(string) + ) + } + } + } + } catch (ignored: Exception) { + } + return null + } + private fun parseWall(string: String): AbsLink? { val matcher = patterns.PATTERN_WALL.matcher(string) return if (!matcher.find()) { diff --git a/app_fenrir/src/main/kotlin/dev/ragnarok/fenrir/link/types/AbsLink.kt b/app_fenrir/src/main/kotlin/dev/ragnarok/fenrir/link/types/AbsLink.kt index 4b096c6b9..565713d39 100644 --- a/app_fenrir/src/main/kotlin/dev/ragnarok/fenrir/link/types/AbsLink.kt +++ b/app_fenrir/src/main/kotlin/dev/ragnarok/fenrir/link/types/AbsLink.kt @@ -34,6 +34,7 @@ abstract class AbsLink(val type: Int) { const val VIDEOS = 26 const val APP_LINK = 27 const val ARTICLE_LINK = 28 - const val CATALOG_V2_SECTION_LINK = 29 + const val STORY = 29 + const val CATALOG_V2_SECTION_LINK = 30 } } \ No newline at end of file diff --git a/app_fenrir/src/main/kotlin/dev/ragnarok/fenrir/link/types/StoryLink.kt b/app_fenrir/src/main/kotlin/dev/ragnarok/fenrir/link/types/StoryLink.kt new file mode 100644 index 000000000..81b72a8f2 --- /dev/null +++ b/app_fenrir/src/main/kotlin/dev/ragnarok/fenrir/link/types/StoryLink.kt @@ -0,0 +1,11 @@ +package dev.ragnarok.fenrir.link.types + +class StoryLink(val ownerId: Long, val storyId: Int, val access_key: String?) : AbsLink(STORY) { + override fun toString(): String { + return "StoryLink{" + + "ownerId=" + ownerId + + ", storyId=" + storyId + + ", Access_Key=" + access_key + + '}' + } +} diff --git a/app_fenrir/src/main/kotlin/dev/ragnarok/fenrir/model/FeedbackVKOfficial.kt b/app_fenrir/src/main/kotlin/dev/ragnarok/fenrir/model/FeedbackVKOfficial.kt index 8e98f7aad..a82062e99 100644 --- a/app_fenrir/src/main/kotlin/dev/ragnarok/fenrir/model/FeedbackVKOfficial.kt +++ b/app_fenrir/src/main/kotlin/dev/ragnarok/fenrir/model/FeedbackVKOfficial.kt @@ -19,6 +19,7 @@ class FeedbackVKOfficial { var hide_query: String? = null var time: Long = 0 var images: ArrayList? = null + var images_action: Action? = null var attachments: ArrayList? = null var action: Action? = null fun getImage(prefSize: Int): ImageAdditional? { @@ -36,12 +37,13 @@ class FeedbackVKOfficial { return result } - @IntDef(Action_Types.MESSAGE, Action_Types.URL) + @IntDef(Action_Types.MESSAGE, Action_Types.BROWSER_URL, Action_Types.URL) @Retention(AnnotationRetention.SOURCE) annotation class Action_Types { companion object { const val MESSAGE = 0 - const val URL = 1 + const val BROWSER_URL = 1 + const val URL = 2 } } @@ -82,6 +84,19 @@ class FeedbackVKOfficial { } } + @Keep + @Serializable + @SerialName("action_browser_url") + class ActionBrowserURL(private val url: String?) : Action() { + fun getUrl(): String? { + return url + } + + override fun getActionType(): Int { + return Action_Types.BROWSER_URL + } + } + @Keep @Serializable class ImageAdditional { diff --git a/app_fenrir/src/main/kotlin/dev/ragnarok/fenrir/push/message/LikeFCMMessage.kt b/app_fenrir/src/main/kotlin/dev/ragnarok/fenrir/push/message/LikeFCMMessage.kt index 32b910e4d..3cfb96766 100644 --- a/app_fenrir/src/main/kotlin/dev/ragnarok/fenrir/push/message/LikeFCMMessage.kt +++ b/app_fenrir/src/main/kotlin/dev/ragnarok/fenrir/push/message/LikeFCMMessage.kt @@ -150,6 +150,7 @@ class LikeFCMMessage { .setSmallIcon(R.drawable.heart) .setContentTitle(context.getString(R.string.like_title)) .setContentText(title) + .setStyle(NotificationCompat.BigTextStyle().bigText(title)) .setNumber(badge) .setAutoCancel(true) builder.priority = NotificationCompat.PRIORITY_HIGH diff --git a/app_filegallery/src/main/kotlin/dev/ragnarok/filegallery/fragment/PreferencesFragment.kt b/app_filegallery/src/main/kotlin/dev/ragnarok/filegallery/fragment/PreferencesFragment.kt index eea1647d6..60da9a43b 100644 --- a/app_filegallery/src/main/kotlin/dev/ragnarok/filegallery/fragment/PreferencesFragment.kt +++ b/app_filegallery/src/main/kotlin/dev/ragnarok/filegallery/fragment/PreferencesFragment.kt @@ -797,6 +797,12 @@ class PreferencesFragment : AbsPreferencesFragment(), PreferencesAdapter.OnScree ).absolutePath || sel.absolutePath == File( Environment.getExternalStorageDirectory(), ".sstmp" + ).absolutePath || sel.absolutePath == File( + Environment.getExternalStorageDirectory(), + ".SLOGAN" + ).absolutePath || sel.absolutePath == File( + Environment.getExternalStorageDirectory(), + ".OplusOS" ).absolutePath || sel.absolutePath == File( Environment.getExternalStorageDirectory(), ".time" diff --git a/build.gradle b/build.gradle index 9042bd015..6754a633e 100644 --- a/build.gradle +++ b/build.gradle @@ -13,18 +13,18 @@ buildscript { ext.appFileGalleryVersionName = "1.999" //androidx libraries - ext.activityVersion = "1.7.1" + ext.activityVersion = "1.7.2" ext.annotationVersion = "1.6.0" ext.appcompatVersion = "1.6.1" ext.biometricVersion = "1.2.0-alpha05" ext.browserVersion = "1.5.0" - ext.cameraVersion = "1.2.2" + ext.cameraVersion = "1.2.3" ext.cardviewVersion = "1.0.0" ext.collectionVersion = "1.3.0-alpha04" ext.concurentVersion = "1.2.0-alpha01" - ext.constraintlayoutVersion = "2.2.0-alpha09" + ext.constraintlayoutVersion = "2.2.0-alpha10" ext.coordinatorlayoutVersion = "1.2.0" - ext.coreVersion = "1.10.1" + ext.coreVersion = "1.11.0-beta01" ext.customviewVersion = "1.2.0-alpha02" ext.customviewPoolingcontainerVersion = "1.0.0" ext.drawerlayoutVersion = "1.2.0" @@ -35,10 +35,10 @@ buildscript { ext.loaderVersion = "1.1.0" ext.mediaVersion = "1.7.0-alpha01" ext.media3Version = "1.1.0-alpha01" - ext.recyclerviewVersion = "1.3.0" + ext.recyclerviewVersion = "1.3.1-rc01" ext.savedStateVersion = "1.2.1" ext.swiperefreshlayoutVersion = "1.2.0-alpha01" - ext.tracingVersion = "1.2.0-beta04" + ext.tracingVersion = "1.2.0-rc01" ext.transitionVersion = "1.4.1" ext.vectordrawableVersion = "1.2.0-beta01" ext.webkitVersion = "1.7.0-rc01" @@ -58,12 +58,12 @@ buildscript { //common libraries ext.kotlin_version = "1.8.21" - ext.kotlin_coroutines = "1.7.0" + ext.kotlin_coroutines = "1.7.1" ext.kotlin_serializer = "1.5.1" ext.okhttpLibraryVersion = "5.0.0-alpha.11" ext.okioVersion = "3.3.0" ext.rxJavaVersion = "3.1.6" - ext.guavaVersion = "31.1-android" + ext.guavaVersion = "32.0.0-android" ext.errorproneVersion = "2.15.0" ext.checkerCompatQualVersion = "2.5.5" ext.checkerQualAndroidVersion = "3.34.0" @@ -91,7 +91,7 @@ buildscript { mavenCentral() } dependencies { - classpath "com.android.tools.build:gradle:8.0.1" + classpath "com.android.tools.build:gradle:8.0.2" classpath "com.google.gms:google-services:4.3.15" classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath "org.jetbrains.kotlin:kotlin-serialization:$kotlin_version" diff --git a/camera2/src/main/java/androidx/camera/camera2/internal/Camera2CameraImpl.java b/camera2/src/main/java/androidx/camera/camera2/internal/Camera2CameraImpl.java index 64494281d..a7b28fbd5 100644 --- a/camera2/src/main/java/androidx/camera/camera2/internal/Camera2CameraImpl.java +++ b/camera2/src/main/java/androidx/camera/camera2/internal/Camera2CameraImpl.java @@ -631,7 +631,7 @@ public void onUseCaseReset(@NonNull UseCase useCase) { mExecutor.execute(() -> { debugLog("Use case " + useCaseId + " RESET"); mUseCaseAttachState.updateUseCase(useCaseId, sessionConfig, useCaseConfig); - + addOrRemoveMeteringRepeatingUseCase(); resetCaptureSession(/*abortInFlightCaptures=*/false); updateCaptureSessionConfig(); diff --git a/libfenrir/src/main/jni/animation/libyuv/source/row_neon.cc b/libfenrir/src/main/jni/animation/libyuv/source/row_neon.cc index d734b817c..b653765cc 100644 --- a/libfenrir/src/main/jni/animation/libyuv/source/row_neon.cc +++ b/libfenrir/src/main/jni/animation/libyuv/source/row_neon.cc @@ -725,12 +725,12 @@ void DetileToYUY2_NEON(const uint8_t* src_y, void UnpackMT2T_NEON(const uint8_t* src, uint16_t* dst, size_t size) { asm volatile( "1: \n" - "vld1.8 q14, [%0]! \n" // Load lower bits. - "vld1.8 q9, [%0]! \n" // Load upper bits row + "vld1.8 {q14}, [%0]! \n" // Load lower bits. + "vld1.8 {q9}, [%0]! \n" // Load upper bits row // by row. - "vld1.8 q11, [%0]! \n" - "vld1.8 q13, [%0]! \n" - "vld1.8 q15, [%0]! \n" + "vld1.8 {q11}, [%0]! \n" + "vld1.8 {q13}, [%0]! \n" + "vld1.8 {q15}, [%0]! \n" "vshl.u8 q8, q14, #6 \n" // Shift lower bit data // appropriately. "vshl.u8 q10, q14, #4 \n" @@ -804,7 +804,7 @@ void SplitRGBRow_NEON(const uint8_t* src_rgb, "+r"(dst_b), // %3 "+r"(width) // %4 : // Input registers - : "cc", "memory", "d0", "d1", "d2" // Clobber List + : "cc", "memory", "q0", "q1", "q2" // Clobber List ); } @@ -3845,7 +3845,7 @@ void SplitUVRow_16_NEON(const uint16_t* src_uv, "+r"(dst_v), // %2 "+r"(width) // %3 : "r"(shift) // %4 - : "cc", "memory", "q0", "q1", "q2", "q3", "q4"); + : "cc", "memory", "q0", "q1", "q2"); } void MergeUVRow_16_NEON(const uint16_t* src_u, diff --git a/libfenrir/src/main/jni/animation/libyuv/source/row_rvv.cc b/libfenrir/src/main/jni/animation/libyuv/source/row_rvv.cc index 893333216..be4c4a309 100644 --- a/libfenrir/src/main/jni/animation/libyuv/source/row_rvv.cc +++ b/libfenrir/src/main/jni/animation/libyuv/source/row_rvv.cc @@ -28,20 +28,20 @@ extern "C" { // Fill YUV -> RGB conversion constants into vectors // NOTE: To match behavior on other platforms, vxrm (fixed-point rounding mode -// register) is set to round-down mode(2). +// register) is set to round-to-nearest-up mode(0). #define YUVTORGB_SETUP(yuvconst, vl, v_ub, v_vr, v_ug, v_vg, v_yg, v_bb, v_bg, \ v_br) \ { \ - asm volatile("csrwi vxrm, 2"); \ + asm volatile("csrwi vxrm, 0"); \ vl = __riscv_vsetvl_e8m1(w); \ v_ub = __riscv_vmv_v_x_u8m1(yuvconst->kUVCoeff[0], vl); \ v_vr = __riscv_vmv_v_x_u8m1(yuvconst->kUVCoeff[1], vl); \ v_ug = __riscv_vmv_v_x_u8m1(yuvconst->kUVCoeff[2], vl); \ v_vg = __riscv_vmv_v_x_u8m1(yuvconst->kUVCoeff[3], vl); \ v_yg = __riscv_vmv_v_x_u16m2(yuvconst->kRGBCoeffBias[0], vl); \ - v_bb = __riscv_vmv_v_x_u16m2(yuvconst->kRGBCoeffBias[1], vl); \ - v_bg = __riscv_vmv_v_x_u16m2(yuvconst->kRGBCoeffBias[2], vl); \ - v_br = __riscv_vmv_v_x_u16m2(yuvconst->kRGBCoeffBias[3], vl); \ + v_bb = __riscv_vmv_v_x_u16m2(yuvconst->kRGBCoeffBias[1] + 32, vl); \ + v_bg = __riscv_vmv_v_x_u16m2(yuvconst->kRGBCoeffBias[2] - 32, vl); \ + v_br = __riscv_vmv_v_x_u16m2(yuvconst->kRGBCoeffBias[3] + 32, vl); \ } // Read [VLEN/8] Y, [VLEN/(8 * 2)] U and [VLEN/(8 * 2)] V from 422 @@ -485,23 +485,21 @@ void I400ToARGBRow_RVV(const uint8_t* src_y, vuint16m4_t v_yb; vuint16m4_t v_yg = __riscv_vmv_v_x_u16m4(yuvconstants->kRGBCoeffBias[0], vl); // To match behavior on other platforms, vxrm (fixed-point rounding mode - // register) sets to round-down mode(2). - asm volatile("csrwi vxrm, 2"); + // register) sets to round-to-nearest-up mode(0). + asm volatile("csrwi vxrm, 0"); if (is_yb_positive) { - v_yb = __riscv_vmv_v_x_u16m4(yuvconstants->kRGBCoeffBias[4], vl); + v_yb = __riscv_vmv_v_x_u16m4(yuvconstants->kRGBCoeffBias[4] - 32, vl); } else { - v_yb = __riscv_vmv_v_x_u16m4(-yuvconstants->kRGBCoeffBias[4], vl); + v_yb = __riscv_vmv_v_x_u16m4(-yuvconstants->kRGBCoeffBias[4] + 32, vl); } do { vuint8m2_t v_y, v_out; vuint16m4_t v_y_16, v_tmp0, v_tmp1, v_tmp2; - vuint32m8_t v_y1; vl = __riscv_vsetvl_e8m2(w); v_y = __riscv_vle8_v_u8m2(src_y, vl); v_y_16 = __riscv_vwaddu_vx_u16m4(v_y, 0, vl); v_tmp0 = __riscv_vmul_vx_u16m4(v_y_16, 0x0101, vl); // 257 * v_y - v_y1 = __riscv_vwmulu_vv_u32m8(v_tmp0, v_yg, vl); - v_tmp1 = __riscv_vnsrl_wx_u16m4(v_y1, 16, vl); + v_tmp1 = __riscv_vmulhu_vv_u16m4(v_tmp0, v_yg, vl); if (is_yb_positive) { v_tmp2 = __riscv_vsaddu_vv_u16m4(v_tmp1, v_yb, vl); } else { diff --git a/libfenrir/src/main/jni/animation/libyuv/source/scale.cc b/libfenrir/src/main/jni/animation/libyuv/source/scale.cc index 90abaefe8..591a6a938 100644 --- a/libfenrir/src/main/jni/animation/libyuv/source/scale.cc +++ b/libfenrir/src/main/jni/animation/libyuv/source/scale.cc @@ -820,9 +820,10 @@ static void ScaleAddCols2_C(int dst_width, int ix = x >> 16; x += dx; boxwidth = MIN1((x >> 16) - ix); - assert(((boxwidth - minboxwidth) == 0) || ((boxwidth - minboxwidth) == 1)); + int scaletbl_index = boxwidth - minboxwidth; + assert((scaletbl_index == 0) || (scaletbl_index == 1)); *dst_ptr++ = (uint8_t)(SumPixels(boxwidth, src_ptr + ix) * - scaletbl[boxwidth - minboxwidth] >> + scaletbl[scaletbl_index] >> 16); } } @@ -843,10 +844,10 @@ static void ScaleAddCols2_16_C(int dst_width, int ix = x >> 16; x += dx; boxwidth = MIN1((x >> 16) - ix); - assert(((boxwidth - minboxwidth) == 0) || ((boxwidth - minboxwidth) == 1)); - *dst_ptr++ = SumPixels_16(boxwidth, src_ptr + ix) * - scaletbl[boxwidth - minboxwidth] >> - 16; + int scaletbl_index = boxwidth - minboxwidth; + assert((scaletbl_index == 0) || (scaletbl_index == 1)); + *dst_ptr++ = + SumPixels_16(boxwidth, src_ptr + ix) * scaletbl[scaletbl_index] >> 16; } } diff --git a/libfenrir/src/main/jni/rlottie/rlottie-master.zip b/libfenrir/src/main/jni/rlottie/rlottie-master.zip index 4e879b73c528cf510d309b60ebaaaf27add1319e..9366bf958f2d6fbbc9c28361aa190f41a73367af 100644 GIT binary patch delta 62113 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

I|Hso)+`v^3Rrg1axBW%+!)*JcbkA;azVMw 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 delta 62411 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 Tm6Eo!m9~width() != surface.width() || + mSurfaceCache.get_layer_surface()->height() != surface.height()); + + if (!isLayerSurfaceCreated || isLayerSurfaceSizeChanged) { + if (isLayerSurfaceCreated && isLayerSurfaceSizeChanged) + mSurfaceCache.delete_layer_surface(); + + mSurfaceCache.create_layer_surface(surface.width(), surface.height(), + VBitmap::Format::ARGB32_Premultiplied); + + // set layer draw region + mSurfaceCache.get_layer_painter()->setDrawRegion( + VRect(int(surface.drawRegionPosX()), int(surface.drawRegionPosY()), + int(surface.drawRegionWidth()), int(surface.drawRegionHeight()))); + } + mRootLayer->render(&painter, {}, {}, mSurfaceCache); painter.end(); return true; @@ -217,7 +239,7 @@ void renderer::Mask::preprocess(const VRect &clip) } void renderer::Layer::render(VPainter *painter, const VRle &inheritMask, - const VRle &matteRle, SurfaceCache &) + const VRle &matteRle, SurfaceCache &cache) { auto renderlist = renderList(); @@ -233,31 +255,42 @@ void renderer::Layer::render(VPainter *painter, const VRle &inheritMask, mask = inheritMask; } + VPainter *usedPainter = painter; + + if (cache.get_layer_painter() != nullptr) { + usedPainter = cache.get_layer_painter(); + usedPainter->begin(cache.get_layer_surface(), true); + } + for (auto &i : renderlist) { - painter->setBrush(i->mBrush); + usedPainter->setBrush(i->mBrush); VRle rle = i->rle(); if (matteRle.empty()) { if (mask.empty()) { // no mask no matte - painter->drawRle(VPoint(), rle); + usedPainter->drawRle(VPoint(), rle); } else { // only mask - painter->drawRle(rle, mask); + usedPainter->drawRle(rle, mask); } - } else { if (!mask.empty()) rle = rle & mask; if (rle.empty()) continue; if (matteType() == model::MatteType::AlphaInv) { rle = rle - matteRle; - painter->drawRle(VPoint(), rle); + usedPainter->drawRle(VPoint(), rle); } else { // render with matteRle as clip. - painter->drawRle(rle, matteRle); + usedPainter->drawRle(rle, matteRle); } } } + + if (cache.get_layer_painter() != nullptr) { + usedPainter->end(); + painter->drawBitmap(VPoint(), *cache.get_layer_surface(), mCombinedAlpha * 255.0f); + } } void renderer::LayerMask::preprocess(const VRect &clip) @@ -977,7 +1010,7 @@ void renderer::Group::update(int frameNo, const VMatrix &parentMatrix, mMatrix = m; - alpha = parentAlpha * mModel.transform()->opacity(frameNo); + alpha = mModel.transform()->opacity(frameNo); if (!vCompare(alpha, parentAlpha)) { newFlag |= DirtyFlagBit::Alpha; } @@ -1303,9 +1336,9 @@ renderer::Stroke::Stroke(model::Stroke *data) static vthread_local std::vector Dash_Vector; bool renderer::Stroke::updateContent(int frameNo, const VMatrix &matrix, - float alpha) + float) { - auto combinedAlpha = alpha * mModel.opacity(frameNo); + auto combinedAlpha = mModel.opacity(frameNo); auto color = mModel.color(frameNo).toColor(combinedAlpha); VBrush brush(color); diff --git a/libfenrir/src/main/jni/rlottie/src/lottie/lottieitem.h b/libfenrir/src/main/jni/rlottie/src/lottie/lottieitem.h index 1be7694b1..0628bdc9f 100644 --- a/libfenrir/src/main/jni/rlottie/src/lottie/lottieitem.h +++ b/libfenrir/src/main/jni/rlottie/src/lottie/lottieitem.h @@ -106,9 +106,31 @@ class SurfaceCache { } void release_surface(VBitmap &surface) { mCache.push_back(surface); } + bool is_layer_surface_created() const { return mIsLayerBitmapCreated; } + void create_layer_surface(size_t width, size_t height, VBitmap::Format format) + { + if (mIsLayerBitmapCreated) return; + + mLayerBitmap = std::make_unique(width, height, format); + mBitmapPainter = std::make_unique(mLayerBitmap.get(), true); + mIsLayerBitmapCreated = true; + } + void delete_layer_surface() + { + if (!mIsLayerBitmapCreated) return; + + mLayerBitmap.reset(); + mBitmapPainter.reset(); + mIsLayerBitmapCreated = false; + } + VPainter* get_layer_painter() const { return mBitmapPainter.get(); } + VBitmap* get_layer_surface() const { return mLayerBitmap.get(); } private: std::vector mCache; + std::unique_ptr mLayerBitmap{nullptr}; + std::unique_ptr mBitmapPainter{nullptr}; + bool mIsLayerBitmapCreated{false}; }; class Drawable final : public VDrawable { diff --git a/libfenrir/src/main/jni/thorvg/src/lib/sw_engine/tvgSwRasterAvx.h b/libfenrir/src/main/jni/thorvg/src/lib/sw_engine/tvgSwRasterAvx.h index cf658a6ab..59a83ab06 100644 --- a/libfenrir/src/main/jni/thorvg/src/lib/sw_engine/tvgSwRasterAvx.h +++ b/libfenrir/src/main/jni/thorvg/src/lib/sw_engine/tvgSwRasterAvx.h @@ -94,7 +94,7 @@ static bool avxRasterTranslucentRect(SwSurface* surface, const SwBBox& region, u auto h = static_cast(region.max.y - region.min.y); auto w = static_cast(region.max.x - region.min.x); - auto ialpha = 255 - static_cast(_alpha(color)); + uint32_t ialpha = 255 - a; auto avxColor = _mm_set1_epi32(color); auto avxIalpha = _mm_set1_epi8(ialpha); @@ -148,7 +148,7 @@ static bool avxRasterTranslucentRle(SwSurface* surface, const SwRleData* rle, ui if (span->coverage < 255) src = ALPHA_BLEND(color, span->coverage); else src = color; - auto ialpha = 255 - static_cast(_alpha(src)); + auto ialpha = _ialpha(src); //1. fill the not aligned memory (for 128-bit registers a 16-bytes alignment is required) auto notAligned = ((uintptr_t)dst & 0xf) / 4; diff --git a/viewpager2/src/main/java/androidx/recyclerview/widget/AsyncDifferConfig.java b/viewpager2/src/main/java/androidx/recyclerview/widget/AsyncDifferConfig.java index 7a102fdba..ccd9cfae6 100644 --- a/viewpager2/src/main/java/androidx/recyclerview/widget/AsyncDifferConfig.java +++ b/viewpager2/src/main/java/androidx/recyclerview/widget/AsyncDifferConfig.java @@ -50,6 +50,7 @@ public final class AsyncDifferConfig { mDiffCallback = diffCallback; } + /** @hide */ @SuppressWarnings("WeakerAccess") @RestrictTo(RestrictTo.Scope.LIBRARY) @Nullable @@ -93,6 +94,7 @@ public Builder(@NonNull DiffUtil.ItemCallback diffCallback) { * @param executor The executor which can run tasks in the UI thread. * @return this * + * @hide */ @RestrictTo(RestrictTo.Scope.LIBRARY) @NonNull diff --git a/viewpager2/src/main/java/androidx/recyclerview/widget/GridLayoutManager.java b/viewpager2/src/main/java/androidx/recyclerview/widget/GridLayoutManager.java index 1534330c0..84d11622e 100644 --- a/viewpager2/src/main/java/androidx/recyclerview/widget/GridLayoutManager.java +++ b/viewpager2/src/main/java/androidx/recyclerview/widget/GridLayoutManager.java @@ -17,7 +17,6 @@ import android.content.Context; import android.graphics.Rect; -import android.os.Bundle; import android.util.AttributeSet; import android.util.Log; import android.util.SparseIntArray; @@ -26,7 +25,6 @@ import android.widget.GridView; import androidx.annotation.NonNull; -import androidx.annotation.Nullable; import androidx.core.view.accessibility.AccessibilityNodeInfoCompat; import java.util.Arrays; @@ -42,7 +40,6 @@ public class GridLayoutManager extends LinearLayoutManager { private static final boolean DEBUG = false; private static final String TAG = "GridLayoutManager"; public static final int DEFAULT_SPAN_COUNT = -1; - /** * Span size have been changed but we've not done a new layout calculation. */ @@ -122,7 +119,7 @@ public void setStackFromEnd(boolean stackFromEnd) { public int getRowCountForAccessibility(RecyclerView.Recycler recycler, RecyclerView.State state) { if (mOrientation == HORIZONTAL) { - return Math.min(mSpanCount, getItemCount()); + return mSpanCount; } if (state.getItemCount() < 1) { return 0; @@ -136,7 +133,7 @@ public int getRowCountForAccessibility(RecyclerView.Recycler recycler, public int getColumnCountForAccessibility(RecyclerView.Recycler recycler, RecyclerView.State state) { if (mOrientation == VERTICAL) { - return Math.min(mSpanCount, getItemCount()); + return mSpanCount; } if (state.getItemCount() < 1) { return 0; @@ -177,57 +174,6 @@ public void onInitializeAccessibilityNodeInfo(@NonNull RecyclerView.Recycler rec info.setClassName(GridView.class.getName()); } - @Override - boolean performAccessibilityAction(int action, @Nullable Bundle args) { - if (action == android.R.id.accessibilityActionScrollToPosition) { - final int noRow = -1; - final int noColumn = -1; - if (args != null) { - int rowArg = args.getInt(AccessibilityNodeInfoCompat.ACTION_ARGUMENT_ROW_INT, - noRow); - int columnArg = args.getInt(AccessibilityNodeInfoCompat.ACTION_ARGUMENT_COLUMN_INT, - noColumn); - - if (rowArg == noRow || columnArg == noColumn) { - return false; - } - - int itemCount = mRecyclerView.mAdapter.getItemCount(); - - int position = -1; - for (int i = 0; i < itemCount; i++) { - // Corresponds to a column value if the orientation is VERTICAL and a row value - // if the orientation is HORIZONTAL - int spanIndex = getSpanIndex(mRecyclerView.mRecycler, mRecyclerView.mState, i); - - // Corresponds to a row value if the orientation is VERTICAL and a column value - // if the orientation is HORIZONTAL - int spanGroupIndex = getSpanGroupIndex(mRecyclerView.mRecycler, - mRecyclerView.mState, i); - - if (mOrientation == VERTICAL) { - if (spanIndex == columnArg && spanGroupIndex == rowArg) { - position = i; - break; - } - } else { // horizontal - if (spanIndex == rowArg && spanGroupIndex == columnArg) { - position = i; - break; - } - } - } - - if (position > -1) { - scrollToPositionWithOffset(position, 0); - return true; - } - return false; - } - } - return super.performAccessibilityAction(action, args); - } - @Override public void onLayoutChildren(RecyclerView.Recycler recycler, RecyclerView.State state) { if (state.isPreLayout()) { @@ -1018,9 +964,6 @@ int getCachedSpanGroupIndex(int position, int spanCount) { /** * Returns the final span index of the provided position. *

- * If {@link #getOrientation()} is {@link #VERTICAL}, this is a column value. - * If {@link #getOrientation()} is {@link #HORIZONTAL}, this is a row value. - *

* If you have a faster way to calculate span index for your items, you should override * this method. Otherwise, you should enable span index cache * ({@link #setSpanIndexCacheEnabled(boolean)}) for better performance. When caching is @@ -1097,9 +1040,6 @@ static int findFirstKeyLessThan(SparseIntArray cache, int position) { /** * Returns the index of the group this position belongs. *

- * If {@link #getOrientation()} is {@link #VERTICAL}, this is a row value. - * If {@link #getOrientation()} is {@link #HORIZONTAL}, this is a column value. - *

* For example, if grid has 3 columns and each item occupies 1 span, span group index * for item 1 will be 0, item 5 will be 1. * @@ -1506,4 +1446,5 @@ public int getSpanSize() { return mSpanSize; } } -} \ No newline at end of file + +} diff --git a/viewpager2/src/main/java/androidx/recyclerview/widget/LinearLayoutManager.java b/viewpager2/src/main/java/androidx/recyclerview/widget/LinearLayoutManager.java index 3a3f1728e..b28479f0c 100644 --- a/viewpager2/src/main/java/androidx/recyclerview/widget/LinearLayoutManager.java +++ b/viewpager2/src/main/java/androidx/recyclerview/widget/LinearLayoutManager.java @@ -19,8 +19,6 @@ import android.annotation.SuppressLint; import android.content.Context; import android.graphics.PointF; -import android.os.Build; -import android.os.Bundle; import android.os.Parcelable; import android.util.AttributeSet; import android.util.Log; @@ -29,10 +27,7 @@ import android.view.accessibility.AccessibilityEvent; import androidx.annotation.NonNull; -import androidx.annotation.Nullable; import androidx.core.view.ViewCompat; -import androidx.core.view.accessibility.AccessibilityNodeInfoCompat; -import androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat; import androidx.tracing.Trace; import java.util.List; @@ -261,56 +256,6 @@ public void onInitializeAccessibilityEvent(AccessibilityEvent event) { } } - @Override - public void onInitializeAccessibilityNodeInfo(@NonNull RecyclerView.Recycler recycler, - @NonNull RecyclerView.State state, @NonNull AccessibilityNodeInfoCompat info) { - super.onInitializeAccessibilityNodeInfo(recycler, state, info); - // TODO(b/251823537) - if (mRecyclerView.mAdapter != null && mRecyclerView.mAdapter.getItemCount() > 0) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - info.addAction(AccessibilityActionCompat.ACTION_SCROLL_TO_POSITION); - } - } - } - - @Override - boolean performAccessibilityAction(int action, @Nullable Bundle args) { - if (super.performAccessibilityAction(action, args)) { - return true; - } - - if (action == android.R.id.accessibilityActionScrollToPosition && args != null) { - int position = -1; - - if (mOrientation == VERTICAL) { - final int rowArg = args.getInt( - AccessibilityNodeInfoCompat.ACTION_ARGUMENT_ROW_INT, -1); - if (rowArg < 0) { - return false; - } - position = Math.min(rowArg, getRowCountForAccessibility(mRecyclerView.mRecycler, - mRecyclerView.mState) - 1); - } else { // horizontal - final int columnArg = args.getInt( - AccessibilityNodeInfoCompat.ACTION_ARGUMENT_COLUMN_INT, -1); - if (columnArg < 0) { - return false; - } - position = Math.min(columnArg, - getColumnCountForAccessibility(mRecyclerView.mRecycler, - mRecyclerView.mState) - 1); - } - if (position >= 0) { - // We want the target element to be the first on screen. That way, a - // screenreader like Talkback can directly focus on it as part of its default focus - // logic. - scrollToPositionWithOffset(position, 0); - return true; - } - } - return false; - } - @Override @SuppressLint("UnknownNullness") // b/240775049: Cannot annotate properly public Parcelable onSaveInstanceState() { diff --git a/viewpager2/src/main/java/androidx/recyclerview/widget/RecyclerView.java b/viewpager2/src/main/java/androidx/recyclerview/widget/RecyclerView.java index e1264963a..42e95d456 100644 --- a/viewpager2/src/main/java/androidx/recyclerview/widget/RecyclerView.java +++ b/viewpager2/src/main/java/androidx/recyclerview/widget/RecyclerView.java @@ -283,20 +283,9 @@ public class RecyclerView extends ViewGroup implements ScrollingView, */ private static final float FLING_DESTRETCH_FACTOR = 4f; - /** - * A {@link android.content.pm.PackageManager} feature specifying if a device's rotary encoder - * has low resolution. Low resolution rotary encoders produce small number of - * {@link MotionEvent}s per a 360 degree rotation, meaning that each {@link MotionEvent} has - * large scroll values, which make {@link #scrollBy(int, int)} calls feel broken (due to the - * fact that each event produces large scrolls, and scrolling with large pixels causes a visible - * jump that does not feel smooth). As such, we will try adjusting our handling of generic - * motion caused by such low resolution rotary encoders differently to make the scrolling - * experience smooth. - */ - static final String LOW_RES_ROTARY_ENCODER_FEATURE = "android.hardware.rotaryencoder.lowres"; - static final boolean DISPATCH_TEMP_DETACH = false; + /** @hide */ @RestrictTo(LIBRARY_GROUP_PREFIX) @IntDef({HORIZONTAL, VERTICAL}) @Retention(RetentionPolicy.SOURCE) @@ -695,12 +684,6 @@ public void run() { private int mLastAutoMeasureNonExactMeasuredWidth = 0; private int mLastAutoMeasureNonExactMeasuredHeight = 0; - /** - * Whether or not the device has {@link #LOW_RES_ROTARY_ENCODER_FEATURE}. Computed once and - * cached, since it's a static value that would not change on consecutive calls. - */ - @VisibleForTesting boolean mLowResRotaryEncoderFeature; - /** * The callback to convert view info diffs into animations. */ @@ -811,9 +794,6 @@ public RecyclerView(@NonNull Context context, @Nullable AttributeSet attrs, int } a.recycle(); - mLowResRotaryEncoderFeature = - context.getPackageManager().hasSystemFeature(LOW_RES_ROTARY_ENCODER_FEATURE); - // Create the layoutManager if specified. createLayoutManager(context, layoutManagerName, attrs, defStyleAttr, 0); @@ -2184,12 +2164,6 @@ boolean scrollByInternal(int x, int y, MotionEvent ev, int type) { if (getOverScrollMode() != View.OVER_SCROLL_NEVER) { if (ev != null && !MotionEventCompat.isFromSource(ev, InputDevice.SOURCE_MOUSE)) { pullGlows(ev.getX(), unconsumedX, ev.getY(), unconsumedY); - // For rotary encoders, we release stretch EdgeEffects after they are pulled, to - // avoid the effects being stuck pulled. - if (Build.VERSION.SDK_INT >= 31 - && MotionEventCompat.isFromSource(ev, InputDevice.SOURCE_ROTARY_ENCODER)) { - releaseGlows(); - } } considerReleasingGlowsOnScroll(x, y); } @@ -2284,7 +2258,7 @@ private int releaseVerticalGlow(int deltaY, float x) { /** *

Compute the horizontal offset of the horizontal scrollbar's thumb within the horizontal - * range. This value is used to compute the position of the thumb within the scrollbar's track. + * range. This value is used to compute the length of the thumb within the scrollbar's track. *

* *

The range is expressed in arbitrary units that must be the same as the units used by @@ -2345,7 +2319,7 @@ public int computeHorizontalScrollExtent() { * {@link RecyclerView.LayoutManager#computeHorizontalScrollRange(RecyclerView.State)} in your * LayoutManager.

* - * @return The total horizontal range represented by the horizontal scrollbar + * @return The total horizontal range represented by the vertical scrollbar * @see RecyclerView.LayoutManager#computeHorizontalScrollRange(RecyclerView.State) */ @Override @@ -2358,7 +2332,7 @@ public int computeHorizontalScrollRange() { /** *

Compute the vertical offset of the vertical scrollbar's thumb within the vertical range. - * This value is used to compute the position of the thumb within the scrollbar's track.

+ * This value is used to compute the length of the thumb within the scrollbar's track.

* *

The range is expressed in arbitrary units that must be the same as the units used by * {@link #computeVerticalScrollRange()} and {@link #computeVerticalScrollExtent()}.

@@ -3960,8 +3934,6 @@ public boolean onGenericMotionEvent(MotionEvent event) { if (mLayoutSuppressed) { return false; } - - boolean useSmoothScroll = false; if (event.getAction() == MotionEvent.ACTION_SCROLL) { final float vScroll, hScroll; if ((event.getSource() & InputDeviceCompat.SOURCE_CLASS_POINTER) != 0) { @@ -3991,25 +3963,14 @@ public boolean onGenericMotionEvent(MotionEvent event) { vScroll = 0f; hScroll = 0f; } - // Use smooth scrolling for low resolution rotary encoders to avoid the visible - // pixel jumps that would be caused by doing regular scrolling. - useSmoothScroll = mLowResRotaryEncoderFeature; } else { vScroll = 0f; hScroll = 0f; } - int scaledVScroll = (int) (vScroll * mScaledVerticalScrollFactor); - int scaledHScroll = (int) (hScroll * mScaledHorizontalScrollFactor); - if (useSmoothScroll) { - OverScroller overScroller = mViewFlinger.mOverScroller; - // Account for any remaining scroll from a previous generic motion event. - scaledVScroll += overScroller.getFinalY() - overScroller.getCurrY(); - scaledHScroll += overScroller.getFinalX() - overScroller.getCurrX(); - smoothScrollBy(scaledHScroll, scaledVScroll, /* interpolator= */ null, - UNDEFINED_DURATION, /* withNestedScrolling= */ true); - } else { - nestedScrollByInternal(scaledHScroll, scaledVScroll, event, TYPE_NON_TOUCH); + if (vScroll != 0 || hScroll != 0) { + nestedScrollByInternal((int) (hScroll * mScaledHorizontalScrollFactor), + (int) (vScroll * mScaledVerticalScrollFactor), event, TYPE_NON_TOUCH); } } return false; @@ -4976,7 +4937,7 @@ void markItemDecorInsetsDirty() { } @Override - public void draw(@NonNull Canvas c) { + public void draw(Canvas c) { super.draw(c); final int count = mItemDecorations.size(); @@ -5037,7 +4998,7 @@ public void draw(@NonNull Canvas c) { } @Override - public void onDraw(@NonNull Canvas c) { + public void onDraw(Canvas c) { super.onDraw(c); final int count = mItemDecorations.size(); @@ -5577,7 +5538,7 @@ public View findChildViewUnder(float x, float y) { } @Override - public boolean drawChild(@NonNull Canvas canvas, View child, long drawingTime) { + public boolean drawChild(Canvas canvas, View child, long drawingTime) { return super.drawChild(canvas, child, drawingTime); } @@ -11015,7 +10976,7 @@ public int computeHorizontalScrollOffset(@NonNull State state) { *

Default implementation returns 0.

* * @param state Current State of RecyclerView where you can find total item count - * @return The total horizontal range represented by the horizontal scrollbar + * @return The total horizontal range represented by the vertical scrollbar * @see RecyclerView#computeHorizontalScrollRange() */ public int computeHorizontalScrollRange(@NonNull State state) { @@ -11299,12 +11260,6 @@ void onInitializeAccessibilityNodeInfoForItem(View host, AccessibilityNodeInfoCo public void onInitializeAccessibilityNodeInfoForItem(@NonNull Recycler recycler, @NonNull State state, @NonNull View host, @NonNull AccessibilityNodeInfoCompat info) { - int rowIndexGuess = canScrollVertically() ? getPosition(host) : 0; - int columnIndexGuess = canScrollHorizontally() ? getPosition(host) : 0; - final AccessibilityNodeInfoCompat.CollectionItemInfoCompat itemInfo = - AccessibilityNodeInfoCompat.CollectionItemInfoCompat.obtain(rowIndexGuess, 1, - columnIndexGuess, 1, false, false); - info.setCollectionItemInfo(itemInfo); } /** @@ -11353,10 +11308,7 @@ public int getSelectionModeForAccessibility(@NonNull Recycler recycler, * @return The number of rows in LayoutManager for accessibility. */ public int getRowCountForAccessibility(@NonNull Recycler recycler, @NonNull State state) { - if (mRecyclerView == null || mRecyclerView.mAdapter == null) { - return 1; - } - return canScrollVertically() ? mRecyclerView.mAdapter.getItemCount() : 1; + return -1; } /** @@ -11373,10 +11325,7 @@ public int getRowCountForAccessibility(@NonNull Recycler recycler, @NonNull Stat */ public int getColumnCountForAccessibility(@NonNull Recycler recycler, @NonNull State state) { - if (mRecyclerView == null || mRecyclerView.mAdapter == null) { - return 1; - } - return canScrollHorizontally() ? mRecyclerView.mAdapter.getItemCount() : 1; + return -1; } /** @@ -13298,6 +13247,7 @@ public void notifyItemMoved(int fromPosition, int toPosition) { /** * This is public so that the CREATOR can be accessed on cold launch. * + * @hide */ @RestrictTo(LIBRARY) public static class SavedState extends AbsSavedState { diff --git a/viewpager2/src/main/java/androidx/recyclerview/widget/StaggeredGridLayoutManager.java b/viewpager2/src/main/java/androidx/recyclerview/widget/StaggeredGridLayoutManager.java index 63ce8e4fb..19e5f832e 100644 --- a/viewpager2/src/main/java/androidx/recyclerview/widget/StaggeredGridLayoutManager.java +++ b/viewpager2/src/main/java/androidx/recyclerview/widget/StaggeredGridLayoutManager.java @@ -32,7 +32,6 @@ import androidx.annotation.Nullable; import androidx.annotation.RestrictTo; import androidx.core.view.ViewCompat; -import androidx.core.view.accessibility.AccessibilityNodeInfoCompat; import java.util.ArrayList; import java.util.Arrays; @@ -1283,36 +1282,6 @@ public Parcelable onSaveInstanceState() { return state; } - @Override - public void onInitializeAccessibilityNodeInfo(@NonNull RecyclerView.Recycler recycler, - @NonNull RecyclerView.State state, @NonNull AccessibilityNodeInfoCompat info) { - super.onInitializeAccessibilityNodeInfo(recycler, state, info); - // Setting the classname allows accessibility services to set a role for staggered grids - // and ensures that they are treated distinctly from canonical grids with clear row/column - // semantics. - info.setClassName("androidx.recyclerview.widget.StaggeredGridLayoutManager"); - } - - @Override - public void onInitializeAccessibilityNodeInfoForItem(@NonNull RecyclerView.Recycler recycler, - @NonNull RecyclerView.State state, @NonNull View host, - @NonNull AccessibilityNodeInfoCompat info) { - ViewGroup.LayoutParams lp = host.getLayoutParams(); - if (!(lp instanceof LayoutParams)) { - super.onInitializeAccessibilityNodeInfoForItem(host, info); - return; - } - LayoutParams sglp = (LayoutParams) lp; - if (mOrientation == HORIZONTAL) { - info.setCollectionItemInfo(AccessibilityNodeInfoCompat.CollectionItemInfoCompat.obtain( - sglp.getSpanIndex(), sglp.mFullSpan ? mSpanCount : 1, - -1, -1, false, false)); - } else { // VERTICAL - info.setCollectionItemInfo(AccessibilityNodeInfoCompat.CollectionItemInfoCompat.obtain( - -1, -1, - sglp.getSpanIndex(), sglp.mFullSpan ? mSpanCount : 1, false, false)); - } - } @Override public void onInitializeAccessibilityEvent(AccessibilityEvent event) { super.onInitializeAccessibilityEvent(event); @@ -1345,24 +1314,6 @@ int findFirstVisibleItemPositionInt() { return first == null ? RecyclerView.NO_POSITION : getPosition(first); } - @Override - public int getRowCountForAccessibility(@NonNull RecyclerView.Recycler recycler, - @NonNull RecyclerView.State state) { - if (mOrientation == HORIZONTAL) { - return Math.min(mSpanCount, state.getItemCount()); - } - return -1; - } - - @Override - public int getColumnCountForAccessibility(@NonNull RecyclerView.Recycler recycler, - @NonNull RecyclerView.State state) { - if (mOrientation == VERTICAL) { - return Math.min(mSpanCount, state.getItemCount()); - } - return -1; - } - /** * This is for internal use. Not necessarily the child closest to start but the first child * we find that matches the criteria. @@ -2120,6 +2071,7 @@ public void scrollToPositionWithOffset(int position, int offset) { requestLayout(); } + /** @hide */ @Override @RestrictTo(LIBRARY) public void collectAdjacentPrefetchPositions(int dx, int dy, RecyclerView.State state,