├── .github └── FUNDING.yml ├── .gitignore ├── .travis.yml ├── CONTRIBUTING.md ├── ISSUE_TEMPLATE.md ├── LICENSE.txt ├── README.md ├── app ├── .gitignore ├── build.gradle ├── proguard-rules.pro ├── schemas │ └── com.keylesspalace.tusky.db.AppDatabase │ │ ├── 10.json │ │ ├── 11.json │ │ ├── 12.json │ │ ├── 13.json │ │ ├── 14.json │ │ ├── 15.json │ │ ├── 16.json │ │ ├── 17.json │ │ ├── 18.json │ │ ├── 19.json │ │ ├── 20.json │ │ ├── 21.json │ │ ├── 22.json │ │ ├── 23.json │ │ ├── 24.json │ │ ├── 25.json │ │ ├── 26.json │ │ └── 27.json └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── keylesspalace │ │ └── tusky │ │ ├── ExampleInstrumentedTest.java │ │ ├── MigrationsTest.kt │ │ └── TimelineDAOTest.kt │ ├── blue │ └── res │ │ ├── mipmap-anydpi-v26 │ │ └── ic_launcher.xml │ │ ├── mipmap-hdpi │ │ ├── ic_launcher.png │ │ └── ic_shortcut_compose.png │ │ ├── mipmap-mdpi │ │ ├── ic_launcher.png │ │ └── ic_shortcut_compose.png │ │ ├── mipmap-xhdpi │ │ ├── ic_launcher.png │ │ └── ic_shortcut_compose.png │ │ ├── mipmap-xxhdpi │ │ ├── ic_launcher.png │ │ └── ic_shortcut_compose.png │ │ └── mipmap-xxxhdpi │ │ ├── ic_launcher.png │ │ └── ic_shortcut_compose.png │ ├── green │ └── res │ │ ├── mipmap-anydpi-v26 │ │ └── ic_launcher.xml │ │ ├── mipmap-hdpi │ │ └── ic_launcher.png │ │ ├── mipmap-mdpi │ │ └── ic_launcher.png │ │ ├── mipmap-xhdpi │ │ └── ic_launcher.png │ │ ├── mipmap-xxhdpi │ │ └── ic_launcher.png │ │ └── mipmap-xxxhdpi │ │ └── ic_launcher.png │ ├── husky │ └── res │ │ ├── values-ar │ │ ├── husky_generated.xml │ │ └── strings.xml │ │ ├── values-ber │ │ └── husky_generated.xml │ │ ├── values-bn-rBD │ │ └── husky_generated.xml │ │ ├── values-bn-rIN │ │ └── husky_generated.xml │ │ ├── values-ca │ │ ├── husky_generated.xml │ │ └── strings.xml │ │ ├── values-ckb │ │ └── husky_generated.xml │ │ ├── values-cs │ │ └── husky_generated.xml │ │ ├── values-cy │ │ └── husky_generated.xml │ │ ├── values-de │ │ ├── husky_generated.xml │ │ └── strings.xml │ │ ├── values-en-rAU │ │ └── husky_generated.xml │ │ ├── values-en-rGB │ │ ├── husky_generated.xml │ │ └── strings.xml │ │ ├── values-eo │ │ └── husky_generated.xml │ │ ├── values-es │ │ ├── husky_generated.xml │ │ └── strings.xml │ │ ├── values-eu │ │ └── husky_generated.xml │ │ ├── values-fa │ │ └── husky_generated.xml │ │ ├── values-fr │ │ ├── husky_generated.xml │ │ └── strings.xml │ │ ├── values-ga │ │ └── husky_generated.xml │ │ ├── values-gd │ │ └── husky_generated.xml │ │ ├── values-hi │ │ ├── husky_generated.xml │ │ └── strings.xml │ │ ├── values-hu │ │ └── husky_generated.xml │ │ ├── values-is │ │ └── husky_generated.xml │ │ ├── values-it │ │ └── husky_generated.xml │ │ ├── values-ja │ │ ├── husky_generated.xml │ │ └── strings.xml │ │ ├── values-kab │ │ └── husky_generated.xml │ │ ├── values-ko │ │ └── husky_generated.xml │ │ ├── values-ml │ │ └── husky_generated.xml │ │ ├── values-nb-rNO │ │ └── strings.xml │ │ ├── values-nl │ │ └── husky_generated.xml │ │ ├── values-nn │ │ └── strings.xml │ │ ├── values-no-rNB │ │ └── husky_generated.xml │ │ ├── values-oc │ │ └── husky_generated.xml │ │ ├── values-pa │ │ └── husky_generated.xml │ │ ├── values-pl │ │ ├── husky_generated.xml │ │ └── strings.xml │ │ ├── values-pt-rBR │ │ ├── husky_generated.xml │ │ └── strings.xml │ │ ├── values-pt-rPT │ │ └── strings.xml │ │ ├── values-ru │ │ ├── husky_generated.xml │ │ └── strings.xml │ │ ├── values-sa │ │ └── husky_generated.xml │ │ ├── values-sk │ │ └── husky_generated.xml │ │ ├── values-sl │ │ └── husky_generated.xml │ │ ├── values-sv │ │ ├── husky_generated.xml │ │ └── strings.xml │ │ ├── values-ta │ │ └── husky_generated.xml │ │ ├── values-te │ │ └── husky_generated.xml │ │ ├── values-th │ │ ├── husky_generated.xml │ │ └── strings.xml │ │ ├── values-tr │ │ ├── husky_generated.xml │ │ └── strings.xml │ │ ├── values-uk │ │ ├── husky_generated.xml │ │ └── strings.xml │ │ ├── values-vi │ │ └── husky_generated.xml │ │ ├── values-zh-rCN │ │ └── husky_generated.xml │ │ ├── values-zh-rHK │ │ └── husky_generated.xml │ │ ├── values-zh-rMO │ │ └── husky_generated.xml │ │ ├── values-zh-rSG │ │ └── husky_generated.xml │ │ ├── values-zh-rTW │ │ └── husky_generated.xml │ │ └── values │ │ ├── donottranslate.xml │ │ ├── husky_donottranslate.xml │ │ ├── husky_generated.xml │ │ └── strings.xml │ ├── main │ ├── AndroidManifest.xml │ ├── ic_bbcode.svg │ ├── ic_html.svg │ ├── ic_launcher-web.png │ ├── ic_launcher.svg │ ├── ic_launcher_.svg │ ├── ic_launcher_foreground.svg │ ├── ic_sticker.svg │ ├── java │ │ └── com │ │ │ └── keylesspalace │ │ │ └── tusky │ │ │ ├── AboutActivity.kt │ │ │ ├── AccountActivity.kt │ │ │ ├── AccountListActivity.kt │ │ │ ├── AccountsInListFragment.kt │ │ │ ├── BaseActivity.java │ │ │ ├── BottomSheetActivity.kt │ │ │ ├── EditProfileActivity.kt │ │ │ ├── FiltersActivity.kt │ │ │ ├── LicenseActivity.kt │ │ │ ├── ListsActivity.kt │ │ │ ├── LoginActivity.kt │ │ │ ├── MainActivity.kt │ │ │ ├── ModalTimelineActivity.kt │ │ │ ├── SavedTootActivity.java │ │ │ ├── SplashActivity.kt │ │ │ ├── StatusListActivity.kt │ │ │ ├── TabData.kt │ │ │ ├── TabPreferenceActivity.kt │ │ │ ├── TuskyApplication.kt │ │ │ ├── ViewMediaActivity.kt │ │ │ ├── ViewTagActivity.java │ │ │ ├── ViewThreadActivity.java │ │ │ ├── adapter │ │ │ ├── AccountAdapter.java │ │ │ ├── AccountFieldAdapter.kt │ │ │ ├── AccountFieldEditAdapter.kt │ │ │ ├── AccountSelectionAdapter.kt │ │ │ ├── AccountViewHolder.java │ │ │ ├── AddPollOptionsAdapter.kt │ │ │ ├── BlocksAdapter.java │ │ │ ├── ChatMessagesAdapter.kt │ │ │ ├── ChatsAdapter.kt │ │ │ ├── EmojiAdapter.kt │ │ │ ├── EmojiReactionsAdapter.java │ │ │ ├── FollowAdapter.java │ │ │ ├── FollowRequestViewHolder.kt │ │ │ ├── FollowRequestsAdapter.java │ │ │ ├── HashtagViewHolder.kt │ │ │ ├── ListSelectionAdapter.kt │ │ │ ├── LoadingFooterViewHolder.kt │ │ │ ├── MutedStatusViewHolder.java │ │ │ ├── MutesAdapter.java │ │ │ ├── NetworkStateViewHolder.kt │ │ │ ├── NotificationsAdapter.java │ │ │ ├── PlaceholderViewHolder.java │ │ │ ├── PollAdapter.kt │ │ │ ├── PreviewPollOptionsAdapter.kt │ │ │ ├── SavedTootAdapter.java │ │ │ ├── SingleViewHolder.java │ │ │ ├── StatusBaseViewHolder.java │ │ │ ├── StatusDetailedViewHolder.java │ │ │ ├── StatusViewHolder.java │ │ │ ├── StickerAdapater.kt │ │ │ ├── TabAdapter.kt │ │ │ ├── ThreadAdapter.java │ │ │ ├── TimelineAdapter.java │ │ │ └── UnicodeEmojiAdapter.java │ │ │ ├── appstore │ │ │ ├── CacheUpdater.kt │ │ │ ├── Events.kt │ │ │ └── EventsHub.kt │ │ │ ├── components │ │ │ ├── announcements │ │ │ │ ├── AnnouncementAdapter.kt │ │ │ │ ├── AnnouncementsActivity.kt │ │ │ │ └── AnnouncementsViewModel.kt │ │ │ ├── chat │ │ │ │ ├── ChatActivity.kt │ │ │ │ └── ChatViewModel.kt │ │ │ ├── common │ │ │ │ ├── CommonComposeViewModel.kt │ │ │ │ ├── DownsizeImageTask.java │ │ │ │ └── MediaUploader.kt │ │ │ ├── compose │ │ │ │ ├── ComposeActivity.kt │ │ │ │ ├── ComposeAutoCompleteAdapter.java │ │ │ │ ├── ComposeViewModel.kt │ │ │ │ ├── MediaPreviewAdapter.kt │ │ │ │ ├── dialog │ │ │ │ │ ├── AddPollDialog.kt │ │ │ │ │ └── CaptionDialog.kt │ │ │ │ └── view │ │ │ │ │ ├── ComposeOptionsView.kt │ │ │ │ │ ├── ComposeScheduleView.java │ │ │ │ │ ├── EditTextTyped.kt │ │ │ │ │ ├── PollPreviewView.kt │ │ │ │ │ ├── ProgressImageView.java │ │ │ │ │ ├── ProgressTextView.java │ │ │ │ │ └── TootButton.kt │ │ │ ├── conversation │ │ │ │ ├── ConversationAdapter.kt │ │ │ │ ├── ConversationEntity.kt │ │ │ │ ├── ConversationViewHolder.java │ │ │ │ ├── ConversationsBoundaryCallback.kt │ │ │ │ ├── ConversationsFragment.kt │ │ │ │ ├── ConversationsRepository.kt │ │ │ │ └── ConversationsViewModel.kt │ │ │ ├── drafts │ │ │ │ ├── DraftHelper.kt │ │ │ │ ├── DraftMediaAdapter.kt │ │ │ │ ├── DraftsActivity.kt │ │ │ │ ├── DraftsAdapter.kt │ │ │ │ └── DraftsViewModel.kt │ │ │ ├── instancemute │ │ │ │ ├── InstanceListActivity.kt │ │ │ │ ├── adapter │ │ │ │ │ └── DomainMutesAdapter.kt │ │ │ │ ├── fragment │ │ │ │ │ └── InstanceListFragment.kt │ │ │ │ └── interfaces │ │ │ │ │ └── InstanceActionListener.kt │ │ │ ├── notifications │ │ │ │ ├── NotificationFetcher.kt │ │ │ │ ├── NotificationHelper.java │ │ │ │ ├── NotificationWorker.kt │ │ │ │ └── Notifier.kt │ │ │ ├── preference │ │ │ │ ├── AccountPreferencesFragment.kt │ │ │ │ ├── EmojiPreference.kt │ │ │ │ ├── NotificationPreferencesFragment.kt │ │ │ │ ├── PreferencesActivity.kt │ │ │ │ ├── PreferencesFragment.kt │ │ │ │ ├── ProxyPreferencesFragment.kt │ │ │ │ └── TabFilterPreferencesFragment.kt │ │ │ ├── report │ │ │ │ ├── ReportActivity.kt │ │ │ │ ├── ReportViewModel.kt │ │ │ │ ├── Screen.kt │ │ │ │ ├── adapter │ │ │ │ │ ├── AdapterHandler.kt │ │ │ │ │ ├── ReportPagerAdapter.kt │ │ │ │ │ ├── StatusViewHolder.kt │ │ │ │ │ ├── StatusesAdapter.kt │ │ │ │ │ ├── StatusesDataSource.kt │ │ │ │ │ ├── StatusesDataSourceFactory.kt │ │ │ │ │ └── StatusesRepository.kt │ │ │ │ ├── fragments │ │ │ │ │ ├── ReportDoneFragment.kt │ │ │ │ │ ├── ReportNoteFragment.kt │ │ │ │ │ └── ReportStatusesFragment.kt │ │ │ │ └── model │ │ │ │ │ └── StatusViewState.kt │ │ │ ├── scheduled │ │ │ │ ├── ScheduledTootActivity.kt │ │ │ │ ├── ScheduledTootAdapter.kt │ │ │ │ ├── ScheduledTootDataSource.kt │ │ │ │ └── ScheduledTootViewModel.kt │ │ │ └── search │ │ │ │ ├── SearchActivity.kt │ │ │ │ ├── SearchType.kt │ │ │ │ ├── SearchViewModel.kt │ │ │ │ ├── adapter │ │ │ │ ├── SearchAccountsAdapter.kt │ │ │ │ ├── SearchDataSource.kt │ │ │ │ ├── SearchDataSourceFactory.kt │ │ │ │ ├── SearchHashtagsAdapter.kt │ │ │ │ ├── SearchPagerAdapter.kt │ │ │ │ ├── SearchRepository.kt │ │ │ │ └── SearchStatusesAdapter.kt │ │ │ │ └── fragments │ │ │ │ ├── SearchAccountsFragment.kt │ │ │ │ ├── SearchFragment.kt │ │ │ │ ├── SearchHashtagsFragment.kt │ │ │ │ └── SearchStatusesFragment.kt │ │ │ ├── db │ │ │ ├── AccountDao.kt │ │ │ ├── AccountEntity.kt │ │ │ ├── AccountManager.kt │ │ │ ├── AppDatabase.java │ │ │ ├── ChatEntity.kt │ │ │ ├── ChatMessageEntity.kt │ │ │ ├── ChatsDao.kt │ │ │ ├── ConversationsDao.kt │ │ │ ├── Converters.kt │ │ │ ├── DraftDao.kt │ │ │ ├── DraftEntity.kt │ │ │ ├── InstanceDao.kt │ │ │ ├── InstanceEntity.kt │ │ │ ├── TimelineDao.kt │ │ │ ├── TimelineStatusEntity.kt │ │ │ ├── TootDao.java │ │ │ └── TootEntity.java │ │ │ ├── di │ │ │ ├── ActivitiesModule.kt │ │ │ ├── AppComponent.kt │ │ │ ├── AppInjector.kt │ │ │ ├── AppModule.kt │ │ │ ├── BroadcastReceiverModule.kt │ │ │ ├── FragmentBuildersModule.kt │ │ │ ├── GlideModule.kt │ │ │ ├── Injectable.kt │ │ │ ├── MediaUploaderModule.kt │ │ │ ├── NetworkModule.kt │ │ │ ├── RepositoryModule.kt │ │ │ ├── ServicesModule.kt │ │ │ └── ViewModelFactory.kt │ │ │ ├── entity │ │ │ ├── AccessToken.kt │ │ │ ├── Account.kt │ │ │ ├── Announcement.kt │ │ │ ├── AppCredentials.kt │ │ │ ├── Attachment.kt │ │ │ ├── Card.kt │ │ │ ├── Chat.kt │ │ │ ├── Conversation.kt │ │ │ ├── DeletedStatus.kt │ │ │ ├── Emoji.kt │ │ │ ├── Filter.kt │ │ │ ├── HashTag.kt │ │ │ ├── IdentityProof.kt │ │ │ ├── Instance.kt │ │ │ ├── Marker.kt │ │ │ ├── MastoList.kt │ │ │ ├── NewStatus.kt │ │ │ ├── NodeInfo.kt │ │ │ ├── Notification.kt │ │ │ ├── Poll.kt │ │ │ ├── Relationship.kt │ │ │ ├── ScheduledStatus.kt │ │ │ ├── SearchResult.kt │ │ │ ├── Status.kt │ │ │ ├── StatusContext.kt │ │ │ ├── StatusParams.kt │ │ │ ├── Sticker.kt │ │ │ └── StreamEvent.kt │ │ │ ├── fragment │ │ │ ├── AccountListFragment.kt │ │ │ ├── AccountMediaFragment.kt │ │ │ ├── BaseFragment.java │ │ │ ├── ChatsFragment.kt │ │ │ ├── NotificationsFragment.java │ │ │ ├── SFragment.java │ │ │ ├── TimePickerFragment.java │ │ │ ├── TimelineFragment.java │ │ │ ├── ViewImageFragment.kt │ │ │ ├── ViewMediaFragment.kt │ │ │ ├── ViewThreadFragment.java │ │ │ └── ViewVideoFragment.kt │ │ │ ├── interfaces │ │ │ ├── AccountActionListener.java │ │ │ ├── AccountSelectionListener.kt │ │ │ ├── ActionButtonActivity.java │ │ │ ├── ChatActionListener.kt │ │ │ ├── LinkListener.java │ │ │ ├── PermissionRequester.java │ │ │ ├── RefreshableFragment.kt │ │ │ ├── ReselectableFragment.kt │ │ │ └── StatusActionListener.java │ │ │ ├── json │ │ │ └── SpannedTypeAdapter.kt │ │ │ ├── network │ │ │ ├── InstanceSwitchAuthInterceptor.java │ │ │ ├── MastodonApi.kt │ │ │ ├── ProgressRequestBody.java │ │ │ └── TimelineCases.kt │ │ │ ├── pager │ │ │ ├── AccountPagerAdapter.kt │ │ │ ├── AvatarImagePagerAdapter.kt │ │ │ ├── ImagePagerAdapter.kt │ │ │ └── MainPagerAdapter.kt │ │ │ ├── receiver │ │ │ ├── NotificationClearBroadcastReceiver.kt │ │ │ └── SendStatusBroadcastReceiver.kt │ │ │ ├── repository │ │ │ ├── ChatRepository.kt │ │ │ └── TimelineRepository.kt │ │ │ ├── service │ │ │ ├── SendTootService.kt │ │ │ ├── ServiceClient.kt │ │ │ ├── StreamingService.kt │ │ │ └── TuskyTileService.kt │ │ │ ├── settings │ │ │ ├── SettingsConstants.kt │ │ │ └── SettingsDSL.kt │ │ │ ├── util │ │ │ ├── BBCodeEdit.java │ │ │ ├── BiListing.kt │ │ │ ├── BindingViewHolder.kt │ │ │ ├── BlurHashDecoder.kt │ │ │ ├── CardViewMode.kt │ │ │ ├── ClickableSpanNoUnderline.kt │ │ │ ├── ComposeTokenizer.kt │ │ │ ├── CustomEmojiHelper.kt │ │ │ ├── CustomFragmentStateAdapter.kt │ │ │ ├── CustomURLSpan.java │ │ │ ├── Either.kt │ │ │ ├── EmojiCompatFont.kt │ │ │ ├── Emojis.java │ │ │ ├── FocalPointUtil.kt │ │ │ ├── HTMLEdit.java │ │ │ ├── HttpHeaderLink.java │ │ │ ├── IOUtils.java │ │ │ ├── ImageLoadingHelper.kt │ │ │ ├── LinkHelper.java │ │ │ ├── ListStatusAccessibilityDelegate.kt │ │ │ ├── ListUtils.kt │ │ │ ├── Listing.kt │ │ │ ├── LiveDataUtil.kt │ │ │ ├── LocaleManager.kt │ │ │ ├── MediaUtils.kt │ │ │ ├── NetworkState.kt │ │ │ ├── NotificationTypeConverter.kt │ │ │ ├── OkHttpUtils.java │ │ │ ├── OmittedDomainFetcher.kt │ │ │ ├── PagingRequestHelper.java │ │ │ ├── PairedList.java │ │ │ ├── Resource.kt │ │ │ ├── RxAwareViewModel.kt │ │ │ ├── SaveTootHelper.java │ │ │ ├── ShareShortcutHelper.kt │ │ │ ├── SharedPreferencesExtensions.kt │ │ │ ├── SmartLengthInputFilter.kt │ │ │ ├── SpanUtils.kt │ │ │ ├── StatusDisplayOptions.kt │ │ │ ├── StatusViewHelper.kt │ │ │ ├── StringUtils.kt │ │ │ ├── ThemeUtils.java │ │ │ ├── TimestampUtils.java │ │ │ ├── VersionUtils.java │ │ │ ├── ViewDataUtils.java │ │ │ ├── ViewExtensions.kt │ │ │ ├── ViewPager2Fix.java │ │ │ └── getErrorMessage.kt │ │ │ ├── view │ │ │ ├── BackgroundMessageView.kt │ │ │ ├── BezelImageView.java │ │ │ ├── ConversationLineItemDecoration.kt │ │ │ ├── CustomEmojiTextView.kt │ │ │ ├── EmojiKeyboard.java │ │ │ ├── EmojiPicker.kt │ │ │ ├── EndlessOnScrollListener.java │ │ │ ├── ExposedPlayPauseVideoView.kt │ │ │ ├── LicenseCard.kt │ │ │ ├── MediaPreviewImageView.kt │ │ │ ├── MuteAccountDialog.kt │ │ │ ├── SquareImageView.kt │ │ │ └── StatusView.kt │ │ │ ├── viewdata │ │ │ ├── AttachmentViewData.kt │ │ │ ├── ChatViewData.kt │ │ │ ├── NotificationViewData.java │ │ │ ├── PollViewData.kt │ │ │ └── StatusViewData.java │ │ │ └── viewmodel │ │ │ ├── AccountViewModel.kt │ │ │ ├── AccountsInListViewModel.kt │ │ │ ├── EditProfileViewModel.kt │ │ │ └── ListsViewModel.kt │ ├── res │ │ ├── anim │ │ │ ├── explode.xml │ │ │ ├── fade_in.xml │ │ │ ├── fade_out.xml │ │ │ ├── slide_from_left.xml │ │ │ ├── slide_from_right.xml │ │ │ ├── slide_to_left.xml │ │ │ └── slide_to_right.xml │ │ ├── color │ │ │ ├── account_tab_font_color.xml │ │ │ ├── color_background_transparent_60.xml │ │ │ ├── compound_button_color.xml │ │ │ ├── emoji_reaction_button.xml │ │ │ └── text_input_layout_box_stroke_color.xml │ │ ├── drawable-hdpi │ │ │ ├── elephant_error.png │ │ │ ├── elephant_friend.png │ │ │ ├── elephant_friend_empty.png │ │ │ ├── elephant_offline.png │ │ │ ├── ic_notify.png │ │ │ └── splash.png │ │ ├── drawable-mdpi │ │ │ ├── elephant_error.png │ │ │ ├── elephant_friend.png │ │ │ ├── elephant_friend_empty.png │ │ │ ├── elephant_offline.png │ │ │ ├── ic_notify.png │ │ │ └── splash.png │ │ ├── drawable-v24 │ │ │ └── ic_notoemoji.xml │ │ ├── drawable-v26 │ │ │ ├── ic_launcher_foreground.xml │ │ │ └── launcher_shadow_gradient.xml │ │ ├── drawable-xhdpi │ │ │ ├── elephant_error.png │ │ │ ├── elephant_friend.png │ │ │ ├── elephant_friend_empty.png │ │ │ ├── elephant_offline.png │ │ │ ├── ic_notify.png │ │ │ └── splash.png │ │ ├── drawable-xxhdpi │ │ │ ├── elephant_error.png │ │ │ ├── elephant_friend.png │ │ │ ├── elephant_friend_empty.png │ │ │ ├── elephant_offline.png │ │ │ ├── ic_notify.png │ │ │ └── splash.png │ │ ├── drawable-xxxhdpi │ │ │ ├── elephant_error.png │ │ │ ├── elephant_friend.png │ │ │ ├── elephant_friend_empty.png │ │ │ ├── elephant_offline.png │ │ │ ├── ic_notify.png │ │ │ └── splash.png │ │ ├── drawable │ │ │ ├── avatar_border.xml │ │ │ ├── avatar_default.xml │ │ │ ├── background_dialog_activity.xml │ │ │ ├── background_splash.xml │ │ │ ├── card_frame.xml │ │ │ ├── card_image_placeholder.xml │ │ │ ├── conversation_thread_line.xml │ │ │ ├── description_bg_expanded.xml │ │ │ ├── ic_access_time.xml │ │ │ ├── ic_account_settings.xml │ │ │ ├── ic_add_a_photo_32dp.xml │ │ │ ├── ic_alert_circle.xml │ │ │ ├── ic_attach_file_24dp.xml │ │ │ ├── ic_bbcode_24dp.xml │ │ │ ├── ic_blobmoji.xml │ │ │ ├── ic_bookmark_24dp.xml │ │ │ ├── ic_bookmark_active_24dp.xml │ │ │ ├── ic_bot_24dp.xml │ │ │ ├── ic_briefcase.xml │ │ │ ├── ic_bullhorn_24dp.xml │ │ │ ├── ic_cancel_24dp.xml │ │ │ ├── ic_check_24dp.xml │ │ │ ├── ic_check_32dp.xml │ │ │ ├── ic_check_box_outline_blank_18dp.xml │ │ │ ├── ic_check_circle.xml │ │ │ ├── ic_clear_24dp.xml │ │ │ ├── ic_close_24dp.xml │ │ │ ├── ic_create_24dp.xml │ │ │ ├── ic_cw_24dp.xml │ │ │ ├── ic_drag_indicator_24dp.xml │ │ │ ├── ic_drag_indicator_horiz_24dp.xml │ │ │ ├── ic_email_24dp.xml │ │ │ ├── ic_emoji_24dp.xml │ │ │ ├── ic_emoji_34dp.xml │ │ │ ├── ic_exit_to_app_24px.xml │ │ │ ├── ic_eye_24dp.xml │ │ │ ├── ic_favourite_24dp.xml │ │ │ ├── ic_favourite_active_24dp.xml │ │ │ ├── ic_file_download_black_24dp.xml │ │ │ ├── ic_forum_24px.xml │ │ │ ├── ic_hashtag.xml │ │ │ ├── ic_hide_media_24dp.xml │ │ │ ├── ic_home_24dp.xml │ │ │ ├── ic_html_24dp.xml │ │ │ ├── ic_list.xml │ │ │ ├── ic_local_24dp.xml │ │ │ ├── ic_lock_open_24dp.xml │ │ │ ├── ic_lock_outline_24dp.xml │ │ │ ├── ic_logout.xml │ │ │ ├── ic_markdown.xml │ │ │ ├── ic_menu_share_24dp.xml │ │ │ ├── ic_more_horiz_24dp.xml │ │ │ ├── ic_music_box_24dp.xml │ │ │ ├── ic_music_box_preview_24dp.xml │ │ │ ├── ic_mute_24dp.xml │ │ │ ├── ic_notebook.xml │ │ │ ├── ic_notifications_24dp.xml │ │ │ ├── ic_notifications_active_24dp.xml │ │ │ ├── ic_notifications_off_24dp.xml │ │ │ ├── ic_notoemoji.xml │ │ │ ├── ic_person_add_24dp.xml │ │ │ ├── ic_photo_24dp.xml │ │ │ ├── ic_play_indicator.xml │ │ │ ├── ic_plus_24dp.xml │ │ │ ├── ic_poll_24dp.xml │ │ │ ├── ic_preview_24dp.xml │ │ │ ├── ic_public_24dp.xml │ │ │ ├── ic_radio_button_unchecked_18dp.xml │ │ │ ├── ic_reblog_18dp.xml │ │ │ ├── ic_reblog_24dp.xml │ │ │ ├── ic_reblog_active_24dp.xml │ │ │ ├── ic_reblog_direct_24dp.xml │ │ │ ├── ic_reblog_private_24dp.xml │ │ │ ├── ic_reblog_private_active_24dp.xml │ │ │ ├── ic_reject_24dp.xml │ │ │ ├── ic_repeat_24dp.xml │ │ │ ├── ic_reply_18dp.xml │ │ │ ├── ic_reply_24dp.xml │ │ │ ├── ic_reply_all_24dp.xml │ │ │ ├── ic_send_24dp.xml │ │ │ ├── ic_settings.xml │ │ │ ├── ic_star_24dp.xml │ │ │ ├── ic_sticker.xml │ │ │ ├── ic_tabs.xml │ │ │ ├── ic_tusky.xml │ │ │ ├── ic_twemoji.xml │ │ │ ├── ic_unmute_24dp.xml │ │ │ ├── ic_videocam_24dp.xml │ │ │ ├── materialdrawer_shape_large.xml │ │ │ ├── materialdrawer_shape_small.xml │ │ │ ├── md_bold.xml │ │ │ ├── md_code.xml │ │ │ ├── md_italic.xml │ │ │ ├── md_link.xml │ │ │ ├── md_strikethrough.xml │ │ │ ├── media_preview_outline.xml │ │ │ ├── media_warning_bg.xml │ │ │ ├── message_background.xml │ │ │ ├── poll_option_background.xml │ │ │ ├── poll_option_shape.xml │ │ │ ├── profile_badge_background.xml │ │ │ ├── report_success_background.xml │ │ │ ├── round_button.xml │ │ │ ├── spellcheck.xml │ │ │ ├── status_divider.xml │ │ │ └── unread_shape.xml │ │ ├── layout-land │ │ │ └── fragment_report_done.xml │ │ ├── layout-sw640dp │ │ │ ├── fragment_timeline.xml │ │ │ ├── fragment_timeline_notifications.xml │ │ │ └── fragment_view_thread.xml │ │ ├── layout │ │ │ ├── activity_about.xml │ │ │ ├── activity_account.xml │ │ │ ├── activity_account_list.xml │ │ │ ├── activity_announcements.xml │ │ │ ├── activity_chat.xml │ │ │ ├── activity_compose.xml │ │ │ ├── activity_drafts.xml │ │ │ ├── activity_edit_profile.xml │ │ │ ├── activity_filters.xml │ │ │ ├── activity_license.xml │ │ │ ├── activity_lists.xml │ │ │ ├── activity_login.xml │ │ │ ├── activity_main.xml │ │ │ ├── activity_modal_timeline.xml │ │ │ ├── activity_preferences.xml │ │ │ ├── activity_report.xml │ │ │ ├── activity_saved_toot.xml │ │ │ ├── activity_scheduled_toot.xml │ │ │ ├── activity_search.xml │ │ │ ├── activity_statuslist.xml │ │ │ ├── activity_tab_preference.xml │ │ │ ├── activity_view_media.xml │ │ │ ├── activity_view_tag.xml │ │ │ ├── activity_view_thread.xml │ │ │ ├── card_license.xml │ │ │ ├── dialog_add_poll.xml │ │ │ ├── dialog_emoji_keyboard.xml │ │ │ ├── dialog_emojicompat.xml │ │ │ ├── dialog_filter.xml │ │ │ ├── dialog_mute_account.xml │ │ │ ├── fragment_account_list.xml │ │ │ ├── fragment_accounts_in_list.xml │ │ │ ├── fragment_instance_list.xml │ │ │ ├── fragment_report_done.xml │ │ │ ├── fragment_report_note.xml │ │ │ ├── fragment_report_statuses.xml │ │ │ ├── fragment_search.xml │ │ │ ├── fragment_timeline.xml │ │ │ ├── fragment_timeline_notifications.xml │ │ │ ├── fragment_view_image.xml │ │ │ ├── fragment_view_thread.xml │ │ │ ├── fragment_view_video.xml │ │ │ ├── item_account.xml │ │ │ ├── item_account_field.xml │ │ │ ├── item_add_poll_option.xml │ │ │ ├── item_announcement.xml │ │ │ ├── item_autocomplete_account.xml │ │ │ ├── item_autocomplete_divider.xml │ │ │ ├── item_autocomplete_emoji.xml │ │ │ ├── item_autocomplete_hashtag.xml │ │ │ ├── item_blocked_user.xml │ │ │ ├── item_chat.xml │ │ │ ├── item_conversation.xml │ │ │ ├── item_draft.xml │ │ │ ├── item_edit_field.xml │ │ │ ├── item_emoji_button.xml │ │ │ ├── item_emoji_keyboard_emoji.xml │ │ │ ├── item_emoji_keyboard_page.xml │ │ │ ├── item_emoji_keyboard_sticker.xml │ │ │ ├── item_emoji_picker.xml │ │ │ ├── item_emoji_pref.xml │ │ │ ├── item_emoji_reaction.xml │ │ │ ├── item_follow.xml │ │ │ ├── item_follow_request.xml │ │ │ ├── item_follow_request_notification.xml │ │ │ ├── item_footer.xml │ │ │ ├── item_hashtag.xml │ │ │ ├── item_list.xml │ │ │ ├── item_media_preview.xml │ │ │ ├── item_muted_domain.xml │ │ │ ├── item_muted_user.xml │ │ │ ├── item_network_state.xml │ │ │ ├── item_our_message.xml │ │ │ ├── item_picker_list.xml │ │ │ ├── item_poll.xml │ │ │ ├── item_poll_preview_option.xml │ │ │ ├── item_report_status.xml │ │ │ ├── item_saved_toot.xml │ │ │ ├── item_scheduled_toot.xml │ │ │ ├── item_status.xml │ │ │ ├── item_status_bottom_sheet.xml │ │ │ ├── item_status_detailed.xml │ │ │ ├── item_status_muted.xml │ │ │ ├── item_status_notification.xml │ │ │ ├── item_status_placeholder.xml │ │ │ ├── item_tab_preference.xml │ │ │ ├── item_tab_preference_small.xml │ │ │ ├── item_their_message.xml │ │ │ ├── material_drawer_header.xml │ │ │ ├── notifications_filter.xml │ │ │ ├── search_view.xml │ │ │ ├── toolbar_basic.xml │ │ │ ├── view_account_moved.xml │ │ │ ├── view_background_message.xml │ │ │ ├── view_compose_options.xml │ │ │ ├── view_compose_schedule.xml │ │ │ └── view_poll_preview.xml │ │ ├── menu │ │ │ ├── account_toolbar.xml │ │ │ ├── chat_more.xml │ │ │ ├── drafts.xml │ │ │ ├── edit_profile_toolbar.xml │ │ │ ├── emoji_reaction_more.xml │ │ │ ├── list_actions.xml │ │ │ ├── search_toolbar.xml │ │ │ ├── status_more.xml │ │ │ ├── status_more_for_user.xml │ │ │ ├── view_media_toolbar.xml │ │ │ └── view_thread_toolbar.xml │ │ ├── raw │ │ │ └── apache.txt │ │ ├── values-ar │ │ │ └── strings.xml │ │ ├── values-ber │ │ │ └── strings.xml │ │ ├── values-bn-rBD │ │ │ └── strings.xml │ │ ├── values-bn-rIN │ │ │ └── strings.xml │ │ ├── values-ca │ │ │ └── strings.xml │ │ ├── values-ckb │ │ │ └── strings.xml │ │ ├── values-cs │ │ │ └── strings.xml │ │ ├── values-cy │ │ │ └── strings.xml │ │ ├── values-de │ │ │ └── strings.xml │ │ ├── values-en-rAU │ │ │ └── strings.xml │ │ ├── values-en-rGB │ │ │ └── strings.xml │ │ ├── values-eo │ │ │ └── strings.xml │ │ ├── values-es │ │ │ └── strings.xml │ │ ├── values-eu │ │ │ └── strings.xml │ │ ├── values-fa │ │ │ └── strings.xml │ │ ├── values-fr │ │ │ └── strings.xml │ │ ├── values-ga │ │ │ └── strings.xml │ │ ├── values-gd │ │ │ └── strings.xml │ │ ├── values-hi │ │ │ └── strings.xml │ │ ├── values-hu │ │ │ └── strings.xml │ │ ├── values-is │ │ │ └── strings.xml │ │ ├── values-it │ │ │ └── strings.xml │ │ ├── values-ja │ │ │ └── strings.xml │ │ ├── values-kab │ │ │ └── strings.xml │ │ ├── values-ko │ │ │ └── strings.xml │ │ ├── values-large │ │ │ ├── dimens.xml │ │ │ └── styles.xml │ │ ├── values-ml │ │ │ └── strings.xml │ │ ├── values-night │ │ │ └── theme_colors.xml │ │ ├── values-nl │ │ │ └── strings.xml │ │ ├── values-no-rNB │ │ │ └── strings.xml │ │ ├── values-oc │ │ │ └── strings.xml │ │ ├── values-pa │ │ │ └── strings.xml │ │ ├── values-pl │ │ │ └── strings.xml │ │ ├── values-pt-rBR │ │ │ └── strings.xml │ │ ├── values-ru │ │ │ └── strings.xml │ │ ├── values-sa │ │ │ └── strings.xml │ │ ├── values-sk │ │ │ └── strings.xml │ │ ├── values-sl │ │ │ └── strings.xml │ │ ├── values-small │ │ │ └── integer.xml │ │ ├── values-sv │ │ │ └── strings.xml │ │ ├── values-sw380dp │ │ │ └── toot_button.xml │ │ ├── values-ta │ │ │ └── strings.xml │ │ ├── values-te │ │ │ └── strings.xml │ │ ├── values-th │ │ │ └── strings.xml │ │ ├── values-tr │ │ │ └── strings.xml │ │ ├── values-uk │ │ │ └── strings.xml │ │ ├── values-v27 │ │ │ └── styles.xml │ │ ├── values-vi │ │ │ └── strings.xml │ │ ├── values-w640dp │ │ │ └── dimens.xml │ │ ├── values-zh-rCN │ │ │ └── strings.xml │ │ ├── values-zh-rHK │ │ │ └── strings.xml │ │ ├── values-zh-rMO │ │ │ └── strings.xml │ │ ├── values-zh-rSG │ │ │ └── strings.xml │ │ ├── values-zh-rTW │ │ │ └── strings.xml │ │ ├── values │ │ │ ├── actions.xml │ │ │ ├── attrs.xml │ │ │ ├── colors.xml │ │ │ ├── dimens.xml │ │ │ ├── donottranslate.xml │ │ │ ├── ids.xml │ │ │ ├── integers.xml │ │ │ ├── string-arrays.xml │ │ │ ├── strings.xml │ │ │ ├── styles.xml │ │ │ ├── theme_colors.xml │ │ │ └── toot_button.xml │ │ └── xml │ │ │ ├── file_paths.xml │ │ │ ├── searchable.xml │ │ │ └── share_shortcuts.xml │ └── splash.svg │ └── test │ └── java │ ├── android │ └── text │ │ └── FakeSpannableString.kt │ └── com │ └── keylesspalace │ └── tusky │ ├── BottomSheetActivityTest.kt │ ├── ComposeActivityTest.kt │ ├── ComposeTokenizerTest.kt │ ├── FilterTest.kt │ ├── FocalPointUtilTest.kt │ ├── SpanUtilsTest.kt │ ├── StringUtilsTest.kt │ ├── TuskyApplication.kt │ ├── fragment │ └── TimelineRepositoryTest.kt │ └── util │ ├── EmojiCompatFontTest.kt │ ├── SmartLengthInputFilterTest.kt │ ├── VersionUtilsTest.kt │ └── ViewPager2FixTest.java ├── assets ├── avatar_default.svg ├── fdroid_badge.png ├── splash.xcf └── tusky_logo_borderless.png ├── build.gradle ├── debug.keystore ├── fastlane └── metadata │ └── android │ ├── en-US │ ├── changelogs │ │ ├── 167.txt │ │ └── 168.txt │ ├── full_description.txt │ ├── images │ │ ├── featureGraphic.png │ │ ├── icon.png │ │ └── phoneScreenshots │ │ │ ├── 00_login.png │ │ │ ├── 01_timeline.png │ │ │ ├── 02_compose.png │ │ │ ├── 03_profile.png │ │ │ └── 04_emojis.png │ ├── short_description.txt │ └── title.txt │ └── ru │ ├── changelogs │ ├── 167.txt │ └── 168.txt │ ├── full_description.txt │ ├── short_description.txt │ └── title.txt ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── instance-build.gradle ├── scripts ├── import_translations.sh └── xq.py └── settings.gradle /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | open_collective: tusky 2 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | /.idea 5 | .DS_Store 6 | /build 7 | /captures 8 | .externalNativeBuild 9 | app/release -------------------------------------------------------------------------------- /ISSUE_TEMPLATE.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | * * * * 4 | - Husky Version: 5 | - Android Version: 6 | - Android Device: 7 | - Fediverse instance (if applicable): 8 | 9 | - [ ] I searched or browsed the repo’s other issues to ensure this is not a duplicate. 10 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | MOVED TO: https://git.sr.ht/~captainepoch/husky 2 | 3 | DOWNLOADS ARE HERE: https://git.sr.ht/~captainepoch/husky/refs 4 | 5 | NEW MAINTAINER IS @captainepoch@stereophonic.space 6 | -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | app-release.apk 3 | -------------------------------------------------------------------------------- /app/src/androidTest/java/com/keylesspalace/tusky/ExampleInstrumentedTest.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FWGS/Husky/49febda5228f3a178ffbeeda9ae38b5a1719705a/app/src/androidTest/java/com/keylesspalace/tusky/ExampleInstrumentedTest.java -------------------------------------------------------------------------------- /app/src/blue/res/mipmap-anydpi-v26/ic_launcher.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/blue/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FWGS/Husky/49febda5228f3a178ffbeeda9ae38b5a1719705a/app/src/blue/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/blue/res/mipmap-hdpi/ic_shortcut_compose.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FWGS/Husky/49febda5228f3a178ffbeeda9ae38b5a1719705a/app/src/blue/res/mipmap-hdpi/ic_shortcut_compose.png -------------------------------------------------------------------------------- /app/src/blue/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FWGS/Husky/49febda5228f3a178ffbeeda9ae38b5a1719705a/app/src/blue/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/blue/res/mipmap-mdpi/ic_shortcut_compose.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FWGS/Husky/49febda5228f3a178ffbeeda9ae38b5a1719705a/app/src/blue/res/mipmap-mdpi/ic_shortcut_compose.png -------------------------------------------------------------------------------- /app/src/blue/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FWGS/Husky/49febda5228f3a178ffbeeda9ae38b5a1719705a/app/src/blue/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/blue/res/mipmap-xhdpi/ic_shortcut_compose.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FWGS/Husky/49febda5228f3a178ffbeeda9ae38b5a1719705a/app/src/blue/res/mipmap-xhdpi/ic_shortcut_compose.png -------------------------------------------------------------------------------- /app/src/blue/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FWGS/Husky/49febda5228f3a178ffbeeda9ae38b5a1719705a/app/src/blue/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/blue/res/mipmap-xxhdpi/ic_shortcut_compose.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FWGS/Husky/49febda5228f3a178ffbeeda9ae38b5a1719705a/app/src/blue/res/mipmap-xxhdpi/ic_shortcut_compose.png -------------------------------------------------------------------------------- /app/src/blue/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FWGS/Husky/49febda5228f3a178ffbeeda9ae38b5a1719705a/app/src/blue/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/blue/res/mipmap-xxxhdpi/ic_shortcut_compose.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FWGS/Husky/49febda5228f3a178ffbeeda9ae38b5a1719705a/app/src/blue/res/mipmap-xxxhdpi/ic_shortcut_compose.png -------------------------------------------------------------------------------- /app/src/green/res/mipmap-anydpi-v26/ic_launcher.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/green/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FWGS/Husky/49febda5228f3a178ffbeeda9ae38b5a1719705a/app/src/green/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/green/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FWGS/Husky/49febda5228f3a178ffbeeda9ae38b5a1719705a/app/src/green/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/green/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FWGS/Husky/49febda5228f3a178ffbeeda9ae38b5a1719705a/app/src/green/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/green/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FWGS/Husky/49febda5228f3a178ffbeeda9ae38b5a1719705a/app/src/green/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/green/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FWGS/Husky/49febda5228f3a178ffbeeda9ae38b5a1719705a/app/src/green/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/husky/res/values-ar/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/src/husky/res/values-ber/husky_generated.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | ⵇⵇⴻⵏ ⵖⴻⵔ ⵎⴰⵚⵟⵓⴷⵓⵏ 8 | 9 | 10 | ⵔⵏⵓ ⵢⵉⵡⴻⵏ ⵏ ⵓⵎⵉⴹⴰⵏ ⴰⵎⴰⵢⵏⵓⵝ ⵏ ⵎⴰⵚⵟⵓⴷⵓⵏ 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /app/src/husky/res/values-en-rAU/husky_generated.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/husky/res/values-en-rGB/husky_generated.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/husky/res/values-en-rGB/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | %s favourited your post 4 | Scheduled posts 5 | Reply to 6 | -------------------------------------------------------------------------------- /app/src/husky/res/values-gd/husky_generated.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Clàraich a-steach le Pleroma 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/husky/res/values-hi/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | जवाब दे 4 | किसने प्रतिक्रिया व्यक्त की 5 | प्रतिक्रिया 6 | प्रतिक्रिया निकालें 7 | -------------------------------------------------------------------------------- /app/src/husky/res/values-ja/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 返信 4 | 絵文字反応 5 | 誰が反応したか 6 | 可能にする %s 7 | 無効にする %s 8 | アプリの名前 9 | アプリのウェブサイト 10 | 管理者 11 | モデレーター 12 | 反応を削除 13 | ファイルが大きすぎます 14 | 絵文字反応 15 | リピートを表示 16 | %s 誰が反応したか 17 | ミュートされたユーザーを隠す 18 | リピート 19 | リピートを削除 20 | リピートを隠す 21 | リピートを表示 22 | リピートを削除 23 | 削除しますか\? 24 | -------------------------------------------------------------------------------- /app/src/husky/res/values-kab/husky_generated.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Husky %s 4 | 5 | 6 | Amaɣnu n Husky 7 | 8 | 9 | Yettwamdemmar s Husky 10 | 11 | 12 | 13 | 14 | 15 | Asmel Web n usenfaṛ: 16 | \n https://huskyapp.dev 17 | 18 | 19 | 20 | 21 | 22 | Qqen ɣer Maṣṭudun 23 | 24 | 25 | Rnu yiwen umiḍan amaynut n Maṣṭudun 26 | 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /app/src/husky/res/values-ml/husky_generated.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | മസ്റ്റഡോൺ വഴി പ്രവേശിക്കുക 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/husky/res/values-nn/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Svar på 4 | -------------------------------------------------------------------------------- /app/src/husky/res/values-pa/husky_generated.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/husky/res/values-pt-rPT/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/src/husky/res/values-sk/husky_generated.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Prihlásiť sa účtom Pleroma 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/husky/res/values-te/husky_generated.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/husky/res/values-uk/husky_generated.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Увійти 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/husky/res/values-zh-rHK/husky_generated.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Husky 是基於 GNU General Public License Version 3 許可證開源的自由軟體完整的許可證協議:https://www.gnu.org/licenses/gpl-3.0.en.html 4 | 5 | 6 | Husky 官方帳號 7 | 8 | 9 | 你需要重啟 Husky 才能生效 10 | 11 | 12 | Husky 使用了以下開源專案的原始碼: 13 | 14 | 15 | 16 | 17 | 18 | 19 | 專案網站:\n 20 | https://huskyapp.dev 21 | 22 | 23 | 24 | 25 | 26 | 27 | 問題回報:\n 28 | https://git.mentality.rip/FWGS/Husky/issues 29 | 30 | 31 | 32 | 33 | 34 | 登入 Pleroma 帳號 35 | 36 | 37 | 加入新的 Pleroma 帳號 38 | 39 | 40 | 41 | 42 | 請輸入你帳號所在的 Mastodon 站點的域名或地址 43 | 44 | 45 | 46 | -------------------------------------------------------------------------------- /app/src/husky/res/values-zh-rMO/husky_generated.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Husky 是基於 GNU General Public License Version 3 許可證開源的自由軟體完整的許可證協議:https://www.gnu.org/licenses/gpl-3.0.en.html 4 | 5 | 6 | Husky 官方帳號 7 | 8 | 9 | 你需要重啟 Husky 才能生效 10 | 11 | 12 | Husky 使用了以下開源專案的原始碼: 13 | 14 | 15 | 16 | 17 | 18 | 19 | 專案網站:\n 20 | https://huskyapp.dev 21 | 22 | 23 | 24 | 25 | 26 | 27 | 問題回報:\n 28 | https://git.mentality.rip/FWGS/Husky/issues 29 | 30 | 31 | 32 | 33 | 34 | 登入 Pleroma 帳號 35 | 36 | 37 | 加入新的 Pleroma 帳號 38 | 39 | 40 | 41 | 42 | 請輸入你帳號所在的 Mastodon 站點的域名或地址 43 | 44 | 45 | 46 | -------------------------------------------------------------------------------- /app/src/husky/res/values-zh-rTW/husky_generated.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Husky 是基於 GNU General Public License Version 3 許可證開源的自由軟體完整的許可證協議:https://www.gnu.org/licenses/gpl-3.0.en.html 4 | 5 | 6 | Husky 官方帳號 7 | 8 | 9 | 你需要重啟 Husky 才能生效 10 | 11 | 12 | Husky 使用了以下開源專案的原始碼: 13 | 14 | 15 | Husky %s 16 | 17 | 18 | 19 | 20 | 21 | 22 | 專案網站:\n 23 | https://huskyapp.dev 24 | 25 | 26 | 27 | 28 | 29 | 30 | 問題回報:\n 31 | https://git.mentality.rip/FWGS/Husky/issues 32 | 33 | 34 | 35 | 36 | 37 | 登入 Pleroma 帳號 38 | 39 | 40 | 加入新的 Pleroma 帳號 41 | 42 | 43 | 44 | 45 | 請輸入你帳號所在的 Mastodon 站點的域名或地址 46 | 47 | 48 | 49 | -------------------------------------------------------------------------------- /app/src/husky/res/values/donottranslate.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | https://huskyapp.dev 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/husky/res/values/husky_donottranslate.xml: -------------------------------------------------------------------------------- 1 | 2 | Plaintext 3 | Markdown 4 | BBCode 5 | HTML 6 | 7 | 8 | @string/action_plaintext 9 | @string/action_markdown 10 | @string/action_bbcode 11 | @string/action_html 12 | 13 | 14 | 15 | 16 | %1$s; %2$s; %3$s 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /app/src/main/ic_launcher-web.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FWGS/Husky/49febda5228f3a178ffbeeda9ae38b5a1719705a/app/src/main/ic_launcher-web.png -------------------------------------------------------------------------------- /app/src/main/java/com/keylesspalace/tusky/adapter/HashtagViewHolder.kt: -------------------------------------------------------------------------------- 1 | package com.keylesspalace.tusky.adapter 2 | 3 | import android.view.View 4 | import android.widget.TextView 5 | import androidx.recyclerview.widget.RecyclerView 6 | import com.keylesspalace.tusky.R 7 | import com.keylesspalace.tusky.interfaces.LinkListener 8 | 9 | class HashtagViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { 10 | private val hashtag: TextView = itemView.findViewById(R.id.hashtag) 11 | 12 | fun setup(tag: String, listener: LinkListener) { 13 | hashtag.text = String.format("#%s", tag) 14 | hashtag.setOnClickListener { listener.onViewTag(tag) } 15 | } 16 | } -------------------------------------------------------------------------------- /app/src/main/java/com/keylesspalace/tusky/adapter/LoadingFooterViewHolder.kt: -------------------------------------------------------------------------------- 1 | /* Copyright 2018 Conny Duck 2 | * 3 | * This file is a part of Tusky. 4 | * 5 | * This program is free software; you can redistribute it and/or modify it under the terms of the 6 | * GNU General Public License as published by the Free Software Foundation; either version 3 of the 7 | * License, or (at your option) any later version. 8 | * 9 | * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even 10 | * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 11 | * Public License for more details. 12 | * 13 | * You should have received a copy of the GNU General Public License along with Tusky; if not, 14 | * see . */ 15 | 16 | package com.keylesspalace.tusky.adapter 17 | 18 | import androidx.recyclerview.widget.RecyclerView 19 | import android.view.View 20 | 21 | class LoadingFooterViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) -------------------------------------------------------------------------------- /app/src/main/java/com/keylesspalace/tusky/adapter/SingleViewHolder.java: -------------------------------------------------------------------------------- 1 | package com.keylesspalace.tusky.adapter; 2 | 3 | import androidx.recyclerview.widget.RecyclerView; 4 | import android.view.View; 5 | 6 | // empty class to be able to instantiate ViewHolder which is abstract for dumbass reason 7 | public class SingleViewHolder extends RecyclerView.ViewHolder { 8 | public SingleViewHolder(View view) { 9 | super(view); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /app/src/main/java/com/keylesspalace/tusky/appstore/EventsHub.kt: -------------------------------------------------------------------------------- 1 | package com.keylesspalace.tusky.appstore 2 | 3 | import io.reactivex.Observable 4 | import io.reactivex.subjects.PublishSubject 5 | 6 | interface Event 7 | interface Dispatchable : Event 8 | 9 | interface EventHub { 10 | val events: Observable 11 | fun dispatch(event: Dispatchable) 12 | } 13 | 14 | object EventHubImpl : EventHub { 15 | 16 | private val eventsSubject = PublishSubject.create() 17 | override val events: Observable = eventsSubject 18 | 19 | override fun dispatch(event: Dispatchable) { 20 | eventsSubject.onNext(event) 21 | } 22 | } -------------------------------------------------------------------------------- /app/src/main/java/com/keylesspalace/tusky/components/chat/ChatViewModel.kt: -------------------------------------------------------------------------------- 1 | package com.keylesspalace.tusky.components.chat 2 | 3 | import com.keylesspalace.tusky.components.common.CommonComposeViewModel 4 | import com.keylesspalace.tusky.components.common.MediaUploader 5 | import com.keylesspalace.tusky.components.compose.ComposeActivity 6 | import com.keylesspalace.tusky.db.AccountManager 7 | import com.keylesspalace.tusky.db.AppDatabase 8 | import com.keylesspalace.tusky.network.MastodonApi 9 | import com.keylesspalace.tusky.service.ServiceClient 10 | import com.keylesspalace.tusky.util.* 11 | import javax.inject.Inject 12 | 13 | open class ChatViewModel 14 | @Inject constructor( 15 | private val api: MastodonApi, 16 | private val accountManager: AccountManager, 17 | private val mediaUploader: MediaUploader, 18 | private val serviceClient: ServiceClient, 19 | private val saveTootHelper: SaveTootHelper, 20 | private val db: AppDatabase 21 | ) : CommonComposeViewModel(api, accountManager, mediaUploader, db) { 22 | 23 | fun getSingleMedia() : ComposeActivity.QueuedMedia? { 24 | return if(media.value?.isNotEmpty() == true) 25 | media.value?.get(0) 26 | else null 27 | } 28 | 29 | } -------------------------------------------------------------------------------- /app/src/main/java/com/keylesspalace/tusky/components/instancemute/interfaces/InstanceActionListener.kt: -------------------------------------------------------------------------------- 1 | package com.keylesspalace.tusky.components.instancemute.interfaces 2 | 3 | interface InstanceActionListener { 4 | fun mute(mute: Boolean, instance: String, position: Int) 5 | } -------------------------------------------------------------------------------- /app/src/main/java/com/keylesspalace/tusky/components/notifications/Notifier.kt: -------------------------------------------------------------------------------- 1 | package com.keylesspalace.tusky.components.notifications 2 | 3 | import android.content.Context 4 | import com.keylesspalace.tusky.db.AccountEntity 5 | import com.keylesspalace.tusky.entity.Notification 6 | 7 | /** 8 | * Shows notifications. 9 | */ 10 | interface Notifier { 11 | fun show(notification: Notification, account: AccountEntity, isFirstInBatch: Boolean) 12 | } 13 | 14 | class SystemNotifier( 15 | private val context: Context 16 | ) : Notifier { 17 | override fun show(notification: Notification, account: AccountEntity, isFirstInBatch: Boolean) { 18 | NotificationHelper.make(context, notification, account, isFirstInBatch) 19 | } 20 | } -------------------------------------------------------------------------------- /app/src/main/java/com/keylesspalace/tusky/components/report/Screen.kt: -------------------------------------------------------------------------------- 1 | /* Copyright 2019 Joel Pyska 2 | * 3 | * This file is a part of Tusky. 4 | * 5 | * This program is free software; you can redistribute it and/or modify it under the terms of the 6 | * GNU General Public License as published by the Free Software Foundation; either version 3 of the 7 | * License, or (at your option) any later version. 8 | * 9 | * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even 10 | * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 11 | * Public License for more details. 12 | * 13 | * You should have received a copy of the GNU General Public License along with Tusky; if not, 14 | * see . */ 15 | 16 | package com.keylesspalace.tusky.components.report 17 | 18 | enum class Screen { 19 | Statuses, 20 | Note, 21 | Done, 22 | Back, 23 | Finish 24 | } -------------------------------------------------------------------------------- /app/src/main/java/com/keylesspalace/tusky/components/report/adapter/AdapterHandler.kt: -------------------------------------------------------------------------------- 1 | /* Copyright 2019 Joel Pyska 2 | * 3 | * This file is a part of Tusky. 4 | * 5 | * This program is free software; you can redistribute it and/or modify it under the terms of the 6 | * GNU General Public License as published by the Free Software Foundation; either version 3 of the 7 | * License, or (at your option) any later version. 8 | * 9 | * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even 10 | * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 11 | * Public License for more details. 12 | * 13 | * You should have received a copy of the GNU General Public License along with Tusky; if not, 14 | * see . */ 15 | 16 | package com.keylesspalace.tusky.components.report.adapter 17 | 18 | import android.view.View 19 | import com.keylesspalace.tusky.entity.Attachment 20 | import com.keylesspalace.tusky.entity.Status 21 | import com.keylesspalace.tusky.interfaces.LinkListener 22 | import java.util.ArrayList 23 | 24 | interface AdapterHandler: LinkListener { 25 | fun showMedia(v: View?, status: Status?, idx: Int) 26 | fun setStatusChecked(status: Status, isChecked: Boolean) 27 | fun isStatusChecked(id: String): Boolean 28 | } -------------------------------------------------------------------------------- /app/src/main/java/com/keylesspalace/tusky/components/search/SearchType.kt: -------------------------------------------------------------------------------- 1 | package com.keylesspalace.tusky.components.search 2 | 3 | enum class SearchType(val apiParameter: String) { 4 | Status("statuses"), 5 | Account("accounts"), 6 | Hashtag("hashtags") 7 | } -------------------------------------------------------------------------------- /app/src/main/java/com/keylesspalace/tusky/db/AccountDao.kt: -------------------------------------------------------------------------------- 1 | /* Copyright 2018 Conny Duck 2 | * 3 | * This file is a part of Tusky. 4 | * 5 | * This program is free software; you can redistribute it and/or modify it under the terms of the 6 | * GNU General Public License as published by the Free Software Foundation; either version 3 of the 7 | * License, or (at your option) any later version. 8 | * 9 | * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even 10 | * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 11 | * Public License for more details. 12 | * 13 | * You should have received a copy of the GNU General Public License along with Tusky; if not, 14 | * see . */ 15 | 16 | package com.keylesspalace.tusky.db 17 | 18 | import androidx.room.* 19 | 20 | @Dao 21 | interface AccountDao { 22 | @Insert(onConflict = OnConflictStrategy.REPLACE) 23 | fun insertOrReplace(account: AccountEntity): Long 24 | 25 | @Delete 26 | fun delete(account: AccountEntity) 27 | 28 | @Query("SELECT * FROM AccountEntity ORDER BY id ASC") 29 | fun loadAll(): List 30 | 31 | } 32 | -------------------------------------------------------------------------------- /app/src/main/java/com/keylesspalace/tusky/db/ChatEntity.kt: -------------------------------------------------------------------------------- 1 | package com.keylesspalace.tusky.db 2 | 3 | import androidx.room.* 4 | 5 | @Entity( 6 | primaryKeys = ["localId", "chatId"] 7 | ) 8 | data class ChatEntity ( 9 | val localId: Long, /* our user account id */ 10 | val chatId: String, 11 | val accountId: String, 12 | val unread: Long, 13 | val updatedAt: Long, 14 | val lastMessageId: String? 15 | ) 16 | 17 | data class ChatEntityWithAccount ( 18 | @Embedded val chat: ChatEntity, 19 | @Embedded(prefix = "a_") val account: TimelineAccountEntity?, 20 | @Embedded(prefix = "msg_") val lastMessage: ChatMessageEntity? = null 21 | ) -------------------------------------------------------------------------------- /app/src/main/java/com/keylesspalace/tusky/db/ChatMessageEntity.kt: -------------------------------------------------------------------------------- 1 | package com.keylesspalace.tusky.db 2 | 3 | import androidx.room.Entity 4 | 5 | /* 6 | * ChatMessage model 7 | */ 8 | 9 | @Entity( 10 | primaryKeys = ["localId", "messageId"] 11 | ) 12 | data class ChatMessageEntity( 13 | val localId: Long, 14 | val messageId: String, 15 | val content: String?, 16 | val chatId: String, 17 | val accountId: String, 18 | val createdAt: Long, 19 | val attachment: String?, 20 | val emojis: String 21 | ) -------------------------------------------------------------------------------- /app/src/main/java/com/keylesspalace/tusky/db/InstanceDao.kt: -------------------------------------------------------------------------------- 1 | /* Copyright 2018 Conny Duck 2 | * 3 | * This file is a part of Tusky. 4 | * 5 | * This program is free software; you can redistribute it and/or modify it under the terms of the 6 | * GNU General Public License as published by the Free Software Foundation; either version 3 of the 7 | * License, or (at your option) any later version. 8 | * 9 | * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even 10 | * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 11 | * Public License for more details. 12 | * 13 | * You should have received a copy of the GNU General Public License along with Tusky; if not, 14 | * see . */ 15 | 16 | package com.keylesspalace.tusky.db 17 | 18 | import androidx.room.Dao 19 | import androidx.room.Insert 20 | import androidx.room.OnConflictStrategy 21 | import androidx.room.Query 22 | import io.reactivex.Single 23 | 24 | @Dao 25 | interface InstanceDao { 26 | @Insert(onConflict = OnConflictStrategy.REPLACE) 27 | fun insertOrReplace(instance: InstanceEntity) 28 | 29 | @Query("SELECT * FROM InstanceEntity WHERE instance = :instance LIMIT 1") 30 | fun loadMetadataForInstance(instance: String): Single 31 | } 32 | -------------------------------------------------------------------------------- /app/src/main/java/com/keylesspalace/tusky/db/InstanceEntity.kt: -------------------------------------------------------------------------------- 1 | /* Copyright 2018 Conny Duck 2 | * 3 | * This file is a part of Tusky. 4 | * 5 | * This program is free software; you can redistribute it and/or modify it under the terms of the 6 | * GNU General Public License as published by the Free Software Foundation; either version 3 of the 7 | * License, or (at your option) any later version. 8 | * 9 | * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even 10 | * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 11 | * Public License for more details. 12 | * 13 | * You should have received a copy of the GNU General Public License along with Tusky; if not, 14 | * see . */ 15 | 16 | package com.keylesspalace.tusky.db 17 | 18 | import androidx.room.Entity 19 | import androidx.room.PrimaryKey 20 | import androidx.room.TypeConverters 21 | import com.keylesspalace.tusky.entity.Emoji 22 | 23 | @Entity 24 | @TypeConverters(Converters::class) 25 | data class InstanceEntity( 26 | @field:PrimaryKey var instance: String, 27 | val emojiList: List?, 28 | val maximumTootCharacters: Int?, 29 | val maxPollOptions: Int?, 30 | val maxPollOptionLength: Int?, 31 | val version: String?, 32 | val chatLimit: Int? 33 | ) 34 | -------------------------------------------------------------------------------- /app/src/main/java/com/keylesspalace/tusky/di/GlideModule.kt: -------------------------------------------------------------------------------- 1 | package com.keylesspalace.tusky.di 2 | 3 | import com.keylesspalace.tusky.util.OmittedDomainAppModule 4 | import dagger.Module 5 | import dagger.android.ContributesAndroidInjector 6 | 7 | @Module 8 | abstract class GlideModule { 9 | @ContributesAndroidInjector 10 | abstract fun provideOmittedDomainAppModule() : OmittedDomainAppModule 11 | 12 | } -------------------------------------------------------------------------------- /app/src/main/java/com/keylesspalace/tusky/di/Injectable.kt: -------------------------------------------------------------------------------- 1 | /* Copyright 2018 charlag 2 | * 3 | * This file is a part of Tusky. 4 | * 5 | * This program is free software; you can redistribute it and/or modify it under the terms of the 6 | * GNU General Public License as published by the Free Software Foundation; either version 3 of the 7 | * License, or (at your option) any later version. 8 | * 9 | * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even 10 | * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 11 | * Public License for more details. 12 | * 13 | * You should have received a copy of the GNU General Public License along with Tusky; if not, 14 | * see . */ 15 | 16 | 17 | package com.keylesspalace.tusky.di 18 | 19 | /** 20 | * Created by charlag on 3/24/18. 21 | */ 22 | 23 | interface Injectable -------------------------------------------------------------------------------- /app/src/main/java/com/keylesspalace/tusky/di/MediaUploaderModule.kt: -------------------------------------------------------------------------------- 1 | /* Copyright 2019 Tusky Contributors 2 | * 3 | * This file is a part of Tusky. 4 | * 5 | * This program is free software; you can redistribute it and/or modify it under the terms of the 6 | * GNU General Public License as published by the Free Software Foundation; either version 3 of the 7 | * License, or (at your option) any later version. 8 | * 9 | * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even 10 | * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 11 | * Public License for more details. 12 | * 13 | * You should have received a copy of the GNU General Public License along with Tusky; if not, 14 | * see . */ 15 | 16 | package com.keylesspalace.tusky.di 17 | 18 | import android.content.Context 19 | import com.keylesspalace.tusky.components.common.MediaUploader 20 | import com.keylesspalace.tusky.components.common.MediaUploaderImpl 21 | import com.keylesspalace.tusky.network.MastodonApi 22 | import dagger.Module 23 | import dagger.Provides 24 | 25 | @Module 26 | class MediaUploaderModule { 27 | @Provides 28 | fun providesMediaUploder(context: Context, mastodonApi: MastodonApi): MediaUploader = 29 | MediaUploaderImpl(context, mastodonApi) 30 | } -------------------------------------------------------------------------------- /app/src/main/java/com/keylesspalace/tusky/di/RepositoryModule.kt: -------------------------------------------------------------------------------- 1 | package com.keylesspalace.tusky.di 2 | 3 | import com.google.gson.Gson 4 | import com.keylesspalace.tusky.db.AccountManager 5 | import com.keylesspalace.tusky.db.AppDatabase 6 | import com.keylesspalace.tusky.network.MastodonApi 7 | import com.keylesspalace.tusky.repository.ChatRepository 8 | import com.keylesspalace.tusky.repository.ChatRepositoryImpl 9 | import com.keylesspalace.tusky.repository.TimelineRepository 10 | import com.keylesspalace.tusky.repository.TimelineRepositoryImpl 11 | import dagger.Module 12 | import dagger.Provides 13 | 14 | @Module 15 | class RepositoryModule { 16 | @Provides 17 | fun providesTimelineRepository( 18 | db: AppDatabase, 19 | mastodonApi: MastodonApi, 20 | accountManager: AccountManager, 21 | gson: Gson 22 | ): TimelineRepository { 23 | return TimelineRepositoryImpl(db.timelineDao(), mastodonApi, accountManager, gson) 24 | } 25 | 26 | @Provides 27 | fun providesChatRepository( 28 | db: AppDatabase, 29 | mastodonApi: MastodonApi, 30 | accountManager: AccountManager, 31 | gson: Gson 32 | ): ChatRepository { 33 | return ChatRepositoryImpl(db.chatsDao(), mastodonApi, accountManager, gson) 34 | } 35 | } -------------------------------------------------------------------------------- /app/src/main/java/com/keylesspalace/tusky/entity/AccessToken.kt: -------------------------------------------------------------------------------- 1 | /* Copyright 2017 Andrew Dawson 2 | * 3 | * This file is a part of Tusky. 4 | * 5 | * This program is free software; you can redistribute it and/or modify it under the terms of the 6 | * GNU General Public License as published by the Free Software Foundation; either version 3 of the 7 | * License, or (at your option) any later version. 8 | * 9 | * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even 10 | * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 11 | * Public License for more details. 12 | * 13 | * You should have received a copy of the GNU General Public License along with Tusky; if not, 14 | * see . */ 15 | 16 | package com.keylesspalace.tusky.entity 17 | 18 | import com.google.gson.annotations.SerializedName 19 | 20 | data class AccessToken( 21 | @SerializedName("access_token") val accessToken: String 22 | ) 23 | -------------------------------------------------------------------------------- /app/src/main/java/com/keylesspalace/tusky/entity/AppCredentials.kt: -------------------------------------------------------------------------------- 1 | /* Copyright 2017 Andrew Dawson 2 | * 3 | * This file is a part of Tusky. 4 | * 5 | * This program is free software; you can redistribute it and/or modify it under the terms of the 6 | * GNU General Public License as published by the Free Software Foundation; either version 3 of the 7 | * License, or (at your option) any later version. 8 | * 9 | * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even 10 | * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 11 | * Public License for more details. 12 | * 13 | * You should have received a copy of the GNU General Public License along with Tusky; if not, 14 | * see . */ 15 | 16 | package com.keylesspalace.tusky.entity 17 | 18 | import com.google.gson.annotations.SerializedName 19 | 20 | data class AppCredentials( 21 | @SerializedName("client_id") val clientId: String, 22 | @SerializedName("client_secret") val clientSecret: String 23 | ) 24 | -------------------------------------------------------------------------------- /app/src/main/java/com/keylesspalace/tusky/entity/Conversation.kt: -------------------------------------------------------------------------------- 1 | /* Copyright 2019 Conny Duck 2 | * 3 | * This file is a part of Tusky. 4 | * 5 | * This program is free software; you can redistribute it and/or modify it under the terms of the 6 | * GNU General Public License as published by the Free Software Foundation; either version 3 of the 7 | * License, or (at your option) any later version. 8 | * 9 | * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even 10 | * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 11 | * Public License for more details. 12 | * 13 | * You should have received a copy of the GNU General Public License along with Tusky; if not, 14 | * see . */ 15 | 16 | package com.keylesspalace.tusky.entity 17 | 18 | import com.google.gson.annotations.SerializedName 19 | 20 | data class Conversation( 21 | val id: String, 22 | val accounts: List, 23 | @SerializedName("last_status") val lastStatus: Status?, // should never be null, but apparently its possible https://github.com/tuskyapp/Tusky/issues/1038 24 | val unread: Boolean 25 | ) -------------------------------------------------------------------------------- /app/src/main/java/com/keylesspalace/tusky/entity/HashTag.kt: -------------------------------------------------------------------------------- 1 | package com.keylesspalace.tusky.entity 2 | 3 | data class HashTag(val name: String) -------------------------------------------------------------------------------- /app/src/main/java/com/keylesspalace/tusky/entity/IdentityProof.kt: -------------------------------------------------------------------------------- 1 | package com.keylesspalace.tusky.entity 2 | 3 | import com.google.gson.annotations.SerializedName 4 | 5 | data class IdentityProof( 6 | val provider: String, 7 | @SerializedName("provider_username") val username: String, 8 | @SerializedName("profile_url") val profileUrl: String 9 | ) 10 | -------------------------------------------------------------------------------- /app/src/main/java/com/keylesspalace/tusky/entity/Marker.kt: -------------------------------------------------------------------------------- 1 | package com.keylesspalace.tusky.entity 2 | 3 | import com.google.gson.annotations.SerializedName 4 | import java.util.* 5 | 6 | /** 7 | * API type for saving the scroll position of a timeline. 8 | */ 9 | data class Marker( 10 | @SerializedName("last_read_id") 11 | val lastReadId: String, 12 | val version: Int, 13 | @SerializedName("updated_at") 14 | val updatedAt: Date 15 | ) -------------------------------------------------------------------------------- /app/src/main/java/com/keylesspalace/tusky/entity/MastoList.kt: -------------------------------------------------------------------------------- 1 | /* Copyright 2017 Andrew Dawson 2 | * 3 | * This file is a part of Tusky. 4 | * 5 | * This program is free software; you can redistribute it and/or modify it under the terms of the 6 | * GNU General Public License as published by the Free Software Foundation; either version 3 of the 7 | * License, or (at your option) any later version. 8 | * 9 | * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even 10 | * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 11 | * Public License for more details. 12 | * 13 | * You should have received a copy of the GNU General Public License along with Tusky; if not, 14 | * see . 15 | */ 16 | 17 | package com.keylesspalace.tusky.entity 18 | 19 | /** 20 | * Created by charlag on 1/4/18. 21 | */ 22 | 23 | data class MastoList( 24 | val id: String, 25 | val title: String 26 | ) -------------------------------------------------------------------------------- /app/src/main/java/com/keylesspalace/tusky/entity/ScheduledStatus.kt: -------------------------------------------------------------------------------- 1 | /* Copyright 2019 kyori19 2 | * 3 | * This file is a part of Tusky. 4 | * 5 | * This program is free software; you can redistribute it and/or modify it under the terms of the 6 | * GNU General Public License as published by the Free Software Foundation; either version 3 of the 7 | * License, or (at your option) any later version. 8 | * 9 | * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even 10 | * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 11 | * Public License for more details. 12 | * 13 | * You should have received a copy of the GNU General Public License along with Tusky; if not, 14 | * see . */ 15 | 16 | package com.keylesspalace.tusky.entity 17 | 18 | import com.google.gson.annotations.SerializedName 19 | 20 | data class ScheduledStatus( 21 | val id: String, 22 | @SerializedName("scheduled_at") val scheduledAt: String, 23 | val params: StatusParams, 24 | @SerializedName("media_attachments") val mediaAttachments: ArrayList 25 | ) 26 | -------------------------------------------------------------------------------- /app/src/main/java/com/keylesspalace/tusky/entity/SearchResult.kt: -------------------------------------------------------------------------------- 1 | /* Copyright 2017 Andrew Dawson 2 | * 3 | * This file is a part of Tusky. 4 | * 5 | * This program is free software; you can redistribute it and/or modify it under the terms of the 6 | * GNU General Public License as published by the Free Software Foundation; either version 3 of the 7 | * License, or (at your option) any later version. 8 | * 9 | * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even 10 | * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 11 | * Public License for more details. 12 | * 13 | * You should have received a copy of the GNU General Public License along with Tusky; if not, 14 | * see . */ 15 | 16 | package com.keylesspalace.tusky.entity 17 | 18 | data class SearchResult ( 19 | val accounts: List, 20 | val statuses: List, 21 | val hashtags: List 22 | ) 23 | -------------------------------------------------------------------------------- /app/src/main/java/com/keylesspalace/tusky/entity/StatusContext.kt: -------------------------------------------------------------------------------- 1 | /* Copyright 2017 Andrew Dawson 2 | * 3 | * This file is a part of Tusky. 4 | * 5 | * This program is free software; you can redistribute it and/or modify it under the terms of the 6 | * GNU General Public License as published by the Free Software Foundation; either version 3 of the 7 | * License, or (at your option) any later version. 8 | * 9 | * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even 10 | * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 11 | * Public License for more details. 12 | * 13 | * You should have received a copy of the GNU General Public License along with Tusky; if not, 14 | * see . */ 15 | 16 | package com.keylesspalace.tusky.entity 17 | 18 | data class StatusContext ( 19 | val ancestors: List, 20 | val descendants: List 21 | ) 22 | -------------------------------------------------------------------------------- /app/src/main/java/com/keylesspalace/tusky/entity/StatusParams.kt: -------------------------------------------------------------------------------- 1 | /* Copyright 2019 kyori19 2 | * 3 | * This file is a part of Tusky. 4 | * 5 | * This program is free software; you can redistribute it and/or modify it under the terms of the 6 | * GNU General Public License as published by the Free Software Foundation; either version 3 of the 7 | * License, or (at your option) any later version. 8 | * 9 | * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even 10 | * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 11 | * Public License for more details. 12 | * 13 | * You should have received a copy of the GNU General Public License along with Tusky; if not, 14 | * see . */ 15 | 16 | package com.keylesspalace.tusky.entity 17 | 18 | import com.google.gson.annotations.SerializedName 19 | 20 | data class StatusParams( 21 | val text: String, 22 | val sensitive: Boolean, 23 | val visibility: Status.Visibility, 24 | @SerializedName("spoiler_text") val spoilerText: String, 25 | @SerializedName("in_reply_to_id") val inReplyToId: String? 26 | ) -------------------------------------------------------------------------------- /app/src/main/java/com/keylesspalace/tusky/entity/Sticker.kt: -------------------------------------------------------------------------------- 1 | /* Copyright 2018 Conny Duck 2 | * 3 | * This file is a part of Tusky. 4 | * 5 | * This program is free software; you can redistribute it and/or modify it under the terms of the 6 | * GNU General Public License as published by the Free Software Foundation; either version 3 of the 7 | * License, or (at your option) any later version. 8 | * 9 | * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even 10 | * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 11 | * Public License for more details. 12 | * 13 | * You should have received a copy of the GNU General Public License along with Tusky; if not, 14 | * see . */ 15 | 16 | package com.keylesspalace.tusky.entity 17 | 18 | import android.os.Parcelable 19 | import kotlinx.android.parcel.Parcelize 20 | 21 | data class StickerPack( 22 | val title: String, 23 | val tabIcon: String, 24 | val stickers: List, 25 | var internal_url: String = "" 26 | ) : Comparable { 27 | override fun compareTo(pack: StickerPack) : Int { 28 | return title.compareTo(pack.title) 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /app/src/main/java/com/keylesspalace/tusky/entity/StreamEvent.kt: -------------------------------------------------------------------------------- 1 | package com.keylesspalace.tusky.entity 2 | 3 | import com.google.gson.annotations.SerializedName 4 | 5 | data class StreamEvent ( 6 | val event: EventType, 7 | val payload: String 8 | ) { 9 | enum class EventType { 10 | UNKNOWN, 11 | @SerializedName("update") 12 | UPDATE, 13 | @SerializedName("notification") 14 | NOTIFICATION, 15 | @SerializedName("delete") 16 | DELETE, 17 | @SerializedName("filters_changed") 18 | FILTERS_CHANGED; 19 | } 20 | } -------------------------------------------------------------------------------- /app/src/main/java/com/keylesspalace/tusky/interfaces/AccountActionListener.java: -------------------------------------------------------------------------------- 1 | /* Copyright 2017 Andrew Dawson 2 | * 3 | * This file is a part of Tusky. 4 | * 5 | * This program is free software; you can redistribute it and/or modify it under the terms of the 6 | * GNU General Public License as published by the Free Software Foundation; either version 3 of the 7 | * License, or (at your option) any later version. 8 | * 9 | * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even 10 | * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 11 | * Public License for more details. 12 | * 13 | * You should have received a copy of the GNU General Public License along with Tusky; if not, 14 | * see . */ 15 | 16 | package com.keylesspalace.tusky.interfaces; 17 | 18 | public interface AccountActionListener { 19 | void onViewAccount(String id); 20 | void onMute(final boolean mute, final String id, final int position, final boolean notifications); 21 | void onBlock(final boolean block, final String id, final int position); 22 | void onRespondToFollowRequest(final boolean accept, final String id, final int position); 23 | } 24 | -------------------------------------------------------------------------------- /app/src/main/java/com/keylesspalace/tusky/interfaces/AccountSelectionListener.kt: -------------------------------------------------------------------------------- 1 | /* Copyright 2019 Levi Bard 2 | * 3 | * This file is a part of Tusky. 4 | * 5 | * This program is free software; you can redistribute it and/or modify it under the terms of the 6 | * GNU General Public License as published by the Free Software Foundation; either version 3 of the 7 | * License, or (at your option) any later version. 8 | * 9 | * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even 10 | * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 11 | * Public License for more details. 12 | * 13 | * You should have received a copy of the GNU General Public License along with Tusky; if not, 14 | * see . */ 15 | 16 | package com.keylesspalace.tusky.interfaces 17 | 18 | import com.keylesspalace.tusky.db.AccountEntity 19 | 20 | interface AccountSelectionListener { 21 | fun onAccountSelected(account: AccountEntity) 22 | } -------------------------------------------------------------------------------- /app/src/main/java/com/keylesspalace/tusky/interfaces/ActionButtonActivity.java: -------------------------------------------------------------------------------- 1 | /* Copyright 2017 Andrew Dawson 2 | * 3 | * This file is a part of Tusky. 4 | * 5 | * This program is free software; you can redistribute it and/or modify it under the terms of the 6 | * GNU General Public License as published by the Free Software Foundation; either version 3 of the 7 | * License, or (at your option) any later version. 8 | * 9 | * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even 10 | * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 11 | * Public License for more details. 12 | * 13 | * You should have received a copy of the GNU General Public License along with Tusky; if not, 14 | * see . */ 15 | 16 | package com.keylesspalace.tusky.interfaces; 17 | 18 | import androidx.annotation.Nullable; 19 | import com.google.android.material.floatingactionbutton.FloatingActionButton; 20 | 21 | public interface ActionButtonActivity { 22 | 23 | /* return the ActionButton of the Activity to hide or show it on scroll */ 24 | @Nullable 25 | FloatingActionButton getActionButton(); 26 | 27 | default void onActionButtonHidden() {} 28 | } 29 | -------------------------------------------------------------------------------- /app/src/main/java/com/keylesspalace/tusky/interfaces/ChatActionListener.kt: -------------------------------------------------------------------------------- 1 | package com.keylesspalace.tusky.interfaces 2 | 3 | import android.view.View 4 | import com.keylesspalace.tusky.entity.Chat 5 | 6 | interface ChatActionListener: LinkListener { 7 | fun onLoadMore(position: Int) {} 8 | fun onMore(chatId: String, v: View) {} 9 | fun openChat(position: Int) {} 10 | fun onViewMedia(position: Int, view: View?) {} 11 | } -------------------------------------------------------------------------------- /app/src/main/java/com/keylesspalace/tusky/interfaces/LinkListener.java: -------------------------------------------------------------------------------- 1 | /* Copyright 2017 Andrew Dawson 2 | * 3 | * This file is a part of Tusky. 4 | * 5 | * This program is free software; you can redistribute it and/or modify it under the terms of the 6 | * GNU General Public License as published by the Free Software Foundation; either version 3 of the 7 | * License, or (at your option) any later version. 8 | * 9 | * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even 10 | * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 11 | * Public License for more details. 12 | * 13 | * You should have received a copy of the GNU General Public License along with Tusky; if not, 14 | * see . */ 15 | 16 | package com.keylesspalace.tusky.interfaces; 17 | 18 | public interface LinkListener { 19 | void onViewTag(String tag); 20 | void onViewAccount(String id); 21 | void onViewUrl(String url); 22 | } 23 | -------------------------------------------------------------------------------- /app/src/main/java/com/keylesspalace/tusky/interfaces/PermissionRequester.java: -------------------------------------------------------------------------------- 1 | package com.keylesspalace.tusky.interfaces; 2 | 3 | public interface PermissionRequester { 4 | void onRequestPermissionsResult(String[] permissions, int[] grantResults); 5 | } -------------------------------------------------------------------------------- /app/src/main/java/com/keylesspalace/tusky/interfaces/RefreshableFragment.kt: -------------------------------------------------------------------------------- 1 | package com.keylesspalace.tusky.interfaces 2 | 3 | /** 4 | * Created by pandasoft (joelpyska1@gmail.com) on 04/04/2019. 5 | */ 6 | interface RefreshableFragment { 7 | /** 8 | * Call this method to refresh fragment content 9 | */ 10 | fun refreshContent() 11 | } -------------------------------------------------------------------------------- /app/src/main/java/com/keylesspalace/tusky/interfaces/ReselectableFragment.kt: -------------------------------------------------------------------------------- 1 | package com.keylesspalace.tusky.interfaces 2 | 3 | /** 4 | * Created by pandasoft (joelpyska1@gmail.com) on 04/04/2019. 5 | */ 6 | interface ReselectableFragment { 7 | /** 8 | * Call this method when tab reselected 9 | */ 10 | fun onReselect() 11 | } -------------------------------------------------------------------------------- /app/src/main/java/com/keylesspalace/tusky/pager/AvatarImagePagerAdapter.kt: -------------------------------------------------------------------------------- 1 | package com.keylesspalace.tusky.pager 2 | 3 | import androidx.fragment.app.Fragment 4 | import androidx.fragment.app.FragmentActivity 5 | import com.keylesspalace.tusky.ViewMediaAdapter 6 | import com.keylesspalace.tusky.fragment.ViewMediaFragment 7 | 8 | class AvatarImagePagerAdapter( 9 | activity: FragmentActivity, 10 | private val avatarUrl: String 11 | ) : ViewMediaAdapter(activity) { 12 | 13 | override fun createFragment(position: Int): Fragment { 14 | return if (position == 0) { 15 | ViewMediaFragment.newAvatarInstance(avatarUrl) 16 | } else { 17 | throw IllegalStateException() 18 | } 19 | } 20 | 21 | override fun getItemCount() = 1 22 | 23 | override fun onTransitionEnd(position: Int) { 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /app/src/main/java/com/keylesspalace/tusky/pager/MainPagerAdapter.kt: -------------------------------------------------------------------------------- 1 | /* Copyright 2017 Andrew Dawson 2 | * 3 | * This file is a part of Tusky. 4 | * 5 | * This program is free software; you can redistribute it and/or modify it under the terms of the 6 | * GNU General Public License as published by the Free Software Foundation; either version 3 of the 7 | * License, or (at your option) any later version. 8 | * 9 | * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even 10 | * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 11 | * Public License for more details. 12 | * 13 | * You should have received a copy of the GNU General Public License along with Tusky; if not, 14 | * see . */ 15 | 16 | package com.keylesspalace.tusky.pager 17 | 18 | import androidx.fragment.app.Fragment 19 | import androidx.fragment.app.FragmentActivity 20 | import com.keylesspalace.tusky.TabData 21 | import com.keylesspalace.tusky.util.CustomFragmentStateAdapter 22 | 23 | class MainPagerAdapter(val tabs: List, activity: FragmentActivity) : CustomFragmentStateAdapter(activity) { 24 | 25 | override fun createFragment(position: Int): Fragment { 26 | val tab = tabs[position] 27 | return tab.fragment(tab.arguments) 28 | } 29 | 30 | override fun getItemCount() = tabs.size 31 | 32 | } 33 | -------------------------------------------------------------------------------- /app/src/main/java/com/keylesspalace/tusky/util/BindingViewHolder.kt: -------------------------------------------------------------------------------- 1 | package com.keylesspalace.tusky.util 2 | 3 | import androidx.recyclerview.widget.RecyclerView 4 | import androidx.viewbinding.ViewBinding 5 | 6 | class BindingViewHolder( 7 | val binding: T 8 | ) : RecyclerView.ViewHolder(binding.root) 9 | -------------------------------------------------------------------------------- /app/src/main/java/com/keylesspalace/tusky/util/CardViewMode.kt: -------------------------------------------------------------------------------- 1 | package com.keylesspalace.tusky.util 2 | 3 | enum class CardViewMode { 4 | NONE, 5 | FULL_WIDTH, 6 | INDENTED 7 | } -------------------------------------------------------------------------------- /app/src/main/java/com/keylesspalace/tusky/util/ClickableSpanNoUnderline.kt: -------------------------------------------------------------------------------- 1 | package com.keylesspalace.tusky.util 2 | 3 | import android.text.TextPaint 4 | import android.text.style.ClickableSpan 5 | 6 | abstract class ClickableSpanNoUnderline : ClickableSpan() { 7 | override fun updateDrawState(ds: TextPaint) { 8 | super.updateDrawState(ds) 9 | ds.isUnderlineText = false 10 | } 11 | } -------------------------------------------------------------------------------- /app/src/main/java/com/keylesspalace/tusky/util/CustomFragmentStateAdapter.kt: -------------------------------------------------------------------------------- 1 | /* Copyright 2019 Tusky Contributors 2 | * 3 | * This file is a part of Tusky. 4 | * 5 | * This program is free software; you can redistribute it and/or modify it under the terms of the 6 | * GNU General Public License as published by the Free Software Foundation; either version 3 of the 7 | * License, or (at your option) any later version. 8 | * 9 | * Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even 10 | * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 11 | * Public License for more details. 12 | * 13 | * You should have received a copy of the GNU General Public License along with Tusky; if not, 14 | * see . */ 15 | 16 | package com.keylesspalace.tusky.util 17 | 18 | import androidx.fragment.app.Fragment 19 | import androidx.fragment.app.FragmentActivity 20 | import androidx.viewpager2.adapter.FragmentStateAdapter 21 | 22 | abstract class CustomFragmentStateAdapter( 23 | private val activity: FragmentActivity 24 | ): FragmentStateAdapter(activity) { 25 | 26 | fun getFragment(position: Int): Fragment? 27 | = activity.supportFragmentManager.findFragmentByTag("f" + getItemId(position)) 28 | } 29 | -------------------------------------------------------------------------------- /app/src/main/java/com/keylesspalace/tusky/util/CustomURLSpan.java: -------------------------------------------------------------------------------- 1 | package com.keylesspalace.tusky.util; 2 | 3 | import android.os.Parcel; 4 | import android.os.Parcelable; 5 | import android.text.TextPaint; 6 | import android.text.style.URLSpan; 7 | import android.view.View; 8 | 9 | public class CustomURLSpan extends URLSpan { 10 | public CustomURLSpan(String url) { 11 | super(url); 12 | } 13 | 14 | private CustomURLSpan(Parcel src) { 15 | super(src); 16 | } 17 | 18 | public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { 19 | 20 | @Override 21 | public CustomURLSpan createFromParcel(Parcel source) { 22 | return new CustomURLSpan(source); 23 | } 24 | 25 | @Override 26 | public CustomURLSpan[] newArray(int size) { 27 | return new CustomURLSpan[size]; 28 | } 29 | 30 | }; 31 | 32 | @Override 33 | public void onClick(View view) { 34 | LinkHelper.openLink(getURL(), view.getContext()); 35 | } 36 | 37 | @Override public void updateDrawState(TextPaint ds) { 38 | super.updateDrawState(ds); 39 | ds.setUnderlineText(false); 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /app/src/main/java/com/keylesspalace/tusky/util/NetworkState.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2017 The Android Open Source Project 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package com.keylesspalace.tusky.util 18 | 19 | enum class Status { 20 | RUNNING, 21 | SUCCESS, 22 | FAILED 23 | } 24 | 25 | @Suppress("DataClassPrivateConstructor") 26 | data class NetworkState private constructor( 27 | val status: Status, 28 | val msg: String? = null) { 29 | companion object { 30 | val LOADED = NetworkState(Status.SUCCESS) 31 | val LOADING = NetworkState(Status.RUNNING) 32 | fun error(msg: String?) = NetworkState(Status.FAILED, msg) 33 | } 34 | } -------------------------------------------------------------------------------- /app/src/main/java/com/keylesspalace/tusky/util/Resource.kt: -------------------------------------------------------------------------------- 1 | package com.keylesspalace.tusky.util 2 | 3 | sealed class Resource(open val data: T?) 4 | 5 | class Loading (override val data: T? = null) : Resource(data) 6 | 7 | class Success (override val data: T? = null) : Resource(data) 8 | 9 | class Error (override val data: T? = null, 10 | val errorMessage: String? = null, 11 | var consumed: Boolean = false, 12 | val cause: Throwable? = null 13 | ): Resource(data) -------------------------------------------------------------------------------- /app/src/main/java/com/keylesspalace/tusky/util/RxAwareViewModel.kt: -------------------------------------------------------------------------------- 1 | package com.keylesspalace.tusky.util 2 | 3 | import androidx.annotation.CallSuper 4 | import androidx.lifecycle.ViewModel 5 | import io.reactivex.disposables.CompositeDisposable 6 | import io.reactivex.disposables.Disposable 7 | 8 | open class RxAwareViewModel : ViewModel() { 9 | val disposables = CompositeDisposable() 10 | 11 | fun Disposable.autoDispose() = disposables.add(this) 12 | 13 | @CallSuper 14 | override fun onCleared() { 15 | super.onCleared() 16 | disposables.clear() 17 | } 18 | } -------------------------------------------------------------------------------- /app/src/main/java/com/keylesspalace/tusky/util/SharedPreferencesExtensions.kt: -------------------------------------------------------------------------------- 1 | package com.keylesspalace.tusky.util 2 | 3 | import android.content.SharedPreferences 4 | 5 | fun SharedPreferences.getNonNullString(key: String, defValue: String): String { 6 | return this.getString(key, defValue) ?: defValue 7 | } 8 | -------------------------------------------------------------------------------- /app/src/main/java/com/keylesspalace/tusky/util/StatusDisplayOptions.kt: -------------------------------------------------------------------------------- 1 | package com.keylesspalace.tusky.util 2 | 3 | data class StatusDisplayOptions( 4 | @get:JvmName("animateAvatars") 5 | val animateAvatars: Boolean, 6 | @get:JvmName("mediaPreviewEnabled") 7 | val mediaPreviewEnabled: Boolean, 8 | @get:JvmName("useAbsoluteTime") 9 | val useAbsoluteTime: Boolean, 10 | @get:JvmName("showBotOverlay") 11 | val showBotOverlay: Boolean, 12 | @get:JvmName("useBlurhash") 13 | val useBlurhash: Boolean, 14 | @get:JvmName("cardViewMode") 15 | val cardViewMode: CardViewMode, 16 | @get:JvmName("confirmReblogs") 17 | val confirmReblogs: Boolean, 18 | @get:JvmName("renderStatusAsMention") 19 | val renderStatusAsMention: Boolean, 20 | @get:JvmName("hideStats") 21 | val hideStats: Boolean 22 | ) 23 | -------------------------------------------------------------------------------- /app/src/main/java/com/keylesspalace/tusky/util/ViewPager2Fix.java: -------------------------------------------------------------------------------- 1 | package com.keylesspalace.tusky.util; 2 | 3 | import androidx.viewpager2.widget.ViewPager2; 4 | import androidx.recyclerview.widget.RecyclerView; 5 | import java.lang.reflect.*; 6 | import java.lang.*; 7 | 8 | /** 9 | * ViewPager2 written by monkeys! 10 | */ 11 | public class ViewPager2Fix { 12 | /** 13 | * Thanks to @al.e.shevelev@medium.com for solution 14 | */ 15 | public static Field getViewPagerRecyclerViewField() throws NoSuchFieldException { 16 | Field f = ViewPager2.class.getDeclaredField("mRecyclerView"); 17 | f.setAccessible(true); 18 | return f; 19 | } 20 | 21 | public static Field getRecyclerViewTouchSlopField() throws NoSuchFieldException { 22 | Field f = RecyclerView.class.getDeclaredField("mTouchSlop"); 23 | f.setAccessible(true); 24 | return f; 25 | } 26 | 27 | public static void reduceVelocity(ViewPager2 pager, float val) { 28 | try { 29 | Field recyclerViewField = getViewPagerRecyclerViewField(); 30 | Field touchSlopField = getRecyclerViewTouchSlopField(); 31 | 32 | RecyclerView recyclerView = (RecyclerView)recyclerViewField.get(pager); 33 | int touchSlop = (int)touchSlopField.get(recyclerView); 34 | touchSlopField.setInt(recyclerView, (int)(touchSlop*val)); 35 | } catch(Exception e) { 36 | // all possible exceptions must be caught during tests 37 | ; 38 | } 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /app/src/main/java/com/keylesspalace/tusky/util/getErrorMessage.kt: -------------------------------------------------------------------------------- 1 | package com.keylesspalace.tusky.util 2 | 3 | import androidx.lifecycle.LiveData 4 | import androidx.lifecycle.MutableLiveData 5 | 6 | private fun getErrorMessage(report: PagingRequestHelper.StatusReport): String { 7 | return PagingRequestHelper.RequestType.values().mapNotNull { 8 | report.getErrorFor(it)?.message 9 | }.first() 10 | } 11 | 12 | fun PagingRequestHelper.createStatusLiveData(): LiveData { 13 | val liveData = MutableLiveData() 14 | addListener { report -> 15 | when { 16 | report.hasRunning() -> liveData.postValue(NetworkState.LOADING) 17 | report.hasError() -> liveData.postValue( 18 | NetworkState.error(getErrorMessage(report))) 19 | else -> liveData.postValue(NetworkState.LOADED) 20 | } 21 | } 22 | return liveData 23 | } -------------------------------------------------------------------------------- /app/src/main/java/com/keylesspalace/tusky/view/EmojiPicker.kt: -------------------------------------------------------------------------------- 1 | package com.keylesspalace.tusky.view 2 | 3 | import android.content.Context 4 | import android.util.AttributeSet 5 | import androidx.recyclerview.widget.GridLayoutManager 6 | import androidx.recyclerview.widget.RecyclerView 7 | 8 | class EmojiPicker @JvmOverloads constructor( 9 | context: Context, 10 | attrs: AttributeSet? = null 11 | ) : RecyclerView(context, attrs) { 12 | 13 | init { 14 | clipToPadding = false 15 | layoutManager = GridLayoutManager(context, 3, GridLayoutManager.HORIZONTAL, false) 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /app/src/main/java/com/keylesspalace/tusky/view/ExposedPlayPauseVideoView.kt: -------------------------------------------------------------------------------- 1 | package com.keylesspalace.tusky.view 2 | 3 | import android.content.Context 4 | import android.util.AttributeSet 5 | import android.widget.VideoView 6 | 7 | class ExposedPlayPauseVideoView @JvmOverloads constructor( 8 | context: Context, 9 | attrs: AttributeSet? = null, 10 | defStyleAttr: Int = 0) 11 | : VideoView(context, attrs, defStyleAttr) { 12 | 13 | private var listener: PlayPauseListener? = null 14 | 15 | fun setPlayPauseListener(listener: PlayPauseListener) { 16 | this.listener = listener 17 | } 18 | 19 | override fun start() { 20 | super.start() 21 | listener?.onPlay() 22 | } 23 | 24 | override fun pause() { 25 | super.pause() 26 | listener?.onPause() 27 | } 28 | 29 | interface PlayPauseListener { 30 | fun onPlay() 31 | fun onPause() 32 | } 33 | } -------------------------------------------------------------------------------- /app/src/main/java/com/keylesspalace/tusky/view/MuteAccountDialog.kt: -------------------------------------------------------------------------------- 1 | @file:JvmName("MuteAccountDialog") 2 | 3 | package com.keylesspalace.tusky.view 4 | 5 | import android.app.Activity 6 | import android.widget.CheckBox 7 | import android.widget.Spinner 8 | import android.widget.TextView 9 | import androidx.appcompat.app.AlertDialog 10 | import com.keylesspalace.tusky.R 11 | 12 | fun showMuteAccountDialog( 13 | activity: Activity, 14 | accountUsername: String, 15 | onOk: (notifications: Boolean, duration: Int) -> Unit 16 | ) { 17 | val view = activity.layoutInflater.inflate(R.layout.dialog_mute_account, null) 18 | (view.findViewById(R.id.warning) as TextView).text = 19 | activity.getString(R.string.dialog_mute_warning, accountUsername) 20 | val checkbox: CheckBox = view.findViewById(R.id.checkbox) 21 | checkbox.setChecked(true) 22 | 23 | AlertDialog.Builder(activity) 24 | .setView(view) 25 | .setPositiveButton(android.R.string.ok) { _, _ -> 26 | val spinner: Spinner = view.findViewById(R.id.duration) 27 | val durationValues = activity.resources.getIntArray(R.array.mute_duration_values) 28 | onOk(checkbox.isChecked, durationValues[spinner.selectedItemPosition]) 29 | } 30 | .setNegativeButton(android.R.string.cancel, null) 31 | .show() 32 | } -------------------------------------------------------------------------------- /app/src/main/java/com/keylesspalace/tusky/view/SquareImageView.kt: -------------------------------------------------------------------------------- 1 | package com.keylesspalace.tusky.view 2 | 3 | import android.content.Context 4 | import androidx.appcompat.widget.AppCompatImageView 5 | import android.util.AttributeSet 6 | 7 | /** 8 | * Created by charlag on 26/10/2017. 9 | */ 10 | 11 | class SquareImageView : AppCompatImageView { 12 | constructor(context: Context) : super(context) 13 | 14 | constructor(context: Context, attributes: AttributeSet) : super(context, attributes) 15 | 16 | constructor(context: Context, attributes: AttributeSet, defStyleAttr: Int) 17 | : super(context, attributes, defStyleAttr) 18 | 19 | override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) { 20 | super.onMeasure(widthMeasureSpec, heightMeasureSpec) 21 | val width = measuredWidth 22 | setMeasuredDimension(width, width) 23 | } 24 | } -------------------------------------------------------------------------------- /app/src/main/java/com/keylesspalace/tusky/viewdata/AttachmentViewData.kt: -------------------------------------------------------------------------------- 1 | package com.keylesspalace.tusky.viewdata 2 | 3 | import android.os.Parcelable 4 | import com.keylesspalace.tusky.entity.Attachment 5 | import com.keylesspalace.tusky.entity.Status 6 | import kotlinx.android.parcel.Parcelize 7 | 8 | @Parcelize 9 | data class AttachmentViewData( 10 | val attachment: Attachment, 11 | val statusId: String?, 12 | val statusUrl: String? 13 | ) : Parcelable { 14 | companion object { 15 | @JvmStatic 16 | fun list(status: Status): List { 17 | val actionable = status.actionableStatus 18 | return actionable.attachments.map { 19 | AttachmentViewData(it, actionable.id, actionable.url!!) 20 | } 21 | } 22 | 23 | fun list(attachments: List): List { 24 | return attachments.map { 25 | AttachmentViewData(it, it.id, it.url) 26 | } 27 | } 28 | 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /app/src/main/res/anim/explode.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/anim/fade_in.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/src/main/res/anim/fade_out.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/src/main/res/anim/slide_from_left.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/anim/slide_from_right.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/anim/slide_to_left.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/anim/slide_to_right.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/color/account_tab_font_color.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/color/color_background_transparent_60.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /app/src/main/res/color/compound_button_color.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/color/emoji_reaction_button.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/color/text_input_layout_box_stroke_color.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/elephant_error.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FWGS/Husky/49febda5228f3a178ffbeeda9ae38b5a1719705a/app/src/main/res/drawable-hdpi/elephant_error.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/elephant_friend.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FWGS/Husky/49febda5228f3a178ffbeeda9ae38b5a1719705a/app/src/main/res/drawable-hdpi/elephant_friend.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/elephant_friend_empty.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FWGS/Husky/49febda5228f3a178ffbeeda9ae38b5a1719705a/app/src/main/res/drawable-hdpi/elephant_friend_empty.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/elephant_offline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FWGS/Husky/49febda5228f3a178ffbeeda9ae38b5a1719705a/app/src/main/res/drawable-hdpi/elephant_offline.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_notify.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FWGS/Husky/49febda5228f3a178ffbeeda9ae38b5a1719705a/app/src/main/res/drawable-hdpi/ic_notify.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FWGS/Husky/49febda5228f3a178ffbeeda9ae38b5a1719705a/app/src/main/res/drawable-hdpi/splash.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/elephant_error.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FWGS/Husky/49febda5228f3a178ffbeeda9ae38b5a1719705a/app/src/main/res/drawable-mdpi/elephant_error.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/elephant_friend.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FWGS/Husky/49febda5228f3a178ffbeeda9ae38b5a1719705a/app/src/main/res/drawable-mdpi/elephant_friend.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/elephant_friend_empty.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FWGS/Husky/49febda5228f3a178ffbeeda9ae38b5a1719705a/app/src/main/res/drawable-mdpi/elephant_friend_empty.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/elephant_offline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FWGS/Husky/49febda5228f3a178ffbeeda9ae38b5a1719705a/app/src/main/res/drawable-mdpi/elephant_offline.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_notify.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FWGS/Husky/49febda5228f3a178ffbeeda9ae38b5a1719705a/app/src/main/res/drawable-mdpi/ic_notify.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FWGS/Husky/49febda5228f3a178ffbeeda9ae38b5a1719705a/app/src/main/res/drawable-mdpi/splash.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-v26/launcher_shadow_gradient.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/elephant_error.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FWGS/Husky/49febda5228f3a178ffbeeda9ae38b5a1719705a/app/src/main/res/drawable-xhdpi/elephant_error.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/elephant_friend.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FWGS/Husky/49febda5228f3a178ffbeeda9ae38b5a1719705a/app/src/main/res/drawable-xhdpi/elephant_friend.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/elephant_friend_empty.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FWGS/Husky/49febda5228f3a178ffbeeda9ae38b5a1719705a/app/src/main/res/drawable-xhdpi/elephant_friend_empty.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/elephant_offline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FWGS/Husky/49febda5228f3a178ffbeeda9ae38b5a1719705a/app/src/main/res/drawable-xhdpi/elephant_offline.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_notify.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FWGS/Husky/49febda5228f3a178ffbeeda9ae38b5a1719705a/app/src/main/res/drawable-xhdpi/ic_notify.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FWGS/Husky/49febda5228f3a178ffbeeda9ae38b5a1719705a/app/src/main/res/drawable-xhdpi/splash.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/elephant_error.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FWGS/Husky/49febda5228f3a178ffbeeda9ae38b5a1719705a/app/src/main/res/drawable-xxhdpi/elephant_error.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/elephant_friend.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FWGS/Husky/49febda5228f3a178ffbeeda9ae38b5a1719705a/app/src/main/res/drawable-xxhdpi/elephant_friend.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/elephant_friend_empty.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FWGS/Husky/49febda5228f3a178ffbeeda9ae38b5a1719705a/app/src/main/res/drawable-xxhdpi/elephant_friend_empty.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/elephant_offline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FWGS/Husky/49febda5228f3a178ffbeeda9ae38b5a1719705a/app/src/main/res/drawable-xxhdpi/elephant_offline.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_notify.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FWGS/Husky/49febda5228f3a178ffbeeda9ae38b5a1719705a/app/src/main/res/drawable-xxhdpi/ic_notify.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FWGS/Husky/49febda5228f3a178ffbeeda9ae38b5a1719705a/app/src/main/res/drawable-xxhdpi/splash.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/elephant_error.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FWGS/Husky/49febda5228f3a178ffbeeda9ae38b5a1719705a/app/src/main/res/drawable-xxxhdpi/elephant_error.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/elephant_friend.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FWGS/Husky/49febda5228f3a178ffbeeda9ae38b5a1719705a/app/src/main/res/drawable-xxxhdpi/elephant_friend.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/elephant_friend_empty.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FWGS/Husky/49febda5228f3a178ffbeeda9ae38b5a1719705a/app/src/main/res/drawable-xxxhdpi/elephant_friend_empty.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/elephant_offline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FWGS/Husky/49febda5228f3a178ffbeeda9ae38b5a1719705a/app/src/main/res/drawable-xxxhdpi/elephant_offline.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/ic_notify.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FWGS/Husky/49febda5228f3a178ffbeeda9ae38b5a1719705a/app/src/main/res/drawable-xxxhdpi/ic_notify.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FWGS/Husky/49febda5228f3a178ffbeeda9ae38b5a1719705a/app/src/main/res/drawable-xxxhdpi/splash.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/avatar_border.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/background_dialog_activity.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/background_splash.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/card_frame.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/card_image_placeholder.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/conversation_thread_line.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/description_bg_expanded.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_access_time.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_add_a_photo_32dp.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_alert_circle.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_attach_file_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_bbcode_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 8 | 11 | 14 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_bookmark_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_bookmark_active_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_bot_24dp.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_briefcase.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_bullhorn_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_cancel_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_check_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_check_32dp.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_check_box_outline_blank_18dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_check_circle.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_clear_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_close_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_create_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_cw_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_drag_indicator_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_drag_indicator_horiz_24dp.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_email_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_emoji_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_emoji_34dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_exit_to_app_24px.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_eye_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_favourite_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_favourite_active_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_file_download_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_forum_24px.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_hashtag.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_hide_media_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_home_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_html_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 8 | 11 | 14 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_list.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_local_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_lock_open_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_lock_outline_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_logout.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_markdown.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 11 | 15 | 16 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_menu_share_24dp.xml: -------------------------------------------------------------------------------- 1 | 16 | 22 | 25 | 26 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_more_horiz_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_music_box_24dp.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_music_box_preview_24dp.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_mute_24dp.xml: -------------------------------------------------------------------------------- 1 | 4 | 8 | 12 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_notebook.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_notifications_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_notifications_active_24dp.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 10 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_notifications_off_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 9 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_person_add_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_photo_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_play_indicator.xml: -------------------------------------------------------------------------------- 1 | 3 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_plus_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_poll_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_preview_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_public_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_radio_button_unchecked_18dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_reblog_18dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_reblog_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_reblog_active_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_reblog_direct_24dp.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_reblog_private_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_reblog_private_active_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_reject_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_repeat_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_reply_18dp.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_reply_24dp.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_reply_all_24dp.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_send_24dp.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_star_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_tabs.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_tusky.xml: -------------------------------------------------------------------------------- 1 | 6 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_videocam_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/materialdrawer_shape_large.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/materialdrawer_shape_small.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/md_bold.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/md_code.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/md_italic.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/md_link.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/md_strikethrough.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/media_preview_outline.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/media_warning_bg.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/message_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/poll_option_background.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/poll_option_shape.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/profile_badge_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/report_success_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/round_button.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/spellcheck.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/status_divider.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/unread_shape.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/layout-sw640dp/fragment_view_thread.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 14 | 15 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_account_list.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 11 | 12 | 17 | 18 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_modal_timeline.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 11 | 12 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_preferences.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 11 | 12 | 17 | 18 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_report.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 11 | 12 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_statuslist.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 11 | 12 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_view_media.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 13 | 14 | 21 | 22 | 29 | 30 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_view_tag.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 11 | 12 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_view_thread.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 11 | 12 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /app/src/main/res/layout/dialog_emoji_keyboard.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/layout/dialog_emojicompat.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 11 | 12 | 15 | 16 | 19 | 20 | 23 | 24 | 35 | 36 | -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_account_list.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 11 | 12 | 19 | -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_instance_list.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 12 | 13 | 17 | 18 | 25 | -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_view_thread.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /app/src/main/res/layout/item_add_poll_option.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 13 | 14 | 18 | 19 | 20 | 21 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /app/src/main/res/layout/item_autocomplete_divider.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/src/main/res/layout/item_autocomplete_emoji.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 20 | 21 | 32 | 33 | -------------------------------------------------------------------------------- /app/src/main/res/layout/item_autocomplete_hashtag.xml: -------------------------------------------------------------------------------- 1 | 2 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/layout/item_emoji_button.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/src/main/res/layout/item_emoji_keyboard_emoji.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 21 | -------------------------------------------------------------------------------- /app/src/main/res/layout/item_emoji_keyboard_page.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/layout/item_emoji_keyboard_sticker.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/src/main/res/layout/item_emoji_picker.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 17 | 18 | 24 | 25 | -------------------------------------------------------------------------------- /app/src/main/res/layout/item_emoji_reaction.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | -------------------------------------------------------------------------------- /app/src/main/res/layout/item_footer.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/layout/item_hashtag.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/layout/item_list.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 21 | 22 | 33 | 34 | -------------------------------------------------------------------------------- /app/src/main/res/layout/item_network_state.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 12 | 17 |