From d7574ebfc4971c77a56f3fbe22e8f960ce0dc8ef Mon Sep 17 00:00:00 2001 From: tom79 Date: Fri, 15 Nov 2019 16:32:25 +0100 Subject: [PATCH] Improve activity for bookmarks --- app/src/main/AndroidManifest.xml | 336 +- app/src/main/assets/themes/cyanea_themes.json | 66 +- .../android/activities/AboutActivity.java | 19 +- .../activities/AccountReportActivity.java | 1 - .../android/activities/AdminActivity.java | 6 - .../android/activities/BaseActivity.java | 16 +- .../android/activities/BaseMainActivity.java | 407 +- .../android/activities/BookmarkActivity.java | 8 +- .../activities/CustomSharingActivity.java | 15 +- .../activities/EditProfileActivity.java | 40 +- .../android/activities/GroupActivity.java | 2 - .../android/activities/HashTagActivity.java | 21 +- .../android/activities/InstanceActivity.java | 21 +- .../activities/InstanceHealthActivity.java | 19 +- .../android/activities/ListActivity.java | 28 +- ...eNotificationSettingsAccountsActivity.java | 3 - .../android/activities/LoginActivity.java | 82 +- .../android/activities/MainApplication.java | 29 +- .../ManageAccountsInListActivity.java | 15 +- .../activities/MastodonRegisterActivity.java | 6 +- .../MastodonShareRegisterActivity.java | 2 - .../activities/MutedInstanceActivity.java | 16 +- .../activities/OpencollectiveActivity.java | 13 +- .../activities/OwnerChartsActivity.java | 109 +- .../activities/OwnerNotificationActivity.java | 79 +- .../OwnerNotificationChartsActivity.java | 106 +- .../activities/OwnerStatusActivity.java | 100 +- .../activities/PartnerShipActivity.java | 17 +- .../android/activities/PeertubeActivity.java | 51 +- .../PeertubeEditUploadActivity.java | 51 +- .../activities/PeertubeRegisterActivity.java | 10 +- .../activities/PeertubeUploadActivity.java | 28 +- .../activities/PhotoEditorActivity.java | 83 +- .../activities/PixelfedComposeActivity.java | 1074 +++--- .../android/activities/PlaylistsActivity.java | 21 +- .../android/activities/PrivacyActivity.java | 11 +- .../android/activities/ProxyActivity.java | 6 +- .../activities/ReorderTimelinesActivity.java | 24 +- .../activities/SearchResultActivity.java | 29 +- .../activities/SearchResultTabActivity.java | 30 +- .../android/activities/SettingsActivity.java | 88 +- .../activities/ShowAccountActivity.java | 283 +- .../activities/ShowConversationActivity.java | 41 +- .../activities/SlideMediaActivity.java | 248 +- .../android/activities/TagCacheActivity.java | 11 +- .../android/activities/TootActivity.java | 1102 +++--- .../android/activities/TootInfoActivity.java | 12 +- .../android/activities/WebviewActivity.java | 14 +- .../activities/WebviewConnectActivity.java | 52 +- .../activities/WhoToFollowActivity.java | 16 +- .../CreateMastodonAccountAsyncTask.java | 4 +- .../DownloadTrackingDomainsAsyncTask.java | 2 +- .../asynctasks/ManageFiltersAsyncTask.java | 18 +- .../asynctasks/ManageListsAsyncTask.java | 25 +- .../asynctasks/ManagePlaylistsAsyncTask.java | 25 +- .../asynctasks/ManagePollAsyncTask.java | 10 +- .../asynctasks/PostActionAsyncTask.java | 13 +- .../asynctasks/PostAdminActionAsyncTask.java | 1 - .../asynctasks/PostStatusAsyncTask.java | 8 +- .../asynctasks/RetrieveAccountAsyncTask.java | 2 +- .../asynctasks/RetrieveAccountsAsyncTask.java | 26 +- .../RetrieveAccountsForReplyAsyncTask.java | 2 +- .../asynctasks/RetrieveContextAsyncTask.java | 2 +- .../asynctasks/RetrieveEmojiAsyncTask.java | 2 +- .../RetrieveFeedsAfterBookmarkAsyncTask.java | 1 - .../asynctasks/RetrieveFeedsAsyncTask.java | 120 +- .../RetrieveInstanceRegAsyncTask.java | 14 +- .../RetrieveManyRelationshipsAsyncTask.java | 2 +- .../RetrieveMissingFeedsAsyncTask.java | 4 +- ...RetrieveMissingNotificationsAsyncTask.java | 4 +- .../RetrieveNotificationsAsyncTask.java | 2 +- .../RetrieveOpenCollectiveAsyncTask.java | 10 +- .../RetrievePeertubeChannelsAsyncTask.java | 2 +- .../RetrievePeertubeInformationAsyncTask.java | 2 +- .../RetrievePeertubeSingleAsyncTask.java | 2 +- .../RetrieveRelationshipAsyncTask.java | 2 +- .../RetrieveScheduledTootsAsyncTask.java | 2 +- .../asynctasks/RetrieveSearchAsyncTask.java | 4 +- .../asynctasks/SyncBookmarksAsyncTask.java | 20 +- .../asynctasks/SyncTimelinesAsyncTask.java | 9 +- .../UpdateAccountInfoAsyncTask.java | 22 +- .../UpdateAccountInfoByIDAsyncTask.java | 4 +- .../java/app/fedilab/android/client/API.java | 2908 +++++++------- .../fedilab/android/client/APIResponse.java | 1 - .../android/client/CustomSharingResponse.java | 8 +- .../android/client/Entities/Account.java | 312 +- .../android/client/Entities/AccountAdmin.java | 68 +- .../android/client/Entities/Application.java | 21 +- .../android/client/Entities/Attachment.java | 23 +- .../fedilab/android/client/Entities/Card.java | 23 +- .../android/client/Entities/Charts.java | 1 - .../android/client/Entities/Emojis.java | 37 +- .../fedilab/android/client/Entities/List.java | 39 +- .../client/Entities/ManageTimelines.java | 193 +- .../android/client/Entities/Mention.java | 23 +- .../android/client/Entities/Notification.java | 150 +- .../client/Entities/PeertubeInformation.java | 14 +- .../client/Entities/PeertubeNotification.java | 2 - .../client/Entities/PixelFedStory.java | 53 +- .../client/Entities/PixelFedStoryItem.java | 58 +- .../android/client/Entities/Playlist.java | 64 +- .../android/client/Entities/PleromaAdmin.java | 37 +- .../fedilab/android/client/Entities/Poll.java | 48 +- .../android/client/Entities/PollOptions.java | 49 +- .../client/Entities/RemoteInstance.java | 41 +- .../android/client/Entities/Report.java | 61 +- .../android/client/Entities/Schedule.java | 39 +- .../android/client/Entities/Statistics.java | 3 +- .../android/client/Entities/Status.java | 809 ++-- .../android/client/Entities/StoredStatus.java | 65 +- .../android/client/Entities/Suggestion.java | 12 +- .../fedilab/android/client/Entities/Tag.java | 21 +- .../android/client/Entities/TagTimeline.java | 52 +- .../android/client/Entities/UserNote.java | 1 + .../android/client/Entities/Version.java | 8 +- .../app/fedilab/android/client/GNUAPI.java | 1082 +++--- .../client/Glide/TLSLibraryGlideModule.java | 2 +- .../android/client/HttpsConnection.java | 72 +- .../fedilab/android/client/PeertubeAPI.java | 3346 ++++++++--------- .../fedilab/android/client/PixelfedAPI.java | 146 +- .../android/client/TLSSocketFactory.java | 2 - .../android/client/Tls12SocketFactory.java | 4 +- .../android/drawers/AccountLiveAdapter.java | 8 +- .../drawers/AccountSearchDevAdapter.java | 16 +- .../drawers/AccountsFollowRequestAdapter.java | 16 +- .../drawers/AccountsInAListAdapter.java | 27 +- .../android/drawers/AccountsListAdapter.java | 34 +- .../android/drawers/AccountsReplyAdapter.java | 8 +- .../drawers/AccountsSearchAdapter.java | 79 +- .../android/drawers/ArtListAdapter.java | 79 +- .../android/drawers/CustomEmojiAdapter.java | 6 +- .../android/drawers/DomainsListAdapter.java | 17 +- .../android/drawers/DraftsListAdapter.java | 15 +- .../android/drawers/EmojisSearchAdapter.java | 119 +- .../android/drawers/FilterAdapter.java | 17 +- .../android/drawers/HowToVideosAdapter.java | 14 +- .../fedilab/android/drawers/ImageAdapter.java | 13 +- .../android/drawers/InstanceRegAdapter.java | 1 - .../fedilab/android/drawers/ListAdapter.java | 8 +- .../drawers/NotificationsListAdapter.java | 77 +- .../android/drawers/PeertubeAdapter.java | 17 +- .../PeertubeNotificationsListAdapter.java | 25 +- .../android/drawers/PixelfedListAdapter.java | 227 +- .../android/drawers/PlaylistAdapter.java | 5 +- .../android/drawers/ReorderTabAdapter.java | 15 +- .../android/drawers/ReportsListAdapter.java | 1 - .../drawers/ScheduledTootsListAdapter.java | 22 +- .../android/drawers/SearchListAdapter.java | 23 +- .../android/drawers/SearchTagsAdapter.java | 25 +- .../drawers/SearchTootsListAdapter.java | 12 +- .../android/drawers/SliderAdapter.java | 19 +- .../android/drawers/StatusListAdapter.java | 795 ++-- .../android/drawers/StatusReportAdapter.java | 23 +- .../android/drawers/SuggestionsAdapter.java | 22 +- .../android/drawers/TagsEditAdapter.java | 9 +- .../android/drawers/TagsSearchAdapter.java | 102 +- .../drawers/WhoToFollowAccountsAdapter.java | 7 +- .../android/drawers/WhoToFollowAdapter.java | 7 +- .../android/filelister/FileListerAdapter.java | 67 +- .../android/filelister/FileListerDialog.java | 55 +- .../android/filelister/FilesListerView.java | 9 +- .../fragments/ColorSettingsFragment.java | 56 +- .../fragments/ContentSettingsFragment.java | 411 +- .../fragments/DisplayAccountsFragment.java | 40 +- .../DisplayAdminAccountsFragment.java | 9 +- .../DisplayAdminReportsFragment.java | 13 +- .../DisplayBookmarksPixelfedFragment.java | 3 +- .../fragments/DisplayDraftsFragment.java | 20 +- .../DisplayFavoritesPeertubeFragment.java | 26 +- .../fragments/DisplayFiltersFragment.java | 29 +- .../DisplayFollowRequestSentFragment.java | 28 +- .../fragments/DisplayHowToFragment.java | 19 +- .../fragments/DisplayListsFragment.java | 30 +- .../fragments/DisplayMediaFragment.java | 25 +- .../DisplayMutedInstanceFragment.java | 31 +- .../DisplayNotificationsFragment.java | 66 +- .../DisplayPeertubeNotificationsFragment.java | 58 +- .../fragments/DisplayPlaylistsFragment.java | 42 +- .../DisplayScheduledTootsFragment.java | 40 +- .../fragments/DisplaySearchFragment.java | 21 +- .../fragments/DisplaySearchTagsFragment.java | 26 +- .../fragments/DisplayStatusFragment.java | 96 +- .../fragments/MediaSliderFragment.java | 45 +- .../fragments/SettingsPeertubeFragment.java | 9 +- .../TabLayoutNotificationsFragment.java | 60 +- .../fragments/TabLayoutScheduleFragment.java | 10 +- .../fragments/TabLayoutTootsFragment.java | 19 +- .../fragments/WhoToFollowFragment.java | 13 +- .../fedilab/android/helper/CrossActions.java | 31 +- .../android/helper/CustomTextView.java | 5 +- .../helper/ExpandableHeightListView.java | 8 +- .../fedilab/android/helper/FilterToots.java | 52 +- .../helper/FullScreenMediaController.java | 12 +- .../app/fedilab/android/helper/Helper.java | 592 ++- .../helper/MastalabAutoCompleteTextView.java | 15 +- .../helper/RecyclerItemClickListener.java | 9 +- .../helper/SwipeControledViewPager.java | 3 +- .../fedilab/android/helper/ThemeHelper.java | 6 +- .../ItemTouchHelperAdapter.java | 2 +- .../SimpleItemTouchHelperCallback.java | 2 +- .../imageeditor/ColorPickerAdapter.java | 49 +- .../android/imageeditor/EmojiBSFragment.java | 34 +- .../imageeditor/PropertiesBSFragment.java | 36 +- .../imageeditor/StickerBSFragment.java | 74 +- .../imageeditor/TextEditorDialogFragment.java | 30 +- .../filters/FilterViewAdapter.java | 40 +- .../tools/EditingToolsAdapter.java | 39 +- .../fedilab/android/jobs/ApplicationJob.java | 18 +- .../jobs/BackupNotificationsSyncJob.java | 18 +- .../android/jobs/BackupStatusesSyncJob.java | 49 +- .../android/jobs/NotificationsSyncJob.java | 21 +- .../android/jobs/ScheduledBoostsSyncJob.java | 70 +- .../android/jobs/ScheduledTootsSyncJob.java | 35 +- .../BackupNotificationInDataBaseService.java | 3 - .../BackupStatusInDataBaseService.java | 10 +- .../android/services/BackupStatusService.java | 17 +- .../LiveNotificationDelayedService.java | 45 +- .../services/LiveNotificationService.java | 30 +- .../services/PeertubeUploadReceiver.java | 2 - .../RestartLiveNotificationReceiver.java | 5 +- .../StopLiveNotificationReceiver.java | 4 +- .../StreamingFederatedTimelineService.java | 8 +- .../StreamingHomeTimelineService.java | 8 +- .../StreamingLocalTimelineService.java | 8 +- .../fedilab/android/sqlite/AccountDAO.java | 4 +- .../android/sqlite/BoostScheduleDAO.java | 2 +- .../android/sqlite/CustomEmojiDAO.java | 2 +- .../android/sqlite/DomainBlockDAO.java | 2 +- .../fedilab/android/sqlite/InstancesDAO.java | 3 +- .../fedilab/android/sqlite/MainMenuDAO.java | 2 +- .../app/fedilab/android/sqlite/NotesDAO.java | 9 +- .../android/sqlite/NotificationCacheDAO.java | 2 +- .../android/sqlite/PeertubeFavoritesDAO.java | 2 +- .../app/fedilab/android/sqlite/SearchDAO.java | 2 +- .../app/fedilab/android/sqlite/Sqlite.java | 421 +-- .../android/sqlite/StatusCacheDAO.java | 9 +- .../android/sqlite/StatusStoredDAO.java | 2 +- .../fedilab/android/sqlite/TagsCacheDAO.java | 2 +- .../fedilab/android/sqlite/TempMuteDAO.java | 2 +- .../android/sqlite/TimelineCacheDAO.java | 2 +- .../fedilab/android/sqlite/TimelinesDAO.java | 2 +- .../webview/MastalabWebChromeClient.java | 23 +- .../webview/MastalabWebViewClient.java | 10 +- .../fedilab/android/webview/ProxyHelper.java | 2 - app/src/main/res/anim/enter_from_left.xml | 10 - app/src/main/res/anim/enter_from_right.xml | 10 - app/src/main/res/anim/exit_to_left.xml | 10 - app/src/main/res/anim/exit_to_right.xml | 10 - app/src/main/res/anim/fadein.xml | 7 - app/src/main/res/anim/fadeout.xml | 7 - .../res/drawable-anydpi-v24/ic_plain_atom.xml | 36 +- .../drawable-anydpi-v24/ic_plain_bubbles.xml | 31 +- .../drawable-anydpi-v24/ic_plain_crash.xml | 156 +- .../ic_plain_fediverse.xml | 131 +- .../res/drawable-anydpi-v24/ic_plain_hero.xml | 31 +- .../ic_account_circle_acct.xml | 13 +- .../res/drawable-anydpi/ic_action_add_new.xml | 13 +- .../ic_add_a_photo_pixelfed.xml | 13 +- .../res/drawable-anydpi/ic_add_circle.xml | 13 +- .../res/drawable-anydpi/ic_add_instance.xml | 9 - .../drawable-anydpi/ic_all_inclusive_menu.xml | 10 +- .../main/res/drawable-anydpi/ic_archive.xml | 13 +- .../res/drawable-anydpi/ic_attach_money.xml | 9 - .../res/drawable-anydpi/ic_audio_wave.xml | 170 +- .../ic_audiotrack_black_48dp.xml | 13 +- .../drawable-anydpi/ic_battery_alert_menu.xml | 10 - .../res/drawable-anydpi/ic_bookmark_white.xml | 10 +- .../ic_bookmark_white_full.xml | 10 +- .../res/drawable-anydpi/ic_boost_pixelfed.xml | 9 - app/src/main/res/drawable-anydpi/ic_bot.xml | 44 +- app/src/main/res/drawable-anydpi/ic_brush.xml | 9 - .../res/drawable-anydpi/ic_brush_white.xml | 9 - .../res/drawable-anydpi/ic_bug_report.xml | 9 - .../res/drawable-anydpi/ic_check_circle.xml | 13 +- .../res/drawable-anydpi/ic_check_white_24.xml | 10 +- .../res/drawable-anydpi/ic_cloud_upload.xml | 13 +- .../drawable-anydpi/ic_comment_peertube.xml | 13 +- .../ic_create_new_folder_black_48dp.xml | 13 +- .../drawable-anydpi/ic_delete_instance.xml | 9 - .../ic_delete_media_pixelfed.xml | 14 +- .../drawable-anydpi/ic_edit_black_menu.xml | 10 - app/src/main/res/drawable-anydpi/ic_email.xml | 9 - .../main/res/drawable-anydpi/ic_eraser.xml | 9 - .../ic_favorite_peertube_full.xml | 13 +- .../res/drawable-anydpi/ic_fiber_new_dark.xml | 12 - .../res/drawable-anydpi/ic_file_download.xml | 9 - .../main/res/drawable-anydpi/ic_filter.xml | 13 +- .../res/drawable-anydpi/ic_filter_list.xml | 13 +- .../drawable-anydpi/ic_folder_black_48dp.xml | 13 +- .../ic_follow_notif_header.xml | 13 +- .../res/drawable-anydpi/ic_fullscreen.xml | 13 +- .../drawable-anydpi/ic_fullscreen_exit.xml | 13 +- .../res/drawable-anydpi/ic_gif_preview.xml | 18 +- .../res/drawable-anydpi/ic_gnu_social.xml | 8 +- .../res/drawable-anydpi/ic_group_work.xml | 10 +- .../drawable-anydpi/ic_hide_status_bar.xml | 10 +- .../res/drawable-anydpi/ic_hourglass_full.xml | 13 +- app/src/main/res/drawable-anydpi/ic_info.xml | 13 +- .../res/drawable-anydpi/ic_info_white.xml | 10 - .../res/drawable-anydpi/ic_insert_chart.xml | 10 +- .../ic_insert_drive_file_black_48dp.xml | 13 +- .../res/drawable-anydpi/ic_list_instance.xml | 9 - .../res/drawable-anydpi/ic_list_timeline.xml | 9 - .../res/drawable-anydpi/ic_logo_button.xml | 8 +- .../res/drawable-anydpi/ic_mention_white.xml | 10 +- .../res/drawable-anydpi/ic_menu_camera.xml | 12 - .../res/drawable-anydpi/ic_menu_gallery.xml | 9 - .../res/drawable-anydpi/ic_menu_manage.xml | 9 - .../main/res/drawable-anydpi/ic_menu_menu.xml | 10 - .../main/res/drawable-anydpi/ic_menu_send.xml | 9 - .../res/drawable-anydpi/ic_menu_share.xml | 9 - .../res/drawable-anydpi/ic_menu_slideshow.xml | 9 - .../drawable-anydpi/ic_mode_comment_white.xml | 10 +- .../res/drawable-anydpi/ic_more_pixelfed.xml | 13 +- .../drawable-anydpi/ic_new_releases_black.xml | 10 +- app/src/main/res/drawable-anydpi/ic_note.xml | 13 +- .../drawable-anydpi/ic_notifications_menu.xml | 10 - .../ic_notifications_settings.xml | 9 - .../res/drawable-anydpi/ic_perm_media.xml | 9 - .../drawable-anydpi/ic_photo_black_48dp.xml | 13 +- .../main/res/drawable-anydpi/ic_pin_drop.xml | 7 +- .../res/drawable-anydpi/ic_pin_drop_p.xml | 6 +- .../drawable-anydpi/ic_pixelfed_comment.xml | 12 +- .../res/drawable-anydpi/ic_pixelfed_media.xml | 9 - .../res/drawable-anydpi/ic_pixelfed_share.xml | 9 - .../main/res/drawable-anydpi/ic_plus_one.xml | 13 +- .../res/drawable-anydpi/ic_public_world.xml | 13 +- .../res/drawable-anydpi/ic_remove_white.xml | 10 +- app/src/main/res/drawable-anydpi/ic_save.xml | 9 - .../res/drawable-anydpi/ic_security_admin.xml | 10 +- .../ic_security_admin_menu.xml | 10 - .../res/drawable-anydpi/ic_show_stats.xml | 10 +- .../ic_subdirectory_arrow_left_black_48dp.xml | 13 +- app/src/main/res/drawable-anydpi/ic_sync.xml | 13 +- .../res/drawable-anydpi/ic_tablet_menu.xml | 10 - .../main/res/drawable-anydpi/ic_timelapse.xml | 10 - .../drawable-anydpi/ic_timeline_menu_s.xml | 10 - .../res/drawable-anydpi/ic_translate_menu.xml | 9 - .../drawable-anydpi/ic_translate_white.xml | 10 +- .../res/drawable-anydpi/ic_user_minus.xml | 6 +- .../main/res/drawable-anydpi/ic_user_plus.xml | 13 +- .../res/drawable-anydpi/ic_user_remove.xml | 9 - .../res/drawable-anydpi/ic_user_times.xml | 5 - .../res/drawable-anydpi/ic_video_channel.xml | 9 - .../res/drawable-anydpi/ic_video_preview.xml | 8 +- .../main/res/drawable-anydpi/ic_videocam.xml | 13 +- .../ic_videocam_black_48dp.xml | 13 +- .../ic_visibility_off_menu.xml | 10 - .../fedilab_notification_icon.png | Bin 753 -> 0 bytes .../fedilab_notification_icon.png | Bin 489 -> 0 bytes .../ic_launcher_atom_foreground.xml | 100 +- .../ic_launcher_crash_foreground.xml | 565 +-- .../fedilab_notification_icon.png | Bin 976 -> 0 bytes .../fedilab_notification_icon.png | Bin 1538 -> 0 bytes .../fedilab_notification_icon.png | Bin 2206 -> 0 bytes app/src/main/res/drawable/blue_border.xml | 2 +- app/src/main/res/drawable/border_bottom.xml | 4 +- .../main/res/drawable/card_border_black.xml | 14 - .../main/res/drawable/card_border_dark.xml | 2 +- .../main/res/drawable/card_border_light.xml | 2 +- app/src/main/res/drawable/default_banner.xml | 4 +- app/src/main/res/drawable/diag_bottom.xml | 2 +- .../res/drawable/diag_bottom_android4.xml | 2 +- app/src/main/res/drawable/diag_top.xml | 2 +- .../main/res/drawable/diag_top_android4.xml | 2 +- app/src/main/res/drawable/fedilab_logo.xml | 21 - .../res/drawable/fedilab_logo_bubbles.xml | 12 +- .../main/res/drawable/ic_export_bookmarks.xml | 13 +- .../main/res/drawable/ic_import_bookmarks.xml | 13 +- .../ic_launcher_bubbles_foreground.xml | 27 +- .../ic_launcher_fediverse_foreground.xml | 127 +- .../res/drawable/ic_launcher_foreground.xml | 24 - .../drawable/ic_launcher_hero_foreground.xml | 37 +- .../main/res/drawable/imageview_border.xml | 12 - .../res/drawable/imageview_border_black.xml | 12 - .../res/drawable/imageview_border_dark.xml | 12 - .../main/res/drawable/line_divider_black.xml | 6 - .../main/res/drawable/line_divider_dark.xml | 6 - .../main/res/drawable/line_divider_light.xml | 6 - .../res/drawable/media_message_border.xml | 6 +- .../main/res/drawable/menu_item_selector.xml | 9 - .../res/drawable/menu_item_selector_black.xml | 9 - .../res/drawable/menu_item_selector_light.xml | 9 - app/src/main/res/drawable/menu_selector.xml | 7 - .../main/res/drawable/menu_selector_black.xml | 7 - .../main/res/drawable/menu_selector_dark.xml | 7 - .../res/drawable/quick_reply_background.xml | 5 - .../drawable/quick_reply_background_black.xml | 5 - .../drawable/quick_reply_background_light.xml | 5 - .../main/res/drawable/rounded_corner_10.xml | 5 - .../res/drawable/rounded_label_sensitive.xml | 2 +- .../drawable/shape_border_bottom_settings.xml | 22 - .../shape_border_bottom_settings_black.xml | 22 - .../shape_border_bottom_settings_dark.xml | 22 - app/src/main/res/drawable/side_nav_bar.xml | 9 - .../main/res/drawable/side_nav_bar_black.xml | 9 - .../main/res/drawable/side_nav_bar_dark.xml | 9 - app/src/main/res/drawable/unfollow_color.xml | 4 - .../res/layout-sw600dp/activity_about.xml | 213 +- .../layout-sw600dp/activity_remote_follow.xml | 112 - .../layout-sw600dp/activity_show_account.xml | 347 +- .../main/res/layout-sw600dp/activity_toot.xml | 49 +- .../res/layout-sw600dp/drawer_account.xml | 50 +- app/src/main/res/layout/activity_about.xml | 152 +- app/src/main/res/layout/activity_admin.xml | 9 +- .../main/res/layout/activity_admin_report.xml | 15 +- app/src/main/res/layout/activity_bookmark.xml | 38 +- .../res/layout/activity_custom_sharing.xml | 42 +- .../main/res/layout/activity_edit_profile.xml | 122 +- app/src/main/res/layout/activity_group.xml | 43 +- app/src/main/res/layout/activity_hashtag.xml | 43 +- app/src/main/res/layout/activity_instance.xml | 44 +- .../res/layout/activity_instance_social.xml | 80 +- app/src/main/res/layout/activity_list.xml | 39 +- ...ctivity_livenotifications_all_accounts.xml | 12 +- app/src/main/res/layout/activity_login.xml | 156 +- app/src/main/res/layout/activity_main.xml | 75 +- .../layout/activity_manage_accounts_list.xml | 36 +- .../main/res/layout/activity_media_pager.xml | 22 +- .../res/layout/activity_muted_instances.xml | 40 +- .../res/layout/activity_opencollective.xml | 35 +- .../main/res/layout/activity_ower_charts.xml | 56 +- .../layout/activity_ower_notifications.xml | 57 +- .../main/res/layout/activity_ower_status.xml | 57 +- .../main/res/layout/activity_partnership.xml | 32 +- app/src/main/res/layout/activity_peertube.xml | 218 +- .../res/layout/activity_peertube_edit.xml | 118 +- .../res/layout/activity_peertube_upload.xml | 73 +- .../main/res/layout/activity_photoeditor.xml | 36 +- .../res/layout/activity_pixelfed_compose.xml | 92 +- .../main/res/layout/activity_playlists.xml | 39 +- app/src/main/res/layout/activity_privacy.xml | 90 +- app/src/main/res/layout/activity_proxy.xml | 54 +- app/src/main/res/layout/activity_register.xml | 135 +- .../res/layout/activity_register_peertube.xml | 119 +- .../res/layout/activity_remote_follow.xml | 108 - .../main/res/layout/activity_reorder_tabs.xml | 42 +- .../res/layout/activity_search_result.xml | 32 +- .../layout/activity_search_result_tabs.xml | 8 +- app/src/main/res/layout/activity_settings.xml | 17 +- .../main/res/layout/activity_show_account.xml | 368 +- .../res/layout/activity_show_conversation.xml | 39 +- .../main/res/layout/activity_tag_cache.xml | 36 +- app/src/main/res/layout/activity_toot.xml | 91 +- .../main/res/layout/activity_toot_info.xml | 20 +- app/src/main/res/layout/activity_webview.xml | 15 +- .../res/layout/activity_webview_connect.xml | 5 +- .../res/layout/activity_who_to_follow.xml | 65 +- .../main/res/layout/add_blocked_instance.xml | 8 +- app/src/main/res/layout/add_filter.xml | 76 +- app/src/main/res/layout/add_list.xml | 6 +- app/src/main/res/layout/add_playlist.xml | 74 +- app/src/main/res/layout/add_text_dialog.xml | 2 +- app/src/main/res/layout/bookmark_layout.xml | 4 +- .../res/layout/conversation_action_bar.xml | 58 +- .../main/res/layout/custom_tab_instance.xml | 5 +- .../main/res/layout/dialog_icon_selector.xml | 10 +- app/src/main/res/layout/dialog_main.xml | 11 - app/src/main/res/layout/dialog_profile.xml | 48 +- app/src/main/res/layout/domains_blocked.xml | 12 +- app/src/main/res/layout/drawer_account.xml | 112 +- .../main/res/layout/drawer_account_admin.xml | 45 +- .../main/res/layout/drawer_account_list.xml | 40 +- .../res/layout/drawer_account_main_search.xml | 93 +- .../drawer_account_notification_settings.xml | 1 + .../main/res/layout/drawer_account_reply.xml | 24 +- .../main/res/layout/drawer_account_search.xml | 28 +- .../res/layout/drawer_account_search_dev.xml | 36 +- .../res/layout/drawer_account_search_html.xml | 146 - app/src/main/res/layout/drawer_art.xml | 58 +- app/src/main/res/layout/drawer_domain.xml | 17 +- app/src/main/res/layout/drawer_draft.xml | 30 +- .../main/res/layout/drawer_emoji_picker.xml | 12 +- .../main/res/layout/drawer_emoji_search.xml | 18 +- app/src/main/res/layout/drawer_filters.xml | 47 +- .../main/res/layout/drawer_how_to_videos.xml | 32 +- .../main/res/layout/drawer_instance_reg.xml | 34 +- .../layout/drawer_instance_reg_peertube.xml | 40 +- app/src/main/res/layout/drawer_media.xml | 10 +- .../main/res/layout/drawer_notification.xml | 236 +- app/src/main/res/layout/drawer_peertube.xml | 66 +- .../layout/drawer_peertube_notification.xml | 54 +- app/src/main/res/layout/drawer_pixelfed.xml | 119 +- app/src/main/res/layout/drawer_reorder.xml | 11 +- app/src/main/res/layout/drawer_report.xml | 51 +- .../main/res/layout/drawer_scheduled_toot.xml | 78 +- app/src/main/res/layout/drawer_search.xml | 20 +- app/src/main/res/layout/drawer_status.xml | 60 +- .../main/res/layout/drawer_status_console.xml | 1722 +++++---- .../main/res/layout/drawer_status_focused.xml | 37 +- .../res/layout/drawer_status_main_search.xml | 77 +- .../main/res/layout/drawer_suggestions.xml | 15 +- app/src/main/res/layout/drawer_tag.xml | 34 +- app/src/main/res/layout/drawer_tag_edit.xml | 34 +- app/src/main/res/layout/drawer_tag_search.xml | 8 +- .../main/res/layout/drawer_tag_search_tab.xml | 10 +- .../layout/drawer_who_to_follow_account.xml | 44 +- .../res/layout/exo_playback_control_view.xml | 42 +- .../res/layout/exo_simple_player_view.xml | 6 +- .../res/layout/filter_owner_notifications.xml | 52 +- .../main/res/layout/filter_owner_toots.xml | 90 +- app/src/main/res/layout/filter_regex.xml | 6 +- app/src/main/res/layout/fragment_accounts.xml | 40 +- .../res/layout/fragment_admin_accounts.xml | 40 +- .../res/layout/fragment_admin_reports.xml | 40 +- .../main/res/layout/fragment_bookmarks.xml | 30 +- .../fragment_bottom_properties_dialog.xml | 18 +- .../fragment_bottom_sticker_emoji_dialog.xml | 13 +- app/src/main/res/layout/fragment_drafts.xml | 36 +- app/src/main/res/layout/fragment_filters.xml | 38 +- app/src/main/res/layout/fragment_how_to.xml | 10 +- app/src/main/res/layout/fragment_list.xml | 39 +- .../res/layout/fragment_muted_instances.xml | 40 +- .../res/layout/fragment_notifications.xml | 31 +- .../layout/fragment_peertube_favourites.xml | 30 +- .../res/layout/fragment_peertube_settings.xml | 22 +- .../main/res/layout/fragment_playlists.xml | 38 +- .../res/layout/fragment_scheduled_toots.xml | 74 +- app/src/main/res/layout/fragment_search.xml | 36 +- .../main/res/layout/fragment_search_tag.xml | 36 +- .../res/layout/fragment_settings_reveal.xml | 17 +- .../main/res/layout/fragment_slide_media.xml | 89 +- app/src/main/res/layout/fragment_status.xml | 31 +- .../main/res/layout/fragment_status_media.xml | 38 +- .../res/layout/fragment_who_to_follow.xml | 14 +- .../res/layout/image_slider_layout_item.xml | 41 +- app/src/main/res/layout/item_file_lister.xml | 3 +- .../res/layout/item_file_lister_light.xml | 3 +- app/src/main/res/layout/item_menu_news.xml | 11 +- app/src/main/res/layout/layout_poll.xml | 56 +- .../main/res/layout/layout_quick_reply.xml | 10 +- app/src/main/res/layout/markerview.xml | 6 +- app/src/main/res/layout/media_action_bar.xml | 51 +- app/src/main/res/layout/menu_list_item.xml | 17 - .../main/res/layout/muted_instance_popup.xml | 14 +- app/src/main/res/layout/nav_header_main.xml | 60 +- app/src/main/res/layout/notificationview.xml | 26 - .../res/layout/owner_status_action_bar.xml | 61 - app/src/main/res/layout/picture_actionbar.xml | 66 - app/src/main/res/layout/popup_cache.xml | 34 +- app/src/main/res/layout/popup_contact.xml | 16 +- .../res/layout/popup_media_description.xml | 18 +- .../main/res/layout/popup_message_preview.xml | 24 +- app/src/main/res/layout/popup_picture.xml | 20 - app/src/main/res/layout/popup_poll.xml | 34 +- .../main/res/layout/popup_quick_settings.xml | 28 +- app/src/main/res/layout/popup_text_size.xml | 58 +- app/src/main/res/layout/popup_translate.xml | 46 +- .../main/res/layout/pref_reset_bd_button.xml | 10 - app/src/main/res/layout/row_editing_tools.xml | 6 +- app/src/main/res/layout/search_instance.xml | 8 +- app/src/main/res/layout/search_toot.xml | 6 +- .../main/res/layout/showaccount_actionbar.xml | 45 - app/src/main/res/layout/simple_action_bar.xml | 34 +- app/src/main/res/layout/simple_bar.xml | 34 +- app/src/main/res/layout/simple_bar_add.xml | 42 +- .../res/layout/simple_bar_muted_instance.xml | 40 +- .../res/layout/stats_owner_notifications.xml | 144 +- app/src/main/res/layout/stats_owner_toots.xml | 206 +- app/src/main/res/layout/tab_badge.xml | 18 +- .../res/layout/tablayout_notifications.xml | 10 +- .../main/res/layout/tablayout_settings.xml | 39 - app/src/main/res/layout/tablayout_toots.xml | 6 +- app/src/main/res/layout/tags_all.xml | 6 +- app/src/main/res/layout/tags_any.xml | 6 +- app/src/main/res/layout/tags_instance.xml | 6 +- app/src/main/res/layout/tags_name.xml | 6 +- app/src/main/res/layout/tags_none.xml | 14 - app/src/main/res/layout/toot_action_bar.xml | 44 +- app/src/main/res/layout/toot_buttons.xml | 26 - app/src/main/res/layout/update_account.xml | 28 +- .../main/res/layout/user_search_result.xml | 29 - app/src/main/res/layout/webview_actionbar.xml | 14 +- .../main/res/menu/activity_main_drawer.xml | 28 +- app/src/main/res/menu/bookmarks.xml | 4 +- .../main/res/menu/main_compose_pixelfed.xml | 8 +- app/src/main/res/menu/main_list.xml | 4 +- app/src/main/res/menu/main_login.xml | 8 +- app/src/main/res/menu/main_media.xml | 9 - app/src/main/res/menu/main_showaccount.xml | 22 +- app/src/main/res/menu/main_toot.xml | 22 +- app/src/main/res/menu/main_webview.xml | 4 +- app/src/main/res/menu/menu_accounts.xml | 3 +- .../res/menu/option_filter_admin_accounts.xml | 6 +- .../res/menu/option_filter_admin_reports.xml | 6 +- .../res/menu/option_filter_notifications.xml | 6 +- app/src/main/res/menu/option_filter_toots.xml | 10 +- .../res/menu/option_filter_toots_account.xml | 6 +- app/src/main/res/menu/option_owner_cache.xml | 6 +- app/src/main/res/menu/option_tag_timeline.xml | 22 +- app/src/main/res/menu/option_toot.xml | 4 +- app/src/main/res/menu/remote_instances.xml | 75 - app/src/main/res/menu/tag_pin.xml | 4 +- .../res/mipmap-anydpi-v26/ic_launcher.xml | 5 - .../mipmap-anydpi-v26/ic_launcher_atom.xml | 4 +- .../ic_launcher_atom_round.xml | 4 +- .../mipmap-anydpi-v26/ic_launcher_bubbles.xml | 4 +- .../ic_launcher_bubbles_round.xml | 4 +- .../mipmap-anydpi-v26/ic_launcher_crash.xml | 4 +- .../ic_launcher_crash_round.xml | 4 +- .../ic_launcher_fediverse.xml | 4 +- .../ic_launcher_fediverse_round.xml | 4 +- .../mipmap-anydpi-v26/ic_launcher_hero.xml | 4 +- .../ic_launcher_hero_round.xml | 4 +- .../mipmap-anydpi-v26/ic_launcher_round.xml | 5 - .../mipmap-hdpi/ic_launcher_foreground.png | Bin 2892 -> 0 bytes .../res/mipmap-hdpi/ic_launcher_round.png | Bin 4177 -> 0 bytes .../mipmap-mdpi/ic_launcher_foreground.png | Bin 1834 -> 0 bytes .../res/mipmap-mdpi/ic_launcher_round.png | Bin 2665 -> 0 bytes .../mipmap-xhdpi/ic_launcher_foreground.png | Bin 4212 -> 0 bytes .../res/mipmap-xhdpi/ic_launcher_round.png | Bin 5990 -> 0 bytes .../mipmap-xxhdpi/ic_launcher_foreground.png | Bin 7287 -> 0 bytes .../res/mipmap-xxhdpi/ic_launcher_round.png | Bin 9402 -> 0 bytes .../mipmap-xxxhdpi/ic_launcher_foreground.png | Bin 11482 -> 0 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.png | Bin 13781 -> 0 bytes app/src/main/res/values-ar/strings.xml | 145 +- app/src/main/res/values-bn/strings.xml | 137 +- app/src/main/res/values-br/strings.xml | 143 +- app/src/main/res/values-ca/strings.xml | 137 +- app/src/main/res/values-cs/strings.xml | 140 +- app/src/main/res/values-cy/strings.xml | 145 +- app/src/main/res/values-da/strings.xml | 137 +- app/src/main/res/values-de/strings.xml | 136 +- app/src/main/res/values-el/strings.xml | 137 +- app/src/main/res/values-eo/strings.xml | 137 +- app/src/main/res/values-es/strings.xml | 137 +- app/src/main/res/values-eu/strings.xml | 136 +- app/src/main/res/values-fa/strings.xml | 137 +- app/src/main/res/values-fr/strings.xml | 137 +- app/src/main/res/values-gl/strings.xml | 138 +- app/src/main/res/values-hi/strings.xml | 135 +- app/src/main/res/values-hu/strings.xml | 137 +- app/src/main/res/values-hy/strings.xml | 137 +- app/src/main/res/values-id/strings.xml | 135 +- app/src/main/res/values-it/strings.xml | 137 +- app/src/main/res/values-ja/strings.xml | 135 +- app/src/main/res/values-kab/strings.xml | 137 +- app/src/main/res/values-ko/strings.xml | 135 +- app/src/main/res/values-ml/strings.xml | 137 +- app/src/main/res/values-nl/strings.xml | 135 +- app/src/main/res/values-no/strings.xml | 135 +- app/src/main/res/values-oc/strings.xml | 137 +- app/src/main/res/values-pl/strings.xml | 139 +- app/src/main/res/values-pt/strings.xml | 137 +- app/src/main/res/values-ro/strings.xml | 139 +- app/src/main/res/values-ru/strings.xml | 141 +- app/src/main/res/values-si/strings.xml | 136 +- app/src/main/res/values-sl/strings.xml | 141 +- app/src/main/res/values-sr/strings.xml | 139 +- app/src/main/res/values-sv/strings.xml | 137 +- app/src/main/res/values-tr/strings.xml | 136 +- app/src/main/res/values-uk/strings.xml | 141 +- app/src/main/res/values-vi/strings.xml | 136 +- app/src/main/res/values-zh-rCN/strings.xml | 135 +- app/src/main/res/values-zh-rTW/strings.xml | 135 +- app/src/main/res/values/colors.xml | 55 +- app/src/main/res/values/dimens.xml | 3 - app/src/main/res/values/drawables.xml | 9 +- .../res/values/ic_launcher_background.xml | 4 +- app/src/main/res/values/strings.xml | 147 +- app/src/main/res/values/styles.xml | 26 +- .../main/res/xml/fragment_settings_color.xml | 71 +- 662 files changed, 15727 insertions(+), 23671 deletions(-) delete mode 100644 app/src/main/res/anim/enter_from_left.xml delete mode 100644 app/src/main/res/anim/enter_from_right.xml delete mode 100644 app/src/main/res/anim/exit_to_left.xml delete mode 100644 app/src/main/res/anim/exit_to_right.xml delete mode 100644 app/src/main/res/anim/fadein.xml delete mode 100644 app/src/main/res/anim/fadeout.xml delete mode 100644 app/src/main/res/drawable-anydpi/ic_add_instance.xml delete mode 100644 app/src/main/res/drawable-anydpi/ic_attach_money.xml delete mode 100644 app/src/main/res/drawable-anydpi/ic_battery_alert_menu.xml delete mode 100644 app/src/main/res/drawable-anydpi/ic_boost_pixelfed.xml delete mode 100644 app/src/main/res/drawable-anydpi/ic_brush.xml delete mode 100644 app/src/main/res/drawable-anydpi/ic_brush_white.xml delete mode 100644 app/src/main/res/drawable-anydpi/ic_bug_report.xml delete mode 100644 app/src/main/res/drawable-anydpi/ic_delete_instance.xml delete mode 100644 app/src/main/res/drawable-anydpi/ic_edit_black_menu.xml delete mode 100644 app/src/main/res/drawable-anydpi/ic_email.xml delete mode 100644 app/src/main/res/drawable-anydpi/ic_eraser.xml delete mode 100644 app/src/main/res/drawable-anydpi/ic_fiber_new_dark.xml delete mode 100644 app/src/main/res/drawable-anydpi/ic_file_download.xml delete mode 100644 app/src/main/res/drawable-anydpi/ic_info_white.xml delete mode 100644 app/src/main/res/drawable-anydpi/ic_list_instance.xml delete mode 100644 app/src/main/res/drawable-anydpi/ic_list_timeline.xml delete mode 100644 app/src/main/res/drawable-anydpi/ic_menu_camera.xml delete mode 100644 app/src/main/res/drawable-anydpi/ic_menu_gallery.xml delete mode 100644 app/src/main/res/drawable-anydpi/ic_menu_manage.xml delete mode 100644 app/src/main/res/drawable-anydpi/ic_menu_menu.xml delete mode 100644 app/src/main/res/drawable-anydpi/ic_menu_send.xml delete mode 100644 app/src/main/res/drawable-anydpi/ic_menu_share.xml delete mode 100644 app/src/main/res/drawable-anydpi/ic_menu_slideshow.xml delete mode 100644 app/src/main/res/drawable-anydpi/ic_notifications_menu.xml delete mode 100644 app/src/main/res/drawable-anydpi/ic_notifications_settings.xml delete mode 100644 app/src/main/res/drawable-anydpi/ic_perm_media.xml delete mode 100644 app/src/main/res/drawable-anydpi/ic_pixelfed_media.xml delete mode 100644 app/src/main/res/drawable-anydpi/ic_pixelfed_share.xml delete mode 100644 app/src/main/res/drawable-anydpi/ic_save.xml delete mode 100644 app/src/main/res/drawable-anydpi/ic_security_admin_menu.xml delete mode 100644 app/src/main/res/drawable-anydpi/ic_tablet_menu.xml delete mode 100644 app/src/main/res/drawable-anydpi/ic_timelapse.xml delete mode 100644 app/src/main/res/drawable-anydpi/ic_timeline_menu_s.xml delete mode 100644 app/src/main/res/drawable-anydpi/ic_translate_menu.xml delete mode 100644 app/src/main/res/drawable-anydpi/ic_user_remove.xml delete mode 100644 app/src/main/res/drawable-anydpi/ic_user_times.xml delete mode 100644 app/src/main/res/drawable-anydpi/ic_video_channel.xml delete mode 100644 app/src/main/res/drawable-anydpi/ic_visibility_off_menu.xml delete mode 100644 app/src/main/res/drawable-hdpi/fedilab_notification_icon.png delete mode 100644 app/src/main/res/drawable-mdpi/fedilab_notification_icon.png delete mode 100644 app/src/main/res/drawable-xhdpi/fedilab_notification_icon.png delete mode 100644 app/src/main/res/drawable-xxhdpi/fedilab_notification_icon.png delete mode 100644 app/src/main/res/drawable-xxxhdpi/fedilab_notification_icon.png delete mode 100644 app/src/main/res/drawable/card_border_black.xml delete mode 100644 app/src/main/res/drawable/fedilab_logo.xml delete mode 100644 app/src/main/res/drawable/ic_launcher_foreground.xml delete mode 100644 app/src/main/res/drawable/imageview_border.xml delete mode 100644 app/src/main/res/drawable/imageview_border_black.xml delete mode 100644 app/src/main/res/drawable/imageview_border_dark.xml delete mode 100644 app/src/main/res/drawable/line_divider_black.xml delete mode 100644 app/src/main/res/drawable/line_divider_dark.xml delete mode 100644 app/src/main/res/drawable/line_divider_light.xml delete mode 100644 app/src/main/res/drawable/menu_item_selector.xml delete mode 100644 app/src/main/res/drawable/menu_item_selector_black.xml delete mode 100644 app/src/main/res/drawable/menu_item_selector_light.xml delete mode 100644 app/src/main/res/drawable/menu_selector.xml delete mode 100644 app/src/main/res/drawable/menu_selector_black.xml delete mode 100644 app/src/main/res/drawable/menu_selector_dark.xml delete mode 100644 app/src/main/res/drawable/quick_reply_background.xml delete mode 100644 app/src/main/res/drawable/quick_reply_background_black.xml delete mode 100644 app/src/main/res/drawable/quick_reply_background_light.xml delete mode 100644 app/src/main/res/drawable/rounded_corner_10.xml delete mode 100644 app/src/main/res/drawable/shape_border_bottom_settings.xml delete mode 100644 app/src/main/res/drawable/shape_border_bottom_settings_black.xml delete mode 100644 app/src/main/res/drawable/shape_border_bottom_settings_dark.xml delete mode 100644 app/src/main/res/drawable/side_nav_bar.xml delete mode 100644 app/src/main/res/drawable/side_nav_bar_black.xml delete mode 100644 app/src/main/res/drawable/side_nav_bar_dark.xml delete mode 100644 app/src/main/res/drawable/unfollow_color.xml delete mode 100644 app/src/main/res/layout-sw600dp/activity_remote_follow.xml delete mode 100644 app/src/main/res/layout/activity_remote_follow.xml delete mode 100644 app/src/main/res/layout/dialog_main.xml delete mode 100644 app/src/main/res/layout/drawer_account_search_html.xml delete mode 100644 app/src/main/res/layout/menu_list_item.xml delete mode 100644 app/src/main/res/layout/notificationview.xml delete mode 100644 app/src/main/res/layout/owner_status_action_bar.xml delete mode 100644 app/src/main/res/layout/picture_actionbar.xml delete mode 100644 app/src/main/res/layout/popup_picture.xml delete mode 100644 app/src/main/res/layout/pref_reset_bd_button.xml delete mode 100644 app/src/main/res/layout/showaccount_actionbar.xml delete mode 100644 app/src/main/res/layout/tablayout_settings.xml delete mode 100644 app/src/main/res/layout/tags_none.xml delete mode 100644 app/src/main/res/layout/toot_buttons.xml delete mode 100644 app/src/main/res/layout/user_search_result.xml delete mode 100644 app/src/main/res/menu/main_media.xml delete mode 100644 app/src/main/res/menu/remote_instances.xml delete mode 100644 app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml delete mode 100644 app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml delete mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png delete mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher_round.png delete mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png delete mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher_round.png delete mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png delete mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher_round.png delete mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png delete mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png delete mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png delete mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index dc57c1e48..71ab6b438 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -16,8 +16,8 @@ --> + package="app.fedilab.android" + android:installLocation="auto"> + android:theme="@style/AppThemeDark" + android:usesCleartextTraffic="true" + tools:replace="android:allowBackup"> + android:label="@string/app_name" + android:theme="@style/AppThemeDark_NoActionBar" + android:windowSoftInputMode="adjustResize"> @@ -136,9 +136,9 @@ + android:pathPrefix="/@" + android:scheme="https" /> @@ -157,10 +157,12 @@ android:icon="@mipmap/ic_launcher_bubbles" android:roundIcon="@mipmap/ic_launcher_bubbles_round" android:targetActivity=".activities.MainActivity"> - + - - + + @@ -170,10 +172,12 @@ android:icon="@mipmap/ic_launcher_fediverse" android:roundIcon="@mipmap/ic_launcher_fediverse_round" android:targetActivity=".activities.MainActivity"> - + - - + + @@ -183,10 +187,12 @@ android:icon="@mipmap/ic_launcher_hero" android:roundIcon="@mipmap/ic_launcher_hero_round" android:targetActivity=".activities.MainActivity"> - + - - + + @@ -196,10 +202,12 @@ android:icon="@mipmap/ic_launcher_atom" android:roundIcon="@mipmap/ic_launcher_atom_round" android:targetActivity=".activities.MainActivity"> - + - - + + @@ -209,10 +217,12 @@ android:icon="@mipmap/ic_launcher_crash" android:roundIcon="@mipmap/ic_launcher_crash_round" android:targetActivity=".activities.MainActivity"> - + - - + + @@ -222,29 +232,31 @@ android:icon="@mipmap/ic_launcher_mastalab" android:roundIcon="@mipmap/ic_launcher_mastalab_round" android:targetActivity=".activities.MainActivity"> - + - - + + + android:label="@string/app_name" + android:windowSoftInputMode="stateAlwaysHidden" /> + android:label="@string/app_name" + android:windowSoftInputMode="stateAlwaysHidden" /> + android:label="@string/app_name" + android:windowSoftInputMode="stateAlwaysHidden"> @@ -253,15 +265,15 @@ + android:pathPattern="/registration_helper/.*" + android:scheme="https" /> + android:label="@string/app_name" + android:windowSoftInputMode="stateAlwaysHidden"> @@ -275,229 +287,229 @@ + android:theme="@style/AppThemeDark_NoActionBar" + android:windowSoftInputMode="stateAlwaysHidden" /> + android:label="@string/app_name" + android:windowSoftInputMode="stateAlwaysHidden" /> + android:theme="@style/AppThemeDark_NoActionBar" + android:windowSoftInputMode="stateAlwaysHidden" /> + android:configChanges="keyboardHidden|orientation|screenSize" + android:label="@string/app_name" /> + android:configChanges="keyboardHidden|orientation|screenSize" + android:label="@string/app_name" /> + android:label="@string/app_name" + android:theme="@style/AppThemeDark_NoActionBar" /> + android:configChanges="keyboardHidden|orientation|screenSize" + android:label="@string/app_name" /> + android:configChanges="keyboardHidden|orientation|screenSize" + android:label="@string/app_name" /> + android:noHistory="true" + android:theme="@style/TransparentDark" /> + android:label="@string/app_name" + android:windowSoftInputMode="stateAlwaysHidden" /> + android:label="@string/app_name" + android:windowSoftInputMode="stateAlwaysHidden" /> + android:theme="@style/AppThemeDark_NoActionBar" + android:windowSoftInputMode="stateAlwaysHidden" /> + android:theme="@style/AppThemeDark_NoActionBar" + android:windowSoftInputMode="stateAlwaysHidden" /> + android:theme="@style/AppThemeDark_NoActionBar" + android:windowSoftInputMode="stateAlwaysHidden" /> + android:theme="@style/AppThemeDark_NoActionBar" + android:windowSoftInputMode="stateAlwaysHidden" /> - - + android:windowSoftInputMode="stateAlwaysHidden" /> + + + android:label="@string/app_name" + android:windowSoftInputMode="stateAlwaysHidden" /> + android:theme="@style/AppThemeDark_NoActionBar" + android:windowSoftInputMode="stateAlwaysHidden" /> + android:launchMode="singleTop" + android:windowSoftInputMode="stateAlwaysHidden" /> + android:label="@string/app_name" + android:windowSoftInputMode="stateAlwaysHidden" /> + android:label="@string/app_name" + android:windowSoftInputMode="stateAlwaysHidden" /> + android:label="@string/app_name" + android:windowSoftInputMode="stateAlwaysHidden" /> + android:label="@string/app_name" + android:windowSoftInputMode="stateAlwaysHidden" /> + android:label="@string/app_name" + android:windowSoftInputMode="stateAlwaysHidden" /> + android:label="@string/app_name" + android:windowSoftInputMode="stateAlwaysHidden" /> + android:label="@string/app_name" + android:windowSoftInputMode="stateAlwaysHidden" /> + android:launchMode="singleTop" + android:theme="@style/AppThemeDark" + android:windowSoftInputMode="adjustResize" /> + android:launchMode="singleTop" + android:theme="@style/AppThemeDark" + android:windowSoftInputMode="stateAlwaysHidden" /> - - - - - - - - - - + android:windowSoftInputMode="stateAlwaysHidden" /> + + + + + + + + + + . */ package app.fedilab.android.activities; -import android.annotation.SuppressLint; import android.content.Intent; import android.content.SharedPreferences; import android.content.pm.PackageInfo; @@ -23,11 +22,6 @@ import android.graphics.drawable.ColorDrawable; import android.net.Uri; import android.os.AsyncTask; import android.os.Bundle; - -import androidx.appcompat.app.ActionBar; -import androidx.appcompat.widget.Toolbar; -import androidx.core.content.ContextCompat; - import android.text.SpannableString; import android.text.style.UnderlineSpan; import android.view.LayoutInflater; @@ -40,10 +34,17 @@ import android.widget.LinearLayout; import android.widget.TextView; import android.widget.Toast; +import androidx.appcompat.app.ActionBar; +import androidx.core.content.ContextCompat; + import java.util.ArrayList; import java.util.List; import app.fedilab.android.BuildConfig; +import app.fedilab.android.R; +import app.fedilab.android.asynctasks.RetrieveRelationshipAsyncTask; +import app.fedilab.android.asynctasks.RetrieveRemoteDataAsyncTask; +import app.fedilab.android.asynctasks.UpdateAccountInfoAsyncTask; import app.fedilab.android.client.Entities.Account; import app.fedilab.android.client.Entities.Error; import app.fedilab.android.client.Entities.Relationship; @@ -51,13 +52,9 @@ import app.fedilab.android.client.Entities.Results; import app.fedilab.android.drawers.AccountSearchDevAdapter; import app.fedilab.android.helper.ExpandableHeightListView; import app.fedilab.android.helper.Helper; -import es.dmoral.toasty.Toasty; -import app.fedilab.android.R; -import app.fedilab.android.asynctasks.RetrieveRelationshipAsyncTask; -import app.fedilab.android.asynctasks.RetrieveRemoteDataAsyncTask; -import app.fedilab.android.asynctasks.UpdateAccountInfoAsyncTask; import app.fedilab.android.interfaces.OnRetrieveRelationshipInterface; import app.fedilab.android.interfaces.OnRetrieveRemoteAccountInterface; +import es.dmoral.toasty.Toasty; /** diff --git a/app/src/main/java/app/fedilab/android/activities/AccountReportActivity.java b/app/src/main/java/app/fedilab/android/activities/AccountReportActivity.java index 107fea361..315ae8a25 100644 --- a/app/src/main/java/app/fedilab/android/activities/AccountReportActivity.java +++ b/app/src/main/java/app/fedilab/android/activities/AccountReportActivity.java @@ -14,7 +14,6 @@ package app.fedilab.android.activities; * You should have received a copy of the GNU General Public License along with Fedilab; if not, * see . */ -import android.annotation.SuppressLint; import android.app.Activity; import android.app.AlertDialog; import android.content.DialogInterface; diff --git a/app/src/main/java/app/fedilab/android/activities/AdminActivity.java b/app/src/main/java/app/fedilab/android/activities/AdminActivity.java index 49ca7b1d2..80694c05d 100644 --- a/app/src/main/java/app/fedilab/android/activities/AdminActivity.java +++ b/app/src/main/java/app/fedilab/android/activities/AdminActivity.java @@ -14,7 +14,6 @@ * see . */ package app.fedilab.android.activities; -import android.annotation.SuppressLint; import android.content.SharedPreferences; import android.graphics.drawable.ColorDrawable; import android.os.Bundle; @@ -39,17 +38,12 @@ import androidx.viewpager.widget.ViewPager; import com.google.android.material.tabs.TabLayout; -import java.util.Objects; - import app.fedilab.android.R; import app.fedilab.android.asynctasks.UpdateAccountInfoAsyncTask; import app.fedilab.android.fragments.DisplayAdminAccountsFragment; import app.fedilab.android.fragments.DisplayAdminReportsFragment; -import app.fedilab.android.fragments.DisplayStatusFragment; import app.fedilab.android.helper.Helper; -import static app.fedilab.android.activities.BaseMainActivity.mPageReferenceMap; - /** * Created by Thomas on 19/06/2019. diff --git a/app/src/main/java/app/fedilab/android/activities/BaseActivity.java b/app/src/main/java/app/fedilab/android/activities/BaseActivity.java index ddf10472e..9a2804d72 100644 --- a/app/src/main/java/app/fedilab/android/activities/BaseActivity.java +++ b/app/src/main/java/app/fedilab/android/activities/BaseActivity.java @@ -5,20 +5,16 @@ import android.app.ProgressDialog; import android.content.Context; import android.content.pm.PackageManager; import android.content.res.Configuration; - -import androidx.annotation.NonNull; - -import com.google.android.material.snackbar.Snackbar; - -import androidx.core.app.ActivityCompat; -import androidx.core.content.ContextCompat; - - import android.os.Bundle; import android.view.View; import android.widget.Toast; +import androidx.annotation.NonNull; +import androidx.core.app.ActivityCompat; +import androidx.core.content.ContextCompat; + import com.franmontiel.localechanger.LocaleChanger; +import com.google.android.material.snackbar.Snackbar; import com.jaredrummler.cyanea.app.CyaneaAppCompatActivity; import com.vanniktech.emoji.EmojiManager; import com.vanniktech.emoji.one.EmojiOneProvider; @@ -39,13 +35,13 @@ public class BaseActivity extends CyaneaAppCompatActivity { public static final int READ_WRITE_STORAGE = 52; public static Timer timer; - private ProgressDialog mProgressDialog; static { Helper.installProvider(); EmojiManager.install(new EmojiOneProvider()); } + private ProgressDialog mProgressDialog; @Override protected void onCreate(Bundle savedInstanceState) { diff --git a/app/src/main/java/app/fedilab/android/activities/BaseMainActivity.java b/app/src/main/java/app/fedilab/android/activities/BaseMainActivity.java index e5cd17bc6..b66ad338f 100644 --- a/app/src/main/java/app/fedilab/android/activities/BaseMainActivity.java +++ b/app/src/main/java/app/fedilab/android/activities/BaseMainActivity.java @@ -35,30 +35,6 @@ import android.os.Build; import android.os.Bundle; import android.os.Parcelable; import android.preference.PreferenceManager; - -import androidx.annotation.NonNull; - -import com.google.android.material.appbar.AppBarLayout; -import com.google.android.material.floatingactionbutton.FloatingActionButton; -import com.google.android.material.navigation.NavigationView; -import com.google.android.material.tabs.TabLayout; -import com.jaredrummler.materialspinner.MaterialSpinner; - -import androidx.core.app.ActivityCompat; -import androidx.fragment.app.Fragment; -import androidx.fragment.app.FragmentManager; -import androidx.fragment.app.FragmentStatePagerAdapter; -import androidx.core.content.ContextCompat; -import androidx.core.view.GravityCompat; -import androidx.localbroadcastmanager.content.LocalBroadcastManager; -import androidx.viewpager.widget.ViewPager; -import androidx.drawerlayout.widget.DrawerLayout; -import androidx.appcompat.app.ActionBarDrawerToggle; -import androidx.appcompat.app.AlertDialog; -import androidx.appcompat.widget.PopupMenu; -import androidx.appcompat.widget.SearchView; -import androidx.appcompat.widget.Toolbar; - import android.util.Patterns; import android.view.LayoutInflater; import android.view.Menu; @@ -75,6 +51,28 @@ import android.widget.SeekBar; import android.widget.TextView; import android.widget.Toast; +import androidx.annotation.NonNull; +import androidx.appcompat.app.ActionBarDrawerToggle; +import androidx.appcompat.app.AlertDialog; +import androidx.appcompat.widget.PopupMenu; +import androidx.appcompat.widget.SearchView; +import androidx.appcompat.widget.Toolbar; +import androidx.core.app.ActivityCompat; +import androidx.core.content.ContextCompat; +import androidx.core.view.GravityCompat; +import androidx.drawerlayout.widget.DrawerLayout; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentStatePagerAdapter; +import androidx.localbroadcastmanager.content.LocalBroadcastManager; +import androidx.viewpager.widget.ViewPager; + +import com.google.android.material.appbar.AppBarLayout; +import com.google.android.material.floatingactionbutton.FloatingActionButton; +import com.google.android.material.navigation.NavigationView; +import com.google.android.material.tabs.TabLayout; +import com.jaredrummler.materialspinner.MaterialSpinner; + import java.io.File; import java.lang.ref.WeakReference; import java.lang.reflect.Method; @@ -87,6 +85,17 @@ import java.util.concurrent.TimeUnit; import java.util.regex.Matcher; import app.fedilab.android.BuildConfig; +import app.fedilab.android.R; +import app.fedilab.android.asynctasks.ManageFiltersAsyncTask; +import app.fedilab.android.asynctasks.RetrieveAccountsAsyncTask; +import app.fedilab.android.asynctasks.RetrieveFeedsAsyncTask; +import app.fedilab.android.asynctasks.RetrieveInstanceAsyncTask; +import app.fedilab.android.asynctasks.RetrieveMetaDataAsyncTask; +import app.fedilab.android.asynctasks.RetrievePeertubeInformationAsyncTask; +import app.fedilab.android.asynctasks.RetrieveRemoteDataAsyncTask; +import app.fedilab.android.asynctasks.SyncTimelinesAsyncTask; +import app.fedilab.android.asynctasks.UpdateAccountInfoAsyncTask; +import app.fedilab.android.asynctasks.UpdateAccountInfoByIDAsyncTask; import app.fedilab.android.client.APIResponse; import app.fedilab.android.client.Entities.Account; import app.fedilab.android.client.Entities.Filters; @@ -115,6 +124,13 @@ import app.fedilab.android.fragments.WhoToFollowFragment; import app.fedilab.android.helper.CrossActions; import app.fedilab.android.helper.Helper; import app.fedilab.android.helper.MenuFloating; +import app.fedilab.android.interfaces.OnFilterActionInterface; +import app.fedilab.android.interfaces.OnRetrieveEmojiAccountInterface; +import app.fedilab.android.interfaces.OnRetrieveInstanceInterface; +import app.fedilab.android.interfaces.OnRetrieveMetaDataInterface; +import app.fedilab.android.interfaces.OnRetrieveRemoteAccountInterface; +import app.fedilab.android.interfaces.OnSyncTimelineInterface; +import app.fedilab.android.interfaces.OnUpdateAccountInfoInterface; import app.fedilab.android.services.BackupStatusService; import app.fedilab.android.services.LiveNotificationDelayedService; import app.fedilab.android.services.LiveNotificationService; @@ -124,24 +140,6 @@ import app.fedilab.android.sqlite.TempMuteDAO; import app.fedilab.android.sqlite.TimelineCacheDAO; import app.fedilab.android.sqlite.TimelinesDAO; import es.dmoral.toasty.Toasty; -import app.fedilab.android.R; -import app.fedilab.android.asynctasks.ManageFiltersAsyncTask; -import app.fedilab.android.asynctasks.RetrieveAccountsAsyncTask; -import app.fedilab.android.asynctasks.RetrieveFeedsAsyncTask; -import app.fedilab.android.asynctasks.RetrieveInstanceAsyncTask; -import app.fedilab.android.asynctasks.RetrieveMetaDataAsyncTask; -import app.fedilab.android.asynctasks.RetrievePeertubeInformationAsyncTask; -import app.fedilab.android.asynctasks.RetrieveRemoteDataAsyncTask; -import app.fedilab.android.asynctasks.SyncTimelinesAsyncTask; -import app.fedilab.android.asynctasks.UpdateAccountInfoAsyncTask; -import app.fedilab.android.asynctasks.UpdateAccountInfoByIDAsyncTask; -import app.fedilab.android.interfaces.OnFilterActionInterface; -import app.fedilab.android.interfaces.OnRetrieveEmojiAccountInterface; -import app.fedilab.android.interfaces.OnRetrieveInstanceInterface; -import app.fedilab.android.interfaces.OnRetrieveMetaDataInterface; -import app.fedilab.android.interfaces.OnRetrieveRemoteAccountInterface; -import app.fedilab.android.interfaces.OnSyncTimelineInterface; -import app.fedilab.android.interfaces.OnUpdateAccountInfoInterface; import static app.fedilab.android.asynctasks.ManageFiltersAsyncTask.action.GET_ALL_FILTER; import static app.fedilab.android.helper.Helper.changeDrawableColor; @@ -151,51 +149,40 @@ public abstract class BaseMainActivity extends BaseActivity implements NavigationView.OnNavigationItemSelectedListener, OnUpdateAccountInfoInterface, OnRetrieveMetaDataInterface, OnRetrieveInstanceInterface, OnRetrieveRemoteAccountInterface, OnRetrieveEmojiAccountInterface, OnFilterActionInterface, OnSyncTimelineInterface { + public static String currentLocale; + public static List filters = new ArrayList<>(); + public static int countNewStatus; + public static int countNewNotifications; + public static String lastHomeId = null, lastNotificationId = null; + public static String displayPeertube = null; + public static UpdateAccountInfoAsyncTask.SOCIAL social; + public static List timelines; + public static HashMap mPageReferenceMap; + public static HashMap poll_limits = new HashMap<>(); + public static List mutedAccount = new ArrayList<>(); + public static String regex_home, regex_local, regex_public; + public static boolean show_boosts, show_replies, show_art_nsfw; + public static iconLauncher mLauncher = iconLauncher.BUBBLES; + private static boolean notificationChecked = false; + private final int PICK_IMPORT = 5556; private FloatingActionButton toot, delete_all, add_new; private HashMap tagTile = new HashMap<>(); private HashMap tagItem = new HashMap<>(); private TextView toolbarTitle; private SearchView toolbar_search; private View headerLayout; - public static String currentLocale; private TabLayout tabLayout; private ViewPager viewPager; private RelativeLayout main_app_container; - public static List filters = new ArrayList<>(); - public static int countNewStatus; - public static int countNewNotifications; - public static String lastHomeId = null, lastNotificationId = null; private AppBarLayout appBar; private String userId; private String instance; private PagerAdapter adapter; private ImageView delete_instance, display_timeline; - public static String displayPeertube = null; private int style; private Activity activity; - public static UpdateAccountInfoAsyncTask.SOCIAL social; - private final int PICK_IMPORT = 5556; - public static List timelines; private BroadcastReceiver hidde_menu, update_topbar; - - public static HashMap mPageReferenceMap; - private static boolean notificationChecked = false; - public static HashMap poll_limits = new HashMap<>(); private Instance instanceClass; - public static List mutedAccount = new ArrayList<>(); - public static String regex_home, regex_local, regex_public; - public static boolean show_boosts, show_replies, show_art_nsfw; - - public enum iconLauncher{ - BUBBLES, - FEDIVERSE, - HERO, - ATOM, - BRAINCRASH, - MASTALAB - } - public static iconLauncher mLauncher = iconLauncher.BUBBLES; - @Override protected void onCreate(Bundle savedInstanceState) { @@ -262,7 +249,7 @@ public abstract class BaseMainActivity extends BaseActivity countNewNotifications = 0; //TODO: remove that line - // social = UpdateAccountInfoAsyncTask.SOCIAL.PIXELFED; + // social = UpdateAccountInfoAsyncTask.SOCIAL.PIXELFED; regex_home = sharedpreferences.getString(Helper.SET_FILTER_REGEX_HOME, null); regex_local = sharedpreferences.getString(Helper.SET_FILTER_REGEX_LOCAL, null); @@ -447,7 +434,6 @@ public abstract class BaseMainActivity extends BaseActivity iconSub.setImageResource(R.drawable.ic_subscriptions); - @SuppressWarnings("ConstantConditions") @SuppressLint("CutPasteId") ImageView iconOver = pTabOver.getCustomView().findViewById(R.id.tab_icon); iconOver.setImageResource(R.drawable.ic_overview); @@ -600,10 +586,10 @@ public abstract class BaseMainActivity extends BaseActivity if (tab.getCustomView() != null) { if (viewPager.getAdapter() != null) { Fragment fragment = (Fragment) viewPager.getAdapter().instantiateItem(viewPager, tab.getPosition()); - if( fragment instanceof DisplayStatusFragment) { + if (fragment instanceof DisplayStatusFragment) { DisplayStatusFragment displayStatusFragment = ((DisplayStatusFragment) fragment); displayStatusFragment.scrollToTop(); - }else if(fragment instanceof DisplayNotificationsFragment){ + } else if (fragment instanceof DisplayNotificationsFragment) { DisplayNotificationsFragment displayNotificationsFragment = ((DisplayNotificationsFragment) fragment); displayNotificationsFragment.scrollToTop(); } @@ -690,7 +676,7 @@ public abstract class BaseMainActivity extends BaseActivity int position = 0; if (tabLayout != null) position = tabLayout.getSelectedTabPosition(); - new SyncTimelinesAsyncTask(BaseMainActivity.this, position, true,BaseMainActivity.this).execute(); + new SyncTimelinesAsyncTask(BaseMainActivity.this, position, true, BaseMainActivity.this).execute(); } }; LocalBroadcastManager.getInstance(getApplicationContext()).registerReceiver(hidde_menu, new IntentFilter(Helper.RECEIVE_HIDE_ITEM)); @@ -710,8 +696,8 @@ public abstract class BaseMainActivity extends BaseActivity //Peertube search if (tabLayout != null && timelines != null && timelines.size() > tabLayout.getSelectedTabPosition() && (timelines.get(tabLayout.getSelectedTabPosition()).getType() == ManageTimelines.Type.PEERTUBE || - (timelines.get(tabLayout.getSelectedTabPosition()).getRemoteInstance() != null && - timelines.get(tabLayout.getSelectedTabPosition()).getRemoteInstance().getType().equals("PEERTUBE")))) { + (timelines.get(tabLayout.getSelectedTabPosition()).getRemoteInstance() != null && + timelines.get(tabLayout.getSelectedTabPosition()).getRemoteInstance().getType().equals("PEERTUBE")))) { DisplayStatusFragment statusFragment; Bundle bundle = new Bundle(); statusFragment = new DisplayStatusFragment(); @@ -873,7 +859,7 @@ public abstract class BaseMainActivity extends BaseActivity tabLayout.getTabAt(0).select(); */ if (social != UpdateAccountInfoAsyncTask.SOCIAL.PEERTUBE) { - if( social != UpdateAccountInfoAsyncTask.SOCIAL.PIXELFED) { + if (social != UpdateAccountInfoAsyncTask.SOCIAL.PIXELFED) { toot.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { @@ -888,7 +874,7 @@ public abstract class BaseMainActivity extends BaseActivity return false; } }); - }else{ + } else { toot.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { @@ -1207,10 +1193,10 @@ public abstract class BaseMainActivity extends BaseActivity final MaterialSpinner set_live_type = dialogView.findViewById(R.id.set_live_type); String[] labels = {getString(R.string.live_notif), getString(R.string.live_delayed), getString(R.string.no_live_notif)}; ArrayAdapter adapterLive = new ArrayAdapter<>(getApplicationContext(), - android.R.layout.simple_spinner_dropdown_item,labels ); + android.R.layout.simple_spinner_dropdown_item, labels); set_live_type.setAdapter(adapterLive); TextView set_live_type_indication = dialogView.findViewById(R.id.set_live_type_indication); - switch (Helper.liveNotifType(getApplicationContext())){ + switch (Helper.liveNotifType(getApplicationContext())) { case Helper.NOTIF_LIVE: set_live_type_indication.setText(R.string.live_notif_indication); break; @@ -1247,7 +1233,7 @@ public abstract class BaseMainActivity extends BaseActivity editor.apply(); break; } - switch (Helper.liveNotifType(getApplicationContext())){ + switch (Helper.liveNotifType(getApplicationContext())) { case Helper.NOTIF_LIVE: set_live_type_indication.setText(R.string.live_notif_indication); break; @@ -1262,7 +1248,6 @@ public abstract class BaseMainActivity extends BaseActivity }); - dialogBuilderOptin.setTitle(R.string.settings_popup_title); dialogBuilderOptin.setCancelable(false); dialogBuilderOptin.setPositiveButton(R.string.validate, new DialogInterface.OnClickListener() { @@ -1277,7 +1262,6 @@ public abstract class BaseMainActivity extends BaseActivity dialogBuilderOptin.show(); } catch (Exception ignored) { } - ; } Helper.switchLayout(BaseMainActivity.this); @@ -1327,7 +1311,6 @@ public abstract class BaseMainActivity extends BaseActivity protected abstract void rateThisApp(); - @Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); @@ -1421,13 +1404,13 @@ public abstract class BaseMainActivity extends BaseActivity } else if (extras.getInt(Helper.INTENT_ACTION) == Helper.REDRAW_MENU) { Helper.hideMenuItem(BaseMainActivity.this, navigationView.getMenu()); } else if (extras.getInt(Helper.INTENT_ACTION) == Helper.SEARCH_TAG) { - new SyncTimelinesAsyncTask(BaseMainActivity.this, -1, false,BaseMainActivity.this).execute(); + new SyncTimelinesAsyncTask(BaseMainActivity.this, -1, false, BaseMainActivity.this).execute(); } else if (extras.getInt(Helper.INTENT_ACTION) == Helper.REFRESH_TIMELINE) { int position = 0; boolean refreshList = extras.getBoolean(Helper.REFRESH_LIST_TIMELINE, false); if (tabLayout != null) position = tabLayout.getSelectedTabPosition(); - new SyncTimelinesAsyncTask(BaseMainActivity.this, position, refreshList,BaseMainActivity.this).execute(); + new SyncTimelinesAsyncTask(BaseMainActivity.this, position, refreshList, BaseMainActivity.this).execute(); } else if (extras.getInt(Helper.INTENT_ACTION) == Helper.SEARCH_REMOTE) { String url = extras.getString(Helper.SEARCH_URL); intent.replaceExtras(new Bundle()); @@ -1610,7 +1593,7 @@ public abstract class BaseMainActivity extends BaseActivity public void onResume() { super.onResume(); PreferenceManager.getDefaultSharedPreferences(this).edit().putBoolean("isMainActivityRunning", true).apply(); - + //Proceeds to update of the authenticated account /*if (Helper.isLoggedIn(getApplicationContext())) { new UpdateAccountInfoByIDAsyncTask(getApplicationContext(), social, BaseMainActivity.this).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); @@ -1637,7 +1620,6 @@ public abstract class BaseMainActivity extends BaseActivity } - @Override protected void onPause() { super.onPause(); @@ -1729,7 +1711,7 @@ public abstract class BaseMainActivity extends BaseActivity Intent intent = new Intent(getApplicationContext(), MutedInstanceActivity.class); startActivity(intent); return false; - }else if ( id == R.id.nav_bookmarks){ + } else if (id == R.id.nav_bookmarks) { Intent intent = new Intent(getApplicationContext(), BookmarkActivity.class); startActivity(intent); return false; @@ -1784,7 +1766,7 @@ public abstract class BaseMainActivity extends BaseActivity toot.hide(); statusFragment = new DisplayStatusFragment(); bundle.putSerializable("type", RetrieveFeedsAsyncTask.Type.FAVOURITES); - if( social == UpdateAccountInfoAsyncTask.SOCIAL.PIXELFED){ + if (social == UpdateAccountInfoAsyncTask.SOCIAL.PIXELFED) { bundle.putString("instanceType", "PIXELFED"); } statusFragment.setArguments(bundle); @@ -1844,7 +1826,7 @@ public abstract class BaseMainActivity extends BaseActivity fragmentTag = "HOW_TO_VIDEOS"; fragmentManager.beginTransaction() .replace(R.id.main_app_container, displayHowToFragment, fragmentTag).commit(); - } else if (id == R.id.nav_muted ) { + } else if (id == R.id.nav_muted) { toot.hide(); accountsFragment = new DisplayAccountsFragment(); bundle.putSerializable("type", RetrieveAccountsAsyncTask.Type.MUTED); @@ -1870,7 +1852,7 @@ public abstract class BaseMainActivity extends BaseActivity fragmentManager.beginTransaction() .replace(R.id.main_app_container, displayBookmarksPixelfedFragment, fragmentTag).commit(); toot.hide(); - }else if (id == R.id.nav_peertube) { + } else if (id == R.id.nav_peertube) { DisplayFavoritesPeertubeFragment displayFavoritesPeertubeFragment = new DisplayFavoritesPeertubeFragment(); fragmentTag = "BOOKMARKS_PEERTUBE"; fragmentManager.beginTransaction() @@ -1922,7 +1904,6 @@ public abstract class BaseMainActivity extends BaseActivity return true; } - public void populateTitleWithTag(String tag, String title, int index) { if (tag == null) return; @@ -1970,7 +1951,6 @@ public abstract class BaseMainActivity extends BaseActivity } } - @Override public void onRetrieveMetaData(boolean error, String sharedSubject, String sharedText, String image, String title, String description) { Bundle b = new Bundle(); @@ -2036,7 +2016,6 @@ public abstract class BaseMainActivity extends BaseActivity } } - public void displayTimelineMoreButton(boolean displayed) { if (displayed) { display_timeline.setVisibility(View.VISIBLE); @@ -2061,7 +2040,7 @@ public abstract class BaseMainActivity extends BaseActivity if (position < 0) position = 0; if (toolbarTitle != null) - viewPager.setOffscreenPageLimit(2); + viewPager.setOffscreenPageLimit(2); main_app_container = findViewById(R.id.main_app_container); boolean iconOnly = true; @@ -2207,6 +2186,127 @@ public abstract class BaseMainActivity extends BaseActivity } } + public void updateHomeCounter() { + int i = 0; + SharedPreferences sharedpreferences = getSharedPreferences(Helper.APP_PREFS, MODE_PRIVATE); + int tootperpage = sharedpreferences.getInt(Helper.SET_TOOT_PER_PAGE, Helper.TOOTS_PER_PAGE); + if (timelines != null && timelines.size() > 0) { + for (ManageTimelines tl : timelines) { + if (tl.getType() == ManageTimelines.Type.HOME) { + if (tabLayout.getTabCount() > i) { + View tabHome = tabLayout.getTabAt(i).getCustomView(); + if (tabHome != null) { + TextView tabCounterHome = tabHome.findViewById(R.id.tab_counter); + if (countNewStatus == tootperpage) { + tabCounterHome.setText(String.format(Locale.getDefault(), "%d+", countNewStatus)); + } else { + tabCounterHome.setText(String.valueOf(countNewStatus)); + } + if (countNewStatus > 0) { + //New data are available + //The fragment is not displayed, so the counter is displayed + tabCounterHome.setVisibility(View.VISIBLE); + } else { + tabCounterHome.setVisibility(View.GONE); + } + } + } + } + i++; + } + + } + } + + public void manageTab(RetrieveFeedsAsyncTask.Type type, int value) { + SQLiteDatabase db = Sqlite.getInstance(BaseMainActivity.this, Sqlite.DB_NAME, null, Sqlite.DB_VERSION).open(); + List tls = new TimelinesDAO(BaseMainActivity.this, db).getDisplayedTimelines(); + for (ManageTimelines tl : tls) { + if (type == ManageTimelines.transform(BaseMainActivity.this, tl.getType())) { + View tabCustom = tabLayout.getTabAt(tl.getPosition()).getCustomView(); + assert tabCustom != null; + TextView tabCountertCustom = tabCustom.findViewById(R.id.tab_counter); + tabCountertCustom.setText(String.valueOf(value)); + if (value > 0) { + tabCountertCustom.setVisibility(View.VISIBLE); + } else { + tabCountertCustom.setVisibility(View.GONE); + } + break; + } + } + } + + public void updateNotifCounter() { + if (timelines == null) + return; + int i = 0; + int position = -1; + for (ManageTimelines tl : timelines) { + if (tl.getType() == ManageTimelines.Type.NOTIFICATION) { + if (tabLayout.getTabAt(i) != null) { + position = i; + } + break; + } + i++; + } + if (position == -1) + return; + View tabNotif = tabLayout.getTabAt(position).getCustomView(); + if (tabNotif == null) + return; + TextView tabCounterNotif = tabNotif.findViewById(R.id.tab_counter); + if (tabCounterNotif == null) + return; + if (countNewNotifications == Helper.NOTIFICATIONS_PER_PAGE) { + tabCounterNotif.setText(String.format(Locale.getDefault(), "%d+", countNewNotifications)); + } else { + tabCounterNotif.setText(String.valueOf(countNewNotifications)); + } + if (countNewNotifications > 0) { + tabCounterNotif.setVisibility(View.VISIBLE); + } else { + tabCounterNotif.setVisibility(View.GONE); + } + try { + TabLayoutNotificationsFragment tabLayoutNotificationsFragment = (TabLayoutNotificationsFragment) mPageReferenceMap.get(position); + ViewPager notifViewPager = tabLayoutNotificationsFragment.getViewPager(); + + if (notifViewPager != null && notifViewPager.getAdapter() != null) { + DisplayNotificationsFragment displayNotificationsFragment = (DisplayNotificationsFragment) notifViewPager.getAdapter().instantiateItem(notifViewPager, 0); + displayNotificationsFragment.updateNotificationRead(); + } + } catch (Exception ignored) { + } + + } + + public void manageFloatingButton(boolean display) { + if (display) { + tootShow(); + } else { + toot.hide(); + } + } + + public void tootShow() { + toot.show(); + } + + public boolean getFloatingVisibility() { + return toot.getVisibility() == View.VISIBLE; + } + + public enum iconLauncher { + BUBBLES, + FEDIVERSE, + HERO, + ATOM, + BRAINCRASH, + MASTALAB + } + /** * Page Adapter for Mastodon & Peertube & PixelFed */ @@ -2362,119 +2462,4 @@ public abstract class BaseMainActivity extends BaseActivity } - public void updateHomeCounter() { - int i = 0; - SharedPreferences sharedpreferences = getSharedPreferences(Helper.APP_PREFS, MODE_PRIVATE); - int tootperpage = sharedpreferences.getInt(Helper.SET_TOOT_PER_PAGE, Helper.TOOTS_PER_PAGE); - if (timelines != null && timelines.size() > 0) { - for (ManageTimelines tl : timelines) { - if (tl.getType() == ManageTimelines.Type.HOME) { - if (tabLayout.getTabCount() > i) { - View tabHome = tabLayout.getTabAt(i).getCustomView(); - if (tabHome != null) { - TextView tabCounterHome = tabHome.findViewById(R.id.tab_counter); - if (countNewStatus == tootperpage) { - tabCounterHome.setText(String.format(Locale.getDefault(), "%d+", countNewStatus)); - } else { - tabCounterHome.setText(String.valueOf(countNewStatus)); - } - if (countNewStatus > 0) { - //New data are available - //The fragment is not displayed, so the counter is displayed - tabCounterHome.setVisibility(View.VISIBLE); - } else { - tabCounterHome.setVisibility(View.GONE); - } - } - } - } - i++; - } - - } - } - - public void manageTab(RetrieveFeedsAsyncTask.Type type, int value) { - SQLiteDatabase db = Sqlite.getInstance(BaseMainActivity.this, Sqlite.DB_NAME, null, Sqlite.DB_VERSION).open(); - List tls = new TimelinesDAO(BaseMainActivity.this, db).getDisplayedTimelines(); - for (ManageTimelines tl : tls) { - if (type == ManageTimelines.transform(BaseMainActivity.this, tl.getType())) { - View tabCustom = tabLayout.getTabAt(tl.getPosition()).getCustomView(); - assert tabCustom != null; - TextView tabCountertCustom = tabCustom.findViewById(R.id.tab_counter); - tabCountertCustom.setText(String.valueOf(value)); - if (value > 0) { - tabCountertCustom.setVisibility(View.VISIBLE); - } else { - tabCountertCustom.setVisibility(View.GONE); - } - break; - } - } - } - - public void updateNotifCounter() { - if (timelines == null) - return; - int i = 0; - int position = -1; - for (ManageTimelines tl : timelines) { - if (tl.getType() == ManageTimelines.Type.NOTIFICATION) { - if (tabLayout.getTabAt(i) != null) { - position = i; - } - break; - } - i++; - } - if (position == -1) - return; - View tabNotif = tabLayout.getTabAt(position).getCustomView(); - if (tabNotif == null) - return; - TextView tabCounterNotif = tabNotif.findViewById(R.id.tab_counter); - if (tabCounterNotif == null) - return; - if (countNewNotifications == Helper.NOTIFICATIONS_PER_PAGE) { - tabCounterNotif.setText(String.format(Locale.getDefault(), "%d+", countNewNotifications)); - } else { - tabCounterNotif.setText(String.valueOf(countNewNotifications)); - } - if (countNewNotifications > 0) { - tabCounterNotif.setVisibility(View.VISIBLE); - } else { - tabCounterNotif.setVisibility(View.GONE); - } - try { - TabLayoutNotificationsFragment tabLayoutNotificationsFragment = (TabLayoutNotificationsFragment) mPageReferenceMap.get(position); - ViewPager notifViewPager = tabLayoutNotificationsFragment.getViewPager(); - - if (notifViewPager != null && notifViewPager.getAdapter() != null) { - DisplayNotificationsFragment displayNotificationsFragment = (DisplayNotificationsFragment) notifViewPager.getAdapter().instantiateItem(notifViewPager, 0); - displayNotificationsFragment.updateNotificationRead(); - } - } catch (Exception ignored) { - } - - } - - - public void manageFloatingButton(boolean display) { - if (display) { - tootShow(); - } else { - toot.hide(); - } - } - - public void tootShow() { - toot.show(); - } - - - public boolean getFloatingVisibility() { - return toot.getVisibility() == View.VISIBLE; - } - - } \ No newline at end of file diff --git a/app/src/main/java/app/fedilab/android/activities/BookmarkActivity.java b/app/src/main/java/app/fedilab/android/activities/BookmarkActivity.java index 4a4e33eb2..e845c034e 100644 --- a/app/src/main/java/app/fedilab/android/activities/BookmarkActivity.java +++ b/app/src/main/java/app/fedilab/android/activities/BookmarkActivity.java @@ -30,7 +30,6 @@ import android.widget.LinearLayout; import android.widget.RelativeLayout; import android.widget.TextView; - import androidx.appcompat.app.ActionBar; import androidx.appcompat.app.AlertDialog; import androidx.appcompat.widget.Toolbar; @@ -44,7 +43,6 @@ import org.jetbrains.annotations.NotNull; import java.util.ArrayList; import java.util.List; -import java.util.concurrent.ThreadPoolExecutor; import app.fedilab.android.R; import app.fedilab.android.asynctasks.PostActionAsyncTask; @@ -156,7 +154,7 @@ public class BookmarkActivity extends BaseActivity implements OnRetrieveFeedsInt @Override public boolean onCreateOptionsMenu(@NotNull Menu menu) { getMenuInflater().inflate(R.menu.bookmarks, menu); - if( MainActivity.social != UpdateAccountInfoAsyncTask.SOCIAL.MASTODON && MainActivity.social != UpdateAccountInfoAsyncTask.SOCIAL.PLEROMA){ + if (MainActivity.social != UpdateAccountInfoAsyncTask.SOCIAL.MASTODON && MainActivity.social != UpdateAccountInfoAsyncTask.SOCIAL.PLEROMA) { menu.findItem(R.id.action_export_bookmarks).setVisible(false); menu.findItem(R.id.action_import_bookmarks).setVisible(false); } @@ -221,7 +219,7 @@ public class BookmarkActivity extends BaseActivity implements OnRetrieveFeedsInt @Override public void onRetrieveBookmarks(List bookmarks) { - if( bookmarks != null) { + if (bookmarks != null) { statuses = new ArrayList<>(); statuses.clear(); statuses.addAll(bookmarks); @@ -229,7 +227,7 @@ public class BookmarkActivity extends BaseActivity implements OnRetrieveFeedsInt statusListAdapter = new StatusListAdapter(RetrieveFeedsAsyncTask.Type.CACHE_BOOKMARKS, null, isOnWifi, statuses); lv_status.setAdapter(statusListAdapter); statusListAdapter.notifyDataSetChanged(); - if( statuses.size() == 0 ) { + if (statuses.size() == 0) { textviewNoAction.setVisibility(View.VISIBLE); } } diff --git a/app/src/main/java/app/fedilab/android/activities/CustomSharingActivity.java b/app/src/main/java/app/fedilab/android/activities/CustomSharingActivity.java index 0d71b7312..8ffa6fbe8 100644 --- a/app/src/main/java/app/fedilab/android/activities/CustomSharingActivity.java +++ b/app/src/main/java/app/fedilab/android/activities/CustomSharingActivity.java @@ -15,7 +15,6 @@ package app.fedilab.android.activities; -import android.annotation.SuppressLint; import android.content.SharedPreferences; import android.database.sqlite.SQLiteDatabase; import android.graphics.drawable.ColorDrawable; @@ -23,11 +22,6 @@ import android.net.Uri; import android.os.AsyncTask; import android.os.Build; import android.os.Bundle; - -import androidx.appcompat.app.ActionBar; -import androidx.appcompat.widget.Toolbar; -import androidx.core.content.ContextCompat; - import android.text.Html; import android.text.TextUtils; import android.view.LayoutInflater; @@ -41,22 +35,25 @@ import android.widget.LinearLayout; import android.widget.TextView; import android.widget.Toast; +import androidx.appcompat.app.ActionBar; +import androidx.core.content.ContextCompat; + import java.util.ArrayList; import java.util.List; import java.util.Set; +import app.fedilab.android.R; +import app.fedilab.android.asynctasks.CustomSharingAsyncTask; import app.fedilab.android.client.CustomSharingResponse; import app.fedilab.android.client.Entities.Account; import app.fedilab.android.client.Entities.Attachment; import app.fedilab.android.client.Entities.Emojis; import app.fedilab.android.client.Entities.Status; import app.fedilab.android.helper.Helper; +import app.fedilab.android.interfaces.OnCustomSharingInterface; import app.fedilab.android.sqlite.AccountDAO; import app.fedilab.android.sqlite.Sqlite; import es.dmoral.toasty.Toasty; -import app.fedilab.android.R; -import app.fedilab.android.asynctasks.CustomSharingAsyncTask; -import app.fedilab.android.interfaces.OnCustomSharingInterface; /** diff --git a/app/src/main/java/app/fedilab/android/activities/EditProfileActivity.java b/app/src/main/java/app/fedilab/android/activities/EditProfileActivity.java index 501fbd628..958b51499 100644 --- a/app/src/main/java/app/fedilab/android/activities/EditProfileActivity.java +++ b/app/src/main/java/app/fedilab/android/activities/EditProfileActivity.java @@ -16,7 +16,6 @@ package app.fedilab.android.activities; import android.Manifest; -import android.annotation.SuppressLint; import android.content.DialogInterface; import android.content.Intent; import android.content.SharedPreferences; @@ -31,14 +30,6 @@ import android.net.Uri; import android.os.AsyncTask; import android.os.Build; import android.os.Bundle; - -import androidx.annotation.NonNull; -import androidx.core.app.ActivityCompat; -import androidx.core.content.ContextCompat; -import androidx.appcompat.app.ActionBar; -import androidx.appcompat.app.AlertDialog; -import androidx.appcompat.widget.Toolbar; - import android.text.Editable; import android.text.Html; import android.text.TextWatcher; @@ -54,6 +45,12 @@ import android.widget.LinearLayout; import android.widget.TextView; import android.widget.Toast; +import androidx.annotation.NonNull; +import androidx.appcompat.app.ActionBar; +import androidx.appcompat.app.AlertDialog; +import androidx.core.app.ActivityCompat; +import androidx.core.content.ContextCompat; + import com.bumptech.glide.Glide; import java.io.BufferedInputStream; @@ -64,21 +61,21 @@ import java.util.HashMap; import java.util.Iterator; import java.util.Map; +import app.fedilab.android.R; +import app.fedilab.android.asynctasks.RetrieveAccountInfoAsyncTask; +import app.fedilab.android.asynctasks.UpdateCredentialAsyncTask; import app.fedilab.android.client.API; import app.fedilab.android.client.APIResponse; import app.fedilab.android.client.Entities.Account; import app.fedilab.android.client.Entities.Error; import app.fedilab.android.client.Entities.Version; +import app.fedilab.android.client.Glide.GlideApp; import app.fedilab.android.helper.Helper; +import app.fedilab.android.interfaces.OnRetrieveAccountInterface; +import app.fedilab.android.interfaces.OnUpdateCredentialInterface; import app.fedilab.android.sqlite.AccountDAO; import app.fedilab.android.sqlite.Sqlite; import es.dmoral.toasty.Toasty; -import app.fedilab.android.R; -import app.fedilab.android.asynctasks.RetrieveAccountInfoAsyncTask; -import app.fedilab.android.asynctasks.UpdateCredentialAsyncTask; -import app.fedilab.android.client.Glide.GlideApp; -import app.fedilab.android.interfaces.OnRetrieveAccountInterface; -import app.fedilab.android.interfaces.OnUpdateCredentialInterface; /** @@ -89,22 +86,22 @@ import app.fedilab.android.interfaces.OnUpdateCredentialInterface; public class EditProfileActivity extends BaseActivity implements OnRetrieveAccountInterface, OnUpdateCredentialInterface { + private static final int PICK_IMAGE_HEADER = 4565; + private static final int PICK_IMAGE_PROFILE = 6545; + private final int MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE_HEADER = 754; + private final int MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE_PICTURE = 755; private EditText set_profile_name, set_profile_description; private LinearLayout custom_fields_container; private ImageView set_profile_picture, set_header_picture; private Button set_change_profile_picture, set_change_header_picture, set_profile_save; private TextView set_header_picture_overlay; private CheckBox set_lock_account, set_sensitive_content; - private static final int PICK_IMAGE_HEADER = 4565; - private static final int PICK_IMAGE_PROFILE = 6545; private String profile_username, profile_note; private ByteArrayInputStream profile_picture, header_picture; private API.accountPrivacy profile_privacy; private boolean sensitive; private Bitmap profile_picture_bmp, profile_header_bmp; private ImageView pp_actionBar; - private final int MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE_HEADER = 754; - private final int MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE_PICTURE = 755; private String avatarName, headerName; @Override @@ -155,7 +152,6 @@ public class EditProfileActivity extends BaseActivity implements OnRetrieveAccou Account account = new AccountDAO(getApplicationContext(), db).getUniqAccount(userId, instance); - Helper.loadGiF(getApplicationContext(), account.getAvatar(), pp_actionBar); custom_fields_container = findViewById(R.id.custom_fields_container); set_profile_name = findViewById(R.id.set_profile_name); @@ -179,7 +175,7 @@ public class EditProfileActivity extends BaseActivity implements OnRetrieveAccou set_sensitive_content.setVisibility(View.GONE); } - if(account.getSocial().toUpperCase().equals("MASTODON")){ + if (account.getSocial().toUpperCase().equals("MASTODON")) { custom_fields_container.setVisibility(View.VISIBLE); } @@ -501,7 +497,7 @@ public class EditProfileActivity extends BaseActivity implements OnRetrieveAccou @Override public void onRequestPermissionsResult(int requestCode, - @NonNull String permissions[], @NonNull int[] grantResults) { + @NonNull String[] permissions, @NonNull int[] grantResults) { switch (requestCode) { case MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE_HEADER: { // If request is cancelled, the result arrays are empty. diff --git a/app/src/main/java/app/fedilab/android/activities/GroupActivity.java b/app/src/main/java/app/fedilab/android/activities/GroupActivity.java index da2cefe6a..9fb801541 100644 --- a/app/src/main/java/app/fedilab/android/activities/GroupActivity.java +++ b/app/src/main/java/app/fedilab/android/activities/GroupActivity.java @@ -24,7 +24,6 @@ import android.view.View; import android.widget.RelativeLayout; import android.widget.Toast; - import androidx.appcompat.widget.Toolbar; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; @@ -35,7 +34,6 @@ import org.jetbrains.annotations.NotNull; import java.util.ArrayList; import java.util.List; - import app.fedilab.android.R; import app.fedilab.android.asynctasks.RetrieveFeedsAsyncTask; import app.fedilab.android.client.APIResponse; diff --git a/app/src/main/java/app/fedilab/android/activities/HashTagActivity.java b/app/src/main/java/app/fedilab/android/activities/HashTagActivity.java index b38ef051e..e2fd1b7ac 100644 --- a/app/src/main/java/app/fedilab/android/activities/HashTagActivity.java +++ b/app/src/main/java/app/fedilab/android/activities/HashTagActivity.java @@ -20,35 +20,32 @@ import android.content.SharedPreferences; import android.database.sqlite.SQLiteDatabase; import android.os.AsyncTask; import android.os.Bundle; - -import androidx.core.content.ContextCompat; -import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; -import androidx.recyclerview.widget.LinearLayoutManager; -import androidx.recyclerview.widget.RecyclerView; -import androidx.appcompat.widget.Toolbar; - import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.RelativeLayout; import android.widget.Toast; +import androidx.appcompat.widget.Toolbar; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; +import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; + import org.jetbrains.annotations.NotNull; import java.util.ArrayList; import java.util.List; +import app.fedilab.android.R; +import app.fedilab.android.asynctasks.RetrieveFeedsAsyncTask; import app.fedilab.android.client.APIResponse; import app.fedilab.android.client.Entities.Status; import app.fedilab.android.drawers.StatusListAdapter; import app.fedilab.android.helper.Helper; -import app.fedilab.android.helper.ThemeHelper; +import app.fedilab.android.interfaces.OnRetrieveFeedsInterface; import app.fedilab.android.sqlite.SearchDAO; import app.fedilab.android.sqlite.Sqlite; import es.dmoral.toasty.Toasty; -import app.fedilab.android.R; -import app.fedilab.android.asynctasks.RetrieveFeedsAsyncTask; -import app.fedilab.android.interfaces.OnRetrieveFeedsInterface; /** @@ -174,7 +171,7 @@ public class HashTagActivity extends BaseActivity implements OnRetrieveFeedsInte SQLiteDatabase db = Sqlite.getInstance(HashTagActivity.this, Sqlite.DB_NAME, null, Sqlite.DB_VERSION).open(); List searchInDb = new SearchDAO(HashTagActivity.this, db).getSearchByKeyword(tag.trim()); - if ( searchInDb != null && searchInDb.size() > 0) { + if (searchInDb != null && searchInDb.size() > 0) { menu.findItem(R.id.action_pin).setVisible(false); } return true; diff --git a/app/src/main/java/app/fedilab/android/activities/InstanceActivity.java b/app/src/main/java/app/fedilab/android/activities/InstanceActivity.java index 19ac2e9b7..294307e69 100644 --- a/app/src/main/java/app/fedilab/android/activities/InstanceActivity.java +++ b/app/src/main/java/app/fedilab/android/activities/InstanceActivity.java @@ -15,7 +15,6 @@ package app.fedilab.android.activities; -import android.annotation.SuppressLint; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; @@ -24,13 +23,6 @@ import android.net.Uri; import android.os.AsyncTask; import android.os.Build; import android.os.Bundle; - -import com.google.android.material.floatingactionbutton.FloatingActionButton; - -import androidx.appcompat.app.ActionBar; -import androidx.appcompat.widget.Toolbar; -import androidx.core.content.ContextCompat; - import android.text.Html; import android.view.LayoutInflater; import android.view.MenuItem; @@ -42,15 +34,18 @@ import android.widget.RelativeLayout; import android.widget.TextView; import android.widget.Toast; +import androidx.appcompat.app.ActionBar; +import androidx.core.content.ContextCompat; + +import com.google.android.material.floatingactionbutton.FloatingActionButton; + +import app.fedilab.android.R; +import app.fedilab.android.asynctasks.RetrieveInstanceAsyncTask; import app.fedilab.android.client.APIResponse; import app.fedilab.android.client.Entities.Instance; import app.fedilab.android.helper.Helper; -import es.dmoral.toasty.Toasty; -import app.fedilab.android.R; -import app.fedilab.android.asynctasks.RetrieveInstanceAsyncTask; import app.fedilab.android.interfaces.OnRetrieveInstanceInterface; - -import static app.fedilab.android.helper.Helper.changeDrawableColor; +import es.dmoral.toasty.Toasty; /** diff --git a/app/src/main/java/app/fedilab/android/activities/InstanceHealthActivity.java b/app/src/main/java/app/fedilab/android/activities/InstanceHealthActivity.java index 35d7aa555..65190d6e6 100644 --- a/app/src/main/java/app/fedilab/android/activities/InstanceHealthActivity.java +++ b/app/src/main/java/app/fedilab/android/activities/InstanceHealthActivity.java @@ -18,47 +18,32 @@ package app.fedilab.android.activities; import android.annotation.SuppressLint; import android.content.Intent; import android.content.SharedPreferences; -import android.graphics.Bitmap; -import android.graphics.Canvas; -import android.graphics.Color; -import android.graphics.ColorFilter; -import android.graphics.LightingColorFilter; -import android.graphics.Matrix; -import android.graphics.Paint; -import android.graphics.drawable.BitmapDrawable; import android.net.Uri; -import android.os.Build; import android.os.Bundle; - -import androidx.core.content.ContextCompat; - import android.text.SpannableString; import android.text.style.UnderlineSpan; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; -import android.view.Window; import android.widget.Button; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.RelativeLayout; import android.widget.TextView; +import androidx.core.content.ContextCompat; import com.bumptech.glide.Glide; -import com.bumptech.glide.request.target.SimpleTarget; -import com.bumptech.glide.request.transition.Transition; -import org.jetbrains.annotations.NotNull; import org.json.JSONObject; import java.util.HashMap; +import app.fedilab.android.R; import app.fedilab.android.client.API; import app.fedilab.android.client.Entities.InstanceSocial; import app.fedilab.android.client.HttpsConnection; import app.fedilab.android.helper.Helper; -import app.fedilab.android.R; /** diff --git a/app/src/main/java/app/fedilab/android/activities/ListActivity.java b/app/src/main/java/app/fedilab/android/activities/ListActivity.java index 2c068a26a..85c831def 100644 --- a/app/src/main/java/app/fedilab/android/activities/ListActivity.java +++ b/app/src/main/java/app/fedilab/android/activities/ListActivity.java @@ -19,15 +19,6 @@ import android.content.Intent; import android.content.SharedPreferences; import android.os.AsyncTask; import android.os.Bundle; - -import androidx.annotation.NonNull; -import androidx.localbroadcastmanager.content.LocalBroadcastManager; -import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; -import androidx.appcompat.app.AlertDialog; -import androidx.recyclerview.widget.LinearLayoutManager; -import androidx.recyclerview.widget.RecyclerView; -import androidx.appcompat.widget.Toolbar; - import android.text.InputFilter; import android.view.LayoutInflater; import android.view.Menu; @@ -40,18 +31,26 @@ import android.widget.LinearLayout; import android.widget.RelativeLayout; import android.widget.Toast; +import androidx.annotation.NonNull; +import androidx.appcompat.app.AlertDialog; +import androidx.appcompat.widget.Toolbar; +import androidx.localbroadcastmanager.content.LocalBroadcastManager; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; +import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; + import java.util.ArrayList; import java.util.List; +import app.fedilab.android.R; +import app.fedilab.android.asynctasks.ManageListsAsyncTask; +import app.fedilab.android.asynctasks.RetrieveFeedsAsyncTask; import app.fedilab.android.client.APIResponse; import app.fedilab.android.client.Entities.Status; import app.fedilab.android.drawers.StatusListAdapter; import app.fedilab.android.helper.Helper; -import es.dmoral.toasty.Toasty; -import app.fedilab.android.R; -import app.fedilab.android.asynctasks.ManageListsAsyncTask; -import app.fedilab.android.asynctasks.RetrieveFeedsAsyncTask; import app.fedilab.android.interfaces.OnListActionInterface; +import es.dmoral.toasty.Toasty; /** @@ -62,6 +61,7 @@ import app.fedilab.android.interfaces.OnListActionInterface; public class ListActivity extends BaseActivity implements OnListActionInterface { + LinearLayoutManager mLayoutManager; private String title, listId; private RelativeLayout mainLoader, nextElementLoader, textviewNoAction; private SwipeRefreshLayout swipeRefreshLayout; @@ -71,8 +71,6 @@ public class ListActivity extends BaseActivity implements OnListActionInterface private boolean firstLoad; private boolean flag_loading; private StatusListAdapter statusListAdapter; - LinearLayoutManager mLayoutManager; - @Override protected void onCreate(Bundle savedInstanceState) { diff --git a/app/src/main/java/app/fedilab/android/activities/LiveNotificationSettingsAccountsActivity.java b/app/src/main/java/app/fedilab/android/activities/LiveNotificationSettingsAccountsActivity.java index 4d2baead0..726e40066 100644 --- a/app/src/main/java/app/fedilab/android/activities/LiveNotificationSettingsAccountsActivity.java +++ b/app/src/main/java/app/fedilab/android/activities/LiveNotificationSettingsAccountsActivity.java @@ -20,9 +20,7 @@ import android.database.sqlite.SQLiteDatabase; import android.os.Bundle; import android.view.MenuItem; import android.view.ViewGroup; -import android.view.Window; -import androidx.core.content.ContextCompat; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; @@ -45,7 +43,6 @@ import app.fedilab.android.sqlite.Sqlite; public class LiveNotificationSettingsAccountsActivity extends BaseActivity { - @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); diff --git a/app/src/main/java/app/fedilab/android/activities/LoginActivity.java b/app/src/main/java/app/fedilab/android/activities/LoginActivity.java index 53c6f1dc2..be5358170 100644 --- a/app/src/main/java/app/fedilab/android/activities/LoginActivity.java +++ b/app/src/main/java/app/fedilab/android/activities/LoginActivity.java @@ -15,7 +15,6 @@ package app.fedilab.android.activities; import android.Manifest; -import android.annotation.SuppressLint; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; @@ -26,17 +25,7 @@ import android.graphics.Color; import android.graphics.drawable.ColorDrawable; import android.net.Uri; import android.os.AsyncTask; -import android.os.Build; import android.os.Bundle; - -import com.google.android.material.textfield.TextInputLayout; - -import androidx.core.app.ActivityCompat; -import androidx.core.content.ContextCompat; -import androidx.appcompat.app.ActionBar; -import androidx.appcompat.app.AlertDialog; -import androidx.appcompat.widget.Toolbar; - import android.text.Editable; import android.text.SpannableString; import android.text.Spanned; @@ -60,15 +49,19 @@ import android.widget.LinearLayout; import android.widget.TextView; import android.widget.Toast; +import androidx.appcompat.app.ActionBar; +import androidx.appcompat.app.AlertDialog; +import androidx.core.app.ActivityCompat; +import androidx.core.content.ContextCompat; + import com.elconfidencial.bubbleshowcase.BubbleShowCase; import com.elconfidencial.bubbleshowcase.BubbleShowCaseBuilder; import com.elconfidencial.bubbleshowcase.BubbleShowCaseListener; -import com.jaredrummler.materialspinner.MaterialSpinner; +import com.google.android.material.textfield.TextInputLayout; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; -import org.w3c.dom.Text; import java.io.UnsupportedEncodingException; import java.net.MalformedURLException; @@ -76,6 +69,8 @@ import java.net.URL; import java.net.URLEncoder; import java.util.HashMap; +import app.fedilab.android.R; +import app.fedilab.android.asynctasks.UpdateAccountInfoAsyncTask; import app.fedilab.android.client.API; import app.fedilab.android.client.Entities.Account; import app.fedilab.android.client.Entities.InstanceNodeInfo; @@ -85,10 +80,6 @@ import app.fedilab.android.helper.Helper; import app.fedilab.android.sqlite.AccountDAO; import app.fedilab.android.sqlite.Sqlite; import es.dmoral.toasty.Toasty; -import app.fedilab.android.R; -import app.fedilab.android.asynctasks.UpdateAccountInfoAsyncTask; - -import static app.fedilab.android.helper.Helper.changeDrawableColor; /** @@ -98,14 +89,16 @@ import static app.fedilab.android.helper.Helper.changeDrawableColor; public class LoginActivity extends BaseActivity { + public static boolean admin; private static String client_id; private static String client_secret; private static boolean client_id_for_webview = false; private static String instance; + private final int PICK_IMPORT = 5557; + boolean isLoadingInstance = false; private AutoCompleteTextView login_instance; private EditText login_uid; private EditText login_passwd; - boolean isLoadingInstance = false; private String oldSearch; private Button connectionButton, connect_button; private String actionToken; @@ -117,8 +110,18 @@ public class LoginActivity extends BaseActivity { private LinearLayout step_login_credential, step_instance; private TextView instance_chosen; private ImageView info_instance; - private final int PICK_IMPORT = 5557; - public static boolean admin; + + public static String redirectUserToAuthorizeAndLogin(Context context, UpdateAccountInfoAsyncTask.SOCIAL socialNetwork, String clientId, String instance) { + String queryString = Helper.CLIENT_ID + "=" + clientId; + queryString += "&" + Helper.REDIRECT_URI + "=" + Uri.encode(Helper.REDIRECT_CONTENT_WEB); + queryString += "&" + Helper.RESPONSE_TYPE + "=code"; + if (admin) { + queryString += "&" + Helper.SCOPE + "=" + Helper.OAUTH_SCOPES_ADMIN; + } else { + queryString += "&" + Helper.SCOPE + "=" + Helper.OAUTH_SCOPES; + } + return Helper.instanceWithProtocol(context, instance) + Helper.EP_AUTHORIZE + "?" + queryString; + } @Override protected void onCreate(Bundle savedInstanceState) { @@ -129,7 +132,7 @@ public class LoginActivity extends BaseActivity { if (b != null) { autofilledInstance = b.getString("instance", null); social = b.getString("social", null); - if( instanceNodeInfo != null) { + if (instanceNodeInfo != null) { socialNetwork = Helper.setSoftware(instanceNodeInfo.getName(), false); } admin = b.getBoolean("admin", false); @@ -137,7 +140,7 @@ public class LoginActivity extends BaseActivity { if (getIntent() != null && getIntent().getData() != null && getIntent().getData().toString().contains("mastalab://backtomastalab?code=")) { String url = getIntent().getData().toString(); - String val[] = url.split("code="); + String[] val = url.split("code="); String code = val[1]; final String action = "/oauth/token"; final HashMap parameters = new HashMap<>(); @@ -224,7 +227,6 @@ public class LoginActivity extends BaseActivity { }); - content_create = new SpannableString(getString(R.string.join_peertube)); content_create.setSpan(new UnderlineSpan(), 0, content_create.length(), 0); content_create.setSpan(new ForegroundColorSpan(ContextCompat.getColor(LoginActivity.this, R.color.cyanea_accent_reference)), 0, content_create.length(), @@ -279,7 +281,7 @@ public class LoginActivity extends BaseActivity { if (instanceNodeInfo != null && instanceNodeInfo.getName() != null) { socialNetwork = Helper.setSoftware(instanceNodeInfo.getName(), false); - if (instanceNodeInfo.getName().equals("PLEROMA") ||instanceNodeInfo.getName().equals("MASTODON") || instanceNodeInfo.getName().equals("PIXELFED")) { + if (instanceNodeInfo.getName().equals("PLEROMA") || instanceNodeInfo.getName().equals("MASTODON") || instanceNodeInfo.getName().equals("PIXELFED")) { client_id_for_webview = true; retrievesClientId(); } else { @@ -527,18 +529,18 @@ public class LoginActivity extends BaseActivity { String message; if (e.getLocalizedMessage() != null && e.getLocalizedMessage().trim().length() > 0) { - if(e.getLocalizedMessage().length() < 100) { + if (e.getLocalizedMessage().length() < 100) { message = e.getLocalizedMessage(); - }else{ - message = getString(R.string.long_api_error,"\ud83d\ude05"); + } else { + message = getString(R.string.long_api_error, "\ud83d\ude05"); } - }else if (e.getMessage() != null && e.getMessage().trim().length() > 0) { - if(e.getLocalizedMessage().length() < 100) { + } else if (e.getMessage() != null && e.getMessage().trim().length() > 0) { + if (e.getLocalizedMessage().length() < 100) { message = e.getMessage(); - }else{ - message = getString(R.string.long_api_error,"\ud83d\ude05"); + } else { + message = getString(R.string.long_api_error, "\ud83d\ude05"); } - }else + } else message = getString(R.string.client_error); Toasty.error(getApplicationContext(), message, Toast.LENGTH_LONG).show(); @@ -695,7 +697,6 @@ public class LoginActivity extends BaseActivity { }); } - private void manageClient(String client_id, String client_secret, String id) { SharedPreferences sharedpreferences = getSharedPreferences(Helper.APP_PREFS, MODE_PRIVATE); @@ -788,7 +789,6 @@ public class LoginActivity extends BaseActivity { return super.onOptionsItemSelected(item); } - @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { @@ -805,20 +805,6 @@ public class LoginActivity extends BaseActivity { } } - - public static String redirectUserToAuthorizeAndLogin(Context context, UpdateAccountInfoAsyncTask.SOCIAL socialNetwork, String clientId, String instance) { - String queryString = Helper.CLIENT_ID + "=" + clientId; - queryString += "&" + Helper.REDIRECT_URI + "=" + Uri.encode(Helper.REDIRECT_CONTENT_WEB); - queryString += "&" + Helper.RESPONSE_TYPE + "=code"; - if (admin) { - queryString += "&" + Helper.SCOPE + "=" + Helper.OAUTH_SCOPES_ADMIN; - } else { - queryString += "&" + Helper.SCOPE + "=" + Helper.OAUTH_SCOPES; - } - return Helper.instanceWithProtocol(context, instance) + Helper.EP_AUTHORIZE + "?" + queryString; - } - - private void showcaseInstance(final boolean loop) { BubbleShowCaseBuilder showCaseBuilder = new BubbleShowCaseBuilder(LoginActivity.this) .title(getString(R.string.instance)) diff --git a/app/src/main/java/app/fedilab/android/activities/MainApplication.java b/app/src/main/java/app/fedilab/android/activities/MainApplication.java index 1840d3405..f695cd45a 100644 --- a/app/src/main/java/app/fedilab/android/activities/MainApplication.java +++ b/app/src/main/java/app/fedilab/android/activities/MainApplication.java @@ -42,14 +42,14 @@ import java.util.ArrayList; import java.util.List; import java.util.Locale; +import app.fedilab.android.BuildConfig; +import app.fedilab.android.R; import app.fedilab.android.helper.Helper; import app.fedilab.android.jobs.ApplicationJob; import app.fedilab.android.jobs.BackupNotificationsSyncJob; import app.fedilab.android.jobs.BackupStatusesSyncJob; import app.fedilab.android.jobs.NotificationsSyncJob; import es.dmoral.toasty.Toasty; -import app.fedilab.android.BuildConfig; -import app.fedilab.android.R; import static app.fedilab.android.helper.Helper.initNetCipher; @@ -66,6 +66,10 @@ public class MainApplication extends MultiDexApplication { private static MainApplication app; + public static MainApplication getApp() { + return app; + } + @Override public void onCreate() { super.onCreate(); @@ -75,8 +79,8 @@ public class MainApplication extends MultiDexApplication { SharedPreferences sharedpreferences = getSharedPreferences(Helper.APP_PREFS, android.content.Context.MODE_PRIVATE); ApplicationJob.cancelAllJob(NotificationsSyncJob.NOTIFICATION_REFRESH); - if( Helper.liveNotifType(getApplicationContext()) == Helper.NOTIF_NONE) { - NotificationsSyncJob.schedule(false); + if (Helper.liveNotifType(getApplicationContext()) == Helper.NOTIF_NONE) { + NotificationsSyncJob.schedule(false); } Cyanea.init(this, super.getResources()); @@ -97,17 +101,17 @@ public class MainApplication extends MultiDexApplication { boolean pref_color_navigation_bar = prefs.getBoolean("pref_color_navigation_bar", true); boolean pref_color_status_bar = prefs.getBoolean("pref_color_status_bar", true); Cyanea.Editor editor = Cyanea.getInstance().edit(); - if( primary != -1 ) { + if (primary != -1) { editor.primary(primary); } - if( accent != -1){ + if (accent != -1) { editor.accent(accent); } - if( pref_color_background != -1){ + if (pref_color_background != -1) { editor - .background(pref_color_background) - .backgroundLight(pref_color_background) - .backgroundDark(pref_color_background).apply(); + .background(pref_color_background) + .backgroundLight(pref_color_background) + .backgroundDark(pref_color_background).apply(); } editor.shouldTintStatusBar(pref_color_status_bar).apply(); editor.shouldTintNavBar(pref_color_navigation_bar).apply(); @@ -166,14 +170,9 @@ public class MainApplication extends MultiDexApplication { Toasty.Config.getInstance().apply(); } - @Override protected void attachBaseContext(Context base) { super.attachBaseContext(base); MultiDex.install(MainApplication.this); } - - public static MainApplication getApp() { - return app; - } } diff --git a/app/src/main/java/app/fedilab/android/activities/ManageAccountsInListActivity.java b/app/src/main/java/app/fedilab/android/activities/ManageAccountsInListActivity.java index 6824c94a3..eb28edbe5 100644 --- a/app/src/main/java/app/fedilab/android/activities/ManageAccountsInListActivity.java +++ b/app/src/main/java/app/fedilab/android/activities/ManageAccountsInListActivity.java @@ -17,34 +17,31 @@ package app.fedilab.android.activities; import android.content.SharedPreferences; import android.os.AsyncTask; import android.os.Bundle; - -import androidx.core.content.ContextCompat; -import androidx.recyclerview.widget.LinearLayoutManager; -import androidx.recyclerview.widget.RecyclerView; - import android.text.Editable; import android.text.TextWatcher; import android.view.MenuItem; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; -import android.view.Window; import android.widget.EditText; import android.widget.LinearLayout; import android.widget.RelativeLayout; import android.widget.TextView; import android.widget.Toast; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + import java.util.ArrayList; +import app.fedilab.android.R; +import app.fedilab.android.asynctasks.ManageListsAsyncTask; import app.fedilab.android.client.APIResponse; import app.fedilab.android.client.Entities.Account; import app.fedilab.android.drawers.AccountsInAListAdapter; import app.fedilab.android.helper.Helper; -import es.dmoral.toasty.Toasty; -import app.fedilab.android.R; -import app.fedilab.android.asynctasks.ManageListsAsyncTask; import app.fedilab.android.interfaces.OnListActionInterface; +import es.dmoral.toasty.Toasty; /** diff --git a/app/src/main/java/app/fedilab/android/activities/MastodonRegisterActivity.java b/app/src/main/java/app/fedilab/android/activities/MastodonRegisterActivity.java index 183352c2c..af383aa0e 100644 --- a/app/src/main/java/app/fedilab/android/activities/MastodonRegisterActivity.java +++ b/app/src/main/java/app/fedilab/android/activities/MastodonRegisterActivity.java @@ -19,7 +19,6 @@ import android.animation.AnimatorListenerAdapter; import android.annotation.SuppressLint; import android.content.Context; import android.content.DialogInterface; -import android.content.Intent; import android.content.SharedPreferences; import android.graphics.drawable.ColorDrawable; import android.os.AsyncTask; @@ -44,7 +43,6 @@ import android.widget.Toast; import androidx.appcompat.app.ActionBar; import androidx.appcompat.app.AlertDialog; -import androidx.appcompat.widget.Toolbar; import androidx.core.content.ContextCompat; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; @@ -167,7 +165,7 @@ public class MastodonRegisterActivity extends BaseActivity implements OnRetrieve } }); - new RetrieveInstanceRegAsyncTask(MastodonRegisterActivity.this, RetrieveInstanceRegAsyncTask.instanceType.MASTODON,"general", MastodonRegisterActivity.this).executeOnExecutor(THREAD_POOL_EXECUTOR); + new RetrieveInstanceRegAsyncTask(MastodonRegisterActivity.this, RetrieveInstanceRegAsyncTask.instanceType.MASTODON, "general", MastodonRegisterActivity.this).executeOnExecutor(THREAD_POOL_EXECUTOR); signup = findViewById(R.id.signup); EditText username = findViewById(R.id.username); @@ -206,7 +204,7 @@ public class MastodonRegisterActivity extends BaseActivity implements OnRetrieve accountCreation.setPassword(password.getText().toString().trim()); accountCreation.setPasswordConfirm(password_confirm.getText().toString().trim()); accountCreation.setUsername(username.getText().toString().trim()); - new CreateMastodonAccountAsyncTask(MastodonRegisterActivity.this,RetrieveInstanceRegAsyncTask.instanceType.MASTODON, accountCreation, instance, MastodonRegisterActivity.this).executeOnExecutor(THREAD_POOL_EXECUTOR); + new CreateMastodonAccountAsyncTask(MastodonRegisterActivity.this, RetrieveInstanceRegAsyncTask.instanceType.MASTODON, accountCreation, instance, MastodonRegisterActivity.this).executeOnExecutor(THREAD_POOL_EXECUTOR); }); diff --git a/app/src/main/java/app/fedilab/android/activities/MastodonShareRegisterActivity.java b/app/src/main/java/app/fedilab/android/activities/MastodonShareRegisterActivity.java index 20ee44c77..5660f49f2 100644 --- a/app/src/main/java/app/fedilab/android/activities/MastodonShareRegisterActivity.java +++ b/app/src/main/java/app/fedilab/android/activities/MastodonShareRegisterActivity.java @@ -39,12 +39,10 @@ import android.widget.Toast; import androidx.appcompat.app.ActionBar; import androidx.appcompat.app.AlertDialog; -import androidx.appcompat.widget.Toolbar; import androidx.core.content.ContextCompat; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; - import java.io.IOException; import java.lang.ref.WeakReference; import java.net.HttpURLConnection; diff --git a/app/src/main/java/app/fedilab/android/activities/MutedInstanceActivity.java b/app/src/main/java/app/fedilab/android/activities/MutedInstanceActivity.java index 063869f6f..40dfeb342 100644 --- a/app/src/main/java/app/fedilab/android/activities/MutedInstanceActivity.java +++ b/app/src/main/java/app/fedilab/android/activities/MutedInstanceActivity.java @@ -15,7 +15,6 @@ package app.fedilab.android.activities; import android.Manifest; -import android.annotation.SuppressLint; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; @@ -41,7 +40,6 @@ import android.widget.Toast; import androidx.appcompat.app.ActionBar; import androidx.appcompat.app.AlertDialog; import androidx.appcompat.widget.PopupMenu; -import androidx.appcompat.widget.Toolbar; import androidx.core.app.ActivityCompat; import androidx.core.content.ContextCompat; import androidx.recyclerview.widget.DividerItemDecoration; @@ -49,15 +47,9 @@ import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; -import com.google.android.material.floatingactionbutton.FloatingActionButton; - import org.jetbrains.annotations.NotNull; import java.io.BufferedReader; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.util.ArrayList; @@ -87,6 +79,7 @@ import es.dmoral.toasty.Toasty; public class MutedInstanceActivity extends BaseActivity implements OnRetrieveDomainsInterface, OnPostActionInterface { + private final int PICK_IMPORT_INSTANCE = 5326; private boolean flag_loading; private AsyncTask asyncTask; private DomainsListAdapter domainsListAdapter; @@ -97,7 +90,6 @@ public class MutedInstanceActivity extends BaseActivity implements OnRetrieveDom private SwipeRefreshLayout swipeRefreshLayout; private boolean swiped; private RecyclerView lv_domains; - private final int PICK_IMPORT_INSTANCE = 5326; @Override protected void onCreate(Bundle savedInstanceState) { @@ -392,10 +384,10 @@ public class MutedInstanceActivity extends BaseActivity implements OnRetrieveDom @Override public void onPostAction(int statusCode, API.StatusAction statusAction, String userId, Error error) { if (error != null) { - if(error.getError().length() < 100) { + if (error.getError().length() < 100) { Toasty.error(getApplicationContext(), error.getError(), Toast.LENGTH_LONG).show(); - }else{ - Toasty.error(getApplicationContext(), getString(R.string.long_api_error,"\ud83d\ude05"), Toast.LENGTH_LONG).show(); + } else { + Toasty.error(getApplicationContext(), getString(R.string.long_api_error, "\ud83d\ude05"), Toast.LENGTH_LONG).show(); } return; } diff --git a/app/src/main/java/app/fedilab/android/activities/OpencollectiveActivity.java b/app/src/main/java/app/fedilab/android/activities/OpencollectiveActivity.java index 97149c8c7..d16725360 100644 --- a/app/src/main/java/app/fedilab/android/activities/OpencollectiveActivity.java +++ b/app/src/main/java/app/fedilab/android/activities/OpencollectiveActivity.java @@ -20,10 +20,6 @@ import android.graphics.drawable.ColorDrawable; import android.net.Uri; import android.os.AsyncTask; import android.os.Bundle; - -import androidx.appcompat.app.ActionBar; -import androidx.core.content.ContextCompat; - import android.view.LayoutInflater; import android.view.MenuItem; import android.view.View; @@ -34,18 +30,21 @@ import android.widget.LinearLayout; import android.widget.TextView; import android.widget.Toast; +import androidx.appcompat.app.ActionBar; +import androidx.core.content.ContextCompat; + import java.util.ArrayList; import java.util.List; +import app.fedilab.android.R; +import app.fedilab.android.asynctasks.RetrieveOpenCollectiveAsyncTask; import app.fedilab.android.client.Entities.Account; import app.fedilab.android.client.Entities.Results; import app.fedilab.android.drawers.AccountSearchDevAdapter; import app.fedilab.android.helper.ExpandableHeightListView; import app.fedilab.android.helper.Helper; -import es.dmoral.toasty.Toasty; -import app.fedilab.android.R; -import app.fedilab.android.asynctasks.RetrieveOpenCollectiveAsyncTask; import app.fedilab.android.interfaces.OnRetrieveRemoteAccountInterface; +import es.dmoral.toasty.Toasty; /** diff --git a/app/src/main/java/app/fedilab/android/activities/OwnerChartsActivity.java b/app/src/main/java/app/fedilab/android/activities/OwnerChartsActivity.java index 0f4733675..20742203f 100644 --- a/app/src/main/java/app/fedilab/android/activities/OwnerChartsActivity.java +++ b/app/src/main/java/app/fedilab/android/activities/OwnerChartsActivity.java @@ -15,7 +15,6 @@ package app.fedilab.android.activities; -import android.annotation.SuppressLint; import android.app.DatePickerDialog; import android.content.Context; import android.content.SharedPreferences; @@ -35,16 +34,13 @@ import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.RelativeLayout; import android.widget.TextView; -import android.widget.Toast; import androidx.appcompat.app.ActionBar; -import androidx.appcompat.widget.Toolbar; import androidx.core.content.ContextCompat; import androidx.recyclerview.widget.LinearLayoutManager; import com.github.mikephil.charting.charts.LineChart; import com.github.mikephil.charting.components.Description; -import com.github.mikephil.charting.components.IMarker; import com.github.mikephil.charting.components.Legend; import com.github.mikephil.charting.components.MarkerView; import com.github.mikephil.charting.components.XAxis; @@ -76,7 +72,6 @@ import app.fedilab.android.interfaces.OnRetrieveChartsInterface; import app.fedilab.android.sqlite.AccountDAO; import app.fedilab.android.sqlite.Sqlite; import app.fedilab.android.sqlite.StatusCacheDAO; -import es.dmoral.toasty.Toasty; /** @@ -94,6 +89,31 @@ public class OwnerChartsActivity extends BaseActivity implements OnRetrieveChart private int theme; private RelativeLayout loader; private ImageButton validate; + private DatePickerDialog.OnDateSetListener iniDateSetListener = + new DatePickerDialog.OnDateSetListener() { + + public void onDateSet(DatePicker view, int year, + int monthOfYear, int dayOfMonth) { + Calendar c = Calendar.getInstance(); + c.set(year, monthOfYear, dayOfMonth, 0, 0); + dateIni = new Date(c.getTimeInMillis()); + settings_time_from.setText(Helper.shortDateToString(new Date(c.getTimeInMillis()))); + } + + }; + private DatePickerDialog.OnDateSetListener endDateSetListener = + new DatePickerDialog.OnDateSetListener() { + + public void onDateSet(DatePicker view, int year, + int monthOfYear, int dayOfMonth) { + Calendar c = Calendar.getInstance(); + c.set(year, monthOfYear, dayOfMonth, 23, 59); + + dateEnd = new Date(c.getTimeInMillis()); + settings_time_to.setText(Helper.shortDateToString(new Date(c.getTimeInMillis()))); + } + + }; @Override protected void onCreate(Bundle savedInstanceState) { @@ -231,59 +251,6 @@ public class OwnerChartsActivity extends BaseActivity implements OnRetrieveChart } - public class CustomMarkerView extends MarkerView { - private TextView tvContent; - - public CustomMarkerView(Context context, int layoutResource) { - super(context, layoutResource); - tvContent = findViewById(R.id.tvContent); - tvContent.setTextColor(ContextCompat.getColor(context, R.color.cyanea_accent_reference)); - } - - @Override - public void refreshContent(Entry e, Highlight highlight) { - Date date = new Date(((long) e.getX())); - tvContent.setText(String.valueOf(Helper.shortDateToString(date) + " - " + (int) e.getY())); - super.refreshContent(e, highlight); - } - - private MPPointF mOffset; - - @Override - public MPPointF getOffset() { - if (mOffset == null) { - mOffset = new MPPointF(-(getWidth() / 2), -getHeight()); - } - return mOffset; - } - } - - private DatePickerDialog.OnDateSetListener iniDateSetListener = - new DatePickerDialog.OnDateSetListener() { - - public void onDateSet(DatePicker view, int year, - int monthOfYear, int dayOfMonth) { - Calendar c = Calendar.getInstance(); - c.set(year, monthOfYear, dayOfMonth, 0, 0); - dateIni = new Date(c.getTimeInMillis()); - settings_time_from.setText(Helper.shortDateToString(new Date(c.getTimeInMillis()))); - } - - }; - private DatePickerDialog.OnDateSetListener endDateSetListener = - new DatePickerDialog.OnDateSetListener() { - - public void onDateSet(DatePicker view, int year, - int monthOfYear, int dayOfMonth) { - Calendar c = Calendar.getInstance(); - c.set(year, monthOfYear, dayOfMonth, 23, 59); - - dateEnd = new Date(c.getTimeInMillis()); - settings_time_to.setText(Helper.shortDateToString(new Date(c.getTimeInMillis()))); - } - - }; - @Override public boolean onOptionsItemSelected(MenuItem item) { if (item.getItemId() == android.R.id.home) { @@ -311,7 +278,6 @@ public class OwnerChartsActivity extends BaseActivity implements OnRetrieveChart super.onDestroy(); } - @Override public void onCharts(Charts charts) { @@ -442,6 +408,31 @@ public class OwnerChartsActivity extends BaseActivity implements OnRetrieveChart chart.invalidate(); } + public class CustomMarkerView extends MarkerView { + private TextView tvContent; + private MPPointF mOffset; + + public CustomMarkerView(Context context, int layoutResource) { + super(context, layoutResource); + tvContent = findViewById(R.id.tvContent); + tvContent.setTextColor(ContextCompat.getColor(context, R.color.cyanea_accent_reference)); + } + + @Override + public void refreshContent(Entry e, Highlight highlight) { + Date date = new Date(((long) e.getX())); + tvContent.setText(Helper.shortDateToString(date) + " - " + (int) e.getY()); + super.refreshContent(e, highlight); + } + + @Override + public MPPointF getOffset() { + if (mOffset == null) { + mOffset = new MPPointF(-(getWidth() / 2), -getHeight()); + } + return mOffset; + } + } public class MyXAxisValueFormatter extends ValueFormatter { private DateFormat mDataFormat; diff --git a/app/src/main/java/app/fedilab/android/activities/OwnerNotificationActivity.java b/app/src/main/java/app/fedilab/android/activities/OwnerNotificationActivity.java index a7870437a..36056bf32 100644 --- a/app/src/main/java/app/fedilab/android/activities/OwnerNotificationActivity.java +++ b/app/src/main/java/app/fedilab/android/activities/OwnerNotificationActivity.java @@ -39,7 +39,6 @@ import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.RelativeLayout; import android.widget.ScrollView; -import android.widget.Spinner; import android.widget.TextView; import android.widget.Toast; @@ -58,9 +57,7 @@ import java.text.DecimalFormat; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; -import java.util.Iterator; import java.util.List; -import java.util.Map; import app.fedilab.android.R; import app.fedilab.android.asynctasks.RetrieveNotificationStatsAsyncTask; @@ -68,14 +65,12 @@ import app.fedilab.android.asynctasks.RetrieveNotificationsCacheAsyncTask; import app.fedilab.android.client.APIResponse; import app.fedilab.android.client.Entities.Account; import app.fedilab.android.client.Entities.Notification; -import app.fedilab.android.client.Entities.Statistics; import app.fedilab.android.client.Entities.StatisticsNotification; import app.fedilab.android.drawers.NotificationsListAdapter; import app.fedilab.android.helper.FilterNotifications; import app.fedilab.android.helper.Helper; import app.fedilab.android.interfaces.OnRetrieveCacheNotificationsInterface; import app.fedilab.android.interfaces.OnRetrieveNotificationStatsInterface; -import app.fedilab.android.interfaces.OnRetrieveStatsInterface; import app.fedilab.android.services.BackupNotificationInDataBaseService; import app.fedilab.android.sqlite.AccountDAO; import app.fedilab.android.sqlite.NotificationCacheDAO; @@ -91,6 +86,7 @@ import es.dmoral.toasty.Toasty; public class OwnerNotificationActivity extends BaseActivity implements OnRetrieveCacheNotificationsInterface, OnRetrieveNotificationStatsInterface { + LinearLayoutManager mLayoutManager; private ImageView pp_actionBar; private NotificationsListAdapter notificationsListAdapter; private String max_id; @@ -100,14 +96,47 @@ public class OwnerNotificationActivity extends BaseActivity implements OnRetriev private SwipeRefreshLayout swipeRefreshLayout; private boolean swiped; private boolean flag_loading; - LinearLayoutManager mLayoutManager; private int style; private Button settings_time_from, settings_time_to; private FilterNotifications filterNotifications; private Date dateIni, dateEnd; private View statsDialogView; private StatisticsNotification statistics; + private DatePickerDialog.OnDateSetListener iniDateSetListener = + new DatePickerDialog.OnDateSetListener() { + public void onDateSet(DatePicker view, int year, + int monthOfYear, int dayOfMonth) { + Calendar c = Calendar.getInstance(); + c.set(year, monthOfYear, dayOfMonth, 0, 0); + dateIni = new Date(c.getTimeInMillis()); + settings_time_from.setText(Helper.shortDateToString(new Date(c.getTimeInMillis()))); + } + + }; + private DatePickerDialog.OnDateSetListener endDateSetListener = + new DatePickerDialog.OnDateSetListener() { + + public void onDateSet(DatePicker view, int year, + int monthOfYear, int dayOfMonth) { + Calendar c = Calendar.getInstance(); + c.set(year, monthOfYear, dayOfMonth, 23, 59); + + dateEnd = new Date(c.getTimeInMillis()); + settings_time_to.setText(Helper.shortDateToString(new Date(c.getTimeInMillis()))); + } + + }; + private BroadcastReceiver backupFinishedReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + max_id = null; + firstLoad = true; + flag_loading = true; + swiped = true; + new RetrieveNotificationsCacheAsyncTask(OwnerNotificationActivity.this, filterNotifications, null, OwnerNotificationActivity.this).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); + } + }; @Override protected void onCreate(Bundle savedInstanceState) { @@ -238,32 +267,6 @@ public class OwnerNotificationActivity extends BaseActivity implements OnRetriev return true; } - private DatePickerDialog.OnDateSetListener iniDateSetListener = - new DatePickerDialog.OnDateSetListener() { - - public void onDateSet(DatePicker view, int year, - int monthOfYear, int dayOfMonth) { - Calendar c = Calendar.getInstance(); - c.set(year, monthOfYear, dayOfMonth, 0, 0); - dateIni = new Date(c.getTimeInMillis()); - settings_time_from.setText(Helper.shortDateToString(new Date(c.getTimeInMillis()))); - } - - }; - private DatePickerDialog.OnDateSetListener endDateSetListener = - new DatePickerDialog.OnDateSetListener() { - - public void onDateSet(DatePicker view, int year, - int monthOfYear, int dayOfMonth) { - Calendar c = Calendar.getInstance(); - c.set(year, monthOfYear, dayOfMonth, 23, 59); - - dateEnd = new Date(c.getTimeInMillis()); - settings_time_to.setText(Helper.shortDateToString(new Date(c.getTimeInMillis()))); - } - - }; - @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { @@ -415,18 +418,6 @@ public class OwnerNotificationActivity extends BaseActivity implements OnRetriev } } - - private BroadcastReceiver backupFinishedReceiver = new BroadcastReceiver() { - @Override - public void onReceive(Context context, Intent intent) { - max_id = null; - firstLoad = true; - flag_loading = true; - swiped = true; - new RetrieveNotificationsCacheAsyncTask(OwnerNotificationActivity.this, filterNotifications, null, OwnerNotificationActivity.this).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); - } - }; - @Override public void onDestroy() { super.onDestroy(); diff --git a/app/src/main/java/app/fedilab/android/activities/OwnerNotificationChartsActivity.java b/app/src/main/java/app/fedilab/android/activities/OwnerNotificationChartsActivity.java index 8bfd8dbdc..8f5f10fbe 100644 --- a/app/src/main/java/app/fedilab/android/activities/OwnerNotificationChartsActivity.java +++ b/app/src/main/java/app/fedilab/android/activities/OwnerNotificationChartsActivity.java @@ -36,7 +36,6 @@ import android.widget.RelativeLayout; import android.widget.TextView; import androidx.appcompat.app.ActionBar; -import androidx.appcompat.widget.Toolbar; import androidx.core.content.ContextCompat; import androidx.recyclerview.widget.LinearLayoutManager; @@ -76,8 +75,6 @@ import app.fedilab.android.sqlite.NotificationCacheDAO; import app.fedilab.android.sqlite.Sqlite; import app.fedilab.android.sqlite.StatusCacheDAO; -import static app.fedilab.android.sqlite.StatusCacheDAO.NOTIFICATION_CACHE; - /** * Created by Thomas on 26/08/2019. @@ -95,6 +92,31 @@ public class OwnerNotificationChartsActivity extends BaseActivity implements OnR private RelativeLayout loader; private ImageButton validate; private String status_id; + private DatePickerDialog.OnDateSetListener iniDateSetListener = + new DatePickerDialog.OnDateSetListener() { + + public void onDateSet(DatePicker view, int year, + int monthOfYear, int dayOfMonth) { + Calendar c = Calendar.getInstance(); + c.set(year, monthOfYear, dayOfMonth, 0, 0); + dateIni = new Date(c.getTimeInMillis()); + settings_time_from.setText(Helper.shortDateToString(new Date(c.getTimeInMillis()))); + } + + }; + private DatePickerDialog.OnDateSetListener endDateSetListener = + new DatePickerDialog.OnDateSetListener() { + + public void onDateSet(DatePicker view, int year, + int monthOfYear, int dayOfMonth) { + Calendar c = Calendar.getInstance(); + c.set(year, monthOfYear, dayOfMonth, 23, 59); + + dateEnd = new Date(c.getTimeInMillis()); + settings_time_to.setText(Helper.shortDateToString(new Date(c.getTimeInMillis()))); + } + + }; @Override protected void onCreate(Bundle savedInstanceState) { @@ -451,59 +473,6 @@ public class OwnerNotificationChartsActivity extends BaseActivity implements OnR chart.invalidate(); } - public class CustomMarkerView extends MarkerView { - private TextView tvContent; - - public CustomMarkerView(Context context, int layoutResource) { - super(context, layoutResource); - tvContent = findViewById(R.id.tvContent); - tvContent.setTextColor(ContextCompat.getColor(context, R.color.cyanea_accent_reference)); - } - - @Override - public void refreshContent(Entry e, Highlight highlight) { - Date date = new Date(((long) e.getX())); - tvContent.setText(String.valueOf(Helper.shortDateToString(date) + " - " + (int) e.getY())); - super.refreshContent(e, highlight); - } - - private MPPointF mOffset; - - @Override - public MPPointF getOffset() { - if (mOffset == null) { - mOffset = new MPPointF(-(getWidth() / 2), -getHeight()); - } - return mOffset; - } - } - - private DatePickerDialog.OnDateSetListener iniDateSetListener = - new DatePickerDialog.OnDateSetListener() { - - public void onDateSet(DatePicker view, int year, - int monthOfYear, int dayOfMonth) { - Calendar c = Calendar.getInstance(); - c.set(year, monthOfYear, dayOfMonth, 0, 0); - dateIni = new Date(c.getTimeInMillis()); - settings_time_from.setText(Helper.shortDateToString(new Date(c.getTimeInMillis()))); - } - - }; - private DatePickerDialog.OnDateSetListener endDateSetListener = - new DatePickerDialog.OnDateSetListener() { - - public void onDateSet(DatePicker view, int year, - int monthOfYear, int dayOfMonth) { - Calendar c = Calendar.getInstance(); - c.set(year, monthOfYear, dayOfMonth, 23, 59); - - dateEnd = new Date(c.getTimeInMillis()); - settings_time_to.setText(Helper.shortDateToString(new Date(c.getTimeInMillis()))); - } - - }; - @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { @@ -534,6 +503,31 @@ public class OwnerNotificationChartsActivity extends BaseActivity implements OnR super.onDestroy(); } + public class CustomMarkerView extends MarkerView { + private TextView tvContent; + private MPPointF mOffset; + + public CustomMarkerView(Context context, int layoutResource) { + super(context, layoutResource); + tvContent = findViewById(R.id.tvContent); + tvContent.setTextColor(ContextCompat.getColor(context, R.color.cyanea_accent_reference)); + } + + @Override + public void refreshContent(Entry e, Highlight highlight) { + Date date = new Date(((long) e.getX())); + tvContent.setText(Helper.shortDateToString(date) + " - " + (int) e.getY()); + super.refreshContent(e, highlight); + } + + @Override + public MPPointF getOffset() { + if (mOffset == null) { + mOffset = new MPPointF(-(getWidth() / 2), -getHeight()); + } + return mOffset; + } + } public class MyXAxisValueFormatter extends ValueFormatter { private DateFormat mDataFormat; diff --git a/app/src/main/java/app/fedilab/android/activities/OwnerStatusActivity.java b/app/src/main/java/app/fedilab/android/activities/OwnerStatusActivity.java index 64142eaf7..9bcdd9900 100644 --- a/app/src/main/java/app/fedilab/android/activities/OwnerStatusActivity.java +++ b/app/src/main/java/app/fedilab/android/activities/OwnerStatusActivity.java @@ -15,7 +15,6 @@ package app.fedilab.android.activities; -import android.annotation.SuppressLint; import android.app.DatePickerDialog; import android.content.BroadcastReceiver; import android.content.Context; @@ -27,16 +26,6 @@ import android.database.sqlite.SQLiteDatabase; import android.graphics.drawable.ColorDrawable; import android.os.AsyncTask; import android.os.Bundle; - -import androidx.core.content.ContextCompat; -import androidx.localbroadcastmanager.content.LocalBroadcastManager; -import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; -import androidx.appcompat.app.ActionBar; -import androidx.appcompat.app.AlertDialog; -import androidx.recyclerview.widget.LinearLayoutManager; -import androidx.recyclerview.widget.RecyclerView; -import androidx.appcompat.widget.Toolbar; - import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuItem; @@ -55,6 +44,15 @@ import android.widget.Spinner; import android.widget.TextView; import android.widget.Toast; +import androidx.appcompat.app.ActionBar; +import androidx.appcompat.app.AlertDialog; +import androidx.appcompat.widget.Toolbar; +import androidx.core.content.ContextCompat; +import androidx.localbroadcastmanager.content.LocalBroadcastManager; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; +import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; + import org.jetbrains.annotations.NotNull; import java.text.DecimalFormat; @@ -65,6 +63,8 @@ import java.util.Iterator; import java.util.List; import java.util.Map; +import app.fedilab.android.R; +import app.fedilab.android.asynctasks.RetrieveFeedsAsyncTask; import app.fedilab.android.asynctasks.RetrieveStatsAsyncTask; import app.fedilab.android.client.APIResponse; import app.fedilab.android.client.Entities.Account; @@ -73,15 +73,13 @@ import app.fedilab.android.client.Entities.Status; import app.fedilab.android.drawers.StatusListAdapter; import app.fedilab.android.helper.FilterToots; import app.fedilab.android.helper.Helper; +import app.fedilab.android.interfaces.OnRetrieveFeedsInterface; import app.fedilab.android.interfaces.OnRetrieveStatsInterface; import app.fedilab.android.services.BackupStatusInDataBaseService; import app.fedilab.android.sqlite.AccountDAO; import app.fedilab.android.sqlite.Sqlite; import app.fedilab.android.sqlite.StatusCacheDAO; import es.dmoral.toasty.Toasty; -import app.fedilab.android.R; -import app.fedilab.android.asynctasks.RetrieveFeedsAsyncTask; -import app.fedilab.android.interfaces.OnRetrieveFeedsInterface; /** @@ -92,6 +90,7 @@ import app.fedilab.android.interfaces.OnRetrieveFeedsInterface; public class OwnerStatusActivity extends BaseActivity implements OnRetrieveFeedsInterface, OnRetrieveStatsInterface { + LinearLayoutManager mLayoutManager; private ImageView pp_actionBar; private StatusListAdapter statusListAdapter; private String max_id; @@ -101,14 +100,47 @@ public class OwnerStatusActivity extends BaseActivity implements OnRetrieveFeeds private SwipeRefreshLayout swipeRefreshLayout; private boolean swiped; private boolean flag_loading; - LinearLayoutManager mLayoutManager; private int style; private Button settings_time_from, settings_time_to; private FilterToots filterToots; private Date dateIni, dateEnd; private View statsDialogView; private Statistics statistics; + private DatePickerDialog.OnDateSetListener iniDateSetListener = + new DatePickerDialog.OnDateSetListener() { + public void onDateSet(DatePicker view, int year, + int monthOfYear, int dayOfMonth) { + Calendar c = Calendar.getInstance(); + c.set(year, monthOfYear, dayOfMonth, 0, 0); + dateIni = new Date(c.getTimeInMillis()); + settings_time_from.setText(Helper.shortDateToString(new Date(c.getTimeInMillis()))); + } + + }; + private DatePickerDialog.OnDateSetListener endDateSetListener = + new DatePickerDialog.OnDateSetListener() { + + public void onDateSet(DatePicker view, int year, + int monthOfYear, int dayOfMonth) { + Calendar c = Calendar.getInstance(); + c.set(year, monthOfYear, dayOfMonth, 23, 59); + + dateEnd = new Date(c.getTimeInMillis()); + settings_time_to.setText(Helper.shortDateToString(new Date(c.getTimeInMillis()))); + } + + }; + private BroadcastReceiver backupFinishedReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + max_id = null; + firstLoad = true; + flag_loading = true; + swiped = true; + new RetrieveFeedsAsyncTask(OwnerStatusActivity.this, filterToots, null, OwnerStatusActivity.this).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); + } + }; @Override protected void onCreate(Bundle savedInstanceState) { @@ -238,32 +270,6 @@ public class OwnerStatusActivity extends BaseActivity implements OnRetrieveFeeds return true; } - private DatePickerDialog.OnDateSetListener iniDateSetListener = - new DatePickerDialog.OnDateSetListener() { - - public void onDateSet(DatePicker view, int year, - int monthOfYear, int dayOfMonth) { - Calendar c = Calendar.getInstance(); - c.set(year, monthOfYear, dayOfMonth, 0, 0); - dateIni = new Date(c.getTimeInMillis()); - settings_time_from.setText(Helper.shortDateToString(new Date(c.getTimeInMillis()))); - } - - }; - private DatePickerDialog.OnDateSetListener endDateSetListener = - new DatePickerDialog.OnDateSetListener() { - - public void onDateSet(DatePicker view, int year, - int monthOfYear, int dayOfMonth) { - Calendar c = Calendar.getInstance(); - c.set(year, monthOfYear, dayOfMonth, 23, 59); - - dateEnd = new Date(c.getTimeInMillis()); - settings_time_to.setText(Helper.shortDateToString(new Date(c.getTimeInMillis()))); - } - - }; - @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { @@ -483,18 +489,6 @@ public class OwnerStatusActivity extends BaseActivity implements OnRetrieveFeeds } - - private BroadcastReceiver backupFinishedReceiver = new BroadcastReceiver() { - @Override - public void onReceive(Context context, Intent intent) { - max_id = null; - firstLoad = true; - flag_loading = true; - swiped = true; - new RetrieveFeedsAsyncTask(OwnerStatusActivity.this, filterToots, null, OwnerStatusActivity.this).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); - } - }; - @Override public void onDestroy() { super.onDestroy(); diff --git a/app/src/main/java/app/fedilab/android/activities/PartnerShipActivity.java b/app/src/main/java/app/fedilab/android/activities/PartnerShipActivity.java index 56ef3e035..0b2c298b8 100644 --- a/app/src/main/java/app/fedilab/android/activities/PartnerShipActivity.java +++ b/app/src/main/java/app/fedilab/android/activities/PartnerShipActivity.java @@ -14,18 +14,12 @@ * see . */ package app.fedilab.android.activities; -import android.annotation.SuppressLint; import android.content.Intent; import android.content.SharedPreferences; import android.graphics.drawable.ColorDrawable; import android.net.Uri; import android.os.AsyncTask; import android.os.Bundle; - -import androidx.appcompat.app.ActionBar; -import androidx.appcompat.widget.Toolbar; -import androidx.core.content.ContextCompat; - import android.text.method.LinkMovementMethod; import android.view.LayoutInflater; import android.view.MenuItem; @@ -36,9 +30,15 @@ import android.widget.LinearLayout; import android.widget.TextView; import android.widget.Toast; +import androidx.appcompat.app.ActionBar; +import androidx.core.content.ContextCompat; + import java.util.ArrayList; import java.util.List; +import app.fedilab.android.R; +import app.fedilab.android.asynctasks.RetrieveRelationshipAsyncTask; +import app.fedilab.android.asynctasks.RetrieveRemoteDataAsyncTask; import app.fedilab.android.client.Entities.Account; import app.fedilab.android.client.Entities.Error; import app.fedilab.android.client.Entities.Relationship; @@ -46,12 +46,9 @@ import app.fedilab.android.client.Entities.Results; import app.fedilab.android.drawers.AccountSearchDevAdapter; import app.fedilab.android.helper.ExpandableHeightListView; import app.fedilab.android.helper.Helper; -import es.dmoral.toasty.Toasty; -import app.fedilab.android.R; -import app.fedilab.android.asynctasks.RetrieveRelationshipAsyncTask; -import app.fedilab.android.asynctasks.RetrieveRemoteDataAsyncTask; import app.fedilab.android.interfaces.OnRetrieveRelationshipInterface; import app.fedilab.android.interfaces.OnRetrieveRemoteAccountInterface; +import es.dmoral.toasty.Toasty; /** diff --git a/app/src/main/java/app/fedilab/android/activities/PeertubeActivity.java b/app/src/main/java/app/fedilab/android/activities/PeertubeActivity.java index c2dd6c4f1..910cb31b9 100644 --- a/app/src/main/java/app/fedilab/android/activities/PeertubeActivity.java +++ b/app/src/main/java/app/fedilab/android/activities/PeertubeActivity.java @@ -32,15 +32,6 @@ import android.net.Uri; import android.os.AsyncTask; import android.os.Build; import android.os.Bundle; - -import androidx.core.app.ActivityCompat; -import androidx.core.content.ContextCompat; -import androidx.appcompat.app.ActionBar; -import androidx.appcompat.widget.AppCompatImageView; -import androidx.recyclerview.widget.LinearLayoutManager; -import androidx.appcompat.widget.PopupMenu; -import androidx.recyclerview.widget.RecyclerView; - import android.text.Html; import android.view.LayoutInflater; import android.view.Menu; @@ -60,6 +51,14 @@ import android.widget.ScrollView; import android.widget.TextView; import android.widget.Toast; +import androidx.appcompat.app.ActionBar; +import androidx.appcompat.widget.AppCompatImageView; +import androidx.appcompat.widget.PopupMenu; +import androidx.core.app.ActivityCompat; +import androidx.core.content.ContextCompat; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + import com.google.android.exoplayer2.ExoPlayerFactory; import com.google.android.exoplayer2.SimpleExoPlayer; import com.google.android.exoplayer2.source.ExtractorMediaSource; @@ -82,7 +81,13 @@ import java.util.Objects; import javax.net.ssl.HttpsURLConnection; +import app.fedilab.android.R; import app.fedilab.android.asynctasks.ManagePlaylistsAsyncTask; +import app.fedilab.android.asynctasks.PostActionAsyncTask; +import app.fedilab.android.asynctasks.RetrieveFeedsAsyncTask; +import app.fedilab.android.asynctasks.RetrievePeertubeSingleAsyncTask; +import app.fedilab.android.asynctasks.RetrievePeertubeSingleCommentsAsyncTask; +import app.fedilab.android.asynctasks.UpdateAccountInfoAsyncTask; import app.fedilab.android.client.API; import app.fedilab.android.client.APIResponse; import app.fedilab.android.client.Entities.Account; @@ -96,6 +101,8 @@ import app.fedilab.android.helper.CrossActions; import app.fedilab.android.helper.FullScreenMediaController; import app.fedilab.android.helper.Helper; import app.fedilab.android.interfaces.OnPlaylistActionInterface; +import app.fedilab.android.interfaces.OnPostActionInterface; +import app.fedilab.android.interfaces.OnRetrievePeertubeInterface; import app.fedilab.android.sqlite.AccountDAO; import app.fedilab.android.sqlite.PeertubeFavoritesDAO; import app.fedilab.android.sqlite.Sqlite; @@ -103,14 +110,6 @@ import app.fedilab.android.webview.CustomWebview; import app.fedilab.android.webview.MastalabWebChromeClient; import app.fedilab.android.webview.MastalabWebViewClient; import es.dmoral.toasty.Toasty; -import app.fedilab.android.R; -import app.fedilab.android.asynctasks.PostActionAsyncTask; -import app.fedilab.android.asynctasks.RetrieveFeedsAsyncTask; -import app.fedilab.android.asynctasks.RetrievePeertubeSingleAsyncTask; -import app.fedilab.android.asynctasks.RetrievePeertubeSingleCommentsAsyncTask; -import app.fedilab.android.asynctasks.UpdateAccountInfoAsyncTask; -import app.fedilab.android.interfaces.OnPostActionInterface; -import app.fedilab.android.interfaces.OnRetrievePeertubeInterface; import static app.fedilab.android.asynctasks.ManagePlaylistsAsyncTask.action.GET_PLAYLIST; import static app.fedilab.android.asynctasks.ManagePlaylistsAsyncTask.action.GET_PLAYLIST_FOR_VIDEO; @@ -124,6 +123,7 @@ import static app.fedilab.android.helper.Helper.changeDrawableColor; public class PeertubeActivity extends BaseActivity implements OnRetrievePeertubeInterface, OnPostActionInterface, OnPlaylistActionInterface { + public static String video_id; private String peertubeInstance, videoId; private FullScreenMediaController.fullscreen fullscreen; private RelativeLayout loader; @@ -132,7 +132,6 @@ public class PeertubeActivity extends BaseActivity implements OnRetrievePeertube private int stopPosition; private Peertube peertube; private TextView toolbar_title; - public static String video_id; private SimpleExoPlayerView playerView; private SimpleExoPlayer player; private boolean fullScreenMode; @@ -149,6 +148,13 @@ public class PeertubeActivity extends BaseActivity implements OnRetrievePeertube private List playlistForVideo; private List playlists; + public static void hideKeyboard(Activity activity) { + if (activity != null && activity.getWindow() != null && activity.getWindow().getDecorView() != null) { + InputMethodManager imm = (InputMethodManager) activity.getSystemService(INPUT_METHOD_SERVICE); + imm.hideSoftInputFromWindow(activity.getWindow().getDecorView().getWindowToken(), 0); + } + } + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -339,7 +345,7 @@ public class PeertubeActivity extends BaseActivity implements OnRetrievePeertube if ((ev.getAction() == MotionEvent.ACTION_UP || ev.getAction() == MotionEvent.ACTION_MOVE) && v instanceof EditText && v.getId() == R.id.add_comment_write) { - int scrcoords[] = new int[2]; + int[] scrcoords = new int[2]; v.getLocationOnScreen(scrcoords); float x = ev.getRawX() + v.getLeft() - scrcoords[0]; float y = ev.getRawY() + v.getTop() - scrcoords[1]; @@ -354,13 +360,6 @@ public class PeertubeActivity extends BaseActivity implements OnRetrievePeertube return super.dispatchTouchEvent(ev); } - public static void hideKeyboard(Activity activity) { - if (activity != null && activity.getWindow() != null && activity.getWindow().getDecorView() != null) { - InputMethodManager imm = (InputMethodManager) activity.getSystemService(INPUT_METHOD_SERVICE); - imm.hideSoftInputFromWindow(activity.getWindow().getDecorView().getWindowToken(), 0); - } - } - @Override public boolean onCreateOptionsMenu(@NotNull Menu menu) { getMenuInflater().inflate(R.menu.main_webview, menu); diff --git a/app/src/main/java/app/fedilab/android/activities/PeertubeEditUploadActivity.java b/app/src/main/java/app/fedilab/android/activities/PeertubeEditUploadActivity.java index dda377955..fa974e12b 100644 --- a/app/src/main/java/app/fedilab/android/activities/PeertubeEditUploadActivity.java +++ b/app/src/main/java/app/fedilab/android/activities/PeertubeEditUploadActivity.java @@ -15,19 +15,12 @@ package app.fedilab.android.activities; * see . */ -import android.annotation.SuppressLint; import android.content.DialogInterface; import android.content.Intent; import android.content.SharedPreferences; import android.graphics.drawable.ColorDrawable; import android.os.AsyncTask; import android.os.Bundle; - -import androidx.appcompat.app.ActionBar; -import androidx.appcompat.app.AlertDialog; -import androidx.appcompat.widget.Toolbar; -import androidx.core.content.ContextCompat; - import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -40,6 +33,10 @@ import android.widget.LinearLayout; import android.widget.TextView; import android.widget.Toast; +import androidx.appcompat.app.ActionBar; +import androidx.appcompat.app.AlertDialog; +import androidx.core.content.ContextCompat; + import com.jaredrummler.materialspinner.MaterialSpinner; import java.util.HashMap; @@ -48,20 +45,20 @@ import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import app.fedilab.android.R; +import app.fedilab.android.asynctasks.PostActionAsyncTask; +import app.fedilab.android.asynctasks.PostPeertubeAsyncTask; +import app.fedilab.android.asynctasks.RetrievePeertubeChannelsAsyncTask; +import app.fedilab.android.asynctasks.RetrievePeertubeSingleAsyncTask; import app.fedilab.android.client.API; import app.fedilab.android.client.APIResponse; import app.fedilab.android.client.Entities.Account; import app.fedilab.android.client.Entities.Error; import app.fedilab.android.client.Entities.Peertube; import app.fedilab.android.helper.Helper; -import es.dmoral.toasty.Toasty; -import app.fedilab.android.R; -import app.fedilab.android.asynctasks.PostActionAsyncTask; -import app.fedilab.android.asynctasks.PostPeertubeAsyncTask; -import app.fedilab.android.asynctasks.RetrievePeertubeChannelsAsyncTask; -import app.fedilab.android.asynctasks.RetrievePeertubeSingleAsyncTask; import app.fedilab.android.interfaces.OnPostActionInterface; import app.fedilab.android.interfaces.OnRetrievePeertubeInterface; +import es.dmoral.toasty.Toasty; import mabbas007.tagsedittext.TagsEditText; import static android.os.AsyncTask.THREAD_POOL_EXECUTOR; @@ -70,6 +67,11 @@ import static app.fedilab.android.asynctasks.RetrievePeertubeInformationAsyncTas public class PeertubeEditUploadActivity extends BaseActivity implements OnRetrievePeertubeInterface, OnPostActionInterface { + HashMap categoryToSend; + HashMap licenseToSend; + HashMap privacyToSend; + HashMap languageToSend; + HashMap channelToSend; private Button set_upload_submit, set_upload_delete; private MaterialSpinner set_upload_privacy, set_upload_categories, set_upload_licenses, set_upload_languages, set_upload_channel; private EditText p_video_title, p_video_description; @@ -78,11 +80,6 @@ public class PeertubeEditUploadActivity extends BaseActivity implements OnRetrie private LinkedHashMap channels; private String videoId; private Account channel; - HashMap categoryToSend; - HashMap licenseToSend; - HashMap privacyToSend; - HashMap languageToSend; - HashMap channelToSend; @Override protected void onCreate(Bundle savedInstanceState) { @@ -148,8 +145,6 @@ public class PeertubeEditUploadActivity extends BaseActivity implements OnRetrie set_upload_enable_comments = findViewById(R.id.set_upload_enable_comments); - - set_upload_delete.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { @@ -196,10 +191,10 @@ public class PeertubeEditUploadActivity extends BaseActivity implements OnRetrie int i = 0; while (it.hasNext()) { Map.Entry pair = (Map.Entry) it.next(); - if (translations == null || translations.size() == 0 || !translations.containsKey((String) pair.getValue())) + if (translations == null || translations.size() == 0 || !translations.containsKey(pair.getValue())) categoriesA[i] = (String) pair.getValue(); else - categoriesA[i] = translations.get((String) pair.getValue()); + categoriesA[i] = translations.get(pair.getValue()); it.remove(); i++; } @@ -214,10 +209,10 @@ public class PeertubeEditUploadActivity extends BaseActivity implements OnRetrie i = 0; while (it.hasNext()) { Map.Entry pair = (Map.Entry) it.next(); - if (translations == null || translations.size() == 0 || !translations.containsKey((String) pair.getValue())) + if (translations == null || translations.size() == 0 || !translations.containsKey(pair.getValue())) licensesA[i] = (String) pair.getValue(); else - licensesA[i] = translations.get((String) pair.getValue()); + licensesA[i] = translations.get(pair.getValue()); it.remove(); i++; } @@ -232,10 +227,10 @@ public class PeertubeEditUploadActivity extends BaseActivity implements OnRetrie i = 0; while (it.hasNext()) { Map.Entry pair = (Map.Entry) it.next(); - if (translations == null || translations.size() == 0 || !translations.containsKey((String) pair.getValue())) + if (translations == null || translations.size() == 0 || !translations.containsKey(pair.getValue())) languagesA[i] = (String) pair.getValue(); else - languagesA[i] = translations.get((String) pair.getValue()); + languagesA[i] = translations.get(pair.getValue()); it.remove(); i++; } @@ -250,10 +245,10 @@ public class PeertubeEditUploadActivity extends BaseActivity implements OnRetrie i = 0; while (it.hasNext()) { Map.Entry pair = (Map.Entry) it.next(); - if (translations == null || translations.size() == 0 || !translations.containsKey((String) pair.getValue())) + if (translations == null || translations.size() == 0 || !translations.containsKey(pair.getValue())) privaciesA[i] = (String) pair.getValue(); else - privaciesA[i] = translations.get((String) pair.getValue()); + privaciesA[i] = translations.get(pair.getValue()); it.remove(); i++; } diff --git a/app/src/main/java/app/fedilab/android/activities/PeertubeRegisterActivity.java b/app/src/main/java/app/fedilab/android/activities/PeertubeRegisterActivity.java index 7e982517c..3e4b1aa6e 100644 --- a/app/src/main/java/app/fedilab/android/activities/PeertubeRegisterActivity.java +++ b/app/src/main/java/app/fedilab/android/activities/PeertubeRegisterActivity.java @@ -16,12 +16,10 @@ package app.fedilab.android.activities; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; -import android.annotation.SuppressLint; import android.content.Context; import android.content.DialogInterface; import android.content.SharedPreferences; import android.graphics.drawable.ColorDrawable; -import android.os.AsyncTask; import android.os.Bundle; import android.text.Html; import android.text.SpannableString; @@ -42,16 +40,10 @@ import android.widget.Toast; import androidx.appcompat.app.ActionBar; import androidx.appcompat.app.AlertDialog; -import androidx.appcompat.widget.Toolbar; import androidx.core.content.ContextCompat; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; - -import java.io.IOException; -import java.lang.ref.WeakReference; -import java.net.HttpURLConnection; -import java.net.URL; import java.util.List; import app.fedilab.android.R; @@ -121,7 +113,7 @@ public class PeertubeRegisterActivity extends BaseActivity implements OnRetrieve } - new RetrieveInstanceRegAsyncTask(PeertubeRegisterActivity.this,RetrieveInstanceRegAsyncTask.instanceType.PEERTUBE, null, PeertubeRegisterActivity.this).executeOnExecutor(THREAD_POOL_EXECUTOR); + new RetrieveInstanceRegAsyncTask(PeertubeRegisterActivity.this, RetrieveInstanceRegAsyncTask.instanceType.PEERTUBE, null, PeertubeRegisterActivity.this).executeOnExecutor(THREAD_POOL_EXECUTOR); signup = findViewById(R.id.signup); EditText username = findViewById(R.id.username); diff --git a/app/src/main/java/app/fedilab/android/activities/PeertubeUploadActivity.java b/app/src/main/java/app/fedilab/android/activities/PeertubeUploadActivity.java index b10dd6aac..41940df06 100644 --- a/app/src/main/java/app/fedilab/android/activities/PeertubeUploadActivity.java +++ b/app/src/main/java/app/fedilab/android/activities/PeertubeUploadActivity.java @@ -16,7 +16,6 @@ package app.fedilab.android.activities; import android.Manifest; -import android.annotation.SuppressLint; import android.app.Activity; import android.app.PendingIntent; import android.content.Context; @@ -27,15 +26,8 @@ import android.database.Cursor; import android.graphics.drawable.ColorDrawable; import android.net.Uri; import android.os.AsyncTask; -import android.os.Build; import android.os.Bundle; import android.provider.OpenableColumns; - -import androidx.core.app.ActivityCompat; -import androidx.core.content.ContextCompat; -import androidx.appcompat.app.ActionBar; -import androidx.appcompat.widget.Toolbar; - import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -47,6 +39,10 @@ import android.widget.LinearLayout; import android.widget.TextView; import android.widget.Toast; +import androidx.appcompat.app.ActionBar; +import androidx.core.app.ActivityCompat; +import androidx.core.content.ContextCompat; + import com.jaredrummler.materialspinner.MaterialSpinner; import net.gotev.uploadservice.MultipartUploadRequest; @@ -68,13 +64,13 @@ import java.util.List; import java.util.Map; import java.util.UUID; +import app.fedilab.android.R; +import app.fedilab.android.asynctasks.RetrievePeertubeChannelsAsyncTask; import app.fedilab.android.client.APIResponse; import app.fedilab.android.client.Entities.Account; import app.fedilab.android.helper.Helper; -import es.dmoral.toasty.Toasty; -import app.fedilab.android.R; -import app.fedilab.android.asynctasks.RetrievePeertubeChannelsAsyncTask; import app.fedilab.android.interfaces.OnRetrievePeertubeInterface; +import es.dmoral.toasty.Toasty; import static app.fedilab.android.asynctasks.RetrievePeertubeInformationAsyncTask.peertubeInformation; @@ -82,12 +78,12 @@ public class PeertubeUploadActivity extends BaseActivity implements OnRetrievePe private final int PICK_IVDEO = 52378; + private final int MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE = 724; private Button set_upload_file, set_upload_submit; private MaterialSpinner set_upload_privacy, set_upload_channel; private TextView set_upload_file_name; private EditText video_title; private HashMap channels; - private final int MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE = 724; private Uri uri; private String filename; private HashMap privacyToSend; @@ -231,11 +227,11 @@ public class PeertubeUploadActivity extends BaseActivity implements OnRetrievePe android.R.layout.simple_spinner_dropdown_item, channelName); set_upload_channel.setAdapter(adapterChannel); - if( peertubeInformation == null){ + if (peertubeInformation == null) { return; } LinkedHashMap translations = null; - if ( peertubeInformation.getTranslations() != null) + if (peertubeInformation.getTranslations() != null) translations = new LinkedHashMap<>(peertubeInformation.getTranslations()); LinkedHashMap privaciesInit = new LinkedHashMap<>(peertubeInformation.getPrivacies()); @@ -249,7 +245,7 @@ public class PeertubeUploadActivity extends BaseActivity implements OnRetrievePe i = 0; while (it.hasNext()) { Map.Entry pair = (Map.Entry) it.next(); - if (translations == null || translations.size() == 0 || !translations.containsKey((String) pair.getValue())) + if (translations == null || translations.size() == 0 || !translations.containsKey(pair.getValue())) privaciesA[i] = (String) pair.getValue(); else privaciesA[i] = translations.get(pair.getValue()); @@ -356,7 +352,7 @@ public class PeertubeUploadActivity extends BaseActivity implements OnRetrievePe uploadConfig.getCancelled().message = getString(R.string.toast_cancelled); uploadConfig.getCompleted().actions.add(new UploadNotificationAction(R.drawable.ic_check, getString(R.string.video_uploaded_action), clickIntent)); - if( video_title != null && video_title.getText() != null && video_title.getText().toString().trim().length() > 0 ){ + if (video_title != null && video_title.getText() != null && video_title.getText().toString().trim().length() > 0) { filename = video_title.getText().toString().trim(); } String uploadId = UUID.randomUUID().toString(); diff --git a/app/src/main/java/app/fedilab/android/activities/PhotoEditorActivity.java b/app/src/main/java/app/fedilab/android/activities/PhotoEditorActivity.java index a3a6f2b55..f32623bfd 100644 --- a/app/src/main/java/app/fedilab/android/activities/PhotoEditorActivity.java +++ b/app/src/main/java/app/fedilab/android/activities/PhotoEditorActivity.java @@ -14,17 +14,41 @@ package app.fedilab.android.activities; * You should have received a copy of the GNU General Public License along with Fedilab; if not, * see . */ +import android.Manifest; import android.annotation.SuppressLint; +import android.content.DialogInterface; +import android.content.Intent; import android.content.SharedPreferences; +import android.graphics.Bitmap; +import android.graphics.Typeface; import android.net.Uri; import android.os.Bundle; +import android.provider.MediaStore; +import android.view.View; +import android.view.animation.AnticipateOvershootInterpolator; +import android.widget.Button; +import android.widget.ImageView; +import android.widget.TextView; import androidx.annotation.NonNull; +import androidx.appcompat.app.AlertDialog; +import androidx.constraintlayout.widget.ConstraintLayout; +import androidx.constraintlayout.widget.ConstraintSet; import androidx.exifinterface.media.ExifInterface; import androidx.localbroadcastmanager.content.LocalBroadcastManager; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; +import androidx.transition.ChangeBounds; +import androidx.transition.TransitionManager; -import android.view.Window; +import com.theartofdev.edmodo.cropper.CropImage; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Locale; import app.fedilab.android.R; import app.fedilab.android.helper.Helper; @@ -36,43 +60,10 @@ import app.fedilab.android.imageeditor.filters.FilterListener; import app.fedilab.android.imageeditor.filters.FilterViewAdapter; import app.fedilab.android.imageeditor.tools.EditingToolsAdapter; import app.fedilab.android.imageeditor.tools.ToolType; +import ja.burhanrashid52.photoeditor.OnPhotoEditorListener; import ja.burhanrashid52.photoeditor.PhotoEditor; import ja.burhanrashid52.photoeditor.PhotoEditorView; import ja.burhanrashid52.photoeditor.PhotoFilter; - - -import android.Manifest; -import android.content.DialogInterface; -import android.content.Intent; -import android.graphics.Bitmap; -import android.graphics.Typeface; -import android.provider.MediaStore; - -import androidx.constraintlayout.widget.ConstraintLayout; -import androidx.constraintlayout.widget.ConstraintSet; -import androidx.transition.ChangeBounds; -import androidx.transition.TransitionManager; -import androidx.appcompat.app.AlertDialog; -import androidx.recyclerview.widget.LinearLayoutManager; -import androidx.recyclerview.widget.RecyclerView; - -import android.view.View; -import android.view.animation.AnticipateOvershootInterpolator; -import android.widget.Button; -import android.widget.ImageView; -import android.widget.TextView; - - -import com.theartofdev.edmodo.cropper.CropImage; - -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.text.SimpleDateFormat; -import java.util.Date; -import java.util.Locale; - -import ja.burhanrashid52.photoeditor.OnPhotoEditorListener; import ja.burhanrashid52.photoeditor.SaveSettings; import ja.burhanrashid52.photoeditor.ViewType; @@ -102,6 +93,17 @@ public class PhotoEditorActivity extends BaseActivity implements OnPhotoEditorLi private String tempname; private boolean exit; + private static int exifToDegrees(int exifOrientation) { + if (exifOrientation == ExifInterface.ORIENTATION_ROTATE_90) { + return 90; + } else if (exifOrientation == ExifInterface.ORIENTATION_ROTATE_180) { + return 180; + } else if (exifOrientation == ExifInterface.ORIENTATION_ROTATE_270) { + return 270; + } + return 0; + } + @SuppressLint("MissingPermission") @Override protected void onCreate(Bundle savedInstanceState) { @@ -195,17 +197,6 @@ public class PhotoEditorActivity extends BaseActivity implements OnPhotoEditorLi }); } - private static int exifToDegrees(int exifOrientation) { - if (exifOrientation == ExifInterface.ORIENTATION_ROTATE_90) { - return 90; - } else if (exifOrientation == ExifInterface.ORIENTATION_ROTATE_180) { - return 180; - } else if (exifOrientation == ExifInterface.ORIENTATION_ROTATE_270) { - return 270; - } - return 0; - } - private void initViews() { ImageView imgUndo; ImageView imgRedo; diff --git a/app/src/main/java/app/fedilab/android/activities/PixelfedComposeActivity.java b/app/src/main/java/app/fedilab/android/activities/PixelfedComposeActivity.java index 8d9088716..d44d002c2 100644 --- a/app/src/main/java/app/fedilab/android/activities/PixelfedComposeActivity.java +++ b/app/src/main/java/app/fedilab/android/activities/PixelfedComposeActivity.java @@ -139,7 +139,6 @@ import app.fedilab.android.drawers.TagsSearchAdapter; import app.fedilab.android.helper.FileNameCleaner; import app.fedilab.android.helper.Helper; import app.fedilab.android.helper.MastalabAutoCompleteTextView; -import app.fedilab.android.helper.ThemeHelper; import app.fedilab.android.interfaces.OnDownloadInterface; import app.fedilab.android.interfaces.OnPostActionInterface; import app.fedilab.android.interfaces.OnPostStatusActionInterface; @@ -152,6 +151,7 @@ import app.fedilab.android.sqlite.AccountDAO; import app.fedilab.android.sqlite.Sqlite; import app.fedilab.android.sqlite.StatusStoredDAO; import es.dmoral.toasty.Toasty; + import static app.fedilab.android.helper.Helper.ALPHA; import static app.fedilab.android.helper.Helper.MORSE; import static app.fedilab.android.helper.Helper.countWithEmoji; @@ -165,16 +165,26 @@ import static app.fedilab.android.helper.Helper.countWithEmoji; public class PixelfedComposeActivity extends BaseActivity implements UploadStatusDelegate, OnPostActionInterface, OnRetrieveSearcAccountshInterface, OnPostStatusActionInterface, OnRetrieveSearchInterface, OnRetrieveEmojiInterface, OnDownloadInterface, OnRetrieveAttachmentInterface { - private String visibility; + public static final int MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE = 754; + public static final int SEND_VOICE_MESSAGE = 1423; + public static HashMap filesMap; + public static boolean autocomplete; + public static Uri photoFileUri = null; + static boolean active = false; + private static String instance; + private static int searchDeep = 15; private final int PICK_IMAGE = 56556; private final int TAKE_PHOTO = 56532; + public long currentToId; + String mCurrentPhotoPath; + File photoFile = null; + private String visibility; private ArrayList attachments; private boolean isSensitive = false; private ImageButton toot_visibility; private Button toot_it; private MastalabAutoCompleteTextView toot_content; private CheckBox toot_sensitive; - public long currentToId; private long restored; private TextView title; private ImageView pp_actionBar; @@ -182,379 +192,48 @@ public class PixelfedComposeActivity extends BaseActivity implements UploadStatu private Toast mToast; private TextView toot_space_left; private String initialContent; - public static final int MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE = 754; private Account accountReply; private String userId; - private static String instance; private Account account; private boolean removed; private boolean restoredScheduled; - static boolean active = false; private int style; private StoredStatus scheduledstatus; private boolean isScheduled; private int max_media_count; - public static HashMap filesMap; - public static boolean autocomplete; private UploadServiceSingleBroadcastReceiver uploadReceiver; - public static final int SEND_VOICE_MESSAGE = 1423; private UpdateAccountInfoAsyncTask.SOCIAL social; private Button upload_media; private LinearLayout pickup_picture; - private static int searchDeep = 15; private SliderView imageSlider; private SliderAdapter sliderAdapter; - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - SharedPreferences sharedpreferences = getSharedPreferences(Helper.APP_PREFS, MODE_PRIVATE); - userId = sharedpreferences.getString(Helper.PREF_KEY_ID, null); - instance = sharedpreferences.getString(Helper.PREF_INSTANCE, Helper.getLiveInstance(getApplicationContext())); - final int theme = sharedpreferences.getInt(Helper.SET_THEME, Helper.THEME_DARK); - switch (theme) { - case Helper.THEME_LIGHT: - setTheme(R.style.AppTheme_Fedilab); - break; - case Helper.THEME_DARK: - setTheme(R.style.AppThemeDark); - break; - case Helper.THEME_BLACK: - setTheme(R.style.AppThemeBlack); - break; - default: - setTheme(R.style.AppThemeDark); - } - if (theme == Helper.THEME_DARK) { - style = R.style.DialogDark; - } else if (theme == Helper.THEME_BLACK) { - style = R.style.DialogBlack; - } else { - style = R.style.Dialog; - } - filesMap = new HashMap<>(); - social = MainActivity.social; - - - autocomplete = false; - setContentView(R.layout.activity_pixelfed_compose); - ActionBar actionBar = getSupportActionBar(); - if (actionBar != null) { - actionBar.setBackgroundDrawable(new ColorDrawable(ContextCompat.getColor(PixelfedComposeActivity.this, R.color.cyanea_primary))); - LayoutInflater inflater = (LayoutInflater) this.getSystemService(LAYOUT_INFLATER_SERVICE); - assert inflater != null; - View view = inflater.inflate(R.layout.toot_action_bar, new LinearLayout(getApplicationContext()), false); - actionBar.setCustomView(view, new ActionBar.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); - actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM); - ImageView close_toot = actionBar.getCustomView().findViewById(R.id.close_toot); - - close_toot.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE); - assert inputMethodManager != null; - inputMethodManager.hideSoftInputFromWindow(toot_content.getWindowToken(), 0); - boolean storeToot = sharedpreferences.getBoolean(Helper.SET_AUTO_STORE, true); - if (!storeToot) { - if (toot_content.getText().toString().trim().length() == 0 && (attachments == null || attachments.size() < 1)) { - finish(); - } else if (initialContent.trim().equals(toot_content.getText().toString().trim())) { - finish(); - } else { - AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(PixelfedComposeActivity.this, style); - dialogBuilder.setMessage(R.string.save_draft); - dialogBuilder.setPositiveButton(R.string.validate, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int id) { - if (accountReply == null) { - storeToot(true, false); - } else { - storeToot(false, false); - } - dialog.dismiss(); - finish(); - } - }); - dialogBuilder.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int id) { - dialog.dismiss(); - finish(); - } - }); - AlertDialog alertDialog = dialogBuilder.create(); - alertDialog.setCancelable(false); - alertDialog.show(); - } - - } else { - finish(); - } - } - }); - title = actionBar.getCustomView().findViewById(R.id.toolbar_title); - pp_actionBar = actionBar.getCustomView().findViewById(R.id.pp_actionBar); - pp_progress = actionBar.getCustomView().findViewById(R.id.pp_progress); - - } - - //By default the toot is not restored so the id -1 is defined - currentToId = -1; - restoredScheduled = false; - toot_it = findViewById(R.id.toot_it); - attachments = new ArrayList<>(); - imageSlider = findViewById(R.id.imageSlider); - sliderAdapter = new SliderAdapter(new WeakReference<>(PixelfedComposeActivity.this), true, attachments); - imageSlider.setIndicatorAnimation(IndicatorAnimations.WORM); - imageSlider.setSliderTransformAnimation(SliderAnimations.SIMPLETRANSFORMATION); - imageSlider.setSliderAdapter(sliderAdapter); - upload_media = findViewById(R.id.upload_media); - toot_space_left = findViewById(R.id.toot_space_left); - toot_visibility = findViewById(R.id.toot_visibility); - pickup_picture = findViewById(R.id.pickup_picture); - toot_content = findViewById(R.id.toot_content); - int newInputType = toot_content.getInputType() & (toot_content.getInputType() ^ InputType.TYPE_TEXT_FLAG_AUTO_COMPLETE); - toot_content.setInputType(newInputType); - - - - //There is no media the button is hidden - upload_media.setVisibility(View.INVISIBLE); - toot_sensitive = findViewById(R.id.toot_sensitive); - LinearLayout drawer_layout = findViewById(R.id.drawer_layout); - ImageButton toot_emoji = findViewById(R.id.toot_emoji); - - isScheduled = false; - if (sharedpreferences.getBoolean(Helper.SET_DISPLAY_EMOJI, true)) { - final EmojiPopup emojiPopup = EmojiPopup.Builder.fromRootView(drawer_layout).build(toot_content); - - toot_emoji.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - emojiPopup.toggle(); // Toggles visibility of the Popup. - } - }); - } else { - toot_emoji.setVisibility(View.GONE); - } - - - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { - SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); - int iconColor = prefs.getInt("theme_icons_color", -1); - if( iconColor != -1){ - Helper.changeDrawableColor(getApplicationContext(), toot_visibility, iconColor); - Helper.changeDrawableColor(getApplicationContext(), toot_emoji, iconColor); - toot_sensitive.setButtonTintList(ColorStateList.valueOf(iconColor)); - toot_sensitive.setTextColor(iconColor); + private BroadcastReceiver imageReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + String imgpath = intent.getStringExtra("imgpath"); + if (imgpath != null) { + prepareUpload(PixelfedComposeActivity.this, Uri.fromFile(new File(imgpath)), null, uploadReceiver); } - } - Bundle b = getIntent().getExtras(); - ArrayList sharedUri = new ArrayList<>(); - SQLiteDatabase db = Sqlite.getInstance(getApplicationContext(), Sqlite.DB_NAME, null, Sqlite.DB_VERSION).open(); - restored = -1; - if (b != null) { - scheduledstatus = b.getParcelable("storedStatus"); - String accountReplyToken = b.getString("accountReplyToken", null); - accountReply = null; - if (accountReplyToken != null) { - String[] val = accountReplyToken.split("\\|"); - if (val.length == 2) { - accountReply = new AccountDAO(getApplicationContext(), db).getUniqAccount(val[0], val[1]); - } - } - removed = b.getBoolean("removed"); - visibility = b.getString("visibility", null); - restoredScheduled = b.getBoolean("restoredScheduled", false); - // ACTION_SEND route - if (b.getInt("uriNumberMast", 0) == 1) { - Uri fileUri = b.getParcelable("sharedUri"); - if (fileUri != null) { - sharedUri.add(fileUri); - } - } - // ACTION_SEND_MULTIPLE route - else if (b.getInt("uriNumberMast", 0) > 1) { - ArrayList fileUri = b.getParcelableArrayList("sharedUri"); + }; + private BroadcastReceiver add_new_media = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { - if (fileUri != null) { - sharedUri.addAll(fileUri); - } + JSONObject response = null; + ArrayList successfullyUploadedFiles = null; + try { + response = new JSONObject(intent.getStringExtra("response")); + } catch (JSONException e) { + e.printStackTrace(); } - restored = b.getLong("restored", -1); + successfullyUploadedFiles = intent.getStringArrayListExtra("uploadInfo"); + addNewMedia(response, successfullyUploadedFiles); } - if (scheduledstatus != null) - toot_it.setText(R.string.modify); - if (restoredScheduled) { - toot_it.setVisibility(View.GONE); - invalidateOptionsMenu(); - } - String userIdReply, instanceReply; - if (accountReply == null) { - userIdReply = sharedpreferences.getString(Helper.PREF_KEY_ID, null); - instanceReply = sharedpreferences.getString(Helper.PREF_INSTANCE, null); - } else { - userIdReply = accountReply.getId(); - instanceReply = accountReply.getInstance(); - } - if (accountReply == null) - account = new AccountDAO(getApplicationContext(), db).getUniqAccount(userIdReply, instanceReply); - else - account = accountReply; - - max_media_count = 4; - - setTitle(R.string.compose); - toot_content.requestFocus(); - - - Helper.loadGiF(getApplicationContext(), account.getAvatar(), pp_actionBar); - - - - if (visibility == null) { - String defaultVisibility = account.isLocked() ? "private" : "public"; - visibility = sharedpreferences.getString(Helper.SET_TOOT_VISIBILITY + "@" + account.getAcct() + "@" + account.getInstance(), defaultVisibility); - } - switch (visibility) { - case "public": - toot_visibility.setImageResource(R.drawable.ic_public_toot); - break; - case "unlisted": - toot_visibility.setImageResource(R.drawable.ic_lock_open_toot); - break; - case "private": - toot_visibility.setImageResource(R.drawable.ic_lock_outline_toot); - break; - case "direct": - toot_visibility.setImageResource(R.drawable.ic_mail_outline_toot); - break; - } - - toot_sensitive.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { - @Override - public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { - isSensitive = isChecked; - } - }); - - - toot_space_left.setText(String.valueOf(countLength(social, toot_content))); - - - toot_visibility.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - tootVisibilityDialog(); - } - }); - - toot_it.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - sendToot(null); - } - }); - - - pickup_picture.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - - if (ContextCompat.checkSelfPermission(PixelfedComposeActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE) != - PackageManager.PERMISSION_GRANTED) { - ActivityCompat.requestPermissions(PixelfedComposeActivity.this, - new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, - MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE); - return; - } - Intent intent; - intent = new Intent(Intent.ACTION_GET_CONTENT); - intent.addCategory(Intent.CATEGORY_OPENABLE); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { - intent.setType("*/*"); - intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true); - String[] mimetypes = {"image/*", "video/*", "audio/mpeg", "audio/opus", "audio/flac", "audio/wav", "audio/ogg"}; - intent.putExtra(Intent.EXTRA_MIME_TYPES, mimetypes); - startActivityForResult(intent, PICK_IMAGE); - } else { - intent.setType("image/* video/* audio/mpeg audio/opus audio/flac audio/wav audio/ogg"); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) { - intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true); - } - Intent pickIntent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI); - Intent chooserIntent = Intent.createChooser(intent, getString(R.string.toot_select_image)); - chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, new Intent[]{pickIntent}); - startActivityForResult(chooserIntent, PICK_IMAGE); - } - - } - }); - - upload_media.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - - if (ContextCompat.checkSelfPermission(PixelfedComposeActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE) != - PackageManager.PERMISSION_GRANTED) { - ActivityCompat.requestPermissions(PixelfedComposeActivity.this, - new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, - MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE); - return; - } - Intent intent; - intent = new Intent(Intent.ACTION_GET_CONTENT); - intent.addCategory(Intent.CATEGORY_OPENABLE); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { - intent.setType("*/*"); - intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true); - String[] mimetypes = {"image/*", "video/*", "audio/mpeg", "audio/opus", "audio/flac", "audio/wav", "audio/ogg"}; - intent.putExtra(Intent.EXTRA_MIME_TYPES, mimetypes); - startActivityForResult(intent, PICK_IMAGE); - } else { - intent.setType("image/* video/* audio/mpeg audio/opus audio/flac audio/wav audio/ogg"); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) { - intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true); - } - Intent pickIntent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI); - Intent chooserIntent = Intent.createChooser(intent, getString(R.string.toot_select_image)); - chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, new Intent[]{pickIntent}); - startActivityForResult(chooserIntent, PICK_IMAGE); - } - - } - }); - - - TextWatcher textWatcher = initializeTextWatcher(getApplicationContext(), social, toot_content, toot_space_left, pp_actionBar, pp_progress, PixelfedComposeActivity.this, PixelfedComposeActivity.this, PixelfedComposeActivity.this); - toot_content.addTextChangedListener(textWatcher); - - - if (scheduledstatus != null) - restoreServerSchedule(scheduledstatus.getStatus()); - - if (restored != -1) { - restoreToot(restored); - } - - toot_space_left.setText(String.valueOf(countLength(social, toot_content))); - - LocalBroadcastManager.getInstance(this) - .registerReceiver(imageReceiver, - new IntentFilter(Helper.INTENT_SEND_MODIFIED_IMAGE)); - - uploadReceiver = new UploadServiceSingleBroadcastReceiver(this); - uploadReceiver.register(this); - - LocalBroadcastManager.getInstance(this) - .registerReceiver(add_new_media, - new IntentFilter(Helper.INTENT_ADD_UPLOADED_MEDIA)); - - } + }; public static TextWatcher initializeTextWatcher(Context context, UpdateAccountInfoAsyncTask.SOCIAL social, - MastalabAutoCompleteTextView toot_content,TextView toot_space_left, + MastalabAutoCompleteTextView toot_content, TextView toot_space_left, ImageView pp_actionBar, ProgressBar pp_progress, OnRetrieveSearchInterface listener, OnRetrieveSearcAccountshInterface listenerAccount, OnRetrieveEmojiInterface listenerEmoji ) { @@ -707,11 +386,11 @@ public class PixelfedComposeActivity extends BaseActivity implements UploadStatu autocomplete = true; return; } - String[] searchInArray =(s.toString().substring(currentCursorPosition[0] - searchLength[0], currentCursorPosition[0])).split("\\s"); - if( searchInArray.length < 1){ + String[] searchInArray = (s.toString().substring(currentCursorPosition[0] - searchLength[0], currentCursorPosition[0])).split("\\s"); + if (searchInArray.length < 1) { return; } - String searchIn = searchInArray[searchInArray.length-1]; + String searchIn = searchInArray[searchInArray.length - 1]; Matcher m, mt; m = sPattern.matcher(searchIn); if (m.matches()) { @@ -753,34 +432,444 @@ public class PixelfedComposeActivity extends BaseActivity implements UploadStatu return textw; } + static private void upload(Activity activity, Uri inUri, String fname, UploadServiceSingleBroadcastReceiver uploadReceiver) { + String uploadId = UUID.randomUUID().toString(); + if (uploadReceiver != null) { + uploadReceiver.setUploadID(uploadId); + } + Uri uri; + InputStream tempInput = null; + FileOutputStream tempOut = null; + String filename = inUri.toString().substring(inUri.toString().lastIndexOf("/")); + int suffixPosition = filename.lastIndexOf("."); + String suffix = ""; + if (suffixPosition > 0) suffix = filename.substring(suffixPosition); + try { + File file; + tempInput = activity.getContentResolver().openInputStream(inUri); + if (fname.startsWith("fedilabins_")) { + file = File.createTempFile("fedilabins_randomTemp1", suffix, activity.getCacheDir()); + } else { + file = File.createTempFile("randomTemp1", suffix, activity.getCacheDir()); + } - private BroadcastReceiver imageReceiver = new BroadcastReceiver() { - @Override - public void onReceive(Context context, Intent intent) { - String imgpath = intent.getStringExtra("imgpath"); - if (imgpath != null) { - prepareUpload(PixelfedComposeActivity.this, Uri.fromFile(new File(imgpath)), null, uploadReceiver); + filesMap.put(file.getAbsolutePath(), inUri); + tempOut = new FileOutputStream(file.getAbsoluteFile()); + byte[] buff = new byte[1024]; + int read; + assert tempInput != null; + while ((read = tempInput.read(buff)) > 0) { + tempOut.write(buff, 0, read); + } + if (BuildConfig.DONATIONS) { + uri = FileProvider.getUriForFile(activity, + "fr.gouv.etalab.mastodon.fileProvider", + file); + } else { + uri = FileProvider.getUriForFile(activity, + "app.fedilab.android.fileProvider", + file); + } + tempInput.close(); + tempOut.close(); + } catch (IOException e) { + e.printStackTrace(); + uri = inUri; + } finally { + IOUtils.closeQuietly(tempInput); + IOUtils.closeQuietly(tempOut); + } + + try { + final String fileName = FileNameCleaner.cleanFileName(fname); + SharedPreferences sharedpreferences = activity.getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE); + String scheme = sharedpreferences.getString(Helper.SET_ONION_SCHEME + Helper.getLiveInstance(activity), "https"); + String token = sharedpreferences.getString(Helper.PREF_KEY_OAUTH_TOKEN, null); + int maxUploadRetryTimes = sharedpreferences.getInt(Helper.MAX_UPLOAD_IMG_RETRY_TIMES, 3); + String url = scheme + "://" + Helper.getLiveInstance(activity) + "/api/v1/media"; + UploadNotificationConfig uploadConfig = new UploadNotificationConfig(); + uploadConfig + .setClearOnActionForAllStatuses(true); + uploadConfig.getProgress().message = activity.getString(R.string.uploading); + uploadConfig.getCompleted().autoClear = true; + MultipartUploadRequest request = new MultipartUploadRequest(activity, uploadId, url); + request.addHeader("Authorization", "Bearer " + token); + request.setNotificationConfig(uploadConfig); + request.addFileToUpload(uri.toString().replace("file://", ""), "file"); + request.addParameter("filename", fileName).setMaxRetries(maxUploadRetryTimes) + .startUpload(); + } catch (MalformedURLException e) { + e.printStackTrace(); + } catch (FileNotFoundException e) { + e.printStackTrace(); + } + } + + public static int countLength(UpdateAccountInfoAsyncTask.SOCIAL social, MastalabAutoCompleteTextView toot_content) { + if (toot_content == null) { + return -1; + } + String content = toot_content.getText().toString(); + String contentCount = content; + if (social == UpdateAccountInfoAsyncTask.SOCIAL.MASTODON) { + contentCount = contentCount.replaceAll("(^|[^/\\w])@(([a-z0-9_]+)@[a-z0-9.\\-]+[a-z0-9]+)", "$1@$3"); + Matcher matcherALink = Patterns.WEB_URL.matcher(contentCount); + while (matcherALink.find()) { + final String url = matcherALink.group(1); + assert url != null; + contentCount = contentCount.replace(url, "abcdefghijklmnopkrstuvw"); } } - }; - private BroadcastReceiver add_new_media = new BroadcastReceiver() { - @Override - public void onReceive(Context context, Intent intent) { + return contentCount.length() - countWithEmoji(content); + } - JSONObject response = null; - ArrayList successfullyUploadedFiles = null; - try { - response = new JSONObject(intent.getStringExtra("response")); - } catch (JSONException e) { - e.printStackTrace(); - } - successfullyUploadedFiles = intent.getStringArrayListExtra("uploadInfo"); - addNewMedia(response, successfullyUploadedFiles); + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + SharedPreferences sharedpreferences = getSharedPreferences(Helper.APP_PREFS, MODE_PRIVATE); + userId = sharedpreferences.getString(Helper.PREF_KEY_ID, null); + instance = sharedpreferences.getString(Helper.PREF_INSTANCE, Helper.getLiveInstance(getApplicationContext())); + final int theme = sharedpreferences.getInt(Helper.SET_THEME, Helper.THEME_DARK); + switch (theme) { + case Helper.THEME_LIGHT: + setTheme(R.style.AppTheme_Fedilab); + break; + case Helper.THEME_DARK: + setTheme(R.style.AppThemeDark); + break; + case Helper.THEME_BLACK: + setTheme(R.style.AppThemeBlack); + break; + default: + setTheme(R.style.AppThemeDark); } - }; + if (theme == Helper.THEME_DARK) { + style = R.style.DialogDark; + } else if (theme == Helper.THEME_BLACK) { + style = R.style.DialogBlack; + } else { + style = R.style.Dialog; + } + filesMap = new HashMap<>(); + social = MainActivity.social; + autocomplete = false; + setContentView(R.layout.activity_pixelfed_compose); + ActionBar actionBar = getSupportActionBar(); + if (actionBar != null) { + actionBar.setBackgroundDrawable(new ColorDrawable(ContextCompat.getColor(PixelfedComposeActivity.this, R.color.cyanea_primary))); + LayoutInflater inflater = (LayoutInflater) this.getSystemService(LAYOUT_INFLATER_SERVICE); + assert inflater != null; + View view = inflater.inflate(R.layout.toot_action_bar, new LinearLayout(getApplicationContext()), false); + actionBar.setCustomView(view, new ActionBar.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); + actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM); + ImageView close_toot = actionBar.getCustomView().findViewById(R.id.close_toot); + + close_toot.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE); + assert inputMethodManager != null; + inputMethodManager.hideSoftInputFromWindow(toot_content.getWindowToken(), 0); + boolean storeToot = sharedpreferences.getBoolean(Helper.SET_AUTO_STORE, true); + if (!storeToot) { + if (toot_content.getText().toString().trim().length() == 0 && (attachments == null || attachments.size() < 1)) { + finish(); + } else if (initialContent.trim().equals(toot_content.getText().toString().trim())) { + finish(); + } else { + AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(PixelfedComposeActivity.this, style); + dialogBuilder.setMessage(R.string.save_draft); + dialogBuilder.setPositiveButton(R.string.validate, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int id) { + if (accountReply == null) { + storeToot(true, false); + } else { + storeToot(false, false); + } + dialog.dismiss(); + finish(); + } + }); + dialogBuilder.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int id) { + dialog.dismiss(); + finish(); + } + }); + AlertDialog alertDialog = dialogBuilder.create(); + alertDialog.setCancelable(false); + alertDialog.show(); + } + + } else { + finish(); + } + } + }); + title = actionBar.getCustomView().findViewById(R.id.toolbar_title); + pp_actionBar = actionBar.getCustomView().findViewById(R.id.pp_actionBar); + pp_progress = actionBar.getCustomView().findViewById(R.id.pp_progress); + + } + + //By default the toot is not restored so the id -1 is defined + currentToId = -1; + restoredScheduled = false; + toot_it = findViewById(R.id.toot_it); + attachments = new ArrayList<>(); + imageSlider = findViewById(R.id.imageSlider); + sliderAdapter = new SliderAdapter(new WeakReference<>(PixelfedComposeActivity.this), true, attachments); + imageSlider.setIndicatorAnimation(IndicatorAnimations.WORM); + imageSlider.setSliderTransformAnimation(SliderAnimations.SIMPLETRANSFORMATION); + imageSlider.setSliderAdapter(sliderAdapter); + upload_media = findViewById(R.id.upload_media); + toot_space_left = findViewById(R.id.toot_space_left); + toot_visibility = findViewById(R.id.toot_visibility); + pickup_picture = findViewById(R.id.pickup_picture); + toot_content = findViewById(R.id.toot_content); + int newInputType = toot_content.getInputType() & (toot_content.getInputType() ^ InputType.TYPE_TEXT_FLAG_AUTO_COMPLETE); + toot_content.setInputType(newInputType); + + + //There is no media the button is hidden + upload_media.setVisibility(View.INVISIBLE); + toot_sensitive = findViewById(R.id.toot_sensitive); + LinearLayout drawer_layout = findViewById(R.id.drawer_layout); + ImageButton toot_emoji = findViewById(R.id.toot_emoji); + + isScheduled = false; + if (sharedpreferences.getBoolean(Helper.SET_DISPLAY_EMOJI, true)) { + final EmojiPopup emojiPopup = EmojiPopup.Builder.fromRootView(drawer_layout).build(toot_content); + + toot_emoji.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + emojiPopup.toggle(); // Toggles visibility of the Popup. + } + }); + } else { + toot_emoji.setVisibility(View.GONE); + } + + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); + int iconColor = prefs.getInt("theme_icons_color", -1); + if (iconColor != -1) { + Helper.changeDrawableColor(getApplicationContext(), toot_visibility, iconColor); + Helper.changeDrawableColor(getApplicationContext(), toot_emoji, iconColor); + toot_sensitive.setButtonTintList(ColorStateList.valueOf(iconColor)); + toot_sensitive.setTextColor(iconColor); + } + + } + Bundle b = getIntent().getExtras(); + ArrayList sharedUri = new ArrayList<>(); + SQLiteDatabase db = Sqlite.getInstance(getApplicationContext(), Sqlite.DB_NAME, null, Sqlite.DB_VERSION).open(); + restored = -1; + if (b != null) { + scheduledstatus = b.getParcelable("storedStatus"); + String accountReplyToken = b.getString("accountReplyToken", null); + accountReply = null; + if (accountReplyToken != null) { + String[] val = accountReplyToken.split("\\|"); + if (val.length == 2) { + accountReply = new AccountDAO(getApplicationContext(), db).getUniqAccount(val[0], val[1]); + } + } + removed = b.getBoolean("removed"); + visibility = b.getString("visibility", null); + restoredScheduled = b.getBoolean("restoredScheduled", false); + // ACTION_SEND route + if (b.getInt("uriNumberMast", 0) == 1) { + Uri fileUri = b.getParcelable("sharedUri"); + if (fileUri != null) { + sharedUri.add(fileUri); + } + } + // ACTION_SEND_MULTIPLE route + else if (b.getInt("uriNumberMast", 0) > 1) { + ArrayList fileUri = b.getParcelableArrayList("sharedUri"); + + if (fileUri != null) { + sharedUri.addAll(fileUri); + } + } + restored = b.getLong("restored", -1); + } + if (scheduledstatus != null) + toot_it.setText(R.string.modify); + if (restoredScheduled) { + toot_it.setVisibility(View.GONE); + invalidateOptionsMenu(); + } + String userIdReply, instanceReply; + if (accountReply == null) { + userIdReply = sharedpreferences.getString(Helper.PREF_KEY_ID, null); + instanceReply = sharedpreferences.getString(Helper.PREF_INSTANCE, null); + } else { + userIdReply = accountReply.getId(); + instanceReply = accountReply.getInstance(); + } + if (accountReply == null) + account = new AccountDAO(getApplicationContext(), db).getUniqAccount(userIdReply, instanceReply); + else + account = accountReply; + + max_media_count = 4; + + setTitle(R.string.compose); + toot_content.requestFocus(); + + + Helper.loadGiF(getApplicationContext(), account.getAvatar(), pp_actionBar); + + + if (visibility == null) { + String defaultVisibility = account.isLocked() ? "private" : "public"; + visibility = sharedpreferences.getString(Helper.SET_TOOT_VISIBILITY + "@" + account.getAcct() + "@" + account.getInstance(), defaultVisibility); + } + switch (visibility) { + case "public": + toot_visibility.setImageResource(R.drawable.ic_public_toot); + break; + case "unlisted": + toot_visibility.setImageResource(R.drawable.ic_lock_open_toot); + break; + case "private": + toot_visibility.setImageResource(R.drawable.ic_lock_outline_toot); + break; + case "direct": + toot_visibility.setImageResource(R.drawable.ic_mail_outline_toot); + break; + } + + toot_sensitive.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { + @Override + public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { + isSensitive = isChecked; + } + }); + + + toot_space_left.setText(String.valueOf(countLength(social, toot_content))); + + + toot_visibility.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + tootVisibilityDialog(); + } + }); + + toot_it.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + sendToot(null); + } + }); + + + pickup_picture.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + + if (ContextCompat.checkSelfPermission(PixelfedComposeActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE) != + PackageManager.PERMISSION_GRANTED) { + ActivityCompat.requestPermissions(PixelfedComposeActivity.this, + new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, + MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE); + return; + } + Intent intent; + intent = new Intent(Intent.ACTION_GET_CONTENT); + intent.addCategory(Intent.CATEGORY_OPENABLE); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { + intent.setType("*/*"); + intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true); + String[] mimetypes = {"image/*", "video/*", "audio/mpeg", "audio/opus", "audio/flac", "audio/wav", "audio/ogg"}; + intent.putExtra(Intent.EXTRA_MIME_TYPES, mimetypes); + startActivityForResult(intent, PICK_IMAGE); + } else { + intent.setType("image/* video/* audio/mpeg audio/opus audio/flac audio/wav audio/ogg"); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) { + intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true); + } + Intent pickIntent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI); + Intent chooserIntent = Intent.createChooser(intent, getString(R.string.toot_select_image)); + chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, new Intent[]{pickIntent}); + startActivityForResult(chooserIntent, PICK_IMAGE); + } + + } + }); + + upload_media.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + + if (ContextCompat.checkSelfPermission(PixelfedComposeActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE) != + PackageManager.PERMISSION_GRANTED) { + ActivityCompat.requestPermissions(PixelfedComposeActivity.this, + new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, + MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE); + return; + } + Intent intent; + intent = new Intent(Intent.ACTION_GET_CONTENT); + intent.addCategory(Intent.CATEGORY_OPENABLE); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { + intent.setType("*/*"); + intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true); + String[] mimetypes = {"image/*", "video/*", "audio/mpeg", "audio/opus", "audio/flac", "audio/wav", "audio/ogg"}; + intent.putExtra(Intent.EXTRA_MIME_TYPES, mimetypes); + startActivityForResult(intent, PICK_IMAGE); + } else { + intent.setType("image/* video/* audio/mpeg audio/opus audio/flac audio/wav audio/ogg"); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) { + intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true); + } + Intent pickIntent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI); + Intent chooserIntent = Intent.createChooser(intent, getString(R.string.toot_select_image)); + chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, new Intent[]{pickIntent}); + startActivityForResult(chooserIntent, PICK_IMAGE); + } + + } + }); + + + TextWatcher textWatcher = initializeTextWatcher(getApplicationContext(), social, toot_content, toot_space_left, pp_actionBar, pp_progress, PixelfedComposeActivity.this, PixelfedComposeActivity.this, PixelfedComposeActivity.this); + toot_content.addTextChangedListener(textWatcher); + + + if (scheduledstatus != null) + restoreServerSchedule(scheduledstatus.getStatus()); + + if (restored != -1) { + restoreToot(restored); + } + + toot_space_left.setText(String.valueOf(countLength(social, toot_content))); + + LocalBroadcastManager.getInstance(this) + .registerReceiver(imageReceiver, + new IntentFilter(Helper.INTENT_SEND_MODIFIED_IMAGE)); + + uploadReceiver = new UploadServiceSingleBroadcastReceiver(this); + uploadReceiver.register(this); + + LocalBroadcastManager.getInstance(this) + .registerReceiver(add_new_media, + new IntentFilter(Helper.INTENT_ADD_UPLOADED_MEDIA)); + + } + private void addNewMedia(JSONObject response, ArrayList successfullyUploadedFiles) { Attachment attachment; @@ -794,7 +883,7 @@ public class PixelfedComposeActivity extends BaseActivity implements UploadStatu } index++; } - if( attachment.getPreview_url().contains("no-preview.png") && successfullyUploadedFiles != null && successfullyUploadedFiles.size() > 0){ + if (attachment.getPreview_url().contains("no-preview.png") && successfullyUploadedFiles != null && successfullyUploadedFiles.size() > 0) { attachment.setPreview_url(successfullyUploadedFiles.get(0)); } if (!alreadyAdded) { @@ -820,7 +909,7 @@ public class PixelfedComposeActivity extends BaseActivity implements UploadStatu @Override public void onRequestPermissionsResult(int requestCode, - @NonNull String permissions[], @NonNull int[] grantResults) { + @NonNull String[] permissions, @NonNull int[] grantResults) { if (requestCode == MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE) {// If request is cancelled, the result arrays are empty. if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { @@ -838,7 +927,6 @@ public class PixelfedComposeActivity extends BaseActivity implements UploadStatu mToast.show(); } - // Handles uploading shared images public void uploadSharedImage(ArrayList uri) { if (!uri.isEmpty()) { @@ -864,10 +952,6 @@ public class PixelfedComposeActivity extends BaseActivity implements UploadStatu } } - String mCurrentPhotoPath; - File photoFile = null; - public static Uri photoFileUri = null; - private void dispatchTakePictureIntent() { Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); // Ensure that there's a camera activity to handle the intent @@ -895,7 +979,6 @@ public class PixelfedComposeActivity extends BaseActivity implements UploadStatu } } - private File createImageFile() throws IOException { // Create an image file name String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.ENGLISH).format(new Date()); @@ -974,7 +1057,6 @@ public class PixelfedComposeActivity extends BaseActivity implements UploadStatu } } - private void prepareUpload(Activity activity, Uri uri, String filename, UploadServiceSingleBroadcastReceiver uploadReceiver) { if (uploadReceiver == null) { uploadReceiver = new UploadServiceSingleBroadcastReceiver(PixelfedComposeActivity.this); @@ -983,138 +1065,6 @@ public class PixelfedComposeActivity extends BaseActivity implements UploadStatu new asyncPicture(activity, social, uri, filename, uploadReceiver).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); } - static class asyncPicture extends AsyncTask { - - String commpressedFilePath = null; - WeakReference activityWeakReference; - Uri uriFile; - boolean error = false; - UploadServiceSingleBroadcastReceiver uploadReceiver; - String filename; - UpdateAccountInfoAsyncTask.SOCIAL social; - - asyncPicture(Activity activity, UpdateAccountInfoAsyncTask.SOCIAL social, Uri uri, String filename, UploadServiceSingleBroadcastReceiver uploadReceiver) { - this.activityWeakReference = new WeakReference<>(activity); - this.uriFile = uri; - this.uploadReceiver = uploadReceiver; - this.filename = filename; - this.social = social; - } - - @Override - protected void onPreExecute() { - if (uriFile == null) { - Toasty.error(activityWeakReference.get(), activityWeakReference.get().getString(R.string.toast_error), Toast.LENGTH_SHORT).show(); - error = true; - } - activityWeakReference.get().findViewById(R.id.compression_loader).setVisibility(View.VISIBLE); - - } - - - @Override - protected Void doInBackground(Void... voids) { - if (error) { - return null; - } - commpressedFilePath = Helper.compressImagePath(activityWeakReference.get(), uriFile); - return null; - } - - @Override - protected void onPostExecute(Void result) { - activityWeakReference.get().findViewById(R.id.compression_loader).setVisibility(View.GONE); - if (!error) { - if( commpressedFilePath != null){ - uriFile = Uri.fromFile(new File(commpressedFilePath)); - } - Button upload_media = this.activityWeakReference.get().findViewById(R.id.upload_media); - Button toot_it = this.activityWeakReference.get().findViewById(R.id.toot_it); - upload_media.setEnabled(false); - toot_it.setEnabled(false); - if (filename == null) { - filename = Helper.getFileName(this.activityWeakReference.get(), uriFile); - } - filesMap.put(filename, uriFile); - upload(activityWeakReference.get(), uriFile, filename, uploadReceiver); - } - } - } - - - static private void upload(Activity activity, Uri inUri, String fname, UploadServiceSingleBroadcastReceiver uploadReceiver) { - String uploadId = UUID.randomUUID().toString(); - if (uploadReceiver != null) { - uploadReceiver.setUploadID(uploadId); - } - Uri uri; - InputStream tempInput = null; - FileOutputStream tempOut = null; - String filename = inUri.toString().substring(inUri.toString().lastIndexOf("/")); - int suffixPosition = filename.lastIndexOf("."); - String suffix = ""; - if (suffixPosition > 0) suffix = filename.substring(suffixPosition); - try { - File file; - tempInput = activity.getContentResolver().openInputStream(inUri); - if (fname.startsWith("fedilabins_")) { - file = File.createTempFile("fedilabins_randomTemp1", suffix, activity.getCacheDir()); - } else { - file = File.createTempFile("randomTemp1", suffix, activity.getCacheDir()); - } - - filesMap.put(file.getAbsolutePath(), inUri); - tempOut = new FileOutputStream(file.getAbsoluteFile()); - byte[] buff = new byte[1024]; - int read; - assert tempInput != null; - while ((read = tempInput.read(buff)) > 0) { - tempOut.write(buff, 0, read); - } - if (BuildConfig.DONATIONS) { - uri = FileProvider.getUriForFile(activity, - "fr.gouv.etalab.mastodon.fileProvider", - file); - } else { - uri = FileProvider.getUriForFile(activity, - "app.fedilab.android.fileProvider", - file); - } - tempInput.close(); - tempOut.close(); - } catch (IOException e) { - e.printStackTrace(); - uri = inUri; - } finally { - IOUtils.closeQuietly(tempInput); - IOUtils.closeQuietly(tempOut); - } - - try { - final String fileName = FileNameCleaner.cleanFileName(fname); - SharedPreferences sharedpreferences = activity.getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE); - String scheme = sharedpreferences.getString(Helper.SET_ONION_SCHEME + Helper.getLiveInstance(activity), "https"); - String token = sharedpreferences.getString(Helper.PREF_KEY_OAUTH_TOKEN, null); - int maxUploadRetryTimes = sharedpreferences.getInt(Helper.MAX_UPLOAD_IMG_RETRY_TIMES, 3); - String url = scheme + "://" + Helper.getLiveInstance(activity) + "/api/v1/media"; - UploadNotificationConfig uploadConfig = new UploadNotificationConfig(); - uploadConfig - .setClearOnActionForAllStatuses(true); - uploadConfig.getProgress().message = activity.getString(R.string.uploading); - uploadConfig.getCompleted().autoClear = true; - MultipartUploadRequest request = new MultipartUploadRequest(activity, uploadId, url); - request.addHeader("Authorization", "Bearer " + token); - request.setNotificationConfig(uploadConfig); - request.addFileToUpload(uri.toString().replace("file://", ""), "file"); - request.addParameter("filename", fileName).setMaxRetries(maxUploadRetryTimes) - .startUpload(); - } catch (MalformedURLException e) { - e.printStackTrace(); - } catch (FileNotFoundException e) { - e.printStackTrace(); - } - } - @Override public void onPostAction(int statusCode, API.StatusAction statusAction, String userId, Error error) { if (error != null) { @@ -1160,7 +1110,6 @@ public class PixelfedComposeActivity extends BaseActivity implements UploadStatu } - @Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); @@ -1435,8 +1384,6 @@ public class PixelfedComposeActivity extends BaseActivity implements UploadStatu } - - private void tootVisibilityDialog() { AlertDialog.Builder dialog = new AlertDialog.Builder(PixelfedComposeActivity.this, style); @@ -1643,7 +1590,7 @@ public class PixelfedComposeActivity extends BaseActivity implements UploadStatu deltaSearch = oldContent.substring(currentCursorPosition - searchLength, currentCursorPosition); else { if (currentCursorPosition >= oldContent.length()) - deltaSearch = oldContent.substring(currentCursorPosition - searchLength, oldContent.length()); + deltaSearch = oldContent.substring(currentCursorPosition - searchLength); } if (!search.equals("")) @@ -1653,7 +1600,7 @@ public class PixelfedComposeActivity extends BaseActivity implements UploadStatu newContent += "@" + account.getAcct() + " "; int newPosition = newContent.length(); if (currentCursorPosition < oldContent.length()) - newContent += oldContent.substring(currentCursorPosition, oldContent.length()); + newContent += oldContent.substring(currentCursorPosition); toot_content.setText(newContent); toot_space_left.setText(String.valueOf(countLength(social, toot_content))); toot_content.setSelection(newPosition); @@ -1710,7 +1657,7 @@ public class PixelfedComposeActivity extends BaseActivity implements UploadStatu deltaSearch = oldContent.substring(currentCursorPosition - searchLength, currentCursorPosition); else { if (currentCursorPosition >= oldContent.length()) - deltaSearch = oldContent.substring(currentCursorPosition - searchLength, oldContent.length()); + deltaSearch = oldContent.substring(currentCursorPosition - searchLength); } if (!search.equals("")) @@ -1720,7 +1667,7 @@ public class PixelfedComposeActivity extends BaseActivity implements UploadStatu newContent += ":" + shortcode + ": "; int newPosition = newContent.length(); if (currentCursorPosition < oldContent.length()) - newContent += oldContent.substring(currentCursorPosition, oldContent.length()); + newContent += oldContent.substring(currentCursorPosition); toot_content.setText(newContent); toot_space_left.setText(String.valueOf(countLength(social, toot_content))); toot_content.setSelection(newPosition); @@ -1773,7 +1720,7 @@ public class PixelfedComposeActivity extends BaseActivity implements UploadStatu deltaSearch = oldContent.substring(currentCursorPosition - searchLength, currentCursorPosition); else { if (currentCursorPosition >= oldContent.length()) - deltaSearch = oldContent.substring(currentCursorPosition - searchLength, oldContent.length()); + deltaSearch = oldContent.substring(currentCursorPosition - searchLength); } if (!search.equals("")) @@ -1783,7 +1730,7 @@ public class PixelfedComposeActivity extends BaseActivity implements UploadStatu newContent += "#" + tag + " "; int newPosition = newContent.length(); if (currentCursorPosition < oldContent.length()) - newContent += oldContent.substring(currentCursorPosition, oldContent.length()); + newContent += oldContent.substring(currentCursorPosition); toot_content.setText(newContent); toot_space_left.setText(String.valueOf(countLength(social, toot_content))); toot_content.setSelection(newPosition); @@ -1888,9 +1835,9 @@ public class PixelfedComposeActivity extends BaseActivity implements UploadStatu } - public void redraw(){ + public void redraw() { int position = imageSlider.getCurrentPagePosition(); - if( position > attachments.size()){ + if (position > attachments.size()) { position = attachments.size(); } sliderAdapter = new SliderAdapter(new WeakReference<>(PixelfedComposeActivity.this), true, attachments); @@ -2004,7 +1951,7 @@ public class PixelfedComposeActivity extends BaseActivity implements UploadStatu String currentContent; currentContent = toot_content.getText().toString().trim(); if (!forced) { - if (currentContent.length() == 0 && (attachments == null || attachments.size() < 1) ) + if (currentContent.length() == 0 && (attachments == null || attachments.size() < 1)) return; if (initialContent == null || initialContent.trim().equals(currentContent)) return; @@ -2038,7 +1985,6 @@ public class PixelfedComposeActivity extends BaseActivity implements UploadStatu } - @Override public void onStart() { super.onStart(); @@ -2051,24 +1997,62 @@ public class PixelfedComposeActivity extends BaseActivity implements UploadStatu active = false; } + static class asyncPicture extends AsyncTask { - public static int countLength(UpdateAccountInfoAsyncTask.SOCIAL social, MastalabAutoCompleteTextView toot_content) { - if (toot_content == null) { - return -1; + String commpressedFilePath = null; + WeakReference activityWeakReference; + Uri uriFile; + boolean error = false; + UploadServiceSingleBroadcastReceiver uploadReceiver; + String filename; + UpdateAccountInfoAsyncTask.SOCIAL social; + + asyncPicture(Activity activity, UpdateAccountInfoAsyncTask.SOCIAL social, Uri uri, String filename, UploadServiceSingleBroadcastReceiver uploadReceiver) { + this.activityWeakReference = new WeakReference<>(activity); + this.uriFile = uri; + this.uploadReceiver = uploadReceiver; + this.filename = filename; + this.social = social; } - String content = toot_content.getText().toString(); - String contentCount = content; - if (social == UpdateAccountInfoAsyncTask.SOCIAL.MASTODON) { - contentCount = contentCount.replaceAll("(^|[^/\\w])@(([a-z0-9_]+)@[a-z0-9.\\-]+[a-z0-9]+)", "$1@$3"); - Matcher matcherALink = Patterns.WEB_URL.matcher(contentCount); - while (matcherALink.find()) { - final String url = matcherALink.group(1); - assert url != null; - contentCount = contentCount.replace(url, "abcdefghijklmnopkrstuvw"); + + @Override + protected void onPreExecute() { + if (uriFile == null) { + Toasty.error(activityWeakReference.get(), activityWeakReference.get().getString(R.string.toast_error), Toast.LENGTH_SHORT).show(); + error = true; + } + activityWeakReference.get().findViewById(R.id.compression_loader).setVisibility(View.VISIBLE); + + } + + + @Override + protected Void doInBackground(Void... voids) { + if (error) { + return null; + } + commpressedFilePath = Helper.compressImagePath(activityWeakReference.get(), uriFile); + return null; + } + + @Override + protected void onPostExecute(Void result) { + activityWeakReference.get().findViewById(R.id.compression_loader).setVisibility(View.GONE); + if (!error) { + if (commpressedFilePath != null) { + uriFile = Uri.fromFile(new File(commpressedFilePath)); + } + Button upload_media = this.activityWeakReference.get().findViewById(R.id.upload_media); + Button toot_it = this.activityWeakReference.get().findViewById(R.id.toot_it); + upload_media.setEnabled(false); + toot_it.setEnabled(false); + if (filename == null) { + filename = Helper.getFileName(this.activityWeakReference.get(), uriFile); + } + filesMap.put(filename, uriFile); + upload(activityWeakReference.get(), uriFile, filename, uploadReceiver); } } - - return contentCount.length() - countWithEmoji(content); } } diff --git a/app/src/main/java/app/fedilab/android/activities/PlaylistsActivity.java b/app/src/main/java/app/fedilab/android/activities/PlaylistsActivity.java index 5fcb3ba8d..322bfa79d 100644 --- a/app/src/main/java/app/fedilab/android/activities/PlaylistsActivity.java +++ b/app/src/main/java/app/fedilab/android/activities/PlaylistsActivity.java @@ -14,21 +14,11 @@ * see . */ package app.fedilab.android.activities; -import android.annotation.SuppressLint; import android.content.Context; import android.content.SharedPreferences; import android.graphics.drawable.ColorDrawable; import android.os.AsyncTask; import android.os.Bundle; - -import androidx.annotation.NonNull; -import androidx.core.content.ContextCompat; -import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; -import androidx.appcompat.app.ActionBar; -import androidx.recyclerview.widget.LinearLayoutManager; -import androidx.recyclerview.widget.RecyclerView; -import androidx.appcompat.widget.Toolbar; - import android.view.LayoutInflater; import android.view.MenuItem; import android.view.View; @@ -39,6 +29,14 @@ import android.widget.RelativeLayout; import android.widget.TextView; import android.widget.Toast; +import androidx.annotation.NonNull; +import androidx.appcompat.app.ActionBar; +import androidx.appcompat.widget.Toolbar; +import androidx.core.content.ContextCompat; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; +import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; + import java.util.ArrayList; import java.util.List; @@ -63,6 +61,7 @@ import static app.fedilab.android.asynctasks.ManagePlaylistsAsyncTask.action.GET public class PlaylistsActivity extends BaseActivity implements OnPlaylistActionInterface { + LinearLayoutManager mLayoutManager; private RelativeLayout mainLoader, nextElementLoader, textviewNoAction; private SwipeRefreshLayout swipeRefreshLayout; private boolean swiped; @@ -72,8 +71,6 @@ public class PlaylistsActivity extends BaseActivity implements OnPlaylistActionI private boolean firstLoad; private boolean flag_loading; private PeertubeAdapter peertubeAdapter; - LinearLayoutManager mLayoutManager; - @Override protected void onCreate(Bundle savedInstanceState) { diff --git a/app/src/main/java/app/fedilab/android/activities/PrivacyActivity.java b/app/src/main/java/app/fedilab/android/activities/PrivacyActivity.java index 026fe01ca..2cfa8cbe9 100644 --- a/app/src/main/java/app/fedilab/android/activities/PrivacyActivity.java +++ b/app/src/main/java/app/fedilab/android/activities/PrivacyActivity.java @@ -15,15 +15,9 @@ package app.fedilab.android.activities; -import android.annotation.SuppressLint; import android.content.SharedPreferences; import android.graphics.drawable.ColorDrawable; import android.os.Bundle; - -import androidx.appcompat.app.ActionBar; -import androidx.appcompat.widget.Toolbar; -import androidx.core.content.ContextCompat; - import android.view.LayoutInflater; import android.view.MenuItem; import android.view.View; @@ -32,8 +26,11 @@ import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; -import app.fedilab.android.helper.Helper; +import androidx.appcompat.app.ActionBar; +import androidx.core.content.ContextCompat; + import app.fedilab.android.R; +import app.fedilab.android.helper.Helper; /** diff --git a/app/src/main/java/app/fedilab/android/activities/ProxyActivity.java b/app/src/main/java/app/fedilab/android/activities/ProxyActivity.java index 2e7faab59..133b128f1 100644 --- a/app/src/main/java/app/fedilab/android/activities/ProxyActivity.java +++ b/app/src/main/java/app/fedilab/android/activities/ProxyActivity.java @@ -18,13 +18,9 @@ package app.fedilab.android.activities; import android.content.Context; import android.content.SharedPreferences; import android.os.Bundle; - -import androidx.core.content.ContextCompat; - import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; -import android.view.Window; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.Button; @@ -32,8 +28,8 @@ import android.widget.CheckBox; import android.widget.EditText; import android.widget.Spinner; -import app.fedilab.android.helper.Helper; import app.fedilab.android.R; +import app.fedilab.android.helper.Helper; /** diff --git a/app/src/main/java/app/fedilab/android/activities/ReorderTimelinesActivity.java b/app/src/main/java/app/fedilab/android/activities/ReorderTimelinesActivity.java index 8e2771ff1..b4be8b172 100644 --- a/app/src/main/java/app/fedilab/android/activities/ReorderTimelinesActivity.java +++ b/app/src/main/java/app/fedilab/android/activities/ReorderTimelinesActivity.java @@ -24,15 +24,6 @@ import android.graphics.drawable.ColorDrawable; import android.os.AsyncTask; import android.os.Bundle; import android.os.Handler; - -import androidx.appcompat.app.ActionBar; -import androidx.appcompat.app.AlertDialog; -import androidx.core.content.ContextCompat; -import androidx.recyclerview.widget.LinearLayoutManager; -import androidx.recyclerview.widget.RecyclerView; -import androidx.appcompat.widget.Toolbar; -import androidx.recyclerview.widget.ItemTouchHelper; - import android.text.Editable; import android.text.InputFilter; import android.text.TextWatcher; @@ -52,6 +43,13 @@ import android.widget.RelativeLayout; import android.widget.TextView; import android.widget.Toast; +import androidx.appcompat.app.ActionBar; +import androidx.appcompat.app.AlertDialog; +import androidx.core.content.ContextCompat; +import androidx.recyclerview.widget.ItemTouchHelper; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; @@ -61,6 +59,9 @@ import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; +import app.fedilab.android.R; +import app.fedilab.android.asynctasks.ManageListsAsyncTask; +import app.fedilab.android.asynctasks.UpdateAccountInfoAsyncTask; import app.fedilab.android.client.APIResponse; import app.fedilab.android.client.Entities.ManageTimelines; import app.fedilab.android.client.Entities.RemoteInstance; @@ -70,15 +71,12 @@ import app.fedilab.android.helper.Helper; import app.fedilab.android.helper.itemtouchhelper.OnStartDragListener; import app.fedilab.android.helper.itemtouchhelper.OnUndoListener; import app.fedilab.android.helper.itemtouchhelper.SimpleItemTouchHelperCallback; +import app.fedilab.android.interfaces.OnListActionInterface; import app.fedilab.android.sqlite.InstancesDAO; import app.fedilab.android.sqlite.SearchDAO; import app.fedilab.android.sqlite.Sqlite; import app.fedilab.android.sqlite.TimelinesDAO; import es.dmoral.toasty.Toasty; -import app.fedilab.android.R; -import app.fedilab.android.asynctasks.ManageListsAsyncTask; -import app.fedilab.android.asynctasks.UpdateAccountInfoAsyncTask; -import app.fedilab.android.interfaces.OnListActionInterface; /** diff --git a/app/src/main/java/app/fedilab/android/activities/SearchResultActivity.java b/app/src/main/java/app/fedilab/android/activities/SearchResultActivity.java index 64b5d3bc1..d29516744 100644 --- a/app/src/main/java/app/fedilab/android/activities/SearchResultActivity.java +++ b/app/src/main/java/app/fedilab/android/activities/SearchResultActivity.java @@ -14,16 +14,10 @@ * see . */ package app.fedilab.android.activities; -import android.annotation.SuppressLint; import android.content.SharedPreferences; import android.graphics.drawable.ColorDrawable; import android.os.AsyncTask; import android.os.Bundle; - -import androidx.appcompat.app.ActionBar; -import androidx.appcompat.widget.Toolbar; -import androidx.core.content.ContextCompat; - import android.view.LayoutInflater; import android.view.MenuItem; import android.view.View; @@ -35,20 +29,23 @@ import android.widget.RelativeLayout; import android.widget.TextView; import android.widget.Toast; +import androidx.appcompat.app.ActionBar; +import androidx.core.content.ContextCompat; + import java.util.ArrayList; import java.util.List; +import app.fedilab.android.R; +import app.fedilab.android.asynctasks.RetrieveSearchAsyncTask; import app.fedilab.android.client.APIResponse; import app.fedilab.android.client.Entities.Account; import app.fedilab.android.client.Entities.Error; import app.fedilab.android.client.Entities.Status; import app.fedilab.android.drawers.SearchListAdapter; import app.fedilab.android.helper.Helper; -import es.dmoral.toasty.Toasty; -import app.fedilab.android.R; -import app.fedilab.android.asynctasks.RetrieveSearchAsyncTask; import app.fedilab.android.interfaces.OnRetrieveSearchInterface; import app.fedilab.android.interfaces.OnRetrieveSearchStatusInterface; +import es.dmoral.toasty.Toasty; /** @@ -141,12 +138,12 @@ public class SearchResultActivity extends BaseActivity implements OnRetrieveSear loader.setVisibility(View.GONE); if (apiResponse.getError() != null) { if (apiResponse.getError().getError() != null) { - if(apiResponse.getError().getError().length() < 100) { + if (apiResponse.getError().getError().length() < 100) { Toasty.error(getApplicationContext(), apiResponse.getError().getError(), Toast.LENGTH_LONG).show(); - }else{ - Toasty.error(getApplicationContext(), getString(R.string.long_api_error,"\ud83d\ude05"), Toast.LENGTH_LONG).show(); + } else { + Toasty.error(getApplicationContext(), getString(R.string.long_api_error, "\ud83d\ude05"), Toast.LENGTH_LONG).show(); } - }else + } else Toasty.error(getApplicationContext(), getString(R.string.toast_error), Toast.LENGTH_LONG).show(); return; } @@ -171,10 +168,10 @@ public class SearchResultActivity extends BaseActivity implements OnRetrieveSear public void onRetrieveSearchStatus(APIResponse apiResponse, Error error) { loader.setVisibility(View.GONE); if (apiResponse.getError() != null) { - if(error.getError().length() < 100) { + if (error.getError().length() < 100) { Toasty.error(getApplicationContext(), error.getError(), Toast.LENGTH_LONG).show(); - }else{ - Toasty.error(getApplicationContext(), getString(R.string.long_api_error,"\ud83d\ude05"), Toast.LENGTH_LONG).show(); + } else { + Toasty.error(getApplicationContext(), getString(R.string.long_api_error, "\ud83d\ude05"), Toast.LENGTH_LONG).show(); } return; } diff --git a/app/src/main/java/app/fedilab/android/activities/SearchResultTabActivity.java b/app/src/main/java/app/fedilab/android/activities/SearchResultTabActivity.java index 23386c1bf..10d0ba48b 100644 --- a/app/src/main/java/app/fedilab/android/activities/SearchResultTabActivity.java +++ b/app/src/main/java/app/fedilab/android/activities/SearchResultTabActivity.java @@ -18,18 +18,6 @@ package app.fedilab.android.activities; import android.content.SharedPreferences; import android.graphics.drawable.ColorDrawable; import android.os.Bundle; - -import com.google.android.material.tabs.TabLayout; - -import androidx.core.content.ContextCompat; -import androidx.fragment.app.Fragment; -import androidx.fragment.app.FragmentManager; -import androidx.fragment.app.FragmentStatePagerAdapter; -import androidx.viewpager.widget.PagerAdapter; -import androidx.viewpager.widget.ViewPager; -import androidx.appcompat.app.ActionBar; -import androidx.appcompat.widget.Toolbar; - import android.view.LayoutInflater; import android.view.MenuItem; import android.view.View; @@ -39,18 +27,26 @@ import android.widget.LinearLayout; import android.widget.TextView; import android.widget.Toast; +import androidx.appcompat.app.ActionBar; +import androidx.core.content.ContextCompat; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentStatePagerAdapter; +import androidx.viewpager.widget.PagerAdapter; +import androidx.viewpager.widget.ViewPager; + +import com.google.android.material.tabs.TabLayout; + import org.jetbrains.annotations.NotNull; -import java.util.Objects; - +import app.fedilab.android.R; +import app.fedilab.android.asynctasks.RetrieveAccountsAsyncTask; +import app.fedilab.android.asynctasks.RetrieveFeedsAsyncTask; import app.fedilab.android.fragments.DisplayAccountsFragment; import app.fedilab.android.fragments.DisplaySearchTagsFragment; import app.fedilab.android.fragments.DisplayStatusFragment; import app.fedilab.android.helper.Helper; import es.dmoral.toasty.Toasty; -import app.fedilab.android.R; -import app.fedilab.android.asynctasks.RetrieveAccountsAsyncTask; -import app.fedilab.android.asynctasks.RetrieveFeedsAsyncTask; /** diff --git a/app/src/main/java/app/fedilab/android/activities/SettingsActivity.java b/app/src/main/java/app/fedilab/android/activities/SettingsActivity.java index fe6079082..ac9ec6a78 100644 --- a/app/src/main/java/app/fedilab/android/activities/SettingsActivity.java +++ b/app/src/main/java/app/fedilab/android/activities/SettingsActivity.java @@ -23,13 +23,13 @@ import android.content.Intent; import android.content.SharedPreferences; import android.graphics.drawable.ColorDrawable; import android.os.Bundle; - import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; + import androidx.appcompat.app.ActionBar; import androidx.appcompat.app.AlertDialog; import androidx.core.content.ContextCompat; @@ -43,8 +43,6 @@ import com.google.android.material.tabs.TabLayout; import org.jetbrains.annotations.NotNull; -import java.util.Objects; - import app.fedilab.android.R; import app.fedilab.android.fragments.ColorSettingsFragment; import app.fedilab.android.fragments.ContentSettingsFragment; @@ -55,7 +53,7 @@ import app.fedilab.android.helper.Helper; * Settings activity */ -public class SettingsActivity extends BaseActivity { +public class SettingsActivity extends BaseActivity { public static boolean needRestart; @@ -91,9 +89,9 @@ public class SettingsActivity extends BaseActivity { toolbar_close.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { - if( needRestart){ + if (needRestart) { showDialog(); - }else{ + } else { finish(); } @@ -147,6 +145,7 @@ public class SettingsActivity extends BaseActivity { public void onTabUnselected(TabLayout.Tab tab) { } + @Override public void onTabReselected(TabLayout.Tab tab) { @@ -156,6 +155,43 @@ public class SettingsActivity extends BaseActivity { } + private void showDialog() { + AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(SettingsActivity.this); + dialogBuilder.setMessage(R.string.restart_message); + dialogBuilder.setTitle(R.string.apply_changes); + dialogBuilder.setPositiveButton(R.string.restart, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int id) { + Intent mStartActivity = new Intent(getApplicationContext(), MainActivity.class); + int mPendingIntentId = 123456; + PendingIntent mPendingIntent = PendingIntent.getActivity(getApplicationContext(), mPendingIntentId, mStartActivity, PendingIntent.FLAG_CANCEL_CURRENT); + AlarmManager mgr = (AlarmManager) getSystemService(Context.ALARM_SERVICE); + assert mgr != null; + mgr.set(AlarmManager.RTC, System.currentTimeMillis() + 100, mPendingIntent); + System.exit(0); + } + }); + dialogBuilder.setNegativeButton(R.string.no, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int id) { + dialog.dismiss(); + } + }); + AlertDialog alertDialog = dialogBuilder.create(); + alertDialog.setCancelable(false); + alertDialog.show(); + + needRestart = false; + } + + @Override + public void onBackPressed() { + if (needRestart) { + showDialog(); + } else { + super.onBackPressed(); + } + } private class SettingsPagerAdapter extends FragmentStatePagerAdapter { @@ -205,44 +241,4 @@ public class SettingsActivity extends BaseActivity { return 8; } } - - - private void showDialog(){ - AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(SettingsActivity.this); - dialogBuilder.setMessage(R.string.restart_message); - dialogBuilder.setTitle(R.string.apply_changes); - dialogBuilder.setPositiveButton(R.string.restart, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int id) { - Intent mStartActivity = new Intent(getApplicationContext(), MainActivity.class); - int mPendingIntentId = 123456; - PendingIntent mPendingIntent = PendingIntent.getActivity(getApplicationContext(), mPendingIntentId, mStartActivity, PendingIntent.FLAG_CANCEL_CURRENT); - AlarmManager mgr = (AlarmManager)getSystemService(Context.ALARM_SERVICE); - assert mgr != null; - mgr.set(AlarmManager.RTC, System.currentTimeMillis() + 100, mPendingIntent); - System.exit(0); - } - }); - dialogBuilder.setNegativeButton(R.string.no, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int id) { - dialog.dismiss(); - } - }); - AlertDialog alertDialog = dialogBuilder.create(); - alertDialog.setCancelable(false); - alertDialog.show(); - - needRestart = false; - } - - - @Override - public void onBackPressed() { - if( needRestart){ - showDialog(); - }else{ - super.onBackPressed(); - } - } } diff --git a/app/src/main/java/app/fedilab/android/activities/ShowAccountActivity.java b/app/src/main/java/app/fedilab/android/activities/ShowAccountActivity.java index 01b08d9c9..c6dab6d53 100644 --- a/app/src/main/java/app/fedilab/android/activities/ShowAccountActivity.java +++ b/app/src/main/java/app/fedilab/android/activities/ShowAccountActivity.java @@ -26,22 +26,6 @@ import android.graphics.drawable.Drawable; import android.os.AsyncTask; import android.os.Build; import android.os.Bundle; - -import androidx.annotation.NonNull; - -import com.google.android.exoplayer2.Timeline; -import com.google.android.material.appbar.AppBarLayout; -import com.google.android.material.tabs.TabLayout; - -import androidx.fragment.app.Fragment; -import androidx.fragment.app.FragmentManager; -import androidx.fragment.app.FragmentStatePagerAdapter; -import androidx.core.content.ContextCompat; -import androidx.viewpager.widget.PagerAdapter; -import androidx.viewpager.widget.ViewPager; -import androidx.appcompat.app.AlertDialog; -import androidx.appcompat.widget.PopupMenu; - import android.text.Spannable; import android.text.SpannableString; import android.text.Spanned; @@ -60,9 +44,21 @@ import android.widget.LinearLayout; import android.widget.TextView; import android.widget.Toast; +import androidx.annotation.NonNull; +import androidx.appcompat.app.AlertDialog; +import androidx.appcompat.widget.PopupMenu; +import androidx.core.content.ContextCompat; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentStatePagerAdapter; +import androidx.viewpager.widget.PagerAdapter; +import androidx.viewpager.widget.ViewPager; + import com.bumptech.glide.Glide; import com.bumptech.glide.request.target.SimpleTarget; import com.bumptech.glide.request.transition.Transition; +import com.google.android.material.appbar.AppBarLayout; +import com.google.android.material.tabs.TabLayout; import java.util.ArrayList; import java.util.HashMap; @@ -70,13 +66,19 @@ import java.util.Iterator; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; -import java.util.Objects; import java.util.Set; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; +import app.fedilab.android.R; import app.fedilab.android.asynctasks.ManageListsAsyncTask; +import app.fedilab.android.asynctasks.PostActionAsyncTask; +import app.fedilab.android.asynctasks.RetrieveAccountAsyncTask; +import app.fedilab.android.asynctasks.RetrieveAccountsAsyncTask; +import app.fedilab.android.asynctasks.RetrieveFeedsAsyncTask; +import app.fedilab.android.asynctasks.RetrieveRelationshipAsyncTask; +import app.fedilab.android.asynctasks.UpdateAccountInfoAsyncTask; import app.fedilab.android.client.API; import app.fedilab.android.client.APIResponse; import app.fedilab.android.client.Entities.Account; @@ -96,25 +98,18 @@ import app.fedilab.android.fragments.TabLayoutTootsFragment; import app.fedilab.android.helper.CrossActions; import app.fedilab.android.helper.Helper; import app.fedilab.android.interfaces.OnListActionInterface; -import app.fedilab.android.sqlite.AccountDAO; -import app.fedilab.android.sqlite.InstancesDAO; -import app.fedilab.android.sqlite.NotesDAO; -import app.fedilab.android.sqlite.Sqlite; -import app.fedilab.android.sqlite.TempMuteDAO; -import es.dmoral.toasty.Toasty; -import app.fedilab.android.R; -import app.fedilab.android.asynctasks.PostActionAsyncTask; -import app.fedilab.android.asynctasks.RetrieveAccountAsyncTask; -import app.fedilab.android.asynctasks.RetrieveAccountsAsyncTask; -import app.fedilab.android.asynctasks.RetrieveFeedsAsyncTask; -import app.fedilab.android.asynctasks.RetrieveRelationshipAsyncTask; -import app.fedilab.android.asynctasks.UpdateAccountInfoAsyncTask; import app.fedilab.android.interfaces.OnPostActionInterface; import app.fedilab.android.interfaces.OnRetrieveAccountInterface; import app.fedilab.android.interfaces.OnRetrieveEmojiAccountInterface; import app.fedilab.android.interfaces.OnRetrieveFeedsAccountInterface; import app.fedilab.android.interfaces.OnRetrieveFeedsInterface; import app.fedilab.android.interfaces.OnRetrieveRelationshipInterface; +import app.fedilab.android.sqlite.AccountDAO; +import app.fedilab.android.sqlite.InstancesDAO; +import app.fedilab.android.sqlite.NotesDAO; +import app.fedilab.android.sqlite.Sqlite; +import app.fedilab.android.sqlite.TempMuteDAO; +import es.dmoral.toasty.Toasty; import static app.fedilab.android.activities.BaseMainActivity.mutedAccount; import static app.fedilab.android.activities.BaseMainActivity.timelines; @@ -157,15 +152,6 @@ public class ShowAccountActivity extends BaseActivity implements OnPostActionInt private ScheduledExecutorService scheduledExecutorService; private AsyncTask accountAsync; private AsyncTask retrieveRelationship; - - - public enum action { - FOLLOW, - UNFOLLOW, - UNBLOCK, - NOTHING - } - private action doAction; private API.StatusAction doActionAccount; @@ -297,7 +283,6 @@ public class ShowAccountActivity extends BaseActivity implements OnPostActionInt } } - private void ManageAccount() { SharedPreferences sharedpreferences = getSharedPreferences(Helper.APP_PREFS, MODE_PRIVATE); int theme = sharedpreferences.getInt(Helper.SET_THEME, Helper.THEME_DARK); @@ -831,10 +816,10 @@ public class ShowAccountActivity extends BaseActivity implements OnPostActionInt }); UserNote userNote = new NotesDAO(getApplicationContext(), db).getUserNote(account.getAcct()); - if( userNote != null ){ + if (userNote != null) { account_personal_note.setVisibility(View.VISIBLE); - account_personal_note.setOnClickListener(view->{ + account_personal_note.setOnClickListener(view -> { AlertDialog.Builder builderInner = new AlertDialog.Builder(ShowAccountActivity.this, style); builderInner.setTitle(R.string.note_for_account); EditText input = new EditText(ShowAccountActivity.this); @@ -856,15 +841,15 @@ public class ShowAccountActivity extends BaseActivity implements OnPostActionInt @Override public void onClick(DialogInterface dialog, int which) { UserNote userNote = new NotesDAO(getApplicationContext(), db).getUserNote(account.getAcct()); - if( userNote == null) { + if (userNote == null) { userNote = new UserNote(); userNote.setAcct(account.getAcct()); } userNote.setNote(input.getText().toString()); new NotesDAO(getApplicationContext(), db).insertInstance(userNote); - if( input.getText().toString().trim().length() > 0 ){ + if (input.getText().toString().trim().length() > 0) { account_personal_note.setVisibility(View.VISIBLE); - }else{ + } else { account_personal_note.setVisibility(View.GONE); } dialog.dismiss(); @@ -903,7 +888,6 @@ public class ShowAccountActivity extends BaseActivity implements OnPostActionInt }).start(); } - @Override public void onRetrieveFeedsAccount(List statuses) { if (statuses != null) { @@ -929,15 +913,14 @@ public class ShowAccountActivity extends BaseActivity implements OnPostActionInt } } - @Override public void onRetrieveRelationship(Relationship relationship, Error error) { if (error != null) { - if(error.getError().length() < 100) { + if (error.getError().length() < 100) { Toasty.error(getApplicationContext(), error.getError(), Toast.LENGTH_LONG).show(); - }else{ - Toasty.error(getApplicationContext(), getString(R.string.long_api_error,"\ud83d\ude05"), Toast.LENGTH_LONG).show(); + } else { + Toasty.error(getApplicationContext(), getString(R.string.long_api_error, "\ud83d\ude05"), Toast.LENGTH_LONG).show(); } return; } @@ -982,93 +965,12 @@ public class ShowAccountActivity extends BaseActivity implements OnPostActionInt account_follow.setImageResource(R.drawable.ic_user_plus); doAction = action.FOLLOW; account_follow.setVisibility(View.VISIBLE); - ; } else { account_follow.setVisibility(View.GONE); doAction = action.NOTHING; } } - /** - * Pager adapter for the 4 fragments - */ - private class ScreenSlidePagerAdapter extends FragmentStatePagerAdapter { - - ScreenSlidePagerAdapter(FragmentManager fm) { - super(fm); - } - - @Override - public Fragment getItem(int position) { - Bundle bundle = new Bundle(); - switch (position) { - case 0: - if (!peertubeAccount) { - if( MainActivity.social != UpdateAccountInfoAsyncTask.SOCIAL.PIXELFED) { - TabLayoutTootsFragment tabLayoutTootsFragment = new TabLayoutTootsFragment(); - bundle.putString("targetedid", account.getId()); - tabLayoutTootsFragment.setArguments(bundle); - return tabLayoutTootsFragment; - }else{ - DisplayStatusFragment displayStatusFragment = new DisplayStatusFragment(); - bundle = new Bundle(); - bundle.putSerializable("type", RetrieveFeedsAsyncTask.Type.USER); - bundle.putString("instanceType", "PIXELFED"); - bundle.putString("targetedid", account.getId()); - displayStatusFragment.setArguments(bundle); - return displayStatusFragment; - } - } else { - DisplayStatusFragment displayStatusFragment = new DisplayStatusFragment(); - bundle = new Bundle(); - bundle.putSerializable("type", RetrieveFeedsAsyncTask.Type.USER); - bundle.putString("targetedid", account.getAcct()); - bundle.putString("instanceType", "PEERTUBE"); - bundle.putBoolean("showReply", false); - bundle.putBoolean("ischannel", ischannel); - displayStatusFragment.setArguments(bundle); - return displayStatusFragment; - } - case 1: - if (peertubeAccount) { - DisplayAccountsFragment displayAccountsFragment = new DisplayAccountsFragment(); - bundle.putSerializable("type", RetrieveAccountsAsyncTask.Type.CHANNELS); - bundle.putString("targetedid", account.getId()); - bundle.putString("instance", Helper.getLiveInstance(ShowAccountActivity.this)); - bundle.putString("name", account.getAcct()); - displayAccountsFragment.setArguments(bundle); - return displayAccountsFragment; - } else { - DisplayAccountsFragment displayAccountsFragment = new DisplayAccountsFragment(); - bundle.putSerializable("type", RetrieveAccountsAsyncTask.Type.FOLLOWING); - bundle.putString("targetedid", account.getId()); - displayAccountsFragment.setArguments(bundle); - return displayAccountsFragment; - } - - case 2: - DisplayAccountsFragment displayAccountsFragment = new DisplayAccountsFragment(); - bundle.putSerializable("type", RetrieveAccountsAsyncTask.Type.FOLLOWERS); - bundle.putString("targetedid", account.getId()); - displayAccountsFragment.setArguments(bundle); - return displayAccountsFragment; - - } - return null; - } - - - @Override - public int getCount() { - if (ischannel) - return 1; - else if (peertubeAccount) - return 2; - else - return 3; - } - } - @Override public void onRetrieveEmojiAccount(Account account) { account_note.setText(account.getNoteSpan(), TextView.BufferType.SPANNABLE); @@ -1122,7 +1024,7 @@ public class ShowAccountActivity extends BaseActivity implements OnPostActionInt labelView.setText(label); } if (field != null && labelView != null && valueView != null) { - boolean verified = fieldsVerified.get((String) pair.getKey().toString()); + boolean verified = fieldsVerified.get(pair.getKey().toString()); if (verified) { valueView.setBackgroundResource(R.drawable.verified); value.setSpan(new ForegroundColorSpan(ContextCompat.getColor(ShowAccountActivity.this, R.color.verified_text)), 0, value.toString().length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); @@ -1455,7 +1357,7 @@ public class ShowAccountActivity extends BaseActivity implements OnPostActionInt LinearLayout.LayoutParams.WRAP_CONTENT); input.setLayoutParams(lp); input.setSingleLine(false); - if( userNote != null) { + if (userNote != null) { input.setText(userNote.getNote()); } input.setImeOptions(EditorInfo.IME_FLAG_NO_ENTER_ACTION); @@ -1470,15 +1372,15 @@ public class ShowAccountActivity extends BaseActivity implements OnPostActionInt @Override public void onClick(DialogInterface dialog, int which) { UserNote userNote = new NotesDAO(getApplicationContext(), db).getUserNote(account.getAcct()); - if( userNote == null) { + if (userNote == null) { userNote = new UserNote(); userNote.setAcct(account.getAcct()); } userNote.setNote(input.getText().toString()); new NotesDAO(getApplicationContext(), db).insertInstance(userNote); - if( input.getText().toString().trim().length() > 0 ){ + if (input.getText().toString().trim().length() > 0) { account_personal_note.setVisibility(View.VISIBLE); - }else{ + } else { account_personal_note.setVisibility(View.GONE); } dialog.dismiss(); @@ -1526,13 +1428,11 @@ public class ShowAccountActivity extends BaseActivity implements OnPostActionInt popup.show(); } - @Override public void onDestroy() { super.onDestroy(); } - @Override public void onStop() { super.onStop(); @@ -1551,10 +1451,10 @@ public class ShowAccountActivity extends BaseActivity implements OnPostActionInt public void onPostAction(int statusCode, API.StatusAction statusAction, String targetedId, Error error) { if (error != null) { - if(error.getError().length() < 100) { + if (error.getError().length() < 100) { Toasty.error(getApplicationContext(), error.getError(), Toast.LENGTH_LONG).show(); - }else{ - Toasty.error(getApplicationContext(), getString(R.string.long_api_error,"\ud83d\ude05"), Toast.LENGTH_LONG).show(); + } else { + Toasty.error(getApplicationContext(), getString(R.string.long_api_error, "\ud83d\ude05"), Toast.LENGTH_LONG).show(); } return; } @@ -1576,19 +1476,17 @@ public class ShowAccountActivity extends BaseActivity implements OnPostActionInt retrieveRelationship = new RetrieveRelationshipAsyncTask(getApplicationContext(), target, ShowAccountActivity.this).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); } - @Override public void onRetrieveAccount(final Account account, Error error) { if (error != null || account == null || account.getAcct() == null) { if (error == null) Toasty.error(getApplicationContext(), getString(R.string.toast_error), Toast.LENGTH_LONG).show(); - else - if(error.getError().length() < 100) { - Toasty.error(getApplicationContext(), error.getError(), Toast.LENGTH_LONG).show(); - }else{ - Toasty.error(getApplicationContext(), getString(R.string.long_api_error,"\ud83d\ude05"), Toast.LENGTH_LONG).show(); - } + else if (error.getError().length() < 100) { + Toasty.error(getApplicationContext(), error.getError(), Toast.LENGTH_LONG).show(); + } else { + Toasty.error(getApplicationContext(), getString(R.string.long_api_error, "\ud83d\ude05"), Toast.LENGTH_LONG).show(); + } return; } this.account = account; @@ -1607,7 +1505,6 @@ public class ShowAccountActivity extends BaseActivity implements OnPostActionInt } } - public boolean showReplies() { return show_replies; } @@ -1616,4 +1513,92 @@ public class ShowAccountActivity extends BaseActivity implements OnPostActionInt return show_boosts; } + + public enum action { + FOLLOW, + UNFOLLOW, + UNBLOCK, + NOTHING + } + + /** + * Pager adapter for the 4 fragments + */ + private class ScreenSlidePagerAdapter extends FragmentStatePagerAdapter { + + ScreenSlidePagerAdapter(FragmentManager fm) { + super(fm); + } + + @Override + public Fragment getItem(int position) { + Bundle bundle = new Bundle(); + switch (position) { + case 0: + if (!peertubeAccount) { + if (MainActivity.social != UpdateAccountInfoAsyncTask.SOCIAL.PIXELFED) { + TabLayoutTootsFragment tabLayoutTootsFragment = new TabLayoutTootsFragment(); + bundle.putString("targetedid", account.getId()); + tabLayoutTootsFragment.setArguments(bundle); + return tabLayoutTootsFragment; + } else { + DisplayStatusFragment displayStatusFragment = new DisplayStatusFragment(); + bundle = new Bundle(); + bundle.putSerializable("type", RetrieveFeedsAsyncTask.Type.USER); + bundle.putString("instanceType", "PIXELFED"); + bundle.putString("targetedid", account.getId()); + displayStatusFragment.setArguments(bundle); + return displayStatusFragment; + } + } else { + DisplayStatusFragment displayStatusFragment = new DisplayStatusFragment(); + bundle = new Bundle(); + bundle.putSerializable("type", RetrieveFeedsAsyncTask.Type.USER); + bundle.putString("targetedid", account.getAcct()); + bundle.putString("instanceType", "PEERTUBE"); + bundle.putBoolean("showReply", false); + bundle.putBoolean("ischannel", ischannel); + displayStatusFragment.setArguments(bundle); + return displayStatusFragment; + } + case 1: + if (peertubeAccount) { + DisplayAccountsFragment displayAccountsFragment = new DisplayAccountsFragment(); + bundle.putSerializable("type", RetrieveAccountsAsyncTask.Type.CHANNELS); + bundle.putString("targetedid", account.getId()); + bundle.putString("instance", Helper.getLiveInstance(ShowAccountActivity.this)); + bundle.putString("name", account.getAcct()); + displayAccountsFragment.setArguments(bundle); + return displayAccountsFragment; + } else { + DisplayAccountsFragment displayAccountsFragment = new DisplayAccountsFragment(); + bundle.putSerializable("type", RetrieveAccountsAsyncTask.Type.FOLLOWING); + bundle.putString("targetedid", account.getId()); + displayAccountsFragment.setArguments(bundle); + return displayAccountsFragment; + } + + case 2: + DisplayAccountsFragment displayAccountsFragment = new DisplayAccountsFragment(); + bundle.putSerializable("type", RetrieveAccountsAsyncTask.Type.FOLLOWERS); + bundle.putString("targetedid", account.getId()); + displayAccountsFragment.setArguments(bundle); + return displayAccountsFragment; + + } + return null; + } + + + @Override + public int getCount() { + if (ischannel) + return 1; + else if (peertubeAccount) + return 2; + else + return 3; + } + } + } diff --git a/app/src/main/java/app/fedilab/android/activities/ShowConversationActivity.java b/app/src/main/java/app/fedilab/android/activities/ShowConversationActivity.java index c428ed932..491fdaed4 100644 --- a/app/src/main/java/app/fedilab/android/activities/ShowConversationActivity.java +++ b/app/src/main/java/app/fedilab/android/activities/ShowConversationActivity.java @@ -22,33 +22,32 @@ import android.content.SharedPreferences; import android.database.sqlite.SQLiteDatabase; import android.os.AsyncTask; import android.os.Bundle; - -import androidx.localbroadcastmanager.content.LocalBroadcastManager; -import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; -import androidx.recyclerview.widget.LinearLayoutManager; -import androidx.recyclerview.widget.RecyclerView; -import android.view.MenuItem; import android.view.View; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; import android.widget.Toast; +import androidx.localbroadcastmanager.content.LocalBroadcastManager; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; +import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; + import java.util.ArrayList; import java.util.List; +import app.fedilab.android.R; +import app.fedilab.android.asynctasks.RetrieveContextAsyncTask; +import app.fedilab.android.asynctasks.UpdateAccountInfoAsyncTask; import app.fedilab.android.client.APIResponse; import app.fedilab.android.client.Entities.Account; import app.fedilab.android.client.Entities.Status; import app.fedilab.android.drawers.StatusListAdapter; import app.fedilab.android.helper.Helper; +import app.fedilab.android.interfaces.OnRetrieveContextInterface; import app.fedilab.android.sqlite.AccountDAO; import app.fedilab.android.sqlite.Sqlite; import es.dmoral.toasty.Toasty; -import app.fedilab.android.R; -import app.fedilab.android.asynctasks.RetrieveContextAsyncTask; -import app.fedilab.android.asynctasks.UpdateAccountInfoAsyncTask; -import app.fedilab.android.interfaces.OnRetrieveContextInterface; /** @@ -300,9 +299,9 @@ public class ShowConversationActivity extends BaseActivity implements OnRetrieve swipeRefreshLayout.setRefreshing(false); loader.setVisibility(View.GONE); if (apiResponse.getError() != null) { - if( apiResponse.getError().getError() != null) { + if (apiResponse.getError().getError() != null) { Toasty.error(getApplicationContext(), apiResponse.getError().getError(), Toast.LENGTH_LONG).show(); - }else{ + } else { Toasty.error(getApplicationContext(), getString(R.string.toast_error), Toast.LENGTH_LONG).show(); } return; @@ -317,7 +316,7 @@ public class ShowConversationActivity extends BaseActivity implements OnRetrieve statuses.addAll(0, apiResponse.getContext().getAncestors()); statusListAdapter.notifyItemRangeInserted(0, apiResponse.getContext().getAncestors().size()); } - int targetedPosition = statuses.size()-1; + int targetedPosition = statuses.size() - 1; if (apiResponse.getContext().getDescendants() != null && apiResponse.getContext().getDescendants().size() > 0) { statuses.addAll(apiResponse.getContext().getAncestors().size() + 1, apiResponse.getContext().getDescendants()); statusListAdapter.notifyItemRangeChanged(apiResponse.getContext().getAncestors().size() + 1, apiResponse.getContext().getDescendants().size()); @@ -369,23 +368,23 @@ public class ShowConversationActivity extends BaseActivity implements OnRetrieve } - private void decorate(int targetedPosition){ - for(int i =0 ; i < statuses.size() ; i++){ + private void decorate(int targetedPosition) { + for (int i = 0; i < statuses.size(); i++) { if (i == targetedPosition) { - if( targetedPosition < statuses.size()-1 ) + if (targetedPosition < statuses.size() - 1) statuses.get(targetedPosition).setShowBottomLine(true); - if( targetedPosition > 0 && statuses.get(targetedPosition).getIn_reply_to_id().compareTo(statuses.get(targetedPosition-1).getId()) == 0){ - statuses.get(targetedPosition-1).setShowBottomLine(true); + if (targetedPosition > 0 && statuses.get(targetedPosition).getIn_reply_to_id().compareTo(statuses.get(targetedPosition - 1).getId()) == 0) { + statuses.get(targetedPosition - 1).setShowBottomLine(true); statuses.get(targetedPosition).setShowTopLine(true); } } else if (0 < i && i <= statuses.size() - 1) { - if( statuses.get(i-1).getId().compareTo(statuses.get(i).getIn_reply_to_id()) == 0){ - statuses.get(i-1).setShowBottomLine(true); + if (statuses.get(i - 1).getId().compareTo(statuses.get(i).getIn_reply_to_id()) == 0) { + statuses.get(i - 1).setShowBottomLine(true); statuses.get(i).setShowTopLine(true); } } } - statusListAdapter.notifyItemRangeChanged(0,statuses.size()); + statusListAdapter.notifyItemRangeChanged(0, statuses.size()); } } diff --git a/app/src/main/java/app/fedilab/android/activities/SlideMediaActivity.java b/app/src/main/java/app/fedilab/android/activities/SlideMediaActivity.java index 1eca76ed5..83edc1c04 100644 --- a/app/src/main/java/app/fedilab/android/activities/SlideMediaActivity.java +++ b/app/src/main/java/app/fedilab/android/activities/SlideMediaActivity.java @@ -15,7 +15,6 @@ package app.fedilab.android.activities; - import android.Manifest; import android.app.DownloadManager; import android.content.BroadcastReceiver; @@ -27,7 +26,6 @@ import android.content.SharedPreferences; import android.content.pm.PackageManager; import android.graphics.Color; import android.graphics.Point; -import android.graphics.drawable.ColorDrawable; import android.net.Uri; import android.os.Build; import android.os.Bundle; @@ -39,12 +37,9 @@ import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.LinearLayout; -import android.widget.RelativeLayout; import android.widget.TextView; import androidx.appcompat.app.ActionBar; -import androidx.appcompat.widget.Toolbar; -import androidx.coordinatorlayout.widget.CoordinatorLayout; import androidx.core.app.ActivityCompat; import androidx.core.content.ContextCompat; import androidx.fragment.app.Fragment; @@ -53,7 +48,6 @@ import androidx.fragment.app.FragmentStatePagerAdapter; import androidx.viewpager.widget.PagerAdapter; import androidx.viewpager.widget.ViewPager; - import com.r0adkll.slidr.Slidr; import com.r0adkll.slidr.model.SlidrConfig; import com.r0adkll.slidr.model.SlidrInterface; @@ -66,7 +60,6 @@ import java.util.ArrayList; import app.fedilab.android.R; import app.fedilab.android.client.Entities.Attachment; import app.fedilab.android.client.Entities.Error; -import app.fedilab.android.client.HttpsConnection; import app.fedilab.android.fragments.MediaSliderFragment; import app.fedilab.android.helper.Helper; import app.fedilab.android.interfaces.OnDownloadInterface; @@ -79,17 +72,40 @@ import app.fedilab.android.interfaces.OnDownloadInterface; public class SlideMediaActivity extends BaseActivity implements OnDownloadInterface { + int flags; private ArrayList attachments; private int mediaPosition; private ViewPager mPager; private long downloadID; private boolean fullscreen; private SlidrInterface slidrInterface; - int flags; private TextView media_description; private Handler handler; private boolean swipeEnabled; private int minTouch, maxTouch; + private float startX; + private float startY; + private BroadcastReceiver onDownloadComplete = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + long id = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1); + if (downloadID == id) { + DownloadManager manager = (DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE); + assert manager != null; + Uri uri = manager.getUriForDownloadedFile(downloadID); + Intent shareIntent = new Intent(Intent.ACTION_SEND); + shareIntent.putExtra(Intent.EXTRA_STREAM, uri); + shareIntent.putExtra(Intent.EXTRA_TEXT, getString(R.string.share_with)); + ContentResolver cR = context.getContentResolver(); + shareIntent.setType(cR.getType(uri)); + try { + startActivity(shareIntent); + } catch (Exception ignored) { + } + } + } + }; + private MediaSliderFragment mCurrentFragment; @Override protected void onCreate(Bundle savedInstanceState) { @@ -182,12 +198,12 @@ public class SlideMediaActivity extends BaseActivity implements OnDownloadInterf PagerAdapter mPagerAdapter = new ScreenSlidePagerAdapter(getSupportFragmentManager()); mPager.setAdapter(mPagerAdapter); - mPager.setCurrentItem(mediaPosition-1); + mPager.setCurrentItem(mediaPosition - 1); - registerReceiver(onDownloadComplete,new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE)); - String description = attachments.get(mediaPosition-1).getDescription(); + registerReceiver(onDownloadComplete, new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE)); + String description = attachments.get(mediaPosition - 1).getDescription(); handler = new Handler(); - if( description != null && description.trim().length() > 0 && description.trim().compareTo("null") != 0 ){ + if (description != null && description.trim().length() > 0 && description.trim().compareTo("null") != 0) { media_description.setText(description); media_description.setVisibility(View.VISIBLE); @@ -198,46 +214,49 @@ public class SlideMediaActivity extends BaseActivity implements OnDownloadInterf } }, 3000); - }else{ + } else { media_description.setVisibility(View.GONE); } mPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { - public void onPageScrollStateChanged(int state) {} - public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {} + public void onPageScrollStateChanged(int state) { + } + + public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { + } public void onPageSelected(int position) { String description = attachments.get(position).getDescription(); - if( handler != null) { + if (handler != null) { handler.removeCallbacksAndMessages(null); } handler = new Handler(); - if( description != null && description.trim().length() > 0 && description.trim().compareTo("null") != 0){ - media_description.setText(description); - media_description.setVisibility(View.VISIBLE); + if (description != null && description.trim().length() > 0 && description.trim().compareTo("null") != 0) { + media_description.setText(description); + media_description.setVisibility(View.VISIBLE); - handler.postDelayed(new Runnable() { - @Override - public void run() { - media_description.setVisibility(View.GONE); - } - }, 3000); + handler.postDelayed(new Runnable() { + @Override + public void run() { + media_description.setVisibility(View.GONE); + } + }, 3000); - }else{ - media_description.setVisibility(View.GONE); + } else { + media_description.setVisibility(View.GONE); } } }); SlidrConfig config = new SlidrConfig.Builder() - .sensitivity(1f) - .scrimColor(Color.BLACK) - .scrimStartAlpha(0.8f) - .scrimEndAlpha(0f) - .position(SlidrPosition.VERTICAL) - .velocityThreshold(2400) - .distanceThreshold(0.25f) - .edgeSize(0.18f) - .build(); + .sensitivity(1f) + .scrimColor(Color.BLACK) + .scrimStartAlpha(0.8f) + .scrimEndAlpha(0f) + .position(SlidrPosition.VERTICAL) + .velocityThreshold(2400) + .distanceThreshold(0.25f) + .edgeSize(0.18f) + .build(); slidrInterface = Slidr.attach(SlideMediaActivity.this, config); @@ -246,13 +265,11 @@ public class SlideMediaActivity extends BaseActivity implements OnDownloadInterf Point size = new Point(); display.getSize(size); int screenHeight = size.y; - minTouch = (int)(screenHeight * 0.1); - maxTouch = (int)(screenHeight * 0.9); + minTouch = (int) (screenHeight * 0.1); + maxTouch = (int) (screenHeight * 0.9); } - private float startX; - private float startY; @Override public boolean dispatchTouchEvent(MotionEvent event) { @@ -266,13 +283,13 @@ public class SlideMediaActivity extends BaseActivity implements OnDownloadInterf float endY = event.getY(); if (endY > minTouch && endY < maxTouch && isAClick(startX, endX, startY, endY)) { setFullscreen(!fullscreen); - if( !fullscreen){ + if (!fullscreen) { String description = attachments.get(mPager.getCurrentItem()).getDescription(); - if( handler != null) { + if (handler != null) { handler.removeCallbacksAndMessages(null); } handler = new Handler(); - if( description != null && description.trim().length() > 0 && description.trim().compareTo("null") != 0){ + if (description != null && description.trim().length() > 0 && description.trim().compareTo("null") != 0) { media_description.setText(description); media_description.setVisibility(View.VISIBLE); @@ -283,7 +300,7 @@ public class SlideMediaActivity extends BaseActivity implements OnDownloadInterf } }, 3000); - }else{ + } else { media_description.setVisibility(View.GONE); } } @@ -301,40 +318,17 @@ public class SlideMediaActivity extends BaseActivity implements OnDownloadInterf public void togglePlaying(View v) { - if( mCurrentFragment != null){ + if (mCurrentFragment != null) { mCurrentFragment.togglePlaying(v); } } - - private boolean isAClick(float startX, float endX, float startY, float endY) { float differenceX = Math.abs(startX - endX); float differenceY = Math.abs(startY - endY); int CLICK_ACTION_THRESHOLD = 200; return !(differenceX > CLICK_ACTION_THRESHOLD/* =5 */ || differenceY > CLICK_ACTION_THRESHOLD); } - private BroadcastReceiver onDownloadComplete = new BroadcastReceiver() { - @Override - public void onReceive(Context context, Intent intent) { - long id = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1); - if (downloadID == id) { - DownloadManager manager = (DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE); - assert manager != null; - Uri uri = manager.getUriForDownloadedFile(downloadID); - Intent shareIntent = new Intent(Intent.ACTION_SEND); - shareIntent.putExtra(Intent.EXTRA_STREAM, uri); - shareIntent.putExtra(Intent.EXTRA_TEXT, getString(R.string.share_with)); - ContentResolver cR = context.getContentResolver(); - shareIntent.setType(cR.getType(uri)); - try { - startActivity(shareIntent); - }catch (Exception ignored){} - } - } - }; - - @Override public void onDestroy() { @@ -342,9 +336,6 @@ public class SlideMediaActivity extends BaseActivity implements OnDownloadInterf unregisterReceiver(onDownloadComplete); } - private MediaSliderFragment mCurrentFragment; - - public MediaSliderFragment getCurrentFragment() { return mCurrentFragment; } @@ -359,6 +350,62 @@ public class SlideMediaActivity extends BaseActivity implements OnDownloadInterf } + @Override + protected void onPostResume() { + super.onPostResume(); + } + + public void enableSliding(boolean enable) { + if (enable && !swipeEnabled) { + slidrInterface.unlock(); + swipeEnabled = true; + } else if (!enable && swipeEnabled) { + slidrInterface.lock(); + swipeEnabled = false; + } + } + + public boolean getFullScreen() { + return this.fullscreen; + } + + public void setFullscreen(boolean fullscreen) { + this.fullscreen = fullscreen; + if (!fullscreen) { + showSystemUI(); + + } else { + hideSystemUI(); + } + } + + private void hideSystemUI() { + // Enables regular immersive mode. + // For "lean back" mode, remove SYSTEM_UI_FLAG_IMMERSIVE. + // Or for "sticky immersive," replace it with SYSTEM_UI_FLAG_IMMERSIVE_STICKY + View decorView = getWindow().getDecorView(); + decorView.setSystemUiVisibility( + View.SYSTEM_UI_FLAG_IMMERSIVE + // Set the content to appear under the system bars so that the + // content doesn't resize when the system bars hide and show. + | View.SYSTEM_UI_FLAG_LAYOUT_STABLE + | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION + | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN + // Hide the nav bar and status bar + | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION + | View.SYSTEM_UI_FLAG_FULLSCREEN); + } + + // Shows the system bars by removing all the flags +// except for the ones that make the content appear under the system bars. + private void showSystemUI() { + View decorView = getWindow().getDecorView(); + decorView.setSystemUiVisibility( + View.SYSTEM_UI_FLAG_LAYOUT_STABLE + | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION + | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN); + } + /** * Media Pager */ @@ -392,63 +439,4 @@ public class SlideMediaActivity extends BaseActivity implements OnDownloadInterf return attachments.size(); } } - - @Override - protected void onPostResume() { - super.onPostResume(); - } - - - public void enableSliding(boolean enable){ - if (enable && !swipeEnabled) { - slidrInterface.unlock(); - swipeEnabled = true; - }else if( !enable && swipeEnabled) { - slidrInterface.lock(); - swipeEnabled = false; - } - } - - public boolean getFullScreen(){ - return this.fullscreen; - } - - public void setFullscreen(boolean fullscreen) - { - this.fullscreen = fullscreen; - if (!fullscreen) { - showSystemUI(); - - } else { - hideSystemUI(); - } - } - - - private void hideSystemUI() { - // Enables regular immersive mode. - // For "lean back" mode, remove SYSTEM_UI_FLAG_IMMERSIVE. - // Or for "sticky immersive," replace it with SYSTEM_UI_FLAG_IMMERSIVE_STICKY - View decorView = getWindow().getDecorView(); - decorView.setSystemUiVisibility( - View.SYSTEM_UI_FLAG_IMMERSIVE - // Set the content to appear under the system bars so that the - // content doesn't resize when the system bars hide and show. - | View.SYSTEM_UI_FLAG_LAYOUT_STABLE - | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION - | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN - // Hide the nav bar and status bar - | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION - | View.SYSTEM_UI_FLAG_FULLSCREEN); - } - - // Shows the system bars by removing all the flags -// except for the ones that make the content appear under the system bars. - private void showSystemUI() { - View decorView = getWindow().getDecorView(); - decorView.setSystemUiVisibility( - View.SYSTEM_UI_FLAG_LAYOUT_STABLE - | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION - | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN); - } } diff --git a/app/src/main/java/app/fedilab/android/activities/TagCacheActivity.java b/app/src/main/java/app/fedilab/android/activities/TagCacheActivity.java index 0099a00a2..0d7f5f8a6 100644 --- a/app/src/main/java/app/fedilab/android/activities/TagCacheActivity.java +++ b/app/src/main/java/app/fedilab/android/activities/TagCacheActivity.java @@ -19,27 +19,24 @@ import android.content.SharedPreferences; import android.database.sqlite.SQLiteDatabase; import android.os.AsyncTask; import android.os.Bundle; - -import androidx.core.content.ContextCompat; -import androidx.recyclerview.widget.LinearLayoutManager; -import androidx.recyclerview.widget.RecyclerView; - import android.view.View; import android.view.ViewGroup; -import android.view.Window; import android.widget.EditText; import android.widget.ImageButton; import android.widget.Toast; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + import java.util.ArrayList; import java.util.List; +import app.fedilab.android.R; import app.fedilab.android.drawers.TagsEditAdapter; import app.fedilab.android.helper.Helper; import app.fedilab.android.sqlite.Sqlite; import app.fedilab.android.sqlite.TagsCacheDAO; import es.dmoral.toasty.Toasty; -import app.fedilab.android.R; /** diff --git a/app/src/main/java/app/fedilab/android/activities/TootActivity.java b/app/src/main/java/app/fedilab/android/activities/TootActivity.java index c17888587..b70d767f6 100644 --- a/app/src/main/java/app/fedilab/android/activities/TootActivity.java +++ b/app/src/main/java/app/fedilab/android/activities/TootActivity.java @@ -15,7 +15,7 @@ package app.fedilab.android.activities; -import android.Manifest;; +import android.Manifest; import android.app.Activity; import android.content.BroadcastReceiver; import android.content.ClipData; @@ -38,21 +38,6 @@ import android.os.Environment; import android.os.Handler; import android.os.Looper; import android.provider.MediaStore; - -import androidx.annotation.NonNull; -import androidx.annotation.RequiresApi; -import androidx.appcompat.widget.SwitchCompat; -import androidx.core.app.ActivityCompat; -import androidx.core.content.ContextCompat; -import androidx.core.content.FileProvider; -import androidx.fragment.app.DialogFragment; -import androidx.localbroadcastmanager.content.LocalBroadcastManager; -import androidx.appcompat.app.ActionBar; -import androidx.appcompat.app.AlertDialog; -import androidx.preference.PreferenceManager; -import androidx.recyclerview.widget.LinearLayoutManager; -import androidx.recyclerview.widget.RecyclerView; - import android.text.Editable; import android.text.Html; import android.text.InputFilter; @@ -89,6 +74,20 @@ import android.widget.TextView; import android.widget.TimePicker; import android.widget.Toast; +import androidx.annotation.NonNull; +import androidx.annotation.RequiresApi; +import androidx.appcompat.app.ActionBar; +import androidx.appcompat.app.AlertDialog; +import androidx.appcompat.widget.SwitchCompat; +import androidx.core.app.ActivityCompat; +import androidx.core.content.ContextCompat; +import androidx.core.content.FileProvider; +import androidx.fragment.app.DialogFragment; +import androidx.localbroadcastmanager.content.LocalBroadcastManager; +import androidx.preference.PreferenceManager; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + import com.bumptech.glide.Glide; import com.bumptech.glide.request.target.SimpleTarget; import com.bumptech.glide.request.transition.Transition; @@ -102,7 +101,6 @@ import com.github.stom79.mytransl.client.HttpsConnectionException; import com.github.stom79.mytransl.translate.Translate; import com.vanniktech.emoji.EmojiPopup; - import net.gotev.uploadservice.MultipartUploadRequest; import net.gotev.uploadservice.ServerResponse; import net.gotev.uploadservice.UploadInfo; @@ -180,7 +178,6 @@ import app.fedilab.android.helper.FileNameCleaner; import app.fedilab.android.helper.Helper; import app.fedilab.android.helper.MastalabAutoCompleteTextView; import app.fedilab.android.helper.RecyclerItemClickListener; -import app.fedilab.android.helper.ThemeHelper; import app.fedilab.android.interfaces.OnDownloadInterface; import app.fedilab.android.interfaces.OnPostActionInterface; import app.fedilab.android.interfaces.OnPostStatusActionInterface; @@ -218,9 +215,22 @@ import static app.fedilab.android.helper.Helper.countWithEmoji; public class TootActivity extends BaseActivity implements UploadStatusDelegate, OnPostActionInterface, OnRetrieveSearcAccountshInterface, OnPostStatusActionInterface, OnRetrieveSearchInterface, OnRetrieveAccountsReplyInterface, OnRetrieveEmojiInterface, OnDownloadInterface, OnRetrieveAttachmentInterface, OnRetrieveRelationshipInterface { - private String visibility; + public static final int MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE = 754; + public static final int REQUEST_CAMERA_PERMISSION_RESULT = 1653; + public static final int SEND_VOICE_MESSAGE = 1423; + public static HashMap filesMap; + public static boolean autocomplete; + public static Uri photoFileUri = null; + static boolean active = false; + private static String instance; + private static int searchDeep = 15; private final int PICK_IMAGE = 56556; private final int TAKE_PHOTO = 56532; + public long currentToId; + List emojis; + String mCurrentPhotoPath; + File photoFile = null; + private String visibility; private ImageButton toot_picture; private LinearLayout toot_picture_container; private ArrayList attachments; @@ -234,7 +244,6 @@ public class TootActivity extends BaseActivity implements UploadStatusDelegate, private String urlMention = null; private String sharedContent, sharedSubject, sharedContentIni; private CheckBox toot_sensitive; - public long currentToId; private long restored; private TextView title; private ImageView pp_actionBar; @@ -244,7 +253,6 @@ public class TootActivity extends BaseActivity implements UploadStatusDelegate, private HorizontalScrollView picture_scrollview; private TextView toot_space_left; private String initialContent; - public static final int MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE = 754; private Account accountReply; private View popup_trans; private AlertDialog dialogTrans; @@ -252,13 +260,11 @@ public class TootActivity extends BaseActivity implements UploadStatusDelegate, private String mentionAccount; private Status idRedirect; private String userId; - private static String instance; private Account account; private ArrayList splitToot; private int stepSpliToot; private boolean removed; private boolean restoredScheduled; - static boolean active = false; private int style; private StoredStatus scheduledstatus; private boolean isScheduled; @@ -268,24 +274,431 @@ public class TootActivity extends BaseActivity implements UploadStatusDelegate, private RelativeLayout loader; private String contentType; private int max_media_count; - public static HashMap filesMap; private Poll poll; private ImageButton poll_action; - public static boolean autocomplete; private int pollCountItem; private UploadServiceSingleBroadcastReceiver uploadReceiver; private String quickmessagecontent, quickmessagevisibility; - - public static final int REQUEST_CAMERA_PERMISSION_RESULT = 1653; - public static final int SEND_VOICE_MESSAGE = 1423; private TextView warning_message; private Editor wysiwyg; private EditText wysiwygEditText; private String url_for_media; private UpdateAccountInfoAsyncTask.SOCIAL social; - List emojis; + private BroadcastReceiver imageReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + String imgpath = intent.getStringExtra("imgpath"); + if (imgpath != null) { + prepareUpload(TootActivity.this, Uri.fromFile(new File(imgpath)), null, uploadReceiver); + } + } + }; + private BroadcastReceiver add_new_media = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { - private static int searchDeep = 15; + JSONObject response = null; + ArrayList successfullyUploadedFiles = null; + try { + response = new JSONObject(intent.getStringExtra("response")); + } catch (JSONException e) { + e.printStackTrace(); + } + successfullyUploadedFiles = intent.getStringArrayListExtra("uploadInfo"); + addNewMedia(response, successfullyUploadedFiles); + } + }; + + public static TextWatcher initializeTextWatcher(Context context, UpdateAccountInfoAsyncTask.SOCIAL social, Status status, + MastalabAutoCompleteTextView toot_content, EditText toot_cw_content, TextView toot_space_left, + ImageView pp_actionBar, ProgressBar pp_progress, + OnRetrieveSearchInterface listener, OnRetrieveSearcAccountshInterface listenerAccount, OnRetrieveEmojiInterface listenerEmoji + ) { + + String pattern = "(.|\\s)*(@[\\w_-]+@[a-z0-9.\\-]+|@[\\w_-]+)"; + final Pattern sPattern = Pattern.compile(pattern); + + String patternTag = "^(.|\\s)*(#([\\w-]{2,}))$"; + final Pattern tPattern = Pattern.compile(patternTag); + + String patternEmoji = "^(.|\\s)*(:([\\w_]+))$"; + final Pattern ePattern = Pattern.compile(patternEmoji); + final int[] currentCursorPosition = {toot_content.getSelectionStart()}; + final String[] newContent = {null}; + final int[] searchLength = {searchDeep}; + TextWatcher textw = null; + TextWatcher finalTextw = textw; + textw = new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + } + + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + + } + + @Override + public void afterTextChanged(Editable s) { + if (status != null) { + status.setQuickReplyContent(s.toString()); + } + if (autocomplete) { + toot_content.removeTextChangedListener(finalTextw); + Thread thread = new Thread() { + @Override + public void run() { + String fedilabHugsTrigger = ":fedilab_hugs:"; + String fedilabMorseTrigger = ":fedilab_morse:"; + + if (s.toString().contains(fedilabHugsTrigger)) { + newContent[0] = s.toString().replaceAll(fedilabHugsTrigger, ""); + int currentLength = countLength(social, toot_content, toot_cw_content); + int toFill = 500 - currentLength; + if (toFill <= 0) { + return; + } + + + StringBuilder hugs = new StringBuilder(); + for (int i = 0; i < toFill; i++) { + hugs.append(new String(Character.toChars(0x1F917))); + } + + Handler mainHandler = new Handler(Looper.getMainLooper()); + + Runnable myRunnable = new Runnable() { + @Override + public void run() { + newContent[0] = newContent[0] + hugs.toString(); + toot_content.setText(newContent[0]); + toot_content.setSelection(toot_content.getText().length()); + // toot_content.addTextChangedListener(finalTextw); + autocomplete = false; + toot_space_left.setText(String.valueOf(countLength(social, toot_content, toot_cw_content))); + } + }; + mainHandler.post(myRunnable); + } else if (s.toString().contains(fedilabMorseTrigger)) { + newContent[0] = s.toString().replaceAll(fedilabMorseTrigger, "").trim(); + List mentions = new ArrayList<>(); + String mentionPattern = "@[a-z0-9_]+(@[a-z0-9\\.\\-]+[a-z0-9]+)?"; + final Pattern mPattern = Pattern.compile(mentionPattern, Pattern.CASE_INSENSITIVE); + Matcher matcherMentions = mPattern.matcher(newContent[0]); + while (matcherMentions.find()) { + mentions.add(matcherMentions.group()); + } + for (String mention : mentions) { + newContent[0] = newContent[0].replace(mention, ""); + } + newContent[0] = Normalizer.normalize(newContent[0], Normalizer.Form.NFD); + newContent[0] = newContent[0].replaceAll("[^\\p{ASCII}]", ""); + + HashMap ALPHA_TO_MORSE = new HashMap<>(); + for (int i = 0; i < ALPHA.length && i < MORSE.length; i++) { + ALPHA_TO_MORSE.put(ALPHA[i], MORSE[i]); + } + StringBuilder builder = new StringBuilder(); + String[] words = newContent[0].trim().split(" "); + + for (String word : words) { + for (int i = 0; i < word.length(); i++) { + String morse = ALPHA_TO_MORSE.get(word.substring(i, i + 1).toLowerCase()); + builder.append(morse).append(" "); + } + + builder.append(" "); + } + newContent[0] = ""; + for (String mention : mentions) { + newContent[0] += mention + " "; + } + newContent[0] += builder.toString(); + + Handler mainHandler = new Handler(Looper.getMainLooper()); + + Runnable myRunnable = new Runnable() { + @Override + public void run() { + toot_content.setText(newContent[0]); + toot_content.setSelection(toot_content.getText().length()); + autocomplete = false; + toot_space_left.setText(String.valueOf(countLength(social, toot_content, toot_cw_content))); + } + }; + mainHandler.post(myRunnable); + } + } + }; + thread.start(); + return; + } + + if (toot_content.getSelectionStart() != 0) + currentCursorPosition[0] = toot_content.getSelectionStart(); + if (s.toString().length() == 0) + currentCursorPosition[0] = 0; + //Only check last 15 characters before cursor position to avoid lags + if (currentCursorPosition[0] < searchDeep) { //Less than 15 characters are written before the cursor position + searchLength[0] = currentCursorPosition[0]; + } else { + searchLength[0] = searchDeep; + } + + + int totalChar = countLength(social, toot_content, toot_cw_content); + toot_space_left.setText(String.valueOf(totalChar)); + if (currentCursorPosition[0] - (searchLength[0] - 1) < 0 || currentCursorPosition[0] == 0 || currentCursorPosition[0] > s.toString().length()) + return; + + String patternh = "^(.|\\s)*(:fedilab_hugs:)$"; + final Pattern hPattern = Pattern.compile(patternh); + Matcher mh = hPattern.matcher((s.toString().substring(currentCursorPosition[0] - searchLength[0], currentCursorPosition[0]))); + + if (mh.matches()) { + autocomplete = true; + return; + } + + String patternM = "^(.|\\s)*(:fedilab_morse:)$"; + final Pattern mPattern = Pattern.compile(patternM); + Matcher mm = mPattern.matcher((s.toString().substring(currentCursorPosition[0] - searchLength[0], currentCursorPosition[0]))); + if (mm.matches()) { + autocomplete = true; + return; + } + String[] searchInArray = (s.toString().substring(currentCursorPosition[0] - searchLength[0], currentCursorPosition[0])).split("\\s"); + if (searchInArray.length < 1) { + return; + } + String searchIn = searchInArray[searchInArray.length - 1]; + Matcher m, mt; + m = sPattern.matcher(searchIn); + if (m.matches()) { + String search = m.group(); + if (pp_progress != null && pp_actionBar != null) { + pp_progress.setVisibility(View.VISIBLE); + pp_actionBar.setVisibility(View.GONE); + } + new RetrieveSearchAccountsAsyncTask(context, search, listenerAccount).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); + } else { + mt = tPattern.matcher(searchIn); + if (mt.matches()) { + String search = mt.group(3); + if (pp_progress != null && pp_actionBar != null) { + pp_progress.setVisibility(View.VISIBLE); + pp_actionBar.setVisibility(View.GONE); + } + new RetrieveSearchAsyncTask(context, search, true, listener).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); + } else { + mt = ePattern.matcher(searchIn); + if (mt.matches()) { + String shortcode = mt.group(3); + if (pp_progress != null && pp_actionBar != null) { + pp_progress.setVisibility(View.VISIBLE); + pp_actionBar.setVisibility(View.GONE); + } + new RetrieveEmojiAsyncTask(context, shortcode, listenerEmoji).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); + } else { + toot_content.dismissDropDown(); + } + } + } + + + totalChar = countLength(social, toot_content, toot_cw_content); + toot_space_left.setText(String.valueOf(totalChar)); + } + }; + return textw; + } + + static private void upload(Activity activity, Account account, UpdateAccountInfoAsyncTask.SOCIAL social, Uri inUri, String fname, UploadServiceSingleBroadcastReceiver uploadReceiver) { + String uploadId = UUID.randomUUID().toString(); + if (uploadReceiver != null) { + uploadReceiver.setUploadID(uploadId); + } + Uri uri; + InputStream tempInput = null; + FileOutputStream tempOut = null; + String filename = inUri.toString().substring(inUri.toString().lastIndexOf("/")); + int suffixPosition = filename.lastIndexOf("."); + String suffix = ""; + if (suffixPosition > 0) suffix = filename.substring(suffixPosition); + try { + File file; + tempInput = activity.getContentResolver().openInputStream(inUri); + if (fname.startsWith("fedilabins_")) { + file = File.createTempFile("fedilabins_randomTemp1", suffix, activity.getCacheDir()); + } else { + file = File.createTempFile("randomTemp1", suffix, activity.getCacheDir()); + } + + filesMap.put(file.getAbsolutePath(), inUri); + tempOut = new FileOutputStream(file.getAbsoluteFile()); + byte[] buff = new byte[1024]; + int read; + assert tempInput != null; + while ((read = tempInput.read(buff)) > 0) { + tempOut.write(buff, 0, read); + } + if (BuildConfig.DONATIONS) { + uri = FileProvider.getUriForFile(activity, + "fr.gouv.etalab.mastodon.fileProvider", + file); + } else { + uri = FileProvider.getUriForFile(activity, + "app.fedilab.android.fileProvider", + file); + } + tempInput.close(); + tempOut.close(); + } catch (IOException e) { + e.printStackTrace(); + uri = inUri; + } finally { + IOUtils.closeQuietly(tempInput); + IOUtils.closeQuietly(tempOut); + } + + try { + final String fileName = FileNameCleaner.cleanFileName(fname); + SharedPreferences sharedpreferences = activity.getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE); + String scheme = sharedpreferences.getString(Helper.SET_ONION_SCHEME + account.getInstance(), "https"); + String token = account.getToken(); + + int maxUploadRetryTimes = sharedpreferences.getInt(Helper.MAX_UPLOAD_IMG_RETRY_TIMES, 3); + String url; + if (social != UpdateAccountInfoAsyncTask.SOCIAL.GNU && social != UpdateAccountInfoAsyncTask.SOCIAL.FRIENDICA) { + url = scheme + "://" + account.getInstance() + "/api/v1/media"; + } else { + url = scheme + "://" + account.getInstance() + "/api/media/upload.json"; + } + UploadNotificationConfig uploadConfig = new UploadNotificationConfig(); + uploadConfig + .setClearOnActionForAllStatuses(true); + uploadConfig.getProgress().message = activity.getString(R.string.uploading); + uploadConfig.getCompleted().autoClear = true; + MultipartUploadRequest request = new MultipartUploadRequest(activity, uploadId, url); + if (token != null && !token.startsWith("Basic ")) + request.addHeader("Authorization", "Bearer " + token); + else if (token != null && token.startsWith("Basic ")) + request.addHeader("Authorization", token); + request.setNotificationConfig(uploadConfig); + if (social != UpdateAccountInfoAsyncTask.SOCIAL.GNU && social != UpdateAccountInfoAsyncTask.SOCIAL.FRIENDICA) { + request.addFileToUpload(uri.toString().replace("file://", ""), "file"); + } else { + request.addFileToUpload(uri.toString().replace("file://", ""), "media"); + } + request.addParameter("filename", fileName).setMaxRetries(maxUploadRetryTimes) + .startUpload(); + } catch (MalformedURLException | FileNotFoundException e) { + e.printStackTrace(); + } + } + + public static void manageMentions(Context context, UpdateAccountInfoAsyncTask.SOCIAL social, String userIdReply, MastalabAutoCompleteTextView contentView, EditText CWView, TextView counterView, Status tootReply) { + + //Retrieves mentioned accounts + OP and adds them at the beginin of the toot + ArrayList mentionedAccountsAdded = new ArrayList<>(); + final SharedPreferences sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, MODE_PRIVATE); + int cursorReply = 0; + + if (tootReply.getAccount() != null && tootReply.getAccount().getAcct() != null && !tootReply.getAccount().getId().equals(userIdReply)) { + contentView.setText(String.format("@%s", tootReply.getAccount().getAcct())); + mentionedAccountsAdded.add(tootReply.getAccount().getAcct()); + //Evaluate the cursor position => mention length + 1 char for carriage return + cursorReply = contentView.getText().toString().length() + 1; + } + if (tootReply.getMentions() != null) { + //Put other accounts mentioned at the bottom + boolean capitalize = sharedpreferences.getBoolean(Helper.SET_CAPITALIZE, true); + if (capitalize) + contentView.setText(String.format("%s", (contentView.getText().toString() + "\n\n"))); + else + contentView.setText(String.format("%s", (contentView.getText().toString() + " "))); + for (Mention mention : tootReply.getMentions()) { + if (mention.getAcct() != null && !mention.getId().equals(userIdReply) && !mentionedAccountsAdded.contains(mention.getAcct())) { + mentionedAccountsAdded.add(mention.getAcct()); + String tootTemp = String.format("@%s ", mention.getAcct()); + contentView.setText(String.format("%s ", (contentView.getText().toString() + tootTemp.trim()))); + } + } + + contentView.setText(contentView.getText().toString().trim()); + if (contentView.getText().toString().startsWith("@")) { + if (capitalize) + contentView.append("\n"); + else + contentView.append(" "); + } + counterView.setText(String.valueOf(countLength(social, contentView, CWView))); + contentView.requestFocus(); + + if (capitalize) { + if (mentionedAccountsAdded.size() == 1) { + contentView.setSelection(contentView.getText().length()); //Put cursor at the end + } else { + if (cursorReply > 0 && cursorReply < contentView.getText().length()) + contentView.setSelection(cursorReply); + else + contentView.setSelection(contentView.getText().length()); //Put cursor at the end + } + } else { + contentView.setSelection(contentView.getText().length()); //Put cursor at the end + } + } + } + + public static String manageMentions(Context context, String userIdReply, Status tootReply) { + String contentView = ""; + //Retrieves mentioned accounts + OP and adds them at the beginin of the toot + ArrayList mentionedAccountsAdded = new ArrayList<>(); + final SharedPreferences sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, MODE_PRIVATE); + + if (tootReply.getAccount() != null && tootReply.getAccount().getAcct() != null && !tootReply.getAccount().getId().equals(userIdReply)) { + contentView = String.format("@%s", tootReply.getAccount().getAcct()); + mentionedAccountsAdded.add(tootReply.getAccount().getAcct()); + //Evaluate the cursor position => mention length + 1 char for carriage return + } + if (tootReply.getMentions() != null) { + //Put other accounts mentioned at the bottom + contentView = String.format("%s", (contentView + " ")); + for (Mention mention : tootReply.getMentions()) { + if (mention.getAcct() != null && !mention.getId().equals(userIdReply) && !mentionedAccountsAdded.contains(mention.getAcct())) { + mentionedAccountsAdded.add(mention.getAcct()); + String tootTemp = String.format("@%s ", mention.getAcct()); + contentView = String.format("%s ", (contentView + tootTemp.trim())); + } + } + contentView = contentView.trim(); + if (contentView.startsWith("@")) { + contentView += " "; + } + } + return contentView; + } + + public static int countLength(UpdateAccountInfoAsyncTask.SOCIAL social, MastalabAutoCompleteTextView toot_content, EditText toot_cw_content) { + if (toot_content == null || toot_cw_content == null) { + return -1; + } + String content = toot_content.getText().toString(); + String cwContent = toot_cw_content.getText().toString(); + String contentCount = content; + if (social == UpdateAccountInfoAsyncTask.SOCIAL.MASTODON) { + contentCount = contentCount.replaceAll("(^|[^/\\w])@(([a-z0-9_]+)@[a-z0-9\\.\\-]+[a-z0-9]+)", "$1@$3"); + Matcher matcherALink = Patterns.WEB_URL.matcher(contentCount); + while (matcherALink.find()) { + final String url = matcherALink.group(1); + contentCount = contentCount.replace(url, "abcdefghijklmnopkrstuvw"); + } + } + + int contentLength = contentCount.length() - countWithEmoji(content); + int cwLength = cwContent.length() - countWithEmoji(cwContent); + return cwLength + contentLength; + } @Override protected void onCreate(Bundle savedInstanceState) { @@ -408,7 +821,7 @@ public class TootActivity extends BaseActivity implements UploadStatusDelegate, SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); int iconColor = prefs.getInt("theme_icons_color", -1); - if( iconColor != -1){ + if (iconColor != -1) { Helper.changeDrawableColor(getApplicationContext(), toot_emoji, iconColor); Helper.changeDrawableColor(getApplicationContext(), toot_visibility, iconColor); Helper.changeDrawableColor(getApplicationContext(), poll_action, iconColor); @@ -479,8 +892,8 @@ public class TootActivity extends BaseActivity implements UploadStatusDelegate, if (currentCursorPosition - (searchLength - 1) < 0 || currentCursorPosition == 0 || currentCursorPosition > s.toString().length()) return; - String[] searchInArray =(s.toString().substring(currentCursorPosition - searchLength, currentCursorPosition)).split("\\s"); - String searchIn = searchInArray[searchInArray.length-1]; + String[] searchInArray = (s.toString().substring(currentCursorPosition - searchLength, currentCursorPosition)).split("\\s"); + String searchIn = searchInArray[searchInArray.length - 1]; Matcher m, mt; m = sPattern.matcher(searchIn); if (m.matches()) { @@ -899,238 +1312,6 @@ public class TootActivity extends BaseActivity implements UploadStatusDelegate, } - public static TextWatcher initializeTextWatcher(Context context, UpdateAccountInfoAsyncTask.SOCIAL social, Status status, - MastalabAutoCompleteTextView toot_content, EditText toot_cw_content, TextView toot_space_left, - ImageView pp_actionBar, ProgressBar pp_progress, - OnRetrieveSearchInterface listener, OnRetrieveSearcAccountshInterface listenerAccount, OnRetrieveEmojiInterface listenerEmoji - ) { - - String pattern = "(.|\\s)*(@[\\w_-]+@[a-z0-9.\\-]+|@[\\w_-]+)"; - final Pattern sPattern = Pattern.compile(pattern); - - String patternTag = "^(.|\\s)*(#([\\w-]{2,}))$"; - final Pattern tPattern = Pattern.compile(patternTag); - - String patternEmoji = "^(.|\\s)*(:([\\w_]+))$"; - final Pattern ePattern = Pattern.compile(patternEmoji); - final int[] currentCursorPosition = {toot_content.getSelectionStart()}; - final String[] newContent = {null}; - final int[] searchLength = {searchDeep}; - TextWatcher textw = null; - TextWatcher finalTextw = textw; - textw = new TextWatcher() { - @Override - public void beforeTextChanged(CharSequence s, int start, int count, int after) { - } - - @Override - public void onTextChanged(CharSequence s, int start, int before, int count) { - - } - - @Override - public void afterTextChanged(Editable s) { - if( status != null ) { - status.setQuickReplyContent(s.toString()); - } - if (autocomplete) { - toot_content.removeTextChangedListener(finalTextw); - Thread thread = new Thread() { - @Override - public void run() { - String fedilabHugsTrigger = ":fedilab_hugs:"; - String fedilabMorseTrigger = ":fedilab_morse:"; - - if (s.toString().contains(fedilabHugsTrigger)) { - newContent[0] = s.toString().replaceAll(fedilabHugsTrigger, ""); - int currentLength = countLength(social, toot_content, toot_cw_content); - int toFill = 500 - currentLength; - if (toFill <= 0) { - return; - } - - - StringBuilder hugs = new StringBuilder(); - for (int i = 0; i < toFill; i++) { - hugs.append(new String(Character.toChars(0x1F917))); - } - - Handler mainHandler = new Handler(Looper.getMainLooper()); - - Runnable myRunnable = new Runnable() { - @Override - public void run() { - newContent[0] = newContent[0] + hugs.toString(); - toot_content.setText(newContent[0]); - toot_content.setSelection(toot_content.getText().length()); - // toot_content.addTextChangedListener(finalTextw); - autocomplete = false; - toot_space_left.setText(String.valueOf(countLength(social, toot_content, toot_cw_content))); - } - }; - mainHandler.post(myRunnable); - } else if (s.toString().contains(fedilabMorseTrigger)) { - newContent[0] = s.toString().replaceAll(fedilabMorseTrigger, "").trim(); - List mentions = new ArrayList<>(); - String mentionPattern = "@[a-z0-9_]+(@[a-z0-9\\.\\-]+[a-z0-9]+)?"; - final Pattern mPattern = Pattern.compile(mentionPattern, Pattern.CASE_INSENSITIVE); - Matcher matcherMentions = mPattern.matcher(newContent[0]); - while (matcherMentions.find()) { - mentions.add(matcherMentions.group()); - } - for (String mention : mentions) { - newContent[0] = newContent[0].replace(mention, ""); - } - newContent[0] = Normalizer.normalize(newContent[0], Normalizer.Form.NFD); - newContent[0] = newContent[0].replaceAll("[^\\p{ASCII}]", ""); - - HashMap ALPHA_TO_MORSE = new HashMap<>(); - for (int i = 0; i < ALPHA.length && i < MORSE.length; i++) { - ALPHA_TO_MORSE.put(ALPHA[i], MORSE[i]); - } - StringBuilder builder = new StringBuilder(); - String[] words = newContent[0].trim().split(" "); - - for (String word : words) { - for (int i = 0; i < word.length(); i++) { - String morse = ALPHA_TO_MORSE.get(word.substring(i, i + 1).toLowerCase()); - builder.append(morse).append(" "); - } - - builder.append(" "); - } - newContent[0] = ""; - for (String mention : mentions) { - newContent[0] += mention + " "; - } - newContent[0] += builder.toString(); - - Handler mainHandler = new Handler(Looper.getMainLooper()); - - Runnable myRunnable = new Runnable() { - @Override - public void run() { - toot_content.setText(newContent[0]); - toot_content.setSelection(toot_content.getText().length()); - autocomplete = false; - toot_space_left.setText(String.valueOf(countLength(social, toot_content, toot_cw_content))); - } - }; - mainHandler.post(myRunnable); - } - } - }; - thread.start(); - return; - } - - if (toot_content.getSelectionStart() != 0) - currentCursorPosition[0] = toot_content.getSelectionStart(); - if (s.toString().length() == 0) - currentCursorPosition[0] = 0; - //Only check last 15 characters before cursor position to avoid lags - if (currentCursorPosition[0] < searchDeep) { //Less than 15 characters are written before the cursor position - searchLength[0] = currentCursorPosition[0]; - } else { - searchLength[0] = searchDeep; - } - - - int totalChar = countLength(social, toot_content, toot_cw_content); - toot_space_left.setText(String.valueOf(totalChar)); - if (currentCursorPosition[0] - (searchLength[0] - 1) < 0 || currentCursorPosition[0] == 0 || currentCursorPosition[0] > s.toString().length()) - return; - - String patternh = "^(.|\\s)*(:fedilab_hugs:)$"; - final Pattern hPattern = Pattern.compile(patternh); - Matcher mh = hPattern.matcher((s.toString().substring(currentCursorPosition[0] - searchLength[0], currentCursorPosition[0]))); - - if (mh.matches()) { - autocomplete = true; - return; - } - - String patternM = "^(.|\\s)*(:fedilab_morse:)$"; - final Pattern mPattern = Pattern.compile(patternM); - Matcher mm = mPattern.matcher((s.toString().substring(currentCursorPosition[0] - searchLength[0], currentCursorPosition[0]))); - if (mm.matches()) { - autocomplete = true; - return; - } - String[] searchInArray =(s.toString().substring(currentCursorPosition[0] - searchLength[0], currentCursorPosition[0])).split("\\s"); - if( searchInArray.length < 1){ - return; - } - String searchIn = searchInArray[searchInArray.length-1]; - Matcher m, mt; - m = sPattern.matcher(searchIn); - if (m.matches()) { - String search = m.group(); - if (pp_progress != null && pp_actionBar != null) { - pp_progress.setVisibility(View.VISIBLE); - pp_actionBar.setVisibility(View.GONE); - } - new RetrieveSearchAccountsAsyncTask(context, search, listenerAccount).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); - } else { - mt = tPattern.matcher(searchIn); - if (mt.matches()) { - String search = mt.group(3); - if (pp_progress != null && pp_actionBar != null) { - pp_progress.setVisibility(View.VISIBLE); - pp_actionBar.setVisibility(View.GONE); - } - new RetrieveSearchAsyncTask(context, search, true, listener).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); - } else { - mt = ePattern.matcher(searchIn); - if (mt.matches()) { - String shortcode = mt.group(3); - if (pp_progress != null && pp_actionBar != null) { - pp_progress.setVisibility(View.VISIBLE); - pp_actionBar.setVisibility(View.GONE); - } - new RetrieveEmojiAsyncTask(context, shortcode, listenerEmoji).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); - } else { - toot_content.dismissDropDown(); - } - } - } - - - totalChar = countLength(social, toot_content, toot_cw_content); - toot_space_left.setText(String.valueOf(totalChar)); - } - }; - return textw; - } - - - private BroadcastReceiver imageReceiver = new BroadcastReceiver() { - @Override - public void onReceive(Context context, Intent intent) { - String imgpath = intent.getStringExtra("imgpath"); - if (imgpath != null) { - prepareUpload(TootActivity.this, Uri.fromFile(new File(imgpath)), null, uploadReceiver); - } - } - }; - - private BroadcastReceiver add_new_media = new BroadcastReceiver() { - @Override - public void onReceive(Context context, Intent intent) { - - JSONObject response = null; - ArrayList successfullyUploadedFiles = null; - try { - response = new JSONObject(intent.getStringExtra("response")); - } catch (JSONException e) { - e.printStackTrace(); - } - successfullyUploadedFiles = intent.getStringArrayListExtra("uploadInfo"); - addNewMedia(response, successfullyUploadedFiles); - } - }; - - private void addNewMedia(JSONObject response, ArrayList successfullyUploadedFiles) { Attachment attachment; //response = new JSONObject(serverResponse.getBodyAsString()); @@ -1141,7 +1322,7 @@ public class TootActivity extends BaseActivity implements UploadStatusDelegate, boolean alreadyAdded = false; int index = 0; - if( attachments == null ){ + if (attachments == null) { attachments = new ArrayList<>(); } for (Attachment attach_ : attachments) { @@ -1206,7 +1387,7 @@ public class TootActivity extends BaseActivity implements UploadStatusDelegate, fileName = (String) pair.getKey(); it.remove(); } - if (fileName != null && fileName.toString().contains("fedilabins_")) { + if (fileName != null && fileName.contains("fedilabins_")) { wysiwyg.insertImage(resource); } } @@ -1271,7 +1452,7 @@ public class TootActivity extends BaseActivity implements UploadStatusDelegate, @Override public void onRequestPermissionsResult(int requestCode, - @NonNull String permissions[], @NonNull int[] grantResults) { + @NonNull String[] permissions, @NonNull int[] grantResults) { switch (requestCode) { case MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE: { // If request is cancelled, the result arrays are empty. @@ -1298,7 +1479,6 @@ public class TootActivity extends BaseActivity implements UploadStatusDelegate, mToast.show(); } - // Handles uploading shared images public void uploadSharedImage(ArrayList uri) { if (!uri.isEmpty()) { @@ -1325,10 +1505,6 @@ public class TootActivity extends BaseActivity implements UploadStatusDelegate, } } - String mCurrentPhotoPath; - File photoFile = null; - public static Uri photoFileUri = null; - private void dispatchTakePictureIntent() { Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); // Ensure that there's a camera activity to handle the intent @@ -1356,7 +1532,6 @@ public class TootActivity extends BaseActivity implements UploadStatusDelegate, } } - private File createImageFile() throws IOException { // Create an image file name String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.ENGLISH).format(new Date()); @@ -1438,7 +1613,6 @@ public class TootActivity extends BaseActivity implements UploadStatusDelegate, } } - private void prepareUpload(Activity activity, android.net.Uri uri, String filename, UploadServiceSingleBroadcastReceiver uploadReceiver) { if (uploadReceiver == null) { uploadReceiver = new UploadServiceSingleBroadcastReceiver(TootActivity.this); @@ -1447,162 +1621,6 @@ public class TootActivity extends BaseActivity implements UploadStatusDelegate, new asyncPicture(activity, account, social, uri, filename, uploadReceiver).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); } - static class asyncPicture extends AsyncTask { - - String commpressedFilePath; - WeakReference activityWeakReference; - android.net.Uri uriFile; - boolean error = false; - UploadServiceSingleBroadcastReceiver uploadReceiver; - String filename; - UpdateAccountInfoAsyncTask.SOCIAL social; - private Account account; - - asyncPicture(Activity activity, Account account, UpdateAccountInfoAsyncTask.SOCIAL social, android.net.Uri uri, String filename, UploadServiceSingleBroadcastReceiver uploadReceiver) { - this.activityWeakReference = new WeakReference<>(activity); - this.uriFile = uri; - this.uploadReceiver = uploadReceiver; - this.filename = filename; - this.social = social; - this.account = account; - } - - @Override - protected void onPreExecute() { - if (uriFile == null) { - Toasty.error(activityWeakReference.get(), activityWeakReference.get().getString(R.string.toast_error), Toast.LENGTH_SHORT).show(); - error = true; - } - if( activityWeakReference.get().findViewById(R.id.compression_loader) != null) { - activityWeakReference.get().findViewById(R.id.compression_loader).setVisibility(View.VISIBLE); - } - - } - - - @Override - protected Void doInBackground(Void... voids) { - if (error) { - return null; - } - commpressedFilePath = Helper.compressImagePath(activityWeakReference.get(), uriFile); - return null; - } - - @Override - protected void onPostExecute(Void result) { - activityWeakReference.get().findViewById(R.id.compression_loader).setVisibility(View.GONE); - activityWeakReference.get().findViewById(R.id.picture_scrollview).setVisibility(View.VISIBLE); - if (!error) { - if( commpressedFilePath != null){ - uriFile = Uri.fromFile(new File(commpressedFilePath)); - } - ImageButton toot_picture; - Button toot_it; - LinearLayout toot_picture_container; - toot_picture = this.activityWeakReference.get().findViewById(R.id.toot_picture); - toot_it = this.activityWeakReference.get().findViewById(R.id.toot_it); - toot_picture_container = this.activityWeakReference.get().findViewById(R.id.toot_picture_container); - - toot_picture_container.setVisibility(View.VISIBLE); - toot_picture.setEnabled(false); - toot_it.setEnabled(false); - if (filename == null) { - filename = Helper.getFileName(this.activityWeakReference.get(), uriFile); - } - filesMap.put(filename, uriFile); - - upload(activityWeakReference.get(), account, social, uriFile, filename, uploadReceiver); - } - } - } - - - static private void upload(Activity activity, Account account, UpdateAccountInfoAsyncTask.SOCIAL social, Uri inUri, String fname, UploadServiceSingleBroadcastReceiver uploadReceiver) { - String uploadId = UUID.randomUUID().toString(); - if (uploadReceiver != null) { - uploadReceiver.setUploadID(uploadId); - } - Uri uri; - InputStream tempInput = null; - FileOutputStream tempOut = null; - String filename = inUri.toString().substring(inUri.toString().lastIndexOf("/")); - int suffixPosition = filename.lastIndexOf("."); - String suffix = ""; - if (suffixPosition > 0) suffix = filename.substring(suffixPosition); - try { - File file; - tempInput = activity.getContentResolver().openInputStream(inUri); - if (fname.startsWith("fedilabins_")) { - file = File.createTempFile("fedilabins_randomTemp1", suffix, activity.getCacheDir()); - } else { - file = File.createTempFile("randomTemp1", suffix, activity.getCacheDir()); - } - - filesMap.put(file.getAbsolutePath(), inUri); - tempOut = new FileOutputStream(file.getAbsoluteFile()); - byte[] buff = new byte[1024]; - int read; - assert tempInput != null; - while ((read = tempInput.read(buff)) > 0) { - tempOut.write(buff, 0, read); - } - if (BuildConfig.DONATIONS) { - uri = FileProvider.getUriForFile(activity, - "fr.gouv.etalab.mastodon.fileProvider", - file); - } else { - uri = FileProvider.getUriForFile(activity, - "app.fedilab.android.fileProvider", - file); - } - tempInput.close(); - tempOut.close(); - } catch (IOException e) { - e.printStackTrace(); - uri = inUri; - } finally { - IOUtils.closeQuietly(tempInput); - IOUtils.closeQuietly(tempOut); - } - - try { - final String fileName = FileNameCleaner.cleanFileName(fname); - SharedPreferences sharedpreferences = activity.getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE); - String scheme = sharedpreferences.getString(Helper.SET_ONION_SCHEME +account.getInstance(), "https"); - String token = account.getToken(); - - int maxUploadRetryTimes = sharedpreferences.getInt(Helper.MAX_UPLOAD_IMG_RETRY_TIMES, 3); - String url; - if (social != UpdateAccountInfoAsyncTask.SOCIAL.GNU && social != UpdateAccountInfoAsyncTask.SOCIAL.FRIENDICA) { - url = scheme + "://" + account.getInstance() + "/api/v1/media"; - } else { - url = scheme + "://" + account.getInstance() + "/api/media/upload.json"; - } - UploadNotificationConfig uploadConfig = new UploadNotificationConfig(); - uploadConfig - .setClearOnActionForAllStatuses(true); - uploadConfig.getProgress().message = activity.getString(R.string.uploading); - uploadConfig.getCompleted().autoClear = true; - MultipartUploadRequest request = new MultipartUploadRequest(activity, uploadId, url); - if (token != null && !token.startsWith("Basic ")) - request.addHeader("Authorization", "Bearer " + token); - else if (token != null && token.startsWith("Basic ")) - request.addHeader("Authorization", token); - request.setNotificationConfig(uploadConfig); - if (social != UpdateAccountInfoAsyncTask.SOCIAL.GNU && social != UpdateAccountInfoAsyncTask.SOCIAL.FRIENDICA) { - request.addFileToUpload(uri.toString().replace("file://", ""), "file"); - } else { - request.addFileToUpload(uri.toString().replace("file://", ""), "media"); - } - ; - request.addParameter("filename", fileName).setMaxRetries(maxUploadRetryTimes) - .startUpload(); - } catch (MalformedURLException | FileNotFoundException e) { - e.printStackTrace(); - } - } - @Override public void onPostAction(int statusCode, API.StatusAction statusAction, String userId, Error error) { if (error != null) { @@ -1613,7 +1631,6 @@ public class TootActivity extends BaseActivity implements UploadStatusDelegate, } } - @Override public void onProgress(Context context, UploadInfo uploadInfo) { // your code here @@ -1656,7 +1673,6 @@ public class TootActivity extends BaseActivity implements UploadStatusDelegate, } - @Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); @@ -2174,7 +2190,6 @@ public class TootActivity extends BaseActivity implements UploadStatusDelegate, } } - private void sendToot(String timestamp, String content_type) { toot_it.setEnabled(false); if (!displayWYSIWYG() && toot_content.getText().toString().trim().length() == 0 && attachments.size() == 0) { @@ -2211,7 +2226,7 @@ public class TootActivity extends BaseActivity implements UploadStatusDelegate, createAndSendToot(tootContent, content_type, timestamp); } else { splitToot = Helper.splitToots(toot_content.getText().toString().trim(), split_toot_size, true); - if( splitToot.size() > 0 ) { + if (splitToot.size() > 0) { tootContent = splitToot.get(0); stepSpliToot = 1; @@ -2263,7 +2278,7 @@ public class TootActivity extends BaseActivity implements UploadStatusDelegate, }); AlertDialog alertDialog = builderInner.create(); alertDialog.show(); - }else{ //Failed to split the toot. + } else { //Failed to split the toot. if (!displayWYSIWYG()) { tootContent = toot_content.getText().toString().trim(); } else { @@ -2276,7 +2291,7 @@ public class TootActivity extends BaseActivity implements UploadStatusDelegate, } - private void createAndSendToot(String tootContent, String content_type, String timestamp){ + private void createAndSendToot(String tootContent, String content_type, String timestamp) { Status toot = new Status(); if (content_type != null) toot.setContentType(content_type); @@ -2316,7 +2331,6 @@ public class TootActivity extends BaseActivity implements UploadStatusDelegate, } } - private void serverSchedule(String time) { sendToot(time, null); isScheduled = true; @@ -2332,7 +2346,6 @@ public class TootActivity extends BaseActivity implements UploadStatusDelegate, resetForNextToot(); } - private void resetForNextToot() { //Clear content toot_content.setText(""); @@ -2409,7 +2422,6 @@ public class TootActivity extends BaseActivity implements UploadStatusDelegate, return true; } - @Override public void onDownloaded(String pathToFile, String url, Error error) { @@ -2491,7 +2503,6 @@ public class TootActivity extends BaseActivity implements UploadStatusDelegate, alertDialog.show(); } - /** * Removes a media * @@ -2544,7 +2555,6 @@ public class TootActivity extends BaseActivity implements UploadStatusDelegate, } - private void tootVisibilityDialog() { AlertDialog.Builder dialog = new AlertDialog.Builder(TootActivity.this, style); @@ -2585,13 +2595,11 @@ public class TootActivity extends BaseActivity implements UploadStatusDelegate, dialog.show(); } - @Override protected void onResume() { super.onResume(); } - @Override public void onPause() { super.onPause(); @@ -2789,7 +2797,7 @@ public class TootActivity extends BaseActivity implements UploadStatusDelegate, deltaSearch = oldContent.substring(currentCursorPosition - searchLength, currentCursorPosition); else { if (currentCursorPosition >= oldContent.length()) - deltaSearch = oldContent.substring(currentCursorPosition - searchLength, oldContent.length()); + deltaSearch = oldContent.substring(currentCursorPosition - searchLength); } if (!search.equals("")) @@ -2799,7 +2807,7 @@ public class TootActivity extends BaseActivity implements UploadStatusDelegate, newContent += "@" + account.getAcct() + " "; int newPosition = newContent.length(); if (currentCursorPosition < oldContent.length()) - newContent += oldContent.substring(currentCursorPosition, oldContent.length()); + newContent += oldContent.substring(currentCursorPosition); toot_content.setText(newContent); toot_space_left.setText(String.valueOf(countLength(social, toot_content, toot_cw_content))); toot_content.setSelection(newPosition); @@ -2845,7 +2853,7 @@ public class TootActivity extends BaseActivity implements UploadStatusDelegate, deltaSearch = oldContent.substring(currentCursorPosition - searchLength, currentCursorPosition); else { if (currentCursorPosition >= oldContent.length()) - deltaSearch = oldContent.substring(currentCursorPosition - searchLength, oldContent.length()); + deltaSearch = oldContent.substring(currentCursorPosition - searchLength); } if (!search.equals("")) @@ -2855,7 +2863,7 @@ public class TootActivity extends BaseActivity implements UploadStatusDelegate, newContent += "@" + suggestion.getContent() + " "; int newPosition = newContent.length(); if (currentCursorPosition < oldContent.length()) - newContent += oldContent.substring(currentCursorPosition, oldContent.length()); + newContent += oldContent.substring(currentCursorPosition); wysiwygEditText.setText(newContent); toot_space_left.setText(String.valueOf(countLength(wysiwyg, toot_cw_content))); wysiwygEditText.setSelection(newPosition); @@ -2881,7 +2889,7 @@ public class TootActivity extends BaseActivity implements UploadStatusDelegate, this.checkedValues.add(toot_content.getText().toString().contains("@" + account.getAcct())); } this.loader.setVisibility(View.GONE); - AccountsReplyAdapter contactAdapter = new AccountsReplyAdapter(new WeakReference<>(TootActivity.this),this.contacts, this.checkedValues); + AccountsReplyAdapter contactAdapter = new AccountsReplyAdapter(new WeakReference<>(TootActivity.this), this.contacts, this.checkedValues); this.lv_accounts_search.setAdapter(contactAdapter); } @@ -2925,7 +2933,7 @@ public class TootActivity extends BaseActivity implements UploadStatusDelegate, deltaSearch = oldContent.substring(currentCursorPosition - searchLength, currentCursorPosition); else { if (currentCursorPosition >= oldContent.length()) - deltaSearch = oldContent.substring(currentCursorPosition - searchLength, oldContent.length()); + deltaSearch = oldContent.substring(currentCursorPosition - searchLength); } if (!search.equals("")) @@ -2935,7 +2943,7 @@ public class TootActivity extends BaseActivity implements UploadStatusDelegate, newContent += ":" + shortcode + ": "; int newPosition = newContent.length(); if (currentCursorPosition < oldContent.length()) - newContent += oldContent.substring(currentCursorPosition, oldContent.length()); + newContent += oldContent.substring(currentCursorPosition); toot_content.setText(newContent); toot_space_left.setText(String.valueOf(countLength(social, toot_content, toot_cw_content))); toot_content.setSelection(newPosition); @@ -2981,7 +2989,7 @@ public class TootActivity extends BaseActivity implements UploadStatusDelegate, deltaSearch = oldContent.substring(currentCursorPosition - searchLength, currentCursorPosition); else { if (currentCursorPosition >= oldContent.length()) - deltaSearch = oldContent.substring(currentCursorPosition - searchLength, oldContent.length()); + deltaSearch = oldContent.substring(currentCursorPosition - searchLength); } if (!search.equals("")) @@ -2991,7 +2999,7 @@ public class TootActivity extends BaseActivity implements UploadStatusDelegate, newContent += ":" + suggestion.getContent() + ": "; int newPosition = newContent.length(); if (currentCursorPosition < oldContent.length()) - newContent += oldContent.substring(currentCursorPosition, oldContent.length()); + newContent += oldContent.substring(currentCursorPosition); wysiwygEditText.setText(newContent); toot_space_left.setText(String.valueOf(countLength(wysiwyg, toot_cw_content))); wysiwygEditText.setSelection(newPosition); @@ -3005,7 +3013,6 @@ public class TootActivity extends BaseActivity implements UploadStatusDelegate, } } - private void checkMastodon(Uri inUri) { try { Bitmap bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), inUri); @@ -3028,7 +3035,6 @@ public class TootActivity extends BaseActivity implements UploadStatusDelegate, } } - @Override public void onRetrieveSearch(APIResponse apiResponse) { @@ -3069,7 +3075,7 @@ public class TootActivity extends BaseActivity implements UploadStatusDelegate, deltaSearch = oldContent.substring(currentCursorPosition - searchLength, currentCursorPosition); else { if (currentCursorPosition >= oldContent.length()) - deltaSearch = oldContent.substring(currentCursorPosition - searchLength, oldContent.length()); + deltaSearch = oldContent.substring(currentCursorPosition - searchLength); } if (!search.equals("")) @@ -3079,7 +3085,7 @@ public class TootActivity extends BaseActivity implements UploadStatusDelegate, newContent += "#" + tag + " "; int newPosition = newContent.length(); if (currentCursorPosition < oldContent.length()) - newContent += oldContent.substring(currentCursorPosition, oldContent.length()); + newContent += oldContent.substring(currentCursorPosition); toot_content.setText(newContent); toot_space_left.setText(String.valueOf(countLength(social, toot_content, toot_cw_content))); toot_content.setSelection(newPosition); @@ -3124,7 +3130,7 @@ public class TootActivity extends BaseActivity implements UploadStatusDelegate, deltaSearch = oldContent.substring(currentCursorPosition - searchLength, currentCursorPosition); else { if (currentCursorPosition >= oldContent.length()) - deltaSearch = oldContent.substring(currentCursorPosition - searchLength, oldContent.length()); + deltaSearch = oldContent.substring(currentCursorPosition - searchLength); } if (!search.equals("")) @@ -3134,7 +3140,7 @@ public class TootActivity extends BaseActivity implements UploadStatusDelegate, newContent += "#" + suggestion.getContent() + " "; int newPosition = newContent.length(); if (currentCursorPosition < oldContent.length()) - newContent += oldContent.substring(currentCursorPosition, oldContent.length()); + newContent += oldContent.substring(currentCursorPosition); wysiwygEditText.setText(newContent); toot_space_left.setText(String.valueOf(countLength(wysiwyg, toot_cw_content))); wysiwygEditText.setSelection(newPosition); @@ -3338,7 +3344,6 @@ public class TootActivity extends BaseActivity implements UploadStatusDelegate, } } - private void restoreServerSchedule(Status status) { attachments = status.getMedia_attachments(); @@ -3589,90 +3594,6 @@ public class TootActivity extends BaseActivity implements UploadStatusDelegate, initialContent = displayWYSIWYG() ? wysiwyg.getContentAsHTML() : toot_content.getText().toString(); } - - public static void manageMentions(Context context, UpdateAccountInfoAsyncTask.SOCIAL social, String userIdReply, MastalabAutoCompleteTextView contentView, EditText CWView, TextView counterView, Status tootReply) { - - //Retrieves mentioned accounts + OP and adds them at the beginin of the toot - ArrayList mentionedAccountsAdded = new ArrayList<>(); - final SharedPreferences sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, MODE_PRIVATE); - int cursorReply = 0; - - if (tootReply.getAccount() != null && tootReply.getAccount().getAcct() != null && !tootReply.getAccount().getId().equals(userIdReply)) { - contentView.setText(String.format("@%s", tootReply.getAccount().getAcct())); - mentionedAccountsAdded.add(tootReply.getAccount().getAcct()); - //Evaluate the cursor position => mention length + 1 char for carriage return - cursorReply = contentView.getText().toString().length() + 1; - } - if (tootReply.getMentions() != null) { - //Put other accounts mentioned at the bottom - boolean capitalize = sharedpreferences.getBoolean(Helper.SET_CAPITALIZE, true); - if (capitalize) - contentView.setText(String.format("%s", (contentView.getText().toString() + "\n\n"))); - else - contentView.setText(String.format("%s", (contentView.getText().toString() + " "))); - for (Mention mention : tootReply.getMentions()) { - if (mention.getAcct() != null && !mention.getId().equals(userIdReply) && !mentionedAccountsAdded.contains(mention.getAcct())) { - mentionedAccountsAdded.add(mention.getAcct()); - String tootTemp = String.format("@%s ", mention.getAcct()); - contentView.setText(String.format("%s ", (contentView.getText().toString() + tootTemp.trim()))); - } - } - - contentView.setText(contentView.getText().toString().trim()); - if (contentView.getText().toString().startsWith("@")) { - if (capitalize) - contentView.append("\n"); - else - contentView.append(" "); - } - counterView.setText(String.valueOf(countLength(social, contentView, CWView))); - contentView.requestFocus(); - - if (capitalize) { - if (mentionedAccountsAdded.size() == 1) { - contentView.setSelection(contentView.getText().length()); //Put cursor at the end - } else { - if (cursorReply > 0 && cursorReply < contentView.getText().length()) - contentView.setSelection(cursorReply); - else - contentView.setSelection(contentView.getText().length()); //Put cursor at the end - } - } else { - contentView.setSelection(contentView.getText().length()); //Put cursor at the end - } - } - } - - - public static String manageMentions(Context context, String userIdReply, Status tootReply) { - String contentView = ""; - //Retrieves mentioned accounts + OP and adds them at the beginin of the toot - ArrayList mentionedAccountsAdded = new ArrayList<>(); - final SharedPreferences sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, MODE_PRIVATE); - - if (tootReply.getAccount() != null && tootReply.getAccount().getAcct() != null && !tootReply.getAccount().getId().equals(userIdReply)) { - contentView = String.format("@%s", tootReply.getAccount().getAcct()); - mentionedAccountsAdded.add(tootReply.getAccount().getAcct()); - //Evaluate the cursor position => mention length + 1 char for carriage return - } - if (tootReply.getMentions() != null) { - //Put other accounts mentioned at the bottom - contentView = String.format("%s", (contentView + " ")); - for (Mention mention : tootReply.getMentions()) { - if (mention.getAcct() != null && !mention.getId().equals(userIdReply) && !mentionedAccountsAdded.contains(mention.getAcct())) { - mentionedAccountsAdded.add(mention.getAcct()); - String tootTemp = String.format("@%s ", mention.getAcct()); - contentView = String.format("%s ", (contentView + tootTemp.trim())); - } - } - contentView = contentView.trim(); - if (contentView.startsWith("@")) { - contentView += " "; - } - } - return contentView; - } - private void displayPollPopup() { AlertDialog.Builder alertPoll = new AlertDialog.Builder(TootActivity.this, style); alertPoll.setTitle(R.string.create_poll); @@ -3964,7 +3885,6 @@ public class TootActivity extends BaseActivity implements UploadStatusDelegate, } - @Override public void onRetrieveAccountsReply(ArrayList accounts) { final boolean[] checkedValues = new boolean[accounts.size()]; @@ -4030,27 +3950,6 @@ public class TootActivity extends BaseActivity implements UploadStatusDelegate, } - public static int countLength(UpdateAccountInfoAsyncTask.SOCIAL social, MastalabAutoCompleteTextView toot_content, EditText toot_cw_content) { - if (toot_content == null || toot_cw_content == null) { - return -1; - } - String content = toot_content.getText().toString(); - String cwContent = toot_cw_content.getText().toString(); - String contentCount = content; - if (social == UpdateAccountInfoAsyncTask.SOCIAL.MASTODON) { - contentCount = contentCount.replaceAll("(^|[^/\\w])@(([a-z0-9_]+)@[a-z0-9\\.\\-]+[a-z0-9]+)", "$1@$3"); - Matcher matcherALink = Patterns.WEB_URL.matcher(contentCount); - while (matcherALink.find()) { - final String url = matcherALink.group(1); - contentCount = contentCount.replace(url, "abcdefghijklmnopkrstuvw"); - } - } - - int contentLength = contentCount.length() - countWithEmoji(content); - int cwLength = cwContent.length() - countWithEmoji(cwContent); - return cwLength + contentLength; - } - int countLength(Editor wysiwyg, EditText toot_cw_content) { if (wysiwyg == null || toot_cw_content == null) { return -1; @@ -4081,7 +3980,6 @@ public class TootActivity extends BaseActivity implements UploadStatusDelegate, .record(); } - private boolean displayWYSIWYG() { if (social != UpdateAccountInfoAsyncTask.SOCIAL.PLEROMA) { return false; @@ -4226,4 +4124,74 @@ public class TootActivity extends BaseActivity implements UploadStatusDelegate, int b = Color.blue(color); return String.format(Locale.getDefault(), "#%02X%02X%02X", r, g, b); } + + static class asyncPicture extends AsyncTask { + + String commpressedFilePath; + WeakReference activityWeakReference; + android.net.Uri uriFile; + boolean error = false; + UploadServiceSingleBroadcastReceiver uploadReceiver; + String filename; + UpdateAccountInfoAsyncTask.SOCIAL social; + private Account account; + + asyncPicture(Activity activity, Account account, UpdateAccountInfoAsyncTask.SOCIAL social, android.net.Uri uri, String filename, UploadServiceSingleBroadcastReceiver uploadReceiver) { + this.activityWeakReference = new WeakReference<>(activity); + this.uriFile = uri; + this.uploadReceiver = uploadReceiver; + this.filename = filename; + this.social = social; + this.account = account; + } + + @Override + protected void onPreExecute() { + if (uriFile == null) { + Toasty.error(activityWeakReference.get(), activityWeakReference.get().getString(R.string.toast_error), Toast.LENGTH_SHORT).show(); + error = true; + } + if (activityWeakReference.get().findViewById(R.id.compression_loader) != null) { + activityWeakReference.get().findViewById(R.id.compression_loader).setVisibility(View.VISIBLE); + } + + } + + + @Override + protected Void doInBackground(Void... voids) { + if (error) { + return null; + } + commpressedFilePath = Helper.compressImagePath(activityWeakReference.get(), uriFile); + return null; + } + + @Override + protected void onPostExecute(Void result) { + activityWeakReference.get().findViewById(R.id.compression_loader).setVisibility(View.GONE); + activityWeakReference.get().findViewById(R.id.picture_scrollview).setVisibility(View.VISIBLE); + if (!error) { + if (commpressedFilePath != null) { + uriFile = Uri.fromFile(new File(commpressedFilePath)); + } + ImageButton toot_picture; + Button toot_it; + LinearLayout toot_picture_container; + toot_picture = this.activityWeakReference.get().findViewById(R.id.toot_picture); + toot_it = this.activityWeakReference.get().findViewById(R.id.toot_it); + toot_picture_container = this.activityWeakReference.get().findViewById(R.id.toot_picture_container); + + toot_picture_container.setVisibility(View.VISIBLE); + toot_picture.setEnabled(false); + toot_it.setEnabled(false); + if (filename == null) { + filename = Helper.getFileName(this.activityWeakReference.get(), uriFile); + } + filesMap.put(filename, uriFile); + + upload(activityWeakReference.get(), account, social, uriFile, filename, uploadReceiver); + } + } + } } diff --git a/app/src/main/java/app/fedilab/android/activities/TootInfoActivity.java b/app/src/main/java/app/fedilab/android/activities/TootInfoActivity.java index a4594b4f9..72001de43 100644 --- a/app/src/main/java/app/fedilab/android/activities/TootInfoActivity.java +++ b/app/src/main/java/app/fedilab/android/activities/TootInfoActivity.java @@ -17,8 +17,8 @@ package app.fedilab.android.activities; import android.content.SharedPreferences; import android.os.Bundle; - -import com.google.android.material.tabs.TabLayout; +import android.view.ViewGroup; +import android.widget.Toast; import androidx.core.content.ContextCompat; import androidx.fragment.app.Fragment; @@ -27,17 +27,15 @@ import androidx.fragment.app.FragmentStatePagerAdapter; import androidx.viewpager.widget.PagerAdapter; import androidx.viewpager.widget.ViewPager; -import android.view.ViewGroup; -import android.view.Window; -import android.widget.Toast; +import com.google.android.material.tabs.TabLayout; import java.util.Objects; +import app.fedilab.android.R; +import app.fedilab.android.asynctasks.RetrieveAccountsAsyncTask; import app.fedilab.android.fragments.DisplayAccountsFragment; import app.fedilab.android.helper.Helper; import es.dmoral.toasty.Toasty; -import app.fedilab.android.R; -import app.fedilab.android.asynctasks.RetrieveAccountsAsyncTask; /** diff --git a/app/src/main/java/app/fedilab/android/activities/WebviewActivity.java b/app/src/main/java/app/fedilab/android/activities/WebviewActivity.java index aecb09901..9860c33f4 100644 --- a/app/src/main/java/app/fedilab/android/activities/WebviewActivity.java +++ b/app/src/main/java/app/fedilab/android/activities/WebviewActivity.java @@ -29,26 +29,25 @@ import android.os.AsyncTask; import android.os.Build; import android.os.Bundle; import android.os.Handler; - -import androidx.core.app.ActivityCompat; -import androidx.core.content.ContextCompat; -import androidx.appcompat.app.AlertDialog; - import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.view.WindowManager; import android.webkit.DownloadListener; -import android.webkit.WebView; import android.widget.ArrayAdapter; import android.widget.FrameLayout; import android.widget.Toast; +import androidx.appcompat.app.AlertDialog; +import androidx.core.app.ActivityCompat; +import androidx.core.content.ContextCompat; + import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.List; +import app.fedilab.android.R; import app.fedilab.android.client.API; import app.fedilab.android.client.APIResponse; import app.fedilab.android.helper.CountDrawable; @@ -60,7 +59,6 @@ import app.fedilab.android.webview.MastalabWebChromeClient; import app.fedilab.android.webview.MastalabWebViewClient; import app.fedilab.android.webview.ProxyHelper; import es.dmoral.toasty.Toasty; -import app.fedilab.android.R; /** @@ -70,11 +68,11 @@ import app.fedilab.android.R; public class WebviewActivity extends BaseActivity { + public static List trackingDomains; private String url; private String peertubeLinkToFetch; private boolean peertubeLink; private CustomWebview webView; - public static List trackingDomains; private Menu defaultMenu; private MastalabWebViewClient mastalabWebViewClient; diff --git a/app/src/main/java/app/fedilab/android/activities/WebviewConnectActivity.java b/app/src/main/java/app/fedilab/android/activities/WebviewConnectActivity.java index e55fb2326..371a7df33 100644 --- a/app/src/main/java/app/fedilab/android/activities/WebviewConnectActivity.java +++ b/app/src/main/java/app/fedilab/android/activities/WebviewConnectActivity.java @@ -23,12 +23,6 @@ import android.graphics.drawable.ColorDrawable; import android.os.AsyncTask; import android.os.Build; import android.os.Bundle; - -import androidx.appcompat.app.ActionBar; -import androidx.appcompat.app.AlertDialog; -import androidx.appcompat.widget.Toolbar; -import androidx.core.content.ContextCompat; - import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -43,18 +37,22 @@ import android.widget.ProgressBar; import android.widget.TextView; import android.widget.Toast; +import androidx.appcompat.app.ActionBar; +import androidx.appcompat.app.AlertDialog; +import androidx.core.content.ContextCompat; + import org.json.JSONException; import org.json.JSONObject; import java.util.HashMap; +import app.fedilab.android.R; +import app.fedilab.android.asynctasks.UpdateAccountInfoAsyncTask; import app.fedilab.android.client.HttpsConnection; import app.fedilab.android.helper.Helper; import app.fedilab.android.webview.CustomWebview; import app.fedilab.android.webview.ProxyHelper; import es.dmoral.toasty.Toasty; -import app.fedilab.android.R; -import app.fedilab.android.asynctasks.UpdateAccountInfoAsyncTask; /** * Created by Thomas on 24/04/2017. @@ -69,6 +67,23 @@ public class WebviewConnectActivity extends BaseActivity { private String instance; private UpdateAccountInfoAsyncTask.SOCIAL social; + @SuppressWarnings("deprecation") + public static void clearCookies(Context context) { + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1) { + CookieManager.getInstance().removeAllCookies(null); + CookieManager.getInstance().flush(); + } else { + CookieSyncManager cookieSyncMngr = CookieSyncManager.createInstance(context); + cookieSyncMngr.startSync(); + CookieManager cookieManager = CookieManager.getInstance(); + cookieManager.removeAllCookie(); + cookieManager.removeSessionCookie(); + cookieSyncMngr.stopSync(); + cookieSyncMngr.sync(); + } + } + public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); SharedPreferences sharedpreferences = getSharedPreferences(Helper.APP_PREFS, android.content.Context.MODE_PRIVATE); @@ -152,7 +167,7 @@ public class WebviewConnectActivity extends BaseActivity { public boolean shouldOverrideUrlLoading(WebView view, String url) { super.shouldOverrideUrlLoading(view, url); if (url.contains(Helper.REDIRECT_CONTENT_WEB)) { - String val[] = url.split("code="); + String[] val = url.split("code="); if (val.length < 2) { Toasty.error(getApplicationContext(), getString(R.string.toast_code_error), Toast.LENGTH_LONG).show(); Intent myIntent = new Intent(WebviewConnectActivity.this, LoginActivity.class); @@ -201,7 +216,6 @@ public class WebviewConnectActivity extends BaseActivity { webView.loadUrl(LoginActivity.redirectUserToAuthorizeAndLogin(getApplicationContext(), social, clientId, instance)); } - @Override public void onBackPressed() { if (webView != null && webView.canGoBack()) { @@ -211,7 +225,6 @@ public class WebviewConnectActivity extends BaseActivity { } } - @Override public void onDestroy() { super.onDestroy(); @@ -220,21 +233,4 @@ public class WebviewConnectActivity extends BaseActivity { alert = null; } } - - @SuppressWarnings("deprecation") - public static void clearCookies(Context context) { - - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1) { - CookieManager.getInstance().removeAllCookies(null); - CookieManager.getInstance().flush(); - } else { - CookieSyncManager cookieSyncMngr = CookieSyncManager.createInstance(context); - cookieSyncMngr.startSync(); - CookieManager cookieManager = CookieManager.getInstance(); - cookieManager.removeAllCookie(); - cookieManager.removeSessionCookie(); - cookieSyncMngr.stopSync(); - cookieSyncMngr.sync(); - } - } } \ No newline at end of file diff --git a/app/src/main/java/app/fedilab/android/activities/WhoToFollowActivity.java b/app/src/main/java/app/fedilab/android/activities/WhoToFollowActivity.java index eff5f6f7f..e1a06950d 100644 --- a/app/src/main/java/app/fedilab/android/activities/WhoToFollowActivity.java +++ b/app/src/main/java/app/fedilab/android/activities/WhoToFollowActivity.java @@ -19,10 +19,6 @@ import android.content.SharedPreferences; import android.os.AsyncTask; import android.os.Bundle; import android.os.Handler; - -import androidx.core.content.ContextCompat; -import androidx.appcompat.widget.Toolbar; - import android.view.MenuItem; import android.view.View; import android.widget.Button; @@ -31,11 +27,17 @@ import android.widget.RelativeLayout; import android.widget.TextView; import android.widget.Toast; +import androidx.appcompat.widget.Toolbar; + import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.List; +import app.fedilab.android.R; +import app.fedilab.android.asynctasks.ManageListsAsyncTask; +import app.fedilab.android.asynctasks.PostActionAsyncTask; +import app.fedilab.android.asynctasks.WhoToFollowAsyncTask; import app.fedilab.android.client.API; import app.fedilab.android.client.APIResponse; import app.fedilab.android.client.Entities.Account; @@ -43,14 +45,10 @@ import app.fedilab.android.client.Entities.Error; import app.fedilab.android.client.Entities.TrunkAccount; import app.fedilab.android.drawers.WhoToFollowAccountsAdapter; import app.fedilab.android.helper.Helper; -import es.dmoral.toasty.Toasty; -import app.fedilab.android.R; -import app.fedilab.android.asynctasks.ManageListsAsyncTask; -import app.fedilab.android.asynctasks.PostActionAsyncTask; -import app.fedilab.android.asynctasks.WhoToFollowAsyncTask; import app.fedilab.android.interfaces.OnListActionInterface; import app.fedilab.android.interfaces.OnPostActionInterface; import app.fedilab.android.interfaces.OnRetrieveWhoToFollowInterface; +import es.dmoral.toasty.Toasty; /** diff --git a/app/src/main/java/app/fedilab/android/asynctasks/CreateMastodonAccountAsyncTask.java b/app/src/main/java/app/fedilab/android/asynctasks/CreateMastodonAccountAsyncTask.java index 5b9711f3d..44f5d4fb1 100644 --- a/app/src/main/java/app/fedilab/android/asynctasks/CreateMastodonAccountAsyncTask.java +++ b/app/src/main/java/app/fedilab/android/asynctasks/CreateMastodonAccountAsyncTask.java @@ -51,9 +51,9 @@ public class CreateMastodonAccountAsyncTask extends AsyncTask @Override protected Void doInBackground(Void... params) { - if( type == RetrieveInstanceRegAsyncTask.instanceType.MASTODON) { + if (type == RetrieveInstanceRegAsyncTask.instanceType.MASTODON) { apiResponse = new API(contextReference.get(), instance, null).createAccount(accountCreation); - }else{ + } else { apiResponse = new PeertubeAPI(contextReference.get(), instance, null).createAccount(accountCreation); } return null; diff --git a/app/src/main/java/app/fedilab/android/asynctasks/DownloadTrackingDomainsAsyncTask.java b/app/src/main/java/app/fedilab/android/asynctasks/DownloadTrackingDomainsAsyncTask.java index 3e5a5bcd2..654f1cf4a 100644 --- a/app/src/main/java/app/fedilab/android/asynctasks/DownloadTrackingDomainsAsyncTask.java +++ b/app/src/main/java/app/fedilab/android/asynctasks/DownloadTrackingDomainsAsyncTask.java @@ -32,10 +32,10 @@ import java.util.List; import javax.net.ssl.HttpsURLConnection; +import app.fedilab.android.R; import app.fedilab.android.sqlite.DomainBlockDAO; import app.fedilab.android.sqlite.Sqlite; import es.dmoral.toasty.Toasty; -import app.fedilab.android.R; /** * Created by NickFreeman on 11/05/2019. diff --git a/app/src/main/java/app/fedilab/android/asynctasks/ManageFiltersAsyncTask.java b/app/src/main/java/app/fedilab/android/asynctasks/ManageFiltersAsyncTask.java index 55d975692..803eb1bd8 100644 --- a/app/src/main/java/app/fedilab/android/asynctasks/ManageFiltersAsyncTask.java +++ b/app/src/main/java/app/fedilab/android/asynctasks/ManageFiltersAsyncTask.java @@ -32,21 +32,12 @@ import app.fedilab.android.interfaces.OnFilterActionInterface; public class ManageFiltersAsyncTask extends AsyncTask { - public enum action { - GET_FILTER, - GET_ALL_FILTER, - CREATE_FILTER, - DELETE_FILTER, - UPDATE_FILTER, - } - private OnFilterActionInterface listener; private APIResponse apiResponse; private int statusCode; private action apiAction; private WeakReference contextReference; private Filters filter; - public ManageFiltersAsyncTask(Context context, action apiAction, Filters filter, OnFilterActionInterface onFilterActionInterface) { contextReference = new WeakReference<>(context); this.listener = onFilterActionInterface; @@ -54,7 +45,6 @@ public class ManageFiltersAsyncTask extends AsyncTask { this.apiAction = apiAction; } - @Override protected Void doInBackground(Void... params) { if (apiAction == action.GET_ALL_FILTER) { @@ -76,4 +66,12 @@ public class ManageFiltersAsyncTask extends AsyncTask { listener.onActionDone(this.apiAction, apiResponse, statusCode); } + public enum action { + GET_FILTER, + GET_ALL_FILTER, + CREATE_FILTER, + DELETE_FILTER, + UPDATE_FILTER, + } + } diff --git a/app/src/main/java/app/fedilab/android/asynctasks/ManageListsAsyncTask.java b/app/src/main/java/app/fedilab/android/asynctasks/ManageListsAsyncTask.java index a71565434..7aa85117b 100644 --- a/app/src/main/java/app/fedilab/android/asynctasks/ManageListsAsyncTask.java +++ b/app/src/main/java/app/fedilab/android/asynctasks/ManageListsAsyncTask.java @@ -31,18 +31,6 @@ import app.fedilab.android.interfaces.OnListActionInterface; public class ManageListsAsyncTask extends AsyncTask { - public enum action { - GET_LIST, - GET_LIST_TIMELINE, - GET_LIST_ACCOUNT, - CREATE_LIST, - DELETE_LIST, - UPDATE_LIST, - ADD_USERS, - DELETE_USERS, - SEARCH_USER - } - private OnListActionInterface listener; private APIResponse apiResponse; private int statusCode; @@ -55,7 +43,6 @@ public class ManageListsAsyncTask extends AsyncTask { private String max_id, since_id; private int limit; private String search; - public ManageListsAsyncTask(Context context, action apiAction, String[] accountsId, String targetedId, String listId, String title, OnListActionInterface onListActionInterface) { contextReference = new WeakReference<>(context); this.listener = onListActionInterface; @@ -112,4 +99,16 @@ public class ManageListsAsyncTask extends AsyncTask { listener.onActionDone(this.apiAction, apiResponse, statusCode); } + public enum action { + GET_LIST, + GET_LIST_TIMELINE, + GET_LIST_ACCOUNT, + CREATE_LIST, + DELETE_LIST, + UPDATE_LIST, + ADD_USERS, + DELETE_USERS, + SEARCH_USER + } + } diff --git a/app/src/main/java/app/fedilab/android/asynctasks/ManagePlaylistsAsyncTask.java b/app/src/main/java/app/fedilab/android/asynctasks/ManagePlaylistsAsyncTask.java index 97300c7e5..2658694a9 100644 --- a/app/src/main/java/app/fedilab/android/asynctasks/ManagePlaylistsAsyncTask.java +++ b/app/src/main/java/app/fedilab/android/asynctasks/ManagePlaylistsAsyncTask.java @@ -20,7 +20,6 @@ import android.database.sqlite.SQLiteDatabase; import android.os.AsyncTask; import java.lang.ref.WeakReference; -import java.util.List; import app.fedilab.android.client.APIResponse; import app.fedilab.android.client.Entities.Account; @@ -39,17 +38,6 @@ import app.fedilab.android.sqlite.Sqlite; public class ManagePlaylistsAsyncTask extends AsyncTask { - public enum action { - GET_PLAYLIST, - GET_LIST_VIDEOS, - CREATE_PLAYLIST, - DELETE_PLAYLIST, - UPDATE_PLAYLIST, - ADD_VIDEOS, - DELETE_VIDEOS, - GET_PLAYLIST_FOR_VIDEO, - } - private OnPlaylistActionInterface listener; private APIResponse apiResponse; private int statusCode; @@ -58,7 +46,6 @@ public class ManagePlaylistsAsyncTask extends AsyncTask { private String max_id; private Playlist playlist; private String videoId; - public ManagePlaylistsAsyncTask(Context context, action apiAction, Playlist playlist, String videoId, String max_id, OnPlaylistActionInterface onPlaylistActionInterface) { contextReference = new WeakReference<>(context); this.listener = onPlaylistActionInterface; @@ -68,7 +55,6 @@ public class ManagePlaylistsAsyncTask extends AsyncTask { this.videoId = videoId; } - @Override protected Void doInBackground(Void... params) { SharedPreferences sharedpreferences = contextReference.get().getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE); @@ -97,4 +83,15 @@ public class ManagePlaylistsAsyncTask extends AsyncTask { listener.onActionDone(this.apiAction, apiResponse, statusCode); } + public enum action { + GET_PLAYLIST, + GET_LIST_VIDEOS, + CREATE_PLAYLIST, + DELETE_PLAYLIST, + UPDATE_PLAYLIST, + ADD_VIDEOS, + DELETE_VIDEOS, + GET_PLAYLIST_FOR_VIDEO, + } + } diff --git a/app/src/main/java/app/fedilab/android/asynctasks/ManagePollAsyncTask.java b/app/src/main/java/app/fedilab/android/asynctasks/ManagePollAsyncTask.java index 9f23e061d..1bfc7eda0 100644 --- a/app/src/main/java/app/fedilab/android/asynctasks/ManagePollAsyncTask.java +++ b/app/src/main/java/app/fedilab/android/asynctasks/ManagePollAsyncTask.java @@ -39,11 +39,6 @@ public class ManagePollAsyncTask extends AsyncTask { private Poll poll; private type_s type; - public enum type_s { - SUBMIT, - REFRESH - } - public ManagePollAsyncTask(Context context, type_s type, app.fedilab.android.client.Entities.Status status, int[] choices, OnPollInterface onPollInterface) { this.contextReference = new WeakReference<>(context); this.listener = onPollInterface; @@ -75,4 +70,9 @@ public class ManagePollAsyncTask extends AsyncTask { listener.onPoll(status, poll); } + public enum type_s { + SUBMIT, + REFRESH + } + } diff --git a/app/src/main/java/app/fedilab/android/asynctasks/PostActionAsyncTask.java b/app/src/main/java/app/fedilab/android/asynctasks/PostActionAsyncTask.java index 69f8a7add..dbee37368 100644 --- a/app/src/main/java/app/fedilab/android/asynctasks/PostActionAsyncTask.java +++ b/app/src/main/java/app/fedilab/android/asynctasks/PostActionAsyncTask.java @@ -22,16 +22,15 @@ import android.os.SystemClock; import java.lang.ref.WeakReference; import java.util.List; +import app.fedilab.android.activities.MainActivity; import app.fedilab.android.client.API; import app.fedilab.android.client.APIResponse; import app.fedilab.android.client.Entities.Account; import app.fedilab.android.client.Entities.Error; -import app.fedilab.android.client.Entities.Status; import app.fedilab.android.client.Entities.StoredStatus; import app.fedilab.android.client.GNUAPI; import app.fedilab.android.client.PeertubeAPI; import app.fedilab.android.helper.Helper; -import app.fedilab.android.activities.MainActivity; import app.fedilab.android.interfaces.OnPostActionInterface; import app.fedilab.android.sqlite.Sqlite; import app.fedilab.android.sqlite.StatusCacheDAO; @@ -186,12 +185,12 @@ public class PostActionAsyncTask extends AsyncTask { api.scheduledAction("PUT", storedStatus.getStatus(), null, storedStatus.getScheduledServerdId()); } else if (apiAction == API.StatusAction.DELETESCHEDULED) { api.scheduledAction("DELETE", null, null, storedStatus.getScheduledServerdId()); - } else if (apiAction == API.StatusAction.MUTE_NOTIFICATIONS){ + } else if (apiAction == API.StatusAction.MUTE_NOTIFICATIONS) { statusCode = api.muteNotifications(targetedId, muteNotifications); - } else if (apiAction == API.StatusAction.UNBOOKMARK && targetedId == null){ + } else if (apiAction == API.StatusAction.UNBOOKMARK && targetedId == null) { SQLiteDatabase db = Sqlite.getInstance(contextReference.get(), Sqlite.DB_NAME, null, Sqlite.DB_VERSION).open(); List bookmarks = new StatusCacheDAO(contextReference.get(), db).getAllStatus(StatusCacheDAO.BOOKMARK_CACHE); - for (app.fedilab.android.client.Entities.Status status: bookmarks){ + for (app.fedilab.android.client.Entities.Status status : bookmarks) { statusCode = api.postAction(apiAction, status.getId()); try { Thread.sleep(200); @@ -200,7 +199,7 @@ public class PostActionAsyncTask extends AsyncTask { } } new StatusCacheDAO(contextReference.get(), db).removeAllStatus(StatusCacheDAO.BOOKMARK_CACHE); - }else{ + } else { statusCode = api.postAction(apiAction, targetedId); } } @@ -249,7 +248,7 @@ public class PostActionAsyncTask extends AsyncTask { @Override protected void onPostExecute(Void result) { - if( listener != null) { + if (listener != null) { listener.onPostAction(statusCode, apiAction, targetedId, error); } } diff --git a/app/src/main/java/app/fedilab/android/asynctasks/PostAdminActionAsyncTask.java b/app/src/main/java/app/fedilab/android/asynctasks/PostAdminActionAsyncTask.java index 5fb851811..43395cbcc 100644 --- a/app/src/main/java/app/fedilab/android/asynctasks/PostAdminActionAsyncTask.java +++ b/app/src/main/java/app/fedilab/android/asynctasks/PostAdminActionAsyncTask.java @@ -22,7 +22,6 @@ import java.lang.ref.WeakReference; import app.fedilab.android.client.API; import app.fedilab.android.client.APIResponse; import app.fedilab.android.client.Entities.AdminAction; -import app.fedilab.android.helper.Helper; import app.fedilab.android.interfaces.OnAdminActionInterface; diff --git a/app/src/main/java/app/fedilab/android/asynctasks/PostStatusAsyncTask.java b/app/src/main/java/app/fedilab/android/asynctasks/PostStatusAsyncTask.java index eb7a42bc6..b1291a760 100644 --- a/app/src/main/java/app/fedilab/android/asynctasks/PostStatusAsyncTask.java +++ b/app/src/main/java/app/fedilab/android/asynctasks/PostStatusAsyncTask.java @@ -22,16 +22,16 @@ import java.lang.ref.WeakReference; import java.util.List; import java.util.regex.Matcher; +import app.fedilab.android.R; import app.fedilab.android.client.API; import app.fedilab.android.client.APIResponse; import app.fedilab.android.client.Entities.Account; import app.fedilab.android.client.Entities.Error; import app.fedilab.android.client.GNUAPI; import app.fedilab.android.helper.Helper; +import app.fedilab.android.interfaces.OnPostStatusActionInterface; import app.fedilab.android.sqlite.Sqlite; import app.fedilab.android.sqlite.TagsCacheDAO; -import app.fedilab.android.R; -import app.fedilab.android.interfaces.OnPostStatusActionInterface; /** @@ -88,7 +88,7 @@ public class PostStatusAsyncTask extends AsyncTask { apiResponse.setError(error); } } - if( status.getIn_reply_to_id() != null){ + if (status.getIn_reply_to_id() != null) { apiResponse.setTargetedId(status.getIn_reply_to_id()); } @@ -126,7 +126,7 @@ public class PostStatusAsyncTask extends AsyncTask { } }; thread.start(); - if( account != null) { + if (account != null) { String key = account.getUsername() + "@" + account.getInstance(); Helper.sleeps.put(key, 30000); Helper.startStreaming(contextReference.get()); diff --git a/app/src/main/java/app/fedilab/android/asynctasks/RetrieveAccountAsyncTask.java b/app/src/main/java/app/fedilab/android/asynctasks/RetrieveAccountAsyncTask.java index d13712b8b..c390bda31 100644 --- a/app/src/main/java/app/fedilab/android/asynctasks/RetrieveAccountAsyncTask.java +++ b/app/src/main/java/app/fedilab/android/asynctasks/RetrieveAccountAsyncTask.java @@ -19,12 +19,12 @@ import android.os.AsyncTask; import java.lang.ref.WeakReference; +import app.fedilab.android.activities.MainActivity; import app.fedilab.android.client.API; import app.fedilab.android.client.Entities.Account; import app.fedilab.android.client.Entities.Error; import app.fedilab.android.client.GNUAPI; import app.fedilab.android.client.PeertubeAPI; -import app.fedilab.android.activities.MainActivity; import app.fedilab.android.interfaces.OnRetrieveAccountInterface; diff --git a/app/src/main/java/app/fedilab/android/asynctasks/RetrieveAccountsAsyncTask.java b/app/src/main/java/app/fedilab/android/asynctasks/RetrieveAccountsAsyncTask.java index fb88ca2ef..0070bb7ce 100644 --- a/app/src/main/java/app/fedilab/android/asynctasks/RetrieveAccountsAsyncTask.java +++ b/app/src/main/java/app/fedilab/android/asynctasks/RetrieveAccountsAsyncTask.java @@ -19,10 +19,10 @@ import android.os.AsyncTask; import java.lang.ref.WeakReference; +import app.fedilab.android.activities.MainActivity; import app.fedilab.android.client.API; import app.fedilab.android.client.APIResponse; import app.fedilab.android.client.GNUAPI; -import app.fedilab.android.activities.MainActivity; import app.fedilab.android.interfaces.OnRetrieveAccountsInterface; @@ -41,18 +41,6 @@ public class RetrieveAccountsAsyncTask extends AsyncTask { private WeakReference contextReference; private String instance, name; - public enum Type { - BLOCKED, - MUTED, - FOLLOWING, - FOLLOWERS, - CHANNELS, - REBLOGGED, - FAVOURITED, - SEARCH, - GROUPS - } - public RetrieveAccountsAsyncTask(Context context, String instance, String name, OnRetrieveAccountsInterface onRetrieveAccountsInterface) { this.contextReference = new WeakReference<>(context); this.instance = instance; @@ -160,4 +148,16 @@ public class RetrieveAccountsAsyncTask extends AsyncTask { listener.onRetrieveAccounts(apiResponse); } + public enum Type { + BLOCKED, + MUTED, + FOLLOWING, + FOLLOWERS, + CHANNELS, + REBLOGGED, + FAVOURITED, + SEARCH, + GROUPS + } + } diff --git a/app/src/main/java/app/fedilab/android/asynctasks/RetrieveAccountsForReplyAsyncTask.java b/app/src/main/java/app/fedilab/android/asynctasks/RetrieveAccountsForReplyAsyncTask.java index 6a02c8910..513c4ca13 100644 --- a/app/src/main/java/app/fedilab/android/asynctasks/RetrieveAccountsForReplyAsyncTask.java +++ b/app/src/main/java/app/fedilab/android/asynctasks/RetrieveAccountsForReplyAsyncTask.java @@ -25,9 +25,9 @@ import java.util.ArrayList; import app.fedilab.android.client.API; import app.fedilab.android.client.Entities.Account; import app.fedilab.android.helper.Helper; +import app.fedilab.android.interfaces.OnRetrieveAccountsReplyInterface; import app.fedilab.android.sqlite.AccountDAO; import app.fedilab.android.sqlite.Sqlite; -import app.fedilab.android.interfaces.OnRetrieveAccountsReplyInterface; /** diff --git a/app/src/main/java/app/fedilab/android/asynctasks/RetrieveContextAsyncTask.java b/app/src/main/java/app/fedilab/android/asynctasks/RetrieveContextAsyncTask.java index c09772339..882f562ef 100644 --- a/app/src/main/java/app/fedilab/android/asynctasks/RetrieveContextAsyncTask.java +++ b/app/src/main/java/app/fedilab/android/asynctasks/RetrieveContextAsyncTask.java @@ -19,11 +19,11 @@ import android.os.AsyncTask; import java.lang.ref.WeakReference; +import app.fedilab.android.activities.MainActivity; import app.fedilab.android.client.API; import app.fedilab.android.client.APIResponse; import app.fedilab.android.client.Entities.Error; import app.fedilab.android.client.GNUAPI; -import app.fedilab.android.activities.MainActivity; import app.fedilab.android.interfaces.OnRetrieveContextInterface; diff --git a/app/src/main/java/app/fedilab/android/asynctasks/RetrieveEmojiAsyncTask.java b/app/src/main/java/app/fedilab/android/asynctasks/RetrieveEmojiAsyncTask.java index b68eb1a63..c78316938 100644 --- a/app/src/main/java/app/fedilab/android/asynctasks/RetrieveEmojiAsyncTask.java +++ b/app/src/main/java/app/fedilab/android/asynctasks/RetrieveEmojiAsyncTask.java @@ -22,9 +22,9 @@ import java.lang.ref.WeakReference; import java.util.List; import app.fedilab.android.client.Entities.Emojis; +import app.fedilab.android.interfaces.OnRetrieveEmojiInterface; import app.fedilab.android.sqlite.CustomEmojiDAO; import app.fedilab.android.sqlite.Sqlite; -import app.fedilab.android.interfaces.OnRetrieveEmojiInterface; /** diff --git a/app/src/main/java/app/fedilab/android/asynctasks/RetrieveFeedsAfterBookmarkAsyncTask.java b/app/src/main/java/app/fedilab/android/asynctasks/RetrieveFeedsAfterBookmarkAsyncTask.java index 50d72cc39..56a57ea1a 100644 --- a/app/src/main/java/app/fedilab/android/asynctasks/RetrieveFeedsAfterBookmarkAsyncTask.java +++ b/app/src/main/java/app/fedilab/android/asynctasks/RetrieveFeedsAfterBookmarkAsyncTask.java @@ -21,7 +21,6 @@ import java.lang.ref.WeakReference; import app.fedilab.android.client.API; import app.fedilab.android.client.APIResponse; -import app.fedilab.android.helper.Helper; import app.fedilab.android.interfaces.OnRetrieveFeedsAfterBookmarkInterface; diff --git a/app/src/main/java/app/fedilab/android/asynctasks/RetrieveFeedsAsyncTask.java b/app/src/main/java/app/fedilab/android/asynctasks/RetrieveFeedsAsyncTask.java index edac58351..53a885396 100644 --- a/app/src/main/java/app/fedilab/android/asynctasks/RetrieveFeedsAsyncTask.java +++ b/app/src/main/java/app/fedilab/android/asynctasks/RetrieveFeedsAsyncTask.java @@ -18,11 +18,11 @@ import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.os.AsyncTask; - import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.List; +import app.fedilab.android.activities.MainActivity; import app.fedilab.android.client.API; import app.fedilab.android.client.APIResponse; import app.fedilab.android.client.Entities.ManageTimelines; @@ -30,19 +30,16 @@ import app.fedilab.android.client.Entities.Peertube; import app.fedilab.android.client.Entities.RemoteInstance; import app.fedilab.android.client.Entities.Results; import app.fedilab.android.client.Entities.RetrieveFeedsParam; -import app.fedilab.android.client.Entities.Status; import app.fedilab.android.client.GNUAPI; import app.fedilab.android.client.PeertubeAPI; import app.fedilab.android.helper.FilterToots; -import app.fedilab.android.helper.Helper; +import app.fedilab.android.interfaces.OnRetrieveFeedsInterface; import app.fedilab.android.sqlite.InstancesDAO; import app.fedilab.android.sqlite.PeertubeFavoritesDAO; import app.fedilab.android.sqlite.Sqlite; import app.fedilab.android.sqlite.StatusCacheDAO; import app.fedilab.android.sqlite.TimelineCacheDAO; import app.fedilab.android.sqlite.TimelinesDAO; -import app.fedilab.android.activities.MainActivity; -import app.fedilab.android.interfaces.OnRetrieveFeedsInterface; /** @@ -70,62 +67,6 @@ public class RetrieveFeedsAsyncTask extends AsyncTask { private String currentfilter; private String social; - public enum Type { - HOME, - LOCAL, - DIRECT, - CONVERSATION, - PUBLIC, - HASHTAG, - LIST, - USER, - FAVOURITES, - ONESTATUS, - CONTEXT, - TAG, - REMOTE_INSTANCE, - REMOTE_INSTANCE_FILTERED, - ART, - PEERTUBE, - NOTIFICATION, - SEARCH, - NEWS, - - PSUBSCRIPTIONS, - POVERVIEW, - PTRENDING, - PRECENTLYADDED, - PMYVIDEOS, - PLOCAL, - CHANNEL, - MYVIDEOS, - PEERTUBE_HISTORY, - - PIXELFED, - PF_HOME, - PF_LOCAL, - PF_DISCOVER, - PF_NOTIFICATION, - PF_REPLIES, - - - GNU_HOME, - GNU_LOCAL, - GNU_WHOLE, - GNU_NOTIFICATION, - GNU_DM, - GNU_ART, - GNU_TAG, - GNU_GROUP_TIMELINE, - - SCHEDULED_TOOTS, - CACHE_BOOKMARKS, - CACHE_BOOKMARKS_PEERTUBE, - CACHE_STATUS, - - } - - public RetrieveFeedsAsyncTask(Context context, FilterToots filterToots, String max_id, OnRetrieveFeedsInterface onRetrieveFeedsInterface) { this.contextReference = new WeakReference<>(context); this.action = Type.CACHE_STATUS; @@ -142,6 +83,7 @@ public class RetrieveFeedsAsyncTask extends AsyncTask { this.listener = onRetrieveFeedsInterface; } + public RetrieveFeedsAsyncTask(Context context, Type action, String instanceName, String max_id, OnRetrieveFeedsInterface onRetrieveFeedsInterface) { this.contextReference = new WeakReference<>(context); this.action = action; @@ -214,7 +156,6 @@ public class RetrieveFeedsAsyncTask extends AsyncTask { this.remoteInstance = retrieveFeedsParam.getRemoteInstance(); } - @Override protected Void doInBackground(Void... params) { API api = new API(this.contextReference.get()); @@ -496,4 +437,59 @@ public class RetrieveFeedsAsyncTask extends AsyncTask { protected void onPostExecute(Void result) { listener.onRetrieveFeeds(apiResponse); } + + public enum Type { + HOME, + LOCAL, + DIRECT, + CONVERSATION, + PUBLIC, + HASHTAG, + LIST, + USER, + FAVOURITES, + ONESTATUS, + CONTEXT, + TAG, + REMOTE_INSTANCE, + REMOTE_INSTANCE_FILTERED, + ART, + PEERTUBE, + NOTIFICATION, + SEARCH, + NEWS, + + PSUBSCRIPTIONS, + POVERVIEW, + PTRENDING, + PRECENTLYADDED, + PMYVIDEOS, + PLOCAL, + CHANNEL, + MYVIDEOS, + PEERTUBE_HISTORY, + + PIXELFED, + PF_HOME, + PF_LOCAL, + PF_DISCOVER, + PF_NOTIFICATION, + PF_REPLIES, + + + GNU_HOME, + GNU_LOCAL, + GNU_WHOLE, + GNU_NOTIFICATION, + GNU_DM, + GNU_ART, + GNU_TAG, + GNU_GROUP_TIMELINE, + + SCHEDULED_TOOTS, + CACHE_BOOKMARKS, + CACHE_BOOKMARKS_PEERTUBE, + CACHE_STATUS, + + } } diff --git a/app/src/main/java/app/fedilab/android/asynctasks/RetrieveInstanceRegAsyncTask.java b/app/src/main/java/app/fedilab/android/asynctasks/RetrieveInstanceRegAsyncTask.java index af276d6dd..4691b1a28 100644 --- a/app/src/main/java/app/fedilab/android/asynctasks/RetrieveInstanceRegAsyncTask.java +++ b/app/src/main/java/app/fedilab/android/asynctasks/RetrieveInstanceRegAsyncTask.java @@ -38,11 +38,6 @@ public class RetrieveInstanceRegAsyncTask extends AsyncTask { private String category; private instanceType type; - public enum instanceType{ - MASTODON, - PEERTUBE - } - public RetrieveInstanceRegAsyncTask(Context context, instanceType type, String category, OnRetrieveInstanceInterface onRetrieveInstanceInterface) { this.contextReference = new WeakReference<>(context); this.listener = onRetrieveInstanceInterface; @@ -52,9 +47,9 @@ public class RetrieveInstanceRegAsyncTask extends AsyncTask { @Override protected Void doInBackground(Void... params) { - if( type == instanceType.MASTODON) { + if (type == instanceType.MASTODON) { apiResponse = new API(this.contextReference.get()).getInstanceReg(category); - }else if( type == instanceType.PEERTUBE){ + } else if (type == instanceType.PEERTUBE) { apiResponse = new PeertubeAPI(this.contextReference.get()).getInstanceReg(); } return null; @@ -65,4 +60,9 @@ public class RetrieveInstanceRegAsyncTask extends AsyncTask { listener.onRetrieveInstance(apiResponse); } + public enum instanceType { + MASTODON, + PEERTUBE + } + } diff --git a/app/src/main/java/app/fedilab/android/asynctasks/RetrieveManyRelationshipsAsyncTask.java b/app/src/main/java/app/fedilab/android/asynctasks/RetrieveManyRelationshipsAsyncTask.java index 735c6bfc2..d34dbe8c6 100644 --- a/app/src/main/java/app/fedilab/android/asynctasks/RetrieveManyRelationshipsAsyncTask.java +++ b/app/src/main/java/app/fedilab/android/asynctasks/RetrieveManyRelationshipsAsyncTask.java @@ -20,11 +20,11 @@ import android.os.AsyncTask; import java.lang.ref.WeakReference; import java.util.List; +import app.fedilab.android.activities.MainActivity; import app.fedilab.android.client.API; import app.fedilab.android.client.APIResponse; import app.fedilab.android.client.Entities.Account; import app.fedilab.android.client.GNUAPI; -import app.fedilab.android.activities.MainActivity; import app.fedilab.android.interfaces.OnRetrieveManyRelationshipsInterface; /** diff --git a/app/src/main/java/app/fedilab/android/asynctasks/RetrieveMissingFeedsAsyncTask.java b/app/src/main/java/app/fedilab/android/asynctasks/RetrieveMissingFeedsAsyncTask.java index 6a3e72598..6d73dada2 100644 --- a/app/src/main/java/app/fedilab/android/asynctasks/RetrieveMissingFeedsAsyncTask.java +++ b/app/src/main/java/app/fedilab/android/asynctasks/RetrieveMissingFeedsAsyncTask.java @@ -22,6 +22,7 @@ import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.List; +import app.fedilab.android.activities.MainActivity; import app.fedilab.android.client.API; import app.fedilab.android.client.APIResponse; import app.fedilab.android.client.Entities.Account; @@ -29,11 +30,10 @@ import app.fedilab.android.client.Entities.Conversation; import app.fedilab.android.client.Entities.ManageTimelines; import app.fedilab.android.client.Entities.TagTimeline; import app.fedilab.android.client.GNUAPI; +import app.fedilab.android.interfaces.OnRetrieveMissingFeedsInterface; import app.fedilab.android.sqlite.SearchDAO; import app.fedilab.android.sqlite.Sqlite; import app.fedilab.android.sqlite.TimelinesDAO; -import app.fedilab.android.activities.MainActivity; -import app.fedilab.android.interfaces.OnRetrieveMissingFeedsInterface; /** diff --git a/app/src/main/java/app/fedilab/android/asynctasks/RetrieveMissingNotificationsAsyncTask.java b/app/src/main/java/app/fedilab/android/asynctasks/RetrieveMissingNotificationsAsyncTask.java index e67de9a75..b2f299ad3 100644 --- a/app/src/main/java/app/fedilab/android/asynctasks/RetrieveMissingNotificationsAsyncTask.java +++ b/app/src/main/java/app/fedilab/android/asynctasks/RetrieveMissingNotificationsAsyncTask.java @@ -20,12 +20,12 @@ import android.os.AsyncTask; import java.lang.ref.WeakReference; import java.util.List; +import app.fedilab.android.activities.MainActivity; import app.fedilab.android.client.API; import app.fedilab.android.client.APIResponse; import app.fedilab.android.client.Entities.Error; import app.fedilab.android.client.Entities.Notification; import app.fedilab.android.fragments.DisplayNotificationsFragment; -import app.fedilab.android.activities.MainActivity; import app.fedilab.android.interfaces.OnRetrieveMissingNotificationsInterface; @@ -56,7 +56,7 @@ public class RetrieveMissingNotificationsAsyncTask extends AsyncTask private WeakReference contextReference; private Type type; - public enum Type { - BACKERS, - SPONSORS - } - public RetrieveOpenCollectiveAsyncTask(Context context, Type type, OnRetrieveRemoteAccountInterface onRetrieveRemoteAccountInterface) { this.type = type; this.listener = onRetrieveRemoteAccountInterface; @@ -61,4 +56,9 @@ public class RetrieveOpenCollectiveAsyncTask extends AsyncTask listener.onRetrieveRemoteAccount(results); } + public enum Type { + BACKERS, + SPONSORS + } + } diff --git a/app/src/main/java/app/fedilab/android/asynctasks/RetrievePeertubeChannelsAsyncTask.java b/app/src/main/java/app/fedilab/android/asynctasks/RetrievePeertubeChannelsAsyncTask.java index 946b453f7..28cbd9643 100644 --- a/app/src/main/java/app/fedilab/android/asynctasks/RetrievePeertubeChannelsAsyncTask.java +++ b/app/src/main/java/app/fedilab/android/asynctasks/RetrievePeertubeChannelsAsyncTask.java @@ -25,9 +25,9 @@ import app.fedilab.android.client.APIResponse; import app.fedilab.android.client.Entities.Account; import app.fedilab.android.client.PeertubeAPI; import app.fedilab.android.helper.Helper; +import app.fedilab.android.interfaces.OnRetrievePeertubeInterface; import app.fedilab.android.sqlite.AccountDAO; import app.fedilab.android.sqlite.Sqlite; -import app.fedilab.android.interfaces.OnRetrievePeertubeInterface; /** diff --git a/app/src/main/java/app/fedilab/android/asynctasks/RetrievePeertubeInformationAsyncTask.java b/app/src/main/java/app/fedilab/android/asynctasks/RetrievePeertubeInformationAsyncTask.java index d3acb2cf9..46acf4013 100644 --- a/app/src/main/java/app/fedilab/android/asynctasks/RetrievePeertubeInformationAsyncTask.java +++ b/app/src/main/java/app/fedilab/android/asynctasks/RetrievePeertubeInformationAsyncTask.java @@ -32,8 +32,8 @@ import app.fedilab.android.client.PeertubeAPI; public class RetrievePeertubeInformationAsyncTask extends AsyncTask { - private WeakReference contextReference; public static PeertubeInformation peertubeInformation; + private WeakReference contextReference; public RetrievePeertubeInformationAsyncTask(Context context) { diff --git a/app/src/main/java/app/fedilab/android/asynctasks/RetrievePeertubeSingleAsyncTask.java b/app/src/main/java/app/fedilab/android/asynctasks/RetrievePeertubeSingleAsyncTask.java index 640c8f4ac..d399a34f7 100644 --- a/app/src/main/java/app/fedilab/android/asynctasks/RetrievePeertubeSingleAsyncTask.java +++ b/app/src/main/java/app/fedilab/android/asynctasks/RetrievePeertubeSingleAsyncTask.java @@ -20,11 +20,11 @@ import android.os.AsyncTask; import java.lang.ref.WeakReference; +import app.fedilab.android.activities.MainActivity; import app.fedilab.android.client.API; import app.fedilab.android.client.APIResponse; import app.fedilab.android.client.PeertubeAPI; import app.fedilab.android.helper.Helper; -import app.fedilab.android.activities.MainActivity; import app.fedilab.android.interfaces.OnRetrievePeertubeInterface; diff --git a/app/src/main/java/app/fedilab/android/asynctasks/RetrieveRelationshipAsyncTask.java b/app/src/main/java/app/fedilab/android/asynctasks/RetrieveRelationshipAsyncTask.java index b6cbcfbb1..36b0fed36 100644 --- a/app/src/main/java/app/fedilab/android/asynctasks/RetrieveRelationshipAsyncTask.java +++ b/app/src/main/java/app/fedilab/android/asynctasks/RetrieveRelationshipAsyncTask.java @@ -19,12 +19,12 @@ import android.os.AsyncTask; import java.lang.ref.WeakReference; +import app.fedilab.android.activities.MainActivity; import app.fedilab.android.client.API; import app.fedilab.android.client.Entities.Error; import app.fedilab.android.client.Entities.Relationship; import app.fedilab.android.client.GNUAPI; import app.fedilab.android.client.PeertubeAPI; -import app.fedilab.android.activities.MainActivity; import app.fedilab.android.interfaces.OnRetrieveRelationshipInterface; /** diff --git a/app/src/main/java/app/fedilab/android/asynctasks/RetrieveScheduledTootsAsyncTask.java b/app/src/main/java/app/fedilab/android/asynctasks/RetrieveScheduledTootsAsyncTask.java index 62da496e2..4e45a04b0 100644 --- a/app/src/main/java/app/fedilab/android/asynctasks/RetrieveScheduledTootsAsyncTask.java +++ b/app/src/main/java/app/fedilab/android/asynctasks/RetrieveScheduledTootsAsyncTask.java @@ -29,12 +29,12 @@ import java.util.Set; import app.fedilab.android.client.Entities.StoredStatus; import app.fedilab.android.fragments.DisplayScheduledTootsFragment; import app.fedilab.android.helper.Helper; +import app.fedilab.android.interfaces.OnRetrieveScheduledTootsInterface; import app.fedilab.android.jobs.ScheduledBoostsSyncJob; import app.fedilab.android.jobs.ScheduledTootsSyncJob; import app.fedilab.android.sqlite.BoostScheduleDAO; import app.fedilab.android.sqlite.Sqlite; import app.fedilab.android.sqlite.StatusStoredDAO; -import app.fedilab.android.interfaces.OnRetrieveScheduledTootsInterface; /** diff --git a/app/src/main/java/app/fedilab/android/asynctasks/RetrieveSearchAsyncTask.java b/app/src/main/java/app/fedilab/android/asynctasks/RetrieveSearchAsyncTask.java index fc83f9bd7..1bcccf52c 100644 --- a/app/src/main/java/app/fedilab/android/asynctasks/RetrieveSearchAsyncTask.java +++ b/app/src/main/java/app/fedilab/android/asynctasks/RetrieveSearchAsyncTask.java @@ -21,16 +21,16 @@ import android.os.AsyncTask; import java.lang.ref.WeakReference; import java.util.List; +import app.fedilab.android.activities.MainActivity; import app.fedilab.android.client.API; import app.fedilab.android.client.APIResponse; import app.fedilab.android.client.Entities.InstanceNodeInfo; import app.fedilab.android.client.Entities.Results; import app.fedilab.android.client.GNUAPI; import app.fedilab.android.helper.Helper; +import app.fedilab.android.interfaces.OnRetrieveSearchInterface; import app.fedilab.android.sqlite.Sqlite; import app.fedilab.android.sqlite.TagsCacheDAO; -import app.fedilab.android.activities.MainActivity; -import app.fedilab.android.interfaces.OnRetrieveSearchInterface; /** diff --git a/app/src/main/java/app/fedilab/android/asynctasks/SyncBookmarksAsyncTask.java b/app/src/main/java/app/fedilab/android/asynctasks/SyncBookmarksAsyncTask.java index e83946331..27fcb5084 100644 --- a/app/src/main/java/app/fedilab/android/asynctasks/SyncBookmarksAsyncTask.java +++ b/app/src/main/java/app/fedilab/android/asynctasks/SyncBookmarksAsyncTask.java @@ -36,27 +36,20 @@ import app.fedilab.android.sqlite.StatusCacheDAO; public class SyncBookmarksAsyncTask extends AsyncTask { - public enum sync{ - EXPORT, - IMPORT - } - private List statusList; private OnSyncBookmarksInterface listener; private WeakReference contextReference; private sync type; - public SyncBookmarksAsyncTask(Context context, sync type, OnSyncBookmarksInterface onSyncBookmarksInterface) { this.contextReference = new WeakReference<>(context); this.type = type; this.listener = onSyncBookmarksInterface; } - @Override protected Void doInBackground(Void... params) { SQLiteDatabase db = Sqlite.getInstance(contextReference.get(), Sqlite.DB_NAME, null, Sqlite.DB_VERSION).open(); - if( type == sync.IMPORT){ + if (type == sync.IMPORT) { String max_id = null; do { APIResponse apiResponse = new API(contextReference.get()).getBookmarks(max_id); @@ -64,7 +57,7 @@ public class SyncBookmarksAsyncTask extends AsyncTask { List statuses = apiResponse.getStatuses(); for (app.fedilab.android.client.Entities.Status tmpStatus : statuses) { app.fedilab.android.client.Entities.Status status = new StatusCacheDAO(contextReference.get(), db).getStatus(StatusCacheDAO.BOOKMARK_CACHE, tmpStatus.getId()); - if( status == null) { + if (status == null) { new StatusCacheDAO(contextReference.get(), db).insertStatus(StatusCacheDAO.BOOKMARK_CACHE, tmpStatus); } } @@ -74,9 +67,9 @@ public class SyncBookmarksAsyncTask extends AsyncTask { SystemClock.sleep(200); } } while (max_id != null); - }else{ + } else { List statuses = new StatusCacheDAO(contextReference.get(), db).getAllStatus(StatusCacheDAO.BOOKMARK_CACHE); - if( statuses != null) { + if (statuses != null) { for (app.fedilab.android.client.Entities.Status tmpStatus : statuses) { new API(contextReference.get()).postAction(API.StatusAction.BOOKMARK, tmpStatus.getId()); try { @@ -96,4 +89,9 @@ public class SyncBookmarksAsyncTask extends AsyncTask { listener.onRetrieveBookmarks(statusList); } + public enum sync { + EXPORT, + IMPORT + } + } diff --git a/app/src/main/java/app/fedilab/android/asynctasks/SyncTimelinesAsyncTask.java b/app/src/main/java/app/fedilab/android/asynctasks/SyncTimelinesAsyncTask.java index bdd264970..787079946 100644 --- a/app/src/main/java/app/fedilab/android/asynctasks/SyncTimelinesAsyncTask.java +++ b/app/src/main/java/app/fedilab/android/asynctasks/SyncTimelinesAsyncTask.java @@ -25,19 +25,18 @@ import java.util.Date; import java.util.Iterator; import java.util.List; +import app.fedilab.android.activities.MainActivity; import app.fedilab.android.client.API; import app.fedilab.android.client.APIResponse; -import app.fedilab.android.client.Entities.Account; import app.fedilab.android.client.Entities.ManageTimelines; import app.fedilab.android.client.Entities.RemoteInstance; import app.fedilab.android.client.Entities.TagTimeline; import app.fedilab.android.helper.Helper; +import app.fedilab.android.interfaces.OnSyncTimelineInterface; import app.fedilab.android.sqlite.InstancesDAO; import app.fedilab.android.sqlite.SearchDAO; import app.fedilab.android.sqlite.Sqlite; import app.fedilab.android.sqlite.TimelinesDAO; -import app.fedilab.android.activities.MainActivity; -import app.fedilab.android.interfaces.OnSyncTimelineInterface; /** @@ -252,7 +251,7 @@ public class SyncTimelinesAsyncTask extends AsyncTask { } } - if( this.syncLists ) { + if (this.syncLists) { APIResponse apiResponse; if (MainActivity.social == UpdateAccountInfoAsyncTask.SOCIAL.MASTODON || MainActivity.social == UpdateAccountInfoAsyncTask.SOCIAL.PLEROMA) { List listsAPI; @@ -338,7 +337,7 @@ public class SyncTimelinesAsyncTask extends AsyncTask { String userId = sharedpreferences.getString(Helper.PREF_KEY_ID, null); String instance = Helper.getLiveInstance(contextReference.get()); SharedPreferences.Editor editor = sharedpreferences.edit(); - editor.putString(Helper.LAST_DATE_LIST_FETCH+userId+instance, Helper.dateToString(new Date())); + editor.putString(Helper.LAST_DATE_LIST_FETCH + userId + instance, Helper.dateToString(new Date())); editor.apply(); } catch (Exception ignored) { } diff --git a/app/src/main/java/app/fedilab/android/asynctasks/UpdateAccountInfoAsyncTask.java b/app/src/main/java/app/fedilab/android/asynctasks/UpdateAccountInfoAsyncTask.java index 94742e5d7..8c6cf36e7 100644 --- a/app/src/main/java/app/fedilab/android/asynctasks/UpdateAccountInfoAsyncTask.java +++ b/app/src/main/java/app/fedilab/android/asynctasks/UpdateAccountInfoAsyncTask.java @@ -25,6 +25,7 @@ import java.io.UnsupportedEncodingException; import java.lang.ref.WeakReference; import java.net.URLDecoder; +import app.fedilab.android.activities.MainActivity; import app.fedilab.android.client.API; import app.fedilab.android.client.Entities.Account; import app.fedilab.android.client.Entities.InstanceNodeInfo; @@ -33,7 +34,6 @@ import app.fedilab.android.client.PeertubeAPI; import app.fedilab.android.helper.Helper; import app.fedilab.android.sqlite.AccountDAO; import app.fedilab.android.sqlite.Sqlite; -import app.fedilab.android.activities.MainActivity; /** * Created by Thomas on 23/04/2017. @@ -47,15 +47,6 @@ public class UpdateAccountInfoAsyncTask extends AsyncTask { private WeakReference contextReference; private SOCIAL social; - public enum SOCIAL { - MASTODON, - PEERTUBE, - PIXELFED, - PLEROMA, - GNU, - FRIENDICA - } - public UpdateAccountInfoAsyncTask(Context context, String token, String client_id, String client_secret, String refresh_token, String instance, SOCIAL social) { this.contextReference = new WeakReference<>(context); this.token = token; @@ -69,7 +60,7 @@ public class UpdateAccountInfoAsyncTask extends AsyncTask { @Override protected Void doInBackground(Void... params) { Account account; - if( this.contextReference == null){ + if (this.contextReference == null) { return null; } if (social == SOCIAL.MASTODON || social == SOCIAL.PIXELFED || social == SOCIAL.PLEROMA) { @@ -128,4 +119,13 @@ public class UpdateAccountInfoAsyncTask extends AsyncTask { } + public enum SOCIAL { + MASTODON, + PEERTUBE, + PIXELFED, + PLEROMA, + GNU, + FRIENDICA + } + } \ No newline at end of file diff --git a/app/src/main/java/app/fedilab/android/asynctasks/UpdateAccountInfoByIDAsyncTask.java b/app/src/main/java/app/fedilab/android/asynctasks/UpdateAccountInfoByIDAsyncTask.java index 7fa857818..2f4cd89e7 100644 --- a/app/src/main/java/app/fedilab/android/asynctasks/UpdateAccountInfoByIDAsyncTask.java +++ b/app/src/main/java/app/fedilab/android/asynctasks/UpdateAccountInfoByIDAsyncTask.java @@ -28,10 +28,10 @@ import app.fedilab.android.client.Entities.Emojis; import app.fedilab.android.client.GNUAPI; import app.fedilab.android.client.PeertubeAPI; import app.fedilab.android.helper.Helper; +import app.fedilab.android.interfaces.OnUpdateAccountInfoInterface; import app.fedilab.android.sqlite.AccountDAO; import app.fedilab.android.sqlite.CustomEmojiDAO; import app.fedilab.android.sqlite.Sqlite; -import app.fedilab.android.interfaces.OnUpdateAccountInfoInterface; /** * Created by Thomas on 17/05/2017. @@ -58,7 +58,7 @@ public class UpdateAccountInfoByIDAsyncTask extends AsyncTask String userId = sharedpreferences.getString(Helper.PREF_KEY_ID, null); String instance = sharedpreferences.getString(Helper.PREF_INSTANCE, null); Account account = null; - if (social == UpdateAccountInfoAsyncTask.SOCIAL.MASTODON || social == UpdateAccountInfoAsyncTask.SOCIAL.PLEROMA || social == UpdateAccountInfoAsyncTask.SOCIAL.PIXELFED ) + if (social == UpdateAccountInfoAsyncTask.SOCIAL.MASTODON || social == UpdateAccountInfoAsyncTask.SOCIAL.PLEROMA || social == UpdateAccountInfoAsyncTask.SOCIAL.PIXELFED) account = new API(this.contextReference.get()).verifyCredentials(); else if (social == UpdateAccountInfoAsyncTask.SOCIAL.PEERTUBE) { account = new PeertubeAPI(this.contextReference.get()).verifyCredentials(); diff --git a/app/src/main/java/app/fedilab/android/client/API.java b/app/src/main/java/app/fedilab/android/client/API.java index 370b3dcfe..ee37b15c7 100644 --- a/app/src/main/java/app/fedilab/android/client/API.java +++ b/app/src/main/java/app/fedilab/android/client/API.java @@ -20,7 +20,6 @@ import android.content.SharedPreferences; import android.database.sqlite.SQLiteDatabase; import android.os.Bundle; - import androidx.localbroadcastmanager.content.LocalBroadcastManager; import com.google.gson.JsonArray; @@ -110,80 +109,6 @@ public class API { private Error APIError; private List domains; - public enum searchType { - TAGS, - STATUSES, - ACCOUNTS - } - - - public enum adminAction { - ENABLE, - APPROVE, - REJECT, - NONE, - SILENCE, - DISABLE, - UNSILENCE, - SUSPEND, - UNSUSPEND, - ASSIGN_TO_SELF, - UNASSIGN, - REOPEN, - RESOLVE, - GET_ACCOUNTS, - GET_ONE_ACCOUNT, - GET_REPORTS, - GET_ONE_REPORT - } - - - public enum StatusAction { - FAVOURITE, - UNFAVOURITE, - BOOKMARK, - UNBOOKMARK, - REBLOG, - UNREBLOG, - MUTE, - MUTE_NOTIFICATIONS, - UNMUTE, - MUTE_CONVERSATION, - UNMUTE_CONVERSATION, - BLOCK, - UNBLOCK, - FOLLOW, - UNFOLLOW, - CREATESTATUS, - UNSTATUS, - AUTHORIZE, - REJECT, - REPORT, - REMOTE_FOLLOW, - PIN, - UNPIN, - ENDORSE, - UNENDORSE, - SHOW_BOOST, - HIDE_BOOST, - BLOCK_DOMAIN, - RATEVIDEO, - PEERTUBECOMMENT, - PEERTUBEREPLY, - PEERTUBEDELETECOMMENT, - PEERTUBEDELETEVIDEO, - UPDATESERVERSCHEDULE, - DELETESCHEDULED, - REFRESHPOLL - } - - - public enum accountPrivacy { - PUBLIC, - LOCKED - } - - public API(Context context) { this.context = context; if (context == null) { @@ -192,7 +117,7 @@ public class API { } SharedPreferences sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE); tootPerPage = sharedpreferences.getInt(Helper.SET_TOOT_PER_PAGE, Helper.TOOTS_PER_PAGE); - if( MainActivity.social == UpdateAccountInfoAsyncTask.SOCIAL.PIXELFED && tootPerPage > 30 ){ + if (MainActivity.social == UpdateAccountInfoAsyncTask.SOCIAL.PIXELFED && tootPerPage > 30) { tootPerPage = 30; } accountPerPage = Helper.ACCOUNTS_PER_PAGE; @@ -217,6 +142,1336 @@ public class API { } + public API(Context context, String instance, String token) { + this.context = context; + if (context == null) { + apiResponse = new APIResponse(); + APIError = new Error(); + return; + } + SharedPreferences sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE); + tootPerPage = sharedpreferences.getInt(Helper.SET_TOOT_PER_PAGE, Helper.TOOTS_PER_PAGE); + if (MainActivity.social == UpdateAccountInfoAsyncTask.SOCIAL.PIXELFED && tootPerPage > 30) { + tootPerPage = 30; + } + accountPerPage = Helper.ACCOUNTS_PER_PAGE; + notificationPerPage = Helper.NOTIFICATIONS_PER_PAGE; + if (instance != null) + this.instance = instance; + else + this.instance = Helper.getLiveInstance(context); + + if (token != null) + this.prefKeyOauthTokenT = token; + else + this.prefKeyOauthTokenT = sharedpreferences.getString(Helper.PREF_KEY_OAUTH_TOKEN, null); + apiResponse = new APIResponse(); + APIError = null; + } + + /** + * Parse json response an unique Car + * + * @param resobj JSONObject + * @return Card + */ + private static Card parseCardResponse(JSONObject resobj) { + + Card card = new Card(); + try { + card.setUrl(resobj.get("url").toString()); + card.setTitle(resobj.get("title").toString()); + card.setDescription(resobj.get("description").toString()); + card.setImage(resobj.get("image").toString()); + + card.setType(resobj.get("type").toString()); + try { + card.setAuthor_name(resobj.get("author_name").toString()); + } catch (Exception e) { + card.setAuthor_name(null); + } + try { + card.setAuthor_url(resobj.get("author_url").toString()); + } catch (Exception e) { + card.setAuthor_url(null); + } + try { + card.setHtml(resobj.get("html").toString()); + } catch (Exception e) { + card.setHtml(null); + } + try { + card.setEmbed_url(resobj.get("embed_url").toString()); + } catch (Exception e) { + card.setEmbed_url(null); + } + try { + card.setProvider_name(resobj.get("provider_name").toString()); + } catch (Exception e) { + card.setProvider_name(null); + } + try { + card.setProvider_url(resobj.get("provider_url").toString()); + } catch (Exception e) { + card.setProvider_url(null); + } + try { + card.setHeight(Integer.parseInt(resobj.get("height").toString())); + } catch (Exception e) { + card.setHeight(0); + } + try { + card.setWidth(Integer.parseInt(resobj.get("width").toString())); + } catch (Exception e) { + card.setWidth(0); + } + } catch (JSONException e) { + card = null; + } + return card; + } + + /** + * Parse json response an unique instance social result + * + * @param resobj JSONObject + * @return InstanceSocial + */ + public static InstanceSocial parseInstanceSocialResponse(Context context, JSONObject resobj) { + + InstanceSocial instanceSocial = new InstanceSocial(); + try { + + + instanceSocial.setUptime(Float.parseFloat(resobj.get("uptime").toString())); + instanceSocial.setUp(Boolean.parseBoolean(resobj.get("up").toString())); + + instanceSocial.setConnections(Long.parseLong(resobj.get("connections").toString())); + instanceSocial.setDead(Boolean.parseBoolean(resobj.get("dead").toString())); + + + instanceSocial.setId(resobj.get("id").toString()); + + instanceSocial.setInfo(resobj.get("info").toString()); + instanceSocial.setVersion(resobj.get("version").toString()); + instanceSocial.setName(resobj.get("name").toString()); + instanceSocial.setObs_rank(resobj.get("obs_rank").toString()); + instanceSocial.setThumbnail(resobj.get("thumbnail").toString()); + instanceSocial.setIpv6(Boolean.parseBoolean(resobj.get("ipv6").toString())); + instanceSocial.setObs_score(Integer.parseInt(resobj.get("obs_score").toString())); + instanceSocial.setOpen_registrations(Boolean.parseBoolean(resobj.get("open_registrations").toString())); + + instanceSocial.setUsers(Long.parseLong(resobj.get("users").toString())); + instanceSocial.setStatuses(Long.parseLong(resobj.get("statuses").toString())); + + instanceSocial.setHttps_rank(resobj.get("https_rank").toString()); + instanceSocial.setHttps_score(Integer.parseInt(resobj.get("https_score").toString())); + if (!resobj.isNull("added_at")) { + instanceSocial.setAdded_at(Helper.mstStringToDate(context, resobj.get("added_at").toString())); + } + instanceSocial.setChecked_at(Helper.mstStringToDate(context, resobj.get("checked_at").toString())); + instanceSocial.setUpdated_at(Helper.mstStringToDate(context, resobj.get("updated_at").toString())); + + + } catch (Exception e) { + e.printStackTrace(); + } + return instanceSocial; + } + + /** + * Parse json response for unique how to + * + * @param resobj JSONObject + * @return Peertube + */ + public static Peertube parsePeertube(Context context, String instance, JSONObject resobj) { + Peertube peertube = new Peertube(); + try { + peertube.setId(resobj.get("id").toString()); + peertube.setCache(resobj); + peertube.setUuid(resobj.get("uuid").toString()); + peertube.setName(resobj.get("name").toString()); + peertube.setDescription(resobj.get("description").toString()); + peertube.setEmbedPath(resobj.get("embedPath").toString()); + peertube.setPreviewPath(resobj.get("previewPath").toString()); + peertube.setThumbnailPath(resobj.get("thumbnailPath").toString()); + peertube.setAccount(parseAccountResponsePeertube(context, instance, resobj.getJSONObject("account"))); + peertube.setInstance(instance); + peertube.setView(Integer.parseInt(resobj.get("views").toString())); + peertube.setLike(Integer.parseInt(resobj.get("likes").toString())); + peertube.setDislike(Integer.parseInt(resobj.get("dislikes").toString())); + peertube.setDuration(Integer.parseInt(resobj.get("duration").toString())); + try { + peertube.setCreated_at(Helper.mstStringToDate(context, resobj.get("createdAt").toString())); + } catch (ParseException e) { + e.printStackTrace(); + } + } catch (JSONException e) { + e.printStackTrace(); + } + + return peertube; + } + + /** + * Parse json response for unique how to + * + * @param resobj JSONObject + * @return Peertube + */ + private static Peertube parseSinglePeertube(Context context, String instance, JSONObject resobj) { + Peertube peertube = new Peertube(); + try { + peertube.setId(resobj.get("id").toString()); + peertube.setUuid(resobj.get("uuid").toString()); + peertube.setName(resobj.get("name").toString()); + peertube.setCache(resobj); + peertube.setInstance(instance); + peertube.setHost(resobj.getJSONObject("account").get("host").toString()); + peertube.setDescription(resobj.get("description").toString()); + peertube.setEmbedPath(resobj.get("embedPath").toString()); + peertube.setPreviewPath(resobj.get("previewPath").toString()); + peertube.setThumbnailPath(resobj.get("thumbnailPath").toString()); + peertube.setView(Integer.parseInt(resobj.get("views").toString())); + peertube.setLike(Integer.parseInt(resobj.get("likes").toString())); + peertube.setCommentsEnabled(Boolean.parseBoolean(resobj.get("commentsEnabled").toString())); + peertube.setDislike(Integer.parseInt(resobj.get("dislikes").toString())); + peertube.setDuration(Integer.parseInt(resobj.get("duration").toString())); + peertube.setAccount(parseAccountResponsePeertube(context, instance, resobj.getJSONObject("account"))); + try { + peertube.setCreated_at(Helper.mstStringToDate(context, resobj.get("createdAt").toString())); + } catch (ParseException e) { + e.printStackTrace(); + } + JSONArray files = resobj.getJSONArray("files"); + ArrayList resolutions = new ArrayList<>(); + for (int j = 0; j < files.length(); j++) { + JSONObject attObj = files.getJSONObject(j); + resolutions.add(attObj.getJSONObject("resolution").get("id").toString()); + } + peertube.setResolution(resolutions); + } catch (JSONException e) { + e.printStackTrace(); + } + + return peertube; + } + + /** + * Parse json response for peertube comments + * + * @param resobj JSONObject + * @return Peertube + */ + private static List parseSinglePeertubeComments(Context context, String instance, JSONObject resobj) { + List statuses = new ArrayList<>(); + try { + JSONArray jsonArray = resobj.getJSONArray("data"); + int i = 0; + while (i < jsonArray.length()) { + Status status = new Status(); + JSONObject comment = jsonArray.getJSONObject(i); + status.setId(comment.get("id").toString()); + status.setUri(comment.get("url").toString()); + status.setUrl(comment.get("url").toString()); + status.setSensitive(false); + status.setSpoiler_text(""); + status.setContent(comment.get("text").toString()); + status.setIn_reply_to_id(comment.get("inReplyToCommentId").toString()); + status.setAccount(parseAccountResponsePeertube(context, instance, comment.getJSONObject("account"))); + status.setCreated_at(Helper.mstStringToDate(context, comment.get("createdAt").toString())); + status.setMentions(new ArrayList<>()); + status.setEmojis(new ArrayList<>()); + status.setMedia_attachments(new ArrayList<>()); + status.setVisibility("public"); + i++; + statuses.add(status); + } + } catch (JSONException e) { + e.printStackTrace(); + } catch (ParseException e) { + e.printStackTrace(); + } + return statuses; + } + + /** + * Parse json response for unique how to + * + * @param resobj JSONObject + * @return HowToVideo + */ + private static HowToVideo parseHowTo(Context context, JSONObject resobj) { + HowToVideo howToVideo = new HowToVideo(); + try { + howToVideo.setId(resobj.get("id").toString()); + howToVideo.setUuid(resobj.get("uuid").toString()); + howToVideo.setName(resobj.get("name").toString()); + howToVideo.setDescription(resobj.get("description").toString()); + howToVideo.setEmbedPath(resobj.get("embedPath").toString()); + howToVideo.setPreviewPath(resobj.get("previewPath").toString()); + howToVideo.setThumbnailPath(resobj.get("thumbnailPath").toString()); + } catch (JSONException e) { + e.printStackTrace(); + } + + return howToVideo; + } + + /** + * Parse json response for several scheduled toots + * + * @param jsonObject JSONObject + * @return List + */ + private static Schedule parseSimpleSchedule(Context context, JSONObject jsonObject) { + Schedule schedule = new Schedule(); + try { + JSONObject resobj = jsonObject.getJSONObject("params"); + Status status = parseSchedule(context, resobj); + List attachements = parseAttachmentResponse(jsonObject.getJSONArray("media_attachments")); + status.setMedia_attachments((ArrayList) attachements); + schedule.setStatus(status); + schedule.setAttachmentList(attachements); + schedule.setId(jsonObject.get("id").toString()); + schedule.setScheduled_at(Helper.mstStringToDate(context, jsonObject.get("scheduled_at").toString())); + } catch (JSONException e) { + e.printStackTrace(); + } catch (ParseException e) { + e.printStackTrace(); + } + return schedule; + } + + /** + * Parse json response for several scheduled toots + * + * @param jsonArray JSONArray + * @return List + */ + private static List parseSchedule(Context context, JSONArray jsonArray) { + + List schedules = new ArrayList<>(); + try { + int i = 0; + while (i < jsonArray.length()) { + Schedule schedule = new Schedule(); + JSONObject resobj = jsonArray.getJSONObject(i).getJSONObject("params"); + Status status = parseSchedule(context, resobj); + List attachements = parseAttachmentResponse(jsonArray.getJSONObject(i).getJSONArray("media_attachments")); + status.setMedia_attachments((ArrayList) attachements); + schedule.setStatus(status); + schedule.setAttachmentList(attachements); + schedules.add(schedule); + schedule.setId(jsonArray.getJSONObject(i).get("id").toString()); + schedule.setScheduled_at(Helper.mstStringToDate(context, jsonArray.getJSONObject(i).get("scheduled_at").toString())); + i++; + } + } catch (JSONException e) { + e.printStackTrace(); + } catch (ParseException e) { + e.printStackTrace(); + } + return schedules; + } + + /** + * Parse json response for several status + * + * @param jsonArray JSONArray + * @return List + */ + private static List parseStatuses(Context context, JSONArray jsonArray) { + + List statuses = new ArrayList<>(); + try { + int i = 0; + while (i < jsonArray.length()) { + + JSONObject resobj = jsonArray.getJSONObject(i); + Status status = parseStatuses(context, resobj); + i++; + if (status != null) { + statuses.add(status); + } + } + + } catch (JSONException e) { + e.printStackTrace(); + } + return statuses; + } + + /** + * Parse a poll + * + * @param context + * @param resobj + * @return + */ + public static Poll parsePoll(Context context, JSONObject resobj) { + Poll poll = new Poll(); + try { + poll.setId(resobj.getString("id")); + poll.setExpires_at(Helper.mstStringToDate(context, resobj.getString("expires_at"))); + poll.setExpired(resobj.getBoolean("expired")); + poll.setMultiple(resobj.getBoolean("multiple")); + poll.setVotes_count(resobj.getInt("votes_count")); + poll.setVoted(resobj.getBoolean("voted")); + JSONArray options = resobj.getJSONArray("options"); + List pollOptions = new ArrayList<>(); + for (int i = 0; i < options.length(); i++) { + JSONObject option = options.getJSONObject(i); + PollOptions pollOption = new PollOptions(); + pollOption.setTitle(option.getString("title")); + pollOption.setVotes_count(option.getInt("votes_count")); + pollOptions.add(pollOption); + } + poll.setOptionsList(pollOptions); + } catch (JSONException e) { + e.printStackTrace(); + } catch (ParseException e) { + e.printStackTrace(); + } + return poll; + } + + /** + * Parse json response for unique status + * + * @param resobj JSONObject + * @return Status + */ + @SuppressWarnings("InfiniteRecursion") + public static Status parseStatuses(Context context, JSONObject resobj) { + Status status = new Status(); + try { + status.setId(resobj.get("id").toString()); + status.setUri(resobj.get("uri").toString()); + status.setCreated_at(Helper.mstStringToDate(context, resobj.get("created_at").toString())); + status.setIn_reply_to_id(resobj.get("in_reply_to_id").toString()); + status.setIn_reply_to_account_id(resobj.get("in_reply_to_account_id").toString()); + status.setSensitive(Boolean.parseBoolean(resobj.get("sensitive").toString())); + status.setSpoiler_text(resobj.get("spoiler_text").toString()); + try { + status.setVisibility(resobj.get("visibility").toString()); + } catch (Exception e) { + status.setVisibility("public"); + } + try { + status.setLanguage(resobj.get("language").toString()); + } catch (Exception e) { + status.setLanguage("ja"); + } + status.setUrl(resobj.get("url").toString()); + //Retrieves attachments + JSONArray arrayAttachement = resobj.getJSONArray("media_attachments"); + ArrayList attachments = new ArrayList<>(); + if (arrayAttachement != null) { + for (int j = 0; j < arrayAttachement.length(); j++) { + JSONObject attObj = arrayAttachement.getJSONObject(j); + Attachment attachment = new Attachment(); + attachment.setId(attObj.get("id").toString()); + attachment.setPreview_url(attObj.get("preview_url").toString()); + attachment.setRemote_url(attObj.get("remote_url").toString()); + attachment.setType(attObj.get("type").toString()); + attachment.setText_url(attObj.get("text_url").toString()); + attachment.setUrl(attObj.get("url").toString()); + try { + attachment.setDescription(attObj.get("description").toString()); + } catch (JSONException ignore) { + } + attachments.add(attachment); + } + } + + try { + status.setCard(parseCardResponse(resobj.getJSONObject("card"))); + } catch (Exception e) { + status.setCard(null); + } + + status.setMedia_attachments(attachments); + //Retrieves mentions + List mentions = new ArrayList<>(); + JSONArray arrayMention = resobj.getJSONArray("mentions"); + if (arrayMention != null) { + for (int j = 0; j < arrayMention.length(); j++) { + JSONObject menObj = arrayMention.getJSONObject(j); + Mention mention = new Mention(); + mention.setId(menObj.get("id").toString()); + mention.setUrl(menObj.get("url").toString()); + mention.setAcct(menObj.get("acct").toString()); + mention.setUsername(menObj.get("username").toString()); + mentions.add(mention); + } + } + status.setMentions(mentions); + //Retrieves tags + List tags = new ArrayList<>(); + JSONArray arrayTag = resobj.getJSONArray("tags"); + if (arrayTag != null) { + for (int j = 0; j < arrayTag.length(); j++) { + JSONObject tagObj = arrayTag.getJSONObject(j); + Tag tag = new Tag(); + tag.setName(tagObj.get("name").toString()); + tag.setUrl(tagObj.get("url").toString()); + tags.add(tag); + } + } + status.setTags(tags); + //Retrieves emjis + List emojiList = new ArrayList<>(); + try { + JSONArray emojisTag = resobj.getJSONArray("emojis"); + if (emojisTag != null) { + for (int j = 0; j < emojisTag.length(); j++) { + JSONObject emojisObj = emojisTag.getJSONObject(j); + Emojis emojis = parseEmojis(emojisObj); + emojiList.add(emojis); + } + } + status.setEmojis(emojiList); + } catch (Exception e) { + status.setEmojis(new ArrayList<>()); + } + //Retrieve Application + Application application = new Application(); + try { + if (resobj.getJSONObject("application") != null) { + application.setName(resobj.getJSONObject("application").getString("name")); + application.setWebsite(resobj.getJSONObject("application").getString("website")); + } + } catch (Exception e) { + application = new Application(); + } + status.setApplication(application); + + status.setAccount(parseAccountResponse(context, resobj.getJSONObject("account"))); + status.setContent(resobj.get("content").toString()); + if (!resobj.isNull("favourites_count")) { + status.setFavourites_count(Integer.valueOf(resobj.get("favourites_count").toString())); + } else { + status.setFavourites_count(0); + } + if (!resobj.isNull("reblogs_count")) { + status.setReblogs_count(Integer.valueOf(resobj.get("reblogs_count").toString())); + } else { + status.setReblogs_count(0); + } + + try { + status.setReplies_count(Integer.valueOf(resobj.get("replies_count").toString())); + } catch (Exception e) { + status.setReplies_count(-1); + } + try { + status.setReblogged(Boolean.valueOf(resobj.get("reblogged").toString())); + } catch (Exception e) { + status.setReblogged(false); + } + try { + status.setFavourited(Boolean.valueOf(resobj.get("favourited").toString())); + } catch (Exception e) { + status.setFavourited(false); + } + try { + status.setMuted(Boolean.valueOf(resobj.get("muted").toString())); + } catch (Exception e) { + status.setMuted(false); + } + try { + status.setPinned(Boolean.valueOf(resobj.get("pinned").toString())); + } catch (JSONException e) { + status.setPinned(false); + } + try { + status.setReblog(parseStatuses(context, resobj.getJSONObject("reblog"))); + } catch (Exception ignored) { + } + + if (resobj.has("poll") && !resobj.isNull("poll")) { + Poll poll = new Poll(); + poll.setId(resobj.getJSONObject("poll").getString("id")); + try { + poll.setExpires_at(Helper.mstStringToDate(context, resobj.getJSONObject("poll").getString("expires_at"))); + } catch (Exception e) { + poll.setExpires_at(new Date()); + } + poll.setExpired(resobj.getJSONObject("poll").getBoolean("expired")); + poll.setMultiple(resobj.getJSONObject("poll").getBoolean("multiple")); + poll.setVotes_count(resobj.getJSONObject("poll").getInt("votes_count")); + poll.setVoted(resobj.getJSONObject("poll").getBoolean("voted")); + JSONArray options = resobj.getJSONObject("poll").getJSONArray("options"); + List pollOptions = new ArrayList<>(); + for (int i = 0; i < options.length(); i++) { + JSONObject option = options.getJSONObject(i); + PollOptions pollOption = new PollOptions(); + pollOption.setTitle(option.getString("title")); + pollOption.setVotes_count(option.getInt("votes_count")); + pollOptions.add(pollOption); + } + poll.setOptionsList(pollOptions); + status.setPoll(poll); + } + + } catch (JSONException ignored) { + } catch (ParseException e) { + e.printStackTrace(); + } + status.setViewType(context); + return status; + } + + /** + * Parse json response for unique schedule + * + * @param resobj JSONObject + * @return Status + */ + @SuppressWarnings("InfiniteRecursion") + private static Status parseSchedule(Context context, JSONObject resobj) { + Status status = new Status(); + try { + status.setIn_reply_to_id(resobj.get("in_reply_to_id").toString()); + status.setSensitive(Boolean.parseBoolean(resobj.get("sensitive").toString())); + status.setSpoiler_text(resobj.get("spoiler_text").toString()); + try { + status.setVisibility(resobj.get("visibility").toString()); + } catch (Exception e) { + status.setVisibility("public"); + } + status.setContent(resobj.get("text").toString()); + } catch (JSONException ignored) { + } + return status; + } + + /** + * Parse json response for several notes (Misskey) + * + * @param jsonArray JSONArray + * @return List + */ + public static List parseNotes(Context context, String instance, JSONArray jsonArray) { + + List statuses = new ArrayList<>(); + try { + int i = 0; + while (i < jsonArray.length()) { + + JSONObject resobj = jsonArray.getJSONObject(i); + Status status = parseNotes(context, instance, resobj); + i++; + statuses.add(status); + } + + } catch (JSONException e) { + e.printStackTrace(); + } + return statuses; + } + + /** + * Parse json response for unique note (misskey) + * + * @param resobj JSONObject + * @return Status + */ + @SuppressWarnings("InfiniteRecursion") + public static Status parseNotes(Context context, String instance, JSONObject resobj) { + Status status = new Status(); + try { + + status.setId(resobj.get("id").toString()); + status.setUri("https://" + instance + "/notes/" + resobj.get("id").toString()); + status.setCreated_at(Helper.mstStringToDate(context, resobj.get("createdAt").toString())); + status.setIn_reply_to_id(resobj.get("replyId").toString()); + status.setSensitive(false); + if (resobj.get("cw") != null && !resobj.get("cw").toString().equals("null")) + status.setSpoiler_text(resobj.get("cw").toString()); + try { + status.setVisibility(resobj.get("visibility").toString()); + } catch (Exception e) { + status.setVisibility("public"); + e.printStackTrace(); + } + status.setUrl("https://" + instance + "/notes/" + resobj.get("id").toString()); + //Retrieves attachments + if (resobj.has("media")) { + JSONArray arrayAttachement = resobj.getJSONArray("media"); + ArrayList attachments = new ArrayList<>(); + if (arrayAttachement != null) { + for (int j = 0; j < arrayAttachement.length(); j++) { + JSONObject attObj = arrayAttachement.getJSONObject(j); + Attachment attachment = new Attachment(); + attachment.setId(attObj.get("id").toString()); + attachment.setPreview_url(attObj.get("thumbnailUrl").toString()); + attachment.setRemote_url(attObj.get("url").toString()); + if (attObj.get("type").toString().contains("/")) { + attachment.setType(attObj.get("type").toString().split("/")[0]); + } else + attachment.setType(attObj.get("type").toString()); + attachment.setText_url(attObj.get("url").toString()); + attachment.setUrl(attObj.get("url").toString()); + if (attObj.get("isSensitive").toString().equals("true")) { + status.setSensitive(true); + } + try { + attachment.setDescription(attObj.get("comment").toString()); + } catch (JSONException ignore) { + ignore.printStackTrace(); + } + attachments.add(attachment); + } + } + status.setMedia_attachments(attachments); + } else { + status.setMedia_attachments(new ArrayList<>()); + } + try { + status.setCard(parseCardResponse(resobj.getJSONObject("card"))); + } catch (Exception e) { + status.setCard(null); + } + + + //Retrieves mentions + List mentions = new ArrayList<>(); + + status.setAccount(parseMisskeyAccountResponse(context, instance, resobj.getJSONObject("user"))); + + status.setContent(resobj.get("text").toString()); + try { + status.setReplies_count(Integer.valueOf(resobj.get("repliesCount").toString())); + } catch (Exception e) { + status.setReplies_count(-1); + } + try { + status.setFavourited(Boolean.valueOf(resobj.get("isFavorited").toString())); + } catch (Exception e) { + status.setFavourited(false); + } + if (resobj.has("bookmarked") && !resobj.isNull("bookmarked")) { + status.setBookmarked(true); + } else { + status.setBookmarked(false); + } + try { + if (resobj.getJSONObject("renoteId") != null && !resobj.getJSONObject("renoteId").toString().equals("null")) + status.setReblog(parseStatuses(context, resobj.getJSONObject("renote"))); + } catch (Exception ignored) { + } + + status.setMentions(mentions); + //Retrieves tags + List tags = new ArrayList<>(); + if (resobj.has("tags")) { + JSONArray arrayTag = resobj.getJSONArray("tags"); + if (arrayTag != null) { + for (int j = 0; j < arrayTag.length(); j++) { + JSONObject tagObj = arrayTag.getJSONObject(j); + Tag tag = new Tag(); + tag.setName(tagObj.get("name").toString()); + tag.setUrl(tagObj.get("url").toString()); + tags.add(tag); + } + } + } + status.setTags(tags); + + //Retrieves emjis + List emojiList = new ArrayList<>(); + if (resobj.has("emojis")) { + JSONArray emojisTag = resobj.getJSONArray("emojis"); + if (emojisTag != null) { + for (int j = 0; j < emojisTag.length(); j++) { + JSONObject emojisObj = emojisTag.getJSONObject(j); + Emojis emojis = parseMisskeyEmojis(emojisObj); + emojiList.add(emojis); + } + } + status.setEmojis(emojiList); + } + status.setEmojis(emojiList); + //Retrieve Application + Application application = new Application(); + try { + if (resobj.getJSONObject("application") != null) { + application.setName(resobj.getJSONObject("application").getString("name")); + application.setWebsite(resobj.getJSONObject("application").getString("website")); + } + } catch (Exception e) { + application = new Application(); + } + status.setApplication(application); + + + } catch (JSONException ignored) { + } catch (ParseException e) { + e.printStackTrace(); + } + return status; + } + + /** + * Parse json response for emoji + * + * @param resobj JSONObject + * @return Emojis + */ + private static Emojis parseEmojis(JSONObject resobj) { + Emojis emojis = new Emojis(); + try { + emojis.setShortcode(resobj.get("shortcode").toString()); + emojis.setStatic_url(resobj.get("static_url").toString()); + emojis.setUrl(resobj.get("url").toString()); + try { + emojis.setVisible_in_picker((resobj.getBoolean("visible_in_picker"))); + } catch (Exception e) { + emojis.setVisible_in_picker(true); + } + } catch (Exception ignored) { + } + return emojis; + } + + /** + * Parse json response for emoji + * + * @param resobj JSONObject + * @return Emojis + */ + private static Emojis parseMisskeyEmojis(JSONObject resobj) { + Emojis emojis = new Emojis(); + try { + emojis.setShortcode(resobj.get("name").toString()); + emojis.setStatic_url(resobj.get("url").toString()); + emojis.setUrl(resobj.get("url").toString()); + } catch (Exception ignored) { + } + return emojis; + } + + /** + * Parse json response for emoji + * + * @param resobj JSONObject + * @return Emojis + */ + private static app.fedilab.android.client.Entities.List parseList(JSONObject resobj) { + app.fedilab.android.client.Entities.List list = new app.fedilab.android.client.Entities.List(); + try { + list.setId(resobj.get("id").toString()); + list.setTitle(resobj.get("title").toString()); + } catch (Exception ignored) { + } + return list; + } + + /** + * Parse json response an unique peertube account + * + * @param resobj JSONObject + * @return Account + */ + private static Account parseAccountResponsePeertube(Context context, String instance, JSONObject resobj) { + Account account = new Account(); + try { + account.setId(resobj.get("id").toString()); + account.setUsername(resobj.get("name").toString()); + account.setAcct(resobj.get("name").toString() + "@" + resobj.get("host").toString()); + account.setDisplay_name(resobj.get("displayName").toString()); + account.setHost(resobj.get("host").toString()); + if (resobj.has("createdAt")) + account.setCreated_at(Helper.mstStringToDate(context, resobj.get("createdAt").toString())); + else + account.setCreated_at(new Date()); + + if (resobj.has("followersCount")) + account.setFollowers_count(Integer.valueOf(resobj.get("followersCount").toString())); + else + account.setFollowers_count(0); + if (resobj.has("followingCount")) + account.setFollowing_count(Integer.valueOf(resobj.get("followingCount").toString())); + else + account.setFollowing_count(0); + account.setStatuses_count(0); + if (resobj.has("description")) + account.setNote(resobj.get("description").toString()); + else + account.setNote(""); + account.setUrl(resobj.get("url").toString()); + account.setSocial("PEERTUBE"); + if (resobj.has("avatar") && !resobj.get("avatar").toString().equals("null")) { + account.setAvatar("https://" + instance + resobj.getJSONObject("avatar").get("path")); + } else + account.setAvatar(null); + account.setAvatar_static(resobj.get("avatar").toString()); + } catch (JSONException ignored) { + } catch (ParseException e) { + e.printStackTrace(); + } + return account; + } + + /** + * Parse json response an unique report for admins + * + * @param resobj JSONObject + * @return AccountAdmin + */ + private static Report parseReportAdminResponse(Context context, JSONObject resobj) { + + Report report = new Report(); + try { + report.setId(resobj.getString("id")); + if (!resobj.isNull("action_taken")) { + report.setAction_taken(resobj.getBoolean("action_taken")); + } else if (!resobj.isNull("state")) { + report.setAction_taken(!resobj.getString("state").equals("open")); + } + if (!resobj.isNull("comment")) { + report.setComment(resobj.getString("comment")); + } else if (!resobj.isNull("content")) { + report.setComment(resobj.getString("content")); + } + + + report.setCreated_at(Helper.mstStringToDate(context, resobj.getString("created_at"))); + if (!resobj.isNull("updated_at")) { + report.setUpdated_at(Helper.mstStringToDate(context, resobj.getString("updated_at"))); + } + if (MainActivity.social == UpdateAccountInfoAsyncTask.SOCIAL.MASTODON) { + if (!resobj.isNull("account")) { + report.setAccount(parseAccountAdminResponse(context, resobj.getJSONObject("account"))); + } + if (!resobj.isNull("target_account")) { + report.setTarget_account(parseAccountAdminResponse(context, resobj.getJSONObject("target_account"))); + } + if (!resobj.isNull("assigned_account")) { + report.setAssigned_account(parseAccountAdminResponse(context, resobj.getJSONObject("assigned_account"))); + } + } else if (MainActivity.social == UpdateAccountInfoAsyncTask.SOCIAL.PLEROMA) { + + if (!resobj.isNull("account")) { + Account account = parseAccountResponse(context, resobj.getJSONObject("account")); + AccountAdmin accountAdmin = new AccountAdmin(); + accountAdmin.setId(account.getId()); + accountAdmin.setUsername(account.getAcct()); + accountAdmin.setAccount(account); + report.setTarget_account(accountAdmin); + } + + if (!resobj.isNull("actor")) { + Account account = parseAccountResponse(context, resobj.getJSONObject("actor")); + AccountAdmin accountAdmin = new AccountAdmin(); + accountAdmin.setId(account.getId()); + accountAdmin.setUsername(account.getAcct()); + accountAdmin.setAccount(account); + report.setAccount(accountAdmin); + } + + } + + if (!resobj.isNull("action_taken_by_account")) { + report.setAction_taken_by_account(parseAccountAdminResponse(context, resobj.getJSONObject("action_taken_by_account"))); + } + report.setStatuses(parseStatuses(context, resobj.getJSONArray("statuses"))); + } catch (Exception ignored) { + ignored.printStackTrace(); + } + return report; + } + + /** + * Parse json response an unique account for admins + * + * @param resobj JSONObject + * @return Account + */ + private static AccountAdmin parseAccountAdminResponse(Context context, JSONObject resobj) { + + AccountAdmin accountAdmin = new AccountAdmin(); + try { + accountAdmin.setId(resobj.get("id").toString()); + if (!resobj.isNull("username")) { + accountAdmin.setUsername(resobj.getString("username")); + } + if (!resobj.isNull("nickname")) { + accountAdmin.setUsername(resobj.getString("nickname")); + } + if (!resobj.isNull("created_at")) { + accountAdmin.setCreated_at(Helper.mstStringToDate(context, resobj.getString("created_at"))); + } + if (!resobj.isNull("email")) { + accountAdmin.setEmail(resobj.getString("email")); + } + if (!resobj.isNull("role")) { + accountAdmin.setRole(resobj.getString("role")); + } + if (!resobj.isNull("roles")) { + if (resobj.getJSONObject("roles").getBoolean("admin")) { + accountAdmin.setRole("admin"); + } else if (resobj.getJSONObject("roles").getBoolean("moderator")) { + accountAdmin.setRole("moderator"); + } else { + accountAdmin.setRole("user"); + } + } + if (!resobj.isNull("ip")) { + accountAdmin.setIp(resobj.getString("ip")); + } + if (!resobj.isNull("domain")) { + accountAdmin.setDomain(resobj.getString("domain")); + } + + if (!resobj.isNull("account")) { + accountAdmin.setAccount(parseAccountResponse(context, resobj.getJSONObject("account"))); + } else { + Account account = new Account(); + account.setId(accountAdmin.getId()); + account.setAcct(accountAdmin.getUsername()); + account.setDisplay_name(accountAdmin.getUsername()); + accountAdmin.setAccount(account); + } + if (!resobj.isNull("confirmed")) { + accountAdmin.setConfirmed(resobj.getBoolean("confirmed")); + } else { + accountAdmin.setConfirmed(true); + } + if (!resobj.isNull("suspended")) { + accountAdmin.setSuspended(resobj.getBoolean("suspended")); + } else { + accountAdmin.setSuspended(false); + } + if (!resobj.isNull("silenced")) { + accountAdmin.setSilenced(resobj.getBoolean("silenced")); + } else { + accountAdmin.setSilenced(false); + } + if (!resobj.isNull("disabled")) { + accountAdmin.setDisabled(resobj.getBoolean("disabled")); + } else { + if (!resobj.isNull("deactivated")) { + accountAdmin.setDisabled(resobj.getBoolean("deactivated")); + } else { + accountAdmin.setDisabled(false); + } + } + + if (!resobj.isNull("approved")) { + accountAdmin.setApproved(resobj.getBoolean("approved")); + } else { + accountAdmin.setApproved(true); + } + } catch (Exception ignored) { + ignored.printStackTrace(); + } + return accountAdmin; + } + + /** + * Parse json response an unique account + * + * @param resobj JSONObject + * @return Account + */ + @SuppressWarnings("InfiniteRecursion") + private static Account parseAccountResponse(Context context, JSONObject resobj) { + + Account account = new Account(); + try { + account.setId(resobj.get("id").toString()); + account.setUuid(resobj.get("id").toString()); + account.setUsername(resobj.get("username").toString()); + account.setAcct(resobj.get("acct").toString()); + account.setDisplay_name(resobj.get("display_name").toString()); + account.setLocked(Boolean.parseBoolean(resobj.get("locked").toString())); + if (resobj.has("created_at") && !resobj.isNull("created_at")) { + account.setCreated_at(Helper.mstStringToDate(context, resobj.get("created_at").toString())); + } else { + account.setCreated_at(new Date()); + } + account.setFollowers_count(Integer.valueOf(resobj.get("followers_count").toString())); + account.setFollowing_count(Integer.valueOf(resobj.get("following_count").toString())); + account.setStatuses_count(Integer.valueOf(resobj.get("statuses_count").toString())); + account.setNote(resobj.get("note").toString()); + try { + account.setBot(Boolean.parseBoolean(resobj.get("bot").toString())); + } catch (Exception e) { + account.setBot(false); + } + try { + account.setMoved_to_account(parseAccountResponse(context, resobj.getJSONObject("moved"))); + } catch (Exception ignored) { + account.setMoved_to_account(null); + } + account.setUrl(resobj.get("url").toString()); + account.setAvatar(resobj.get("avatar").toString()); + account.setAvatar_static(resobj.get("avatar_static").toString()); + account.setHeader(resobj.get("header").toString()); + account.setHeader_static(resobj.get("header_static").toString()); + try { + if (resobj.has("pleroma")) { + account.setSocial("PLEROMA"); + try { + account.setModerator(resobj.getJSONObject("pleroma").getBoolean("is_moderator")); + account.setAdmin(resobj.getJSONObject("pleroma").getBoolean("is_admin")); + } catch (Exception ignored) { + account.setModerator(false); + account.setAdmin(false); + } + } + } catch (Exception ignored) { + } + + try { + JSONArray fields = resobj.getJSONArray("fields"); + LinkedHashMap fieldsMap = new LinkedHashMap<>(); + LinkedHashMap fieldsMapVerified = new LinkedHashMap<>(); + if (fields != null) { + for (int j = 0; j < fields.length(); j++) { + fieldsMap.put(fields.getJSONObject(j).getString("name"), fields.getJSONObject(j).getString("value")); + try { + fieldsMapVerified.put(fields.getJSONObject(j).getString("name"), (fields.getJSONObject(j).getString("verified_at") != null && !fields.getJSONObject(j).getString("verified_at").equals("null"))); + } catch (Exception e) { + fieldsMapVerified.put(fields.getJSONObject(j).getString("name"), false); + } + + } + } + account.setFields(fieldsMap); + account.setFieldsVerified(fieldsMapVerified); + } catch (Exception ignored) { + } + + + //Retrieves emjis + List emojiList = new ArrayList<>(); + try { + JSONArray emojisTag = resobj.getJSONArray("emojis"); + if (emojisTag != null) { + for (int j = 0; j < emojisTag.length(); j++) { + JSONObject emojisObj = emojisTag.getJSONObject(j); + Emojis emojis = parseEmojis(emojisObj); + emojiList.add(emojis); + } + } + account.setEmojis(emojiList); + } catch (Exception e) { + account.setEmojis(new ArrayList<>()); + } + if (resobj.has("source")) { + JSONObject source = resobj.getJSONObject("source"); + try { + if (source.has("privacy")) { + account.setPrivacy(source.getString("privacy")); + } else { + account.setPrivacy("public"); + } + if (source.has("sensitive")) { + account.setSensitive(source.getBoolean("sensitive")); + } else { + account.setSensitive(false); + } + + } catch (Exception e) { + account.setPrivacy("public"); + account.setSensitive(false); + e.printStackTrace(); + } + } + } catch (JSONException ignored) { + } catch (ParseException e) { + e.printStackTrace(); + } + return account; + } + + /** + * Parse json response an unique account + * + * @param resobj JSONObject + * @return Account + */ + @SuppressWarnings("InfiniteRecursion") + private static Account parseOpencollectiveAccountResponse(Context context, RetrieveOpenCollectiveAsyncTask.Type type, JSONObject resobj) { + + Account account = new Account(); + try { + account.setId(resobj.get("MemberId").toString()); + account.setUuid(resobj.get("MemberId").toString()); + account.setUsername(resobj.get("name").toString()); + account.setAcct(resobj.get("tier").toString()); + account.setDisplay_name(resobj.get("name").toString()); + account.setLocked(false); + account.setCreated_at(Helper.opencollectivetStringToDate(context, resobj.get("createdAt").toString())); + account.setFollowers_count(0); + account.setFollowing_count(0); + account.setStatuses_count(0); + account.setNote(resobj.get("description").toString()); + account.setBot(false); + account.setMoved_to_account(null); + account.setUrl(resobj.get("profile").toString()); + account.setAvatar(resobj.get("image").toString()); + account.setAvatar_static(resobj.get("image").toString()); + account.setHeader(null); + account.setHeader_static(null); + if (resobj.get("role").toString().equals("BACKER")) + account.setSocial("OPENCOLLECTIVE_BACKER"); + else if (resobj.get("role").toString().equals("SPONSOR")) + account.setSocial("OPENCOLLECTIVE_SPONSOR"); + else + account.setSocial("OPENCOLLECTIVE"); + + } catch (JSONException ignored) { + } catch (ParseException e) { + e.printStackTrace(); + } + return account; + } + + /** + * Parse json response an unique account + * + * @param resobj JSONObject + * @return Account + */ + @SuppressWarnings("InfiniteRecursion") + private static Account parseMisskeyAccountResponse(Context context, String instance, JSONObject resobj) { + + Account account = new Account(); + try { + account.setId(resobj.get("id").toString()); + account.setUsername(resobj.get("username").toString()); + String host = null; + String acct; + if (resobj.isNull("host")) { + acct = resobj.get("username").toString(); + } else { + host = resobj.get("host").toString(); + acct = resobj.get("username").toString() + "@" + host; + } + account.setAcct(acct); + account.setDisplay_name(resobj.get("name").toString()); + account.setCreated_at(new Date()); + + account.setUrl("https://" + instance + "/@" + account.getUsername()); + account.setAvatar(resobj.get("avatarUrl").toString()); + account.setAvatar_static(resobj.get("avatarUrl").toString()); + try { + account.setBot(Boolean.parseBoolean(resobj.get("isBot").toString())); + } catch (Exception e) { + account.setBot(false); + } + //Retrieves emjis + List emojiList = new ArrayList<>(); + if (resobj.has("emojis")) { + JSONArray emojisTag = resobj.getJSONArray("emojis"); + if (emojisTag != null) { + for (int j = 0; j < emojisTag.length(); j++) { + JSONObject emojisObj = emojisTag.getJSONObject(j); + Emojis emojis = parseEmojis(emojisObj); + emojiList.add(emojis); + } + } + } + account.setEmojis(emojiList); + } catch (JSONException ignored) { + ignored.printStackTrace(); + } + return account; + } + + /** + * Parse json response for list of relationship + * + * @param jsonArray JSONArray + * @return List + */ + private static List parseAttachmentResponse(JSONArray jsonArray) { + + List attachments = new ArrayList<>(); + try { + int i = 0; + while (i < jsonArray.length()) { + JSONObject resobj = jsonArray.getJSONObject(i); + Attachment attachment = parseAttachmentResponse(resobj); + attachments.add(attachment); + i++; + } + } catch (JSONException ignored) { + } + return attachments; + } + + /** + * Parse json response an unique attachment + * + * @param resobj JSONObject + * @return Relationship + */ + public static Attachment parseAttachmentResponse(JSONObject resobj) { + + Attachment attachment = new Attachment(); + try { + attachment.setId(resobj.get("id").toString()); + attachment.setType(resobj.get("type").toString()); + attachment.setUrl(resobj.get("url").toString()); + try { + attachment.setDescription(resobj.get("description").toString()); + } catch (JSONException ignore) { + } + try { + attachment.setRemote_url(resobj.get("remote_url").toString()); + } catch (JSONException ignore) { + } + try { + attachment.setPreview_url(resobj.get("preview_url").toString()); + } catch (JSONException ignore) { + } + try { + attachment.setMeta(resobj.get("meta").toString()); + } catch (JSONException ignore) { + } + try { + attachment.setText_url(resobj.get("text_url").toString()); + } catch (JSONException ignore) { + } + + } catch (JSONException ignored) { + } + return attachment; + } + + /** + * Parse json response an unique notification + * + * @param resobj JSONObject + * @return Account + */ + public static Notification parseNotificationResponse(Context context, JSONObject resobj) { + + Notification notification = new Notification(); + try { + notification.setId(resobj.get("id").toString()); + notification.setType(resobj.get("type").toString()); + notification.setCreated_at(Helper.mstStringToDate(context, resobj.get("created_at").toString())); + notification.setAccount(parseAccountResponse(context, resobj.getJSONObject("account"))); + try { + notification.setStatus(parseStatuses(context, resobj.getJSONObject("status"))); + } catch (Exception ignored) { + } + notification.setCreated_at(Helper.mstStringToDate(context, resobj.get("created_at").toString())); + } catch (JSONException ignored) { + } catch (ParseException e) { + e.printStackTrace(); + } + return notification; + } + /** * Execute admin get actions * @@ -365,7 +1620,6 @@ public class API { return apiResponse; } - /** * Execute admin post actions * @@ -579,7 +1833,6 @@ public class API { return apiResponse; } - public InstanceNodeInfo displayNodeInfo(String domain) { String response; @@ -628,12 +1881,12 @@ public class API { } catch (NoSuchAlgorithmException | JSONException | KeyManagementException e1) { e1.printStackTrace(); } catch (HttpsConnection.HttpsConnectionException e1) { - if( e1.getStatusCode() == 404) { + if (e1.getStatusCode() == 404) { instanceNodeInfo.setName("GNU"); instanceNodeInfo.setVersion("unknown"); instanceNodeInfo.setOpenRegistrations(true); e1.printStackTrace(); - }else{ + } else { instanceNodeInfo.setName("MASTODON"); instanceNodeInfo.setVersion("3.0"); instanceNodeInfo.setOpenRegistrations(false); @@ -644,34 +1897,6 @@ public class API { return instanceNodeInfo; } - public API(Context context, String instance, String token) { - this.context = context; - if (context == null) { - apiResponse = new APIResponse(); - APIError = new Error(); - return; - } - SharedPreferences sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE); - tootPerPage = sharedpreferences.getInt(Helper.SET_TOOT_PER_PAGE, Helper.TOOTS_PER_PAGE); - if( MainActivity.social == UpdateAccountInfoAsyncTask.SOCIAL.PIXELFED && tootPerPage > 30 ){ - tootPerPage = 30; - } - accountPerPage = Helper.ACCOUNTS_PER_PAGE; - notificationPerPage = Helper.NOTIFICATIONS_PER_PAGE; - if (instance != null) - this.instance = instance; - else - this.instance = Helper.getLiveInstance(context); - - if (token != null) - this.prefKeyOauthTokenT = token; - else - this.prefKeyOauthTokenT = sharedpreferences.getString(Helper.PREF_KEY_OAUTH_TOKEN, null); - apiResponse = new APIResponse(); - APIError = null; - } - - /*** * Get info on the current Instance *synchronously* * @return APIResponse @@ -695,7 +1920,6 @@ public class API { return apiResponse; } - /*** * Get instance for registering an account *synchronously* * @return APIResponse @@ -720,7 +1944,6 @@ public class API { return apiResponse; } - /*** * Update credential of the authenticated user *synchronously* * @return APIResponse @@ -777,7 +2000,7 @@ public class API { account = new Account(); InstanceNodeInfo nodeinfo = displayNodeInfo(instance); String social = null; - if( nodeinfo != null){ + if (nodeinfo != null) { social = nodeinfo.getName(); } try { @@ -787,7 +2010,7 @@ public class API { } String response = new HttpsConnection(context, this.instance).get(getAbsoluteUrl("/accounts/verify_credentials"), 10, null, prefKeyOauthTokenT); account = parseAccountResponse(context, new JSONObject(response)); - if( social != null ) { + if (social != null) { account.setSocial(social.toUpperCase()); } if (account != null && account.getSocial() != null && account.getSocial().equals("PLEROMA")) { @@ -819,7 +2042,7 @@ public class API { try { response = new HttpsConnection(context, this.instance).get(getAbsoluteUrl("/accounts/verify_credentials"), 10, null, targetedAccount.getToken()); account = parseAccountResponse(context, new JSONObject(response)); - if( social != null ) { + if (social != null) { account.setSocial(social.toUpperCase()); } if (account.getSocial().equals("PLEROMA")) { @@ -838,7 +2061,6 @@ public class API { return account; } - /*** * Verifiy credential of the authenticated user *synchronously* * @return Account @@ -975,7 +2197,6 @@ public class API { return account; } - /** * Returns a relationship between the authenticated account and an account * @@ -1007,7 +2228,6 @@ public class API { return relationship; } - /** * Returns a relationship between the authenticated account and an account * @@ -1156,7 +2376,6 @@ public class API { return apiResponse; } - /** * Retrieves accounts that reblogged the status *synchronously* * @@ -1194,7 +2413,6 @@ public class API { return apiResponse; } - /** * Retrieves accounts that favourited the status *synchronously* * @@ -1232,7 +2450,6 @@ public class API { return apiResponse; } - /** * Retrieves one status *synchronously* * @@ -1319,9 +2536,7 @@ public class API { return statusContext; } - - - public APIResponse getReplies(String statusId, String max_id){ + public APIResponse getReplies(String statusId, String max_id) { HashMap params = new HashMap<>(); if (max_id != null) params.put("max_id", max_id); @@ -1466,7 +2681,6 @@ public class API { return apiResponse; } - /** * Retrieves home timeline for the account *synchronously* * @@ -1477,7 +2691,6 @@ public class API { return getHomeTimeline(max_id, null, null, tootPerPage); } - /** * Retrieves home timeline for the account since an Id value *synchronously* * @@ -1496,7 +2709,6 @@ public class API { return getHomeTimeline(null, null, min_id, tootPerPage); } - /** * Retrieves home timeline from cache the account *synchronously* * @@ -1524,7 +2736,7 @@ public class API { } } } - if (statuses == null || statuses.size() <= 1 ) { + if (statuses == null || statuses.size() <= 1) { return getHomeTimeline(max_id); } else { if (statuses.get(0).getId().matches("\\d+")) { @@ -1543,7 +2755,6 @@ public class API { } - /** * Retrieves home timeline for the account *synchronously* * @@ -1592,7 +2803,6 @@ public class API { return apiResponse; } - /** * Retrieves public GNU timeline for the account *synchronously* * @@ -1633,7 +2843,6 @@ public class API { return apiResponse; } - /** * Retrieves public pixelfed timeline for the account *synchronously* * @@ -1696,7 +2905,6 @@ public class API { return apiResponse; } - /** * Retrieves Peertube videos from an instance *synchronously* * @@ -1886,7 +3094,6 @@ public class API { return apiResponse; } - /** * Retrieves Peertube videos from an instance *synchronously* * @@ -2024,7 +3231,6 @@ public class API { return apiResponse; } - /** * Retrieves news coming from Fedilab's account *synchronously* * @@ -2080,7 +3286,6 @@ public class API { return getDiscoverTimeline(local, max_id, null, tootPerPage); } - /** * Retrieves discover timeline for the account *synchronously* * @@ -2126,7 +3331,6 @@ public class API { return apiResponse; } - public APIResponse getCustomArtTimeline(boolean local, String tag, String max_id, List any, List all, List none) { return getArtTimeline(local, tag, max_id, null, any, all, none); } @@ -2314,7 +3518,6 @@ public class API { return apiResponse; } - /** * Retrieves muted users by the authenticated account *synchronously* * @@ -2335,7 +3538,6 @@ public class API { return getAccounts("/blocks", max_id, null, accountPerPage); } - /** * Retrieves following for the account specified by targetedId *synchronously* * @@ -2405,7 +3607,6 @@ public class API { return apiResponse; } - /** * Retrieves opencollective accounts *synchronously* * @@ -2434,7 +3635,6 @@ public class API { return results; } - /** * Retrieves blocked domains for the authenticated account *synchronously* * @@ -2470,7 +3670,6 @@ public class API { return apiResponse; } - /** * Delete a blocked domains for the authenticated account *synchronously* * @@ -2550,7 +3749,6 @@ public class API { return apiResponse; } - /** * Retrieves favourited status for the authenticated account *synchronously* * @@ -2602,12 +3800,10 @@ public class API { return apiResponse; } - - /** * Retrieves bookmarked status for the authenticated account *synchronously* * - * @param max_id String id max + * @param max_id String id max * @return APIResponse */ @SuppressWarnings("SameParameterValue") @@ -2644,6 +3840,8 @@ public class API { return postAction(statusAction, targetedId, null, null); } + //Pleroma admin calls + /** * Makes the post action for a status * @@ -2922,7 +4120,6 @@ public class API { return actionCode; } - /** * scheduled action for a status * @@ -3002,7 +4199,6 @@ public class API { return apiResponse; } - /** * Public api call to submit a vote * @@ -3076,7 +4272,6 @@ public class API { return null; } - /** * Posts a status * @@ -3134,7 +4329,6 @@ public class API { return apiResponse; } - /** * Posts a status * @@ -3164,7 +4358,6 @@ public class API { return apiResponse; } - /** * Retrieves notifications for the authenticated account since an id*synchronously* * @@ -3196,7 +4389,6 @@ public class API { return getNotifications(type, max_id, null, notificationPerPage, display); } - /** * Retrieves notifications for the authenticated account *synchronously* * @@ -3347,13 +4539,12 @@ public class API { } catch (NoSuchAlgorithmException | IOException | KeyManagementException | JSONException e) { e.printStackTrace(); } - if( apiResponse != null) { + if (apiResponse != null) { apiResponse.setNotifications(notifications); } return apiResponse; } - /** * Changes media description * @@ -3426,7 +4617,6 @@ public class API { return apiResponse; } - /** * Retrieves Accounts and feeds when searching *synchronously* * @@ -3483,7 +4673,6 @@ public class API { return apiResponse; } - /** * Retrieves Accounts when searching (ie: via @...) *synchronously* * Not limited to following @@ -3538,7 +4727,6 @@ public class API { return apiResponse; } - /** * Retrieves Accounts when searching (ie: via @...) *synchronously* * @@ -3574,8 +4762,6 @@ public class API { return apiResponse; } - //Pleroma admin calls - /** * Check if it's a Pleroma admin account and change in settings *synchronously* */ @@ -3677,7 +4863,6 @@ public class API { return apiResponse; } - /** * Create a filter * @@ -3891,7 +5076,6 @@ public class API { return apiResponse; } - /** * Get accounts in a list for a user * @@ -3929,7 +5113,6 @@ public class API { return apiResponse; } - /** * Get a list * @@ -3960,7 +5143,6 @@ public class API { return apiResponse; } - /** * Add an account in a list * @@ -3994,7 +5176,6 @@ public class API { return apiResponse; } - /** * Delete an account from a list * @@ -4058,7 +5239,6 @@ public class API { return apiResponse; } - /** * Update a list by its id * @@ -4091,7 +5271,6 @@ public class API { return apiResponse; } - /** * Delete a list by its id * @@ -4111,7 +5290,6 @@ public class API { return actionCode; } - /** * Retrieves list from Communitywiki *synchronously* * @@ -4176,7 +5354,6 @@ public class API { return list; } - /** * Parse json response an unique account * @@ -4196,117 +5373,6 @@ public class API { return results; } - /** - * Parse json response an unique Car - * - * @param resobj JSONObject - * @return Card - */ - private static Card parseCardResponse(JSONObject resobj) { - - Card card = new Card(); - try { - card.setUrl(resobj.get("url").toString()); - card.setTitle(resobj.get("title").toString()); - card.setDescription(resobj.get("description").toString()); - card.setImage(resobj.get("image").toString()); - - card.setType(resobj.get("type").toString()); - try { - card.setAuthor_name(resobj.get("author_name").toString()); - } catch (Exception e) { - card.setAuthor_name(null); - } - try { - card.setAuthor_url(resobj.get("author_url").toString()); - } catch (Exception e) { - card.setAuthor_url(null); - } - try { - card.setHtml(resobj.get("html").toString()); - } catch (Exception e) { - card.setHtml(null); - } - try { - card.setEmbed_url(resobj.get("embed_url").toString()); - } catch (Exception e) { - card.setEmbed_url(null); - } - try { - card.setProvider_name(resobj.get("provider_name").toString()); - } catch (Exception e) { - card.setProvider_name(null); - } - try { - card.setProvider_url(resobj.get("provider_url").toString()); - } catch (Exception e) { - card.setProvider_url(null); - } - try { - card.setHeight(Integer.parseInt(resobj.get("height").toString())); - } catch (Exception e) { - card.setHeight(0); - } - try { - card.setWidth(Integer.parseInt(resobj.get("width").toString())); - } catch (Exception e) { - card.setWidth(0); - } - } catch (JSONException e) { - card = null; - } - return card; - } - - /** - * Parse json response an unique instance social result - * - * @param resobj JSONObject - * @return InstanceSocial - */ - public static InstanceSocial parseInstanceSocialResponse(Context context, JSONObject resobj) { - - InstanceSocial instanceSocial = new InstanceSocial(); - try { - - - instanceSocial.setUptime(Float.parseFloat(resobj.get("uptime").toString())); - instanceSocial.setUp(Boolean.parseBoolean(resobj.get("up").toString())); - - instanceSocial.setConnections(Long.parseLong(resobj.get("connections").toString())); - instanceSocial.setDead(Boolean.parseBoolean(resobj.get("dead").toString())); - - - instanceSocial.setId(resobj.get("id").toString()); - - instanceSocial.setInfo(resobj.get("info").toString()); - instanceSocial.setVersion(resobj.get("version").toString()); - instanceSocial.setName(resobj.get("name").toString()); - instanceSocial.setObs_rank(resobj.get("obs_rank").toString()); - instanceSocial.setThumbnail(resobj.get("thumbnail").toString()); - instanceSocial.setIpv6(Boolean.parseBoolean(resobj.get("ipv6").toString())); - instanceSocial.setObs_score(Integer.parseInt(resobj.get("obs_score").toString())); - instanceSocial.setOpen_registrations(Boolean.parseBoolean(resobj.get("open_registrations").toString())); - - instanceSocial.setUsers(Long.parseLong(resobj.get("users").toString())); - instanceSocial.setStatuses(Long.parseLong(resobj.get("statuses").toString())); - - instanceSocial.setHttps_rank(resobj.get("https_rank").toString()); - instanceSocial.setHttps_score(Integer.parseInt(resobj.get("https_score").toString())); - if( !resobj.isNull("added_at")) { - instanceSocial.setAdded_at(Helper.mstStringToDate(context, resobj.get("added_at").toString())); - } - instanceSocial.setChecked_at(Helper.mstStringToDate(context, resobj.get("checked_at").toString())); - instanceSocial.setUpdated_at(Helper.mstStringToDate(context, resobj.get("updated_at").toString())); - - - } catch (Exception e) { - e.printStackTrace(); - } - return instanceSocial; - } - - /** * Parse Domains * @@ -4324,7 +5390,6 @@ public class API { return list_tmp; } - /** * Parse Tags * @@ -4396,146 +5461,6 @@ public class API { return peertubes; } - /** - * Parse json response for unique how to - * - * @param resobj JSONObject - * @return Peertube - */ - public static Peertube parsePeertube(Context context, String instance, JSONObject resobj) { - Peertube peertube = new Peertube(); - try { - peertube.setId(resobj.get("id").toString()); - peertube.setCache(resobj); - peertube.setUuid(resobj.get("uuid").toString()); - peertube.setName(resobj.get("name").toString()); - peertube.setDescription(resobj.get("description").toString()); - peertube.setEmbedPath(resobj.get("embedPath").toString()); - peertube.setPreviewPath(resobj.get("previewPath").toString()); - peertube.setThumbnailPath(resobj.get("thumbnailPath").toString()); - peertube.setAccount(parseAccountResponsePeertube(context, instance, resobj.getJSONObject("account"))); - peertube.setInstance(instance); - peertube.setView(Integer.parseInt(resobj.get("views").toString())); - peertube.setLike(Integer.parseInt(resobj.get("likes").toString())); - peertube.setDislike(Integer.parseInt(resobj.get("dislikes").toString())); - peertube.setDuration(Integer.parseInt(resobj.get("duration").toString())); - try { - peertube.setCreated_at(Helper.mstStringToDate(context, resobj.get("createdAt").toString())); - } catch (ParseException e) { - e.printStackTrace(); - } - } catch (JSONException e) { - e.printStackTrace(); - } - - return peertube; - } - - /** - * Parse json response for unique how to - * - * @param resobj JSONObject - * @return Peertube - */ - private static Peertube parseSinglePeertube(Context context, String instance, JSONObject resobj) { - Peertube peertube = new Peertube(); - try { - peertube.setId(resobj.get("id").toString()); - peertube.setUuid(resobj.get("uuid").toString()); - peertube.setName(resobj.get("name").toString()); - peertube.setCache(resobj); - peertube.setInstance(instance); - peertube.setHost(resobj.getJSONObject("account").get("host").toString()); - peertube.setDescription(resobj.get("description").toString()); - peertube.setEmbedPath(resobj.get("embedPath").toString()); - peertube.setPreviewPath(resobj.get("previewPath").toString()); - peertube.setThumbnailPath(resobj.get("thumbnailPath").toString()); - peertube.setView(Integer.parseInt(resobj.get("views").toString())); - peertube.setLike(Integer.parseInt(resobj.get("likes").toString())); - peertube.setCommentsEnabled(Boolean.parseBoolean(resobj.get("commentsEnabled").toString())); - peertube.setDislike(Integer.parseInt(resobj.get("dislikes").toString())); - peertube.setDuration(Integer.parseInt(resobj.get("duration").toString())); - peertube.setAccount(parseAccountResponsePeertube(context, instance, resobj.getJSONObject("account"))); - try { - peertube.setCreated_at(Helper.mstStringToDate(context, resobj.get("createdAt").toString())); - } catch (ParseException e) { - e.printStackTrace(); - } - JSONArray files = resobj.getJSONArray("files"); - ArrayList resolutions = new ArrayList<>(); - for (int j = 0; j < files.length(); j++) { - JSONObject attObj = files.getJSONObject(j); - resolutions.add(attObj.getJSONObject("resolution").get("id").toString()); - } - peertube.setResolution(resolutions); - } catch (JSONException e) { - e.printStackTrace(); - } - - return peertube; - } - - /** - * Parse json response for peertube comments - * - * @param resobj JSONObject - * @return Peertube - */ - private static List parseSinglePeertubeComments(Context context, String instance, JSONObject resobj) { - List statuses = new ArrayList<>(); - try { - JSONArray jsonArray = resobj.getJSONArray("data"); - int i = 0; - while (i < jsonArray.length()) { - Status status = new Status(); - JSONObject comment = jsonArray.getJSONObject(i); - status.setId(comment.get("id").toString()); - status.setUri(comment.get("url").toString()); - status.setUrl(comment.get("url").toString()); - status.setSensitive(false); - status.setSpoiler_text(""); - status.setContent(comment.get("text").toString()); - status.setIn_reply_to_id(comment.get("inReplyToCommentId").toString()); - status.setAccount(parseAccountResponsePeertube(context, instance, comment.getJSONObject("account"))); - status.setCreated_at(Helper.mstStringToDate(context, comment.get("createdAt").toString())); - status.setMentions(new ArrayList<>()); - status.setEmojis(new ArrayList<>()); - status.setMedia_attachments(new ArrayList<>()); - status.setVisibility("public"); - i++; - statuses.add(status); - } - } catch (JSONException e) { - e.printStackTrace(); - } catch (ParseException e) { - e.printStackTrace(); - } - return statuses; - } - - /** - * Parse json response for unique how to - * - * @param resobj JSONObject - * @return HowToVideo - */ - private static HowToVideo parseHowTo(Context context, JSONObject resobj) { - HowToVideo howToVideo = new HowToVideo(); - try { - howToVideo.setId(resobj.get("id").toString()); - howToVideo.setUuid(resobj.get("uuid").toString()); - howToVideo.setName(resobj.get("name").toString()); - howToVideo.setDescription(resobj.get("description").toString()); - howToVideo.setEmbedPath(resobj.get("embedPath").toString()); - howToVideo.setPreviewPath(resobj.get("previewPath").toString()); - howToVideo.setThumbnailPath(resobj.get("thumbnailPath").toString()); - } catch (JSONException e) { - e.printStackTrace(); - } - - return howToVideo; - } - /** * Parse json response for several conversations * @@ -4580,64 +5505,6 @@ public class API { return conversation; } - /** - * Parse json response for several scheduled toots - * - * @param jsonObject JSONObject - * @return List - */ - private static Schedule parseSimpleSchedule(Context context, JSONObject jsonObject) { - Schedule schedule = new Schedule(); - try { - JSONObject resobj = jsonObject.getJSONObject("params"); - Status status = parseSchedule(context, resobj); - List attachements = parseAttachmentResponse(jsonObject.getJSONArray("media_attachments")); - status.setMedia_attachments((ArrayList) attachements); - schedule.setStatus(status); - schedule.setAttachmentList(attachements); - schedule.setId(jsonObject.get("id").toString()); - schedule.setScheduled_at(Helper.mstStringToDate(context, jsonObject.get("scheduled_at").toString())); - } catch (JSONException e) { - e.printStackTrace(); - } catch (ParseException e) { - e.printStackTrace(); - } - return schedule; - } - - /** - * Parse json response for several scheduled toots - * - * @param jsonArray JSONArray - * @return List - */ - private static List parseSchedule(Context context, JSONArray jsonArray) { - - List schedules = new ArrayList<>(); - try { - int i = 0; - while (i < jsonArray.length()) { - Schedule schedule = new Schedule(); - JSONObject resobj = jsonArray.getJSONObject(i).getJSONObject("params"); - Status status = parseSchedule(context, resobj); - List attachements = parseAttachmentResponse(jsonArray.getJSONObject(i).getJSONArray("media_attachments")); - status.setMedia_attachments((ArrayList) attachements); - schedule.setStatus(status); - schedule.setAttachmentList(attachements); - schedules.add(schedule); - schedule.setId(jsonArray.getJSONObject(i).get("id").toString()); - schedule.setScheduled_at(Helper.mstStringToDate(context, jsonArray.getJSONObject(i).get("scheduled_at").toString())); - i++; - } - } catch (JSONException e) { - e.printStackTrace(); - } catch (ParseException e) { - e.printStackTrace(); - } - return schedules; - } - - /** * Parse json response for several status * @@ -4655,7 +5522,7 @@ public class API { JSONObject resobj = jsonArray.getJSONObject(i); Status status = parseStatuses(context, resobj); Status alreadyCached = new TimelineCacheDAO(context, db).getSingle(status.getId()); - if (alreadyCached == null && account !=null && account.getId() != null && account.getInstance() != null) { + if (alreadyCached == null && account != null && account.getId() != null && account.getInstance() != null) { new TimelineCacheDAO(context, db).insert(status.getId(), resobj.toString(), account.getId(), account.getInstance()); } i++; @@ -4668,447 +5535,6 @@ public class API { return statuses; } - /** - * Parse json response for several status - * - * @param jsonArray JSONArray - * @return List - */ - private static List parseStatuses(Context context, JSONArray jsonArray) { - - List statuses = new ArrayList<>(); - try { - int i = 0; - while (i < jsonArray.length()) { - - JSONObject resobj = jsonArray.getJSONObject(i); - Status status = parseStatuses(context, resobj); - i++; - if (status != null) { - statuses.add(status); - } - } - - } catch (JSONException e) { - e.printStackTrace(); - } - return statuses; - } - - - /** - * Parse a poll - * - * @param context - * @param resobj - * @return - */ - public static Poll parsePoll(Context context, JSONObject resobj) { - Poll poll = new Poll(); - try { - poll.setId(resobj.getString("id")); - poll.setExpires_at(Helper.mstStringToDate(context, resobj.getString("expires_at"))); - poll.setExpired(resobj.getBoolean("expired")); - poll.setMultiple(resobj.getBoolean("multiple")); - poll.setVotes_count(resobj.getInt("votes_count")); - poll.setVoted(resobj.getBoolean("voted")); - JSONArray options = resobj.getJSONArray("options"); - List pollOptions = new ArrayList<>(); - for (int i = 0; i < options.length(); i++) { - JSONObject option = options.getJSONObject(i); - PollOptions pollOption = new PollOptions(); - pollOption.setTitle(option.getString("title")); - pollOption.setVotes_count(option.getInt("votes_count")); - pollOptions.add(pollOption); - } - poll.setOptionsList(pollOptions); - } catch (JSONException e) { - e.printStackTrace(); - } catch (ParseException e) { - e.printStackTrace(); - } - return poll; - } - - /** - * Parse json response for unique status - * - * @param resobj JSONObject - * @return Status - */ - @SuppressWarnings("InfiniteRecursion") - public static Status parseStatuses(Context context, JSONObject resobj) { - Status status = new Status(); - try { - status.setId(resobj.get("id").toString()); - status.setUri(resobj.get("uri").toString()); - status.setCreated_at(Helper.mstStringToDate(context, resobj.get("created_at").toString())); - status.setIn_reply_to_id(resobj.get("in_reply_to_id").toString()); - status.setIn_reply_to_account_id(resobj.get("in_reply_to_account_id").toString()); - status.setSensitive(Boolean.parseBoolean(resobj.get("sensitive").toString())); - status.setSpoiler_text(resobj.get("spoiler_text").toString()); - try { - status.setVisibility(resobj.get("visibility").toString()); - } catch (Exception e) { - status.setVisibility("public"); - } - try { - status.setLanguage(resobj.get("language").toString()); - } catch (Exception e) { - status.setLanguage("ja"); - } - status.setUrl(resobj.get("url").toString()); - //Retrieves attachments - JSONArray arrayAttachement = resobj.getJSONArray("media_attachments"); - ArrayList attachments = new ArrayList<>(); - if (arrayAttachement != null) { - for (int j = 0; j < arrayAttachement.length(); j++) { - JSONObject attObj = arrayAttachement.getJSONObject(j); - Attachment attachment = new Attachment(); - attachment.setId(attObj.get("id").toString()); - attachment.setPreview_url(attObj.get("preview_url").toString()); - attachment.setRemote_url(attObj.get("remote_url").toString()); - attachment.setType(attObj.get("type").toString()); - attachment.setText_url(attObj.get("text_url").toString()); - attachment.setUrl(attObj.get("url").toString()); - try { - attachment.setDescription(attObj.get("description").toString()); - } catch (JSONException ignore) { - } - attachments.add(attachment); - } - } - - try { - status.setCard(parseCardResponse(resobj.getJSONObject("card"))); - } catch (Exception e) { - status.setCard(null); - } - - status.setMedia_attachments(attachments); - //Retrieves mentions - List mentions = new ArrayList<>(); - JSONArray arrayMention = resobj.getJSONArray("mentions"); - if (arrayMention != null) { - for (int j = 0; j < arrayMention.length(); j++) { - JSONObject menObj = arrayMention.getJSONObject(j); - Mention mention = new Mention(); - mention.setId(menObj.get("id").toString()); - mention.setUrl(menObj.get("url").toString()); - mention.setAcct(menObj.get("acct").toString()); - mention.setUsername(menObj.get("username").toString()); - mentions.add(mention); - } - } - status.setMentions(mentions); - //Retrieves tags - List tags = new ArrayList<>(); - JSONArray arrayTag = resobj.getJSONArray("tags"); - if (arrayTag != null) { - for (int j = 0; j < arrayTag.length(); j++) { - JSONObject tagObj = arrayTag.getJSONObject(j); - Tag tag = new Tag(); - tag.setName(tagObj.get("name").toString()); - tag.setUrl(tagObj.get("url").toString()); - tags.add(tag); - } - } - status.setTags(tags); - //Retrieves emjis - List emojiList = new ArrayList<>(); - try { - JSONArray emojisTag = resobj.getJSONArray("emojis"); - if (emojisTag != null) { - for (int j = 0; j < emojisTag.length(); j++) { - JSONObject emojisObj = emojisTag.getJSONObject(j); - Emojis emojis = parseEmojis(emojisObj); - emojiList.add(emojis); - } - } - status.setEmojis(emojiList); - } catch (Exception e) { - status.setEmojis(new ArrayList<>()); - } - //Retrieve Application - Application application = new Application(); - try { - if (resobj.getJSONObject("application") != null) { - application.setName(resobj.getJSONObject("application").getString("name")); - application.setWebsite(resobj.getJSONObject("application").getString("website")); - } - } catch (Exception e) { - application = new Application(); - } - status.setApplication(application); - - status.setAccount(parseAccountResponse(context, resobj.getJSONObject("account"))); - status.setContent(resobj.get("content").toString()); - if( !resobj.isNull("favourites_count") ) { - status.setFavourites_count(Integer.valueOf(resobj.get("favourites_count").toString())); - }else{ - status.setFavourites_count(0); - } - if( !resobj.isNull("reblogs_count") ) { - status.setReblogs_count(Integer.valueOf(resobj.get("reblogs_count").toString())); - }else{ - status.setReblogs_count(0); - } - - try { - status.setReplies_count(Integer.valueOf(resobj.get("replies_count").toString())); - } catch (Exception e) { - status.setReplies_count(-1); - } - try { - status.setReblogged(Boolean.valueOf(resobj.get("reblogged").toString())); - } catch (Exception e) { - status.setReblogged(false); - } - try { - status.setFavourited(Boolean.valueOf(resobj.get("favourited").toString())); - } catch (Exception e) { - status.setFavourited(false); - } - try { - status.setMuted(Boolean.valueOf(resobj.get("muted").toString())); - } catch (Exception e) { - status.setMuted(false); - } - try { - status.setPinned(Boolean.valueOf(resobj.get("pinned").toString())); - } catch (JSONException e) { - status.setPinned(false); - } - try { - status.setReblog(parseStatuses(context, resobj.getJSONObject("reblog"))); - } catch (Exception ignored) { - } - - if (resobj.has("poll") && !resobj.isNull("poll")) { - Poll poll = new Poll(); - poll.setId(resobj.getJSONObject("poll").getString("id")); - try { - poll.setExpires_at(Helper.mstStringToDate(context, resobj.getJSONObject("poll").getString("expires_at"))); - } catch (Exception e) { - poll.setExpires_at(new Date()); - } - poll.setExpired(resobj.getJSONObject("poll").getBoolean("expired")); - poll.setMultiple(resobj.getJSONObject("poll").getBoolean("multiple")); - poll.setVotes_count(resobj.getJSONObject("poll").getInt("votes_count")); - poll.setVoted(resobj.getJSONObject("poll").getBoolean("voted")); - JSONArray options = resobj.getJSONObject("poll").getJSONArray("options"); - List pollOptions = new ArrayList<>(); - for (int i = 0; i < options.length(); i++) { - JSONObject option = options.getJSONObject(i); - PollOptions pollOption = new PollOptions(); - pollOption.setTitle(option.getString("title")); - pollOption.setVotes_count(option.getInt("votes_count")); - pollOptions.add(pollOption); - } - poll.setOptionsList(pollOptions); - status.setPoll(poll); - } - - } catch (JSONException ignored) { - } catch (ParseException e) { - e.printStackTrace(); - } - status.setViewType(context); - return status; - } - - - /** - * Parse json response for unique schedule - * - * @param resobj JSONObject - * @return Status - */ - @SuppressWarnings("InfiniteRecursion") - private static Status parseSchedule(Context context, JSONObject resobj) { - Status status = new Status(); - try { - status.setIn_reply_to_id(resobj.get("in_reply_to_id").toString()); - status.setSensitive(Boolean.parseBoolean(resobj.get("sensitive").toString())); - status.setSpoiler_text(resobj.get("spoiler_text").toString()); - try { - status.setVisibility(resobj.get("visibility").toString()); - } catch (Exception e) { - status.setVisibility("public"); - } - status.setContent(resobj.get("text").toString()); - } catch (JSONException ignored) { - } - return status; - } - - /** - * Parse json response for several notes (Misskey) - * - * @param jsonArray JSONArray - * @return List - */ - public static List parseNotes(Context context, String instance, JSONArray jsonArray) { - - List statuses = new ArrayList<>(); - try { - int i = 0; - while (i < jsonArray.length()) { - - JSONObject resobj = jsonArray.getJSONObject(i); - Status status = parseNotes(context, instance, resobj); - i++; - statuses.add(status); - } - - } catch (JSONException e) { - e.printStackTrace(); - } - return statuses; - } - - /** - * Parse json response for unique note (misskey) - * - * @param resobj JSONObject - * @return Status - */ - @SuppressWarnings("InfiniteRecursion") - public static Status parseNotes(Context context, String instance, JSONObject resobj) { - Status status = new Status(); - try { - - status.setId(resobj.get("id").toString()); - status.setUri("https://" + instance + "/notes/" + resobj.get("id").toString()); - status.setCreated_at(Helper.mstStringToDate(context, resobj.get("createdAt").toString())); - status.setIn_reply_to_id(resobj.get("replyId").toString()); - status.setSensitive(false); - if (resobj.get("cw") != null && !resobj.get("cw").toString().equals("null")) - status.setSpoiler_text(resobj.get("cw").toString()); - try { - status.setVisibility(resobj.get("visibility").toString()); - } catch (Exception e) { - status.setVisibility("public"); - e.printStackTrace(); - } - status.setUrl("https://" + instance + "/notes/" + resobj.get("id").toString()); - //Retrieves attachments - if (resobj.has("media")) { - JSONArray arrayAttachement = resobj.getJSONArray("media"); - ArrayList attachments = new ArrayList<>(); - if (arrayAttachement != null) { - for (int j = 0; j < arrayAttachement.length(); j++) { - JSONObject attObj = arrayAttachement.getJSONObject(j); - Attachment attachment = new Attachment(); - attachment.setId(attObj.get("id").toString()); - attachment.setPreview_url(attObj.get("thumbnailUrl").toString()); - attachment.setRemote_url(attObj.get("url").toString()); - if (attObj.get("type").toString().contains("/")) { - attachment.setType(attObj.get("type").toString().split("/")[0]); - } else - attachment.setType(attObj.get("type").toString()); - attachment.setText_url(attObj.get("url").toString()); - attachment.setUrl(attObj.get("url").toString()); - if (attObj.get("isSensitive").toString().equals("true")) { - status.setSensitive(true); - } - try { - attachment.setDescription(attObj.get("comment").toString()); - } catch (JSONException ignore) { - ignore.printStackTrace(); - } - attachments.add(attachment); - } - } - status.setMedia_attachments(attachments); - } else { - status.setMedia_attachments(new ArrayList<>()); - } - try { - status.setCard(parseCardResponse(resobj.getJSONObject("card"))); - } catch (Exception e) { - status.setCard(null); - } - - - //Retrieves mentions - List mentions = new ArrayList<>(); - - status.setAccount(parseMisskeyAccountResponse(context, instance, resobj.getJSONObject("user"))); - - status.setContent(resobj.get("text").toString()); - try { - status.setReplies_count(Integer.valueOf(resobj.get("repliesCount").toString())); - } catch (Exception e) { - status.setReplies_count(-1); - } - try { - status.setFavourited(Boolean.valueOf(resobj.get("isFavorited").toString())); - } catch (Exception e) { - status.setFavourited(false); - } - if( resobj.has("bookmarked") && !resobj.isNull("bookmarked")){ - status.setBookmarked(true); - }else{ - status.setBookmarked(false); - } - try { - if (resobj.getJSONObject("renoteId") != null && !resobj.getJSONObject("renoteId").toString().equals("null")) - status.setReblog(parseStatuses(context, resobj.getJSONObject("renote"))); - } catch (Exception ignored) { - } - - status.setMentions(mentions); - //Retrieves tags - List tags = new ArrayList<>(); - if (resobj.has("tags")) { - JSONArray arrayTag = resobj.getJSONArray("tags"); - if (arrayTag != null) { - for (int j = 0; j < arrayTag.length(); j++) { - JSONObject tagObj = arrayTag.getJSONObject(j); - Tag tag = new Tag(); - tag.setName(tagObj.get("name").toString()); - tag.setUrl(tagObj.get("url").toString()); - tags.add(tag); - } - } - } - status.setTags(tags); - - //Retrieves emjis - List emojiList = new ArrayList<>(); - if (resobj.has("emojis")) { - JSONArray emojisTag = resobj.getJSONArray("emojis"); - if (emojisTag != null) { - for (int j = 0; j < emojisTag.length(); j++) { - JSONObject emojisObj = emojisTag.getJSONObject(j); - Emojis emojis = parseMisskeyEmojis(emojisObj); - emojiList.add(emojis); - } - } - status.setEmojis(emojiList); - } - status.setEmojis(emojiList); - //Retrieve Application - Application application = new Application(); - try { - if (resobj.getJSONObject("application") != null) { - application.setName(resobj.getJSONObject("application").getString("name")); - application.setWebsite(resobj.getJSONObject("application").getString("website")); - } - } catch (Exception e) { - application = new Application(); - } - status.setApplication(application); - - - } catch (JSONException ignored) { - } catch (ParseException e) { - e.printStackTrace(); - } - return status; - } - /** * Parse json response an unique instance * @@ -5149,7 +5575,6 @@ public class API { return instance; } - /** * Parse json response for several instance reg * @@ -5196,7 +5621,6 @@ public class API { return instanceReg; } - /** * Parse Pleroma emojis * @@ -5222,7 +5646,6 @@ public class API { return emojis; } - /** * Parse emojis * @@ -5246,30 +5669,6 @@ public class API { return emojis; } - - /** - * Parse json response for emoji - * - * @param resobj JSONObject - * @return Emojis - */ - private static Emojis parseEmojis(JSONObject resobj) { - Emojis emojis = new Emojis(); - try { - emojis.setShortcode(resobj.get("shortcode").toString()); - emojis.setStatic_url(resobj.get("static_url").toString()); - emojis.setUrl(resobj.get("url").toString()); - try { - emojis.setVisible_in_picker((resobj.getBoolean("visible_in_picker"))); - } catch (Exception e) { - emojis.setVisible_in_picker(true); - } - } catch (Exception ignored) { - } - return emojis; - } - - /** * Parse emojis * @@ -5292,25 +5691,6 @@ public class API { return emojis; } - - /** - * Parse json response for emoji - * - * @param resobj JSONObject - * @return Emojis - */ - private static Emojis parseMisskeyEmojis(JSONObject resobj) { - Emojis emojis = new Emojis(); - try { - emojis.setShortcode(resobj.get("name").toString()); - emojis.setStatic_url(resobj.get("url").toString()); - emojis.setUrl(resobj.get("url").toString()); - } catch (Exception ignored) { - } - return emojis; - } - - /** * Parse Filters * @@ -5372,7 +5752,6 @@ public class API { } - /** * Parse Lists * @@ -5395,23 +5774,6 @@ public class API { return lists; } - - /** - * Parse json response for emoji - * - * @param resobj JSONObject - * @return Emojis - */ - private static app.fedilab.android.client.Entities.List parseList(JSONObject resobj) { - app.fedilab.android.client.Entities.List list = new app.fedilab.android.client.Entities.List(); - try { - list.setId(resobj.get("id").toString()); - list.setTitle(resobj.get("title").toString()); - } catch (Exception ignored) { - } - return list; - } - private List parseAccountResponsePeertube(Context context, String instance, JSONArray jsonArray) { List accounts = new ArrayList<>(); try { @@ -5428,53 +5790,6 @@ public class API { return accounts; } - /** - * Parse json response an unique peertube account - * - * @param resobj JSONObject - * @return Account - */ - private static Account parseAccountResponsePeertube(Context context, String instance, JSONObject resobj) { - Account account = new Account(); - try { - account.setId(resobj.get("id").toString()); - account.setUsername(resobj.get("name").toString()); - account.setAcct(resobj.get("name").toString() + "@" + resobj.get("host").toString()); - account.setDisplay_name(resobj.get("displayName").toString()); - account.setHost(resobj.get("host").toString()); - if (resobj.has("createdAt")) - account.setCreated_at(Helper.mstStringToDate(context, resobj.get("createdAt").toString())); - else - account.setCreated_at(new Date()); - - if (resobj.has("followersCount")) - account.setFollowers_count(Integer.valueOf(resobj.get("followersCount").toString())); - else - account.setFollowers_count(0); - if (resobj.has("followingCount")) - account.setFollowing_count(Integer.valueOf(resobj.get("followingCount").toString())); - else - account.setFollowing_count(0); - account.setStatuses_count(0); - if (resobj.has("description")) - account.setNote(resobj.get("description").toString()); - else - account.setNote(""); - account.setUrl(resobj.get("url").toString()); - account.setSocial("PEERTUBE"); - if (resobj.has("avatar") && !resobj.get("avatar").toString().equals("null")) { - account.setAvatar("https://" + instance + resobj.getJSONObject("avatar").get("path")); - } else - account.setAvatar(null); - account.setAvatar_static(resobj.get("avatar").toString()); - } catch (JSONException ignored) { - } catch (ParseException e) { - e.printStackTrace(); - } - return account; - } - - /** * Parse json response for list of reports for admins * @@ -5498,76 +5813,6 @@ public class API { return reports; } - /** - * Parse json response an unique report for admins - * - * @param resobj JSONObject - * @return AccountAdmin - */ - private static Report parseReportAdminResponse(Context context, JSONObject resobj) { - - Report report = new Report(); - try { - report.setId(resobj.getString("id")); - if (!resobj.isNull("action_taken")) { - report.setAction_taken(resobj.getBoolean("action_taken")); - } else if (!resobj.isNull("state")) { - report.setAction_taken(!resobj.getString("state").equals("open")); - } - if (!resobj.isNull("comment")) { - report.setComment(resobj.getString("comment")); - } else if (!resobj.isNull("content")) { - report.setComment(resobj.getString("content")); - } - - - report.setCreated_at(Helper.mstStringToDate(context, resobj.getString("created_at"))); - if (!resobj.isNull("updated_at")) { - report.setUpdated_at(Helper.mstStringToDate(context, resobj.getString("updated_at"))); - } - if (MainActivity.social == UpdateAccountInfoAsyncTask.SOCIAL.MASTODON) { - if (!resobj.isNull("account")) { - report.setAccount(parseAccountAdminResponse(context, resobj.getJSONObject("account"))); - } - if (!resobj.isNull("target_account")) { - report.setTarget_account(parseAccountAdminResponse(context, resobj.getJSONObject("target_account"))); - } - if (!resobj.isNull("assigned_account")) { - report.setAssigned_account(parseAccountAdminResponse(context, resobj.getJSONObject("assigned_account"))); - } - } else if (MainActivity.social == UpdateAccountInfoAsyncTask.SOCIAL.PLEROMA) { - - if (!resobj.isNull("account")) { - Account account = parseAccountResponse(context, resobj.getJSONObject("account")); - AccountAdmin accountAdmin = new AccountAdmin(); - accountAdmin.setId(account.getId()); - accountAdmin.setUsername(account.getAcct()); - accountAdmin.setAccount(account); - report.setTarget_account(accountAdmin); - } - - if (!resobj.isNull("actor")) { - Account account = parseAccountResponse(context, resobj.getJSONObject("actor")); - AccountAdmin accountAdmin = new AccountAdmin(); - accountAdmin.setId(account.getId()); - accountAdmin.setUsername(account.getAcct()); - accountAdmin.setAccount(account); - report.setAccount(accountAdmin); - } - - } - - if (!resobj.isNull("action_taken_by_account")) { - report.setAction_taken_by_account(parseAccountAdminResponse(context, resobj.getJSONObject("action_taken_by_account"))); - } - report.setStatuses(parseStatuses(context, resobj.getJSONArray("statuses"))); - } catch (Exception ignored) { - ignored.printStackTrace(); - } - return report; - } - - /** * Parse json response for list of accounts for admins * @@ -5591,93 +5836,6 @@ public class API { return accountAdmins; } - /** - * Parse json response an unique account for admins - * - * @param resobj JSONObject - * @return Account - */ - private static AccountAdmin parseAccountAdminResponse(Context context, JSONObject resobj) { - - AccountAdmin accountAdmin = new AccountAdmin(); - try { - accountAdmin.setId(resobj.get("id").toString()); - if (!resobj.isNull("username")) { - accountAdmin.setUsername(resobj.getString("username")); - } - if (!resobj.isNull("nickname")) { - accountAdmin.setUsername(resobj.getString("nickname")); - } - if (!resobj.isNull("created_at")) { - accountAdmin.setCreated_at(Helper.mstStringToDate(context, resobj.getString("created_at"))); - } - if (!resobj.isNull("email")) { - accountAdmin.setEmail(resobj.getString("email")); - } - if (!resobj.isNull("role")) { - accountAdmin.setRole(resobj.getString("role")); - } - if (!resobj.isNull("roles")) { - if (resobj.getJSONObject("roles").getBoolean("admin")) { - accountAdmin.setRole("admin"); - } else if (resobj.getJSONObject("roles").getBoolean("moderator")) { - accountAdmin.setRole("moderator"); - } else { - accountAdmin.setRole("user"); - } - } - if (!resobj.isNull("ip")) { - accountAdmin.setIp(resobj.getString("ip")); - } - if (!resobj.isNull("domain")) { - accountAdmin.setDomain(resobj.getString("domain")); - } - - if (!resobj.isNull("account")) { - accountAdmin.setAccount(parseAccountResponse(context, resobj.getJSONObject("account"))); - } else { - Account account = new Account(); - account.setId(accountAdmin.getId()); - account.setAcct(accountAdmin.getUsername()); - account.setDisplay_name(accountAdmin.getUsername()); - accountAdmin.setAccount(account); - } - if (!resobj.isNull("confirmed")) { - accountAdmin.setConfirmed(resobj.getBoolean("confirmed")); - } else { - accountAdmin.setConfirmed(true); - } - if (!resobj.isNull("suspended")) { - accountAdmin.setSuspended(resobj.getBoolean("suspended")); - } else { - accountAdmin.setSuspended(false); - } - if (!resobj.isNull("silenced")) { - accountAdmin.setSilenced(resobj.getBoolean("silenced")); - } else { - accountAdmin.setSilenced(false); - } - if (!resobj.isNull("disabled")) { - accountAdmin.setDisabled(resobj.getBoolean("disabled")); - } else { - if (!resobj.isNull("deactivated")) { - accountAdmin.setDisabled(resobj.getBoolean("deactivated")); - } else { - accountAdmin.setDisabled(false); - } - } - - if (!resobj.isNull("approved")) { - accountAdmin.setApproved(resobj.getBoolean("approved")); - } else { - accountAdmin.setApproved(true); - } - } catch (Exception ignored) { - ignored.printStackTrace(); - } - return accountAdmin; - } - /** * Parse json response for list of accounts * @@ -5701,125 +5859,6 @@ public class API { return accounts; } - /** - * Parse json response an unique account - * - * @param resobj JSONObject - * @return Account - */ - @SuppressWarnings("InfiniteRecursion") - private static Account parseAccountResponse(Context context, JSONObject resobj) { - - Account account = new Account(); - try { - account.setId(resobj.get("id").toString()); - account.setUuid(resobj.get("id").toString()); - account.setUsername(resobj.get("username").toString()); - account.setAcct(resobj.get("acct").toString()); - account.setDisplay_name(resobj.get("display_name").toString()); - account.setLocked(Boolean.parseBoolean(resobj.get("locked").toString())); - if (resobj.has("created_at") && !resobj.isNull("created_at")) { - account.setCreated_at(Helper.mstStringToDate(context, resobj.get("created_at").toString())); - } else { - account.setCreated_at(new Date()); - } - account.setFollowers_count(Integer.valueOf(resobj.get("followers_count").toString())); - account.setFollowing_count(Integer.valueOf(resobj.get("following_count").toString())); - account.setStatuses_count(Integer.valueOf(resobj.get("statuses_count").toString())); - account.setNote(resobj.get("note").toString()); - try { - account.setBot(Boolean.parseBoolean(resobj.get("bot").toString())); - } catch (Exception e) { - account.setBot(false); - } - try { - account.setMoved_to_account(parseAccountResponse(context, resobj.getJSONObject("moved"))); - } catch (Exception ignored) { - account.setMoved_to_account(null); - } - account.setUrl(resobj.get("url").toString()); - account.setAvatar(resobj.get("avatar").toString()); - account.setAvatar_static(resobj.get("avatar_static").toString()); - account.setHeader(resobj.get("header").toString()); - account.setHeader_static(resobj.get("header_static").toString()); - try { - if (resobj.has("pleroma")) { - account.setSocial("PLEROMA"); - try { - account.setModerator(resobj.getJSONObject("pleroma").getBoolean("is_moderator")); - account.setAdmin(resobj.getJSONObject("pleroma").getBoolean("is_admin")); - } catch (Exception ignored) { - account.setModerator(false); - account.setAdmin(false); - } - } - } catch (Exception ignored) { - } - - try { - JSONArray fields = resobj.getJSONArray("fields"); - LinkedHashMap fieldsMap = new LinkedHashMap<>(); - LinkedHashMap fieldsMapVerified = new LinkedHashMap<>(); - if (fields != null) { - for (int j = 0; j < fields.length(); j++) { - fieldsMap.put(fields.getJSONObject(j).getString("name"), fields.getJSONObject(j).getString("value")); - try { - fieldsMapVerified.put(fields.getJSONObject(j).getString("name"), (fields.getJSONObject(j).getString("verified_at") != null && !fields.getJSONObject(j).getString("verified_at").equals("null"))); - } catch (Exception e) { - fieldsMapVerified.put(fields.getJSONObject(j).getString("name"), false); - } - - } - } - account.setFields(fieldsMap); - account.setFieldsVerified(fieldsMapVerified); - } catch (Exception ignored) { - } - - - //Retrieves emjis - List emojiList = new ArrayList<>(); - try { - JSONArray emojisTag = resobj.getJSONArray("emojis"); - if (emojisTag != null) { - for (int j = 0; j < emojisTag.length(); j++) { - JSONObject emojisObj = emojisTag.getJSONObject(j); - Emojis emojis = parseEmojis(emojisObj); - emojiList.add(emojis); - } - } - account.setEmojis(emojiList); - } catch (Exception e) { - account.setEmojis(new ArrayList<>()); - } - if (resobj.has("source")) { - JSONObject source = resobj.getJSONObject("source"); - try { - if (source.has("privacy")) { - account.setPrivacy(source.getString("privacy")); - } else { - account.setPrivacy("public"); - } - if (source.has("sensitive")) { - account.setSensitive(source.getBoolean("sensitive")); - } else { - account.setSensitive(false); - } - - } catch (Exception e) { - account.setPrivacy("public"); - account.setSensitive(false); - e.printStackTrace(); - } - } - } catch (JSONException ignored) { - } catch (ParseException e) { - e.printStackTrace(); - } - return account; - } - - private List parseOpencollectiveAccountResponse(Context context, RetrieveOpenCollectiveAsyncTask.Type type, JSONArray jsonArray) { List accounts = new ArrayList<>(); try { @@ -5839,102 +5878,6 @@ public class API { return accounts; } - /** - * Parse json response an unique account - * - * @param resobj JSONObject - * @return Account - */ - @SuppressWarnings("InfiniteRecursion") - private static Account parseOpencollectiveAccountResponse(Context context, RetrieveOpenCollectiveAsyncTask.Type type, JSONObject resobj) { - - Account account = new Account(); - try { - account.setId(resobj.get("MemberId").toString()); - account.setUuid(resobj.get("MemberId").toString()); - account.setUsername(resobj.get("name").toString()); - account.setAcct(resobj.get("tier").toString()); - account.setDisplay_name(resobj.get("name").toString()); - account.setLocked(false); - account.setCreated_at(Helper.opencollectivetStringToDate(context, resobj.get("createdAt").toString())); - account.setFollowers_count(0); - account.setFollowing_count(0); - account.setStatuses_count(0); - account.setNote(resobj.get("description").toString()); - account.setBot(false); - account.setMoved_to_account(null); - account.setUrl(resobj.get("profile").toString()); - account.setAvatar(resobj.get("image").toString()); - account.setAvatar_static(resobj.get("image").toString()); - account.setHeader(null); - account.setHeader_static(null); - if (resobj.get("role").toString().equals("BACKER")) - account.setSocial("OPENCOLLECTIVE_BACKER"); - else if (resobj.get("role").toString().equals("SPONSOR")) - account.setSocial("OPENCOLLECTIVE_SPONSOR"); - else - account.setSocial("OPENCOLLECTIVE"); - - } catch (JSONException ignored) { - } catch (ParseException e) { - e.printStackTrace(); - } - return account; - } - - /** - * Parse json response an unique account - * - * @param resobj JSONObject - * @return Account - */ - @SuppressWarnings("InfiniteRecursion") - private static Account parseMisskeyAccountResponse(Context context, String instance, JSONObject resobj) { - - Account account = new Account(); - try { - account.setId(resobj.get("id").toString()); - account.setUsername(resobj.get("username").toString()); - String host = null; - String acct; - if (resobj.isNull("host")) { - acct = resobj.get("username").toString(); - } else { - host = resobj.get("host").toString(); - acct = resobj.get("username").toString() + "@" + host; - } - account.setAcct(acct); - account.setDisplay_name(resobj.get("name").toString()); - account.setCreated_at(new Date()); - - account.setUrl("https://" + instance + "/@" + account.getUsername()); - account.setAvatar(resobj.get("avatarUrl").toString()); - account.setAvatar_static(resobj.get("avatarUrl").toString()); - try { - account.setBot(Boolean.parseBoolean(resobj.get("isBot").toString())); - } catch (Exception e) { - account.setBot(false); - } - //Retrieves emjis - List emojiList = new ArrayList<>(); - if (resobj.has("emojis")) { - JSONArray emojisTag = resobj.getJSONArray("emojis"); - if (emojisTag != null) { - for (int j = 0; j < emojisTag.length(); j++) { - JSONObject emojisObj = emojisTag.getJSONObject(j); - Emojis emojis = parseEmojis(emojisObj); - emojiList.add(emojis); - } - } - } - account.setEmojis(emojiList); - } catch (JSONException ignored) { - ignored.printStackTrace(); - } - return account; - } - - /** * Parse json response an unique relationship * @@ -5977,7 +5920,6 @@ public class API { return relationship; } - /** * Parse json response for list of relationship * @@ -6019,95 +5961,6 @@ public class API { return context; } - - /** - * Parse json response for list of relationship - * - * @param jsonArray JSONArray - * @return List - */ - private static List parseAttachmentResponse(JSONArray jsonArray) { - - List attachments = new ArrayList<>(); - try { - int i = 0; - while (i < jsonArray.length()) { - JSONObject resobj = jsonArray.getJSONObject(i); - Attachment attachment = parseAttachmentResponse(resobj); - attachments.add(attachment); - i++; - } - } catch (JSONException ignored) { - } - return attachments; - } - - /** - * Parse json response an unique attachment - * - * @param resobj JSONObject - * @return Relationship - */ - public static Attachment parseAttachmentResponse(JSONObject resobj) { - - Attachment attachment = new Attachment(); - try { - attachment.setId(resobj.get("id").toString()); - attachment.setType(resobj.get("type").toString()); - attachment.setUrl(resobj.get("url").toString()); - try { - attachment.setDescription(resobj.get("description").toString()); - } catch (JSONException ignore) { - } - try { - attachment.setRemote_url(resobj.get("remote_url").toString()); - } catch (JSONException ignore) { - } - try { - attachment.setPreview_url(resobj.get("preview_url").toString()); - } catch (JSONException ignore) { - } - try { - attachment.setMeta(resobj.get("meta").toString()); - } catch (JSONException ignore) { - } - try { - attachment.setText_url(resobj.get("text_url").toString()); - } catch (JSONException ignore) { - } - - } catch (JSONException ignored) { - } - return attachment; - } - - - /** - * Parse json response an unique notification - * - * @param resobj JSONObject - * @return Account - */ - public static Notification parseNotificationResponse(Context context, JSONObject resobj) { - - Notification notification = new Notification(); - try { - notification.setId(resobj.get("id").toString()); - notification.setType(resobj.get("type").toString()); - notification.setCreated_at(Helper.mstStringToDate(context, resobj.get("created_at").toString())); - notification.setAccount(parseAccountResponse(context, resobj.getJSONObject("account"))); - try { - notification.setStatus(parseStatuses(context, resobj.getJSONObject("status"))); - } catch (Exception ignored) { - } - notification.setCreated_at(Helper.mstStringToDate(context, resobj.get("created_at").toString())); - } catch (JSONException ignored) { - } catch (ParseException e) { - e.printStackTrace(); - } - return notification; - } - /** * Parse json response for list of notifications * @@ -6132,7 +5985,6 @@ public class API { return notifications; } - /** * Set the error message * @@ -6159,7 +6011,7 @@ public class API { private void setDefaultError(Exception e) { APIError = new Error(); - if( apiResponse == null){ + if (apiResponse == null) { apiResponse = new APIResponse(); } if (e.getLocalizedMessage() != null && e.getLocalizedMessage().trim().length() > 0) @@ -6171,12 +6023,10 @@ public class API { apiResponse.setError(APIError); } - public Error getError() { return APIError; } - private String getAbsoluteUrl(String action) { return Helper.instanceWithProtocol(this.context, this.instance) + "/api/v1" + action; } @@ -6197,4 +6047,74 @@ public class API { return "https://communitywiki.org/trunk/api/v1" + action; } + public enum searchType { + TAGS, + STATUSES, + ACCOUNTS + } + + public enum adminAction { + ENABLE, + APPROVE, + REJECT, + NONE, + SILENCE, + DISABLE, + UNSILENCE, + SUSPEND, + UNSUSPEND, + ASSIGN_TO_SELF, + UNASSIGN, + REOPEN, + RESOLVE, + GET_ACCOUNTS, + GET_ONE_ACCOUNT, + GET_REPORTS, + GET_ONE_REPORT + } + + public enum StatusAction { + FAVOURITE, + UNFAVOURITE, + BOOKMARK, + UNBOOKMARK, + REBLOG, + UNREBLOG, + MUTE, + MUTE_NOTIFICATIONS, + UNMUTE, + MUTE_CONVERSATION, + UNMUTE_CONVERSATION, + BLOCK, + UNBLOCK, + FOLLOW, + UNFOLLOW, + CREATESTATUS, + UNSTATUS, + AUTHORIZE, + REJECT, + REPORT, + REMOTE_FOLLOW, + PIN, + UNPIN, + ENDORSE, + UNENDORSE, + SHOW_BOOST, + HIDE_BOOST, + BLOCK_DOMAIN, + RATEVIDEO, + PEERTUBECOMMENT, + PEERTUBEREPLY, + PEERTUBEDELETECOMMENT, + PEERTUBEDELETEVIDEO, + UPDATESERVERSCHEDULE, + DELETESCHEDULED, + REFRESHPOLL + } + + public enum accountPrivacy { + PUBLIC, + LOCKED + } + } diff --git a/app/src/main/java/app/fedilab/android/client/APIResponse.java b/app/src/main/java/app/fedilab/android/client/APIResponse.java index 6cabd44ff..efdea29e6 100644 --- a/app/src/main/java/app/fedilab/android/client/APIResponse.java +++ b/app/src/main/java/app/fedilab/android/client/APIResponse.java @@ -15,7 +15,6 @@ package app.fedilab.android.client; * see . */ - import java.util.List; import app.fedilab.android.client.Entities.Account; diff --git a/app/src/main/java/app/fedilab/android/client/CustomSharingResponse.java b/app/src/main/java/app/fedilab/android/client/CustomSharingResponse.java index cb4930517..3bf77b488 100644 --- a/app/src/main/java/app/fedilab/android/client/CustomSharingResponse.java +++ b/app/src/main/java/app/fedilab/android/client/CustomSharingResponse.java @@ -30,14 +30,14 @@ public class CustomSharingResponse { return error; } - public String getResponse() { - return response; - } - public void setError(Error error) { this.error = error; } + public String getResponse() { + return response; + } + public void setResponse(String response) { this.response = response; } diff --git a/app/src/main/java/app/fedilab/android/client/Entities/Account.java b/app/src/main/java/app/fedilab/android/client/Entities/Account.java index 9840705aa..3b121e4dd 100644 --- a/app/src/main/java/app/fedilab/android/client/Entities/Account.java +++ b/app/src/main/java/app/fedilab/android/client/Entities/Account.java @@ -25,12 +25,6 @@ import android.os.Build; import android.os.Bundle; import android.os.Parcel; import android.os.Parcelable; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.core.content.ContextCompat; -import androidx.preference.PreferenceManager; - import android.text.Html; import android.text.Spannable; import android.text.SpannableString; @@ -44,6 +38,10 @@ import android.util.Patterns; import android.view.View; import android.widget.Toast; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.preference.PreferenceManager; + import com.bumptech.glide.Glide; import com.bumptech.glide.request.target.SimpleTarget; import com.bumptech.glide.request.transition.Transition; @@ -64,19 +62,16 @@ import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; -import app.fedilab.android.helper.ThemeHelper; -import es.dmoral.toasty.Toasty; import app.fedilab.android.R; import app.fedilab.android.activities.HashTagActivity; import app.fedilab.android.activities.ShowAccountActivity; import app.fedilab.android.helper.CrossActions; import app.fedilab.android.helper.Helper; +import app.fedilab.android.helper.ThemeHelper; import app.fedilab.android.interfaces.OnRetrieveEmojiAccountInterface; +import es.dmoral.toasty.Toasty; import static androidx.core.text.HtmlCompat.FROM_HTML_MODE_LEGACY; -import static app.fedilab.android.helper.Helper.THEME_BLACK; -import static app.fedilab.android.helper.Helper.THEME_DARK; -import static app.fedilab.android.helper.Helper.THEME_LIGHT; import static app.fedilab.android.helper.Helper.drawableToBitmap; import static app.fedilab.android.helper.Helper.hashtagPattern; @@ -88,6 +83,17 @@ import static app.fedilab.android.helper.Helper.hashtagPattern; public class Account implements Parcelable { + public static final Creator CREATOR = new Creator() { + @Override + public Account createFromParcel(Parcel source) { + return new Account(source); + } + + @Override + public Account[] newArray(int size) { + return new Account[size]; + } + }; private String id; private String uuid; private String username; @@ -133,73 +139,12 @@ public class Account implements Parcelable { private boolean isAdmin = false; private String privacy = "public"; private boolean sensitive = false; - private String locale; private String invite_request; private String created_by_application_id; private String invited_by_account_id; private boolean emojiFound = false; - - @Override - public int describeContents() { - return 0; - } - - @Override - public void writeToParcel(Parcel dest, int flags) { - dest.writeString(this.id); - dest.writeString(this.uuid); - dest.writeString(this.username); - TextUtils.writeToParcel(this.displayNameSpan, dest, flags); - dest.writeString(this.acct); - dest.writeString(this.display_name); - dest.writeString(this.stored_displayname); - dest.writeByte(this.locked ? (byte) 1 : (byte) 0); - dest.writeLong(this.created_at != null ? this.created_at.getTime() : -1); - dest.writeLong(this.updated_at != null ? this.updated_at.getTime() : -1); - dest.writeInt(this.followers_count); - dest.writeInt(this.following_count); - dest.writeInt(this.statuses_count); - dest.writeString(this.followers_count_str); - dest.writeString(this.following_count_str); - dest.writeString(this.statuses_count_str); - dest.writeString(this.note); - TextUtils.writeToParcel(this.noteSpan, dest, flags); - dest.writeString(this.url); - dest.writeString(this.avatar); - dest.writeString(this.avatar_static); - dest.writeString(this.header); - dest.writeString(this.header_static); - dest.writeString(this.token); - dest.writeString(this.instance); - dest.writeByte(this.isFollowing ? (byte) 1 : (byte) 0); - dest.writeInt(this.followType == null ? -1 : this.followType.ordinal()); - dest.writeByte(this.isMakingAction ? (byte) 1 : (byte) 0); - dest.writeParcelable(this.moved_to_account, flags); - dest.writeByte(this.muting_notifications ? (byte) 1 : (byte) 0); - dest.writeInt(this.metaDataSize); - dest.writeInt(this.metaDataSizeVerified); - dest.writeSerializable(this.fields); - dest.writeSerializable(this.fieldsVerified); - dest.writeSerializable(this.fieldsSpan); - dest.writeTypedList(this.emojis); - dest.writeString(this.host); - dest.writeByte(this.isBot ? (byte) 1 : (byte) 0); - dest.writeString(this.social); - dest.writeString(this.client_id); - dest.writeString(this.client_secret); - dest.writeString(this.refresh_token); - dest.writeByte(this.isModerator ? (byte) 1 : (byte) 0); - dest.writeByte(this.isAdmin ? (byte) 1 : (byte) 0); - dest.writeString(this.privacy); - dest.writeByte(this.sensitive ? (byte) 1 : (byte) 0); - dest.writeString(this.locale); - dest.writeString(this.invite_request); - dest.writeString(this.created_by_application_id); - dest.writeString(this.invited_by_account_id); - } - public Account() { } @@ -259,17 +204,125 @@ public class Account implements Parcelable { this.invited_by_account_id = in.readString(); } - public static final Creator CREATOR = new Creator() { - @Override - public Account createFromParcel(Parcel source) { - return new Account(source); - } + public static void makeAccountNameEmoji(final Context context, final OnRetrieveEmojiAccountInterface listener, Account account) { + if (((Activity) context).isFinishing()) + return; - @Override - public Account[] newArray(int size) { - return new Account[size]; + account.setdisplayNameSpan(new SpannableString(account.getDisplay_name())); + SpannableString displayNameSpan = account.getdisplayNameSpan(); + if (displayNameSpan == null) + return; + final List emojis = account.getEmojis(); + SharedPreferences sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE); + boolean disableAnimatedEmoji = sharedpreferences.getBoolean(Helper.SET_DISABLE_ANIMATED_EMOJI, false); + if (emojis != null && emojis.size() > 0) { + final int[] i = {0}; + for (final Emojis emoji : emojis) { + try { + Glide.with(context) + .asDrawable() + .load(emoji.getUrl()) + .into(new SimpleTarget() { + @Override + public void onResourceReady(@NonNull Drawable resource, @Nullable Transition transition) { + final String targetedEmoji = ":" + emoji.getShortcode() + ":"; + if (displayNameSpan.toString().contains(targetedEmoji)) { + //emojis can be used several times so we have to loop + for (int startPosition = -1; (startPosition = displayNameSpan.toString().indexOf(targetedEmoji, startPosition + 1)) != -1; startPosition++) { + final int endPosition = startPosition + targetedEmoji.length(); + if (endPosition <= displayNameSpan.toString().length() && endPosition >= startPosition) { + ImageSpan imageSpan; + if (!disableAnimatedEmoji) { + resource.setBounds(0, 0, (int) Helper.convertDpToPixel(20, context), (int) Helper.convertDpToPixel(20, context)); + resource.setVisible(true, true); + imageSpan = new ImageSpan(resource); + } else { + Bitmap bitmap = drawableToBitmap(resource.getCurrent()); + imageSpan = new ImageSpan(context, + Bitmap.createScaledBitmap(bitmap, (int) Helper.convertDpToPixel(20, context), + (int) Helper.convertDpToPixel(20, context), false)); + } + displayNameSpan.setSpan( + imageSpan, startPosition, + endPosition, Spannable.SPAN_INCLUSIVE_EXCLUSIVE); + } + } + } + i[0]++; + if (i[0] == (emojis.size())) { + account.setdisplayNameSpan(displayNameSpan); + if (listener != null) + listener.onRetrieveEmojiAccount(account); + } + } + + + }); + } catch (Exception ignored) { + } + + } } - }; + } + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeString(this.id); + dest.writeString(this.uuid); + dest.writeString(this.username); + TextUtils.writeToParcel(this.displayNameSpan, dest, flags); + dest.writeString(this.acct); + dest.writeString(this.display_name); + dest.writeString(this.stored_displayname); + dest.writeByte(this.locked ? (byte) 1 : (byte) 0); + dest.writeLong(this.created_at != null ? this.created_at.getTime() : -1); + dest.writeLong(this.updated_at != null ? this.updated_at.getTime() : -1); + dest.writeInt(this.followers_count); + dest.writeInt(this.following_count); + dest.writeInt(this.statuses_count); + dest.writeString(this.followers_count_str); + dest.writeString(this.following_count_str); + dest.writeString(this.statuses_count_str); + dest.writeString(this.note); + TextUtils.writeToParcel(this.noteSpan, dest, flags); + dest.writeString(this.url); + dest.writeString(this.avatar); + dest.writeString(this.avatar_static); + dest.writeString(this.header); + dest.writeString(this.header_static); + dest.writeString(this.token); + dest.writeString(this.instance); + dest.writeByte(this.isFollowing ? (byte) 1 : (byte) 0); + dest.writeInt(this.followType == null ? -1 : this.followType.ordinal()); + dest.writeByte(this.isMakingAction ? (byte) 1 : (byte) 0); + dest.writeParcelable(this.moved_to_account, flags); + dest.writeByte(this.muting_notifications ? (byte) 1 : (byte) 0); + dest.writeInt(this.metaDataSize); + dest.writeInt(this.metaDataSizeVerified); + dest.writeSerializable(this.fields); + dest.writeSerializable(this.fieldsVerified); + dest.writeSerializable(this.fieldsSpan); + dest.writeTypedList(this.emojis); + dest.writeString(this.host); + dest.writeByte(this.isBot ? (byte) 1 : (byte) 0); + dest.writeString(this.social); + dest.writeString(this.client_id); + dest.writeString(this.client_secret); + dest.writeString(this.refresh_token); + dest.writeByte(this.isModerator ? (byte) 1 : (byte) 0); + dest.writeByte(this.isAdmin ? (byte) 1 : (byte) 0); + dest.writeString(this.privacy); + dest.writeByte(this.sensitive ? (byte) 1 : (byte) 0); + dest.writeString(this.locale); + dest.writeString(this.invite_request); + dest.writeString(this.created_by_application_id); + dest.writeString(this.invited_by_account_id); + } public followAction getFollowType() { return followType; @@ -303,23 +356,22 @@ public class Account implements Parcelable { this.muting_notifications = muting_notifications; } - public void setFields(LinkedHashMap fields) { - this.fields = fields; - } - public LinkedHashMap getFields() { return fields; } - public void setFieldsSpan(LinkedHashMap fieldsSpan) { - this.fieldsSpan = fieldsSpan; + public void setFields(LinkedHashMap fields) { + this.fields = fields; } - public LinkedHashMap getFieldsSpan() { return fieldsSpan; } + public void setFieldsSpan(LinkedHashMap fieldsSpan) { + this.fieldsSpan = fieldsSpan; + } + public LinkedHashMap getFieldsVerified() { return fieldsVerified; } @@ -472,17 +524,6 @@ public class Account implements Parcelable { this.emojiFound = emojiFound; } - - public enum followAction { - FOLLOW, - NOT_FOLLOW, - BLOCK, - MUTE, - REQUEST_SENT, - NOTHING - } - - public String getId() { return id; } @@ -725,7 +766,7 @@ public class Account implements Parcelable { SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); int l_c = prefs.getInt("theme_link_color", -1); final SharedPreferences sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE); - if( l_c == -1) { + if (l_c == -1) { l_c = ThemeHelper.getAttColor(context, R.attr.linkColor); } final int link_color = l_c; @@ -1055,72 +1096,19 @@ public class Account implements Parcelable { } - - public static void makeAccountNameEmoji(final Context context, final OnRetrieveEmojiAccountInterface listener, Account account) { - if (((Activity) context).isFinishing()) - return; - - account.setdisplayNameSpan(new SpannableString(account.getDisplay_name())); - SpannableString displayNameSpan = account.getdisplayNameSpan(); - if (displayNameSpan == null) - return; - final List emojis = account.getEmojis(); - SharedPreferences sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE); - boolean disableAnimatedEmoji = sharedpreferences.getBoolean(Helper.SET_DISABLE_ANIMATED_EMOJI, false); - if (emojis != null && emojis.size() > 0) { - final int[] i = {0}; - for (final Emojis emoji : emojis) { - try { - Glide.with(context) - .asDrawable() - .load(emoji.getUrl()) - .into(new SimpleTarget() { - @Override - public void onResourceReady(@NonNull Drawable resource, @Nullable Transition transition) { - final String targetedEmoji = ":" + emoji.getShortcode() + ":"; - if (displayNameSpan.toString().contains(targetedEmoji)) { - //emojis can be used several times so we have to loop - for (int startPosition = -1; (startPosition = displayNameSpan.toString().indexOf(targetedEmoji, startPosition + 1)) != -1; startPosition++) { - final int endPosition = startPosition + targetedEmoji.length(); - if (endPosition <= displayNameSpan.toString().length() && endPosition >= startPosition) { - ImageSpan imageSpan; - if (!disableAnimatedEmoji) { - resource.setBounds(0, 0, (int) Helper.convertDpToPixel(20, context), (int) Helper.convertDpToPixel(20, context)); - resource.setVisible(true, true); - imageSpan = new ImageSpan(resource); - } else { - Bitmap bitmap = drawableToBitmap(resource.getCurrent()); - imageSpan = new ImageSpan(context, - Bitmap.createScaledBitmap(bitmap, (int) Helper.convertDpToPixel(20, context), - (int) Helper.convertDpToPixel(20, context), false)); - } - displayNameSpan.setSpan( - imageSpan, startPosition, - endPosition, Spannable.SPAN_INCLUSIVE_EXCLUSIVE); - } - } - } - i[0]++; - if (i[0] == (emojis.size())) { - account.setdisplayNameSpan(displayNameSpan); - if (listener != null) - listener.onRetrieveEmojiAccount(account); - } - } - - - }); - } catch (Exception ignored) { - } - - } - } - } - @NotNull public String toString() { return this.getAcct() + " - " + this.getUrl(); } + public enum followAction { + FOLLOW, + NOT_FOLLOW, + BLOCK, + MUTE, + REQUEST_SENT, + NOTHING + } + } diff --git a/app/src/main/java/app/fedilab/android/client/Entities/AccountAdmin.java b/app/src/main/java/app/fedilab/android/client/Entities/AccountAdmin.java index fcde9bf24..46b017287 100644 --- a/app/src/main/java/app/fedilab/android/client/Entities/AccountAdmin.java +++ b/app/src/main/java/app/fedilab/android/client/Entities/AccountAdmin.java @@ -23,6 +23,17 @@ import app.fedilab.android.client.API; public class AccountAdmin implements Parcelable { + public static final Creator CREATOR = new Creator() { + @Override + public AccountAdmin createFromParcel(Parcel source) { + return new AccountAdmin(source); + } + + @Override + public AccountAdmin[] newArray(int size) { + return new AccountAdmin[size]; + } + }; private String id; private String username; private Date created_at; @@ -38,6 +49,28 @@ public class AccountAdmin implements Parcelable { private API.adminAction action; private boolean approved; + public AccountAdmin() { + } + + protected AccountAdmin(Parcel in) { + this.id = in.readString(); + this.username = in.readString(); + long tmpCreated_at = in.readLong(); + this.created_at = tmpCreated_at == -1 ? null : new Date(tmpCreated_at); + this.email = in.readString(); + this.role = in.readString(); + this.ip = in.readString(); + this.domain = in.readString(); + this.confirmed = in.readByte() != 0; + this.suspended = in.readByte() != 0; + this.silenced = in.readByte() != 0; + this.disabled = in.readByte() != 0; + this.account = in.readParcelable(Account.class.getClassLoader()); + int tmpAction = in.readInt(); + this.action = tmpAction == -1 ? null : API.adminAction.values()[tmpAction]; + this.approved = in.readByte() != 0; + } + public String getId() { return id; } @@ -126,10 +159,6 @@ public class AccountAdmin implements Parcelable { this.account = account; } - - public AccountAdmin() { - } - public String getDomain() { return domain; } @@ -176,35 +205,4 @@ public class AccountAdmin implements Parcelable { dest.writeInt(this.action == null ? -1 : this.action.ordinal()); dest.writeByte(this.approved ? (byte) 1 : (byte) 0); } - - protected AccountAdmin(Parcel in) { - this.id = in.readString(); - this.username = in.readString(); - long tmpCreated_at = in.readLong(); - this.created_at = tmpCreated_at == -1 ? null : new Date(tmpCreated_at); - this.email = in.readString(); - this.role = in.readString(); - this.ip = in.readString(); - this.domain = in.readString(); - this.confirmed = in.readByte() != 0; - this.suspended = in.readByte() != 0; - this.silenced = in.readByte() != 0; - this.disabled = in.readByte() != 0; - this.account = in.readParcelable(Account.class.getClassLoader()); - int tmpAction = in.readInt(); - this.action = tmpAction == -1 ? null : API.adminAction.values()[tmpAction]; - this.approved = in.readByte() != 0; - } - - public static final Creator CREATOR = new Creator() { - @Override - public AccountAdmin createFromParcel(Parcel source) { - return new AccountAdmin(source); - } - - @Override - public AccountAdmin[] newArray(int size) { - return new AccountAdmin[size]; - } - }; } diff --git a/app/src/main/java/app/fedilab/android/client/Entities/Application.java b/app/src/main/java/app/fedilab/android/client/Entities/Application.java index 7cd177d4d..818e3a67c 100644 --- a/app/src/main/java/app/fedilab/android/client/Entities/Application.java +++ b/app/src/main/java/app/fedilab/android/client/Entities/Application.java @@ -25,17 +25,6 @@ import android.os.Parcelable; public class Application implements Parcelable { - private String name; - private String website; - - public Application() { - } - - protected Application(Parcel in) { - name = in.readString(); - website = in.readString(); - } - public static final Creator CREATOR = new Creator() { @Override public Application createFromParcel(Parcel in) { @@ -47,6 +36,16 @@ public class Application implements Parcelable { return new Application[size]; } }; + private String name; + private String website; + + public Application() { + } + + protected Application(Parcel in) { + name = in.readString(); + website = in.readString(); + } public String getName() { return name; diff --git a/app/src/main/java/app/fedilab/android/client/Entities/Attachment.java b/app/src/main/java/app/fedilab/android/client/Entities/Attachment.java index dd185f799..f9288c66b 100644 --- a/app/src/main/java/app/fedilab/android/client/Entities/Attachment.java +++ b/app/src/main/java/app/fedilab/android/client/Entities/Attachment.java @@ -24,6 +24,17 @@ import android.os.Parcelable; public class Attachment implements Parcelable { + public static final Creator CREATOR = new Creator() { + @Override + public Attachment createFromParcel(Parcel in) { + return new Attachment(in); + } + + @Override + public Attachment[] newArray(int size) { + return new Attachment[size]; + } + }; private String id; private String type; private String url; @@ -43,18 +54,6 @@ public class Attachment implements Parcelable { description = in.readString(); } - public static final Creator CREATOR = new Creator() { - @Override - public Attachment createFromParcel(Parcel in) { - return new Attachment(in); - } - - @Override - public Attachment[] newArray(int size) { - return new Attachment[size]; - } - }; - public Attachment() { } diff --git a/app/src/main/java/app/fedilab/android/client/Entities/Card.java b/app/src/main/java/app/fedilab/android/client/Entities/Card.java index f8c6ac585..54bb038d5 100644 --- a/app/src/main/java/app/fedilab/android/client/Entities/Card.java +++ b/app/src/main/java/app/fedilab/android/client/Entities/Card.java @@ -27,6 +27,17 @@ import android.os.Parcelable; public class Card implements Parcelable { + public static final Creator CREATOR = new Creator() { + @Override + public Card createFromParcel(Parcel in) { + return new Card(in); + } + + @Override + public Card[] newArray(int size) { + return new Card[size]; + } + }; private String url; private String title; private String description; @@ -44,18 +55,6 @@ public class Card implements Parcelable { public Card() { } - public static final Creator CREATOR = new Creator() { - @Override - public Card createFromParcel(Parcel in) { - return new Card(in); - } - - @Override - public Card[] newArray(int size) { - return new Card[size]; - } - }; - protected Card(Parcel in) { url = in.readString(); title = in.readString(); diff --git a/app/src/main/java/app/fedilab/android/client/Entities/Charts.java b/app/src/main/java/app/fedilab/android/client/Entities/Charts.java index 6ce3fe70f..d0f4eb3d9 100644 --- a/app/src/main/java/app/fedilab/android/client/Entities/Charts.java +++ b/app/src/main/java/app/fedilab/android/client/Entities/Charts.java @@ -1,6 +1,5 @@ package app.fedilab.android.client.Entities; -import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; diff --git a/app/src/main/java/app/fedilab/android/client/Entities/Emojis.java b/app/src/main/java/app/fedilab/android/client/Entities/Emojis.java index fe2c75528..f187de3b4 100644 --- a/app/src/main/java/app/fedilab/android/client/Entities/Emojis.java +++ b/app/src/main/java/app/fedilab/android/client/Entities/Emojis.java @@ -25,6 +25,17 @@ import android.os.Parcelable; public class Emojis implements Parcelable { + public static final Creator CREATOR = new Creator() { + @Override + public Emojis createFromParcel(Parcel source) { + return new Emojis(source); + } + + @Override + public Emojis[] newArray(int size) { + return new Emojis[size]; + } + }; private String shortcode; private String static_url; private String url; @@ -35,6 +46,13 @@ public class Emojis implements Parcelable { public Emojis() { } + protected Emojis(Parcel in) { + this.shortcode = in.readString(); + this.static_url = in.readString(); + this.url = in.readString(); + this.visible_in_picker = in.readByte() != 0; + } + public String getShortcode() { return shortcode; } @@ -80,25 +98,6 @@ public class Emojis implements Parcelable { dest.writeByte(this.visible_in_picker ? (byte) 1 : (byte) 0); } - protected Emojis(Parcel in) { - this.shortcode = in.readString(); - this.static_url = in.readString(); - this.url = in.readString(); - this.visible_in_picker = in.readByte() != 0; - } - - public static final Creator CREATOR = new Creator() { - @Override - public Emojis createFromParcel(Parcel source) { - return new Emojis(source); - } - - @Override - public Emojis[] newArray(int size) { - return new Emojis[size]; - } - }; - public Drawable getDrawable() { return drawable; } diff --git a/app/src/main/java/app/fedilab/android/client/Entities/List.java b/app/src/main/java/app/fedilab/android/client/Entities/List.java index 1cadc1ae2..4071d04d7 100644 --- a/app/src/main/java/app/fedilab/android/client/Entities/List.java +++ b/app/src/main/java/app/fedilab/android/client/Entities/List.java @@ -25,9 +25,28 @@ import android.os.Parcelable; public class List implements Parcelable { + public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { + @Override + public List createFromParcel(Parcel source) { + return new List(source); + } + + @Override + public List[] newArray(int size) { + return new List[size]; + } + }; private String id; private String title; + public List() { + } + + protected List(Parcel in) { + this.id = in.readString(); + this.title = in.readString(); + } + public String getId() { return id; } @@ -54,24 +73,4 @@ public class List implements Parcelable { dest.writeString(this.id); dest.writeString(this.title); } - - public List() { - } - - protected List(Parcel in) { - this.id = in.readString(); - this.title = in.readString(); - } - - public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { - @Override - public List createFromParcel(Parcel source) { - return new List(source); - } - - @Override - public List[] newArray(int size) { - return new List[size]; - } - }; } diff --git a/app/src/main/java/app/fedilab/android/client/Entities/ManageTimelines.java b/app/src/main/java/app/fedilab/android/client/Entities/ManageTimelines.java index 1aa94a41c..4ac13fdb7 100644 --- a/app/src/main/java/app/fedilab/android/client/Entities/ManageTimelines.java +++ b/app/src/main/java/app/fedilab/android/client/Entities/ManageTimelines.java @@ -15,22 +15,12 @@ package app.fedilab.android.client.Entities; * see . */ -import android.annotation.SuppressLint; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.SharedPreferences; import android.database.sqlite.SQLiteDatabase; -import android.graphics.PorterDuff; import android.os.Bundle; - -import com.google.android.material.tabs.TabLayout; - -import androidx.fragment.app.FragmentTransaction; -import androidx.core.content.ContextCompat; -import androidx.appcompat.app.AlertDialog; -import androidx.appcompat.widget.PopupMenu; - import android.text.Editable; import android.text.TextWatcher; import android.view.LayoutInflater; @@ -40,19 +30,22 @@ import android.view.View; import android.widget.EditText; import android.widget.ImageView; import android.widget.LinearLayout; -import android.widget.TableLayout; import android.widget.TextView; import android.widget.Toast; +import androidx.appcompat.app.AlertDialog; +import androidx.appcompat.widget.PopupMenu; +import androidx.core.content.ContextCompat; +import androidx.fragment.app.FragmentTransaction; + +import com.google.android.material.tabs.TabLayout; + import java.util.ArrayList; import java.util.Arrays; import java.util.Objects; import java.util.regex.Pattern; -import app.fedilab.android.sqlite.InstancesDAO; -import es.dmoral.toasty.Toasty; import app.fedilab.android.R; -import app.fedilab.android.activities.BaseMainActivity; import app.fedilab.android.activities.ListActivity; import app.fedilab.android.activities.MainActivity; import app.fedilab.android.asynctasks.RetrieveFeedsAsyncTask; @@ -60,23 +53,24 @@ import app.fedilab.android.asynctasks.UpdateAccountInfoAsyncTask; import app.fedilab.android.fragments.DisplayStatusFragment; import app.fedilab.android.fragments.TabLayoutNotificationsFragment; import app.fedilab.android.helper.Helper; +import app.fedilab.android.sqlite.InstancesDAO; import app.fedilab.android.sqlite.SearchDAO; import app.fedilab.android.sqlite.Sqlite; import app.fedilab.android.sqlite.TimelinesDAO; +import es.dmoral.toasty.Toasty; import static app.fedilab.android.activities.BaseMainActivity.mPageReferenceMap; -import static app.fedilab.android.helper.Helper.THEME_LIGHT; import static app.fedilab.android.sqlite.Sqlite.DB_NAME; public class ManageTimelines { + private static String userId; + private static String instance; private int position; private int id; private boolean displayed; private Type type; - private static String userId; - private static String instance; private RemoteInstance remoteInstance; private TagTimeline tagTimeline; private List listTimeline; @@ -85,89 +79,6 @@ public class ManageTimelines { private boolean notif_follow, notif_add, notif_mention, notif_share, notif_poll; - - public int getPosition() { - return position; - } - - public void setPosition(int position) { - this.position = position; - } - - public boolean isDisplayed() { - return displayed; - } - - public void setDisplayed(boolean displayed) { - this.displayed = displayed; - } - - public ManageTimelines.Type getType() { - return type; - } - - public void setType(ManageTimelines.Type type) { - this.type = type; - } - - - public int getId() { - return id; - } - - public void setId(int id) { - this.id = id; - } - - public String getUserId() { - return userId; - } - - - public String getInstance() { - return instance; - } - - - public RemoteInstance getRemoteInstance() { - return remoteInstance; - } - - public void setRemoteInstance(RemoteInstance remoteInstance) { - this.remoteInstance = remoteInstance; - } - - public TagTimeline getTagTimeline() { - return tagTimeline; - } - - public void setTagTimeline(TagTimeline tagTimeline) { - this.tagTimeline = tagTimeline; - } - - - public List getListTimeline() { - return listTimeline; - } - - public void setListTimeline(List listTimeline) { - this.listTimeline = listTimeline; - } - - public enum Type { - HOME, - DIRECT, - NOTIFICATION, - LOCAL, - PUBLIC, - ART, - PEERTUBE, - TAG, - LIST, - INSTANCE - } - - public static Type typeFromDb(String value) { switch (value) { case "HOME": @@ -220,7 +131,6 @@ public class ManageTimelines { return null; } - public static RetrieveFeedsAsyncTask.Type transform(Context context, Type type) { SharedPreferences sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, android.content.Context.MODE_PRIVATE); @@ -293,6 +203,69 @@ public class ManageTimelines { return null; } + public int getPosition() { + return position; + } + + public void setPosition(int position) { + this.position = position; + } + + public boolean isDisplayed() { + return displayed; + } + + public void setDisplayed(boolean displayed) { + this.displayed = displayed; + } + + public ManageTimelines.Type getType() { + return type; + } + + public void setType(ManageTimelines.Type type) { + this.type = type; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getUserId() { + return userId; + } + + public String getInstance() { + return instance; + } + + public RemoteInstance getRemoteInstance() { + return remoteInstance; + } + + public void setRemoteInstance(RemoteInstance remoteInstance) { + this.remoteInstance = remoteInstance; + } + + public TagTimeline getTagTimeline() { + return tagTimeline; + } + + public void setTagTimeline(TagTimeline tagTimeline) { + this.tagTimeline = tagTimeline; + } + + public List getListTimeline() { + return listTimeline; + } + + public void setListTimeline(List listTimeline) { + this.listTimeline = listTimeline; + } public TabLayout createTabs(Context context, TabLayout tabLayout, java.util.List manageTimelines) { @@ -417,7 +390,6 @@ public class ManageTimelines { return tabLayout; } - private void notificationClik(Context context, ManageTimelines tl, TabLayout tabLayout) { final LinearLayout tabStrip = (LinearLayout) tabLayout.getChildAt(0); if (MainActivity.social == UpdateAccountInfoAsyncTask.SOCIAL.MASTODON || MainActivity.social == UpdateAccountInfoAsyncTask.SOCIAL.PLEROMA) @@ -523,7 +495,6 @@ public class ManageTimelines { } - private void manageFilters(Context context, ManageTimelines tl, LinearLayout tabStrip, int position) { SharedPreferences sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE); //Only shown if the tab has focus @@ -740,7 +711,6 @@ public class ManageTimelines { } } - private void tagClick(Context context, ManageTimelines tl, LinearLayout tabStrip, int position) { @@ -961,7 +931,6 @@ public class ManageTimelines { } - private void instanceClick(Context context, ManageTimelines tl, LinearLayout tabStrip, int position) { @@ -1164,4 +1133,18 @@ public class ManageTimelines { } + + public enum Type { + HOME, + DIRECT, + NOTIFICATION, + LOCAL, + PUBLIC, + ART, + PEERTUBE, + TAG, + LIST, + INSTANCE + } + } diff --git a/app/src/main/java/app/fedilab/android/client/Entities/Mention.java b/app/src/main/java/app/fedilab/android/client/Entities/Mention.java index 04b67fa6a..b67b13b91 100644 --- a/app/src/main/java/app/fedilab/android/client/Entities/Mention.java +++ b/app/src/main/java/app/fedilab/android/client/Entities/Mention.java @@ -24,6 +24,17 @@ import android.os.Parcelable; public class Mention implements Parcelable { + public static final Creator CREATOR = new Creator() { + @Override + public Mention createFromParcel(Parcel in) { + return new Mention(in); + } + + @Override + public Mention[] newArray(int size) { + return new Mention[size]; + } + }; private String url; private String username; private String acct; @@ -39,18 +50,6 @@ public class Mention implements Parcelable { public Mention() { } - public static final Creator CREATOR = new Creator() { - @Override - public Mention createFromParcel(Parcel in) { - return new Mention(in); - } - - @Override - public Mention[] newArray(int size) { - return new Mention[size]; - } - }; - public String getUrl() { return url; } diff --git a/app/src/main/java/app/fedilab/android/client/Entities/Notification.java b/app/src/main/java/app/fedilab/android/client/Entities/Notification.java index 95a03df63..1461717d3 100644 --- a/app/src/main/java/app/fedilab/android/client/Entities/Notification.java +++ b/app/src/main/java/app/fedilab/android/client/Entities/Notification.java @@ -19,18 +19,15 @@ import android.app.Activity; import android.content.Context; import android.content.SharedPreferences; import android.graphics.Bitmap; -import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.os.Parcel; import android.os.Parcelable; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; - import android.text.Spannable; import android.text.SpannableString; import android.text.style.ImageSpan; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import com.bumptech.glide.Glide; import com.bumptech.glide.load.DataSource; @@ -60,6 +57,17 @@ import static app.fedilab.android.helper.Helper.drawableToBitmap; public class Notification implements Parcelable { + public static final Creator CREATOR = new Creator() { + @Override + public Notification createFromParcel(Parcel in) { + return new Notification(in); + } + + @Override + public Notification[] newArray(int size) { + return new Notification[size]; + } + }; private String id; private String type; private Date created_at; @@ -78,79 +86,6 @@ public class Notification implements Parcelable { public Notification() { } - ; - - public static final Creator CREATOR = new Creator() { - @Override - public Notification createFromParcel(Parcel in) { - return new Notification(in); - } - - @Override - public Notification[] newArray(int size) { - return new Notification[size]; - } - }; - - public String getId() { - return id; - } - - public void setId(String id) { - this.id = id; - } - - public String getType() { - return type; - } - - public void setType(String type) { - this.type = type; - } - - public Date getCreated_at() { - return created_at; - } - - public void setCreated_at(Date created_at) { - this.created_at = created_at; - } - - public Account getAccount() { - return account; - } - - public void setAccount(Account account) { - this.account = account; - } - - public Status getStatus() { - return status; - } - - public void setStatus(Status status) { - this.status = status; - } - - @Override - public int describeContents() { - return 0; - } - - @Override - public void writeToParcel(Parcel dest, int flags) { - dest.writeString(id); - dest.writeString(type); - dest.writeParcelable(account, flags); - dest.writeParcelable(status, flags); - } - - @Override - public boolean equals(Object otherNotifications) { - return otherNotifications != null && (otherNotifications == this || otherNotifications instanceof Notification && this.getId().equals(((Notification) otherNotifications).getId())); - } - - public static void makeEmojis(final Context context, final OnRetrieveEmojiInterface listener, Notification notification) { if (((Activity) context).isFinishing()) @@ -173,7 +108,6 @@ public class Notification implements Parcelable { break; case "poll": typeString = context.getString(R.string.notif_poll); - ; break; case "reblog": if (notification.getAccount().getDisplay_name() != null && notification.getAccount().getDisplay_name().length() > 0) @@ -345,6 +279,64 @@ public class Notification implements Parcelable { } } + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public Date getCreated_at() { + return created_at; + } + + public void setCreated_at(Date created_at) { + this.created_at = created_at; + } + + public Account getAccount() { + return account; + } + + public void setAccount(Account account) { + this.account = account; + } + + public Status getStatus() { + return status; + } + + public void setStatus(Status status) { + this.status = status; + } + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeString(id); + dest.writeString(type); + dest.writeParcelable(account, flags); + dest.writeParcelable(status, flags); + } + + @Override + public boolean equals(Object otherNotifications) { + return otherNotifications != null && (otherNotifications == this || otherNotifications instanceof Notification && this.getId().equals(((Notification) otherNotifications).getId())); + } + public boolean isNotificationAnimated() { return notificationAnimated; } diff --git a/app/src/main/java/app/fedilab/android/client/Entities/PeertubeInformation.java b/app/src/main/java/app/fedilab/android/client/Entities/PeertubeInformation.java index fa4e3fd49..8197e372d 100644 --- a/app/src/main/java/app/fedilab/android/client/Entities/PeertubeInformation.java +++ b/app/src/main/java/app/fedilab/android/client/Entities/PeertubeInformation.java @@ -21,14 +21,6 @@ import java.util.LinkedHashMap; public class PeertubeInformation { - private LinkedHashMap categories; - private LinkedHashMap languages; - private LinkedHashMap licences; - private LinkedHashMap privacies; - private LinkedHashMap playlistPrivacies; - private LinkedHashMap translations; - - public static final LinkedHashMap langueMapped; static { @@ -49,6 +41,12 @@ public class PeertubeInformation { langueMapped = aMap; } + private LinkedHashMap categories; + private LinkedHashMap languages; + private LinkedHashMap licences; + private LinkedHashMap privacies; + private LinkedHashMap playlistPrivacies; + private LinkedHashMap translations; public LinkedHashMap getTranslations() { return translations; diff --git a/app/src/main/java/app/fedilab/android/client/Entities/PeertubeNotification.java b/app/src/main/java/app/fedilab/android/client/Entities/PeertubeNotification.java index 2a18cde90..0b9573215 100644 --- a/app/src/main/java/app/fedilab/android/client/Entities/PeertubeNotification.java +++ b/app/src/main/java/app/fedilab/android/client/Entities/PeertubeNotification.java @@ -34,8 +34,6 @@ public class PeertubeNotification { public PeertubeNotification() { } - ; - public String getId() { return id; } diff --git a/app/src/main/java/app/fedilab/android/client/Entities/PixelFedStory.java b/app/src/main/java/app/fedilab/android/client/Entities/PixelFedStory.java index 640e61a22..fdebddf7a 100644 --- a/app/src/main/java/app/fedilab/android/client/Entities/PixelFedStory.java +++ b/app/src/main/java/app/fedilab/android/client/Entities/PixelFedStory.java @@ -18,7 +18,6 @@ package app.fedilab.android.client.Entities; import android.os.Parcel; import android.os.Parcelable; -import java.util.ArrayList; import java.util.Date; import java.util.List; @@ -28,6 +27,17 @@ import java.util.List; public class PixelFedStory implements Parcelable { + public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { + @Override + public PixelFedStory createFromParcel(Parcel source) { + return new PixelFedStory(source); + } + + @Override + public PixelFedStory[] newArray(int size) { + return new PixelFedStory[size]; + } + }; private String id; private String photo; private String name; @@ -36,6 +46,20 @@ public class PixelFedStory implements Parcelable { private boolean seen; private List pixelFedStoryItems; + public PixelFedStory() { + } + + protected PixelFedStory(Parcel in) { + this.id = in.readString(); + this.photo = in.readString(); + this.name = in.readString(); + this.link = in.readString(); + long tmpLastUpdated = in.readLong(); + this.lastUpdated = tmpLastUpdated == -1 ? null : new Date(tmpLastUpdated); + this.seen = in.readByte() != 0; + this.pixelFedStoryItems = in.createTypedArrayList(PixelFedStoryItem.CREATOR); + } + public String getId() { return id; } @@ -92,7 +116,6 @@ public class PixelFedStory implements Parcelable { this.pixelFedStoryItems = pixelFedStoryItems; } - @Override public int describeContents() { return 0; @@ -108,30 +131,4 @@ public class PixelFedStory implements Parcelable { dest.writeByte(this.seen ? (byte) 1 : (byte) 0); dest.writeTypedList(this.pixelFedStoryItems); } - - public PixelFedStory() { - } - - protected PixelFedStory(Parcel in) { - this.id = in.readString(); - this.photo = in.readString(); - this.name = in.readString(); - this.link = in.readString(); - long tmpLastUpdated = in.readLong(); - this.lastUpdated = tmpLastUpdated == -1 ? null : new Date(tmpLastUpdated); - this.seen = in.readByte() != 0; - this.pixelFedStoryItems = in.createTypedArrayList(PixelFedStoryItem.CREATOR); - } - - public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { - @Override - public PixelFedStory createFromParcel(Parcel source) { - return new PixelFedStory(source); - } - - @Override - public PixelFedStory[] newArray(int size) { - return new PixelFedStory[size]; - } - }; } diff --git a/app/src/main/java/app/fedilab/android/client/Entities/PixelFedStoryItem.java b/app/src/main/java/app/fedilab/android/client/Entities/PixelFedStoryItem.java index 94eaa5a10..f6394fb5a 100644 --- a/app/src/main/java/app/fedilab/android/client/Entities/PixelFedStoryItem.java +++ b/app/src/main/java/app/fedilab/android/client/Entities/PixelFedStoryItem.java @@ -25,6 +25,17 @@ import java.util.Date; public class PixelFedStoryItem implements Parcelable { + public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { + @Override + public PixelFedStoryItem createFromParcel(Parcel source) { + return new PixelFedStoryItem(source); + } + + @Override + public PixelFedStoryItem[] newArray(int size) { + return new PixelFedStoryItem[size]; + } + }; private String id; private String type; private int length; @@ -36,8 +47,23 @@ public class PixelFedStoryItem implements Parcelable { private Date expires_at; private boolean seen; + public PixelFedStoryItem() { + } - + protected PixelFedStoryItem(Parcel in) { + this.id = in.readString(); + this.type = in.readString(); + this.length = in.readInt(); + this.src = in.readString(); + this.preview = in.readString(); + this.link = in.readString(); + this.linkText = in.readString(); + long tmpTime = in.readLong(); + this.time = tmpTime == -1 ? null : new Date(tmpTime); + long tmpExpires_at = in.readLong(); + this.expires_at = tmpExpires_at == -1 ? null : new Date(tmpExpires_at); + this.seen = in.readByte() != 0; + } public String getId() { return id; @@ -137,34 +163,4 @@ public class PixelFedStoryItem implements Parcelable { dest.writeLong(this.expires_at != null ? this.expires_at.getTime() : -1); dest.writeByte(this.seen ? (byte) 1 : (byte) 0); } - - public PixelFedStoryItem() { - } - - protected PixelFedStoryItem(Parcel in) { - this.id = in.readString(); - this.type = in.readString(); - this.length = in.readInt(); - this.src = in.readString(); - this.preview = in.readString(); - this.link = in.readString(); - this.linkText = in.readString(); - long tmpTime = in.readLong(); - this.time = tmpTime == -1 ? null : new Date(tmpTime); - long tmpExpires_at = in.readLong(); - this.expires_at = tmpExpires_at == -1 ? null : new Date(tmpExpires_at); - this.seen = in.readByte() != 0; - } - - public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { - @Override - public PixelFedStoryItem createFromParcel(Parcel source) { - return new PixelFedStoryItem(source); - } - - @Override - public PixelFedStoryItem[] newArray(int size) { - return new PixelFedStoryItem[size]; - } - }; } diff --git a/app/src/main/java/app/fedilab/android/client/Entities/Playlist.java b/app/src/main/java/app/fedilab/android/client/Entities/Playlist.java index 362409afe..71ab30de4 100644 --- a/app/src/main/java/app/fedilab/android/client/Entities/Playlist.java +++ b/app/src/main/java/app/fedilab/android/client/Entities/Playlist.java @@ -28,6 +28,17 @@ import java.util.HashMap; public class Playlist implements Parcelable { + public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { + @Override + public Playlist createFromParcel(Parcel source) { + return new Playlist(source); + } + + @Override + public Playlist[] newArray(int size) { + return new Playlist[size]; + } + }; private String id; private String uuid; private String displayName; @@ -42,6 +53,26 @@ public class Playlist implements Parcelable { private Date updatedAt; private int videosLength; + public Playlist() { + } + + protected Playlist(Parcel in) { + this.id = in.readString(); + this.uuid = in.readString(); + this.displayName = in.readString(); + this.description = in.readString(); + this.videoChannelId = in.readString(); + long tmpCreatedAt = in.readLong(); + this.createdAt = tmpCreatedAt == -1 ? null : new Date(tmpCreatedAt); + this.isLocal = in.readByte() != 0; + this.ownerAccount = in.readParcelable(Account.class.getClassLoader()); + this.privacy = (HashMap) in.readSerializable(); + this.thumbnailPath = in.readString(); + this.type = (HashMap) in.readSerializable(); + long tmpUpdatedAt = in.readLong(); + this.updatedAt = tmpUpdatedAt == -1 ? null : new Date(tmpUpdatedAt); + this.videosLength = in.readInt(); + } public String getId() { return id; @@ -168,37 +199,4 @@ public class Playlist implements Parcelable { dest.writeLong(this.updatedAt != null ? this.updatedAt.getTime() : -1); dest.writeInt(this.videosLength); } - - public Playlist() { - } - - protected Playlist(Parcel in) { - this.id = in.readString(); - this.uuid = in.readString(); - this.displayName = in.readString(); - this.description = in.readString(); - this.videoChannelId = in.readString(); - long tmpCreatedAt = in.readLong(); - this.createdAt = tmpCreatedAt == -1 ? null : new Date(tmpCreatedAt); - this.isLocal = in.readByte() != 0; - this.ownerAccount = in.readParcelable(Account.class.getClassLoader()); - this.privacy = (HashMap) in.readSerializable(); - this.thumbnailPath = in.readString(); - this.type = (HashMap) in.readSerializable(); - long tmpUpdatedAt = in.readLong(); - this.updatedAt = tmpUpdatedAt == -1 ? null : new Date(tmpUpdatedAt); - this.videosLength = in.readInt(); - } - - public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { - @Override - public Playlist createFromParcel(Parcel source) { - return new Playlist(source); - } - - @Override - public Playlist[] newArray(int size) { - return new Playlist[size]; - } - }; } diff --git a/app/src/main/java/app/fedilab/android/client/Entities/PleromaAdmin.java b/app/src/main/java/app/fedilab/android/client/Entities/PleromaAdmin.java index e4f124782..2d4c8491f 100644 --- a/app/src/main/java/app/fedilab/android/client/Entities/PleromaAdmin.java +++ b/app/src/main/java/app/fedilab/android/client/Entities/PleromaAdmin.java @@ -25,14 +25,32 @@ import android.os.Parcelable; public class PleromaAdmin implements Parcelable { + public static final Creator CREATOR = new Creator() { + @Override + public PleromaAdmin createFromParcel(Parcel source) { + return new PleromaAdmin(source); + } + + @Override + public PleromaAdmin[] newArray(int size) { + return new PleromaAdmin[size]; + } + }; private String nickname; private String email; private String password; private String tags; + public PleromaAdmin() { } + protected PleromaAdmin(Parcel in) { + this.nickname = in.readString(); + this.email = in.readString(); + this.password = in.readString(); + this.tags = in.readString(); + } public String getNickname() { return nickname; @@ -78,23 +96,4 @@ public class PleromaAdmin implements Parcelable { dest.writeString(this.password); dest.writeString(this.tags); } - - protected PleromaAdmin(Parcel in) { - this.nickname = in.readString(); - this.email = in.readString(); - this.password = in.readString(); - this.tags = in.readString(); - } - - public static final Creator CREATOR = new Creator() { - @Override - public PleromaAdmin createFromParcel(Parcel source) { - return new PleromaAdmin(source); - } - - @Override - public PleromaAdmin[] newArray(int size) { - return new PleromaAdmin[size]; - } - }; } diff --git a/app/src/main/java/app/fedilab/android/client/Entities/Poll.java b/app/src/main/java/app/fedilab/android/client/Entities/Poll.java index c91195c79..52e9554f3 100644 --- a/app/src/main/java/app/fedilab/android/client/Entities/Poll.java +++ b/app/src/main/java/app/fedilab/android/client/Entities/Poll.java @@ -23,6 +23,17 @@ import java.util.List; public class Poll implements Parcelable { + public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { + @Override + public Poll createFromParcel(Parcel source) { + return new Poll(source); + } + + @Override + public Poll[] newArray(int size) { + return new Poll[size]; + } + }; private String id; private Date expires_at; private int expires_in; @@ -35,6 +46,18 @@ public class Poll implements Parcelable { public Poll() { } + protected Poll(Parcel in) { + this.id = in.readString(); + long tmpExpires_at = in.readLong(); + this.expires_at = tmpExpires_at == -1 ? null : new Date(tmpExpires_at); + this.expires_in = in.readInt(); + this.expired = in.readByte() != 0; + this.multiple = in.readByte() != 0; + this.votes_count = in.readInt(); + this.voted = in.readByte() != 0; + this.optionsList = in.createTypedArrayList(PollOptions.CREATOR); + } + public String getId() { return id; } @@ -99,7 +122,6 @@ public class Poll implements Parcelable { this.expires_in = expires_in; } - @Override public int describeContents() { return 0; @@ -116,28 +138,4 @@ public class Poll implements Parcelable { dest.writeByte(this.voted ? (byte) 1 : (byte) 0); dest.writeTypedList(this.optionsList); } - - protected Poll(Parcel in) { - this.id = in.readString(); - long tmpExpires_at = in.readLong(); - this.expires_at = tmpExpires_at == -1 ? null : new Date(tmpExpires_at); - this.expires_in = in.readInt(); - this.expired = in.readByte() != 0; - this.multiple = in.readByte() != 0; - this.votes_count = in.readInt(); - this.voted = in.readByte() != 0; - this.optionsList = in.createTypedArrayList(PollOptions.CREATOR); - } - - public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { - @Override - public Poll createFromParcel(Parcel source) { - return new Poll(source); - } - - @Override - public Poll[] newArray(int size) { - return new Poll[size]; - } - }; } diff --git a/app/src/main/java/app/fedilab/android/client/Entities/PollOptions.java b/app/src/main/java/app/fedilab/android/client/Entities/PollOptions.java index d7ce151e8..0df16b415 100644 --- a/app/src/main/java/app/fedilab/android/client/Entities/PollOptions.java +++ b/app/src/main/java/app/fedilab/android/client/Entities/PollOptions.java @@ -21,6 +21,29 @@ import android.text.TextUtils; public class PollOptions implements Parcelable { + public static final Creator CREATOR = new Creator() { + @Override + public PollOptions createFromParcel(Parcel source) { + return new PollOptions(source); + } + + @Override + public PollOptions[] newArray(int size) { + return new PollOptions[size]; + } + }; + private String title; + private SpannableString titleSpan; + private int votes_count; + + public PollOptions() { + } + protected PollOptions(Parcel in) { + this.title = in.readString(); + this.votes_count = in.readInt(); + this.titleSpan = (SpannableString) TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(in); + } + public String getTitle() { return title; } @@ -37,11 +60,6 @@ public class PollOptions implements Parcelable { this.votes_count = votes_count; } - private String title; - private SpannableString titleSpan; - private int votes_count; - - @Override public int describeContents() { return 0; @@ -54,27 +72,6 @@ public class PollOptions implements Parcelable { TextUtils.writeToParcel(this.titleSpan, dest, flags); } - public PollOptions() { - } - - protected PollOptions(Parcel in) { - this.title = in.readString(); - this.votes_count = in.readInt(); - this.titleSpan = (SpannableString) TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(in); - } - - public static final Creator CREATOR = new Creator() { - @Override - public PollOptions createFromParcel(Parcel source) { - return new PollOptions(source); - } - - @Override - public PollOptions[] newArray(int size) { - return new PollOptions[size]; - } - }; - public SpannableString getTitleSpan() { return titleSpan; } diff --git a/app/src/main/java/app/fedilab/android/client/Entities/RemoteInstance.java b/app/src/main/java/app/fedilab/android/client/Entities/RemoteInstance.java index 201197fd5..94f0a6cc6 100644 --- a/app/src/main/java/app/fedilab/android/client/Entities/RemoteInstance.java +++ b/app/src/main/java/app/fedilab/android/client/Entities/RemoteInstance.java @@ -27,6 +27,17 @@ import java.util.List; public class RemoteInstance implements Parcelable { + public static final Creator CREATOR = new Creator() { + @Override + public RemoteInstance createFromParcel(Parcel source) { + return new RemoteInstance(source); + } + + @Override + public RemoteInstance[] newArray(int size) { + return new RemoteInstance[size]; + } + }; private String host; private String type; private String id; @@ -34,9 +45,18 @@ public class RemoteInstance implements Parcelable { private List tags; private String filteredWith; + public RemoteInstance() { } + protected RemoteInstance(Parcel in) { + this.host = in.readString(); + this.type = in.readString(); + this.id = in.readString(); + this.dbID = in.readString(); + this.tags = in.createStringArrayList(); + this.filteredWith = in.readString(); + } public String getHost() { return host; @@ -100,25 +120,4 @@ public class RemoteInstance implements Parcelable { dest.writeStringList(this.tags); dest.writeString(this.filteredWith); } - - protected RemoteInstance(Parcel in) { - this.host = in.readString(); - this.type = in.readString(); - this.id = in.readString(); - this.dbID = in.readString(); - this.tags = in.createStringArrayList(); - this.filteredWith = in.readString(); - } - - public static final Creator CREATOR = new Creator() { - @Override - public RemoteInstance createFromParcel(Parcel source) { - return new RemoteInstance(source); - } - - @Override - public RemoteInstance[] newArray(int size) { - return new RemoteInstance[size]; - } - }; } diff --git a/app/src/main/java/app/fedilab/android/client/Entities/Report.java b/app/src/main/java/app/fedilab/android/client/Entities/Report.java index 3fd8025d4..6288fc398 100644 --- a/app/src/main/java/app/fedilab/android/client/Entities/Report.java +++ b/app/src/main/java/app/fedilab/android/client/Entities/Report.java @@ -23,6 +23,17 @@ import java.util.List; public class Report implements Parcelable { + public static final Creator CREATOR = new Creator() { + @Override + public Report createFromParcel(Parcel source) { + return new Report(source); + } + + @Override + public Report[] newArray(int size) { + return new Report[size]; + } + }; private String id; private boolean action_taken; private String comment; @@ -34,6 +45,24 @@ public class Report implements Parcelable { private AccountAdmin action_taken_by_account; private List statuses; + public Report() { + } + + + protected Report(Parcel in) { + this.id = in.readString(); + this.action_taken = in.readByte() != 0; + this.comment = in.readString(); + long tmpCreated_at = in.readLong(); + this.created_at = tmpCreated_at == -1 ? null : new Date(tmpCreated_at); + long tmpUpdated_at = in.readLong(); + this.updated_at = tmpUpdated_at == -1 ? null : new Date(tmpUpdated_at); + this.account = in.readParcelable(AccountAdmin.class.getClassLoader()); + this.target_account = in.readParcelable(AccountAdmin.class.getClassLoader()); + this.assigned_account = in.readParcelable(AccountAdmin.class.getClassLoader()); + this.action_taken_by_account = in.readParcelable(AccountAdmin.class.getClassLoader()); + this.statuses = in.createTypedArrayList(Status.CREATOR); + } public String getId() { return id; @@ -43,7 +72,6 @@ public class Report implements Parcelable { this.id = id; } - public String getComment() { return comment; } @@ -76,10 +104,6 @@ public class Report implements Parcelable { this.statuses = statuses; } - - public Report() { - } - public AccountAdmin getAccount() { return account; } @@ -138,31 +162,4 @@ public class Report implements Parcelable { dest.writeParcelable(this.action_taken_by_account, flags); dest.writeTypedList(this.statuses); } - - protected Report(Parcel in) { - this.id = in.readString(); - this.action_taken = in.readByte() != 0; - this.comment = in.readString(); - long tmpCreated_at = in.readLong(); - this.created_at = tmpCreated_at == -1 ? null : new Date(tmpCreated_at); - long tmpUpdated_at = in.readLong(); - this.updated_at = tmpUpdated_at == -1 ? null : new Date(tmpUpdated_at); - this.account = in.readParcelable(AccountAdmin.class.getClassLoader()); - this.target_account = in.readParcelable(AccountAdmin.class.getClassLoader()); - this.assigned_account = in.readParcelable(AccountAdmin.class.getClassLoader()); - this.action_taken_by_account = in.readParcelable(AccountAdmin.class.getClassLoader()); - this.statuses = in.createTypedArrayList(Status.CREATOR); - } - - public static final Creator CREATOR = new Creator() { - @Override - public Report createFromParcel(Parcel source) { - return new Report(source); - } - - @Override - public Report[] newArray(int size) { - return new Report[size]; - } - }; } diff --git a/app/src/main/java/app/fedilab/android/client/Entities/Schedule.java b/app/src/main/java/app/fedilab/android/client/Entities/Schedule.java index 56d1fd885..dec7343d1 100644 --- a/app/src/main/java/app/fedilab/android/client/Entities/Schedule.java +++ b/app/src/main/java/app/fedilab/android/client/Entities/Schedule.java @@ -28,14 +28,33 @@ import java.util.List; public class Schedule implements Parcelable { + public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { + @Override + public Schedule createFromParcel(Parcel source) { + return new Schedule(source); + } + + @Override + public Schedule[] newArray(int size) { + return new Schedule[size]; + } + }; private String id; private Date scheduled_at; private Status status; private List attachmentList; + public Schedule() { } + protected Schedule(Parcel in) { + this.id = in.readString(); + long tmpScheduled_at = in.readLong(); + this.scheduled_at = tmpScheduled_at == -1 ? null : new Date(tmpScheduled_at); + this.status = in.readParcelable(Status.class.getClassLoader()); + this.attachmentList = in.createTypedArrayList(Attachment.CREATOR); + } public String getId() { return id; @@ -81,24 +100,4 @@ public class Schedule implements Parcelable { dest.writeParcelable(this.status, flags); dest.writeTypedList(this.attachmentList); } - - protected Schedule(Parcel in) { - this.id = in.readString(); - long tmpScheduled_at = in.readLong(); - this.scheduled_at = tmpScheduled_at == -1 ? null : new Date(tmpScheduled_at); - this.status = in.readParcelable(Status.class.getClassLoader()); - this.attachmentList = in.createTypedArrayList(Attachment.CREATOR); - } - - public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { - @Override - public Schedule createFromParcel(Parcel source) { - return new Schedule(source); - } - - @Override - public Schedule[] newArray(int size) { - return new Schedule[size]; - } - }; } diff --git a/app/src/main/java/app/fedilab/android/client/Entities/Statistics.java b/app/src/main/java/app/fedilab/android/client/Entities/Statistics.java index ed9ef6c46..1453d6b03 100644 --- a/app/src/main/java/app/fedilab/android/client/Entities/Statistics.java +++ b/app/src/main/java/app/fedilab/android/client/Entities/Statistics.java @@ -35,6 +35,7 @@ public class Statistics { private Date lastTootDate; private float frequency; private Map tagsTrend = new HashMap<>(); + private int v_direct; public Date getFirstTootDate() { return firstTootDate; @@ -148,8 +149,6 @@ public class Statistics { this.v_direct = v_direct; } - private int v_direct; - public Map getTagsTrend() { return tagsTrend; } diff --git a/app/src/main/java/app/fedilab/android/client/Entities/Status.java b/app/src/main/java/app/fedilab/android/client/Entities/Status.java index 8e852eb2d..8ea2e7c81 100644 --- a/app/src/main/java/app/fedilab/android/client/Entities/Status.java +++ b/app/src/main/java/app/fedilab/android/client/Entities/Status.java @@ -26,12 +26,6 @@ import android.os.Build; import android.os.Bundle; import android.os.Parcel; import android.os.Parcelable; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.core.content.ContextCompat; -import androidx.preference.PreferenceManager; - import android.text.Html; import android.text.Spannable; import android.text.SpannableString; @@ -46,6 +40,11 @@ import android.text.style.URLSpan; import android.util.Patterns; import android.view.View; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.core.content.ContextCompat; +import androidx.preference.PreferenceManager; + import com.bumptech.glide.Glide; import com.bumptech.glide.load.DataSource; import com.bumptech.glide.load.engine.GlideException; @@ -58,7 +57,6 @@ import com.github.penfeizhou.animation.apng.decode.APNGParser; import com.github.penfeizhou.animation.gif.GifDrawable; import com.github.penfeizhou.animation.gif.decode.GifParser; - import java.io.File; import java.net.URI; import java.net.URISyntaxException; @@ -87,14 +85,10 @@ import app.fedilab.android.interfaces.OnRetrieveEmojiInterface; import app.fedilab.android.interfaces.OnRetrieveImageInterface; import static android.content.Context.MODE_PRIVATE; -import static app.fedilab.android.drawers.StatusListAdapter.HIDDEN_STATUS; import static app.fedilab.android.drawers.StatusListAdapter.COMPACT_STATUS; import static app.fedilab.android.drawers.StatusListAdapter.CONSOLE_STATUS; import static app.fedilab.android.drawers.StatusListAdapter.DISPLAYED_STATUS; -import static app.fedilab.android.drawers.StatusListAdapter.FOCUSED_STATUS; import static app.fedilab.android.helper.Helper.THEME_BLACK; -import static app.fedilab.android.helper.Helper.THEME_DARK; -import static app.fedilab.android.helper.Helper.THEME_LIGHT; import static app.fedilab.android.helper.Helper.drawableToBitmap; /** @@ -104,6 +98,17 @@ import static app.fedilab.android.helper.Helper.drawableToBitmap; public class Status implements Parcelable { + public static final Creator CREATOR = new Creator() { + @Override + public Status createFromParcel(Parcel source) { + return new Status(source); + } + + @Override + public Status[] newArray(int size) { + return new Status[size]; + } + }; private String id; private String uri; private String url; @@ -154,10 +159,6 @@ public class Status implements Parcelable { private String quickReplyPrivacy; private boolean showBottomLine = false; private boolean showTopLine = false; - - public Status() { - } - private List conversationProfilePicture; private String webviewURL = null; @@ -181,76 +182,7 @@ public class Status implements Parcelable { private boolean commentsFetched = false; private List comments = new ArrayList<>(); - @Override - public void writeToParcel(Parcel dest, int flags) { - dest.writeString(this.id); - dest.writeString(this.uri); - dest.writeString(this.url); - dest.writeParcelable(this.account, flags); - dest.writeString(this.in_reply_to_id); - dest.writeString(this.in_reply_to_account_id); - dest.writeParcelable(this.reblog, flags); - dest.writeLong(this.created_at != null ? this.created_at.getTime() : -1); - dest.writeInt(this.reblogs_count); - dest.writeInt(this.favourites_count); - dest.writeInt(this.replies_count); - dest.writeByte(this.reblogged ? (byte) 1 : (byte) 0); - dest.writeByte(this.favourited ? (byte) 1 : (byte) 0); - dest.writeByte(this.muted ? (byte) 1 : (byte) 0); - dest.writeByte(this.pinned ? (byte) 1 : (byte) 0); - dest.writeByte(this.sensitive ? (byte) 1 : (byte) 0); - dest.writeByte(this.bookmarked ? (byte) 1 : (byte) 0); - dest.writeString(this.visibility); - dest.writeByte(this.attachmentShown ? (byte) 1 : (byte) 0); - dest.writeByte(this.spoilerShown ? (byte) 1 : (byte) 0); - dest.writeTypedList(this.media_attachments); - dest.writeParcelable(this.art_attachment, flags); - dest.writeTypedList(this.mentions); - dest.writeTypedList(this.emojis); - dest.writeTypedList(this.tags); - dest.writeParcelable(this.application, flags); - dest.writeParcelable(this.card, flags); - dest.writeString(this.language); - dest.writeByte(this.isTranslated ? (byte) 1 : (byte) 0); - dest.writeByte(this.isTranslationShown ? (byte) 1 : (byte) 0); - dest.writeByte(this.isNew ? (byte) 1 : (byte) 0); - dest.writeByte(this.isVisible ? (byte) 1 : (byte) 0); - dest.writeByte(this.fetchMore ? (byte) 1 : (byte) 0); - dest.writeString(this.content); - dest.writeString(this.contentCW); - dest.writeString(this.contentTranslated); - TextUtils.writeToParcel(this.contentSpan, dest, flags); - TextUtils.writeToParcel(this.displayNameSpan, dest, flags); - TextUtils.writeToParcel(this.contentSpanCW, dest, flags); - TextUtils.writeToParcel(this.contentSpanTranslated, dest, flags); - dest.writeInt(this.type == null ? -1 : this.type.ordinal()); - dest.writeInt(this.itemViewType); - dest.writeString(this.conversationId); - dest.writeByte(this.isExpanded ? (byte) 1 : (byte) 0); - dest.writeInt(this.numberLines); - dest.writeStringList(this.conversationProfilePicture); - dest.writeString(this.webviewURL); - dest.writeByte(this.isBoostAnimated ? (byte) 1 : (byte) 0); - dest.writeByte(this.isFavAnimated ? (byte) 1 : (byte) 0); - dest.writeString(this.scheduled_at); - dest.writeString(this.contentType); - dest.writeByte(this.showSpoiler ? (byte) 1 : (byte) 0); - dest.writeByte(this.isNotice ? (byte) 1 : (byte) 0); - dest.writeParcelable(this.poll, flags); - dest.writeInt(this.media_height); - dest.writeByte(this.cached ? (byte) 1 : (byte) 0); - dest.writeByte(this.autoHiddenCW ? (byte) 1 : (byte) 0); - dest.writeByte(this.customFeaturesDisplayed ? (byte) 1 : (byte) 0); - dest.writeByte(this.shortReply ? (byte) 1 : (byte) 0); - dest.writeInt(this.warningFetched); - dest.writeStringList(this.imageURL); - dest.writeInt(this.viewType); - dest.writeByte(this.isFocused ? (byte) 1 : (byte) 0); - dest.writeString(this.quickReplyContent); - dest.writeString(this.quickReplyPrivacy); - dest.writeByte(this.showBottomLine ? (byte) 1 : (byte) 0); - dest.writeByte(this.showTopLine ? (byte) 1 : (byte) 0); - + public Status() { } protected Status(Parcel in) { @@ -325,311 +257,6 @@ public class Status implements Parcelable { this.showTopLine = in.readByte() != 0; } - public static final Creator CREATOR = new Creator() { - @Override - public Status createFromParcel(Parcel source) { - return new Status(source); - } - - @Override - public Status[] newArray(int size) { - return new Status[size]; - } - }; - - - public String getId() { - return id; - } - - public void setId(String id) { - this.id = id; - } - - public String getUri() { - return uri; - } - - public void setUri(String uri) { - this.uri = uri; - } - - public String getUrl() { - return url; - } - - public void setUrl(String url) { - this.url = url; - } - - public Account getAccount() { - return account; - } - - public void setAccount(Account account) { - this.account = account; - } - - public String getIn_reply_to_id() { - return in_reply_to_id; - } - - public void setIn_reply_to_id(String in_reply_to_id) { - this.in_reply_to_id = in_reply_to_id; - } - - public String getIn_reply_to_account_id() { - return in_reply_to_account_id; - } - - public void setIn_reply_to_account_id(String in_reply_to_account_id) { - this.in_reply_to_account_id = in_reply_to_account_id; - } - - public String getContent() { - return content; - } - - public void setContent(String content) { - //Remove UTM by default - this.content = Helper.remove_tracking_param(content); - } - - public boolean isShortReply() { - return shortReply; - } - - public void setShortReply(boolean shortReply) { - this.shortReply = shortReply; - } - - public Status getReblog() { - return reblog; - } - - public void setReblog(Status reblog) { - this.reblog = reblog; - } - - public int getReblogs_count() { - return reblogs_count; - } - - public void setReblogs_count(int reblogs_count) { - this.reblogs_count = reblogs_count; - } - - public Date getCreated_at() { - return created_at; - } - - public void setCreated_at(Date created_at) { - this.created_at = created_at; - } - - public int getFavourites_count() { - return favourites_count; - } - - public void setFavourites_count(int favourites_count) { - this.favourites_count = favourites_count; - } - - public SpannableString getDisplayNameSpan() { - return this.displayNameSpan; - } - - public void setDisplayNameSpan(SpannableString displayNameSpan) { - this.displayNameSpan = displayNameSpan; - } - - public boolean isReblogged() { - return reblogged; - } - - public void setReblogged(boolean reblogged) { - this.reblogged = reblogged; - } - - public boolean isFavourited() { - return favourited; - } - - public void setFavourited(boolean favourited) { - this.favourited = favourited; - } - - public void setPinned(boolean pinned) { - this.pinned = pinned; - } - - public boolean isPinned() { - return pinned; - } - - public boolean isSensitive() { - return sensitive; - } - - public void setSensitive(boolean sensitive) { - this.sensitive = sensitive; - } - - public String getSpoiler_text() { - return contentCW; - } - - public void setSpoiler_text(String spoiler_text) { - this.contentCW = spoiler_text; - } - - - public ArrayList getMedia_attachments() { - return media_attachments; - } - - public void setMedia_attachments(ArrayList media_attachments) { - this.media_attachments = media_attachments; - } - - public List getMentions() { - return mentions; - } - - public void setMentions(List mentions) { - this.mentions = mentions; - } - - public List getTags() { - return tags; - } - - public String getTagsString() { - //iterate through tags and create comma delimited string of tag names - String tag_names = ""; - for (Tag t : tags) { - if (tag_names.equals("")) { - tag_names = t.getName(); - } else { - tag_names = tag_names + ", " + t.getName(); - } - } - return tag_names; - } - - public void setTags(List tags) { - this.tags = tags; - } - - public Application getApplication() { - return application; - } - - public void setApplication(Application application) { - this.application = application; - } - - - public String getVisibility() { - return visibility; - } - - public void setVisibility(String visibility) { - this.visibility = visibility; - } - - public boolean isAttachmentShown() { - return attachmentShown; - } - - public void setAttachmentShown(boolean attachmentShown) { - this.attachmentShown = attachmentShown; - } - - - public boolean isSpoilerShown() { - return spoilerShown; - } - - public void setSpoilerShown(boolean spoilerShown) { - this.spoilerShown = spoilerShown; - } - - public String getLanguage() { - return language; - } - - public void setLanguage(String language) { - this.language = language; - } - - public boolean isTranslated() { - return isTranslated; - } - - public void setTranslated(boolean translated) { - isTranslated = translated; - } - - public boolean isTranslationShown() { - return isTranslationShown; - } - - public void setTranslationShown(boolean translationShown) { - isTranslationShown = translationShown; - } - - public String getContentTranslated() { - return contentTranslated; - } - - public void setContentTranslated(String content_translated) { - this.contentTranslated = content_translated; - } - - public boolean isNew() { - return isNew; - } - - public void setNew(boolean aNew) { - isNew = aNew; - } - - public boolean isVisible() { - return isVisible; - } - - public void setVisible(boolean visible) { - isVisible = visible; - } - - public List getEmojis() { - return emojis; - } - - public void setEmojis(List emojis) { - this.emojis = emojis; - } - - - public boolean isEmojiFound() { - return isEmojiFound; - } - - public boolean isImageFound() { - return isImageFound; - } - - - public void setEmojiFound(boolean emojiFound) { - isEmojiFound = emojiFound; - } - - public void setImageFound(boolean imageFound) { - isImageFound = imageFound; - } - - public static void transform(Context context, Status status) { if (((Activity) context).isFinishing() || status == null) @@ -648,12 +275,12 @@ public class Status implements Parcelable { while (matcher.find()) { final String youtubeId = matcher.group(3); String invidiousHost = sharedpreferences.getString(Helper.SET_INVIDIOUS_HOST, Helper.DEFAULT_INVIDIOUS_HOST).toLowerCase(); - if( matcher.group(2) != null && matcher.group(2).equals("youtu.be")){ - content = content.replaceAll("https://"+Pattern.quote(matcher.group()), Matcher.quoteReplacement("https://"+invidiousHost + "/watch?v="+youtubeId+"&local=true")); - content = content.replaceAll(">"+Pattern.quote(matcher.group()), Matcher.quoteReplacement(">"+invidiousHost + "/watch?v=" + youtubeId+"&local=true")); - }else{ - content = content.replaceAll("https://"+Pattern.quote(matcher.group()), Matcher.quoteReplacement("https://"+invidiousHost + "/"+youtubeId+"&local=true")); - content = content.replaceAll(">"+Pattern.quote(matcher.group()), Matcher.quoteReplacement(">"+invidiousHost + "/" + youtubeId+"&local=true")); + if (matcher.group(2) != null && matcher.group(2).equals("youtu.be")) { + content = content.replaceAll("https://" + Pattern.quote(matcher.group()), Matcher.quoteReplacement("https://" + invidiousHost + "/watch?v=" + youtubeId + "&local=true")); + content = content.replaceAll(">" + Pattern.quote(matcher.group()), Matcher.quoteReplacement(">" + invidiousHost + "/watch?v=" + youtubeId + "&local=true")); + } else { + content = content.replaceAll("https://" + Pattern.quote(matcher.group()), Matcher.quoteReplacement("https://" + invidiousHost + "/" + youtubeId + "&local=true")); + content = content.replaceAll(">" + Pattern.quote(matcher.group()), Matcher.quoteReplacement(">" + invidiousHost + "/" + youtubeId + "&local=true")); } @@ -666,8 +293,8 @@ public class Status implements Parcelable { while (matcher.find()) { final String nitter_directory = matcher.group(2); String nitterHost = sharedpreferences.getString(Helper.SET_NITTER_HOST, Helper.DEFAULT_NITTER_HOST).toLowerCase(); - content = content.replaceAll("https://"+Pattern.quote(matcher.group()), Matcher.quoteReplacement("https://"+nitterHost + nitter_directory)); - content = content.replaceAll(">"+Pattern.quote(matcher.group()), Matcher.quoteReplacement(">"+nitterHost + nitter_directory)); + content = content.replaceAll("https://" + Pattern.quote(matcher.group()), Matcher.quoteReplacement("https://" + nitterHost + nitter_directory)); + content = content.replaceAll(">" + Pattern.quote(matcher.group()), Matcher.quoteReplacement(">" + nitterHost + nitter_directory)); } } @@ -768,7 +395,6 @@ public class Status implements Parcelable { status.setDisplayNameSpan(displayNameSpan); } - private static SpannableString treatment(final Context context, SpannableString spannableString, Status status) { URLSpan[] urls = spannableString.getSpans(0, spannableString.length(), URLSpan.class); @@ -866,7 +492,7 @@ public class Status implements Parcelable { SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); int l_c = prefs.getInt("theme_link_color", -1); - if( l_c == -1) { + if (l_c == -1) { l_c = ThemeHelper.getAttColor(context, R.attr.linkColor); } final int link_color = l_c; @@ -886,7 +512,7 @@ public class Status implements Parcelable { String nitterHost = sharedpreferences.getString(Helper.SET_NITTER_HOST, Helper.DEFAULT_NITTER_HOST).toLowerCase(); String url = "https://" + nitterHost + "/" + twittername.substring(1).replace("@twitter.com", ""); Helper.openBrowser(context, url); - }else{ + } else { intent = new Intent(Intent.ACTION_VIEW, Uri.parse("https://twitter.com/" + twittername.substring(1).replace("@twitter.com", ""))); context.startActivity(intent); } @@ -1097,7 +723,7 @@ public class Status implements Parcelable { SharedPreferences sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE); SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); int l_c = prefs.getInt("theme_link_color", -1); - if( l_c == -1) { + if (l_c == -1) { l_c = ThemeHelper.getAttColor(context, R.attr.linkColor); } final int link_color = l_c; @@ -1153,7 +779,6 @@ public class Status implements Parcelable { status.setDisplayNameSpan(displayNameSpan); } - public static void makeEmojis(final Context context, final OnRetrieveEmojiInterface listener, Status status) { if (((Activity) context).isFinishing()) @@ -1331,8 +956,7 @@ public class Status implements Parcelable { } } - - public static void makeEmojiPoll(final Context context, final OnRetrieveEmojiInterface listener, Status status){ + public static void makeEmojiPoll(final Context context, final OnRetrieveEmojiInterface listener, Status status) { if (((Activity) context).isFinishing()) return; if (status.getReblog() != null && status.getReblog().getEmojis() == null) { @@ -1347,13 +971,13 @@ public class Status implements Parcelable { SharedPreferences sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE); boolean disableAnimatedEmoji = sharedpreferences.getBoolean(Helper.SET_DISABLE_ANIMATED_EMOJI, false); - Poll poll = status.getReblog()==null?status.getPoll():status.getReblog().getPoll(); + Poll poll = status.getReblog() == null ? status.getPoll() : status.getReblog().getPoll(); if (poll == null) { status.setPollEmojiFound(true); return; } int inc = 0; - for(PollOptions pollOption : poll.getOptionsList()){ + for (PollOptions pollOption : poll.getOptionsList()) { inc++; SpannableString titleSpan = new SpannableString(pollOption.getTitle()); if (emojis != null && emojis.size() > 0) { @@ -1393,7 +1017,7 @@ public class Status implements Parcelable { return; } final String targetedEmoji = ":" + emoji.getShortcode() + ":"; - if ( titleSpan.toString().contains(targetedEmoji)) { + if (titleSpan.toString().contains(targetedEmoji)) { //emojis can be used several times so we have to loop for (int startPosition = -1; (startPosition = titleSpan.toString().indexOf(targetedEmoji, startPosition + 1)) != -1; startPosition++) { final int endPosition = startPosition + targetedEmoji.length(); @@ -1499,7 +1123,6 @@ public class Status implements Parcelable { } } - public static void makeEmojisTranslation(final Context context, final OnRetrieveEmojiInterface listener, Status status) { if (((Activity) context).isFinishing()) @@ -1570,7 +1193,6 @@ public class Status implements Parcelable { } } - private static void replaceQuoteSpans(Context context, Spannable spannable) { QuoteSpan[] quoteSpans = spannable.getSpans(0, spannable.length(), QuoteSpan.class); for (QuoteSpan quoteSpan : quoteSpans) { @@ -1596,6 +1218,363 @@ public class Status implements Parcelable { } } + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeString(this.id); + dest.writeString(this.uri); + dest.writeString(this.url); + dest.writeParcelable(this.account, flags); + dest.writeString(this.in_reply_to_id); + dest.writeString(this.in_reply_to_account_id); + dest.writeParcelable(this.reblog, flags); + dest.writeLong(this.created_at != null ? this.created_at.getTime() : -1); + dest.writeInt(this.reblogs_count); + dest.writeInt(this.favourites_count); + dest.writeInt(this.replies_count); + dest.writeByte(this.reblogged ? (byte) 1 : (byte) 0); + dest.writeByte(this.favourited ? (byte) 1 : (byte) 0); + dest.writeByte(this.muted ? (byte) 1 : (byte) 0); + dest.writeByte(this.pinned ? (byte) 1 : (byte) 0); + dest.writeByte(this.sensitive ? (byte) 1 : (byte) 0); + dest.writeByte(this.bookmarked ? (byte) 1 : (byte) 0); + dest.writeString(this.visibility); + dest.writeByte(this.attachmentShown ? (byte) 1 : (byte) 0); + dest.writeByte(this.spoilerShown ? (byte) 1 : (byte) 0); + dest.writeTypedList(this.media_attachments); + dest.writeParcelable(this.art_attachment, flags); + dest.writeTypedList(this.mentions); + dest.writeTypedList(this.emojis); + dest.writeTypedList(this.tags); + dest.writeParcelable(this.application, flags); + dest.writeParcelable(this.card, flags); + dest.writeString(this.language); + dest.writeByte(this.isTranslated ? (byte) 1 : (byte) 0); + dest.writeByte(this.isTranslationShown ? (byte) 1 : (byte) 0); + dest.writeByte(this.isNew ? (byte) 1 : (byte) 0); + dest.writeByte(this.isVisible ? (byte) 1 : (byte) 0); + dest.writeByte(this.fetchMore ? (byte) 1 : (byte) 0); + dest.writeString(this.content); + dest.writeString(this.contentCW); + dest.writeString(this.contentTranslated); + TextUtils.writeToParcel(this.contentSpan, dest, flags); + TextUtils.writeToParcel(this.displayNameSpan, dest, flags); + TextUtils.writeToParcel(this.contentSpanCW, dest, flags); + TextUtils.writeToParcel(this.contentSpanTranslated, dest, flags); + dest.writeInt(this.type == null ? -1 : this.type.ordinal()); + dest.writeInt(this.itemViewType); + dest.writeString(this.conversationId); + dest.writeByte(this.isExpanded ? (byte) 1 : (byte) 0); + dest.writeInt(this.numberLines); + dest.writeStringList(this.conversationProfilePicture); + dest.writeString(this.webviewURL); + dest.writeByte(this.isBoostAnimated ? (byte) 1 : (byte) 0); + dest.writeByte(this.isFavAnimated ? (byte) 1 : (byte) 0); + dest.writeString(this.scheduled_at); + dest.writeString(this.contentType); + dest.writeByte(this.showSpoiler ? (byte) 1 : (byte) 0); + dest.writeByte(this.isNotice ? (byte) 1 : (byte) 0); + dest.writeParcelable(this.poll, flags); + dest.writeInt(this.media_height); + dest.writeByte(this.cached ? (byte) 1 : (byte) 0); + dest.writeByte(this.autoHiddenCW ? (byte) 1 : (byte) 0); + dest.writeByte(this.customFeaturesDisplayed ? (byte) 1 : (byte) 0); + dest.writeByte(this.shortReply ? (byte) 1 : (byte) 0); + dest.writeInt(this.warningFetched); + dest.writeStringList(this.imageURL); + dest.writeInt(this.viewType); + dest.writeByte(this.isFocused ? (byte) 1 : (byte) 0); + dest.writeString(this.quickReplyContent); + dest.writeString(this.quickReplyPrivacy); + dest.writeByte(this.showBottomLine ? (byte) 1 : (byte) 0); + dest.writeByte(this.showTopLine ? (byte) 1 : (byte) 0); + + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getUri() { + return uri; + } + + public void setUri(String uri) { + this.uri = uri; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + public Account getAccount() { + return account; + } + + public void setAccount(Account account) { + this.account = account; + } + + public String getIn_reply_to_id() { + return in_reply_to_id; + } + + public void setIn_reply_to_id(String in_reply_to_id) { + this.in_reply_to_id = in_reply_to_id; + } + + public String getIn_reply_to_account_id() { + return in_reply_to_account_id; + } + + public void setIn_reply_to_account_id(String in_reply_to_account_id) { + this.in_reply_to_account_id = in_reply_to_account_id; + } + + public String getContent() { + return content; + } + + public void setContent(String content) { + //Remove UTM by default + this.content = Helper.remove_tracking_param(content); + } + + public boolean isShortReply() { + return shortReply; + } + + public void setShortReply(boolean shortReply) { + this.shortReply = shortReply; + } + + public Status getReblog() { + return reblog; + } + + public void setReblog(Status reblog) { + this.reblog = reblog; + } + + public int getReblogs_count() { + return reblogs_count; + } + + public void setReblogs_count(int reblogs_count) { + this.reblogs_count = reblogs_count; + } + + public Date getCreated_at() { + return created_at; + } + + public void setCreated_at(Date created_at) { + this.created_at = created_at; + } + + public int getFavourites_count() { + return favourites_count; + } + + public void setFavourites_count(int favourites_count) { + this.favourites_count = favourites_count; + } + + public SpannableString getDisplayNameSpan() { + return this.displayNameSpan; + } + + public void setDisplayNameSpan(SpannableString displayNameSpan) { + this.displayNameSpan = displayNameSpan; + } + + public boolean isReblogged() { + return reblogged; + } + + public void setReblogged(boolean reblogged) { + this.reblogged = reblogged; + } + + public boolean isFavourited() { + return favourited; + } + + public void setFavourited(boolean favourited) { + this.favourited = favourited; + } + + public boolean isPinned() { + return pinned; + } + + public void setPinned(boolean pinned) { + this.pinned = pinned; + } + + public boolean isSensitive() { + return sensitive; + } + + public void setSensitive(boolean sensitive) { + this.sensitive = sensitive; + } + + public String getSpoiler_text() { + return contentCW; + } + + public void setSpoiler_text(String spoiler_text) { + this.contentCW = spoiler_text; + } + + public ArrayList getMedia_attachments() { + return media_attachments; + } + + public void setMedia_attachments(ArrayList media_attachments) { + this.media_attachments = media_attachments; + } + + public List getMentions() { + return mentions; + } + + public void setMentions(List mentions) { + this.mentions = mentions; + } + + public List getTags() { + return tags; + } + + public void setTags(List tags) { + this.tags = tags; + } + + public String getTagsString() { + //iterate through tags and create comma delimited string of tag names + String tag_names = ""; + for (Tag t : tags) { + if (tag_names.equals("")) { + tag_names = t.getName(); + } else { + tag_names = tag_names + ", " + t.getName(); + } + } + return tag_names; + } + + public Application getApplication() { + return application; + } + + public void setApplication(Application application) { + this.application = application; + } + + public String getVisibility() { + return visibility; + } + + public void setVisibility(String visibility) { + this.visibility = visibility; + } + + public boolean isAttachmentShown() { + return attachmentShown; + } + + public void setAttachmentShown(boolean attachmentShown) { + this.attachmentShown = attachmentShown; + } + + public boolean isSpoilerShown() { + return spoilerShown; + } + + public void setSpoilerShown(boolean spoilerShown) { + this.spoilerShown = spoilerShown; + } + + public String getLanguage() { + return language; + } + + public void setLanguage(String language) { + this.language = language; + } + + public boolean isTranslated() { + return isTranslated; + } + + public void setTranslated(boolean translated) { + isTranslated = translated; + } + + public boolean isTranslationShown() { + return isTranslationShown; + } + + public void setTranslationShown(boolean translationShown) { + isTranslationShown = translationShown; + } + + public String getContentTranslated() { + return contentTranslated; + } + + public void setContentTranslated(String content_translated) { + this.contentTranslated = content_translated; + } + + public boolean isNew() { + return isNew; + } + + public void setNew(boolean aNew) { + isNew = aNew; + } + + public boolean isVisible() { + return isVisible; + } + + public void setVisible(boolean visible) { + isVisible = visible; + } + + public List getEmojis() { + return emojis; + } + + public void setEmojis(List emojis) { + this.emojis = emojis; + } + + public boolean isEmojiFound() { + return isEmojiFound; + } + + public void setEmojiFound(boolean emojiFound) { + isEmojiFound = emojiFound; + } + + public boolean isImageFound() { + return isImageFound; + } + + public void setImageFound(boolean imageFound) { + isImageFound = imageFound; + } public SpannableString getContentSpan() { return contentSpan; @@ -1621,14 +1600,14 @@ public class Status implements Parcelable { this.contentSpanTranslated = contentSpanTranslated; } - public void setClickable(boolean clickable) { - isClickable = clickable; - } - public boolean isClickable() { return isClickable; } + public void setClickable(boolean clickable) { + isClickable = clickable; + } + public boolean isEmojiTranslateFound() { return isEmojiTranslateFound; } @@ -1668,7 +1647,7 @@ public class Status implements Parcelable { } public boolean isBookmarked() { - if( this.getReblog() != null && this.getReblog().isBookmarked()){ + if (this.getReblog() != null && this.getReblog().isBookmarked()) { bookmarked = true; } return bookmarked; diff --git a/app/src/main/java/app/fedilab/android/client/Entities/StoredStatus.java b/app/src/main/java/app/fedilab/android/client/Entities/StoredStatus.java index 9f1d3b622..2c9132b48 100644 --- a/app/src/main/java/app/fedilab/android/client/Entities/StoredStatus.java +++ b/app/src/main/java/app/fedilab/android/client/Entities/StoredStatus.java @@ -13,6 +13,17 @@ import java.util.Date; public class StoredStatus implements Parcelable { + public static final Creator CREATOR = new Creator() { + @Override + public StoredStatus createFromParcel(Parcel source) { + return new StoredStatus(source); + } + + @Override + public StoredStatus[] newArray(int size) { + return new StoredStatus[size]; + } + }; private int id; private Date creation_date; private Date scheduled_date; @@ -25,6 +36,26 @@ public class StoredStatus implements Parcelable { private String userId; private String scheduledServerdId; + public StoredStatus() { + } + + protected StoredStatus(Parcel in) { + this.id = in.readInt(); + long tmpCreation_date = in.readLong(); + this.creation_date = tmpCreation_date == -1 ? null : new Date(tmpCreation_date); + long tmpScheduled_date = in.readLong(); + this.scheduled_date = tmpScheduled_date == -1 ? null : new Date(tmpScheduled_date); + long tmpSent_date = in.readLong(); + this.sent_date = tmpSent_date == -1 ? null : new Date(tmpSent_date); + this.jobId = in.readInt(); + this.isSent = in.readByte() != 0; + this.status = in.readParcelable(Status.class.getClassLoader()); + this.statusReply = in.readParcelable(Status.class.getClassLoader()); + this.instance = in.readString(); + this.userId = in.readString(); + this.scheduledServerdId = in.readString(); + } + public int getId() { return id; } @@ -57,7 +88,6 @@ public class StoredStatus implements Parcelable { this.sent_date = sent_date; } - public boolean isSent() { return isSent; } @@ -106,7 +136,6 @@ public class StoredStatus implements Parcelable { this.statusReply = statusReply; } - public String getScheduledServerdId() { return scheduledServerdId; } @@ -134,36 +163,4 @@ public class StoredStatus implements Parcelable { dest.writeString(this.userId); dest.writeString(this.scheduledServerdId); } - - public StoredStatus() { - } - - protected StoredStatus(Parcel in) { - this.id = in.readInt(); - long tmpCreation_date = in.readLong(); - this.creation_date = tmpCreation_date == -1 ? null : new Date(tmpCreation_date); - long tmpScheduled_date = in.readLong(); - this.scheduled_date = tmpScheduled_date == -1 ? null : new Date(tmpScheduled_date); - long tmpSent_date = in.readLong(); - this.sent_date = tmpSent_date == -1 ? null : new Date(tmpSent_date); - this.jobId = in.readInt(); - this.isSent = in.readByte() != 0; - this.status = in.readParcelable(Status.class.getClassLoader()); - this.statusReply = in.readParcelable(Status.class.getClassLoader()); - this.instance = in.readString(); - this.userId = in.readString(); - this.scheduledServerdId = in.readString(); - } - - public static final Creator CREATOR = new Creator() { - @Override - public StoredStatus createFromParcel(Parcel source) { - return new StoredStatus(source); - } - - @Override - public StoredStatus[] newArray(int size) { - return new StoredStatus[size]; - } - }; } diff --git a/app/src/main/java/app/fedilab/android/client/Entities/Suggestion.java b/app/src/main/java/app/fedilab/android/client/Entities/Suggestion.java index 07e054637..7d242d696 100644 --- a/app/src/main/java/app/fedilab/android/client/Entities/Suggestion.java +++ b/app/src/main/java/app/fedilab/android/client/Entities/Suggestion.java @@ -20,12 +20,6 @@ public class Suggestion { private String imageUrl; private suggestionType type; - public enum suggestionType { - TAG, - ACCOUNT, - EMOJI - } - public suggestionType getType() { return type; } @@ -49,4 +43,10 @@ public class Suggestion { public void setContent(String content) { this.content = content; } + + public enum suggestionType { + TAG, + ACCOUNT, + EMOJI + } } diff --git a/app/src/main/java/app/fedilab/android/client/Entities/Tag.java b/app/src/main/java/app/fedilab/android/client/Entities/Tag.java index e398bad49..03c5efe0d 100644 --- a/app/src/main/java/app/fedilab/android/client/Entities/Tag.java +++ b/app/src/main/java/app/fedilab/android/client/Entities/Tag.java @@ -24,17 +24,6 @@ import android.os.Parcelable; public class Tag implements Parcelable { - private String name; - private String url; - - public Tag() { - } - - protected Tag(Parcel in) { - name = in.readString(); - url = in.readString(); - } - public static final Creator CREATOR = new Creator() { @Override public Tag createFromParcel(Parcel in) { @@ -46,6 +35,16 @@ public class Tag implements Parcelable { return new Tag[size]; } }; + private String name; + private String url; + + public Tag() { + } + + protected Tag(Parcel in) { + name = in.readString(); + url = in.readString(); + } public String getName() { return name; diff --git a/app/src/main/java/app/fedilab/android/client/Entities/TagTimeline.java b/app/src/main/java/app/fedilab/android/client/Entities/TagTimeline.java index 0c74af8ff..9581f9dae 100644 --- a/app/src/main/java/app/fedilab/android/client/Entities/TagTimeline.java +++ b/app/src/main/java/app/fedilab/android/client/Entities/TagTimeline.java @@ -26,6 +26,17 @@ import java.util.List; public class TagTimeline implements Parcelable { + public static final Creator CREATOR = new Creator() { + @Override + public TagTimeline createFromParcel(Parcel source) { + return new TagTimeline(source); + } + + @Override + public TagTimeline[] newArray(int size) { + return new TagTimeline[size]; + } + }; private int id; private String name; private String displayname; @@ -35,6 +46,20 @@ public class TagTimeline implements Parcelable { private List all; private List none; + public TagTimeline() { + } + + protected TagTimeline(Parcel in) { + this.id = in.readInt(); + this.name = in.readString(); + this.displayname = in.readString(); + this.isART = in.readByte() != 0; + this.isNSFW = in.readByte() != 0; + this.any = in.createStringArrayList(); + this.all = in.createStringArrayList(); + this.none = in.createStringArrayList(); + } + public String getName() { return name; } @@ -91,10 +116,6 @@ public class TagTimeline implements Parcelable { this.displayname = displayname; } - public TagTimeline() { - } - - public int getId() { return id; } @@ -119,27 +140,4 @@ public class TagTimeline implements Parcelable { dest.writeStringList(this.all); dest.writeStringList(this.none); } - - protected TagTimeline(Parcel in) { - this.id = in.readInt(); - this.name = in.readString(); - this.displayname = in.readString(); - this.isART = in.readByte() != 0; - this.isNSFW = in.readByte() != 0; - this.any = in.createStringArrayList(); - this.all = in.createStringArrayList(); - this.none = in.createStringArrayList(); - } - - public static final Creator CREATOR = new Creator() { - @Override - public TagTimeline createFromParcel(Parcel source) { - return new TagTimeline(source); - } - - @Override - public TagTimeline[] newArray(int size) { - return new TagTimeline[size]; - } - }; } diff --git a/app/src/main/java/app/fedilab/android/client/Entities/UserNote.java b/app/src/main/java/app/fedilab/android/client/Entities/UserNote.java index 062d4fa7b..1810f489f 100644 --- a/app/src/main/java/app/fedilab/android/client/Entities/UserNote.java +++ b/app/src/main/java/app/fedilab/android/client/Entities/UserNote.java @@ -13,6 +13,7 @@ package app.fedilab.android.client.Entities; * * You should have received a copy of the GNU General Public License along with Fedilab; if not, * see . */ + import java.util.Date; public class UserNote { diff --git a/app/src/main/java/app/fedilab/android/client/Entities/Version.java b/app/src/main/java/app/fedilab/android/client/Entities/Version.java index 1b2a14365..5dd020cf8 100644 --- a/app/src/main/java/app/fedilab/android/client/Entities/Version.java +++ b/app/src/main/java/app/fedilab/android/client/Entities/Version.java @@ -11,10 +11,6 @@ public class Version implements Comparable { private String version; - public final String get() { - return this.version; - } - public Version(String version) { if (version == null) version = "2.1"; @@ -30,6 +26,10 @@ public class Version implements Comparable { this.version = version; } + public final String get() { + return this.version; + } + @Override public int compareTo(@NonNull Version that) { String[] thisParts = this.get().split("\\."); diff --git a/app/src/main/java/app/fedilab/android/client/GNUAPI.java b/app/src/main/java/app/fedilab/android/client/GNUAPI.java index 01caea693..eb3388059 100644 --- a/app/src/main/java/app/fedilab/android/client/GNUAPI.java +++ b/app/src/main/java/app/fedilab/android/client/GNUAPI.java @@ -81,11 +81,6 @@ public class GNUAPI { private Error APIError; private String userId; - public enum accountPrivacy { - PUBLIC, - LOCKED - } - public GNUAPI(Context context) { this.context = context; SharedPreferences sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE); @@ -135,153 +130,6 @@ public class GNUAPI { APIError = null; } - - /*** - * Update credential of the authenticated user *synchronously* - * @return APIResponse - */ - public APIResponse updateCredential(String display_name, String note, ByteArrayInputStream avatar, String avatarName, ByteArrayInputStream header, String headerName, accountPrivacy privacy, HashMap customFields) { - - HashMap requestParams = new HashMap<>(); - if (display_name != null) - try { - requestParams.put("name", URLEncoder.encode(display_name, "UTF-8")); - } catch (UnsupportedEncodingException e) { - requestParams.put("name", display_name); - } - if (note != null) - try { - requestParams.put("description", URLEncoder.encode(note, "UTF-8")); - } catch (UnsupportedEncodingException e) { - requestParams.put("description", note); - } - if (privacy != null) - requestParams.put("locked", privacy == accountPrivacy.LOCKED ? "true" : "false"); - try { - if (requestParams.size() > 0) - new HttpsConnection(context, this.instance).patch(getAbsoluteUrl("/accounts/update_profile"), 60, requestParams, avatar, null, null, null, prefKeyOauthTokenT); - if (avatar != null && avatarName != null) - new HttpsConnection(context, this.instance).patch(getAbsoluteUrl("/accounts/update_profile_image"), 60, null, avatar, avatarName, null, null, prefKeyOauthTokenT); - - } catch (HttpsConnection.HttpsConnectionException e) { - e.printStackTrace(); - setError(e.getStatusCode(), e); - } catch (NoSuchAlgorithmException e) { - e.printStackTrace(); - } catch (IOException e) { - e.printStackTrace(); - } catch (KeyManagementException e) { - e.printStackTrace(); - } - return apiResponse; - } - - /*** - * Verifiy credential of the authenticated user *synchronously* - * @return Account - */ - public Account verifyCredentials() { - account = new Account(); - InstanceNodeInfo nodeinfo = new API(context).displayNodeInfo(instance); - String social = null; - if( nodeinfo != null){ - social = nodeinfo.getName(); - } - try { - String response = new HttpsConnection(context, this.instance).get(getAbsoluteUrl("/account/verify_credentials.json"), 60, null, prefKeyOauthTokenT); - account = parseAccountResponse(context, new JSONObject(response)); - if( social != null ) { - account.setSocial(social.toUpperCase()); - } - } catch (HttpsConnection.HttpsConnectionException e) { - setError(e.getStatusCode(), e); - e.printStackTrace(); - } catch (NoSuchAlgorithmException | IOException | KeyManagementException | JSONException e) { - e.printStackTrace(); - } - return account; - } - - /** - * Returns an account - * - * @param accountId String account fetched - * @return Account entity - */ - public Account getAccount(String accountId) { - - account = new Account(); - HashMap params = new HashMap<>(); - params.put("user_id", accountId); - try { - String response = new HttpsConnection(context, this.instance).get(getAbsoluteUrl("/users/show.json"), 60, params, prefKeyOauthTokenT); - account = parseAccountResponse(context, new JSONObject(response)); - } catch (HttpsConnection.HttpsConnectionException e) { - setError(e.getStatusCode(), e); - e.printStackTrace(); - } catch (NoSuchAlgorithmException e) { - e.printStackTrace(); - } catch (IOException e) { - e.printStackTrace(); - } catch (KeyManagementException e) { - e.printStackTrace(); - } catch (JSONException e) { - e.printStackTrace(); - } - return account; - } - - - /** - * Retrieves group *synchronously* - * - * @param max_id String id max - * @return APIResponse - */ - @SuppressWarnings("SameParameterValue") - public APIResponse getGroups(String max_id) { - return getGroups(max_id, null); - } - - /** - * Retrieves group *synchronously* - * - * @param max_id String id max - * @param since_id String since the id - * @return APIResponse - */ - @SuppressWarnings("SameParameterValue") - private APIResponse getGroups(String max_id, String since_id) { - - HashMap params = new HashMap<>(); - if (max_id != null) - params.put("max_id", max_id); - if (since_id != null) - params.put("since_id", since_id); - accounts = new ArrayList<>(); - try { - HttpsConnection httpsConnection = new HttpsConnection(context, this.instance); - String response = httpsConnection.get(getAbsoluteUrl("/statusnet/groups/list.json"), 60, params, prefKeyOauthTokenT); - accounts = parseGroups(context, new JSONArray(response)); - if (accounts.size() > 0) { - apiResponse.setSince_id(accounts.get(0).getId()); - apiResponse.setMax_id(accounts.get(accounts.size() - 1).getId()); - } - } catch (HttpsConnection.HttpsConnectionException e) { - setError(e.getStatusCode(), e); - } catch (NoSuchAlgorithmException e) { - e.printStackTrace(); - } catch (IOException e) { - e.printStackTrace(); - } catch (KeyManagementException e) { - e.printStackTrace(); - } catch (JSONException e) { - e.printStackTrace(); - } - apiResponse.setAccounts(accounts); - return apiResponse; - } - /** * Parse json response for several groups * @@ -344,6 +192,524 @@ public class GNUAPI { return group; } + /** + * Parse json response for several status + * + * @param jsonArray JSONArray + * @return List + */ + public static List parseStatuses(Context context, JSONArray jsonArray) { + + List statuses = new ArrayList<>(); + try { + int i = 0; + while (i < jsonArray.length()) { + + JSONObject resobj = jsonArray.getJSONObject(i); + Status status = parseStatuses(context, resobj); + i++; + statuses.add(status); + } + + } catch (JSONException e) { + e.printStackTrace(); + } + return statuses; + } + + /** + * Parse json response for unique status + * + * @param resobj JSONObject + * @return Status + */ + @SuppressWarnings("InfiniteRecursion") + private static Status parseStatuses(Context context, JSONObject resobj) { + Status status = new Status(); + try { + status.setId(resobj.get("id").toString()); + try { + status.setUri(resobj.get("uri").toString()); + } catch (Exception ignored) { + status.setUri(resobj.get("id").toString()); + } + status.setCreated_at(Helper.mstStringToDate(context, resobj.get("created_at").toString())); + if (resobj.has("in_reply_to_status_id")) + status.setIn_reply_to_id(resobj.get("in_reply_to_status_id").toString()); + if (resobj.has("in_reply_to_user_id")) + status.setIn_reply_to_account_id(resobj.get("in_reply_to_user_id").toString()); + status.setSensitive(false); + status.setSpoiler_text(null); + if (!resobj.has("sender")) + status.setVisibility("public"); + else + status.setVisibility("direct"); + if (resobj.has("geo")) + status.setLanguage(resobj.isNull("geo") ? null : resobj.getString("geo")); + if (resobj.has("external_url")) + status.setUrl(resobj.get("external_url").toString()); + //Retrieves attachments + try { + JSONArray arrayAttachement = resobj.getJSONArray("attachments"); + ArrayList attachments = new ArrayList<>(parseAttachmentResponse(arrayAttachement)); + status.setMedia_attachments(attachments); + } catch (Exception ignored) { + status.setMedia_attachments(new ArrayList<>()); + } + + status.setCard(null); + try { + status.setConversationId(resobj.get("statusnet_conversation_id").toString()); + } catch (Exception ignored) { + if (resobj.has("friendica_parent_uri")) + status.setConversationId(resobj.get("friendica_parent_uri").toString()); + else + status.setConversationId(resobj.get("id").toString()); + } + //Retrieves mentions + List mentions = new ArrayList<>(); + if (resobj.has("attentions")) { + JSONArray arrayMention = resobj.getJSONArray("attentions"); + if (arrayMention != null) { + for (int j = 0; j < arrayMention.length(); j++) { + JSONObject menObj = arrayMention.getJSONObject(j); + Mention mention = new Mention(); + mention.setId(menObj.get("id").toString()); + mention.setUrl(menObj.get("profileurl").toString()); + mention.setAcct(menObj.get("screen_name").toString()); + mention.setUsername(menObj.get("fullname").toString()); + mentions.add(mention); + } + } + status.setMentions(mentions); + } else { + status.setMentions(new ArrayList<>()); + } + + //Retrieves tags + status.setTags(null); + //Retrieves emjis + status.setEmojis(new ArrayList<>()); + //Retrieve Application + Application application = new Application(); + try { + if (resobj.getJSONObject("source") != null) { + application.setName(resobj.getJSONObject("source").toString()); + application.setWebsite(resobj.getJSONObject("source_link").toString()); + } + } catch (Exception e) { + application = new Application(); + } + status.setApplication(application); + if (resobj.has("user")) + status.setAccount(parseAccountResponse(context, resobj.getJSONObject("user"))); + else if (resobj.has("sender")) + status.setAccount(parseAccountResponse(context, resobj.getJSONObject("sender"))); + if (resobj.has("statusnet_html")) + status.setContent(resobj.get("statusnet_html").toString()); + else if (resobj.has("text")) + status.setContent(resobj.get("text").toString()); + if (resobj.has("fave_num")) + status.setFavourites_count(Integer.valueOf(resobj.get("fave_num").toString())); + else + status.setFavourites_count(0); + if (resobj.has("repeat_num")) + status.setReblogs_count(Integer.valueOf(resobj.get("repeat_num").toString())); + else + status.setReblogs_count(0); + status.setReplies_count(0); + try { + status.setReblogged(Boolean.valueOf(resobj.get("repeated").toString())); + } catch (Exception e) { + status.setReblogged(false); + } + try { + status.setFavourited(Boolean.valueOf(resobj.get("favorited").toString())); + } catch (Exception e) { + status.setFavourited(false); + } + if (resobj.has("friendica_activities") && resobj.getJSONObject("friendica_activities").has("like")) { + status.setFavourited(false); + JSONArray jsonArray = resobj.getJSONObject("friendica_activities").getJSONArray("like"); + SharedPreferences sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE); + String userId = sharedpreferences.getString(Helper.PREF_KEY_ID, null); + for (int i = 0; i < jsonArray.length(); i++) { + JSONObject like = jsonArray.getJSONObject(i); + if (like.getString("id").equals(userId)) { + status.setFavourited(true); + break; + } + } + + } + status.setMuted(false); + status.setPinned(false); + try { + status.setReblog(parseStatuses(context, resobj.getJSONObject("retweeted_status"))); + } catch (Exception ignored) { + status.setReblog(null); + } + if (status.getContent().contains(status.getUri())) + status.setNotice(true); + } catch (JSONException ignored) { + ignored.printStackTrace(); + } catch (ParseException e) { + e.printStackTrace(); + + } + status.setViewType(context); + return status; + } + + /** + * Parse json response for unique schedule + * + * @param resobj JSONObject + * @return Status + */ + @SuppressWarnings("InfiniteRecursion") + private static Status parseSchedule(Context context, JSONObject resobj) { + Status status = new Status(); + try { + status.setIn_reply_to_id(resobj.get("in_reply_to_id").toString()); + status.setSensitive(Boolean.parseBoolean(resobj.get("sensitive").toString())); + status.setSpoiler_text(resobj.get("spoiler_text").toString()); + try { + status.setVisibility(resobj.get("visibility").toString()); + } catch (Exception e) { + status.setVisibility("public"); + } + status.setContent(resobj.get("text").toString()); + } catch (JSONException ignored) { + } + return status; + } + + /** + * Parse json response an unique account + * + * @param resobj JSONObject + * @return Account + */ + @SuppressWarnings("InfiniteRecursion") + public static Account parseAccountResponse(Context context, JSONObject resobj) { + + Account account = new Account(); + try { + account.setId(resobj.get("id").toString()); + if (resobj.has("ostatus_uri")) + account.setUuid(resobj.get("ostatus_uri").toString()); + else + account.setUuid(resobj.get("id").toString()); + account.setUsername(resobj.get("screen_name").toString()); + account.setAcct(resobj.get("screen_name").toString()); + account.setDisplay_name(resobj.get("name").toString()); + account.setLocked(Boolean.parseBoolean(resobj.get("protected").toString())); + account.setCreated_at(Helper.mstStringToDate(context, resobj.get("created_at").toString())); + account.setFollowers_count(Integer.valueOf(resobj.get("followers_count").toString())); + account.setFollowing_count(Integer.valueOf(resobj.get("friends_count").toString())); + account.setStatuses_count(Integer.valueOf(resobj.get("statuses_count").toString())); + account.setNote(resobj.get("description").toString()); + account.setBot(false); + account.setMoved_to_account(null); + account.setUrl(resobj.get("url").toString()); + account.setAvatar(resobj.get("profile_image_url_https").toString()); + account.setAvatar_static(resobj.get("profile_image_url_https").toString()); + if (!resobj.isNull("background_image")) { + account.setHeader(resobj.get("background_image").toString()); + account.setHeader_static(resobj.get("background_image").toString()); + } else { + account.setHeader("null"); + account.setHeader_static("null"); + } + + if (resobj.has("cid")) + account.setSocial("FRIENDICA"); + else + account.setSocial("GNU"); + account.setEmojis(new ArrayList<>()); + } catch (JSONException ignored) { + } catch (ParseException e) { + e.printStackTrace(); + } + return account; + } + + /** + * Parse json response for list of relationship + * + * @param jsonArray JSONArray + * @return List + */ + private static List parseAttachmentResponse(JSONArray jsonArray) { + + List attachments = new ArrayList<>(); + try { + int i = 0; + while (i < jsonArray.length()) { + JSONObject resobj = jsonArray.getJSONObject(i); + Attachment attachment = parseAttachmentResponse(resobj); + attachments.add(attachment); + i++; + } + } catch (JSONException ignored) { + } + return attachments; + } + + /** + * Parse json response an unique attachment + * + * @param resobj JSONObject + * @return Relationship + */ + static Attachment parseAttachmentResponse(JSONObject resobj) { + + Attachment attachment = new Attachment(); + try { + if (resobj.has("id")) + attachment.setId(resobj.get("id").toString()); + if (resobj.has("url")) { + attachment.setUrl(resobj.getString("url")); + attachment.setPreview_url(resobj.getString("url")); + attachment.setRemote_url(resobj.getString("url")); + } + + if (attachment.getUrl().endsWith("png") || attachment.getUrl().endsWith("jpg") || attachment.getUrl().endsWith("jpeg")) { + attachment.setType("image"); + } else if (attachment.getUrl().endsWith("gif") || attachment.getUrl().endsWith("apng")) { + attachment.setType("gifv"); + } else if (attachment.getUrl().endsWith("mp4")) { + attachment.setType("video"); + } else { + attachment.setType("web"); + } + + try { + attachment.setDescription(resobj.get("description").toString()); + } catch (JSONException ignore) { + } + try { + attachment.setRemote_url(resobj.get("url").toString()); + } catch (JSONException ignore) { + } + try { + attachment.setPreview_url(resobj.get("thumb_url").toString()); + } catch (JSONException ignore) { + } + try { + attachment.setMeta(resobj.get("meta").toString()); + } catch (JSONException ignore) { + } + try { + attachment.setText_url(resobj.get("text_url").toString()); + } catch (JSONException ignore) { + } + + } catch (JSONException ignored) { + } + return attachment; + } + + /** + * Parse json response an unique attachment + * + * @param resobj JSONObject + * @return Relationship + */ + public static Attachment parseUploadedAttachmentResponse(JSONObject resobj) { + + Attachment attachment = new Attachment(); + try { + if (resobj.has("media_id")) + attachment.setId(resobj.get("media_id").toString()); + if (resobj.has("image") && resobj.getJSONObject("image").has("image_type")) + attachment.setType("Image"); + else if (resobj.has("image") && resobj.getJSONObject("gif").has("image_type")) + attachment.setType("GifV"); + else + attachment.setType("video"); + + try { + attachment.setRemote_url(resobj.get("url").toString()); + } catch (JSONException ignore) { + } + try { + attachment.setPreview_url(resobj.get("thumb_url").toString()); + } catch (JSONException ignore) { + } + + if (resobj.has("image") && resobj.getJSONObject("image").has("friendica_preview_url")) { + attachment.setUrl(resobj.getJSONObject("image").getString("friendica_preview_url")); + attachment.setPreview_url(resobj.getJSONObject("image").getString("friendica_preview_url")); + attachment.setRemote_url(resobj.getJSONObject("image").getString("friendica_preview_url")); + } + if (resobj.has("media_url")) + attachment.setUrl(resobj.get("media_url").toString()); + try { + attachment.setDescription(resobj.get("description").toString()); + } catch (JSONException ignore) { + } + + try { + attachment.setMeta(resobj.get("meta").toString()); + } catch (JSONException ignore) { + } + try { + attachment.setText_url(resobj.get("text_url").toString()); + } catch (JSONException ignore) { + } + + } catch (JSONException ignored) { + ignored.printStackTrace(); + } + return attachment; + } + + /*** + * Update credential of the authenticated user *synchronously* + * @return APIResponse + */ + public APIResponse updateCredential(String display_name, String note, ByteArrayInputStream avatar, String avatarName, ByteArrayInputStream header, String headerName, accountPrivacy privacy, HashMap customFields) { + + HashMap requestParams = new HashMap<>(); + if (display_name != null) + try { + requestParams.put("name", URLEncoder.encode(display_name, "UTF-8")); + } catch (UnsupportedEncodingException e) { + requestParams.put("name", display_name); + } + if (note != null) + try { + requestParams.put("description", URLEncoder.encode(note, "UTF-8")); + } catch (UnsupportedEncodingException e) { + requestParams.put("description", note); + } + if (privacy != null) + requestParams.put("locked", privacy == accountPrivacy.LOCKED ? "true" : "false"); + try { + if (requestParams.size() > 0) + new HttpsConnection(context, this.instance).patch(getAbsoluteUrl("/accounts/update_profile"), 60, requestParams, avatar, null, null, null, prefKeyOauthTokenT); + if (avatar != null && avatarName != null) + new HttpsConnection(context, this.instance).patch(getAbsoluteUrl("/accounts/update_profile_image"), 60, null, avatar, avatarName, null, null, prefKeyOauthTokenT); + + } catch (HttpsConnection.HttpsConnectionException e) { + e.printStackTrace(); + setError(e.getStatusCode(), e); + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } catch (KeyManagementException e) { + e.printStackTrace(); + } + return apiResponse; + } + + /*** + * Verifiy credential of the authenticated user *synchronously* + * @return Account + */ + public Account verifyCredentials() { + account = new Account(); + InstanceNodeInfo nodeinfo = new API(context).displayNodeInfo(instance); + String social = null; + if (nodeinfo != null) { + social = nodeinfo.getName(); + } + try { + String response = new HttpsConnection(context, this.instance).get(getAbsoluteUrl("/account/verify_credentials.json"), 60, null, prefKeyOauthTokenT); + account = parseAccountResponse(context, new JSONObject(response)); + if (social != null) { + account.setSocial(social.toUpperCase()); + } + } catch (HttpsConnection.HttpsConnectionException e) { + setError(e.getStatusCode(), e); + e.printStackTrace(); + } catch (NoSuchAlgorithmException | IOException | KeyManagementException | JSONException e) { + e.printStackTrace(); + } + return account; + } + + /** + * Returns an account + * + * @param accountId String account fetched + * @return Account entity + */ + public Account getAccount(String accountId) { + + account = new Account(); + HashMap params = new HashMap<>(); + params.put("user_id", accountId); + try { + String response = new HttpsConnection(context, this.instance).get(getAbsoluteUrl("/users/show.json"), 60, params, prefKeyOauthTokenT); + account = parseAccountResponse(context, new JSONObject(response)); + } catch (HttpsConnection.HttpsConnectionException e) { + setError(e.getStatusCode(), e); + e.printStackTrace(); + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } catch (KeyManagementException e) { + e.printStackTrace(); + } catch (JSONException e) { + e.printStackTrace(); + } + return account; + } + + /** + * Retrieves group *synchronously* + * + * @param max_id String id max + * @return APIResponse + */ + @SuppressWarnings("SameParameterValue") + public APIResponse getGroups(String max_id) { + return getGroups(max_id, null); + } + + /** + * Retrieves group *synchronously* + * + * @param max_id String id max + * @param since_id String since the id + * @return APIResponse + */ + @SuppressWarnings("SameParameterValue") + private APIResponse getGroups(String max_id, String since_id) { + + HashMap params = new HashMap<>(); + if (max_id != null) + params.put("max_id", max_id); + if (since_id != null) + params.put("since_id", since_id); + accounts = new ArrayList<>(); + try { + HttpsConnection httpsConnection = new HttpsConnection(context, this.instance); + String response = httpsConnection.get(getAbsoluteUrl("/statusnet/groups/list.json"), 60, params, prefKeyOauthTokenT); + accounts = parseGroups(context, new JSONArray(response)); + if (accounts.size() > 0) { + apiResponse.setSince_id(accounts.get(0).getId()); + apiResponse.setMax_id(accounts.get(accounts.size() - 1).getId()); + } + } catch (HttpsConnection.HttpsConnectionException e) { + setError(e.getStatusCode(), e); + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } catch (KeyManagementException e) { + e.printStackTrace(); + } catch (JSONException e) { + e.printStackTrace(); + } + apiResponse.setAccounts(accounts); + return apiResponse; + } /** * Retrieves group timeline *synchronously* @@ -398,7 +764,6 @@ public class GNUAPI { return apiResponse; } - /** * Returns a relationship between the authenticated account and an account * @@ -460,7 +825,6 @@ public class GNUAPI { return relationship; } - /** * Returns a relationship between the authenticated account and an account * @@ -602,7 +966,6 @@ public class GNUAPI { return apiResponse; } - /** * Retrieves accounts that reblogged the status *synchronously* * @@ -640,7 +1003,6 @@ public class GNUAPI { return apiResponse; } - /** * Retrieves accounts that favourited the status *synchronously* * @@ -678,7 +1040,6 @@ public class GNUAPI { return apiResponse; } - /** * Retrieves one status *synchronously* * @@ -748,7 +1109,6 @@ public class GNUAPI { return statusContext; } - /** * Retrieves direct timeline for the account *synchronously* * @@ -870,7 +1230,6 @@ public class GNUAPI { return apiResponse; } - /** * Retrieves home timeline for the account *synchronously* * @@ -881,7 +1240,6 @@ public class GNUAPI { return getHomeTimeline(max_id, null, null, tootPerPage); } - /** * Retrieves home timeline for the account since an Id value *synchronously* * @@ -900,7 +1258,6 @@ public class GNUAPI { return getHomeTimeline(null, null, min_id, tootPerPage); } - /** * Retrieves home timeline for the account *synchronously* * @@ -948,7 +1305,6 @@ public class GNUAPI { return apiResponse; } - /** * Retrieves public timeline for the account *synchronously* * @@ -1043,7 +1399,6 @@ public class GNUAPI { return apiResponse; } - public APIResponse getCustomArtTimeline(boolean local, String tag, String max_id, List any, List all, List none) { return getArtTimeline(local, tag, max_id, null, any, all, none); } @@ -1199,7 +1554,6 @@ public class GNUAPI { return apiResponse; } - /** * Retrieves muted users by the authenticated account *synchronously* * @@ -1220,7 +1574,6 @@ public class GNUAPI { return getAccounts("/blocks/list.json", null, max_id, null, accountPerPage); } - /** * Retrieves following for the account specified by targetedId *synchronously* * @@ -1292,7 +1645,6 @@ public class GNUAPI { return apiResponse; } - /** * Retrieves follow requests for the authenticated account *synchronously* * @@ -1344,7 +1696,6 @@ public class GNUAPI { return apiResponse; } - /** * Retrieves favourited status for the authenticated account *synchronously* * @@ -1398,7 +1749,6 @@ public class GNUAPI { return apiResponse; } - /** * Makes the post action for a status * @@ -1614,7 +1964,6 @@ public class GNUAPI { return actionCode; } - /** * Posts a status * @@ -1689,7 +2038,6 @@ public class GNUAPI { return apiResponse; } - /** * Retrieves notifications for the authenticated account since an id*synchronously* * @@ -1721,7 +2069,6 @@ public class GNUAPI { return getNotifications(type, max_id, null, notificationPerPage, display); } - /** * Retrieves notifications for the authenticated account *synchronously* * @@ -1812,7 +2159,6 @@ public class GNUAPI { return apiResponse; } - /** * Changes media description * @@ -1846,7 +2192,6 @@ public class GNUAPI { return attachment; } - /** * Retrieves Accounts and feeds when searching *synchronously* * @@ -1885,7 +2230,6 @@ public class GNUAPI { return apiResponse; } - /** * Retrieves Accounts and feeds when searching *synchronously* * @@ -1964,7 +2308,6 @@ public class GNUAPI { return apiResponse; } - /** * Retrieves Accounts when searching (ie: via @...) *synchronously* * Not limited to following @@ -2019,7 +2362,6 @@ public class GNUAPI { return apiResponse; } - /** * Parse json response for several conversations * @@ -2064,202 +2406,6 @@ public class GNUAPI { return conversation; } - - /** - * Parse json response for several status - * - * @param jsonArray JSONArray - * @return List - */ - public static List parseStatuses(Context context, JSONArray jsonArray) { - - List statuses = new ArrayList<>(); - try { - int i = 0; - while (i < jsonArray.length()) { - - JSONObject resobj = jsonArray.getJSONObject(i); - Status status = parseStatuses(context, resobj); - i++; - statuses.add(status); - } - - } catch (JSONException e) { - e.printStackTrace(); - } - return statuses; - } - - /** - * Parse json response for unique status - * - * @param resobj JSONObject - * @return Status - */ - @SuppressWarnings("InfiniteRecursion") - private static Status parseStatuses(Context context, JSONObject resobj) { - Status status = new Status(); - try { - status.setId(resobj.get("id").toString()); - try { - status.setUri(resobj.get("uri").toString()); - } catch (Exception ignored) { - status.setUri(resobj.get("id").toString()); - } - status.setCreated_at(Helper.mstStringToDate(context, resobj.get("created_at").toString())); - if (resobj.has("in_reply_to_status_id")) - status.setIn_reply_to_id(resobj.get("in_reply_to_status_id").toString()); - if (resobj.has("in_reply_to_user_id")) - status.setIn_reply_to_account_id(resobj.get("in_reply_to_user_id").toString()); - status.setSensitive(false); - status.setSpoiler_text(null); - if (!resobj.has("sender")) - status.setVisibility("public"); - else - status.setVisibility("direct"); - if (resobj.has("geo")) - status.setLanguage(resobj.isNull("geo") ? null : resobj.getString("geo")); - if (resobj.has("external_url")) - status.setUrl(resobj.get("external_url").toString()); - //Retrieves attachments - try { - JSONArray arrayAttachement = resobj.getJSONArray("attachments"); - ArrayList attachments = new ArrayList<>(parseAttachmentResponse(arrayAttachement)); - status.setMedia_attachments(attachments); - } catch (Exception ignored) { - status.setMedia_attachments(new ArrayList<>()); - } - - status.setCard(null); - try { - status.setConversationId(resobj.get("statusnet_conversation_id").toString()); - } catch (Exception ignored) { - if (resobj.has("friendica_parent_uri")) - status.setConversationId(resobj.get("friendica_parent_uri").toString()); - else - status.setConversationId(resobj.get("id").toString()); - } - //Retrieves mentions - List mentions = new ArrayList<>(); - if (resobj.has("attentions")) { - JSONArray arrayMention = resobj.getJSONArray("attentions"); - if (arrayMention != null) { - for (int j = 0; j < arrayMention.length(); j++) { - JSONObject menObj = arrayMention.getJSONObject(j); - Mention mention = new Mention(); - mention.setId(menObj.get("id").toString()); - mention.setUrl(menObj.get("profileurl").toString()); - mention.setAcct(menObj.get("screen_name").toString()); - mention.setUsername(menObj.get("fullname").toString()); - mentions.add(mention); - } - } - status.setMentions(mentions); - } else { - status.setMentions(new ArrayList<>()); - } - - //Retrieves tags - status.setTags(null); - //Retrieves emjis - status.setEmojis(new ArrayList<>()); - //Retrieve Application - Application application = new Application(); - try { - if (resobj.getJSONObject("source") != null) { - application.setName(resobj.getJSONObject("source").toString()); - application.setWebsite(resobj.getJSONObject("source_link").toString()); - } - } catch (Exception e) { - application = new Application(); - } - status.setApplication(application); - if (resobj.has("user")) - status.setAccount(parseAccountResponse(context, resobj.getJSONObject("user"))); - else if (resobj.has("sender")) - status.setAccount(parseAccountResponse(context, resobj.getJSONObject("sender"))); - if (resobj.has("statusnet_html")) - status.setContent(resobj.get("statusnet_html").toString()); - else if (resobj.has("text")) - status.setContent(resobj.get("text").toString()); - if (resobj.has("fave_num")) - status.setFavourites_count(Integer.valueOf(resobj.get("fave_num").toString())); - else - status.setFavourites_count(0); - if (resobj.has("repeat_num")) - status.setReblogs_count(Integer.valueOf(resobj.get("repeat_num").toString())); - else - status.setReblogs_count(0); - status.setReplies_count(0); - try { - status.setReblogged(Boolean.valueOf(resobj.get("repeated").toString())); - } catch (Exception e) { - status.setReblogged(false); - } - try { - status.setFavourited(Boolean.valueOf(resobj.get("favorited").toString())); - } catch (Exception e) { - status.setFavourited(false); - } - if (resobj.has("friendica_activities") && resobj.getJSONObject("friendica_activities").has("like")) { - status.setFavourited(false); - JSONArray jsonArray = resobj.getJSONObject("friendica_activities").getJSONArray("like"); - SharedPreferences sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE); - String userId = sharedpreferences.getString(Helper.PREF_KEY_ID, null); - for (int i = 0; i < jsonArray.length(); i++) { - JSONObject like = jsonArray.getJSONObject(i); - if (like.getString("id").equals(userId)) { - status.setFavourited(true); - break; - } - } - - } - status.setMuted(false); - status.setPinned(false); - try { - status.setReblog(parseStatuses(context, resobj.getJSONObject("retweeted_status"))); - } catch (Exception ignored) { - status.setReblog(null); - } - if (status.getContent().contains(status.getUri())) - status.setNotice(true); - } catch (JSONException ignored) { - ignored.printStackTrace(); - } catch (ParseException e) { - e.printStackTrace(); - - } - status.setViewType(context); - return status; - } - - - /** - * Parse json response for unique schedule - * - * @param resobj JSONObject - * @return Status - */ - @SuppressWarnings("InfiniteRecursion") - private static Status parseSchedule(Context context, JSONObject resobj) { - Status status = new Status(); - try { - status.setIn_reply_to_id(resobj.get("in_reply_to_id").toString()); - status.setSensitive(Boolean.parseBoolean(resobj.get("sensitive").toString())); - status.setSpoiler_text(resobj.get("spoiler_text").toString()); - try { - status.setVisibility(resobj.get("visibility").toString()); - } catch (Exception e) { - status.setVisibility("public"); - } - status.setContent(resobj.get("text").toString()); - } catch (JSONException ignored) { - } - return status; - } - - /** * Parse json response for list of accounts * @@ -2283,57 +2429,6 @@ public class GNUAPI { return accounts; } - /** - * Parse json response an unique account - * - * @param resobj JSONObject - * @return Account - */ - @SuppressWarnings("InfiniteRecursion") - public static Account parseAccountResponse(Context context, JSONObject resobj) { - - Account account = new Account(); - try { - account.setId(resobj.get("id").toString()); - if (resobj.has("ostatus_uri")) - account.setUuid(resobj.get("ostatus_uri").toString()); - else - account.setUuid(resobj.get("id").toString()); - account.setUsername(resobj.get("screen_name").toString()); - account.setAcct(resobj.get("screen_name").toString()); - account.setDisplay_name(resobj.get("name").toString()); - account.setLocked(Boolean.parseBoolean(resobj.get("protected").toString())); - account.setCreated_at(Helper.mstStringToDate(context, resobj.get("created_at").toString())); - account.setFollowers_count(Integer.valueOf(resobj.get("followers_count").toString())); - account.setFollowing_count(Integer.valueOf(resobj.get("friends_count").toString())); - account.setStatuses_count(Integer.valueOf(resobj.get("statuses_count").toString())); - account.setNote(resobj.get("description").toString()); - account.setBot(false); - account.setMoved_to_account(null); - account.setUrl(resobj.get("url").toString()); - account.setAvatar(resobj.get("profile_image_url_https").toString()); - account.setAvatar_static(resobj.get("profile_image_url_https").toString()); - if (!resobj.isNull("background_image")) { - account.setHeader(resobj.get("background_image").toString()); - account.setHeader_static(resobj.get("background_image").toString()); - } else { - account.setHeader("null"); - account.setHeader_static("null"); - } - - if (resobj.has("cid")) - account.setSocial("FRIENDICA"); - else - account.setSocial("GNU"); - account.setEmojis(new ArrayList<>()); - } catch (JSONException ignored) { - } catch (ParseException e) { - e.printStackTrace(); - } - return account; - } - - /** * Parse json response an unique relationship * @@ -2369,7 +2464,6 @@ public class GNUAPI { return relationship; } - /** * Parse json response for list of relationship * @@ -2411,138 +2505,6 @@ public class GNUAPI { return context; } - - /** - * Parse json response for list of relationship - * - * @param jsonArray JSONArray - * @return List - */ - private static List parseAttachmentResponse(JSONArray jsonArray) { - - List attachments = new ArrayList<>(); - try { - int i = 0; - while (i < jsonArray.length()) { - JSONObject resobj = jsonArray.getJSONObject(i); - Attachment attachment = parseAttachmentResponse(resobj); - attachments.add(attachment); - i++; - } - } catch (JSONException ignored) { - } - return attachments; - } - - /** - * Parse json response an unique attachment - * - * @param resobj JSONObject - * @return Relationship - */ - static Attachment parseAttachmentResponse(JSONObject resobj) { - - Attachment attachment = new Attachment(); - try { - if (resobj.has("id")) - attachment.setId(resobj.get("id").toString()); - if (resobj.has("url")) { - attachment.setUrl(resobj.getString("url")); - attachment.setPreview_url(resobj.getString("url")); - attachment.setRemote_url(resobj.getString("url")); - } - - if (attachment.getUrl().endsWith("png") || attachment.getUrl().endsWith("jpg") || attachment.getUrl().endsWith("jpeg")) { - attachment.setType("image"); - } else if (attachment.getUrl().endsWith("gif") || attachment.getUrl().endsWith("apng")) { - attachment.setType("gifv"); - } else if (attachment.getUrl().endsWith("mp4")) { - attachment.setType("video"); - } else { - attachment.setType("web"); - } - - try { - attachment.setDescription(resobj.get("description").toString()); - } catch (JSONException ignore) { - } - try { - attachment.setRemote_url(resobj.get("url").toString()); - } catch (JSONException ignore) { - } - try { - attachment.setPreview_url(resobj.get("thumb_url").toString()); - } catch (JSONException ignore) { - } - try { - attachment.setMeta(resobj.get("meta").toString()); - } catch (JSONException ignore) { - } - try { - attachment.setText_url(resobj.get("text_url").toString()); - } catch (JSONException ignore) { - } - - } catch (JSONException ignored) { - } - return attachment; - } - - /** - * Parse json response an unique attachment - * - * @param resobj JSONObject - * @return Relationship - */ - public static Attachment parseUploadedAttachmentResponse(JSONObject resobj) { - - Attachment attachment = new Attachment(); - try { - if (resobj.has("media_id")) - attachment.setId(resobj.get("media_id").toString()); - if (resobj.has("image") && resobj.getJSONObject("image").has("image_type")) - attachment.setType("Image"); - else if (resobj.has("image") && resobj.getJSONObject("gif").has("image_type")) - attachment.setType("GifV"); - else - attachment.setType("video"); - - try { - attachment.setRemote_url(resobj.get("url").toString()); - } catch (JSONException ignore) { - } - try { - attachment.setPreview_url(resobj.get("thumb_url").toString()); - } catch (JSONException ignore) { - } - - if (resobj.has("image") && resobj.getJSONObject("image").has("friendica_preview_url")) { - attachment.setUrl(resobj.getJSONObject("image").getString("friendica_preview_url")); - attachment.setPreview_url(resobj.getJSONObject("image").getString("friendica_preview_url")); - attachment.setRemote_url(resobj.getJSONObject("image").getString("friendica_preview_url")); - } - if (resobj.has("media_url")) - attachment.setUrl(resobj.get("media_url").toString()); - try { - attachment.setDescription(resobj.get("description").toString()); - } catch (JSONException ignore) { - } - - try { - attachment.setMeta(resobj.get("meta").toString()); - } catch (JSONException ignore) { - } - try { - attachment.setText_url(resobj.get("text_url").toString()); - } catch (JSONException ignore) { - } - - } catch (JSONException ignored) { - ignored.printStackTrace(); - } - return attachment; - } - /** * Parse json response an unique notification * @@ -2593,7 +2555,6 @@ public class GNUAPI { return notifications; } - /** * Set the error message * @@ -2629,12 +2590,10 @@ public class GNUAPI { apiResponse.setError(APIError); } - public Error getError() { return APIError; } - private String getAbsoluteUrl(String action) { return Helper.instanceWithProtocol(this.context, this.instance) + "/api" + action; } @@ -2643,4 +2602,9 @@ public class GNUAPI { return Helper.instanceWithProtocol(this.context, instance) + "/api" + action; } + public enum accountPrivacy { + PUBLIC, + LOCKED + } + } diff --git a/app/src/main/java/app/fedilab/android/client/Glide/TLSLibraryGlideModule.java b/app/src/main/java/app/fedilab/android/client/Glide/TLSLibraryGlideModule.java index 42fa91051..9cc4cfd68 100644 --- a/app/src/main/java/app/fedilab/android/client/Glide/TLSLibraryGlideModule.java +++ b/app/src/main/java/app/fedilab/android/client/Glide/TLSLibraryGlideModule.java @@ -7,9 +7,9 @@ import androidx.annotation.NonNull; import com.bumptech.glide.Glide; import com.bumptech.glide.GlideBuilder; import com.bumptech.glide.Registry; +import com.bumptech.glide.annotation.GlideModule; import com.bumptech.glide.load.model.GlideUrl; import com.bumptech.glide.module.AppGlideModule; -import com.bumptech.glide.annotation.GlideModule; import java.io.InputStream; diff --git a/app/src/main/java/app/fedilab/android/client/HttpsConnection.java b/app/src/main/java/app/fedilab/android/client/HttpsConnection.java index 0a5cb6520..826b862d1 100644 --- a/app/src/main/java/app/fedilab/android/client/HttpsConnection.java +++ b/app/src/main/java/app/fedilab/android/client/HttpsConnection.java @@ -17,14 +17,10 @@ package app.fedilab.android.client; import android.annotation.SuppressLint; import android.content.Context; import android.content.SharedPreferences; -import android.database.sqlite.SQLiteDatabase; import android.os.Build; import android.text.Html; import android.text.SpannableString; -import androidx.fragment.app.FragmentTransaction; - -import com.google.common.io.ByteStreams; import com.google.gson.JsonObject; import net.gotev.uploadservice.MultipartUploadRequest; @@ -49,6 +45,7 @@ import java.net.MalformedURLException; import java.net.PasswordAuthentication; import java.net.Proxy; import java.net.URL; +import java.nio.charset.StandardCharsets; import java.security.KeyManagementException; import java.security.NoSuchAlgorithmException; import java.util.HashMap; @@ -68,7 +65,6 @@ import app.fedilab.android.R; import app.fedilab.android.activities.SlideMediaActivity; import app.fedilab.android.activities.TootActivity; import app.fedilab.android.client.Entities.Error; - import app.fedilab.android.helper.FileNameCleaner; import app.fedilab.android.helper.Helper; import app.fedilab.android.interfaces.OnDownloadInterface; @@ -155,7 +151,7 @@ public class HttpsConnection { if (postData.length() != 0) postData.append('&'); postData.append(param.getKey()); postData.append('='); - postData.append(String.valueOf(param.getValue())); + postData.append(param.getValue()); } URL url = new URL(urlConnection + "?" + postData); if (proxy != null) @@ -217,7 +213,7 @@ public class HttpsConnection { if (postData.length() != 0) postData.append('&'); postData.append(param.getKey()); postData.append('='); - postData.append(String.valueOf(param.getValue())); + postData.append(param.getValue()); } URL url = new URL(urlConnection + "?" + postData); if (proxy != null) @@ -370,9 +366,9 @@ public class HttpsConnection { if (postData.length() != 0) postData.append('&'); postData.append(param.getKey()); postData.append('='); - postData.append(String.valueOf(param.getValue())); + postData.append(param.getValue()); } - byte[] postDataBytes = postData.toString().getBytes("UTF-8"); + byte[] postDataBytes = postData.toString().getBytes(StandardCharsets.UTF_8); if (proxy != null) httpsURLConnection = (HttpsURLConnection) url.openConnection(proxy); else @@ -436,9 +432,9 @@ public class HttpsConnection { if (postData.length() != 0) postData.append('&'); postData.append(param.getKey()); postData.append('='); - postData.append(String.valueOf(param.getValue())); + postData.append(param.getValue()); } - byte[] postDataBytes = postData.toString().getBytes("UTF-8"); + byte[] postDataBytes = postData.toString().getBytes(StandardCharsets.UTF_8); if (proxy != null) httpURLConnection = (HttpURLConnection) url.openConnection(proxy); @@ -494,7 +490,7 @@ public class HttpsConnection { if (urlConnection.startsWith("https://")) { URL url = new URL(urlConnection); byte[] postDataBytes = new byte[0]; - postDataBytes = jsonObject.toString().getBytes("UTF-8"); + postDataBytes = jsonObject.toString().getBytes(StandardCharsets.UTF_8); if (proxy != null) httpsURLConnection = (HttpsURLConnection) url.openConnection(proxy); else @@ -546,7 +542,7 @@ public class HttpsConnection { return response; } else { URL url = new URL(urlConnection); - byte[] postDataBytes = jsonObject.toString().getBytes("UTF-8"); + byte[] postDataBytes = jsonObject.toString().getBytes(StandardCharsets.UTF_8); if (proxy != null) httpURLConnection = (HttpURLConnection) url.openConnection(proxy); @@ -599,7 +595,7 @@ public class HttpsConnection { public String postMisskey(String urlConnection, int timeout, JSONObject paramaters, String token) throws IOException, NoSuchAlgorithmException, KeyManagementException, HttpsConnectionException { URL url = new URL(urlConnection); - byte[] postDataBytes = paramaters.toString().getBytes("UTF-8"); + byte[] postDataBytes = paramaters.toString().getBytes(StandardCharsets.UTF_8); if (proxy != null) httpsURLConnection = (HttpsURLConnection) url.openConnection(proxy); @@ -687,8 +683,8 @@ public class HttpsConnection { } } else { // extracts file name from URL - fileName = downloadUrl.substring(downloadUrl.lastIndexOf("/") + 1, - downloadUrl.length()); + fileName = downloadUrl.substring(downloadUrl.lastIndexOf("/") + 1 + ); } fileName = FileNameCleaner.cleanFileName(fileName); // opens input stream from the HTTP connection @@ -775,8 +771,8 @@ public class HttpsConnection { } } else { // extracts file name from URL - fileName = downloadUrl.substring(downloadUrl.lastIndexOf("/") + 1, - downloadUrl.length()); + fileName = downloadUrl.substring(downloadUrl.lastIndexOf("/") + 1 + ); } fileName = FileNameCleaner.cleanFileName(fileName); // opens input stream from the HTTP connection @@ -896,11 +892,6 @@ public class HttpsConnection { } } - enum imageType { - AVATAR, - BANNER - } - private void uploadMedia(String urlConnection, InputStream avatar, InputStream header, String filename) { UploadNotificationConfig uploadConfig = new UploadNotificationConfig(); uploadConfig.getCompleted().autoClear = true; @@ -962,7 +953,6 @@ public class HttpsConnection { } } - @SuppressWarnings("SameParameterValue") public String patch(String urlConnection, int timeout, HashMap paramaters, InputStream avatar, String avatarName, InputStream header, String headerName, String token) throws IOException, NoSuchAlgorithmException, KeyManagementException, HttpsConnectionException { if (urlConnection.startsWith("https://")) { @@ -981,9 +971,9 @@ public class HttpsConnection { if (postData.length() != 0) postData.append('&'); postData.append(param.getKey()); postData.append('='); - postData.append(String.valueOf(param.getValue())); + postData.append(param.getValue()); } - byte[] postDataBytes = (postData.toString()).getBytes("UTF-8"); + byte[] postDataBytes = (postData.toString()).getBytes(StandardCharsets.UTF_8); if (proxy != null) @@ -1063,9 +1053,9 @@ public class HttpsConnection { if (postData.length() != 0) postData.append('&'); postData.append(param.getKey()); postData.append('='); - postData.append(String.valueOf(param.getValue())); + postData.append(param.getValue()); } - byte[] postDataBytes = (postData.toString()).getBytes("UTF-8"); + byte[] postDataBytes = (postData.toString()).getBytes(StandardCharsets.UTF_8); if (proxy != null) httpURLConnection = (HttpsURLConnection) url.openConnection(proxy); @@ -1129,7 +1119,6 @@ public class HttpsConnection { } - public String put(String urlConnection, int timeout, HashMap paramaters, String token) throws IOException, NoSuchAlgorithmException, KeyManagementException, HttpsConnectionException { if (urlConnection.startsWith("https://")) { URL url = new URL(urlConnection); @@ -1147,9 +1136,9 @@ public class HttpsConnection { if (postData.length() != 0) postData.append('&'); postData.append(param.getKey()); postData.append('='); - postData.append(String.valueOf(param.getValue())); + postData.append(param.getValue()); } - byte[] postDataBytes = postData.toString().getBytes("UTF-8"); + byte[] postDataBytes = postData.toString().getBytes(StandardCharsets.UTF_8); if (proxy != null) httpsURLConnection = (HttpsURLConnection) url.openConnection(proxy); @@ -1215,9 +1204,9 @@ public class HttpsConnection { if (postData.length() != 0) postData.append('&'); postData.append(param.getKey()); postData.append('='); - postData.append(String.valueOf(param.getValue())); + postData.append(param.getValue()); } - byte[] postDataBytes = postData.toString().getBytes("UTF-8"); + byte[] postDataBytes = postData.toString().getBytes(StandardCharsets.UTF_8); if (proxy != null) httpURLConnection = (HttpURLConnection) url.openConnection(proxy); @@ -1270,7 +1259,6 @@ public class HttpsConnection { } - public int delete(String urlConnection, int timeout, HashMap paramaters, String token) throws IOException, NoSuchAlgorithmException, KeyManagementException, HttpsConnectionException { if (urlConnection.startsWith("https://")) { URL url = new URL(urlConnection); @@ -1288,9 +1276,9 @@ public class HttpsConnection { if (postData.length() != 0) postData.append('&'); postData.append(param.getKey()); postData.append('='); - postData.append(String.valueOf(param.getValue())); + postData.append(param.getValue()); } - byte[] postDataBytes = postData.toString().getBytes("UTF-8"); + byte[] postDataBytes = postData.toString().getBytes(StandardCharsets.UTF_8); if (proxy != null) httpsURLConnection = (HttpsURLConnection) url.openConnection(proxy); @@ -1351,9 +1339,9 @@ public class HttpsConnection { if (postData.length() != 0) postData.append('&'); postData.append(param.getKey()); postData.append('='); - postData.append(String.valueOf(param.getValue())); + postData.append(param.getValue()); } - byte[] postDataBytes = postData.toString().getBytes("UTF-8"); + byte[] postDataBytes = postData.toString().getBytes(StandardCharsets.UTF_8); if (proxy != null) httpURLConnection = (HttpURLConnection) url.openConnection(proxy); @@ -1410,7 +1398,6 @@ public class HttpsConnection { return max_id; } - private void getSinceMaxId() { if (Helper.getLiveInstanceWithProtocol(context) == null) return; @@ -1464,7 +1451,6 @@ public class HttpsConnection { return s.hasNext() ? s.next() : ""; } - int getActionCode() { if (Helper.getLiveInstanceWithProtocol(context).startsWith("https://")) { try { @@ -1481,6 +1467,12 @@ public class HttpsConnection { } } + + enum imageType { + AVATAR, + BANNER + } + public class HttpsConnectionException extends Exception { private int statusCode; diff --git a/app/src/main/java/app/fedilab/android/client/PeertubeAPI.java b/app/src/main/java/app/fedilab/android/client/PeertubeAPI.java index b70f6d250..117977fc3 100644 --- a/app/src/main/java/app/fedilab/android/client/PeertubeAPI.java +++ b/app/src/main/java/app/fedilab/android/client/PeertubeAPI.java @@ -138,1447 +138,6 @@ public class PeertubeAPI { APIError = null; } - - /*** - * Get info on the current Instance *synchronously* - * @return APIResponse - */ - public APIResponse getInstance() { - try { - String response = new HttpsConnection(context, this.instance).get(getAbsoluteUrl("/instance"), 30, null, prefKeyOauthTokenT); - Instance instanceEntity = parseInstance(new JSONObject(response)); - apiResponse.setInstance(instanceEntity); - } catch (HttpsConnection.HttpsConnectionException e) { - setError(e.getStatusCode(), e); - } catch (NoSuchAlgorithmException e) { - e.printStackTrace(); - } catch (IOException e) { - e.printStackTrace(); - } catch (KeyManagementException e) { - e.printStackTrace(); - } catch (JSONException e) { - e.printStackTrace(); - } - return apiResponse; - } - - - /** - * Update video meta data *synchronously* - * - * @param peertube Peertube - * @return APIResponse - */ - @SuppressWarnings("SameParameterValue") - public APIResponse updateVideo(Peertube peertube) { - - LinkedHashMap params = new LinkedHashMap<>(); - - params.put("name", peertube.getName()); - //Category - Map.Entry categoryM = peertube.getCategory().entrySet().iterator().next(); - Integer idCategory = categoryM.getKey(); - params.put("category", String.valueOf(idCategory)); - //License - Map.Entry licenseM = peertube.getLicense().entrySet().iterator().next(); - Integer idLicense = licenseM.getKey(); - params.put("licence", String.valueOf(idLicense)); - //language - Map.Entry languagesM = peertube.getLanguage().entrySet().iterator().next(); - String iDlanguage = languagesM.getKey(); - params.put("language", iDlanguage); - params.put("support", "null"); - params.put("description", peertube.getDescription()); - //Channel - Map.Entry channelsM = peertube.getChannelForUpdate().entrySet().iterator().next(); - String iDChannel = channelsM.getValue(); - params.put("channelId", iDChannel); - //Privacy - Map.Entry privacyM = peertube.getPrivacy().entrySet().iterator().next(); - Integer idPrivacy = privacyM.getKey(); - params.put("privacy", String.valueOf(idPrivacy)); - if (peertube.getTags() != null && peertube.getTags().size() > 0) { - StringBuilder parameters = new StringBuilder(); - parameters.append("[]&"); - for (String tag : peertube.getTags()) - parameters.append("tags=").append(tag).append("&"); - String strParam = parameters.toString(); - strParam = strParam.substring(0, strParam.length() - 1); - params.put("tags[]", strParam); - } else { - params.put("tags", "null"); - } - params.put("nsfw", String.valueOf(peertube.isSensitive())); - params.put("waitTranscoding", "true"); - params.put("commentsEnabled", String.valueOf(peertube.isCommentsEnabled())); - params.put("scheduleUpdate", "null"); - List peertubes = new ArrayList<>(); - try { - HttpsConnection httpsConnection = new HttpsConnection(context, this.instance); - httpsConnection.put(getAbsoluteUrl(String.format("/videos/%s", peertube.getId())), 60, params, prefKeyOauthTokenT); - peertubes.add(peertube); - } catch (HttpsConnection.HttpsConnectionException e) { - setError(e.getStatusCode(), e); - e.printStackTrace(); - } catch (NoSuchAlgorithmException e) { - e.printStackTrace(); - } catch (IOException e) { - e.printStackTrace(); - } catch (KeyManagementException e) { - e.printStackTrace(); - } - apiResponse.setPeertubes(peertubes); - return apiResponse; - } - - - /*** - * Verifiy credential of the authenticated user *synchronously* - * @return Account - */ - public PeertubeInformation getPeertubeInformation() throws HttpsConnection.HttpsConnectionException { - PeertubeInformation peertubeInformation = new PeertubeInformation(); - try { - - String response = new HttpsConnection(context, this.instance).get(getAbsoluteUrl("/videos/categories"), 60, null, null); - JSONObject categories = new JSONObject(response); - LinkedHashMap _pcategories = new LinkedHashMap<>(); - for (int i = 1; i <= categories.length(); i++) { - _pcategories.put(i, categories.getString(String.valueOf(i))); - - } - peertubeInformation.setCategories(_pcategories); - - response = new HttpsConnection(context, this.instance).get(getAbsoluteUrl("/videos/languages"), 60, null, null); - JSONObject languages = new JSONObject(response); - LinkedHashMap _languages = new LinkedHashMap<>(); - Iterator iter = languages.keys(); - while (iter.hasNext()) { - String key = iter.next(); - try { - _languages.put(key, (String) languages.get(key)); - } catch (JSONException ignored) { - } - } - peertubeInformation.setLanguages(_languages); - - response = new HttpsConnection(context, this.instance).get(getAbsoluteUrl("/videos/privacies"), 60, null, null); - JSONObject privacies = new JSONObject(response); - LinkedHashMap _pprivacies = new LinkedHashMap<>(); - for (int i = 1; i <= privacies.length(); i++) { - _pprivacies.put(i, privacies.getString(String.valueOf(i))); - - } - peertubeInformation.setPrivacies(_pprivacies); - - - response = new HttpsConnection(context, this.instance).get(getAbsoluteUrl("/video-playlists/privacies"), 60, null, null); - JSONObject plprivacies = new JSONObject(response); - LinkedHashMap _plprivacies = new LinkedHashMap<>(); - for (int i = 1; i <= plprivacies.length(); i++) { - _plprivacies.put(i, plprivacies.getString(String.valueOf(i))); - - } - peertubeInformation.setPlaylistPrivacies(_plprivacies); - - response = new HttpsConnection(context, this.instance).get(getAbsoluteUrl("/videos/licences"), 60, null, null); - JSONObject licences = new JSONObject(response); - LinkedHashMap _plicences = new LinkedHashMap<>(); - for (int i = 1; i <= licences.length(); i++) { - _plicences.put(i, licences.getString(String.valueOf(i))); - - } - peertubeInformation.setLicences(_plicences); - - - String instance = Helper.getLiveInstance(context); - String lang = null; - if (PeertubeInformation.langueMapped.containsKey(Locale.getDefault().getLanguage())) - lang = PeertubeInformation.langueMapped.get(Locale.getDefault().getLanguage()); - - if (lang != null && !lang.startsWith("en")) { - response = new HttpsConnection(context, this.instance).get(String.format("https://" + instance + "/client/locales/%s/server.json", lang), 60, null, null); - JSONObject translations = new JSONObject(response); - LinkedHashMap _translations = new LinkedHashMap<>(); - Iterator itertrans = translations.keys(); - while (itertrans.hasNext()) { - String key = itertrans.next(); - try { - _translations.put(key, (String) translations.get(key)); - } catch (JSONException ignored) { - } - } - peertubeInformation.setTranslations(_translations); - } - - } catch (NoSuchAlgorithmException e) { - e.printStackTrace(); - } catch (IOException e) { - e.printStackTrace(); - } catch (KeyManagementException e) { - e.printStackTrace(); - } catch (JSONException e) { - e.printStackTrace(); - } - return peertubeInformation; - } - - /*** - * Verifiy credential of the authenticated user *synchronously* - * @return Account - */ - public Account verifyCredentials() { - account = new Account(); - InstanceNodeInfo nodeinfo = new API(context).displayNodeInfo(instance); - String social = null; - if( nodeinfo != null){ - social = nodeinfo.getName(); - } - try { - String response = new HttpsConnection(context, this.instance).get(getAbsoluteUrl("/users/me"), 60, null, prefKeyOauthTokenT); - JSONObject accountObject = new JSONObject(response).getJSONObject("account"); - account = parseAccountResponsePeertube(context, accountObject); - if( social != null ) { - account.setSocial(social.toUpperCase()); - } - } catch (NoSuchAlgorithmException | IOException | KeyManagementException | JSONException e) { - e.printStackTrace(); - } catch (HttpsConnection.HttpsConnectionException e) { - if (e.getStatusCode() == 401 || e.getStatusCode() == 403) { - SQLiteDatabase db = Sqlite.getInstance(context, Sqlite.DB_NAME, null, Sqlite.DB_VERSION).open(); - Account targetedAccount = new AccountDAO(context, db).getAccountByToken(prefKeyOauthTokenT); - HashMap values = refreshToken(targetedAccount.getClient_id(), targetedAccount.getClient_secret(), targetedAccount.getRefresh_token()); - if (values.containsKey("access_token") && values.get("access_token") != null) { - targetedAccount.setToken(values.get("access_token")); - SharedPreferences sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE); - String token = sharedpreferences.getString(Helper.PREF_KEY_OAUTH_TOKEN, null); - //This account is currently logged in, the token is updated - if (prefKeyOauthTokenT.equals(token)) { - SharedPreferences.Editor editor = sharedpreferences.edit(); - editor.putString(Helper.PREF_KEY_OAUTH_TOKEN, targetedAccount.getToken()); - editor.apply(); - } - } - if (values.containsKey("refresh_token") && values.get("refresh_token") != null) - targetedAccount.setRefresh_token(values.get("refresh_token")); - new AccountDAO(context, db).updateAccount(targetedAccount); - - String response; - try { - response = new HttpsConnection(context, this.instance).get(getAbsoluteUrl("/users/me"), 60, null, targetedAccount.getToken()); - JSONObject accountObject = new JSONObject(response).getJSONObject("account"); - account = parseAccountResponsePeertube(context, accountObject); - if( social != null ) { - account.setSocial(social.toUpperCase()); - } - } catch (IOException | NoSuchAlgorithmException | KeyManagementException | JSONException e1) { - e1.printStackTrace(); - } catch (HttpsConnection.HttpsConnectionException e1) { - e1.printStackTrace(); - setError(e.getStatusCode(), e); - } - e.printStackTrace(); - } - } - return account; - } - - - /*** - * Get instance for registering an account *synchronously* - * @return APIResponse - */ - public APIResponse getInstanceReg() { - apiResponse = new APIResponse(); - try { - String response = new HttpsConnection(context, null).get("https://instances.joinpeertube.org/api/v1/instances?start=0&count=50&signup=true&health=100&sort=-totalUsers"); - JSONObject result = new JSONObject(response); - List instanceRegs = parseInstanceReg(result.getJSONArray("data")); - apiResponse.setInstanceRegs(instanceRegs); - } catch (HttpsConnection.HttpsConnectionException e) { - setError(e.getStatusCode(), e); - } catch (NoSuchAlgorithmException | IOException | KeyManagementException | JSONException e) { - e.printStackTrace(); - } - return apiResponse; - } - - - - public APIResponse createAccount(AccountCreation accountCreation) { - apiResponse = new APIResponse(); - - try { - HashMap params = new HashMap<>(); - params.put("username", accountCreation.getUsername()); - params.put("email", accountCreation.getEmail()); - params.put("password", accountCreation.getPassword()); - String response = new HttpsConnection(context, this.instance).post(getAbsoluteUrl("/users/register"), 30, params, null); - - } catch (NoSuchAlgorithmException | IOException | KeyManagementException e) { - e.printStackTrace(); - } catch (HttpsConnection.HttpsConnectionException e) { - setError(e.getStatusCode(), e); - e.printStackTrace(); - } - return apiResponse; - } - - /*** - * Verifiy credential of the authenticated user *synchronously* - * @return Account - */ - private HashMap refreshToken(String client_id, String client_secret, String refresh_token) { - account = new Account(); - HashMap params = new HashMap<>(); - HashMap newValues = new HashMap<>(); - params.put("grant_type", "refresh_token"); - params.put("client_id", client_id); - params.put("client_secret", client_secret); - params.put("refresh_token", refresh_token); - try { - String response = new HttpsConnection(context, this.instance).post(getAbsoluteUrl("/users/token"), 60, params, null); - JSONObject resobj = new JSONObject(response); - String token = resobj.get("access_token").toString(); - if (resobj.has("refresh_token")) - refresh_token = resobj.get("refresh_token").toString(); - newValues.put("access_token", token); - newValues.put("refresh_token", refresh_token); - } catch (NoSuchAlgorithmException e) { - e.printStackTrace(); - } catch (IOException e) { - e.printStackTrace(); - } catch (KeyManagementException e) { - e.printStackTrace(); - } catch (JSONException e) { - e.printStackTrace(); - } catch (HttpsConnection.HttpsConnectionException e) { - e.printStackTrace(); - } - return newValues; - } - - - /** - * Returns an account - * - * @param accountId String account fetched - * @return Account entity - */ - public Account getAccount(String accountId) { - - account = new Account(); - try { - String response = new HttpsConnection(context, this.instance).get(getAbsoluteUrl(String.format("/accounts/%s", accountId)), 60, null, prefKeyOauthTokenT); - account = parseAccountResponsePeertube(context, new JSONObject(response)); - } catch (HttpsConnection.HttpsConnectionException e) { - e.printStackTrace(); - setError(e.getStatusCode(), e); - } catch (NoSuchAlgorithmException e) { - e.printStackTrace(); - } catch (IOException e) { - e.printStackTrace(); - } catch (KeyManagementException e) { - e.printStackTrace(); - } catch (JSONException e) { - e.printStackTrace(); - } - return account; - } - - - /** - * Returns a relationship between the authenticated account and an account - * - * @param uri String accounts fetched - * @return Relationship entity - */ - public boolean isFollowing(String uri) { - HashMap params = new HashMap<>(); - - params.put("uris", uri); - - try { - HttpsConnection httpsConnection = new HttpsConnection(context, this.instance); - String response = httpsConnection.get(getAbsoluteUrl("/users/me/subscriptions/exist"), 60, params, prefKeyOauthTokenT); - return new JSONObject(response).getBoolean(uri); - } catch (HttpsConnection.HttpsConnectionException e) { - setError(e.getStatusCode(), e); - } catch (NoSuchAlgorithmException e) { - e.printStackTrace(); - } catch (IOException e) { - e.printStackTrace(); - } catch (KeyManagementException e) { - e.printStackTrace(); - } catch (JSONException e) { - e.printStackTrace(); - } - return false; - } - - - /** - * Retrieves videos for the account *synchronously* - * - * @param acct String Id of the account - * @param max_id String id max - * @return APIResponse - */ - public APIResponse getVideos(String acct, String max_id) { - return getVideos(acct, max_id, null); - } - - /** - * Retrieves history for videos for the account *synchronously* - * - * @param max_id String id max - * @return APIResponse - */ - public APIResponse getMyHistory(String max_id) { - return getMyHistory(max_id, null); - } - - - /** - * Retrieves history for videos for the account *synchronously* - * - * @param max_id String id max - * @param since_id String since the id - * @return APIResponse - */ - @SuppressWarnings("SameParameterValue") - private APIResponse getMyHistory(String max_id, String since_id) { - - HashMap params = new HashMap<>(); - if (max_id != null) - params.put("start", max_id); - if (since_id != null) - params.put("since_id", since_id); - params.put("count", String.valueOf(tootPerPage)); - List peertubes = new ArrayList<>(); - try { - - HttpsConnection httpsConnection = new HttpsConnection(context, this.instance); - String response = httpsConnection.get(getAbsoluteUrl("/users/me/history/videos"), 60, params, prefKeyOauthTokenT); - - JSONArray jsonArray = new JSONObject(response).getJSONArray("data"); - peertubes = parsePeertube(jsonArray); - - } catch (HttpsConnection.HttpsConnectionException e) { - setError(e.getStatusCode(), e); - e.printStackTrace(); - } catch (NoSuchAlgorithmException e) { - e.printStackTrace(); - } catch (IOException e) { - e.printStackTrace(); - } catch (KeyManagementException e) { - e.printStackTrace(); - } catch (JSONException e) { - e.printStackTrace(); - } - apiResponse.setPeertubes(peertubes); - return apiResponse; - } - - /** - * Retrieves videos for the account *synchronously* - * - * @param max_id String id max - * @return APIResponse - */ - public APIResponse getMyVideos(String max_id) { - return getMyVideos(max_id, null); - } - - - /** - * Retrieves status for the account *synchronously* - * - * @param max_id String id max - * @param since_id String since the id - * @return APIResponse - */ - @SuppressWarnings("SameParameterValue") - private APIResponse getMyVideos(String max_id, String since_id) { - - HashMap params = new HashMap<>(); - if (max_id != null) - params.put("start", max_id); - if (since_id != null) - params.put("since_id", since_id); - params.put("count", String.valueOf(tootPerPage)); - List peertubes = new ArrayList<>(); - try { - - HttpsConnection httpsConnection = new HttpsConnection(context, this.instance); - String response = httpsConnection.get(getAbsoluteUrl("/users/me/videos"), 60, params, prefKeyOauthTokenT); - - JSONArray jsonArray = new JSONObject(response).getJSONArray("data"); - peertubes = parsePeertube(jsonArray); - - } catch (HttpsConnection.HttpsConnectionException e) { - setError(e.getStatusCode(), e); - e.printStackTrace(); - } catch (NoSuchAlgorithmException e) { - e.printStackTrace(); - } catch (IOException e) { - e.printStackTrace(); - } catch (KeyManagementException e) { - e.printStackTrace(); - } catch (JSONException e) { - e.printStackTrace(); - } - apiResponse.setPeertubes(peertubes); - return apiResponse; - } - - - /** - * Retrieves status for the account *synchronously* - * - * @param acct String Id of the account - * @param max_id String id max - * @param since_id String since the id - * @return APIResponse - */ - @SuppressWarnings("SameParameterValue") - private APIResponse getVideos(String acct, String max_id, String since_id) { - - HashMap params = new HashMap<>(); - if (max_id != null) - params.put("start", max_id); - if (since_id != null) - params.put("since_id", since_id); - params.put("count", String.valueOf(tootPerPage)); - List peertubes = new ArrayList<>(); - try { - HttpsConnection httpsConnection = new HttpsConnection(context, this.instance); - String response = httpsConnection.get(getAbsoluteUrl(String.format("/accounts/%s/videos", acct)), 60, params, prefKeyOauthTokenT); - JSONArray jsonArray = new JSONObject(response).getJSONArray("data"); - peertubes = parsePeertube(jsonArray); - - } catch (HttpsConnection.HttpsConnectionException e) { - setError(e.getStatusCode(), e); - e.printStackTrace(); - } catch (NoSuchAlgorithmException e) { - e.printStackTrace(); - } catch (IOException e) { - e.printStackTrace(); - } catch (KeyManagementException e) { - e.printStackTrace(); - } catch (JSONException e) { - e.printStackTrace(); - } - apiResponse.setPeertubes(peertubes); - return apiResponse; - } - - /** - * Retrieves Peertube notifications for the account *synchronously* - * - * @param max_id String id max - * @return APIResponse - */ - public APIResponse getNotifications(String max_id) { - return getNotifications(max_id, null); - } - - /** - * Retrieves Peertube notifications since id for the account *synchronously* - * - * @param since_id String id since - * @return APIResponse - */ - public APIResponse getNotificationsSince(String since_id) { - return getNotifications(null, since_id); - } - - /** - * Retrieves Peertube notifications for the account *synchronously* - * - * @param max_id String id max - * @param since_id String since the id - * @return APIResponse - */ - @SuppressWarnings("SameParameterValue") - private APIResponse getNotifications(String max_id, String since_id) { - - HashMap params = new HashMap<>(); - if (max_id != null) - params.put("start", max_id); - if (since_id != null) - params.put("since_id", since_id); - params.put("count", String.valueOf(tootPerPage)); - List peertubeNotifications = new ArrayList<>(); - try { - HttpsConnection httpsConnection = new HttpsConnection(context, this.instance); - String response = httpsConnection.get(getAbsoluteUrl("/users/me/notifications"), 60, params, prefKeyOauthTokenT); - JSONArray jsonArray = new JSONObject(response).getJSONArray("data"); - peertubeNotifications = parsePeertubeNotifications(jsonArray); - } catch (HttpsConnection.HttpsConnectionException e) { - setError(e.getStatusCode(), e); - e.printStackTrace(); - } catch (NoSuchAlgorithmException e) { - e.printStackTrace(); - } catch (IOException e) { - e.printStackTrace(); - } catch (KeyManagementException e) { - e.printStackTrace(); - } catch (JSONException e) { - e.printStackTrace(); - } - apiResponse.setPeertubeNotifications(peertubeNotifications); - return apiResponse; - } - - - /** - * Retrieves videos channel for the account *synchronously* - * - * @param acct String Id of the account - * @param max_id String id max - * @return APIResponse - */ - public APIResponse getVideosChannel(String acct, String max_id) { - return getVideosChannel(acct, max_id, null); - } - - /** - * Retrieves status for the account *synchronously* - * - * @param acct String Id of the account - * @param max_id String id max - * @param since_id String since the id - * @return APIResponse - */ - @SuppressWarnings("SameParameterValue") - private APIResponse getVideosChannel(String acct, String max_id, String since_id) { - - HashMap params = new HashMap<>(); - if (max_id != null) - params.put("start", max_id); - if (since_id != null) - params.put("since_id", since_id); - params.put("count", String.valueOf(tootPerPage)); - List peertubes = new ArrayList<>(); - try { - - HttpsConnection httpsConnection = new HttpsConnection(context, this.instance); - String response = httpsConnection.get(getAbsoluteUrl(String.format("/video-channels/%s/videos", acct)), 60, params, prefKeyOauthTokenT); - - JSONArray jsonArray = new JSONObject(response).getJSONArray("data"); - peertubes = parsePeertube(jsonArray); - - } catch (HttpsConnection.HttpsConnectionException e) { - setError(e.getStatusCode(), e); - e.printStackTrace(); - } catch (NoSuchAlgorithmException e) { - e.printStackTrace(); - } catch (IOException e) { - e.printStackTrace(); - } catch (KeyManagementException e) { - e.printStackTrace(); - } catch (JSONException e) { - e.printStackTrace(); - } - apiResponse.setPeertubes(peertubes); - return apiResponse; - } - - - /** - * Retrieves subscription videos *synchronously* - * - * @param max_id String id max - * @return APIResponse - */ - public APIResponse getSubscriptionsTL(String max_id) { - try { - return getTL("/users/me/subscriptions/videos", "-publishedAt", null, max_id, null, null); - } catch (HttpsConnection.HttpsConnectionException e) { - if (e.getStatusCode() == 401 || e.getStatusCode() == 403) { - SQLiteDatabase db = Sqlite.getInstance(context, Sqlite.DB_NAME, null, Sqlite.DB_VERSION).open(); - Account targetedAccount = new AccountDAO(context, db).getAccountByToken(prefKeyOauthTokenT); - HashMap values = refreshToken(targetedAccount.getClient_id(), targetedAccount.getClient_secret(), targetedAccount.getRefresh_token()); - SharedPreferences sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE); - if (values.containsKey("access_token") && values.get("access_token") != null) { - targetedAccount.setToken(values.get("access_token")); - String token = sharedpreferences.getString(Helper.PREF_KEY_OAUTH_TOKEN, null); - //This account is currently logged in, the token is updated - SharedPreferences.Editor editor = sharedpreferences.edit(); - prefKeyOauthTokenT = targetedAccount.getToken(); - editor.putString(Helper.PREF_KEY_OAUTH_TOKEN, targetedAccount.getToken()); - editor.apply(); - } - if (values.containsKey("refresh_token") && values.get("refresh_token") != null) - targetedAccount.setRefresh_token(values.get("refresh_token")); - new AccountDAO(context, db).updateAccount(targetedAccount); - try { - return getTL("/users/me/subscriptions/videos", "-publishedAt", null, max_id, null, null); - } catch (HttpsConnection.HttpsConnectionException e1) { - setError(e.getStatusCode(), e); - return apiResponse; - } - } - setError(e.getStatusCode(), e); - return apiResponse; - } - } - - /** - * Retrieves overview videos *synchronously* - * - * @param max_id String id max - * @return APIResponse - */ - public APIResponse getOverviewTL(String max_id) { - try { - return getTL("/overviews/videos", null, null, max_id, null, null); - } catch (HttpsConnection.HttpsConnectionException e) { - setError(e.getStatusCode(), e); - return apiResponse; - } - } - - /** - * Retrieves trending videos *synchronously* - * - * @param max_id String id max - * @return APIResponse - */ - public APIResponse getTrendingTL(String max_id) { - try { - return getTL("/videos/", "-trending", null, max_id, null, null); - } catch (HttpsConnection.HttpsConnectionException e) { - setError(e.getStatusCode(), e); - return apiResponse; - } - } - - /** - * Retrieves trending videos *synchronously* - * - * @param max_id String id max - * @return APIResponse - */ - public APIResponse getRecentlyAddedTL(String max_id) { - try { - return getTL("/videos/", "-publishedAt", null, max_id, null, null); - } catch (HttpsConnection.HttpsConnectionException e) { - setError(e.getStatusCode(), e); - return apiResponse; - } - } - - /** - * Retrieves trending videos *synchronously* - * - * @param max_id String id max - * @return APIResponse - */ - public APIResponse getLocalTL(String max_id) { - try { - return getTL("/videos/", "-publishedAt", "local", max_id, null, null); - } catch (HttpsConnection.HttpsConnectionException e) { - setError(e.getStatusCode(), e); - return apiResponse; - } - } - - /** - * Retrieves home timeline for the account since an Id value *synchronously* - * - * @return APIResponse - */ - public APIResponse getSubscriptionsTLSinceId(String since_id) { - try { - return getTL("/users/me/subscriptions/videos", null, null, null, since_id, null); - } catch (HttpsConnection.HttpsConnectionException e) { - setError(e.getStatusCode(), e); - return apiResponse; - } - } - - /** - * Retrieves home timeline for the account from a min Id value *synchronously* - * - * @return APIResponse - */ - public APIResponse getSubscriptionsTLMinId(String min_id) { - try { - return getTL("/users/me/subscriptions/videos", null, null, null, null, min_id); - } catch (HttpsConnection.HttpsConnectionException e) { - setError(e.getStatusCode(), e); - return apiResponse; - } - } - - - /** - * Retrieves home timeline for the account *synchronously* - * - * @param max_id String id max - * @param since_id String since the id - * @return APIResponse - */ - private APIResponse getTL(String action, String sort, String filter, String max_id, String since_id, String min_id) throws HttpsConnection.HttpsConnectionException { - - HashMap params = new HashMap<>(); - if (max_id != null) - params.put("start", max_id); - if (since_id != null) - params.put("since_id", since_id); - if (min_id != null) - params.put("min_id", min_id); - params.put("count", String.valueOf(tootPerPage)); - if (sort != null) - params.put("sort", sort); - else - params.put("sort", "publishedAt"); - if (filter != null) - params.put("filter", filter); - SharedPreferences sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE); - boolean nsfw = sharedpreferences.getBoolean(Helper.SET_VIDEO_NSFW, false); - params.put("nsfw", String.valueOf(nsfw)); - List peertubes = new ArrayList<>(); - try { - HttpsConnection httpsConnection = new HttpsConnection(context, this.instance); - String response = httpsConnection.get(getAbsoluteUrl(action), 60, params, prefKeyOauthTokenT); - // Helper.largeLog(response); - if (!action.equals("/overviews/videos")) { - JSONArray values = new JSONObject(response).getJSONArray("data"); - peertubes = parsePeertube(values); - } else { - JSONArray categories = new JSONObject(response).getJSONArray("categories"); - JSONArray channels = new JSONObject(response).getJSONArray("channels"); - JSONArray tags = new JSONObject(response).getJSONArray( "tags"); - - for (int i = 0; i < categories.length(); i++) { - JSONArray categoriesVideos = categories.getJSONObject(i).getJSONArray("videos"); - List peertubeCategories = parsePeertube(categoriesVideos); - if (peertubeCategories != null && peertubeCategories.size() > 0) { - peertubeCategories.get(0).setHeaderType("categories"); - peertubeCategories.get(0).setHeaderTypeValue(categories.getJSONObject(i).getJSONObject("category").getString("label")); - peertubes.addAll(peertubeCategories); - } - } - - - for (int i = 0; i < channels.length(); i++) { - JSONArray channelsVideos = channels.getJSONObject(i).getJSONArray("videos"); - List peertubeChannels = parsePeertube(channelsVideos); - if (peertubeChannels != null && peertubeChannels.size() > 0) { - peertubeChannels.get(0).setHeaderType("channels"); - peertubeChannels.get(0).setHeaderTypeValue(channels.getJSONObject(i).getJSONObject("channel").getString("displayName")); - peertubes.addAll(peertubeChannels); - } - } - - for (int i = 0; i < tags.length(); i++) { - JSONArray tagsVideos = tags.getJSONObject(i).getJSONArray("videos"); - List peertubeTags = parsePeertube(tagsVideos); - if (peertubeTags != null && peertubeTags.size() > 0) { - peertubeTags.get(0).setHeaderType("tags"); - peertubeTags.get(0).setHeaderTypeValue(tags.getJSONObject(i).getString("tag")); - peertubes.addAll(peertubeTags); - } - } - - - } - } catch (NoSuchAlgorithmException | IOException | KeyManagementException | JSONException e) { - e.printStackTrace(); - } - apiResponse.setPeertubes(peertubes); - return apiResponse; - } - - - /** - * Retrieves Peertube channel from an account *synchronously* - * Peertube channels are dealt like accounts - * - * @return APIResponse - */ - public APIResponse getPeertubeChannel(String name) { - - List accounts = new ArrayList<>(); - try { - HttpsConnection httpsConnection = new HttpsConnection(context, this.instance); - String response = httpsConnection.get(getAbsoluteUrl(String.format("/accounts/%s/video-channels", name)), 60, null, null); - JSONArray jsonArray = new JSONObject(response).getJSONArray("data"); - accounts = parseAccountResponsePeertube(context, instance, jsonArray); - } catch (HttpsConnection.HttpsConnectionException e) { - setError(e.getStatusCode(), e); - } catch (NoSuchAlgorithmException e) { - e.printStackTrace(); - } catch (IOException e) { - e.printStackTrace(); - } catch (KeyManagementException e) { - e.printStackTrace(); - } catch (JSONException e) { - e.printStackTrace(); - } - apiResponse.setAccounts(accounts); - return apiResponse; - } - - - /** - * Retrieves Peertube videos from an instance *synchronously* - * - * @return APIResponse - */ - public APIResponse getPeertubeChannelVideos(String instance, String name) { - - List peertubes = new ArrayList<>(); - try { - HttpsConnection httpsConnection = new HttpsConnection(context, this.instance); - String response = httpsConnection.get(String.format("https://" + instance + "/api/v1/video-channels/%s/videos", name), 60, null, null); - JSONArray jsonArray = new JSONObject(response).getJSONArray("data"); - peertubes = parsePeertube(jsonArray); - } catch (HttpsConnection.HttpsConnectionException e) { - setError(e.getStatusCode(), e); - } catch (NoSuchAlgorithmException e) { - e.printStackTrace(); - } catch (IOException e) { - e.printStackTrace(); - } catch (KeyManagementException e) { - e.printStackTrace(); - } catch (JSONException e) { - e.printStackTrace(); - } - apiResponse.setPeertubes(peertubes); - return apiResponse; - } - - /** - * Retrieves Peertube videos from an instance *synchronously* - * - * @return APIResponse - */ - public APIResponse getPeertube(String instance, String max_id) { - - List peertubes = new ArrayList<>(); - HashMap params = new HashMap<>(); - if (max_id == null) - max_id = "0"; - params.put("start", String.valueOf(tootPerPage)); - try { - HttpsConnection httpsConnection = new HttpsConnection(context, this.instance); - String response = httpsConnection.get("https://" + instance + "/api/v1/videos", 60, params, null); - JSONArray jsonArray = new JSONObject(response).getJSONArray("data"); - peertubes = parsePeertube(jsonArray); - } catch (HttpsConnection.HttpsConnectionException e) { - setError(e.getStatusCode(), e); - } catch (NoSuchAlgorithmException e) { - e.printStackTrace(); - } catch (IOException e) { - e.printStackTrace(); - } catch (KeyManagementException e) { - e.printStackTrace(); - } catch (JSONException e) { - e.printStackTrace(); - } - apiResponse.setPeertubes(peertubes); - return apiResponse; - } - - /** - * Retrieves Peertube videos from an instance *synchronously* - * - * @return APIResponse - */ - public APIResponse getSinglePeertube(String instance, String videoId, String token) { - - Peertube peertube = null; - try { - HttpsConnection httpsConnection = new HttpsConnection(context, this.instance); - String response = httpsConnection.get(String.format("https://" + instance + "/api/v1/videos/%s", videoId), 60, null, token); - JSONObject jsonObject = new JSONObject(response); - peertube = parseSinglePeertube(context, instance, jsonObject); - } catch (HttpsConnection.HttpsConnectionException e) { - setError(e.getStatusCode(), e); - } catch (NoSuchAlgorithmException e) { - e.printStackTrace(); - } catch (IOException e) { - e.printStackTrace(); - } catch (KeyManagementException e) { - e.printStackTrace(); - } catch (JSONException e) { - e.printStackTrace(); - } - List peertubes = new ArrayList<>(); - peertubes.add(peertube); - apiResponse.setPeertubes(peertubes); - return apiResponse; - } - - /** - * Retrieves peertube search *synchronously* - * - * @param query String search - * @return APIResponse - */ - public APIResponse searchPeertube(String instance, String query) { - HashMap params = new HashMap<>(); - params.put("count", String.valueOf(tootPerPage)); - try { - params.put("search", URLEncoder.encode(query, "UTF-8")); - } catch (UnsupportedEncodingException e) { - params.put("search", query); - } - List peertubes = new ArrayList<>(); - try { - HttpsConnection httpsConnection = new HttpsConnection(context, this.instance); - String response = httpsConnection.get("https://" + instance + "/api/v1/search/videos", 60, params, null); - JSONArray jsonArray = new JSONObject(response).getJSONArray("data"); - peertubes = parsePeertube(jsonArray); - } catch (HttpsConnection.HttpsConnectionException e) { - setError(e.getStatusCode(), e); - e.printStackTrace(); - } catch (NoSuchAlgorithmException e) { - e.printStackTrace(); - } catch (IOException e) { - e.printStackTrace(); - } catch (KeyManagementException e) { - e.printStackTrace(); - } catch (JSONException e) { - e.printStackTrace(); - } - apiResponse.setPeertubes(peertubes); - return apiResponse; - } - - /** - * Retrieves Peertube videos from an instance *synchronously* - * - * @return APIResponse - */ - public APIResponse getSinglePeertubeComments(String instance, String videoId) { - statuses = new ArrayList<>(); - try { - HttpsConnection httpsConnection = new HttpsConnection(context, this.instance); - String response = httpsConnection.get(String.format("https://" + instance + "/api/v1/videos/%s/comment-threads", videoId), 60, null, null); - JSONObject jsonObject = new JSONObject(response); - statuses = parseSinglePeertubeComments(context, instance, jsonObject); - } catch (HttpsConnection.HttpsConnectionException e) { - setError(e.getStatusCode(), e); - } catch (NoSuchAlgorithmException e) { - e.printStackTrace(); - } catch (IOException e) { - e.printStackTrace(); - } catch (KeyManagementException e) { - e.printStackTrace(); - } catch (JSONException e) { - e.printStackTrace(); - } - apiResponse.setStatuses(statuses); - return apiResponse; - } - - - /** - * Retrieves rating of user on a video *synchronously* - * - * @param id String id - * @return APIResponse - */ - @SuppressWarnings("SameParameterValue") - public String getRating(String id) { - try { - HttpsConnection httpsConnection = new HttpsConnection(context, this.instance); - String response = httpsConnection.get(getAbsoluteUrl(String.format("/users/me/videos/%s/rating", id)), 60, null, prefKeyOauthTokenT); - return new JSONObject(response).get("rating").toString(); - } catch (HttpsConnection.HttpsConnectionException e) { - setError(e.getStatusCode(), e); - } catch (NoSuchAlgorithmException e) { - e.printStackTrace(); - } catch (IOException e) { - e.printStackTrace(); - } catch (KeyManagementException e) { - e.printStackTrace(); - } catch (JSONException e) { - e.printStackTrace(); - } - return null; - } - - - /** - * Makes the post action for a status - * - * @param statusAction Enum - * @param targetedId String id of the targeted Id *can be this of a status or an account* - * @return in status code - Should be equal to 200 when action is done - */ - public int postAction(API.StatusAction statusAction, String targetedId) { - return postAction(statusAction, targetedId, null, null); - } - - - public int postRating(String targetedId, String actionMore) { - return postAction(API.StatusAction.RATEVIDEO, targetedId, actionMore, null); - } - - public int postComment(String targetedId, String actionMore) { - return postAction(API.StatusAction.PEERTUBECOMMENT, targetedId, actionMore, null); - } - - public int postReply(String targetedId, String actionMore, String targetedComment) { - return postAction(API.StatusAction.PEERTUBEREPLY, targetedId, actionMore, targetedComment); - } - - public int deleteComment(String targetedId, String targetedComment) { - return postAction(API.StatusAction.PEERTUBEDELETECOMMENT, targetedId, null, targetedComment); - } - - public int deleteVideo(String targetedId) { - return postAction(API.StatusAction.PEERTUBEDELETEVIDEO, targetedId, null, null); - } - - /** - * Makes the post action - * - * @param statusAction Enum - * @param targetedId String id of the targeted Id *can be this of a status or an account* - * @param actionMore String another action - * @param targetedComment String another action - * @return in status code - Should be equal to 200 when action is done - */ - private int postAction(API.StatusAction statusAction, String targetedId, String actionMore, String targetedComment) { - - String action; - String actionCall = "POST"; - HashMap params = null; - switch (statusAction) { - case FOLLOW: - action = "/users/me/subscriptions"; - params = new HashMap<>(); - params.put("uri", targetedId); - break; - case UNFOLLOW: - action = String.format("/users/me/subscriptions/%s", targetedId); - actionCall = "DELETE"; - break; - case RATEVIDEO: - action = String.format("/videos/%s/rate", targetedId); - params = new HashMap<>(); - params.put("rating", actionMore); - actionCall = "PUT"; - break; - case PEERTUBECOMMENT: - action = String.format("/videos/%s/comment-threads", targetedId); - params = new HashMap<>(); - params.put("text", actionMore); - break; - case PEERTUBEDELETECOMMENT: - action = String.format("/videos/%s/comments/%s", targetedId, targetedComment); - actionCall = "DELETE"; - break; - case PEERTUBEDELETEVIDEO: - action = String.format("/videos/%s", targetedId); - actionCall = "DELETE"; - break; - case PEERTUBEREPLY: - action = String.format("/videos/%s/comment/%s", targetedId, targetedComment); - params = new HashMap<>(); - params.put("text", actionMore); - break; - default: - return -1; - } - try { - HttpsConnection httpsConnection = new HttpsConnection(context, this.instance); - if (actionCall.equals("POST")) - httpsConnection.post(getAbsoluteUrl(action), 60, params, prefKeyOauthTokenT); - else if (actionCall.equals("DELETE")) - httpsConnection.delete(getAbsoluteUrl(action), 60, params, prefKeyOauthTokenT); - else if (actionCall.equals("PUT")) - httpsConnection.put(getAbsoluteUrl(action), 60, params, prefKeyOauthTokenT); - actionCode = httpsConnection.getActionCode(); - } catch (HttpsConnection.HttpsConnectionException e) { - setError(e.getStatusCode(), e); - } catch (NoSuchAlgorithmException e) { - e.printStackTrace(); - } catch (IOException e) { - e.printStackTrace(); - } catch (KeyManagementException e) { - e.printStackTrace(); - } - return actionCode; - } - - - /** - * Changes media description - * - * @param mediaId String - * @param description String - * @return Attachment - */ - public Attachment updateDescription(String mediaId, String description) { - - HashMap params = new HashMap<>(); - try { - params.put("description", URLEncoder.encode(description, "UTF-8")); - } catch (UnsupportedEncodingException e) { - params.put("description", description); - } - try { - HttpsConnection httpsConnection = new HttpsConnection(context, this.instance); - String response = httpsConnection.put(getAbsoluteUrl(String.format("/media/%s", mediaId)), 240, params, prefKeyOauthTokenT); - attachment = parseAttachmentResponse(new JSONObject(response)); - } catch (HttpsConnection.HttpsConnectionException e) { - setError(e.getStatusCode(), e); - } catch (NoSuchAlgorithmException e) { - e.printStackTrace(); - } catch (IOException e) { - e.printStackTrace(); - } catch (KeyManagementException e) { - e.printStackTrace(); - } catch (JSONException e) { - e.printStackTrace(); - } - return attachment; - } - - - /** - * Video is in play lists - * - * @return APIResponse - */ - public APIResponse getPlaylistForVideo(String videoId) { - - HashMap params = new HashMap<>(); - params.put("videoIds", videoId); - List ids = new ArrayList<>(); - try { - String response = new HttpsConnection(context, this.instance).get(getAbsoluteUrl("/users/me/video-playlists/videos-exist"), 60, params, prefKeyOauthTokenT); - - JSONArray jsonArray = new JSONObject(response).getJSONArray(videoId); - try { - int i = 0; - while (i < jsonArray.length()) { - JSONObject resobj = jsonArray.getJSONObject(i); - String playlistId = resobj.getString("playlistId"); - ids.add(playlistId); - i++; - } - } catch (JSONException e) { - setDefaultError(e); - } - } catch (HttpsConnection.HttpsConnectionException e) { - setError(e.getStatusCode(), e); - e.printStackTrace(); - } catch (NoSuchAlgorithmException e) { - e.printStackTrace(); - } catch (IOException e) { - e.printStackTrace(); - } catch (KeyManagementException e) { - e.printStackTrace(); - } catch (JSONException e) { - e.printStackTrace(); - } - apiResponse = new APIResponse(); - apiResponse.setPlaylistForVideos(ids); - return apiResponse; - } - - - /** - * Get lists for the user - * - * @return APIResponse - */ - public APIResponse getPlayists(String username) { - - List playlists = new ArrayList<>(); - try { - String response = new HttpsConnection(context, this.instance).get(getAbsoluteUrl(String.format("/accounts/%s/video-playlists", username)), 60, null, prefKeyOauthTokenT); - playlists = parsePlaylists(context, new JSONObject(response).getJSONArray("data")); - } catch (HttpsConnection.HttpsConnectionException e) { - setError(e.getStatusCode(), e); - } catch (NoSuchAlgorithmException e) { - e.printStackTrace(); - } catch (IOException e) { - e.printStackTrace(); - } catch (KeyManagementException e) { - e.printStackTrace(); - } catch (JSONException e) { - e.printStackTrace(); - } - apiResponse.setPlaylists(playlists); - return apiResponse; - } - - - /** - * Delete a Playlist - * - * @param playlistId String, the playlist id - * @return int - */ - public int deletePlaylist(String playlistId) { - try { - HttpsConnection httpsConnection = new HttpsConnection(context, this.instance); - httpsConnection.delete(getAbsoluteUrl(String.format("/video-playlists/%s", playlistId)), 60, null, prefKeyOauthTokenT); - actionCode = httpsConnection.getActionCode(); - } catch (HttpsConnection.HttpsConnectionException e) { - setError(e.getStatusCode(), e); - } catch (NoSuchAlgorithmException e) { - e.printStackTrace(); - } catch (IOException e) { - e.printStackTrace(); - } catch (KeyManagementException e) { - e.printStackTrace(); - } - return actionCode; - } - - - /** - * Delete video in a Playlist - * - * @param playlistId String, the playlist id - * @param videoId String, the video id - * @return int - */ - public int deleteVideoPlaylist(String playlistId, String videoId) { - try { - HttpsConnection httpsConnection = new HttpsConnection(context, this.instance); - httpsConnection.delete(getAbsoluteUrl(String.format("/video-playlists/%s/videos/%s", playlistId, videoId)), 60, null, prefKeyOauthTokenT); - actionCode = httpsConnection.getActionCode(); - } catch (HttpsConnection.HttpsConnectionException e) { - setError(e.getStatusCode(), e); - } catch (NoSuchAlgorithmException e) { - e.printStackTrace(); - } catch (IOException e) { - e.printStackTrace(); - } catch (KeyManagementException e) { - e.printStackTrace(); - } - return actionCode; - } - - /** - * Add video in a Playlist - * - * @param playlistId String, the playlist id - * @param videoId String, the video id - * @return int - */ - public int addVideoPlaylist(String playlistId, String videoId) { - try { - HttpsConnection httpsConnection = new HttpsConnection(context, this.instance); - HashMap params = new HashMap<>(); - params.put("videoId", videoId); - httpsConnection.post(getAbsoluteUrl(String.format("/video-playlists/%s/videos", playlistId)), 60, params, prefKeyOauthTokenT); - actionCode = httpsConnection.getActionCode(); - } catch (HttpsConnection.HttpsConnectionException e) { - setError(e.getStatusCode(), e); - e.printStackTrace(); - } catch (NoSuchAlgorithmException e) { - e.printStackTrace(); - } catch (IOException e) { - e.printStackTrace(); - } catch (KeyManagementException e) { - e.printStackTrace(); - } - return actionCode; - } - - - /** - * Retrieves status for the account *synchronously* - * - * @param playlistid String Id of the playlist - * @param max_id String id max - * @param since_id String since the id - * @return APIResponse - */ - @SuppressWarnings("SameParameterValue") - public APIResponse getPlaylistVideos(String playlistid, String max_id, String since_id) { - - HashMap params = new HashMap<>(); - if (max_id != null) - params.put("start", max_id); - if (since_id != null) - params.put("since_id", since_id); - params.put("count", String.valueOf(tootPerPage)); - params.put("sort", "-updatedAt"); - List peertubes = new ArrayList<>(); - try { - HttpsConnection httpsConnection = new HttpsConnection(context, this.instance); - String response = httpsConnection.get(getAbsoluteUrl(String.format("/video-playlists/%s/videos", playlistid)), 60, params, prefKeyOauthTokenT); - JSONArray jsonArray = new JSONObject(response).getJSONArray("data"); - peertubes = parsePeertube(jsonArray); - - } catch (HttpsConnection.HttpsConnectionException e) { - setError(e.getStatusCode(), e); - e.printStackTrace(); - } catch (NoSuchAlgorithmException e) { - e.printStackTrace(); - } catch (IOException e) { - e.printStackTrace(); - } catch (KeyManagementException e) { - e.printStackTrace(); - } catch (JSONException e) { - e.printStackTrace(); - } - apiResponse.setPeertubes(peertubes); - return apiResponse; - } - - - /** - * Parse json response for several howto - * - * @param jsonArray JSONArray - * @return List - */ - private List parseHowTos(JSONArray jsonArray) { - - List howToVideos = new ArrayList<>(); - try { - int i = 0; - while (i < jsonArray.length()) { - - JSONObject resobj = jsonArray.getJSONObject(i); - HowToVideo howToVideo = parseHowTo(context, resobj); - i++; - howToVideos.add(howToVideo); - } - - } catch (JSONException e) { - setDefaultError(e); - } - return howToVideos; - } - - /** - * Parse json response for peertube notifications - * - * @param jsonArray JSONArray - * @return List - */ - private List parsePeertubeNotifications(JSONArray jsonArray) { - List peertubeNotifications = new ArrayList<>(); - try { - int i = 0; - while (i < jsonArray.length()) { - JSONObject resobj = jsonArray.getJSONObject(i); - PeertubeNotification peertubeNotification = parsePeertubeNotifications(context, resobj); - i++; - peertubeNotifications.add(peertubeNotification); - } - } catch (JSONException e) { - setDefaultError(e); - } - return peertubeNotifications; - } - /** * Parse json response for unique how to * @@ -1686,81 +245,6 @@ public class PeertubeAPI { return peertubeNotification; } - - /** - * Parse json response for several instance reg - * - * @param jsonArray JSONArray - * @return List - */ - public List parseInstanceReg(JSONArray jsonArray) { - - List instanceRegs = new ArrayList<>(); - try { - int i = 0; - while (i < jsonArray.length()) { - JSONObject resobj = jsonArray.getJSONObject(i); - InstanceReg instanceReg = parseInstanceReg(resobj); - i++; - instanceRegs.add(instanceReg); - } - } catch (JSONException e) { - e.printStackTrace(); - } - return instanceRegs; - } - - /** - * Parse json response an unique instance for registering - * - * @param resobj JSONObject - * @return InstanceReg - */ - private InstanceReg parseInstanceReg(JSONObject resobj) { - InstanceReg instanceReg = new InstanceReg(); - try { - instanceReg.setDomain(resobj.getString("host")); - instanceReg.setVersion(resobj.getString("version")); - instanceReg.setDescription(resobj.getString("shortDescription")); - instanceReg.setLanguage(resobj.getString("country")); - instanceReg.setCategory(""); - instanceReg.setProxied_thumbnail(""); - instanceReg.setTotal_users(resobj.getInt("totalUsers")); - instanceReg.setTotalInstanceFollowers(resobj.getInt("totalInstanceFollowers")); - instanceReg.setTotalInstanceFollowing(resobj.getInt("totalInstanceFollowing")); - instanceReg.setLast_week_users(0); - instanceReg.setCountry(resobj.getString("country")); - } catch (JSONException e) { - e.printStackTrace(); - } - return instanceReg; - } - - - /** - * Parse json response for several howto - * - * @param jsonArray JSONArray - * @return List - */ - private List parsePeertube(JSONArray jsonArray) { - - List peertubes = new ArrayList<>(); - try { - int i = 0; - while (i < jsonArray.length()) { - JSONObject resobj = jsonArray.getJSONObject(i); - Peertube peertube = parsePeertube(context, resobj); - i++; - peertubes.add(peertube); - } - } catch (JSONException e) { - setDefaultError(e); - } - return peertubes; - } - - /** * Parse json response for unique how to * @@ -1769,7 +253,7 @@ public class PeertubeAPI { */ public static Peertube parsePeertube(Context context, JSONObject resobj) { Peertube peertube = new Peertube(); - if( resobj.has("video")){ + if (resobj.has("video")) { try { resobj = resobj.getJSONObject("video"); } catch (JSONException e) { @@ -1971,6 +455,1657 @@ public class PeertubeAPI { return howToVideo; } + /** + * Parse json response for emoji + * + * @param resobj JSONObject + * @return Emojis + */ + private static Emojis parseEmojis(JSONObject resobj) { + Emojis emojis = new Emojis(); + try { + emojis.setShortcode(resobj.get("shortcode").toString()); + emojis.setStatic_url(resobj.get("static_url").toString()); + emojis.setUrl(resobj.get("url").toString()); + } catch (Exception ignored) { + } + return emojis; + } + + /** + * Parse json response for emoji + * + * @param resobj JSONObject + * @return Emojis + */ + private static Emojis parseMisskeyEmojis(JSONObject resobj) { + Emojis emojis = new Emojis(); + try { + emojis.setShortcode(resobj.get("name").toString()); + emojis.setStatic_url(resobj.get("url").toString()); + emojis.setUrl(resobj.get("url").toString()); + } catch (Exception ignored) { + } + return emojis; + } + + /** + * Parse json response for emoji + * + * @param resobj JSONObject + * @return Emojis + */ + private static Playlist parsePlaylist(Context context, JSONObject resobj) { + Playlist playlist = new Playlist(); + try { + playlist.setId(resobj.getString("id")); + playlist.setUuid(resobj.getString("uuid")); + playlist.setCreatedAt(Helper.stringToDate(context, resobj.getString("createdAt"))); + playlist.setDescription(resobj.getString("description")); + playlist.setDisplayName(resobj.getString("displayName")); + playlist.setLocal(resobj.getBoolean("isLocal")); + playlist.setVideoChannelId(resobj.getString("videoChannel")); + playlist.setThumbnailPath(resobj.getString("thumbnailPath")); + playlist.setOwnerAccount(parseAccountResponsePeertube(context, resobj.getJSONObject("ownerAccount"))); + playlist.setVideosLength(resobj.getInt("videosLength")); + try { + LinkedHashMap type = new LinkedHashMap<>(); + LinkedHashMap privacy = new LinkedHashMap<>(); + privacy.put(resobj.getJSONObject("privacy").getInt("id"), resobj.getJSONObject("privacy").get("label").toString()); + type.put(resobj.getJSONObject("type").getInt("id"), resobj.getJSONObject("type").get("label").toString()); + playlist.setType(type); + playlist.setPrivacy(privacy); + } catch (Exception ignored) { + ignored.printStackTrace(); + } + + + try { + playlist.setUpdatedAt(Helper.stringToDate(context, resobj.getString("updatedAt"))); + } catch (Exception ignored) { + ignored.printStackTrace(); + } + } catch (Exception ignored) { + ignored.printStackTrace(); + } + return playlist; + } + + /** + * Parse json response an unique peertube account + * + * @param accountObject JSONObject + * @return Account + */ + private static Account parseAccountResponsePeertube(Context context, JSONObject accountObject) { + Account account = new Account(); + try { + account.setId(accountObject.get("id").toString()); + account.setUuid(accountObject.get("id").toString()); + account.setUsername(accountObject.get("name").toString()); + account.setAcct(accountObject.get("name").toString() + "@" + accountObject.get("host")); + account.setDisplay_name(accountObject.get("name").toString()); + account.setHost(accountObject.get("host").toString()); + account.setSocial("PEERTUBE"); + + if (accountObject.has("createdAt")) + account.setCreated_at(Helper.mstStringToDate(context, accountObject.get("createdAt").toString())); + else + account.setCreated_at(new Date()); + if (accountObject.has("followersCount")) + account.setFollowers_count(Integer.valueOf(accountObject.get("followersCount").toString())); + else + account.setFollowers_count(0); + if (accountObject.has("followingCount")) + account.setFollowing_count(Integer.valueOf(accountObject.get("followingCount").toString())); + else + account.setFollowing_count(0); + account.setStatuses_count(0); + if (accountObject.has("description")) + account.setNote(accountObject.get("description").toString()); + else + account.setNote(""); + + account.setUrl(accountObject.get("url").toString()); + if (accountObject.has("avatar") && !accountObject.isNull("avatar")) { + account.setAvatar(accountObject.getJSONObject("avatar").get("path").toString()); + } else + account.setAvatar("null"); + account.setHeader("null"); + account.setHeader_static("null"); + account.setAvatar_static(accountObject.get("avatar").toString()); + } catch (JSONException ignored) { + ignored.printStackTrace(); + } catch (ParseException e) { + e.printStackTrace(); + } + return account; + } + + /** + * Parse json response an unique attachment + * + * @param resobj JSONObject + * @return Relationship + */ + static Attachment parseAttachmentResponse(JSONObject resobj) { + + Attachment attachment = new Attachment(); + try { + attachment.setId(resobj.get("id").toString()); + attachment.setType(resobj.get("type").toString()); + attachment.setUrl(resobj.get("url").toString()); + try { + attachment.setDescription(resobj.get("description").toString()); + } catch (JSONException ignore) { + } + try { + attachment.setRemote_url(resobj.get("remote_url").toString()); + } catch (JSONException ignore) { + } + try { + attachment.setPreview_url(resobj.get("preview_url").toString()); + } catch (JSONException ignore) { + } + try { + attachment.setMeta(resobj.get("meta").toString()); + } catch (JSONException ignore) { + } + try { + attachment.setText_url(resobj.get("text_url").toString()); + } catch (JSONException ignore) { + } + + } catch (JSONException ignored) { + } + return attachment; + } + + /*** + * Get info on the current Instance *synchronously* + * @return APIResponse + */ + public APIResponse getInstance() { + try { + String response = new HttpsConnection(context, this.instance).get(getAbsoluteUrl("/instance"), 30, null, prefKeyOauthTokenT); + Instance instanceEntity = parseInstance(new JSONObject(response)); + apiResponse.setInstance(instanceEntity); + } catch (HttpsConnection.HttpsConnectionException e) { + setError(e.getStatusCode(), e); + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } catch (KeyManagementException e) { + e.printStackTrace(); + } catch (JSONException e) { + e.printStackTrace(); + } + return apiResponse; + } + + /** + * Update video meta data *synchronously* + * + * @param peertube Peertube + * @return APIResponse + */ + @SuppressWarnings("SameParameterValue") + public APIResponse updateVideo(Peertube peertube) { + + LinkedHashMap params = new LinkedHashMap<>(); + + params.put("name", peertube.getName()); + //Category + Map.Entry categoryM = peertube.getCategory().entrySet().iterator().next(); + Integer idCategory = categoryM.getKey(); + params.put("category", String.valueOf(idCategory)); + //License + Map.Entry licenseM = peertube.getLicense().entrySet().iterator().next(); + Integer idLicense = licenseM.getKey(); + params.put("licence", String.valueOf(idLicense)); + //language + Map.Entry languagesM = peertube.getLanguage().entrySet().iterator().next(); + String iDlanguage = languagesM.getKey(); + params.put("language", iDlanguage); + params.put("support", "null"); + params.put("description", peertube.getDescription()); + //Channel + Map.Entry channelsM = peertube.getChannelForUpdate().entrySet().iterator().next(); + String iDChannel = channelsM.getValue(); + params.put("channelId", iDChannel); + //Privacy + Map.Entry privacyM = peertube.getPrivacy().entrySet().iterator().next(); + Integer idPrivacy = privacyM.getKey(); + params.put("privacy", String.valueOf(idPrivacy)); + if (peertube.getTags() != null && peertube.getTags().size() > 0) { + StringBuilder parameters = new StringBuilder(); + parameters.append("[]&"); + for (String tag : peertube.getTags()) + parameters.append("tags=").append(tag).append("&"); + String strParam = parameters.toString(); + strParam = strParam.substring(0, strParam.length() - 1); + params.put("tags[]", strParam); + } else { + params.put("tags", "null"); + } + params.put("nsfw", String.valueOf(peertube.isSensitive())); + params.put("waitTranscoding", "true"); + params.put("commentsEnabled", String.valueOf(peertube.isCommentsEnabled())); + params.put("scheduleUpdate", "null"); + List peertubes = new ArrayList<>(); + try { + HttpsConnection httpsConnection = new HttpsConnection(context, this.instance); + httpsConnection.put(getAbsoluteUrl(String.format("/videos/%s", peertube.getId())), 60, params, prefKeyOauthTokenT); + peertubes.add(peertube); + } catch (HttpsConnection.HttpsConnectionException e) { + setError(e.getStatusCode(), e); + e.printStackTrace(); + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } catch (KeyManagementException e) { + e.printStackTrace(); + } + apiResponse.setPeertubes(peertubes); + return apiResponse; + } + + /*** + * Verifiy credential of the authenticated user *synchronously* + * @return Account + */ + public PeertubeInformation getPeertubeInformation() throws HttpsConnection.HttpsConnectionException { + PeertubeInformation peertubeInformation = new PeertubeInformation(); + try { + + String response = new HttpsConnection(context, this.instance).get(getAbsoluteUrl("/videos/categories"), 60, null, null); + JSONObject categories = new JSONObject(response); + LinkedHashMap _pcategories = new LinkedHashMap<>(); + for (int i = 1; i <= categories.length(); i++) { + _pcategories.put(i, categories.getString(String.valueOf(i))); + + } + peertubeInformation.setCategories(_pcategories); + + response = new HttpsConnection(context, this.instance).get(getAbsoluteUrl("/videos/languages"), 60, null, null); + JSONObject languages = new JSONObject(response); + LinkedHashMap _languages = new LinkedHashMap<>(); + Iterator iter = languages.keys(); + while (iter.hasNext()) { + String key = iter.next(); + try { + _languages.put(key, (String) languages.get(key)); + } catch (JSONException ignored) { + } + } + peertubeInformation.setLanguages(_languages); + + response = new HttpsConnection(context, this.instance).get(getAbsoluteUrl("/videos/privacies"), 60, null, null); + JSONObject privacies = new JSONObject(response); + LinkedHashMap _pprivacies = new LinkedHashMap<>(); + for (int i = 1; i <= privacies.length(); i++) { + _pprivacies.put(i, privacies.getString(String.valueOf(i))); + + } + peertubeInformation.setPrivacies(_pprivacies); + + + response = new HttpsConnection(context, this.instance).get(getAbsoluteUrl("/video-playlists/privacies"), 60, null, null); + JSONObject plprivacies = new JSONObject(response); + LinkedHashMap _plprivacies = new LinkedHashMap<>(); + for (int i = 1; i <= plprivacies.length(); i++) { + _plprivacies.put(i, plprivacies.getString(String.valueOf(i))); + + } + peertubeInformation.setPlaylistPrivacies(_plprivacies); + + response = new HttpsConnection(context, this.instance).get(getAbsoluteUrl("/videos/licences"), 60, null, null); + JSONObject licences = new JSONObject(response); + LinkedHashMap _plicences = new LinkedHashMap<>(); + for (int i = 1; i <= licences.length(); i++) { + _plicences.put(i, licences.getString(String.valueOf(i))); + + } + peertubeInformation.setLicences(_plicences); + + + String instance = Helper.getLiveInstance(context); + String lang = null; + if (PeertubeInformation.langueMapped.containsKey(Locale.getDefault().getLanguage())) + lang = PeertubeInformation.langueMapped.get(Locale.getDefault().getLanguage()); + + if (lang != null && !lang.startsWith("en")) { + response = new HttpsConnection(context, this.instance).get(String.format("https://" + instance + "/client/locales/%s/server.json", lang), 60, null, null); + JSONObject translations = new JSONObject(response); + LinkedHashMap _translations = new LinkedHashMap<>(); + Iterator itertrans = translations.keys(); + while (itertrans.hasNext()) { + String key = itertrans.next(); + try { + _translations.put(key, (String) translations.get(key)); + } catch (JSONException ignored) { + } + } + peertubeInformation.setTranslations(_translations); + } + + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } catch (KeyManagementException e) { + e.printStackTrace(); + } catch (JSONException e) { + e.printStackTrace(); + } + return peertubeInformation; + } + + /*** + * Verifiy credential of the authenticated user *synchronously* + * @return Account + */ + public Account verifyCredentials() { + account = new Account(); + InstanceNodeInfo nodeinfo = new API(context).displayNodeInfo(instance); + String social = null; + if (nodeinfo != null) { + social = nodeinfo.getName(); + } + try { + String response = new HttpsConnection(context, this.instance).get(getAbsoluteUrl("/users/me"), 60, null, prefKeyOauthTokenT); + JSONObject accountObject = new JSONObject(response).getJSONObject("account"); + account = parseAccountResponsePeertube(context, accountObject); + if (social != null) { + account.setSocial(social.toUpperCase()); + } + } catch (NoSuchAlgorithmException | IOException | KeyManagementException | JSONException e) { + e.printStackTrace(); + } catch (HttpsConnection.HttpsConnectionException e) { + if (e.getStatusCode() == 401 || e.getStatusCode() == 403) { + SQLiteDatabase db = Sqlite.getInstance(context, Sqlite.DB_NAME, null, Sqlite.DB_VERSION).open(); + Account targetedAccount = new AccountDAO(context, db).getAccountByToken(prefKeyOauthTokenT); + HashMap values = refreshToken(targetedAccount.getClient_id(), targetedAccount.getClient_secret(), targetedAccount.getRefresh_token()); + if (values.containsKey("access_token") && values.get("access_token") != null) { + targetedAccount.setToken(values.get("access_token")); + SharedPreferences sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE); + String token = sharedpreferences.getString(Helper.PREF_KEY_OAUTH_TOKEN, null); + //This account is currently logged in, the token is updated + if (prefKeyOauthTokenT.equals(token)) { + SharedPreferences.Editor editor = sharedpreferences.edit(); + editor.putString(Helper.PREF_KEY_OAUTH_TOKEN, targetedAccount.getToken()); + editor.apply(); + } + } + if (values.containsKey("refresh_token") && values.get("refresh_token") != null) + targetedAccount.setRefresh_token(values.get("refresh_token")); + new AccountDAO(context, db).updateAccount(targetedAccount); + + String response; + try { + response = new HttpsConnection(context, this.instance).get(getAbsoluteUrl("/users/me"), 60, null, targetedAccount.getToken()); + JSONObject accountObject = new JSONObject(response).getJSONObject("account"); + account = parseAccountResponsePeertube(context, accountObject); + if (social != null) { + account.setSocial(social.toUpperCase()); + } + } catch (IOException | NoSuchAlgorithmException | KeyManagementException | JSONException e1) { + e1.printStackTrace(); + } catch (HttpsConnection.HttpsConnectionException e1) { + e1.printStackTrace(); + setError(e.getStatusCode(), e); + } + e.printStackTrace(); + } + } + return account; + } + + /*** + * Get instance for registering an account *synchronously* + * @return APIResponse + */ + public APIResponse getInstanceReg() { + apiResponse = new APIResponse(); + try { + String response = new HttpsConnection(context, null).get("https://instances.joinpeertube.org/api/v1/instances?start=0&count=50&signup=true&health=100&sort=-totalUsers"); + JSONObject result = new JSONObject(response); + List instanceRegs = parseInstanceReg(result.getJSONArray("data")); + apiResponse.setInstanceRegs(instanceRegs); + } catch (HttpsConnection.HttpsConnectionException e) { + setError(e.getStatusCode(), e); + } catch (NoSuchAlgorithmException | IOException | KeyManagementException | JSONException e) { + e.printStackTrace(); + } + return apiResponse; + } + + public APIResponse createAccount(AccountCreation accountCreation) { + apiResponse = new APIResponse(); + + try { + HashMap params = new HashMap<>(); + params.put("username", accountCreation.getUsername()); + params.put("email", accountCreation.getEmail()); + params.put("password", accountCreation.getPassword()); + String response = new HttpsConnection(context, this.instance).post(getAbsoluteUrl("/users/register"), 30, params, null); + + } catch (NoSuchAlgorithmException | IOException | KeyManagementException e) { + e.printStackTrace(); + } catch (HttpsConnection.HttpsConnectionException e) { + setError(e.getStatusCode(), e); + e.printStackTrace(); + } + return apiResponse; + } + + /*** + * Verifiy credential of the authenticated user *synchronously* + * @return Account + */ + private HashMap refreshToken(String client_id, String client_secret, String refresh_token) { + account = new Account(); + HashMap params = new HashMap<>(); + HashMap newValues = new HashMap<>(); + params.put("grant_type", "refresh_token"); + params.put("client_id", client_id); + params.put("client_secret", client_secret); + params.put("refresh_token", refresh_token); + try { + String response = new HttpsConnection(context, this.instance).post(getAbsoluteUrl("/users/token"), 60, params, null); + JSONObject resobj = new JSONObject(response); + String token = resobj.get("access_token").toString(); + if (resobj.has("refresh_token")) + refresh_token = resobj.get("refresh_token").toString(); + newValues.put("access_token", token); + newValues.put("refresh_token", refresh_token); + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } catch (KeyManagementException e) { + e.printStackTrace(); + } catch (JSONException e) { + e.printStackTrace(); + } catch (HttpsConnection.HttpsConnectionException e) { + e.printStackTrace(); + } + return newValues; + } + + /** + * Returns an account + * + * @param accountId String account fetched + * @return Account entity + */ + public Account getAccount(String accountId) { + + account = new Account(); + try { + String response = new HttpsConnection(context, this.instance).get(getAbsoluteUrl(String.format("/accounts/%s", accountId)), 60, null, prefKeyOauthTokenT); + account = parseAccountResponsePeertube(context, new JSONObject(response)); + } catch (HttpsConnection.HttpsConnectionException e) { + e.printStackTrace(); + setError(e.getStatusCode(), e); + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } catch (KeyManagementException e) { + e.printStackTrace(); + } catch (JSONException e) { + e.printStackTrace(); + } + return account; + } + + /** + * Returns a relationship between the authenticated account and an account + * + * @param uri String accounts fetched + * @return Relationship entity + */ + public boolean isFollowing(String uri) { + HashMap params = new HashMap<>(); + + params.put("uris", uri); + + try { + HttpsConnection httpsConnection = new HttpsConnection(context, this.instance); + String response = httpsConnection.get(getAbsoluteUrl("/users/me/subscriptions/exist"), 60, params, prefKeyOauthTokenT); + return new JSONObject(response).getBoolean(uri); + } catch (HttpsConnection.HttpsConnectionException e) { + setError(e.getStatusCode(), e); + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } catch (KeyManagementException e) { + e.printStackTrace(); + } catch (JSONException e) { + e.printStackTrace(); + } + return false; + } + + /** + * Retrieves videos for the account *synchronously* + * + * @param acct String Id of the account + * @param max_id String id max + * @return APIResponse + */ + public APIResponse getVideos(String acct, String max_id) { + return getVideos(acct, max_id, null); + } + + /** + * Retrieves history for videos for the account *synchronously* + * + * @param max_id String id max + * @return APIResponse + */ + public APIResponse getMyHistory(String max_id) { + return getMyHistory(max_id, null); + } + + /** + * Retrieves history for videos for the account *synchronously* + * + * @param max_id String id max + * @param since_id String since the id + * @return APIResponse + */ + @SuppressWarnings("SameParameterValue") + private APIResponse getMyHistory(String max_id, String since_id) { + + HashMap params = new HashMap<>(); + if (max_id != null) + params.put("start", max_id); + if (since_id != null) + params.put("since_id", since_id); + params.put("count", String.valueOf(tootPerPage)); + List peertubes = new ArrayList<>(); + try { + + HttpsConnection httpsConnection = new HttpsConnection(context, this.instance); + String response = httpsConnection.get(getAbsoluteUrl("/users/me/history/videos"), 60, params, prefKeyOauthTokenT); + + JSONArray jsonArray = new JSONObject(response).getJSONArray("data"); + peertubes = parsePeertube(jsonArray); + + } catch (HttpsConnection.HttpsConnectionException e) { + setError(e.getStatusCode(), e); + e.printStackTrace(); + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } catch (KeyManagementException e) { + e.printStackTrace(); + } catch (JSONException e) { + e.printStackTrace(); + } + apiResponse.setPeertubes(peertubes); + return apiResponse; + } + + /** + * Retrieves videos for the account *synchronously* + * + * @param max_id String id max + * @return APIResponse + */ + public APIResponse getMyVideos(String max_id) { + return getMyVideos(max_id, null); + } + + /** + * Retrieves status for the account *synchronously* + * + * @param max_id String id max + * @param since_id String since the id + * @return APIResponse + */ + @SuppressWarnings("SameParameterValue") + private APIResponse getMyVideos(String max_id, String since_id) { + + HashMap params = new HashMap<>(); + if (max_id != null) + params.put("start", max_id); + if (since_id != null) + params.put("since_id", since_id); + params.put("count", String.valueOf(tootPerPage)); + List peertubes = new ArrayList<>(); + try { + + HttpsConnection httpsConnection = new HttpsConnection(context, this.instance); + String response = httpsConnection.get(getAbsoluteUrl("/users/me/videos"), 60, params, prefKeyOauthTokenT); + + JSONArray jsonArray = new JSONObject(response).getJSONArray("data"); + peertubes = parsePeertube(jsonArray); + + } catch (HttpsConnection.HttpsConnectionException e) { + setError(e.getStatusCode(), e); + e.printStackTrace(); + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } catch (KeyManagementException e) { + e.printStackTrace(); + } catch (JSONException e) { + e.printStackTrace(); + } + apiResponse.setPeertubes(peertubes); + return apiResponse; + } + + /** + * Retrieves status for the account *synchronously* + * + * @param acct String Id of the account + * @param max_id String id max + * @param since_id String since the id + * @return APIResponse + */ + @SuppressWarnings("SameParameterValue") + private APIResponse getVideos(String acct, String max_id, String since_id) { + + HashMap params = new HashMap<>(); + if (max_id != null) + params.put("start", max_id); + if (since_id != null) + params.put("since_id", since_id); + params.put("count", String.valueOf(tootPerPage)); + List peertubes = new ArrayList<>(); + try { + HttpsConnection httpsConnection = new HttpsConnection(context, this.instance); + String response = httpsConnection.get(getAbsoluteUrl(String.format("/accounts/%s/videos", acct)), 60, params, prefKeyOauthTokenT); + JSONArray jsonArray = new JSONObject(response).getJSONArray("data"); + peertubes = parsePeertube(jsonArray); + + } catch (HttpsConnection.HttpsConnectionException e) { + setError(e.getStatusCode(), e); + e.printStackTrace(); + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } catch (KeyManagementException e) { + e.printStackTrace(); + } catch (JSONException e) { + e.printStackTrace(); + } + apiResponse.setPeertubes(peertubes); + return apiResponse; + } + + /** + * Retrieves Peertube notifications for the account *synchronously* + * + * @param max_id String id max + * @return APIResponse + */ + public APIResponse getNotifications(String max_id) { + return getNotifications(max_id, null); + } + + /** + * Retrieves Peertube notifications since id for the account *synchronously* + * + * @param since_id String id since + * @return APIResponse + */ + public APIResponse getNotificationsSince(String since_id) { + return getNotifications(null, since_id); + } + + /** + * Retrieves Peertube notifications for the account *synchronously* + * + * @param max_id String id max + * @param since_id String since the id + * @return APIResponse + */ + @SuppressWarnings("SameParameterValue") + private APIResponse getNotifications(String max_id, String since_id) { + + HashMap params = new HashMap<>(); + if (max_id != null) + params.put("start", max_id); + if (since_id != null) + params.put("since_id", since_id); + params.put("count", String.valueOf(tootPerPage)); + List peertubeNotifications = new ArrayList<>(); + try { + HttpsConnection httpsConnection = new HttpsConnection(context, this.instance); + String response = httpsConnection.get(getAbsoluteUrl("/users/me/notifications"), 60, params, prefKeyOauthTokenT); + JSONArray jsonArray = new JSONObject(response).getJSONArray("data"); + peertubeNotifications = parsePeertubeNotifications(jsonArray); + } catch (HttpsConnection.HttpsConnectionException e) { + setError(e.getStatusCode(), e); + e.printStackTrace(); + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } catch (KeyManagementException e) { + e.printStackTrace(); + } catch (JSONException e) { + e.printStackTrace(); + } + apiResponse.setPeertubeNotifications(peertubeNotifications); + return apiResponse; + } + + /** + * Retrieves videos channel for the account *synchronously* + * + * @param acct String Id of the account + * @param max_id String id max + * @return APIResponse + */ + public APIResponse getVideosChannel(String acct, String max_id) { + return getVideosChannel(acct, max_id, null); + } + + /** + * Retrieves status for the account *synchronously* + * + * @param acct String Id of the account + * @param max_id String id max + * @param since_id String since the id + * @return APIResponse + */ + @SuppressWarnings("SameParameterValue") + private APIResponse getVideosChannel(String acct, String max_id, String since_id) { + + HashMap params = new HashMap<>(); + if (max_id != null) + params.put("start", max_id); + if (since_id != null) + params.put("since_id", since_id); + params.put("count", String.valueOf(tootPerPage)); + List peertubes = new ArrayList<>(); + try { + + HttpsConnection httpsConnection = new HttpsConnection(context, this.instance); + String response = httpsConnection.get(getAbsoluteUrl(String.format("/video-channels/%s/videos", acct)), 60, params, prefKeyOauthTokenT); + + JSONArray jsonArray = new JSONObject(response).getJSONArray("data"); + peertubes = parsePeertube(jsonArray); + + } catch (HttpsConnection.HttpsConnectionException e) { + setError(e.getStatusCode(), e); + e.printStackTrace(); + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } catch (KeyManagementException e) { + e.printStackTrace(); + } catch (JSONException e) { + e.printStackTrace(); + } + apiResponse.setPeertubes(peertubes); + return apiResponse; + } + + /** + * Retrieves subscription videos *synchronously* + * + * @param max_id String id max + * @return APIResponse + */ + public APIResponse getSubscriptionsTL(String max_id) { + try { + return getTL("/users/me/subscriptions/videos", "-publishedAt", null, max_id, null, null); + } catch (HttpsConnection.HttpsConnectionException e) { + if (e.getStatusCode() == 401 || e.getStatusCode() == 403) { + SQLiteDatabase db = Sqlite.getInstance(context, Sqlite.DB_NAME, null, Sqlite.DB_VERSION).open(); + Account targetedAccount = new AccountDAO(context, db).getAccountByToken(prefKeyOauthTokenT); + HashMap values = refreshToken(targetedAccount.getClient_id(), targetedAccount.getClient_secret(), targetedAccount.getRefresh_token()); + SharedPreferences sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE); + if (values.containsKey("access_token") && values.get("access_token") != null) { + targetedAccount.setToken(values.get("access_token")); + String token = sharedpreferences.getString(Helper.PREF_KEY_OAUTH_TOKEN, null); + //This account is currently logged in, the token is updated + SharedPreferences.Editor editor = sharedpreferences.edit(); + prefKeyOauthTokenT = targetedAccount.getToken(); + editor.putString(Helper.PREF_KEY_OAUTH_TOKEN, targetedAccount.getToken()); + editor.apply(); + } + if (values.containsKey("refresh_token") && values.get("refresh_token") != null) + targetedAccount.setRefresh_token(values.get("refresh_token")); + new AccountDAO(context, db).updateAccount(targetedAccount); + try { + return getTL("/users/me/subscriptions/videos", "-publishedAt", null, max_id, null, null); + } catch (HttpsConnection.HttpsConnectionException e1) { + setError(e.getStatusCode(), e); + return apiResponse; + } + } + setError(e.getStatusCode(), e); + return apiResponse; + } + } + + /** + * Retrieves overview videos *synchronously* + * + * @param max_id String id max + * @return APIResponse + */ + public APIResponse getOverviewTL(String max_id) { + try { + return getTL("/overviews/videos", null, null, max_id, null, null); + } catch (HttpsConnection.HttpsConnectionException e) { + setError(e.getStatusCode(), e); + return apiResponse; + } + } + + /** + * Retrieves trending videos *synchronously* + * + * @param max_id String id max + * @return APIResponse + */ + public APIResponse getTrendingTL(String max_id) { + try { + return getTL("/videos/", "-trending", null, max_id, null, null); + } catch (HttpsConnection.HttpsConnectionException e) { + setError(e.getStatusCode(), e); + return apiResponse; + } + } + + /** + * Retrieves trending videos *synchronously* + * + * @param max_id String id max + * @return APIResponse + */ + public APIResponse getRecentlyAddedTL(String max_id) { + try { + return getTL("/videos/", "-publishedAt", null, max_id, null, null); + } catch (HttpsConnection.HttpsConnectionException e) { + setError(e.getStatusCode(), e); + return apiResponse; + } + } + + /** + * Retrieves trending videos *synchronously* + * + * @param max_id String id max + * @return APIResponse + */ + public APIResponse getLocalTL(String max_id) { + try { + return getTL("/videos/", "-publishedAt", "local", max_id, null, null); + } catch (HttpsConnection.HttpsConnectionException e) { + setError(e.getStatusCode(), e); + return apiResponse; + } + } + + /** + * Retrieves home timeline for the account since an Id value *synchronously* + * + * @return APIResponse + */ + public APIResponse getSubscriptionsTLSinceId(String since_id) { + try { + return getTL("/users/me/subscriptions/videos", null, null, null, since_id, null); + } catch (HttpsConnection.HttpsConnectionException e) { + setError(e.getStatusCode(), e); + return apiResponse; + } + } + + /** + * Retrieves home timeline for the account from a min Id value *synchronously* + * + * @return APIResponse + */ + public APIResponse getSubscriptionsTLMinId(String min_id) { + try { + return getTL("/users/me/subscriptions/videos", null, null, null, null, min_id); + } catch (HttpsConnection.HttpsConnectionException e) { + setError(e.getStatusCode(), e); + return apiResponse; + } + } + + /** + * Retrieves home timeline for the account *synchronously* + * + * @param max_id String id max + * @param since_id String since the id + * @return APIResponse + */ + private APIResponse getTL(String action, String sort, String filter, String max_id, String since_id, String min_id) throws HttpsConnection.HttpsConnectionException { + + HashMap params = new HashMap<>(); + if (max_id != null) + params.put("start", max_id); + if (since_id != null) + params.put("since_id", since_id); + if (min_id != null) + params.put("min_id", min_id); + params.put("count", String.valueOf(tootPerPage)); + if (sort != null) + params.put("sort", sort); + else + params.put("sort", "publishedAt"); + if (filter != null) + params.put("filter", filter); + SharedPreferences sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE); + boolean nsfw = sharedpreferences.getBoolean(Helper.SET_VIDEO_NSFW, false); + params.put("nsfw", String.valueOf(nsfw)); + List peertubes = new ArrayList<>(); + try { + HttpsConnection httpsConnection = new HttpsConnection(context, this.instance); + String response = httpsConnection.get(getAbsoluteUrl(action), 60, params, prefKeyOauthTokenT); + // Helper.largeLog(response); + if (!action.equals("/overviews/videos")) { + JSONArray values = new JSONObject(response).getJSONArray("data"); + peertubes = parsePeertube(values); + } else { + JSONArray categories = new JSONObject(response).getJSONArray("categories"); + JSONArray channels = new JSONObject(response).getJSONArray("channels"); + JSONArray tags = new JSONObject(response).getJSONArray("tags"); + + for (int i = 0; i < categories.length(); i++) { + JSONArray categoriesVideos = categories.getJSONObject(i).getJSONArray("videos"); + List peertubeCategories = parsePeertube(categoriesVideos); + if (peertubeCategories != null && peertubeCategories.size() > 0) { + peertubeCategories.get(0).setHeaderType("categories"); + peertubeCategories.get(0).setHeaderTypeValue(categories.getJSONObject(i).getJSONObject("category").getString("label")); + peertubes.addAll(peertubeCategories); + } + } + + + for (int i = 0; i < channels.length(); i++) { + JSONArray channelsVideos = channels.getJSONObject(i).getJSONArray("videos"); + List peertubeChannels = parsePeertube(channelsVideos); + if (peertubeChannels != null && peertubeChannels.size() > 0) { + peertubeChannels.get(0).setHeaderType("channels"); + peertubeChannels.get(0).setHeaderTypeValue(channels.getJSONObject(i).getJSONObject("channel").getString("displayName")); + peertubes.addAll(peertubeChannels); + } + } + + for (int i = 0; i < tags.length(); i++) { + JSONArray tagsVideos = tags.getJSONObject(i).getJSONArray("videos"); + List peertubeTags = parsePeertube(tagsVideos); + if (peertubeTags != null && peertubeTags.size() > 0) { + peertubeTags.get(0).setHeaderType("tags"); + peertubeTags.get(0).setHeaderTypeValue(tags.getJSONObject(i).getString("tag")); + peertubes.addAll(peertubeTags); + } + } + + + } + } catch (NoSuchAlgorithmException | IOException | KeyManagementException | JSONException e) { + e.printStackTrace(); + } + apiResponse.setPeertubes(peertubes); + return apiResponse; + } + + /** + * Retrieves Peertube channel from an account *synchronously* + * Peertube channels are dealt like accounts + * + * @return APIResponse + */ + public APIResponse getPeertubeChannel(String name) { + + List accounts = new ArrayList<>(); + try { + HttpsConnection httpsConnection = new HttpsConnection(context, this.instance); + String response = httpsConnection.get(getAbsoluteUrl(String.format("/accounts/%s/video-channels", name)), 60, null, null); + JSONArray jsonArray = new JSONObject(response).getJSONArray("data"); + accounts = parseAccountResponsePeertube(context, instance, jsonArray); + } catch (HttpsConnection.HttpsConnectionException e) { + setError(e.getStatusCode(), e); + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } catch (KeyManagementException e) { + e.printStackTrace(); + } catch (JSONException e) { + e.printStackTrace(); + } + apiResponse.setAccounts(accounts); + return apiResponse; + } + + /** + * Retrieves Peertube videos from an instance *synchronously* + * + * @return APIResponse + */ + public APIResponse getPeertubeChannelVideos(String instance, String name) { + + List peertubes = new ArrayList<>(); + try { + HttpsConnection httpsConnection = new HttpsConnection(context, this.instance); + String response = httpsConnection.get(String.format("https://" + instance + "/api/v1/video-channels/%s/videos", name), 60, null, null); + JSONArray jsonArray = new JSONObject(response).getJSONArray("data"); + peertubes = parsePeertube(jsonArray); + } catch (HttpsConnection.HttpsConnectionException e) { + setError(e.getStatusCode(), e); + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } catch (KeyManagementException e) { + e.printStackTrace(); + } catch (JSONException e) { + e.printStackTrace(); + } + apiResponse.setPeertubes(peertubes); + return apiResponse; + } + + /** + * Retrieves Peertube videos from an instance *synchronously* + * + * @return APIResponse + */ + public APIResponse getPeertube(String instance, String max_id) { + + List peertubes = new ArrayList<>(); + HashMap params = new HashMap<>(); + if (max_id == null) + max_id = "0"; + params.put("start", String.valueOf(tootPerPage)); + try { + HttpsConnection httpsConnection = new HttpsConnection(context, this.instance); + String response = httpsConnection.get("https://" + instance + "/api/v1/videos", 60, params, null); + JSONArray jsonArray = new JSONObject(response).getJSONArray("data"); + peertubes = parsePeertube(jsonArray); + } catch (HttpsConnection.HttpsConnectionException e) { + setError(e.getStatusCode(), e); + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } catch (KeyManagementException e) { + e.printStackTrace(); + } catch (JSONException e) { + e.printStackTrace(); + } + apiResponse.setPeertubes(peertubes); + return apiResponse; + } + + /** + * Retrieves Peertube videos from an instance *synchronously* + * + * @return APIResponse + */ + public APIResponse getSinglePeertube(String instance, String videoId, String token) { + + Peertube peertube = null; + try { + HttpsConnection httpsConnection = new HttpsConnection(context, this.instance); + String response = httpsConnection.get(String.format("https://" + instance + "/api/v1/videos/%s", videoId), 60, null, token); + JSONObject jsonObject = new JSONObject(response); + peertube = parseSinglePeertube(context, instance, jsonObject); + } catch (HttpsConnection.HttpsConnectionException e) { + setError(e.getStatusCode(), e); + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } catch (KeyManagementException e) { + e.printStackTrace(); + } catch (JSONException e) { + e.printStackTrace(); + } + List peertubes = new ArrayList<>(); + peertubes.add(peertube); + apiResponse.setPeertubes(peertubes); + return apiResponse; + } + + /** + * Retrieves peertube search *synchronously* + * + * @param query String search + * @return APIResponse + */ + public APIResponse searchPeertube(String instance, String query) { + HashMap params = new HashMap<>(); + params.put("count", String.valueOf(tootPerPage)); + try { + params.put("search", URLEncoder.encode(query, "UTF-8")); + } catch (UnsupportedEncodingException e) { + params.put("search", query); + } + List peertubes = new ArrayList<>(); + try { + HttpsConnection httpsConnection = new HttpsConnection(context, this.instance); + String response = httpsConnection.get("https://" + instance + "/api/v1/search/videos", 60, params, null); + JSONArray jsonArray = new JSONObject(response).getJSONArray("data"); + peertubes = parsePeertube(jsonArray); + } catch (HttpsConnection.HttpsConnectionException e) { + setError(e.getStatusCode(), e); + e.printStackTrace(); + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } catch (KeyManagementException e) { + e.printStackTrace(); + } catch (JSONException e) { + e.printStackTrace(); + } + apiResponse.setPeertubes(peertubes); + return apiResponse; + } + + /** + * Retrieves Peertube videos from an instance *synchronously* + * + * @return APIResponse + */ + public APIResponse getSinglePeertubeComments(String instance, String videoId) { + statuses = new ArrayList<>(); + try { + HttpsConnection httpsConnection = new HttpsConnection(context, this.instance); + String response = httpsConnection.get(String.format("https://" + instance + "/api/v1/videos/%s/comment-threads", videoId), 60, null, null); + JSONObject jsonObject = new JSONObject(response); + statuses = parseSinglePeertubeComments(context, instance, jsonObject); + } catch (HttpsConnection.HttpsConnectionException e) { + setError(e.getStatusCode(), e); + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } catch (KeyManagementException e) { + e.printStackTrace(); + } catch (JSONException e) { + e.printStackTrace(); + } + apiResponse.setStatuses(statuses); + return apiResponse; + } + + /** + * Retrieves rating of user on a video *synchronously* + * + * @param id String id + * @return APIResponse + */ + @SuppressWarnings("SameParameterValue") + public String getRating(String id) { + try { + HttpsConnection httpsConnection = new HttpsConnection(context, this.instance); + String response = httpsConnection.get(getAbsoluteUrl(String.format("/users/me/videos/%s/rating", id)), 60, null, prefKeyOauthTokenT); + return new JSONObject(response).get("rating").toString(); + } catch (HttpsConnection.HttpsConnectionException e) { + setError(e.getStatusCode(), e); + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } catch (KeyManagementException e) { + e.printStackTrace(); + } catch (JSONException e) { + e.printStackTrace(); + } + return null; + } + + /** + * Makes the post action for a status + * + * @param statusAction Enum + * @param targetedId String id of the targeted Id *can be this of a status or an account* + * @return in status code - Should be equal to 200 when action is done + */ + public int postAction(API.StatusAction statusAction, String targetedId) { + return postAction(statusAction, targetedId, null, null); + } + + public int postRating(String targetedId, String actionMore) { + return postAction(API.StatusAction.RATEVIDEO, targetedId, actionMore, null); + } + + public int postComment(String targetedId, String actionMore) { + return postAction(API.StatusAction.PEERTUBECOMMENT, targetedId, actionMore, null); + } + + public int postReply(String targetedId, String actionMore, String targetedComment) { + return postAction(API.StatusAction.PEERTUBEREPLY, targetedId, actionMore, targetedComment); + } + + public int deleteComment(String targetedId, String targetedComment) { + return postAction(API.StatusAction.PEERTUBEDELETECOMMENT, targetedId, null, targetedComment); + } + + public int deleteVideo(String targetedId) { + return postAction(API.StatusAction.PEERTUBEDELETEVIDEO, targetedId, null, null); + } + + /** + * Makes the post action + * + * @param statusAction Enum + * @param targetedId String id of the targeted Id *can be this of a status or an account* + * @param actionMore String another action + * @param targetedComment String another action + * @return in status code - Should be equal to 200 when action is done + */ + private int postAction(API.StatusAction statusAction, String targetedId, String actionMore, String targetedComment) { + + String action; + String actionCall = "POST"; + HashMap params = null; + switch (statusAction) { + case FOLLOW: + action = "/users/me/subscriptions"; + params = new HashMap<>(); + params.put("uri", targetedId); + break; + case UNFOLLOW: + action = String.format("/users/me/subscriptions/%s", targetedId); + actionCall = "DELETE"; + break; + case RATEVIDEO: + action = String.format("/videos/%s/rate", targetedId); + params = new HashMap<>(); + params.put("rating", actionMore); + actionCall = "PUT"; + break; + case PEERTUBECOMMENT: + action = String.format("/videos/%s/comment-threads", targetedId); + params = new HashMap<>(); + params.put("text", actionMore); + break; + case PEERTUBEDELETECOMMENT: + action = String.format("/videos/%s/comments/%s", targetedId, targetedComment); + actionCall = "DELETE"; + break; + case PEERTUBEDELETEVIDEO: + action = String.format("/videos/%s", targetedId); + actionCall = "DELETE"; + break; + case PEERTUBEREPLY: + action = String.format("/videos/%s/comment/%s", targetedId, targetedComment); + params = new HashMap<>(); + params.put("text", actionMore); + break; + default: + return -1; + } + try { + HttpsConnection httpsConnection = new HttpsConnection(context, this.instance); + if (actionCall.equals("POST")) + httpsConnection.post(getAbsoluteUrl(action), 60, params, prefKeyOauthTokenT); + else if (actionCall.equals("DELETE")) + httpsConnection.delete(getAbsoluteUrl(action), 60, params, prefKeyOauthTokenT); + else if (actionCall.equals("PUT")) + httpsConnection.put(getAbsoluteUrl(action), 60, params, prefKeyOauthTokenT); + actionCode = httpsConnection.getActionCode(); + } catch (HttpsConnection.HttpsConnectionException e) { + setError(e.getStatusCode(), e); + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } catch (KeyManagementException e) { + e.printStackTrace(); + } + return actionCode; + } + + /** + * Changes media description + * + * @param mediaId String + * @param description String + * @return Attachment + */ + public Attachment updateDescription(String mediaId, String description) { + + HashMap params = new HashMap<>(); + try { + params.put("description", URLEncoder.encode(description, "UTF-8")); + } catch (UnsupportedEncodingException e) { + params.put("description", description); + } + try { + HttpsConnection httpsConnection = new HttpsConnection(context, this.instance); + String response = httpsConnection.put(getAbsoluteUrl(String.format("/media/%s", mediaId)), 240, params, prefKeyOauthTokenT); + attachment = parseAttachmentResponse(new JSONObject(response)); + } catch (HttpsConnection.HttpsConnectionException e) { + setError(e.getStatusCode(), e); + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } catch (KeyManagementException e) { + e.printStackTrace(); + } catch (JSONException e) { + e.printStackTrace(); + } + return attachment; + } + + /** + * Video is in play lists + * + * @return APIResponse + */ + public APIResponse getPlaylistForVideo(String videoId) { + + HashMap params = new HashMap<>(); + params.put("videoIds", videoId); + List ids = new ArrayList<>(); + try { + String response = new HttpsConnection(context, this.instance).get(getAbsoluteUrl("/users/me/video-playlists/videos-exist"), 60, params, prefKeyOauthTokenT); + + JSONArray jsonArray = new JSONObject(response).getJSONArray(videoId); + try { + int i = 0; + while (i < jsonArray.length()) { + JSONObject resobj = jsonArray.getJSONObject(i); + String playlistId = resobj.getString("playlistId"); + ids.add(playlistId); + i++; + } + } catch (JSONException e) { + setDefaultError(e); + } + } catch (HttpsConnection.HttpsConnectionException e) { + setError(e.getStatusCode(), e); + e.printStackTrace(); + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } catch (KeyManagementException e) { + e.printStackTrace(); + } catch (JSONException e) { + e.printStackTrace(); + } + apiResponse = new APIResponse(); + apiResponse.setPlaylistForVideos(ids); + return apiResponse; + } + + /** + * Get lists for the user + * + * @return APIResponse + */ + public APIResponse getPlayists(String username) { + + List playlists = new ArrayList<>(); + try { + String response = new HttpsConnection(context, this.instance).get(getAbsoluteUrl(String.format("/accounts/%s/video-playlists", username)), 60, null, prefKeyOauthTokenT); + playlists = parsePlaylists(context, new JSONObject(response).getJSONArray("data")); + } catch (HttpsConnection.HttpsConnectionException e) { + setError(e.getStatusCode(), e); + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } catch (KeyManagementException e) { + e.printStackTrace(); + } catch (JSONException e) { + e.printStackTrace(); + } + apiResponse.setPlaylists(playlists); + return apiResponse; + } + + /** + * Delete a Playlist + * + * @param playlistId String, the playlist id + * @return int + */ + public int deletePlaylist(String playlistId) { + try { + HttpsConnection httpsConnection = new HttpsConnection(context, this.instance); + httpsConnection.delete(getAbsoluteUrl(String.format("/video-playlists/%s", playlistId)), 60, null, prefKeyOauthTokenT); + actionCode = httpsConnection.getActionCode(); + } catch (HttpsConnection.HttpsConnectionException e) { + setError(e.getStatusCode(), e); + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } catch (KeyManagementException e) { + e.printStackTrace(); + } + return actionCode; + } + + /** + * Delete video in a Playlist + * + * @param playlistId String, the playlist id + * @param videoId String, the video id + * @return int + */ + public int deleteVideoPlaylist(String playlistId, String videoId) { + try { + HttpsConnection httpsConnection = new HttpsConnection(context, this.instance); + httpsConnection.delete(getAbsoluteUrl(String.format("/video-playlists/%s/videos/%s", playlistId, videoId)), 60, null, prefKeyOauthTokenT); + actionCode = httpsConnection.getActionCode(); + } catch (HttpsConnection.HttpsConnectionException e) { + setError(e.getStatusCode(), e); + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } catch (KeyManagementException e) { + e.printStackTrace(); + } + return actionCode; + } + + /** + * Add video in a Playlist + * + * @param playlistId String, the playlist id + * @param videoId String, the video id + * @return int + */ + public int addVideoPlaylist(String playlistId, String videoId) { + try { + HttpsConnection httpsConnection = new HttpsConnection(context, this.instance); + HashMap params = new HashMap<>(); + params.put("videoId", videoId); + httpsConnection.post(getAbsoluteUrl(String.format("/video-playlists/%s/videos", playlistId)), 60, params, prefKeyOauthTokenT); + actionCode = httpsConnection.getActionCode(); + } catch (HttpsConnection.HttpsConnectionException e) { + setError(e.getStatusCode(), e); + e.printStackTrace(); + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } catch (KeyManagementException e) { + e.printStackTrace(); + } + return actionCode; + } + + /** + * Retrieves status for the account *synchronously* + * + * @param playlistid String Id of the playlist + * @param max_id String id max + * @param since_id String since the id + * @return APIResponse + */ + @SuppressWarnings("SameParameterValue") + public APIResponse getPlaylistVideos(String playlistid, String max_id, String since_id) { + + HashMap params = new HashMap<>(); + if (max_id != null) + params.put("start", max_id); + if (since_id != null) + params.put("since_id", since_id); + params.put("count", String.valueOf(tootPerPage)); + params.put("sort", "-updatedAt"); + List peertubes = new ArrayList<>(); + try { + HttpsConnection httpsConnection = new HttpsConnection(context, this.instance); + String response = httpsConnection.get(getAbsoluteUrl(String.format("/video-playlists/%s/videos", playlistid)), 60, params, prefKeyOauthTokenT); + JSONArray jsonArray = new JSONObject(response).getJSONArray("data"); + peertubes = parsePeertube(jsonArray); + + } catch (HttpsConnection.HttpsConnectionException e) { + setError(e.getStatusCode(), e); + e.printStackTrace(); + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } catch (KeyManagementException e) { + e.printStackTrace(); + } catch (JSONException e) { + e.printStackTrace(); + } + apiResponse.setPeertubes(peertubes); + return apiResponse; + } + + /** + * Parse json response for several howto + * + * @param jsonArray JSONArray + * @return List + */ + private List parseHowTos(JSONArray jsonArray) { + + List howToVideos = new ArrayList<>(); + try { + int i = 0; + while (i < jsonArray.length()) { + + JSONObject resobj = jsonArray.getJSONObject(i); + HowToVideo howToVideo = parseHowTo(context, resobj); + i++; + howToVideos.add(howToVideo); + } + + } catch (JSONException e) { + setDefaultError(e); + } + return howToVideos; + } + + /** + * Parse json response for peertube notifications + * + * @param jsonArray JSONArray + * @return List + */ + private List parsePeertubeNotifications(JSONArray jsonArray) { + List peertubeNotifications = new ArrayList<>(); + try { + int i = 0; + while (i < jsonArray.length()) { + JSONObject resobj = jsonArray.getJSONObject(i); + PeertubeNotification peertubeNotification = parsePeertubeNotifications(context, resobj); + i++; + peertubeNotifications.add(peertubeNotification); + } + } catch (JSONException e) { + setDefaultError(e); + } + return peertubeNotifications; + } + + /** + * Parse json response for several instance reg + * + * @param jsonArray JSONArray + * @return List + */ + public List parseInstanceReg(JSONArray jsonArray) { + + List instanceRegs = new ArrayList<>(); + try { + int i = 0; + while (i < jsonArray.length()) { + JSONObject resobj = jsonArray.getJSONObject(i); + InstanceReg instanceReg = parseInstanceReg(resobj); + i++; + instanceRegs.add(instanceReg); + } + } catch (JSONException e) { + e.printStackTrace(); + } + return instanceRegs; + } + + /** + * Parse json response an unique instance for registering + * + * @param resobj JSONObject + * @return InstanceReg + */ + private InstanceReg parseInstanceReg(JSONObject resobj) { + InstanceReg instanceReg = new InstanceReg(); + try { + instanceReg.setDomain(resobj.getString("host")); + instanceReg.setVersion(resobj.getString("version")); + instanceReg.setDescription(resobj.getString("shortDescription")); + instanceReg.setLanguage(resobj.getString("country")); + instanceReg.setCategory(""); + instanceReg.setProxied_thumbnail(""); + instanceReg.setTotal_users(resobj.getInt("totalUsers")); + instanceReg.setTotalInstanceFollowers(resobj.getInt("totalInstanceFollowers")); + instanceReg.setTotalInstanceFollowing(resobj.getInt("totalInstanceFollowing")); + instanceReg.setLast_week_users(0); + instanceReg.setCountry(resobj.getString("country")); + } catch (JSONException e) { + e.printStackTrace(); + } + return instanceReg; + } + + /** + * Parse json response for several howto + * + * @param jsonArray JSONArray + * @return List + */ + private List parsePeertube(JSONArray jsonArray) { + + List peertubes = new ArrayList<>(); + try { + int i = 0; + while (i < jsonArray.length()) { + JSONObject resobj = jsonArray.getJSONObject(i); + Peertube peertube = parsePeertube(context, resobj); + i++; + peertubes.add(peertube); + } + } catch (JSONException e) { + setDefaultError(e); + } + return peertubes; + } /** * Parse json response an unique instance @@ -1993,7 +2128,6 @@ public class PeertubeAPI { return instance; } - /** * Parse emojis * @@ -2016,25 +2150,6 @@ public class PeertubeAPI { return emojis; } - - /** - * Parse json response for emoji - * - * @param resobj JSONObject - * @return Emojis - */ - private static Emojis parseEmojis(JSONObject resobj) { - Emojis emojis = new Emojis(); - try { - emojis.setShortcode(resobj.get("shortcode").toString()); - emojis.setStatic_url(resobj.get("static_url").toString()); - emojis.setUrl(resobj.get("url").toString()); - } catch (Exception ignored) { - } - return emojis; - } - - /** * Parse emojis * @@ -2057,25 +2172,6 @@ public class PeertubeAPI { return emojis; } - - /** - * Parse json response for emoji - * - * @param resobj JSONObject - * @return Emojis - */ - private static Emojis parseMisskeyEmojis(JSONObject resobj) { - Emojis emojis = new Emojis(); - try { - emojis.setShortcode(resobj.get("name").toString()); - emojis.setStatic_url(resobj.get("url").toString()); - emojis.setUrl(resobj.get("url").toString()); - } catch (Exception ignored) { - } - return emojis; - } - - /** * Parse Filters * @@ -2137,7 +2233,6 @@ public class PeertubeAPI { } - /** * Parse Playlists * @@ -2160,49 +2255,6 @@ public class PeertubeAPI { return playlists; } - - /** - * Parse json response for emoji - * - * @param resobj JSONObject - * @return Emojis - */ - private static Playlist parsePlaylist(Context context, JSONObject resobj) { - Playlist playlist = new Playlist(); - try { - playlist.setId(resobj.getString("id")); - playlist.setUuid(resobj.getString("uuid")); - playlist.setCreatedAt(Helper.stringToDate(context, resobj.getString("createdAt"))); - playlist.setDescription(resobj.getString("description")); - playlist.setDisplayName(resobj.getString("displayName")); - playlist.setLocal(resobj.getBoolean("isLocal")); - playlist.setVideoChannelId(resobj.getString("videoChannel")); - playlist.setThumbnailPath(resobj.getString("thumbnailPath")); - playlist.setOwnerAccount(parseAccountResponsePeertube(context, resobj.getJSONObject("ownerAccount"))); - playlist.setVideosLength(resobj.getInt("videosLength")); - try { - LinkedHashMap type = new LinkedHashMap<>(); - LinkedHashMap privacy = new LinkedHashMap<>(); - privacy.put(resobj.getJSONObject("privacy").getInt("id"), resobj.getJSONObject("privacy").get("label").toString()); - type.put(resobj.getJSONObject("type").getInt("id"), resobj.getJSONObject("type").get("label").toString()); - playlist.setType(type); - playlist.setPrivacy(privacy); - } catch (Exception ignored) { - ignored.printStackTrace(); - } - - - try { - playlist.setUpdatedAt(Helper.stringToDate(context, resobj.getString("updatedAt"))); - } catch (Exception ignored) { - ignored.printStackTrace(); - } - } catch (Exception ignored) { - ignored.printStackTrace(); - } - return playlist; - } - private List parseAccountResponsePeertube(Context context, String instance, JSONArray jsonArray) { List accounts = new ArrayList<>(); try { @@ -2219,58 +2271,6 @@ public class PeertubeAPI { return accounts; } - /** - * Parse json response an unique peertube account - * - * @param accountObject JSONObject - * @return Account - */ - private static Account parseAccountResponsePeertube(Context context, JSONObject accountObject) { - Account account = new Account(); - try { - account.setId(accountObject.get("id").toString()); - account.setUuid(accountObject.get("id").toString()); - account.setUsername(accountObject.get("name").toString()); - account.setAcct(accountObject.get("name").toString() + "@" + accountObject.get("host")); - account.setDisplay_name(accountObject.get("name").toString()); - account.setHost(accountObject.get("host").toString()); - account.setSocial("PEERTUBE"); - - if (accountObject.has("createdAt")) - account.setCreated_at(Helper.mstStringToDate(context, accountObject.get("createdAt").toString())); - else - account.setCreated_at(new Date()); - if (accountObject.has("followersCount")) - account.setFollowers_count(Integer.valueOf(accountObject.get("followersCount").toString())); - else - account.setFollowers_count(0); - if (accountObject.has("followingCount")) - account.setFollowing_count(Integer.valueOf(accountObject.get("followingCount").toString())); - else - account.setFollowing_count(0); - account.setStatuses_count(0); - if (accountObject.has("description")) - account.setNote(accountObject.get("description").toString()); - else - account.setNote(""); - - account.setUrl(accountObject.get("url").toString()); - if (accountObject.has("avatar") && !accountObject.isNull("avatar")) { - account.setAvatar(accountObject.getJSONObject("avatar").get("path").toString()); - } else - account.setAvatar("null"); - account.setHeader("null"); - account.setHeader_static("null"); - account.setAvatar_static(accountObject.get("avatar").toString()); - } catch (JSONException ignored) { - ignored.printStackTrace(); - } catch (ParseException e) { - e.printStackTrace(); - } - return account; - } - - /** * Parse json response an unique relationship * @@ -2308,7 +2308,6 @@ public class PeertubeAPI { return relationship; } - /** * Parse json response for list of relationship * @@ -2332,47 +2331,6 @@ public class PeertubeAPI { return relationships; } - - /** - * Parse json response an unique attachment - * - * @param resobj JSONObject - * @return Relationship - */ - static Attachment parseAttachmentResponse(JSONObject resobj) { - - Attachment attachment = new Attachment(); - try { - attachment.setId(resobj.get("id").toString()); - attachment.setType(resobj.get("type").toString()); - attachment.setUrl(resobj.get("url").toString()); - try { - attachment.setDescription(resobj.get("description").toString()); - } catch (JSONException ignore) { - } - try { - attachment.setRemote_url(resobj.get("remote_url").toString()); - } catch (JSONException ignore) { - } - try { - attachment.setPreview_url(resobj.get("preview_url").toString()); - } catch (JSONException ignore) { - } - try { - attachment.setMeta(resobj.get("meta").toString()); - } catch (JSONException ignore) { - } - try { - attachment.setText_url(resobj.get("text_url").toString()); - } catch (JSONException ignore) { - } - - } catch (JSONException ignored) { - } - return attachment; - } - - /** * Set the error message * diff --git a/app/src/main/java/app/fedilab/android/client/PixelfedAPI.java b/app/src/main/java/app/fedilab/android/client/PixelfedAPI.java index 800721d5f..0d9e62ef2 100644 --- a/app/src/main/java/app/fedilab/android/client/PixelfedAPI.java +++ b/app/src/main/java/app/fedilab/android/client/PixelfedAPI.java @@ -31,7 +31,6 @@ import app.fedilab.android.sqlite.Sqlite; public class PixelfedAPI { - private Context context; private PixelFedStory pixelFedStory; private int tootPerPage; @@ -49,7 +48,7 @@ public class PixelfedAPI { } SharedPreferences sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE); tootPerPage = sharedpreferences.getInt(Helper.SET_TOOT_PER_PAGE, Helper.TOOTS_PER_PAGE); - if( MainActivity.social == UpdateAccountInfoAsyncTask.SOCIAL.PIXELFED && tootPerPage > 30 ){ + if (MainActivity.social == UpdateAccountInfoAsyncTask.SOCIAL.PIXELFED && tootPerPage > 30) { tootPerPage = 30; } this.prefKeyOauthTokenT = sharedpreferences.getString(Helper.PREF_KEY_OAUTH_TOKEN, null); @@ -71,6 +70,74 @@ public class PixelfedAPI { APIError = null; } + /** + * Parse a single item for stories + * + * @param jsonObject JSONObject + * @return PixelFedStoryItem + */ + private static PixelFedStory parseStory(JSONObject jsonObject) { + PixelFedStory pixelFedStory = new PixelFedStory(); + try { + pixelFedStory.setId(jsonObject.getString("id")); + pixelFedStory.setPhoto(jsonObject.getString("photo")); + pixelFedStory.setName(jsonObject.getString("name")); + pixelFedStory.setLink(jsonObject.getString("link")); + pixelFedStory.setLastUpdated(new Date(Long.valueOf(jsonObject.getString("lastUpdated")))); + pixelFedStory.setSeen(jsonObject.getBoolean("seen")); + pixelFedStory.setPixelFedStoryItems(parseStoryItems(jsonObject.getJSONArray("items"))); + } catch (JSONException ignored) { + } + return pixelFedStory; + } + + /** + * Parse json response for several items for stories + * + * @param jsonArray JSONArray + * @return List + */ + private static List parseStoryItems(JSONArray jsonArray) { + + List pixelFedStoryItems = new ArrayList<>(); + try { + int i = 0; + while (i < jsonArray.length()) { + + JSONObject resobj = jsonArray.getJSONObject(i); + PixelFedStoryItem pixelFedStoryItem = parseStoryItem(resobj); + i++; + pixelFedStoryItems.add(pixelFedStoryItem); + } + } catch (JSONException e) { + e.printStackTrace(); + } + return pixelFedStoryItems; + } + + /** + * Parse a single item for stories + * + * @param jsonObject JSONObject + * @return PixelFedStoryItem + */ + private static PixelFedStoryItem parseStoryItem(JSONObject jsonObject) { + PixelFedStoryItem pixelFedStoryItem = new PixelFedStoryItem(); + try { + pixelFedStoryItem.setId(jsonObject.getString("id")); + pixelFedStoryItem.setType(jsonObject.getString("type")); + pixelFedStoryItem.setLength(jsonObject.getInt("length")); + pixelFedStoryItem.setSrc(jsonObject.getString("src")); + pixelFedStoryItem.setPreview(jsonObject.getString("preview")); + pixelFedStoryItem.setLink(jsonObject.getString("link")); + pixelFedStoryItem.setLinkText(jsonObject.getString("linkText")); + pixelFedStoryItem.setTime(new Date(Long.valueOf(jsonObject.getString("time")))); + pixelFedStoryItem.setExpires_at(new Date(Long.valueOf(jsonObject.getString("expires_at")))); + pixelFedStoryItem.setSeen(jsonObject.getBoolean("seen")); + } catch (JSONException ignored) { + } + return pixelFedStoryItem; + } /** * Retrieves Pixelfed Own Stories *synchronously* @@ -118,78 +185,6 @@ public class PixelfedAPI { return actionCode; } - - /** - * Parse a single item for stories - * @param jsonObject JSONObject - * @return PixelFedStoryItem - */ - private static PixelFedStory parseStory(JSONObject jsonObject) { - PixelFedStory pixelFedStory = new PixelFedStory(); - try { - pixelFedStory.setId(jsonObject.getString("id")); - pixelFedStory.setPhoto(jsonObject.getString("photo")); - pixelFedStory.setName(jsonObject.getString("name")); - pixelFedStory.setLink(jsonObject.getString("link")); - pixelFedStory.setLastUpdated(new Date(Long.valueOf(jsonObject.getString("lastUpdated")))); - pixelFedStory.setSeen(jsonObject.getBoolean("seen")); - pixelFedStory.setPixelFedStoryItems(parseStoryItems(jsonObject.getJSONArray("items"))); - } catch (JSONException ignored) { - } - return pixelFedStory; - } - - - - /** - * Parse json response for several items for stories - * - * @param jsonArray JSONArray - * @return List - */ - private static List parseStoryItems(JSONArray jsonArray) { - - List pixelFedStoryItems = new ArrayList<>(); - try { - int i = 0; - while (i < jsonArray.length()) { - - JSONObject resobj = jsonArray.getJSONObject(i); - PixelFedStoryItem pixelFedStoryItem = parseStoryItem(resobj); - i++; - pixelFedStoryItems.add(pixelFedStoryItem); - } - } catch (JSONException e) { - e.printStackTrace(); - } - return pixelFedStoryItems; - } - - - /** - * Parse a single item for stories - * @param jsonObject JSONObject - * @return PixelFedStoryItem - */ - private static PixelFedStoryItem parseStoryItem(JSONObject jsonObject) { - PixelFedStoryItem pixelFedStoryItem = new PixelFedStoryItem(); - try { - pixelFedStoryItem.setId(jsonObject.getString("id")); - pixelFedStoryItem.setType(jsonObject.getString("type")); - pixelFedStoryItem.setLength(jsonObject.getInt("length")); - pixelFedStoryItem.setSrc(jsonObject.getString("src")); - pixelFedStoryItem.setPreview(jsonObject.getString("preview")); - pixelFedStoryItem.setLink(jsonObject.getString("link")); - pixelFedStoryItem.setLinkText(jsonObject.getString("linkText")); - pixelFedStoryItem.setTime(new Date(Long.valueOf(jsonObject.getString("time")))); - pixelFedStoryItem.setExpires_at(new Date(Long.valueOf(jsonObject.getString("expires_at")))); - pixelFedStoryItem.setSeen(jsonObject.getBoolean("seen")); - } catch (JSONException ignored) { - } - return pixelFedStoryItem; - } - - /** * Set the error message * @@ -216,7 +211,7 @@ public class PixelfedAPI { private void setDefaultError(Exception e) { APIError = new Error(); - if( apiResponse == null){ + if (apiResponse == null) { apiResponse = new APIResponse(); } if (e.getLocalizedMessage() != null && e.getLocalizedMessage().trim().length() > 0) @@ -234,7 +229,6 @@ public class PixelfedAPI { } - private String getAbsoluteUrl(String action) { return Helper.instanceWithProtocol(this.context, this.instance) + "/api/stories/v1" + action; } diff --git a/app/src/main/java/app/fedilab/android/client/TLSSocketFactory.java b/app/src/main/java/app/fedilab/android/client/TLSSocketFactory.java index a5d98c185..34c831c4a 100644 --- a/app/src/main/java/app/fedilab/android/client/TLSSocketFactory.java +++ b/app/src/main/java/app/fedilab/android/client/TLSSocketFactory.java @@ -8,8 +8,6 @@ import java.net.InetAddress; import java.net.Socket; import java.security.KeyManagementException; import java.security.NoSuchAlgorithmException; -import java.security.cert.CertificateException; -import java.security.cert.X509Certificate; import javax.net.ssl.SSLContext; import javax.net.ssl.SSLEngine; diff --git a/app/src/main/java/app/fedilab/android/client/Tls12SocketFactory.java b/app/src/main/java/app/fedilab/android/client/Tls12SocketFactory.java index 0b1161690..474da8751 100644 --- a/app/src/main/java/app/fedilab/android/client/Tls12SocketFactory.java +++ b/app/src/main/java/app/fedilab/android/client/Tls12SocketFactory.java @@ -42,12 +42,12 @@ public class Tls12SocketFactory extends SSLSocketFactory { } @Override - public Socket createSocket(String host, int port) throws IOException, UnknownHostException { + public Socket createSocket(String host, int port) throws IOException { return patch(delegate.createSocket(host, port)); } @Override - public Socket createSocket(String host, int port, InetAddress localHost, int localPort) throws IOException, UnknownHostException { + public Socket createSocket(String host, int port, InetAddress localHost, int localPort) throws IOException { return patch(delegate.createSocket(host, port, localHost, localPort)); } diff --git a/app/src/main/java/app/fedilab/android/drawers/AccountLiveAdapter.java b/app/src/main/java/app/fedilab/android/drawers/AccountLiveAdapter.java index 6a0ec1290..bc53439db 100644 --- a/app/src/main/java/app/fedilab/android/drawers/AccountLiveAdapter.java +++ b/app/src/main/java/app/fedilab/android/drawers/AccountLiveAdapter.java @@ -15,19 +15,19 @@ package app.fedilab.android.drawers; * see . */ -import android.app.NotificationManager; import android.content.Context; -import android.content.Intent; import android.content.SharedPreferences; -import android.os.Build; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; + import androidx.annotation.NonNull; import androidx.appcompat.widget.SwitchCompat; import androidx.recyclerview.widget.RecyclerView; + import java.util.List; + import app.fedilab.android.R; import app.fedilab.android.client.Entities.Account; import app.fedilab.android.helper.Helper; @@ -71,7 +71,7 @@ public class AccountLiveAdapter extends RecyclerView.Adapter { @Override public void onClick(View v) { SharedPreferences.Editor editor = sharedpreferences.edit(); - editor.putBoolean(Helper.SET_ALLOW_STREAM + accounts.get(i).getId() + accounts.get(i).getInstance(), holder.account_acct_live_notifications.isChecked()); + editor.putBoolean(Helper.SET_ALLOW_STREAM + accounts.get(i).getId() + accounts.get(i).getInstance(), holder.account_acct_live_notifications.isChecked()); editor.apply(); if (holder.account_acct_live_notifications.isChecked()) { LiveNotificationDelayedService.totalAccount++; diff --git a/app/src/main/java/app/fedilab/android/drawers/AccountSearchDevAdapter.java b/app/src/main/java/app/fedilab/android/drawers/AccountSearchDevAdapter.java index c7a726b9b..38d2a979e 100644 --- a/app/src/main/java/app/fedilab/android/drawers/AccountSearchDevAdapter.java +++ b/app/src/main/java/app/fedilab/android/drawers/AccountSearchDevAdapter.java @@ -20,11 +20,6 @@ import android.graphics.drawable.Drawable; import android.os.AsyncTask; import android.os.Build; import android.os.Bundle; - -import com.google.android.material.floatingactionbutton.FloatingActionButton; - -import androidx.core.content.ContextCompat; - import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -34,19 +29,22 @@ import android.widget.LinearLayout; import android.widget.TextView; import android.widget.Toast; +import androidx.core.content.ContextCompat; + import com.bumptech.glide.Glide; +import com.google.android.material.floatingactionbutton.FloatingActionButton; import java.util.List; +import app.fedilab.android.R; +import app.fedilab.android.activities.ShowAccountActivity; +import app.fedilab.android.asynctasks.PostActionAsyncTask; import app.fedilab.android.client.API; import app.fedilab.android.client.Entities.Account; import app.fedilab.android.client.Entities.Error; import app.fedilab.android.helper.Helper; -import es.dmoral.toasty.Toasty; -import app.fedilab.android.R; -import app.fedilab.android.activities.ShowAccountActivity; -import app.fedilab.android.asynctasks.PostActionAsyncTask; import app.fedilab.android.interfaces.OnPostActionInterface; +import es.dmoral.toasty.Toasty; /** diff --git a/app/src/main/java/app/fedilab/android/drawers/AccountsFollowRequestAdapter.java b/app/src/main/java/app/fedilab/android/drawers/AccountsFollowRequestAdapter.java index 17f5ec2cb..b55742702 100644 --- a/app/src/main/java/app/fedilab/android/drawers/AccountsFollowRequestAdapter.java +++ b/app/src/main/java/app/fedilab/android/drawers/AccountsFollowRequestAdapter.java @@ -17,14 +17,9 @@ package app.fedilab.android.drawers; import android.content.Context; import android.content.Intent; -import android.content.SharedPreferences; import android.graphics.PorterDuff; import android.os.AsyncTask; import android.os.Bundle; - -import androidx.core.content.ContextCompat; -import androidx.recyclerview.widget.RecyclerView; - import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -33,6 +28,9 @@ import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast; +import androidx.core.content.ContextCompat; +import androidx.recyclerview.widget.RecyclerView; + import com.bumptech.glide.Glide; import org.jetbrains.annotations.NotNull; @@ -40,15 +38,15 @@ import org.jetbrains.annotations.NotNull; import java.util.ArrayList; import java.util.List; +import app.fedilab.android.R; +import app.fedilab.android.activities.ShowAccountActivity; +import app.fedilab.android.asynctasks.PostActionAsyncTask; import app.fedilab.android.client.API; import app.fedilab.android.client.Entities.Account; import app.fedilab.android.client.Entities.Error; import app.fedilab.android.helper.Helper; -import es.dmoral.toasty.Toasty; -import app.fedilab.android.R; -import app.fedilab.android.activities.ShowAccountActivity; -import app.fedilab.android.asynctasks.PostActionAsyncTask; import app.fedilab.android.interfaces.OnPostActionInterface; +import es.dmoral.toasty.Toasty; /** diff --git a/app/src/main/java/app/fedilab/android/drawers/AccountsInAListAdapter.java b/app/src/main/java/app/fedilab/android/drawers/AccountsInAListAdapter.java index 134561586..40f22e9d9 100644 --- a/app/src/main/java/app/fedilab/android/drawers/AccountsInAListAdapter.java +++ b/app/src/main/java/app/fedilab/android/drawers/AccountsInAListAdapter.java @@ -18,11 +18,6 @@ import android.content.Context; import android.content.Intent; import android.os.AsyncTask; import android.os.Bundle; - -import com.google.android.material.floatingactionbutton.FloatingActionButton; - -import androidx.recyclerview.widget.RecyclerView; - import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -31,20 +26,24 @@ import android.widget.LinearLayout; import android.widget.TextView; import android.widget.Toast; +import androidx.recyclerview.widget.RecyclerView; + +import com.google.android.material.floatingactionbutton.FloatingActionButton; + import org.jetbrains.annotations.NotNull; import java.util.ArrayList; import java.util.List; -import app.fedilab.android.client.APIResponse; -import app.fedilab.android.client.Entities.Account; -import app.fedilab.android.helper.Helper; -import es.dmoral.toasty.Toasty; import app.fedilab.android.R; import app.fedilab.android.activities.ManageAccountsInListActivity; import app.fedilab.android.activities.ShowAccountActivity; import app.fedilab.android.asynctasks.ManageListsAsyncTask; +import app.fedilab.android.client.APIResponse; +import app.fedilab.android.client.Entities.Account; +import app.fedilab.android.helper.Helper; import app.fedilab.android.interfaces.OnListActionInterface; +import es.dmoral.toasty.Toasty; /** @@ -60,11 +59,6 @@ public class AccountsInAListAdapter extends RecyclerView.Adapter implements OnLi private String listId; private List allAccount = new ArrayList<>(); - public enum type { - CURRENT, - SEARCH - } - public AccountsInAListAdapter(type actionType, String listId, List accounts) { this.accounts = accounts; this.accountsInAListAdapter = this; @@ -167,7 +161,6 @@ public class AccountsInAListAdapter extends RecyclerView.Adapter implements OnLi return false; } - @Override public void onActionDone(ManageListsAsyncTask.action actionType, APIResponse apiResponse, int statusCode) { if (actionType == ManageListsAsyncTask.action.DELETE_USERS && statusCode != 200) { @@ -185,6 +178,10 @@ public class AccountsInAListAdapter extends RecyclerView.Adapter implements OnLi return accounts.size(); } + public enum type { + CURRENT, + SEARCH + } private class ViewHolder extends RecyclerView.ViewHolder { ImageView account_pp; diff --git a/app/src/main/java/app/fedilab/android/drawers/AccountsListAdapter.java b/app/src/main/java/app/fedilab/android/drawers/AccountsListAdapter.java index a848346f7..e0cc0ef20 100644 --- a/app/src/main/java/app/fedilab/android/drawers/AccountsListAdapter.java +++ b/app/src/main/java/app/fedilab/android/drawers/AccountsListAdapter.java @@ -23,15 +23,6 @@ import android.database.sqlite.SQLiteDatabase; import android.os.AsyncTask; import android.os.Build; import android.os.Bundle; - -import androidx.annotation.NonNull; - -import com.google.android.material.floatingactionbutton.FloatingActionButton; - -import androidx.appcompat.app.AlertDialog; -import androidx.core.content.ContextCompat; -import androidx.recyclerview.widget.RecyclerView; - import android.text.Html; import android.text.util.Linkify; import android.view.LayoutInflater; @@ -42,26 +33,33 @@ import android.widget.LinearLayout; import android.widget.TextView; import android.widget.Toast; +import androidx.annotation.NonNull; +import androidx.appcompat.app.AlertDialog; +import androidx.core.content.ContextCompat; +import androidx.recyclerview.widget.RecyclerView; + +import com.google.android.material.floatingactionbutton.FloatingActionButton; + import java.util.ArrayList; import java.util.List; -import app.fedilab.android.activities.GroupActivity; -import app.fedilab.android.client.API; -import app.fedilab.android.client.Entities.Account; -import app.fedilab.android.client.Entities.Error; -import app.fedilab.android.helper.CrossActions; -import app.fedilab.android.helper.Helper; -import app.fedilab.android.sqlite.InstancesDAO; -import app.fedilab.android.sqlite.Sqlite; -import es.dmoral.toasty.Toasty; import app.fedilab.android.R; +import app.fedilab.android.activities.GroupActivity; import app.fedilab.android.activities.MainActivity; import app.fedilab.android.activities.ShowAccountActivity; import app.fedilab.android.asynctasks.PostActionAsyncTask; import app.fedilab.android.asynctasks.RetrieveAccountsAsyncTask; import app.fedilab.android.asynctasks.UpdateAccountInfoAsyncTask; +import app.fedilab.android.client.API; +import app.fedilab.android.client.Entities.Account; +import app.fedilab.android.client.Entities.Error; +import app.fedilab.android.helper.CrossActions; +import app.fedilab.android.helper.Helper; import app.fedilab.android.interfaces.OnPostActionInterface; import app.fedilab.android.interfaces.OnRetrieveEmojiAccountInterface; +import app.fedilab.android.sqlite.InstancesDAO; +import app.fedilab.android.sqlite.Sqlite; +import es.dmoral.toasty.Toasty; /** diff --git a/app/src/main/java/app/fedilab/android/drawers/AccountsReplyAdapter.java b/app/src/main/java/app/fedilab/android/drawers/AccountsReplyAdapter.java index 679629273..0fc845df5 100644 --- a/app/src/main/java/app/fedilab/android/drawers/AccountsReplyAdapter.java +++ b/app/src/main/java/app/fedilab/android/drawers/AccountsReplyAdapter.java @@ -16,10 +16,6 @@ package app.fedilab.android.drawers; import android.app.Activity; -import android.content.Context; - -import androidx.annotation.NonNull; - import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -30,14 +26,16 @@ import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; +import androidx.annotation.NonNull; + import com.bumptech.glide.Glide; import java.lang.ref.WeakReference; import java.util.List; -import app.fedilab.android.client.Entities.Account; import app.fedilab.android.R; import app.fedilab.android.activities.TootActivity; +import app.fedilab.android.client.Entities.Account; /** diff --git a/app/src/main/java/app/fedilab/android/drawers/AccountsSearchAdapter.java b/app/src/main/java/app/fedilab/android/drawers/AccountsSearchAdapter.java index 7252663e1..dd6601701 100644 --- a/app/src/main/java/app/fedilab/android/drawers/AccountsSearchAdapter.java +++ b/app/src/main/java/app/fedilab/android/drawers/AccountsSearchAdapter.java @@ -18,9 +18,6 @@ package app.fedilab.android.drawers; import android.content.Context; import android.content.SharedPreferences; import android.database.sqlite.SQLiteDatabase; - -import androidx.annotation.NonNull; - import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -31,17 +28,18 @@ import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; +import androidx.annotation.NonNull; import com.bumptech.glide.Glide; import java.util.ArrayList; import java.util.List; +import app.fedilab.android.R; import app.fedilab.android.client.Entities.Account; import app.fedilab.android.helper.Helper; import app.fedilab.android.sqlite.AccountDAO; import app.fedilab.android.sqlite.Sqlite; -import app.fedilab.android.R; /** @@ -54,6 +52,40 @@ public class AccountsSearchAdapter extends ArrayAdapter implements Filt private LayoutInflater layoutInflater; private boolean owner; private Context context; + private Filter accountFilter = new Filter() { + @Override + public CharSequence convertResultToString(Object resultValue) { + Account account = (Account) resultValue; + return "@" + account.getAcct(); + } + + @Override + protected FilterResults performFiltering(CharSequence constraint) { + if (constraint != null) { + suggestions.clear(); + suggestions.addAll(tempAccounts); + FilterResults filterResults = new FilterResults(); + filterResults.values = suggestions; + filterResults.count = suggestions.size(); + return filterResults; + } else { + return new FilterResults(); + } + } + + @Override + protected void publishResults(CharSequence constraint, FilterResults results) { + ArrayList c = (ArrayList) results.values; + if (results.count > 0) { + clear(); + addAll(c); + notifyDataSetChanged(); + } else { + clear(); + notifyDataSetChanged(); + } + } + }; public AccountsSearchAdapter(Context context, List accounts) { super(context, android.R.layout.simple_list_item_1, accounts); @@ -65,6 +97,7 @@ public class AccountsSearchAdapter extends ArrayAdapter implements Filt this.owner = false; } + public AccountsSearchAdapter(Context context, List accounts, boolean owner) { super(context, android.R.layout.simple_list_item_1, accounts); this.accounts = accounts; @@ -75,7 +108,6 @@ public class AccountsSearchAdapter extends ArrayAdapter implements Filt this.owner = owner; } - @Override public int getCount() { return accounts.size(); @@ -91,7 +123,6 @@ public class AccountsSearchAdapter extends ArrayAdapter implements Filt return position; } - @NonNull @Override public View getView(final int position, View convertView, @NonNull ViewGroup parent) { @@ -138,42 +169,6 @@ public class AccountsSearchAdapter extends ArrayAdapter implements Filt return accountFilter; } - - private Filter accountFilter = new Filter() { - @Override - public CharSequence convertResultToString(Object resultValue) { - Account account = (Account) resultValue; - return "@" + account.getAcct(); - } - - @Override - protected FilterResults performFiltering(CharSequence constraint) { - if (constraint != null) { - suggestions.clear(); - suggestions.addAll(tempAccounts); - FilterResults filterResults = new FilterResults(); - filterResults.values = suggestions; - filterResults.count = suggestions.size(); - return filterResults; - } else { - return new FilterResults(); - } - } - - @Override - protected void publishResults(CharSequence constraint, FilterResults results) { - ArrayList c = (ArrayList) results.values; - if (results.count > 0) { - clear(); - addAll(c); - notifyDataSetChanged(); - } else { - clear(); - notifyDataSetChanged(); - } - } - }; - private class ViewHolder { ImageView account_pp; TextView account_dn; diff --git a/app/src/main/java/app/fedilab/android/drawers/ArtListAdapter.java b/app/src/main/java/app/fedilab/android/drawers/ArtListAdapter.java index 77ba3116f..386467bd2 100644 --- a/app/src/main/java/app/fedilab/android/drawers/ArtListAdapter.java +++ b/app/src/main/java/app/fedilab/android/drawers/ArtListAdapter.java @@ -20,10 +20,6 @@ import android.content.Intent; import android.content.SharedPreferences; import android.database.sqlite.SQLiteDatabase; import android.os.Bundle; - -import androidx.annotation.NonNull; -import androidx.recyclerview.widget.RecyclerView; - import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -33,11 +29,17 @@ import android.widget.RelativeLayout; import android.widget.TextView; import android.widget.Toast; +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + import com.bumptech.glide.Glide; import java.util.ArrayList; import java.util.List; +import app.fedilab.android.R; +import app.fedilab.android.activities.ShowAccountActivity; +import app.fedilab.android.activities.ShowConversationActivity; import app.fedilab.android.activities.SlideMediaActivity; import app.fedilab.android.client.API; import app.fedilab.android.client.APIResponse; @@ -47,15 +49,12 @@ import app.fedilab.android.client.Entities.Error; import app.fedilab.android.client.Entities.Notification; import app.fedilab.android.client.Entities.Status; import app.fedilab.android.helper.Helper; -import app.fedilab.android.sqlite.Sqlite; -import app.fedilab.android.sqlite.StatusCacheDAO; -import es.dmoral.toasty.Toasty; -import app.fedilab.android.R; -import app.fedilab.android.activities.ShowAccountActivity; -import app.fedilab.android.activities.ShowConversationActivity; import app.fedilab.android.interfaces.OnPostActionInterface; import app.fedilab.android.interfaces.OnRetrieveEmojiInterface; import app.fedilab.android.interfaces.OnRetrieveRepliesInterface; +import app.fedilab.android.sqlite.Sqlite; +import app.fedilab.android.sqlite.StatusCacheDAO; +import es.dmoral.toasty.Toasty; /** @@ -64,11 +63,11 @@ import app.fedilab.android.interfaces.OnRetrieveRepliesInterface; */ public class ArtListAdapter extends RecyclerView.Adapter implements OnPostActionInterface, OnRetrieveEmojiInterface, OnRetrieveRepliesInterface { + private static final int DISPLAYED_STATUS = 1; + private final int HIDDEN_STATUS = 0; private Context context; private List statuses; private ArtListAdapter statusListAdapter; - private final int HIDDEN_STATUS = 0; - private static final int DISPLAYED_STATUS = 1; public ArtListAdapter(List statuses) { @@ -103,39 +102,11 @@ public class ArtListAdapter extends RecyclerView.Adapter implements OnPostAction notifyStatusChanged(modifiedStatus.get(0)); } - - private class ViewHolderEmpty extends RecyclerView.ViewHolder { - ViewHolderEmpty(View itemView) { - super(itemView); - } - } - @Override public void onViewAttachedToWindow(@NonNull RecyclerView.ViewHolder holder) { super.onViewAttachedToWindow(holder); } - - private class ViewHolderArt extends RecyclerView.ViewHolder { - ImageView art_media, art_pp; - TextView art_username, art_acct; - LinearLayout art_author; - RelativeLayout status_show_more; - ImageView show_more_button_art; - - ViewHolderArt(View itemView) { - super(itemView); - art_media = itemView.findViewById(R.id.art_media); - art_pp = itemView.findViewById(R.id.art_pp); - art_username = itemView.findViewById(R.id.art_username); - art_acct = itemView.findViewById(R.id.art_acct); - art_author = itemView.findViewById(R.id.art_author); - status_show_more = itemView.findViewById(R.id.status_show_more); - show_more_button_art = itemView.findViewById(R.id.show_more_button_art); - } - } - - public Status getItem(int position) { if (statuses.size() > position && position >= 0) return statuses.get(position); @@ -168,7 +139,6 @@ public class ArtListAdapter extends RecyclerView.Adapter implements OnPostAction return new ViewHolderEmpty(layoutInflater.inflate(R.layout.drawer_empty, parent, false)); } - @SuppressLint("SetJavaScriptEnabled") @Override public void onBindViewHolder(@NonNull final RecyclerView.ViewHolder viewHolder, int i) { @@ -237,7 +207,6 @@ public class ArtListAdapter extends RecyclerView.Adapter implements OnPostAction } - @Override public void onPostAction(int statusCode, API.StatusAction statusAction, String targetedId, Error error) { @@ -324,7 +293,6 @@ public class ArtListAdapter extends RecyclerView.Adapter implements OnPostAction } } - @Override public void onRetrieveEmoji(Status status, boolean fromTranslation) { if (status != null) { @@ -347,4 +315,29 @@ public class ArtListAdapter extends RecyclerView.Adapter implements OnPostAction } + private class ViewHolderEmpty extends RecyclerView.ViewHolder { + ViewHolderEmpty(View itemView) { + super(itemView); + } + } + + private class ViewHolderArt extends RecyclerView.ViewHolder { + ImageView art_media, art_pp; + TextView art_username, art_acct; + LinearLayout art_author; + RelativeLayout status_show_more; + ImageView show_more_button_art; + + ViewHolderArt(View itemView) { + super(itemView); + art_media = itemView.findViewById(R.id.art_media); + art_pp = itemView.findViewById(R.id.art_pp); + art_username = itemView.findViewById(R.id.art_username); + art_acct = itemView.findViewById(R.id.art_acct); + art_author = itemView.findViewById(R.id.art_author); + status_show_more = itemView.findViewById(R.id.status_show_more); + show_more_button_art = itemView.findViewById(R.id.show_more_button_art); + } + } + } \ No newline at end of file diff --git a/app/src/main/java/app/fedilab/android/drawers/CustomEmojiAdapter.java b/app/src/main/java/app/fedilab/android/drawers/CustomEmojiAdapter.java index 9d5a9e5cc..5276ced06 100644 --- a/app/src/main/java/app/fedilab/android/drawers/CustomEmojiAdapter.java +++ b/app/src/main/java/app/fedilab/android/drawers/CustomEmojiAdapter.java @@ -16,10 +16,6 @@ package app.fedilab.android.drawers; import android.content.Context; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; - import android.content.SharedPreferences; import android.graphics.drawable.Drawable; import android.view.LayoutInflater; @@ -28,6 +24,8 @@ import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ImageView; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import com.bumptech.glide.Glide; import com.bumptech.glide.request.target.SimpleTarget; diff --git a/app/src/main/java/app/fedilab/android/drawers/DomainsListAdapter.java b/app/src/main/java/app/fedilab/android/drawers/DomainsListAdapter.java index 0a97e64fe..282c661cf 100644 --- a/app/src/main/java/app/fedilab/android/drawers/DomainsListAdapter.java +++ b/app/src/main/java/app/fedilab/android/drawers/DomainsListAdapter.java @@ -18,11 +18,6 @@ import android.content.Context; import android.content.DialogInterface; import android.content.SharedPreferences; import android.os.AsyncTask; - -import androidx.annotation.NonNull; -import androidx.appcompat.app.AlertDialog; -import androidx.recyclerview.widget.RecyclerView; - import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -31,16 +26,18 @@ import android.widget.RelativeLayout; import android.widget.TextView; import android.widget.Toast; +import androidx.annotation.NonNull; +import androidx.appcompat.app.AlertDialog; +import androidx.recyclerview.widget.RecyclerView; + import java.util.List; -import app.fedilab.android.client.APIResponse; -import app.fedilab.android.helper.Helper; -import es.dmoral.toasty.Toasty; import app.fedilab.android.R; import app.fedilab.android.asynctasks.DeleteDomainsAsyncTask; +import app.fedilab.android.client.APIResponse; +import app.fedilab.android.helper.Helper; import app.fedilab.android.interfaces.OnRetrieveDomainsInterface; - -import static app.fedilab.android.helper.Helper.changeDrawableColor; +import es.dmoral.toasty.Toasty; /** diff --git a/app/src/main/java/app/fedilab/android/drawers/DraftsListAdapter.java b/app/src/main/java/app/fedilab/android/drawers/DraftsListAdapter.java index 84af250fd..88991c184 100644 --- a/app/src/main/java/app/fedilab/android/drawers/DraftsListAdapter.java +++ b/app/src/main/java/app/fedilab/android/drawers/DraftsListAdapter.java @@ -22,9 +22,6 @@ import android.content.SharedPreferences; import android.database.sqlite.SQLiteDatabase; import android.graphics.Typeface; import android.os.Bundle; - -import androidx.appcompat.app.AlertDialog; - import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -34,19 +31,19 @@ import android.widget.LinearLayout; import android.widget.RelativeLayout; import android.widget.TextView; +import androidx.appcompat.app.AlertDialog; + import java.util.List; +import app.fedilab.android.R; import app.fedilab.android.activities.MainActivity; import app.fedilab.android.activities.PixelfedComposeActivity; +import app.fedilab.android.activities.TootActivity; import app.fedilab.android.asynctasks.UpdateAccountInfoAsyncTask; import app.fedilab.android.client.Entities.StoredStatus; import app.fedilab.android.helper.Helper; import app.fedilab.android.sqlite.Sqlite; import app.fedilab.android.sqlite.StatusStoredDAO; -import app.fedilab.android.R; -import app.fedilab.android.activities.TootActivity; - -import static app.fedilab.android.helper.Helper.changeDrawableColor; /** @@ -177,9 +174,9 @@ public class DraftsListAdapter extends BaseAdapter { @Override public void onClick(View v) { Intent intentToot; - if(MainActivity.social != UpdateAccountInfoAsyncTask.SOCIAL.PIXELFED) { + if (MainActivity.social != UpdateAccountInfoAsyncTask.SOCIAL.PIXELFED) { intentToot = new Intent(context, TootActivity.class); - }else { + } else { intentToot = new Intent(context, PixelfedComposeActivity.class); } Bundle b = new Bundle(); diff --git a/app/src/main/java/app/fedilab/android/drawers/EmojisSearchAdapter.java b/app/src/main/java/app/fedilab/android/drawers/EmojisSearchAdapter.java index 4b2db09ea..06ea211f4 100644 --- a/app/src/main/java/app/fedilab/android/drawers/EmojisSearchAdapter.java +++ b/app/src/main/java/app/fedilab/android/drawers/EmojisSearchAdapter.java @@ -16,9 +16,6 @@ package app.fedilab.android.drawers; import android.content.Context; - -import androidx.annotation.NonNull; - import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -28,14 +25,15 @@ import android.widget.Filterable; import android.widget.ImageView; import android.widget.TextView; +import androidx.annotation.NonNull; import com.bumptech.glide.Glide; import java.util.ArrayList; import java.util.List; -import app.fedilab.android.client.Entities.Emojis; import app.fedilab.android.R; +import app.fedilab.android.client.Entities.Emojis; /** @@ -46,64 +44,6 @@ public class EmojisSearchAdapter extends ArrayAdapter implements Filtera private List emojis, tempEmojis, suggestions; private LayoutInflater layoutInflater; - - public EmojisSearchAdapter(Context context, List emojis) { - super(context, android.R.layout.simple_list_item_1, emojis); - this.emojis = emojis; - this.tempEmojis = new ArrayList<>(emojis); - this.suggestions = new ArrayList<>(emojis); - layoutInflater = LayoutInflater.from(context); - } - - - @Override - public int getCount() { - return emojis.size(); - } - - @Override - public Emojis getItem(int position) { - return emojis.get(position); - } - - @Override - public long getItemId(int position) { - return position; - } - - - @NonNull - @Override - public View getView(final int position, View convertView, @NonNull ViewGroup parent) { - - final Emojis emoji = emojis.get(position); - final ViewHolder holder; - if (convertView == null) { - convertView = layoutInflater.inflate(R.layout.drawer_emoji_search, parent, false); - holder = new ViewHolder(); - holder.emoji_icon = convertView.findViewById(R.id.emoji_icon); - holder.emoji_shortcode = convertView.findViewById(R.id.emoji_shortcode); - convertView.setTag(holder); - } else { - holder = (ViewHolder) convertView.getTag(); - } - if (emoji != null) { - holder.emoji_shortcode.setText(String.format("%s", emoji.getShortcode())); - //Profile picture - Glide.with(holder.emoji_icon.getContext()) - .load(emoji.getUrl()) - .into(holder.emoji_icon); - } - return convertView; - } - - @NonNull - @Override - public Filter getFilter() { - return emojiFilter; - } - - private Filter emojiFilter = new Filter() { @Override public CharSequence convertResultToString(Object resultValue) { @@ -143,6 +83,61 @@ public class EmojisSearchAdapter extends ArrayAdapter implements Filtera } }; + + public EmojisSearchAdapter(Context context, List emojis) { + super(context, android.R.layout.simple_list_item_1, emojis); + this.emojis = emojis; + this.tempEmojis = new ArrayList<>(emojis); + this.suggestions = new ArrayList<>(emojis); + layoutInflater = LayoutInflater.from(context); + } + + @Override + public int getCount() { + return emojis.size(); + } + + @Override + public Emojis getItem(int position) { + return emojis.get(position); + } + + @Override + public long getItemId(int position) { + return position; + } + + @NonNull + @Override + public View getView(final int position, View convertView, @NonNull ViewGroup parent) { + + final Emojis emoji = emojis.get(position); + final ViewHolder holder; + if (convertView == null) { + convertView = layoutInflater.inflate(R.layout.drawer_emoji_search, parent, false); + holder = new ViewHolder(); + holder.emoji_icon = convertView.findViewById(R.id.emoji_icon); + holder.emoji_shortcode = convertView.findViewById(R.id.emoji_shortcode); + convertView.setTag(holder); + } else { + holder = (ViewHolder) convertView.getTag(); + } + if (emoji != null) { + holder.emoji_shortcode.setText(String.format("%s", emoji.getShortcode())); + //Profile picture + Glide.with(holder.emoji_icon.getContext()) + .load(emoji.getUrl()) + .into(holder.emoji_icon); + } + return convertView; + } + + @NonNull + @Override + public Filter getFilter() { + return emojiFilter; + } + private class ViewHolder { ImageView emoji_icon; TextView emoji_shortcode; diff --git a/app/src/main/java/app/fedilab/android/drawers/FilterAdapter.java b/app/src/main/java/app/fedilab/android/drawers/FilterAdapter.java index 92370b768..e3b22e3d3 100644 --- a/app/src/main/java/app/fedilab/android/drawers/FilterAdapter.java +++ b/app/src/main/java/app/fedilab/android/drawers/FilterAdapter.java @@ -19,11 +19,6 @@ import android.content.Context; import android.content.DialogInterface; import android.content.SharedPreferences; import android.os.AsyncTask; - -import com.google.android.material.floatingactionbutton.FloatingActionButton; - -import androidx.appcompat.app.AlertDialog; - import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -40,17 +35,21 @@ import android.widget.Spinner; import android.widget.TextView; import android.widget.Toast; +import androidx.appcompat.app.AlertDialog; + +import com.google.android.material.floatingactionbutton.FloatingActionButton; + import java.util.ArrayList; import java.util.List; -import app.fedilab.android.client.APIResponse; -import app.fedilab.android.client.Entities.Filters; -import app.fedilab.android.helper.Helper; -import es.dmoral.toasty.Toasty; import app.fedilab.android.R; import app.fedilab.android.activities.BaseMainActivity; import app.fedilab.android.asynctasks.ManageFiltersAsyncTask; +import app.fedilab.android.client.APIResponse; +import app.fedilab.android.client.Entities.Filters; +import app.fedilab.android.helper.Helper; import app.fedilab.android.interfaces.OnFilterActionInterface; +import es.dmoral.toasty.Toasty; /** diff --git a/app/src/main/java/app/fedilab/android/drawers/HowToVideosAdapter.java b/app/src/main/java/app/fedilab/android/drawers/HowToVideosAdapter.java index e108806da..268bc7d11 100644 --- a/app/src/main/java/app/fedilab/android/drawers/HowToVideosAdapter.java +++ b/app/src/main/java/app/fedilab/android/drawers/HowToVideosAdapter.java @@ -17,12 +17,8 @@ package app.fedilab.android.drawers; import android.content.Context; import android.content.Intent; -import android.content.SharedPreferences; import android.graphics.drawable.Drawable; import android.os.Bundle; - -import androidx.core.content.ContextCompat; - import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -31,22 +27,22 @@ import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; +import androidx.core.content.ContextCompat; + import com.bumptech.glide.Glide; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; -import app.fedilab.android.client.APIResponse; -import app.fedilab.android.client.Entities.HowToVideo; -import app.fedilab.android.helper.Helper; import app.fedilab.android.R; import app.fedilab.android.activities.WebviewActivity; import app.fedilab.android.asynctasks.ManageListsAsyncTask; +import app.fedilab.android.client.APIResponse; +import app.fedilab.android.client.Entities.HowToVideo; +import app.fedilab.android.helper.Helper; import app.fedilab.android.interfaces.OnListActionInterface; -import static app.fedilab.android.helper.Helper.changeDrawableColor; - /** * Created by Thomas on 29/09/2018. diff --git a/app/src/main/java/app/fedilab/android/drawers/ImageAdapter.java b/app/src/main/java/app/fedilab/android/drawers/ImageAdapter.java index f7b3321a3..165290dd4 100644 --- a/app/src/main/java/app/fedilab/android/drawers/ImageAdapter.java +++ b/app/src/main/java/app/fedilab/android/drawers/ImageAdapter.java @@ -17,26 +17,25 @@ package app.fedilab.android.drawers; import android.content.Context; import android.content.Intent; import android.os.Bundle; - -import androidx.annotation.NonNull; -import androidx.recyclerview.widget.RecyclerView; - import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + import com.bumptech.glide.Glide; import java.util.ArrayList; import java.util.List; -import app.fedilab.android.activities.SlideMediaActivity; -import app.fedilab.android.client.Entities.Attachment; -import app.fedilab.android.client.Entities.Status; import app.fedilab.android.R; import app.fedilab.android.activities.ShowAccountActivity; import app.fedilab.android.activities.ShowConversationActivity; +import app.fedilab.android.activities.SlideMediaActivity; +import app.fedilab.android.client.Entities.Attachment; +import app.fedilab.android.client.Entities.Status; /** diff --git a/app/src/main/java/app/fedilab/android/drawers/InstanceRegAdapter.java b/app/src/main/java/app/fedilab/android/drawers/InstanceRegAdapter.java index d0e6395ab..9898dc1e7 100644 --- a/app/src/main/java/app/fedilab/android/drawers/InstanceRegAdapter.java +++ b/app/src/main/java/app/fedilab/android/drawers/InstanceRegAdapter.java @@ -18,7 +18,6 @@ import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; -import android.widget.Button; import android.widget.ImageButton; import android.widget.ImageView; import android.widget.TextView; diff --git a/app/src/main/java/app/fedilab/android/drawers/ListAdapter.java b/app/src/main/java/app/fedilab/android/drawers/ListAdapter.java index 284fb03f2..20542b95b 100644 --- a/app/src/main/java/app/fedilab/android/drawers/ListAdapter.java +++ b/app/src/main/java/app/fedilab/android/drawers/ListAdapter.java @@ -19,9 +19,6 @@ import android.content.Context; import android.content.Intent; import android.graphics.drawable.Drawable; import android.os.Bundle; - -import androidx.core.content.ContextCompat; - import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -30,12 +27,13 @@ import android.widget.LinearLayout; import android.widget.RelativeLayout; import android.widget.TextView; +import androidx.core.content.ContextCompat; + import java.util.List; -import app.fedilab.android.helper.Helper; import app.fedilab.android.R; import app.fedilab.android.activities.ListActivity; - +import app.fedilab.android.helper.Helper; /** diff --git a/app/src/main/java/app/fedilab/android/drawers/NotificationsListAdapter.java b/app/src/main/java/app/fedilab/android/drawers/NotificationsListAdapter.java index fba201a3e..a4b5cb365 100644 --- a/app/src/main/java/app/fedilab/android/drawers/NotificationsListAdapter.java +++ b/app/src/main/java/app/fedilab/android/drawers/NotificationsListAdapter.java @@ -20,7 +20,6 @@ import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.SharedPreferences; -import android.graphics.Bitmap; import android.graphics.Color; import android.graphics.drawable.Drawable; import android.os.AsyncTask; @@ -28,18 +27,6 @@ import android.os.Build; import android.os.Bundle; import android.os.CountDownTimer; import android.os.Handler; - -import androidx.annotation.NonNull; -import androidx.appcompat.content.res.AppCompatResources; -import androidx.constraintlayout.widget.ConstraintLayout; -import androidx.core.content.ContextCompat; -import androidx.appcompat.app.AlertDialog; -import androidx.appcompat.widget.PopupMenu; -import androidx.core.graphics.drawable.DrawableCompat; -import androidx.preference.PreferenceManager; -import androidx.recyclerview.widget.LinearLayoutManager; -import androidx.recyclerview.widget.RecyclerView; - import android.text.Html; import android.text.method.LinkMovementMethod; import android.util.TypedValue; @@ -60,24 +47,43 @@ import android.widget.RelativeLayout; import android.widget.TextView; import android.widget.Toast; +import androidx.annotation.NonNull; +import androidx.appcompat.app.AlertDialog; +import androidx.appcompat.widget.PopupMenu; +import androidx.constraintlayout.widget.ConstraintLayout; +import androidx.core.content.ContextCompat; +import androidx.core.graphics.drawable.DrawableCompat; +import androidx.preference.PreferenceManager; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + import com.bumptech.glide.Glide; import com.varunest.sparkbutton.SparkButton; import org.jetbrains.annotations.NotNull; -import java.io.File; -import java.io.FileOutputStream; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Timer; import java.util.TimerTask; - +import app.fedilab.android.R; import app.fedilab.android.activities.AccountReportActivity; import app.fedilab.android.activities.BaseMainActivity; +import app.fedilab.android.activities.CustomSharingActivity; +import app.fedilab.android.activities.MainActivity; import app.fedilab.android.activities.OwnerNotificationChartsActivity; +import app.fedilab.android.activities.ShowAccountActivity; +import app.fedilab.android.activities.ShowConversationActivity; import app.fedilab.android.activities.SlideMediaActivity; +import app.fedilab.android.activities.TootActivity; +import app.fedilab.android.activities.TootInfoActivity; +import app.fedilab.android.asynctasks.ManagePollAsyncTask; +import app.fedilab.android.asynctasks.PostActionAsyncTask; +import app.fedilab.android.asynctasks.PostNotificationsAsyncTask; +import app.fedilab.android.asynctasks.RetrieveFeedsAsyncTask; +import app.fedilab.android.asynctasks.UpdateAccountInfoAsyncTask; import app.fedilab.android.client.API; import app.fedilab.android.client.APIResponse; import app.fedilab.android.client.Entities.Account; @@ -92,27 +98,15 @@ import app.fedilab.android.helper.CrossActions; import app.fedilab.android.helper.CustomTextView; import app.fedilab.android.helper.Helper; import app.fedilab.android.helper.ThemeHelper; -import app.fedilab.android.interfaces.OnRetrieveImageInterface; -import br.com.felix.horizontalbargraph.HorizontalBar; -import br.com.felix.horizontalbargraph.model.BarItem; -import es.dmoral.toasty.Toasty; -import app.fedilab.android.R; -import app.fedilab.android.activities.CustomSharingActivity; -import app.fedilab.android.activities.MainActivity; -import app.fedilab.android.activities.ShowAccountActivity; -import app.fedilab.android.activities.ShowConversationActivity; -import app.fedilab.android.activities.TootActivity; -import app.fedilab.android.activities.TootInfoActivity; -import app.fedilab.android.asynctasks.ManagePollAsyncTask; -import app.fedilab.android.asynctasks.PostActionAsyncTask; -import app.fedilab.android.asynctasks.PostNotificationsAsyncTask; -import app.fedilab.android.asynctasks.RetrieveFeedsAsyncTask; -import app.fedilab.android.asynctasks.UpdateAccountInfoAsyncTask; import app.fedilab.android.interfaces.OnPollInterface; import app.fedilab.android.interfaces.OnPostActionInterface; import app.fedilab.android.interfaces.OnPostNotificationsActionInterface; import app.fedilab.android.interfaces.OnRetrieveEmojiAccountInterface; import app.fedilab.android.interfaces.OnRetrieveEmojiInterface; +import app.fedilab.android.interfaces.OnRetrieveImageInterface; +import br.com.felix.horizontalbargraph.HorizontalBar; +import br.com.felix.horizontalbargraph.model.BarItem; +import es.dmoral.toasty.Toasty; import static android.content.Context.MODE_PRIVATE; import static app.fedilab.android.activities.BaseMainActivity.social; @@ -125,6 +119,7 @@ import static app.fedilab.android.activities.BaseMainActivity.social; public class NotificationsListAdapter extends RecyclerView.Adapter implements OnPostActionInterface, OnPostNotificationsActionInterface, OnRetrieveEmojiInterface, OnRetrieveEmojiAccountInterface, OnPollInterface, OnRetrieveImageInterface { + private final Object lock = new Object(); private Context context; private List notifications; private LayoutInflater layoutInflater; @@ -135,8 +130,6 @@ public class NotificationsListAdapter extends RecyclerView.Adapter implements On private int style; private RecyclerView mRecyclerView; private List lstHolders; - private final Object lock = new Object(); - private Runnable updateAnimatedEmoji = new Runnable() { @Override public void run() { @@ -222,7 +215,7 @@ public class NotificationsListAdapter extends RecyclerView.Adapter implements On SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); int iconColor = prefs.getInt("theme_icons_color", -1); - if( iconColor == -1){ + if (iconColor == -1) { iconColor = ThemeHelper.getAttColor(context, R.attr.iconColor); } Helper.changeDrawableColor(context, R.drawable.ic_audio_wave, iconColor); @@ -256,7 +249,7 @@ public class NotificationsListAdapter extends RecyclerView.Adapter implements On int reblogColor = prefs.getInt("theme_statuses_color", -1); - if( holder.main_linear_container != null && reblogColor != -1 ){ + if (holder.main_linear_container != null && reblogColor != -1) { holder.main_linear_container.setBackgroundColor(reblogColor); } @@ -273,9 +266,9 @@ public class NotificationsListAdapter extends RecyclerView.Adapter implements On else typeString = String.format("@%s %s", notification.getAccount().getUsername(), context.getString(R.string.notif_mention)); imgH = ContextCompat.getDrawable(context, R.drawable.ic_chat_bubble_outline); - if(notification.getStatus().getVisibility().equals("direct")) { + if (notification.getStatus().getVisibility().equals("direct")) { holder.main_container_trans.setVisibility(View.GONE); - }else{ + } else { holder.main_container_trans.setVisibility(View.VISIBLE); holder.main_container_trans.setAlpha(.1f); } @@ -284,7 +277,6 @@ public class NotificationsListAdapter extends RecyclerView.Adapter implements On case "poll": holder.status_action_container.setVisibility(View.GONE); typeString = context.getString(R.string.notif_poll); - ; imgH = ContextCompat.getDrawable(context, R.drawable.ic_view_list_poll_notif); holder.main_container_trans.setVisibility(View.VISIBLE); holder.status_more.setVisibility(View.GONE); @@ -495,7 +487,6 @@ public class NotificationsListAdapter extends RecyclerView.Adapter implements On } - if (type.equals("favourite") || type.equals("reblog")) { holder.status_document_container.setVisibility(View.GONE); holder.status_show_more.setVisibility(View.GONE); @@ -1410,9 +1401,6 @@ public class NotificationsListAdapter extends RecyclerView.Adapter implements On TextView number_votes, remaining_time; Button submit_vote, refresh_poll; LinearLayout main_linear_container; - public View getView() { - return itemView; - } public ViewHolder(View itemView) { super(itemView); @@ -1466,6 +1454,9 @@ public class NotificationsListAdapter extends RecyclerView.Adapter implements On main_linear_container = itemView.findViewById(R.id.main_linear_container); } + public View getView() { + return itemView; + } void updateAnimatedEmoji() { notification_status_content.invalidate(); diff --git a/app/src/main/java/app/fedilab/android/drawers/PeertubeAdapter.java b/app/src/main/java/app/fedilab/android/drawers/PeertubeAdapter.java index afad88b4e..48ccc2660 100644 --- a/app/src/main/java/app/fedilab/android/drawers/PeertubeAdapter.java +++ b/app/src/main/java/app/fedilab/android/drawers/PeertubeAdapter.java @@ -19,10 +19,6 @@ import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.os.Bundle; - -import androidx.annotation.NonNull; -import androidx.recyclerview.widget.RecyclerView; - import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -30,17 +26,15 @@ import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + import com.bumptech.glide.Glide; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; -import app.fedilab.android.client.APIResponse; -import app.fedilab.android.client.Entities.Account; -import app.fedilab.android.client.Entities.Peertube; -import app.fedilab.android.helper.CrossActions; -import app.fedilab.android.helper.Helper; import app.fedilab.android.R; import app.fedilab.android.activities.MainActivity; import app.fedilab.android.activities.PeertubeActivity; @@ -48,6 +42,11 @@ import app.fedilab.android.activities.PeertubeEditUploadActivity; import app.fedilab.android.activities.ShowAccountActivity; import app.fedilab.android.asynctasks.ManageListsAsyncTask; import app.fedilab.android.asynctasks.UpdateAccountInfoAsyncTask; +import app.fedilab.android.client.APIResponse; +import app.fedilab.android.client.Entities.Account; +import app.fedilab.android.client.Entities.Peertube; +import app.fedilab.android.helper.CrossActions; +import app.fedilab.android.helper.Helper; import app.fedilab.android.interfaces.OnListActionInterface; diff --git a/app/src/main/java/app/fedilab/android/drawers/PeertubeNotificationsListAdapter.java b/app/src/main/java/app/fedilab/android/drawers/PeertubeNotificationsListAdapter.java index c0b87a1ac..f11214250 100644 --- a/app/src/main/java/app/fedilab/android/drawers/PeertubeNotificationsListAdapter.java +++ b/app/src/main/java/app/fedilab/android/drawers/PeertubeNotificationsListAdapter.java @@ -19,11 +19,6 @@ import android.content.Intent; import android.content.SharedPreferences; import android.os.Build; import android.os.Bundle; - -import androidx.annotation.NonNull; -import androidx.core.content.ContextCompat; -import androidx.recyclerview.widget.RecyclerView; - import android.text.Html; import android.view.LayoutInflater; import android.view.View; @@ -32,17 +27,21 @@ import android.widget.ImageView; import android.widget.RelativeLayout; import android.widget.TextView; +import androidx.annotation.NonNull; +import androidx.core.content.ContextCompat; +import androidx.recyclerview.widget.RecyclerView; + import java.util.List; +import app.fedilab.android.R; +import app.fedilab.android.activities.PeertubeActivity; +import app.fedilab.android.activities.ShowAccountActivity; import app.fedilab.android.client.Entities.Notification; import app.fedilab.android.client.Entities.PeertubeAccountNotification; import app.fedilab.android.client.Entities.PeertubeNotification; import app.fedilab.android.client.Entities.PeertubeVideoNotification; -import app.fedilab.android.helper.Helper; -import app.fedilab.android.R; -import app.fedilab.android.activities.PeertubeActivity; -import app.fedilab.android.activities.ShowAccountActivity; import app.fedilab.android.fragments.DisplayPeertubeNotificationsFragment; +import app.fedilab.android.helper.Helper; /** @@ -221,10 +220,6 @@ public class PeertubeNotificationsListAdapter extends RecyclerView.Adapter { TextView peertube_notif_message, peertube_notif_date; RelativeLayout main_container_trans; - public View getView() { - return itemView; - } - public ViewHolder(View itemView) { super(itemView); peertube_notif_pp = itemView.findViewById(R.id.peertube_notif_pp); @@ -232,6 +227,10 @@ public class PeertubeNotificationsListAdapter extends RecyclerView.Adapter { peertube_notif_date = itemView.findViewById(R.id.peertube_notif_date); main_container_trans = itemView.findViewById(R.id.container_trans); } + + public View getView() { + return itemView; + } } } \ No newline at end of file diff --git a/app/src/main/java/app/fedilab/android/drawers/PixelfedListAdapter.java b/app/src/main/java/app/fedilab/android/drawers/PixelfedListAdapter.java index c48bae6bb..dd2ec57ce 100644 --- a/app/src/main/java/app/fedilab/android/drawers/PixelfedListAdapter.java +++ b/app/src/main/java/app/fedilab/android/drawers/PixelfedListAdapter.java @@ -26,17 +26,6 @@ import android.database.sqlite.SQLiteDatabase; import android.os.AsyncTask; import android.os.Build; import android.os.Bundle; - -import androidx.annotation.NonNull; -import androidx.appcompat.app.AlertDialog; -import androidx.appcompat.widget.PopupMenu; -import androidx.constraintlayout.widget.ConstraintLayout; -import androidx.core.content.ContextCompat; -import androidx.cardview.widget.CardView; -import androidx.preference.PreferenceManager; -import androidx.recyclerview.widget.LinearLayoutManager; -import androidx.recyclerview.widget.RecyclerView; - import android.text.Html; import android.text.InputType; import android.text.TextWatcher; @@ -56,10 +45,19 @@ import android.widget.TextView; import android.widget.TimePicker; import android.widget.Toast; +import androidx.annotation.NonNull; +import androidx.appcompat.app.AlertDialog; +import androidx.appcompat.widget.PopupMenu; +import androidx.cardview.widget.CardView; +import androidx.constraintlayout.widget.ConstraintLayout; +import androidx.preference.PreferenceManager; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + import com.bumptech.glide.Glide; import com.bumptech.glide.load.resource.bitmap.FitCenter; import com.bumptech.glide.load.resource.bitmap.RoundedCorners; -import com.bumptech.glide.request.RequestOptions;; +import com.bumptech.glide.request.RequestOptions; import com.github.stom79.mytransl.MyTransL; import com.github.stom79.mytransl.client.HttpsConnectionException; import com.github.stom79.mytransl.client.Results; @@ -76,13 +74,19 @@ import java.util.Date; import java.util.GregorianCalendar; import java.util.List; +import app.fedilab.android.R; +import app.fedilab.android.activities.MainActivity; import app.fedilab.android.activities.PixelfedComposeActivity; +import app.fedilab.android.activities.ShowAccountActivity; +import app.fedilab.android.activities.ShowConversationActivity; import app.fedilab.android.activities.SlideMediaActivity; import app.fedilab.android.activities.TootActivity; import app.fedilab.android.activities.TootInfoActivity; import app.fedilab.android.asynctasks.PostActionAsyncTask; import app.fedilab.android.asynctasks.PostStatusAsyncTask; import app.fedilab.android.asynctasks.RetrieveContextAsyncTask; +import app.fedilab.android.asynctasks.RetrieveFeedsAsyncTask; +import app.fedilab.android.asynctasks.UpdateAccountInfoAsyncTask; import app.fedilab.android.client.API; import app.fedilab.android.client.APIResponse; import app.fedilab.android.client.Entities.Account; @@ -94,8 +98,10 @@ import app.fedilab.android.helper.CrossActions; import app.fedilab.android.helper.Helper; import app.fedilab.android.helper.MastalabAutoCompleteTextView; import app.fedilab.android.helper.ThemeHelper; +import app.fedilab.android.interfaces.OnPostActionInterface; import app.fedilab.android.interfaces.OnPostStatusActionInterface; import app.fedilab.android.interfaces.OnRetrieveContextInterface; +import app.fedilab.android.interfaces.OnRetrieveEmojiInterface; import app.fedilab.android.interfaces.OnRetrieveFeedsInterface; import app.fedilab.android.interfaces.OnRetrieveSearcAccountshInterface; import app.fedilab.android.interfaces.OnRetrieveSearchInterface; @@ -106,19 +112,10 @@ import app.fedilab.android.sqlite.StatusCacheDAO; import app.fedilab.android.sqlite.StatusStoredDAO; import app.fedilab.android.sqlite.TempMuteDAO; import es.dmoral.toasty.Toasty; -import app.fedilab.android.R; -import app.fedilab.android.activities.MainActivity; -import app.fedilab.android.activities.ShowAccountActivity; -import app.fedilab.android.activities.ShowConversationActivity; -import app.fedilab.android.asynctasks.RetrieveFeedsAsyncTask; -import app.fedilab.android.asynctasks.UpdateAccountInfoAsyncTask; -import app.fedilab.android.interfaces.OnPostActionInterface; -import app.fedilab.android.interfaces.OnRetrieveEmojiInterface; import static android.content.Context.MODE_PRIVATE; import static app.fedilab.android.activities.BaseMainActivity.mutedAccount; import static app.fedilab.android.activities.BaseMainActivity.social; -import static app.fedilab.android.helper.Helper.changeDrawableColor; /** @@ -127,11 +124,11 @@ import static app.fedilab.android.helper.Helper.changeDrawableColor; */ public class PixelfedListAdapter extends RecyclerView.Adapter implements OnPostActionInterface, OnRetrieveEmojiInterface, OnPostStatusActionInterface, OnRetrieveSearchInterface, OnRetrieveSearcAccountshInterface, OnRetrieveContextInterface, OnRetrieveFeedsInterface { + private static final int DISPLAYED_STATUS = 1; + private final int HIDDEN_STATUS = 0; private Context context; private List statuses; private PixelfedListAdapter pixelfedListAdapter; - private final int HIDDEN_STATUS = 0; - private static final int DISPLAYED_STATUS = 1; private RetrieveFeedsAsyncTask.Type type; private MastalabAutoCompleteTextView comment_content; private String in_reply_to_status; @@ -150,8 +147,6 @@ public class PixelfedListAdapter extends RecyclerView.Adapter implements OnPostA } - - @Override public long getItemId(int position) { return position; @@ -172,15 +167,15 @@ public class PixelfedListAdapter extends RecyclerView.Adapter implements OnPostA @Override public void onRetrieveContext(APIResponse apiResponse) { - if (apiResponse.getError() != null ) { + if (apiResponse.getError() != null) { return; } List statuses = apiResponse.getContext().getDescendants(); String targetedId = apiResponse.getTargetedId(); int position = 0; - for(Status tl: this.statuses){ - if( tl.getId().equals(targetedId)){ + for (Status tl : this.statuses) { + if (tl.getId().equals(targetedId)) { this.statuses.get(position).setCommentsFetched(true); this.statuses.get(position).setComments(statuses); notifyStatusChanged(this.statuses.get(position)); @@ -191,8 +186,6 @@ public class PixelfedListAdapter extends RecyclerView.Adapter implements OnPostA } - - @Override public void onPostStatusAction(APIResponse apiResponse) { if (apiResponse.getError() != null) { @@ -200,10 +193,10 @@ public class PixelfedListAdapter extends RecyclerView.Adapter implements OnPostA Toasty.error(context, context.getString(R.string.toast_error_char_limit), Toast.LENGTH_SHORT).show(); return; } else { - if(apiResponse.getError().getError().length() < 100) { + if (apiResponse.getError().getError().length() < 100) { Toasty.error(context, apiResponse.getError().getError(), Toast.LENGTH_LONG).show(); - }else{ - Toasty.error(context, context.getString(R.string.long_api_error,"\ud83d\ude05"), Toast.LENGTH_LONG).show(); + } else { + Toasty.error(context, context.getString(R.string.long_api_error, "\ud83d\ude05"), Toast.LENGTH_LONG).show(); } return; } @@ -223,10 +216,10 @@ public class PixelfedListAdapter extends RecyclerView.Adapter implements OnPostA Toasty.info(context, context.getString(R.string.toast_toot_saved_error), Toast.LENGTH_LONG).show(); } - if( apiResponse.getTargetedId() != null && apiResponse.getStatuses() != null && apiResponse.getStatuses().size() > 0){ + if (apiResponse.getTargetedId() != null && apiResponse.getStatuses() != null && apiResponse.getStatuses().size() > 0) { int position = 0; - for(Status tl: this.statuses){ - if( tl.getId().equals(apiResponse.getTargetedId())){ + for (Status tl : this.statuses) { + if (tl.getId().equals(apiResponse.getTargetedId())) { List comments = this.statuses.get(position).getComments(); comments.add(comments.size(), apiResponse.getStatuses().get(0)); this.statuses.get(position).setComments(comments); @@ -269,7 +262,7 @@ public class PixelfedListAdapter extends RecyclerView.Adapter implements OnPostA deltaSearch = oldContent.substring(currentCursorPosition - searchLength, currentCursorPosition); else { if (currentCursorPosition >= oldContent.length()) - deltaSearch = oldContent.substring(currentCursorPosition - searchLength, oldContent.length()); + deltaSearch = oldContent.substring(currentCursorPosition - searchLength); } if (!search.equals("")) deltaSearch = deltaSearch.replace("@" + search, ""); @@ -278,7 +271,7 @@ public class PixelfedListAdapter extends RecyclerView.Adapter implements OnPostA newContent += "@" + account.getAcct() + " "; int newPosition = newContent.length(); if (currentCursorPosition < oldContent.length()) - newContent += oldContent.substring(currentCursorPosition, oldContent.length()); + newContent += oldContent.substring(currentCursorPosition); comment_content.setText(newContent); comment_content.setSelection(newPosition); AccountsSearchAdapter accountsListAdapter = new AccountsSearchAdapter(context, new ArrayList<>()); @@ -330,7 +323,7 @@ public class PixelfedListAdapter extends RecyclerView.Adapter implements OnPostA deltaSearch = oldContent.substring(currentCursorPosition - searchLength, currentCursorPosition); else { if (currentCursorPosition >= oldContent.length()) - deltaSearch = oldContent.substring(currentCursorPosition - searchLength, oldContent.length()); + deltaSearch = oldContent.substring(currentCursorPosition - searchLength); } if (!search.equals("")) @@ -340,7 +333,7 @@ public class PixelfedListAdapter extends RecyclerView.Adapter implements OnPostA newContent += "#" + tag + " "; int newPosition = newContent.length(); if (currentCursorPosition < oldContent.length()) - newContent += oldContent.substring(currentCursorPosition, oldContent.length()); + newContent += oldContent.substring(currentCursorPosition); comment_content.setText(newContent); comment_content.setSelection(newPosition); TagsSearchAdapter tagsSearchAdapter = new TagsSearchAdapter(context, new ArrayList<>()); @@ -367,65 +360,11 @@ public class PixelfedListAdapter extends RecyclerView.Adapter implements OnPostA } - - private class ViewHolderEmpty extends RecyclerView.ViewHolder { - ViewHolderEmpty(View itemView) { - super(itemView); - } - } - @Override public void onViewAttachedToWindow(@NonNull RecyclerView.ViewHolder holder) { super.onViewAttachedToWindow(holder); } - - private class ViewHolderPixelfed extends RecyclerView.ViewHolder { - SliderView imageSlider; - ImageView art_media, art_media_play, pf_pp, pf_comment; - SparkButton pf_fav, pf_share; - TextView pf_username, pf_likes, pf_description, pf_date; - CardView pf_cardview; - LinearLayout pf_bottom_container; - LinearLayout pixelfed_comments; - RecyclerView lv_comments; - - ConstraintLayout quick_reply_container; - MastalabAutoCompleteTextView quick_reply_text; - ImageView quick_reply_switch_to_full, status_more; - TextView toot_space_left; - ImageView quick_reply_emoji; - Button quick_reply_button; - ImageView quick_reply_privacy; - ViewHolderPixelfed(View itemView) { - super(itemView); - art_media = itemView.findViewById(R.id.art_media); - art_media_play = itemView.findViewById(R.id.art_media_play); - imageSlider = itemView.findViewById(R.id.imageSlider); - pf_pp = itemView.findViewById(R.id.pf_pp); - pf_username = itemView.findViewById(R.id.pf_username); - pf_likes = itemView.findViewById(R.id.pf_likes); - pf_description = itemView.findViewById(R.id.pf_description); - pf_date = itemView.findViewById(R.id.pf_date); - pf_fav = itemView.findViewById(R.id.pf_fav); - pf_comment = itemView.findViewById(R.id.pf_comment); - pf_share = itemView.findViewById(R.id.pf_share); - pf_cardview = itemView.findViewById(R.id.pf_cardview); - pf_bottom_container = itemView.findViewById(R.id.pf_bottom_container); - pixelfed_comments = itemView.findViewById(R.id.pixelfed_comments); - lv_comments = itemView.findViewById(R.id.lv_comments); - quick_reply_container = itemView.findViewById(R.id.quick_reply_container); - status_more = itemView.findViewById(R.id.status_more); - quick_reply_text = itemView.findViewById(R.id.quick_reply_text); - quick_reply_switch_to_full = itemView.findViewById(R.id.quick_reply_switch_to_full); - toot_space_left = itemView.findViewById(R.id.toot_space_left); - quick_reply_emoji = itemView.findViewById(R.id.quick_reply_emoji); - quick_reply_button = itemView.findViewById(R.id.quick_reply_button); - quick_reply_privacy = itemView.findViewById(R.id.quick_reply_privacy); - } - } - - public Status getItem(int position) { if (statuses.size() > position && position >= 0) return statuses.get(position); @@ -457,7 +396,6 @@ public class PixelfedListAdapter extends RecyclerView.Adapter implements OnPostA return new ViewHolderEmpty(layoutInflater.inflate(R.layout.drawer_empty, parent, false)); } - @SuppressLint("SetJavaScriptEnabled") @Override public void onBindViewHolder(@NonNull final RecyclerView.ViewHolder viewHolder, int i) { @@ -492,14 +430,14 @@ public class PixelfedListAdapter extends RecyclerView.Adapter implements OnPostA SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); int iconColor = prefs.getInt("theme_icons_color", -1); - if( iconColor == -1){ + if (iconColor == -1) { iconColor = ThemeHelper.getAttColor(context, R.attr.iconColor); } int reblogColor = prefs.getInt("theme_boost_header_color", -1); int statusColor = prefs.getInt("theme_statuses_color", -1); - if( holder.pf_cardview != null && statusColor != -1) { + if (holder.pf_cardview != null && statusColor != -1) { holder.pf_cardview.setCardBackgroundColor(statusColor); - }else if(holder.pf_cardview != null){ + } else if (holder.pf_cardview != null) { holder.pf_cardview.setCardBackgroundColor(ThemeHelper.getAttColor(context, R.attr.cardviewColor)); } @@ -508,21 +446,21 @@ public class PixelfedListAdapter extends RecyclerView.Adapter implements OnPostA holder.quick_reply_container.setVisibility(View.VISIBLE); holder.pixelfed_comments.setVisibility(View.VISIBLE); in_reply_to_status = status.getReblog() != null ? status.getReblog().getId() : status.getId(); - if( status.isCommentsFetched()){ + if (status.isCommentsFetched()) { StatusListAdapter statusListAdapter = new StatusListAdapter(0, status.getId(), true, status.getComments()); final LinearLayoutManager mLayoutManager; mLayoutManager = new LinearLayoutManager(context); holder.lv_comments.setLayoutManager(mLayoutManager); holder.lv_comments.setAdapter(statusListAdapter); mLayoutManager.scrollToPositionWithOffset(i, 0); - }else{ + } else { status.setCommentsFetched(true); - new RetrieveContextAsyncTask(context, false, false, status.getId(),PixelfedListAdapter.this).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); + new RetrieveContextAsyncTask(context, false, false, status.getId(), PixelfedListAdapter.this).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); } EditText content_cw = new EditText(context); content_cw.setText(status.getReblog() != null ? status.getReblog().getSpoiler_text() : status.getSpoiler_text()); - String content = TootActivity.manageMentions(context, userId,status.getReblog() != null ? status.getReblog() : status); + String content = TootActivity.manageMentions(context, userId, status.getReblog() != null ? status.getReblog() : status); TextWatcher textWatcher = PixelfedComposeActivity.initializeTextWatcher(context, social, holder.quick_reply_text, holder.toot_space_left, null, null, PixelfedListAdapter.this, PixelfedListAdapter.this, PixelfedListAdapter.this); holder.quick_reply_text.addTextChangedListener(textWatcher); holder.quick_reply_text.setText(content); @@ -609,23 +547,23 @@ public class PixelfedListAdapter extends RecyclerView.Adapter implements OnPostA holder.art_media_play.setVisibility(View.GONE); - if (status.getMedia_attachments() != null && status.getMedia_attachments().size() > 1){ - SliderAdapter sliderAdapter = new SliderAdapter(new WeakReference<>((Activity)context), false, status.getMedia_attachments()); + if (status.getMedia_attachments() != null && status.getMedia_attachments().size() > 1) { + SliderAdapter sliderAdapter = new SliderAdapter(new WeakReference<>((Activity) context), false, status.getMedia_attachments()); holder.imageSlider.setSliderAdapter(sliderAdapter); holder.imageSlider.setIndicatorAnimation(IndicatorAnimations.WORM); holder.imageSlider.setSliderTransformAnimation(SliderAnimations.SIMPLETRANSFORMATION); holder.art_media.setVisibility(View.GONE); holder.imageSlider.setVisibility(View.VISIBLE); - }else if(status.getMedia_attachments() != null ){ + } else if (status.getMedia_attachments() != null) { holder.art_media.setVisibility(View.VISIBLE); holder.imageSlider.setVisibility(View.GONE); - if( status.getMedia_attachments().get(0).getType().toLowerCase().equals("video")){ + if (status.getMedia_attachments().get(0).getType().toLowerCase().equals("video")) { holder.art_media_play.setVisibility(View.VISIBLE); } String url; - if(status.getMedia_attachments().get(0).getPreview_url().endsWith("no-preview.png") ){ + if (status.getMedia_attachments().get(0).getPreview_url().endsWith("no-preview.png")) { url = status.getMedia_attachments().get(0).getUrl(); - }else{ + } else { url = status.getMedia_attachments().get(0).getPreview_url(); } Glide.with(holder.itemView.getContext()) @@ -652,7 +590,6 @@ public class PixelfedListAdapter extends RecyclerView.Adapter implements OnPostA }); - holder.quick_reply_switch_to_full.setVisibility(View.GONE); holder.toot_space_left.setVisibility(View.GONE); holder.quick_reply_emoji.setVisibility(View.GONE); @@ -682,7 +619,7 @@ public class PixelfedListAdapter extends RecyclerView.Adapter implements OnPostA } } status.setShortReply(!currentValue); - if( !status.isShortReply()){ + if (!status.isShortReply()) { InputMethodManager imm = (InputMethodManager) context.getSystemService(Activity.INPUT_METHOD_SERVICE); assert imm != null; imm.hideSoftInputFromWindow(holder.quick_reply_text.getWindowToken(), 0); @@ -734,9 +671,9 @@ public class PixelfedListAdapter extends RecyclerView.Adapter implements OnPostA //Same instance if (status.getAccount().getAcct().split("@").length < 2) { popup.getMenu().findItem(R.id.action_block_domain).setVisible(false); - }else{ //Both accounts have an instance in acct (pixelfed fix) + } else { //Both accounts have an instance in acct (pixelfed fix) String instanceAccount = status.getAccount().getAcct().split("@")[1]; - if( Helper.getLiveInstance(context).compareTo(instanceAccount) == 0){ + if (Helper.getLiveInstance(context).compareTo(instanceAccount) == 0) { popup.getMenu().findItem(R.id.action_block_domain).setVisible(false); } } @@ -1020,9 +957,7 @@ public class PixelfedListAdapter extends RecyclerView.Adapter implements OnPostA }); - - - holder.pf_date.setOnClickListener(view ->{ + holder.pf_date.setOnClickListener(view -> { Intent intent = new Intent(context, ShowConversationActivity.class); Bundle b = new Bundle(); if (status.getReblog() == null) @@ -1044,7 +979,7 @@ public class PixelfedListAdapter extends RecyclerView.Adapter implements OnPostA holder.pf_fav.setInActiveImageTintColor(iconColor); holder.pf_share.setInActiveImageTintColor(iconColor); Helper.changeDrawableColor(context, holder.pf_comment, iconColor); - Helper.changeDrawableColor(context, holder.status_more,iconColor); + Helper.changeDrawableColor(context, holder.status_more, iconColor); Helper.changeDrawableColor(context, R.drawable.ic_pixelfed_favorite_border, iconColor); @@ -1116,10 +1051,8 @@ public class PixelfedListAdapter extends RecyclerView.Adapter implements OnPostA } - } - private void translateToot(Status status) { //Manages translations SharedPreferences sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, MODE_PRIVATE); @@ -1178,7 +1111,6 @@ public class PixelfedListAdapter extends RecyclerView.Adapter implements OnPostA } } - private void tootInformation(Status status) { Intent intent = new Intent(context, TootInfoActivity.class); Bundle b = new Bundle(); @@ -1195,7 +1127,6 @@ public class PixelfedListAdapter extends RecyclerView.Adapter implements OnPostA context.startActivity(intent); } - private void sendToot() { if (comment_content.getText() == null) { @@ -1271,8 +1202,6 @@ public class PixelfedListAdapter extends RecyclerView.Adapter implements OnPostA } } - - private void timedMuteAction(Status status) { final SharedPreferences sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, MODE_PRIVATE); int theme = sharedpreferences.getInt(Helper.SET_THEME, Helper.THEME_DARK); @@ -1383,7 +1312,6 @@ public class PixelfedListAdapter extends RecyclerView.Adapter implements OnPostA intentBC.putExtras(b); } - private void scheduleBoost(Status status) { final SharedPreferences sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, MODE_PRIVATE); @@ -1496,7 +1424,6 @@ public class PixelfedListAdapter extends RecyclerView.Adapter implements OnPostA } } - @Override public void onRetrieveEmoji(Status status, boolean fromTranslation) { if (status != null) { @@ -1519,4 +1446,56 @@ public class PixelfedListAdapter extends RecyclerView.Adapter implements OnPostA } + private class ViewHolderEmpty extends RecyclerView.ViewHolder { + ViewHolderEmpty(View itemView) { + super(itemView); + } + } + + private class ViewHolderPixelfed extends RecyclerView.ViewHolder { + SliderView imageSlider; + ImageView art_media, art_media_play, pf_pp, pf_comment; + SparkButton pf_fav, pf_share; + TextView pf_username, pf_likes, pf_description, pf_date; + CardView pf_cardview; + LinearLayout pf_bottom_container; + LinearLayout pixelfed_comments; + RecyclerView lv_comments; + + ConstraintLayout quick_reply_container; + MastalabAutoCompleteTextView quick_reply_text; + ImageView quick_reply_switch_to_full, status_more; + TextView toot_space_left; + ImageView quick_reply_emoji; + Button quick_reply_button; + ImageView quick_reply_privacy; + + ViewHolderPixelfed(View itemView) { + super(itemView); + art_media = itemView.findViewById(R.id.art_media); + art_media_play = itemView.findViewById(R.id.art_media_play); + imageSlider = itemView.findViewById(R.id.imageSlider); + pf_pp = itemView.findViewById(R.id.pf_pp); + pf_username = itemView.findViewById(R.id.pf_username); + pf_likes = itemView.findViewById(R.id.pf_likes); + pf_description = itemView.findViewById(R.id.pf_description); + pf_date = itemView.findViewById(R.id.pf_date); + pf_fav = itemView.findViewById(R.id.pf_fav); + pf_comment = itemView.findViewById(R.id.pf_comment); + pf_share = itemView.findViewById(R.id.pf_share); + pf_cardview = itemView.findViewById(R.id.pf_cardview); + pf_bottom_container = itemView.findViewById(R.id.pf_bottom_container); + pixelfed_comments = itemView.findViewById(R.id.pixelfed_comments); + lv_comments = itemView.findViewById(R.id.lv_comments); + quick_reply_container = itemView.findViewById(R.id.quick_reply_container); + status_more = itemView.findViewById(R.id.status_more); + quick_reply_text = itemView.findViewById(R.id.quick_reply_text); + quick_reply_switch_to_full = itemView.findViewById(R.id.quick_reply_switch_to_full); + toot_space_left = itemView.findViewById(R.id.toot_space_left); + quick_reply_emoji = itemView.findViewById(R.id.quick_reply_emoji); + quick_reply_button = itemView.findViewById(R.id.quick_reply_button); + quick_reply_privacy = itemView.findViewById(R.id.quick_reply_privacy); + } + } + } \ No newline at end of file diff --git a/app/src/main/java/app/fedilab/android/drawers/PlaylistAdapter.java b/app/src/main/java/app/fedilab/android/drawers/PlaylistAdapter.java index 9106aa7e3..e629baae9 100644 --- a/app/src/main/java/app/fedilab/android/drawers/PlaylistAdapter.java +++ b/app/src/main/java/app/fedilab/android/drawers/PlaylistAdapter.java @@ -23,9 +23,6 @@ import android.content.SharedPreferences; import android.graphics.drawable.Drawable; import android.os.AsyncTask; import android.os.Bundle; - -import androidx.core.content.ContextCompat; - import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -34,6 +31,8 @@ import android.widget.LinearLayout; import android.widget.RelativeLayout; import android.widget.TextView; +import androidx.core.content.ContextCompat; + import java.util.List; import app.fedilab.android.R; diff --git a/app/src/main/java/app/fedilab/android/drawers/ReorderTabAdapter.java b/app/src/main/java/app/fedilab/android/drawers/ReorderTabAdapter.java index a99c07cc6..37beb46c4 100644 --- a/app/src/main/java/app/fedilab/android/drawers/ReorderTabAdapter.java +++ b/app/src/main/java/app/fedilab/android/drawers/ReorderTabAdapter.java @@ -19,10 +19,6 @@ import android.content.Context; import android.content.SharedPreferences; import android.database.sqlite.SQLiteDatabase; import android.graphics.PorterDuff; - -import androidx.core.content.ContextCompat; -import androidx.recyclerview.widget.RecyclerView; - import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; @@ -31,11 +27,16 @@ import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast; +import androidx.core.content.ContextCompat; +import androidx.recyclerview.widget.RecyclerView; + import org.jetbrains.annotations.NotNull; import java.util.Collections; import java.util.List; +import app.fedilab.android.R; +import app.fedilab.android.activities.ReorderTimelinesActivity; import app.fedilab.android.client.Entities.ManageTimelines; import app.fedilab.android.helper.Helper; import app.fedilab.android.helper.itemtouchhelper.ItemTouchHelperAdapter; @@ -45,8 +46,6 @@ import app.fedilab.android.helper.itemtouchhelper.OnUndoListener; import app.fedilab.android.sqlite.Sqlite; import app.fedilab.android.sqlite.TimelinesDAO; import es.dmoral.toasty.Toasty; -import app.fedilab.android.R; -import app.fedilab.android.activities.ReorderTimelinesActivity; /** @@ -57,11 +56,9 @@ import app.fedilab.android.activities.ReorderTimelinesActivity; */ public class ReorderTabAdapter extends RecyclerView.Adapter implements ItemTouchHelperAdapter { - private List mItems; - private final OnStartDragListener mDragStartListener; private final OnUndoListener mUndoListener; - + private List mItems; private Context context; private SharedPreferences sharedpreferences; diff --git a/app/src/main/java/app/fedilab/android/drawers/ReportsListAdapter.java b/app/src/main/java/app/fedilab/android/drawers/ReportsListAdapter.java index 51959b135..bad31654c 100644 --- a/app/src/main/java/app/fedilab/android/drawers/ReportsListAdapter.java +++ b/app/src/main/java/app/fedilab/android/drawers/ReportsListAdapter.java @@ -27,7 +27,6 @@ import android.widget.TextView; import androidx.annotation.NonNull; import androidx.recyclerview.widget.RecyclerView; - import java.util.List; import app.fedilab.android.R; diff --git a/app/src/main/java/app/fedilab/android/drawers/ScheduledTootsListAdapter.java b/app/src/main/java/app/fedilab/android/drawers/ScheduledTootsListAdapter.java index 39384b896..59fa354e8 100644 --- a/app/src/main/java/app/fedilab/android/drawers/ScheduledTootsListAdapter.java +++ b/app/src/main/java/app/fedilab/android/drawers/ScheduledTootsListAdapter.java @@ -14,7 +14,6 @@ package app.fedilab.android.drawers; * You should have received a copy of the GNU General Public License along with Fedilab; if not, * see . */ -import android.annotation.SuppressLint; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; @@ -23,9 +22,6 @@ import android.database.sqlite.SQLiteDatabase; import android.os.AsyncTask; import android.os.Build; import android.os.Bundle; - -import androidx.appcompat.app.AlertDialog; - import android.text.Html; import android.text.Spanned; import android.view.LayoutInflater; @@ -42,17 +38,26 @@ import android.widget.TextView; import android.widget.TimePicker; import android.widget.Toast; +import androidx.appcompat.app.AlertDialog; + import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar; import java.util.List; import java.util.TimeZone; +import app.fedilab.android.R; +import app.fedilab.android.activities.MainActivity; +import app.fedilab.android.activities.ShowConversationActivity; +import app.fedilab.android.activities.TootActivity; +import app.fedilab.android.asynctasks.PostActionAsyncTask; import app.fedilab.android.client.API; import app.fedilab.android.client.Entities.Error; import app.fedilab.android.client.Entities.Status; import app.fedilab.android.client.Entities.StoredStatus; +import app.fedilab.android.fragments.DisplayScheduledTootsFragment; import app.fedilab.android.helper.Helper; +import app.fedilab.android.interfaces.OnPostActionInterface; import app.fedilab.android.jobs.ApplicationJob; import app.fedilab.android.jobs.ScheduledBoostsSyncJob; import app.fedilab.android.jobs.ScheduledTootsSyncJob; @@ -60,15 +65,6 @@ import app.fedilab.android.sqlite.BoostScheduleDAO; import app.fedilab.android.sqlite.Sqlite; import app.fedilab.android.sqlite.StatusStoredDAO; import es.dmoral.toasty.Toasty; -import app.fedilab.android.R; -import app.fedilab.android.activities.MainActivity; -import app.fedilab.android.activities.ShowConversationActivity; -import app.fedilab.android.activities.TootActivity; -import app.fedilab.android.asynctasks.PostActionAsyncTask; -import app.fedilab.android.fragments.DisplayScheduledTootsFragment; -import app.fedilab.android.interfaces.OnPostActionInterface; - -import static app.fedilab.android.helper.Helper.changeDrawableColor; /** diff --git a/app/src/main/java/app/fedilab/android/drawers/SearchListAdapter.java b/app/src/main/java/app/fedilab/android/drawers/SearchListAdapter.java index 43c8509af..0dd38c406 100644 --- a/app/src/main/java/app/fedilab/android/drawers/SearchListAdapter.java +++ b/app/src/main/java/app/fedilab/android/drawers/SearchListAdapter.java @@ -20,9 +20,6 @@ import android.graphics.Paint; import android.graphics.drawable.Drawable; import android.os.Build; import android.os.Bundle; - -import androidx.core.content.ContextCompat; - import android.text.Html; import android.text.util.Linkify; import android.view.LayoutInflater; @@ -33,18 +30,20 @@ import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; +import androidx.core.content.ContextCompat; + import com.bumptech.glide.Glide; import java.util.ArrayList; import java.util.List; -import app.fedilab.android.client.Entities.Account; -import app.fedilab.android.client.Entities.Status; -import app.fedilab.android.helper.Helper; import app.fedilab.android.R; import app.fedilab.android.activities.HashTagActivity; import app.fedilab.android.activities.ShowAccountActivity; import app.fedilab.android.activities.ShowConversationActivity; +import app.fedilab.android.client.Entities.Account; +import app.fedilab.android.client.Entities.Status; +import app.fedilab.android.helper.Helper; /** @@ -53,15 +52,13 @@ import app.fedilab.android.activities.ShowConversationActivity; */ public class SearchListAdapter extends BaseAdapter { + private static final int STATUS_TYPE = 0; + private static final int ACCOUNT_TYPE = 1; + private static final int TAG_TYPE = 2; private Context context; private List statuses; private List accounts; private List tags; - - - private static final int STATUS_TYPE = 0; - private static final int ACCOUNT_TYPE = 1; - private static final int TAG_TYPE = 2; private LayoutInflater layoutInflater; public SearchListAdapter(Context context, List statuses, List accounts, List tags) { @@ -299,9 +296,7 @@ public class SearchListAdapter extends BaseAdapter { return true; else if (position == statuses.size() && type == ACCOUNT_TYPE) return true; - else if (position == (statuses.size() + accounts.size()) && type == TAG_TYPE) - return true; - return false; + else return position == (statuses.size() + accounts.size()) && type == TAG_TYPE; } private class ViewHolderStatus { diff --git a/app/src/main/java/app/fedilab/android/drawers/SearchTagsAdapter.java b/app/src/main/java/app/fedilab/android/drawers/SearchTagsAdapter.java index f057a8a4a..f5bbe19f2 100644 --- a/app/src/main/java/app/fedilab/android/drawers/SearchTagsAdapter.java +++ b/app/src/main/java/app/fedilab/android/drawers/SearchTagsAdapter.java @@ -17,15 +17,14 @@ package app.fedilab.android.drawers; import android.content.Context; import android.content.Intent; import android.os.Bundle; - -import androidx.annotation.NonNull; -import androidx.recyclerview.widget.RecyclerView; - import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + import java.util.ArrayList; import java.util.List; @@ -58,15 +57,6 @@ public class SearchTagsAdapter extends RecyclerView.Adapter { return new ViewHolder(layoutInflater.inflate(R.layout.drawer_tag_search_tab, parent, false)); } - class ViewHolder extends RecyclerView.ViewHolder { - private TextView tag_name; - - public ViewHolder(@NonNull View itemView) { - super(itemView); - tag_name = itemView.findViewById(R.id.tag_name); - } - } - @Override public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int i) { final ViewHolder holder = (ViewHolder) viewHolder; @@ -96,5 +86,14 @@ public class SearchTagsAdapter extends RecyclerView.Adapter { return tags.size(); } + class ViewHolder extends RecyclerView.ViewHolder { + private TextView tag_name; + + public ViewHolder(@NonNull View itemView) { + super(itemView); + tag_name = itemView.findViewById(R.id.tag_name); + } + } + } \ No newline at end of file diff --git a/app/src/main/java/app/fedilab/android/drawers/SearchTootsListAdapter.java b/app/src/main/java/app/fedilab/android/drawers/SearchTootsListAdapter.java index 5b873c4f7..2393427d2 100644 --- a/app/src/main/java/app/fedilab/android/drawers/SearchTootsListAdapter.java +++ b/app/src/main/java/app/fedilab/android/drawers/SearchTootsListAdapter.java @@ -22,10 +22,6 @@ import android.content.SharedPreferences; import android.database.sqlite.SQLiteDatabase; import android.graphics.drawable.Drawable; import android.os.Bundle; - -import androidx.core.content.ContextCompat; -import androidx.appcompat.app.AlertDialog; - import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -34,14 +30,16 @@ import android.widget.LinearLayout; import android.widget.RelativeLayout; import android.widget.TextView; +import androidx.appcompat.app.AlertDialog; +import androidx.core.content.ContextCompat; + import java.util.List; +import app.fedilab.android.R; +import app.fedilab.android.activities.HashTagActivity; import app.fedilab.android.helper.Helper; import app.fedilab.android.sqlite.SearchDAO; import app.fedilab.android.sqlite.Sqlite; -import app.fedilab.android.R; -import app.fedilab.android.activities.HashTagActivity; - /** diff --git a/app/src/main/java/app/fedilab/android/drawers/SliderAdapter.java b/app/src/main/java/app/fedilab/android/drawers/SliderAdapter.java index 4dd7607c9..30f340ca3 100644 --- a/app/src/main/java/app/fedilab/android/drawers/SliderAdapter.java +++ b/app/src/main/java/app/fedilab/android/drawers/SliderAdapter.java @@ -79,19 +79,19 @@ public class SliderAdapter extends SliderViewAdapter 1) { + if (attachments.size() > 1) { viewHolder.textViewDescription.setText(String.format("%s/%s", (position + 1), attachments.size())); } - if( canDelete){ + if (canDelete) { viewHolder.delete_media.setVisibility(View.VISIBLE); - }else{ + } else { viewHolder.delete_media.setVisibility(View.GONE); } String url; - if(attachments.get(position).getPreview_url().endsWith("no-preview.png") ){ + if (attachments.get(position).getPreview_url().endsWith("no-preview.png")) { url = attachments.get(position).getUrl(); - }else{ + } else { url = attachments.get(position).getPreview_url(); } Glide.with(viewHolder.imageViewBackground.getContext()) @@ -99,7 +99,7 @@ public class SliderAdapter extends SliderViewAdapter{ + viewHolder.delete_media.setOnClickListener(view -> { showRemove(position); }); } @@ -187,7 +187,6 @@ public class SliderAdapter extends SliderViewAdapter statuses; private boolean isOnWifi; private StatusListAdapter statusListAdapter; private RetrieveFeedsAsyncTask.Type type; private String targetedId; - public static final int HIDDEN_STATUS = 0; - public static final int DISPLAYED_STATUS = 1; - public static final int FOCUSED_STATUS = 2; - public static final int COMPACT_STATUS = 3; - public static final int CONSOLE_STATUS = 4; private int conversationPosition; private boolean redraft; private Status toot; private TagTimeline tagTimeline; - public static boolean fetch_all_more = false; private AlertDialog alertDialogEmoji; private MastalabAutoCompleteTextView toot_content; private EditText toot_cw_content; @@ -224,9 +221,7 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct private Status tootReply; private long currentToId = -1; private RecyclerView mRecyclerView; - private List lstHolders; - private final Object lock = new Object(); private List emojisPicker; private Status statusForQuickReply; @@ -253,19 +248,6 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct private Handler mHandler = new Handler(); - @Override - public void onAttachedToRecyclerView(@NotNull RecyclerView recyclerView) { - super.onAttachedToRecyclerView(recyclerView); - mRecyclerView = recyclerView; - } - - - @Override - public void onDetachedFromRecyclerView(@NotNull RecyclerView recyclerView) { - super.onDetachedFromRecyclerView(recyclerView); - mRecyclerView = null; - } - public StatusListAdapter(RetrieveFeedsAsyncTask.Type type, String targetedId, boolean isOnWifi, List statuses) { super(); this.statuses = statuses; @@ -281,6 +263,7 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct currentToId = -1; } + public StatusListAdapter(TagTimeline tagTimeline, String targetedId, boolean isOnWifi, List statuses) { super(); this.statuses = statuses; @@ -313,6 +296,17 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct } + @Override + public void onAttachedToRecyclerView(@NotNull RecyclerView recyclerView) { + super.onAttachedToRecyclerView(recyclerView); + mRecyclerView = recyclerView; + } + + @Override + public void onDetachedFromRecyclerView(@NotNull RecyclerView recyclerView) { + super.onDetachedFromRecyclerView(recyclerView); + mRecyclerView = null; + } @Override public long getItemId(int position) { @@ -390,7 +384,7 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct deltaSearch = oldContent.substring(currentCursorPosition - searchLength, currentCursorPosition); else { if (currentCursorPosition >= oldContent.length()) - deltaSearch = oldContent.substring(currentCursorPosition - searchLength, oldContent.length()); + deltaSearch = oldContent.substring(currentCursorPosition - searchLength); } if (!search.equals("")) deltaSearch = deltaSearch.replace("@" + search, ""); @@ -399,7 +393,7 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct newContent += "@" + account.getAcct() + " "; int newPosition = newContent.length(); if (currentCursorPosition < oldContent.length()) - newContent += oldContent.substring(currentCursorPosition, oldContent.length()); + newContent += oldContent.substring(currentCursorPosition); toot_content.setText(newContent); toot_space_left.setText(String.valueOf(TootActivity.countLength(social, toot_content, toot_cw_content))); toot_content.setSelection(newPosition); @@ -443,7 +437,7 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct deltaSearch = oldContent.substring(currentCursorPosition - searchLength, currentCursorPosition); else { if (currentCursorPosition >= oldContent.length()) - deltaSearch = oldContent.substring(currentCursorPosition - searchLength, oldContent.length()); + deltaSearch = oldContent.substring(currentCursorPosition - searchLength); } if (!search.equals("")) @@ -453,7 +447,7 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct newContent += ":" + shortcode + ": "; int newPosition = newContent.length(); if (currentCursorPosition < oldContent.length()) - newContent += oldContent.substring(currentCursorPosition, oldContent.length()); + newContent += oldContent.substring(currentCursorPosition); toot_content.setText(newContent); toot_space_left.setText(String.valueOf(TootActivity.countLength(social, toot_content, toot_cw_content))); toot_content.setSelection(newPosition); @@ -500,7 +494,7 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct deltaSearch = oldContent.substring(currentCursorPosition - searchLength, currentCursorPosition); else { if (currentCursorPosition >= oldContent.length()) - deltaSearch = oldContent.substring(currentCursorPosition - searchLength, oldContent.length()); + deltaSearch = oldContent.substring(currentCursorPosition - searchLength); } if (!search.equals("")) @@ -510,7 +504,7 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct newContent += "#" + tag + " "; int newPosition = newContent.length(); if (currentCursorPosition < oldContent.length()) - newContent += oldContent.substring(currentCursorPosition, oldContent.length()); + newContent += oldContent.substring(currentCursorPosition); toot_content.setText(newContent); toot_space_left.setText(String.valueOf(TootActivity.countLength(social, toot_content, toot_cw_content))); toot_content.setSelection(newPosition); @@ -539,7 +533,6 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct boolean split_toot = sharedpreferences.getBoolean(Helper.SET_AUTOMATICALLY_SPLIT_TOOTS + userId + instance, false); - if (split_toot && splitToot != null && stepSpliToot < splitToot.size()) { String tootContent = splitToot.get(stepSpliToot); stepSpliToot += 1; @@ -590,13 +583,6 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct } } - - private class ViewHolderEmpty extends RecyclerView.ViewHolder { - ViewHolderEmpty(View itemView) { - super(itemView); - } - } - @Override public void onViewAttachedToWindow(@NonNull RecyclerView.ViewHolder holder) { super.onViewAttachedToWindow(holder); @@ -613,265 +599,6 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct } - - class ViewHolder extends RecyclerView.ViewHolder { - LinearLayout status_content_container; - LinearLayout status_spoiler_container; - CustomTextView status_spoiler; - Button status_spoiler_button; - CustomTextView status_content; - TextView status_content_translated; - ConstraintLayout status_content_translated_container; - TextView status_account_username; - TextView status_account_displayname, status_account_displayname_owner; - ImageView status_account_profile; - ImageView status_account_profile_boost_by; - ConstraintLayout status_boosted_by_info; - TextView status_reply_count; - TextView status_favorite_count; - TextView status_reblog_count; - TextView status_toot_date; - RelativeLayout status_show_more; - ImageView status_more; - LinearLayout status_document_container; - RelativeLayout status_horizontal_document_container; - ImageView status_prev1; - ImageView status_prev2; - ImageView status_prev3; - ImageView status_prev4; - ImageView status_prev1_play; - ImageView status_prev2_play; - ImageView status_prev3_play; - ImageView status_prev4_play; - ImageView status_prev1_h; - ImageView status_prev2_h; - ImageView status_prev3_h; - ImageView status_prev4_h; - ImageView status_prev1_play_h; - ImageView status_prev2_play_h; - ImageView status_prev3_play_h; - ImageView status_prev4_play_h; - ImageView conversation_pp_1; - ImageView conversation_pp_2; - ImageView conversation_pp_3; - ImageView conversation_pp_4; - ConstraintLayout conversation_pp; - RelativeLayout status_prev4_container; - ImageView status_reply; - ImageView status_pin; - ImageView status_remove; - ImageView status_privacy; - LinearLayout status_container2; - LinearLayout status_container3; - ConstraintLayout main_container; - TextView yandex_translate; - ConstraintLayout status_action_container; - Button fetch_more; - ImageView new_element; - LinearLayout status_spoiler_mention_container; - TextView status_mention_spoiler; - LinearLayout status_cardview; - ImageView status_cardview_image; - TextView status_cardview_title, status_cardview_content, status_cardview_url; - FrameLayout status_cardview_video; - CustomWebview status_cardview_webview; - ImageView hide_preview, hide_preview_h; - TextView status_toot_app; - RelativeLayout webview_preview; - ImageView webview_preview_card; - LinearLayout left_buttons; - Button status_show_more_content; - SparkButton spark_button_fav, spark_button_reblog; - RelativeLayout horizontal_second_image; - - LinearLayout status_peertube_container; - TextView status_peertube_reply, status_peertube_delete, show_more_content; - ImageView cached_status, status_account_bot; - ImageButton fedilab_features; - ImageButton custom_feature_translate; - ImageButton custom_feature_bookmark; - ImageButton custom_feature_timed_mute; - ImageButton custom_feature_schedule; - ImageButton custom_feature_mention; - ImageButton custom_feature_cache; - ConstraintLayout fedilab_features_panel, quick_reply_container; - //Poll - LinearLayout poll_container, single_choice, multiple_choice, rated; - RadioGroup radio_group; - - TextView number_votes, remaining_time; - Button submit_vote, refresh_poll; - - - MastalabAutoCompleteTextView quick_reply_text; - ImageView quick_reply_switch_to_full; - TextView toot_space_left, warning_message; - ImageView quick_reply_emoji; - Button quick_reply_button; - ImageView quick_reply_privacy; - View status_reply_indicator_top, reply_indicator_dot, status_reply_indicator_bottom, status_reply_indicator_diag_top, status_reply_indicator_diag_bottom; - CardView main_card_container; - LinearLayout main_linear_container; - View translation_border_view; - TextView translation_label; - public View getView() { - return itemView; - } - - ViewHolder(View itemView) { - super(itemView); - fetch_more = itemView.findViewById(R.id.fetch_more); - webview_preview_card = itemView.findViewById(R.id.webview_preview_card); - webview_preview = itemView.findViewById(R.id.webview_preview); - status_horizontal_document_container = itemView.findViewById(R.id.status_horizontal_document_container); - status_document_container = itemView.findViewById(R.id.status_document_container); - status_horizontal_document_container = itemView.findViewById(R.id.status_horizontal_document_container); - status_content = itemView.findViewById(R.id.status_content); - status_content_translated = itemView.findViewById(R.id.status_content_translated); - status_account_username = itemView.findViewById(R.id.status_account_username); - status_account_displayname = itemView.findViewById(R.id.status_account_displayname); - status_account_displayname_owner = itemView.findViewById(R.id.status_account_displayname_owner); - status_account_profile = itemView.findViewById(R.id.status_account_profile); - status_account_profile_boost_by = itemView.findViewById(R.id.status_account_profile_boost_by); - status_boosted_by_info = itemView.findViewById(R.id.status_boosted_by_info); - status_reply_count = itemView.findViewById(R.id.status_reply_count); - status_favorite_count = itemView.findViewById(R.id.status_favorite_count); - status_reblog_count = itemView.findViewById(R.id.status_reblog_count); - status_pin = itemView.findViewById(R.id.status_pin); - status_remove = itemView.findViewById(R.id.status_remove); - status_toot_date = itemView.findViewById(R.id.status_toot_date); - status_show_more = itemView.findViewById(R.id.status_show_more); - status_more = itemView.findViewById(R.id.status_more); - status_prev1 = itemView.findViewById(R.id.status_prev1); - status_prev2 = itemView.findViewById(R.id.status_prev2); - status_prev3 = itemView.findViewById(R.id.status_prev3); - status_prev4 = itemView.findViewById(R.id.status_prev4); - status_prev1_play = itemView.findViewById(R.id.status_prev1_play); - status_prev2_play = itemView.findViewById(R.id.status_prev2_play); - status_prev3_play = itemView.findViewById(R.id.status_prev3_play); - status_prev4_play = itemView.findViewById(R.id.status_prev4_play); - status_prev1_h = itemView.findViewById(R.id.status_prev1_h); - status_prev2_h = itemView.findViewById(R.id.status_prev2_h); - status_prev3_h = itemView.findViewById(R.id.status_prev3_h); - status_prev4_h = itemView.findViewById(R.id.status_prev4_h); - status_prev1_play_h = itemView.findViewById(R.id.status_prev1_play_h); - status_prev2_play_h = itemView.findViewById(R.id.status_prev2_play_h); - status_prev3_play_h = itemView.findViewById(R.id.status_prev3_play_h); - status_prev4_play_h = itemView.findViewById(R.id.status_prev4_play_h); - status_container2 = itemView.findViewById(R.id.status_container2); - status_container3 = itemView.findViewById(R.id.status_container3); - status_prev4_container = itemView.findViewById(R.id.status_prev4_container); - status_reply = itemView.findViewById(R.id.status_reply); - status_privacy = itemView.findViewById(R.id.status_privacy); - - status_content_translated_container = itemView.findViewById(R.id.status_content_translated_container); - main_container = itemView.findViewById(R.id.main_container); - status_spoiler_container = itemView.findViewById(R.id.status_spoiler_container); - status_content_container = itemView.findViewById(R.id.status_content_container); - status_spoiler = itemView.findViewById(R.id.status_spoiler); - show_more_content = itemView.findViewById(R.id.show_more_content); - status_spoiler_button = itemView.findViewById(R.id.status_spoiler_button); - yandex_translate = itemView.findViewById(R.id.yandex_translate); - new_element = itemView.findViewById(R.id.new_element); - status_action_container = itemView.findViewById(R.id.status_action_container); - status_spoiler_mention_container = itemView.findViewById(R.id.status_spoiler_mention_container); - status_mention_spoiler = itemView.findViewById(R.id.status_mention_spoiler); - status_cardview = itemView.findViewById(R.id.status_cardview); - status_cardview_image = itemView.findViewById(R.id.status_cardview_image); - status_cardview_title = itemView.findViewById(R.id.status_cardview_title); - status_cardview_content = itemView.findViewById(R.id.status_cardview_content); - status_cardview_url = itemView.findViewById(R.id.status_cardview_url); - status_cardview_video = itemView.findViewById(R.id.status_cardview_video); - status_cardview_webview = itemView.findViewById(R.id.status_cardview_webview); - hide_preview = itemView.findViewById(R.id.hide_preview); - hide_preview_h = itemView.findViewById(R.id.hide_preview_h); - status_toot_app = itemView.findViewById(R.id.status_toot_app); - conversation_pp = itemView.findViewById(R.id.conversation_pp); - conversation_pp_1 = itemView.findViewById(R.id.conversation_pp_1); - conversation_pp_2 = itemView.findViewById(R.id.conversation_pp_2); - conversation_pp_3 = itemView.findViewById(R.id.conversation_pp_3); - conversation_pp_4 = itemView.findViewById(R.id.conversation_pp_4); - left_buttons = itemView.findViewById(R.id.left_buttons); - status_show_more_content = itemView.findViewById(R.id.status_show_more_content); - spark_button_fav = itemView.findViewById(R.id.spark_button_fav); - spark_button_reblog = itemView.findViewById(R.id.spark_button_reblog); - horizontal_second_image = itemView.findViewById(R.id.horizontal_second_image); - - status_peertube_container = itemView.findViewById(R.id.status_peertube_container); - status_peertube_reply = itemView.findViewById(R.id.status_peertube_reply); - status_peertube_delete = itemView.findViewById(R.id.status_peertube_delete); - fedilab_features = itemView.findViewById(R.id.fedilab_features); - fedilab_features_panel = itemView.findViewById(R.id.fedilab_features_panel); - quick_reply_container = itemView.findViewById(R.id.quick_reply_container); - custom_feature_translate = itemView.findViewById(R.id.custom_feature_translate); - custom_feature_bookmark = itemView.findViewById(R.id.custom_feature_bookmark); - custom_feature_timed_mute = itemView.findViewById(R.id.custom_feature_timed_mute); - custom_feature_schedule = itemView.findViewById(R.id.custom_feature_schedule); - custom_feature_mention = itemView.findViewById(R.id.custom_feature_mention); - custom_feature_cache = itemView.findViewById(R.id.custom_feature_cache); - poll_container = itemView.findViewById(R.id.poll_container); - single_choice = itemView.findViewById(R.id.single_choice); - multiple_choice = itemView.findViewById(R.id.multiple_choice); - rated = itemView.findViewById(R.id.rated); - radio_group = itemView.findViewById(R.id.radio_group); - number_votes = itemView.findViewById(R.id.number_votes); - remaining_time = itemView.findViewById(R.id.remaining_time); - submit_vote = itemView.findViewById(R.id.submit_vote); - refresh_poll = itemView.findViewById(R.id.refresh_poll); - cached_status = itemView.findViewById(R.id.cached_status); - status_account_bot = itemView.findViewById(R.id.status_account_bot); - - - quick_reply_text = itemView.findViewById(R.id.quick_reply_text); - quick_reply_switch_to_full = itemView.findViewById(R.id.quick_reply_switch_to_full); - toot_space_left = itemView.findViewById(R.id.toot_space_left); - quick_reply_emoji = itemView.findViewById(R.id.quick_reply_emoji); - quick_reply_button = itemView.findViewById(R.id.quick_reply_button); - quick_reply_privacy = itemView.findViewById(R.id.quick_reply_privacy); - - warning_message = itemView.findViewById(R.id.warning_message); - - status_reply_indicator_bottom = itemView.findViewById(R.id.status_reply_indicator_bottom); - status_reply_indicator_top = itemView.findViewById(R.id.status_reply_indicator_top); - status_reply_indicator_diag_top = itemView.findViewById(R.id.status_reply_indicator_diag_top); - status_reply_indicator_diag_bottom = itemView.findViewById(R.id.status_reply_indicator_diag_bottom); - reply_indicator_dot = itemView.findViewById(R.id.reply_indicator_dot); - Context context = itemView.getContext(); - final SharedPreferences sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, MODE_PRIVATE); - int theme = sharedpreferences.getInt(Helper.SET_THEME, Helper.THEME_DARK); - main_card_container = itemView.findViewById(R.id.main_card_container); - main_linear_container = itemView.findViewById(R.id.main_linear_container); - translation_border_view = itemView.findViewById(R.id.translation_border_view); - translation_label = itemView.findViewById(R.id.translation_label); - } - - void updateAnimatedEmoji() { - if (type != RetrieveFeedsAsyncTask.Type.CONVERSATION) { - status_account_displayname.invalidate(); - } - status_content.invalidate(); - } - - - private void startUpdateTimer() { - - final SharedPreferences sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, MODE_PRIVATE); - boolean disableAnimatedEmoji = sharedpreferences.getBoolean(Helper.SET_DISABLE_ANIMATED_EMOJI, false); - if (!disableAnimatedEmoji) { - if (BaseMainActivity.timer == null) { - BaseMainActivity.timer = new Timer(); - } - BaseMainActivity.timer.schedule(new TimerTask() { - @Override - public void run() { - mHandler.post(updateAnimatedEmoji); - } - }, 0, 130); - } - } - - } - public Status getItem(int position) { if (statuses.size() > position && position >= 0) return statuses.get(position); @@ -891,9 +618,9 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct if (statuses.get(position).isFocused() && type == RetrieveFeedsAsyncTask.Type.CONTEXT && statuses.get(position).getViewType() != CONSOLE_STATUS) return FOCUSED_STATUS; else { - if( social == UpdateAccountInfoAsyncTask.SOCIAL.PIXELFED && type == RetrieveFeedsAsyncTask.Type.CONTEXT) { + if (social == UpdateAccountInfoAsyncTask.SOCIAL.PIXELFED && type == RetrieveFeedsAsyncTask.Type.CONTEXT) { return COMPACT_STATUS; - }else { + } else { return statuses.get(position).getViewType(); } } @@ -917,7 +644,6 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct return new ViewHolderEmpty(layoutInflater.inflate(R.layout.drawer_empty, parent, false)); } - @SuppressLint("SetJavaScriptEnabled") @Override public void onBindViewHolder(@NonNull final RecyclerView.ViewHolder viewHolder, int i) { @@ -952,7 +678,7 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct holder.status_reply_indicator_top.setBackgroundColor(ContextCompat.getColor(context, R.color.mastodonC4)); holder.status_reply_indicator_bottom.setBackgroundColor(ContextCompat.getColor(context, R.color.mastodonC4)); holder.reply_indicator_dot.setBackgroundColor(ContextCompat.getColor(context, R.color.mastodonC4)); - }else{ + } else { holder.status_reply_indicator_top.setBackgroundColor(ContextCompat.getColor(context, R.color.cyanea_accent_reference)); holder.status_reply_indicator_bottom.setBackgroundColor(ContextCompat.getColor(context, R.color.cyanea_accent_reference)); holder.reply_indicator_dot.setBackgroundColor(ContextCompat.getColor(context, R.color.cyanea_accent_reference)); @@ -961,10 +687,10 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct if (status.isShowTopLine()) { holder.status_reply_indicator_top.setVisibility(View.VISIBLE); holder.reply_indicator_dot.setVisibility(View.VISIBLE); - if( holder.status_reply_indicator_diag_top != null){ + if (holder.status_reply_indicator_diag_top != null) { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { holder.status_reply_indicator_diag_top.setBackgroundResource(R.drawable.diag_top_android4); - }else { + } else { holder.status_reply_indicator_diag_top.setBackgroundResource(R.drawable.diag_top); } holder.status_reply_indicator_diag_top.setVisibility(View.VISIBLE); @@ -973,10 +699,10 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct if (status.isShowBottomLine()) { holder.reply_indicator_dot.setVisibility(View.VISIBLE); holder.status_reply_indicator_bottom.setVisibility(View.VISIBLE); - if( holder.status_reply_indicator_diag_bottom != null){ + if (holder.status_reply_indicator_diag_bottom != null) { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { holder.status_reply_indicator_diag_bottom.setBackgroundResource(R.drawable.diag_bottom_android4); - }else { + } else { holder.status_reply_indicator_diag_bottom.setBackgroundResource(R.drawable.diag_bottom); } @@ -985,17 +711,17 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct } if (!status.isShowTopLine()) { holder.status_reply_indicator_top.setVisibility(View.GONE); - if( holder.status_reply_indicator_diag_top != null){ + if (holder.status_reply_indicator_diag_top != null) { holder.status_reply_indicator_diag_top.setVisibility(View.GONE); } } - if ( !status.isShowBottomLine()) { + if (!status.isShowBottomLine()) { holder.status_reply_indicator_bottom.setVisibility(View.GONE); - if( holder.status_reply_indicator_diag_bottom != null){ + if (holder.status_reply_indicator_diag_bottom != null) { holder.status_reply_indicator_diag_bottom.setVisibility(View.GONE); } } - if (!status.isShowTopLine() && !status.isShowBottomLine() ) { + if (!status.isShowTopLine() && !status.isShowBottomLine()) { holder.reply_indicator_dot.setVisibility(View.GONE); } } @@ -1096,9 +822,9 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct (holder.multiple_choice).removeAllViews(); for (PollOptions pollOption : poll.getOptionsList()) { CheckBox cb = new CheckBox(context); - if( pollOption.getTitleSpan() != null){ + if (pollOption.getTitleSpan() != null) { cb.setText(pollOption.getTitleSpan(), TextView.BufferType.SPANNABLE); - }else { + } else { cb.setText(pollOption.getTitle()); } @@ -1111,9 +837,9 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct (holder.radio_group).removeAllViews(); for (PollOptions pollOption : poll.getOptionsList()) { RadioButton rb = new RadioButton(context); - if( pollOption.getTitleSpan() != null){ + if (pollOption.getTitleSpan() != null) { rb.setText(pollOption.getTitleSpan(), TextView.BufferType.SPANNABLE); - }else { + } else { rb.setText(pollOption.getTitle()); } holder.radio_group.addView(rb); @@ -1354,10 +1080,9 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct holder.status_privacy.setVisibility(View.VISIBLE); - SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); int iconColor = prefs.getInt("theme_icons_color", -1); - if( iconColor == -1){ + if (iconColor == -1) { iconColor = ThemeHelper.getAttColor(context, R.attr.iconColor); } @@ -1388,7 +1113,6 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct holder.status_reblog_count.setTextColor(iconColor); - holder.status_account_displayname.setTextColor(ThemeHelper.getAttColor(context, R.attr.textHeader)); holder.status_toot_date.setTextColor(ThemeHelper.getAttColor(context, R.attr.textHeader)); Helper.changeDrawableColor(context, R.drawable.ic_repeat_head_toot, R.attr.textHeader); @@ -1557,7 +1281,7 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct status.setEmojiFound(true); Status.makeEmojis(context, this, status); } - Poll poll = (status.getReblog() == null)?status.getPoll():status.getReblog().getPoll(); + Poll poll = (status.getReblog() == null) ? status.getPoll() : status.getReblog().getPoll(); if (poll != null && !status.isPollEmojiFound()) { status.setPollEmojiFound(true); Status.makeEmojiPoll(context, this, status); @@ -2013,7 +1737,7 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct if (status.getReblog() != null) { Helper.loadGiF(context, accountForUrl.getAvatar(), holder.status_account_profile); Helper.loadGiF(context, status.getAccount().getAvatar(), holder.status_account_profile_boost_by); - if( holder.status_boosted_by_info != null) { + if (holder.status_boosted_by_info != null) { holder.status_boosted_by_info.setVisibility(View.VISIBLE); } } else { @@ -2023,28 +1747,28 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct } } int reblogColor = prefs.getInt("theme_boost_header_color", -1); - if( holder.status_boosted_by_info != null && reblogColor != -1){ + if (holder.status_boosted_by_info != null && reblogColor != -1) { holder.status_boosted_by_info.setBackgroundColor(reblogColor); } int theme_text_color = prefs.getInt("theme_text_color", -1); - if( holder.status_content != null && theme_text_color != -1){ + if (holder.status_content != null && theme_text_color != -1) { holder.status_content.setTextColor(theme_text_color); holder.status_content_translated.setTextColor(theme_text_color); holder.status_spoiler.setTextColor(theme_text_color); } int statusColor = prefs.getInt("theme_statuses_color", -1); - if( holder.main_card_container != null && statusColor != -1) { + if (holder.main_card_container != null && statusColor != -1) { holder.main_card_container.setCardBackgroundColor(statusColor); - if( holder.translation_label != null){ + if (holder.translation_label != null) { holder.translation_label.setBackgroundColor(statusColor); } - }else if(holder.main_card_container != null){ + } else if (holder.main_card_container != null) { holder.main_card_container.setCardBackgroundColor(ThemeHelper.getAttColor(context, R.attr.cardviewColor)); - if( holder.translation_label != null){ + if (holder.translation_label != null) { holder.translation_label.setBackgroundColor(ThemeHelper.getAttColor(context, R.attr.cardviewColor)); } } - if( statusColor != -1) { + if (statusColor != -1) { holder.quick_reply_container.setBackgroundColor(statusColor); } @@ -2307,7 +2031,7 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct holder.status_content_translated_container.setVisibility(View.VISIBLE); if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { holder.translation_border_view.setBackgroundResource(R.drawable.translation_border_android4); - }else{ + } else { holder.translation_border_view.setBackgroundResource(R.drawable.translation_border); } @@ -2315,7 +2039,7 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct holder.status_content_translated_container.setVisibility(View.GONE); } - if( status.getReblog() == null) { + if (status.getReblog() == null) { switch (status.getVisibility()) { case "direct": holder.status_reblog_count.setVisibility(View.GONE); @@ -2340,7 +2064,7 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct holder.status_reblog_count.setVisibility(View.VISIBLE); holder.spark_button_reblog.setVisibility(View.VISIBLE); } - }else{ + } else { holder.status_reblog_count.setVisibility(View.VISIBLE); holder.spark_button_reblog.setVisibility(View.VISIBLE); } @@ -2445,7 +2169,7 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct holder.quick_reply_button.setOnClickListener(view -> { - sendToot(status,null); + sendToot(status, null); status.setShortReply(false); holder.quick_reply_container.setVisibility(View.GONE); InputMethodManager imm = (InputMethodManager) context.getSystemService(Activity.INPUT_METHOD_SERVICE); @@ -2566,7 +2290,7 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct while (matcher.find()) { final String nitter_directory = matcher.group(2); String nitterHost = sharedpreferences.getString(Helper.SET_NITTER_HOST, Helper.DEFAULT_NITTER_HOST).toLowerCase(); - url = url.replaceAll("https://"+Pattern.quote(matcher.group()), Matcher.quoteReplacement("https://"+nitterHost + nitter_directory)); + url = url.replaceAll("https://" + Pattern.quote(matcher.group()), Matcher.quoteReplacement("https://" + nitterHost + nitter_directory)); } } Helper.openBrowser(context, url); @@ -2605,23 +2329,23 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct while (matcher.find()) { final String youtubeId = matcher.group(3); String invidiousHost = sharedpreferences.getString(Helper.SET_INVIDIOUS_HOST, Helper.DEFAULT_INVIDIOUS_HOST).toLowerCase(); - if( matcher.group(2) != null && matcher.group(2).equals("youtu.be")){ - url = url.replaceAll("https://"+Pattern.quote(matcher.group()), Matcher.quoteReplacement("https://"+invidiousHost + "/watch?v="+youtubeId+"&local=true")); - }else{ - url = url.replaceAll("https://"+Pattern.quote(matcher.group()), Matcher.quoteReplacement("https://"+invidiousHost + "/"+youtubeId+"&local=true")); + if (matcher.group(2) != null && matcher.group(2).equals("youtu.be")) { + url = url.replaceAll("https://" + Pattern.quote(matcher.group()), Matcher.quoteReplacement("https://" + invidiousHost + "/watch?v=" + youtubeId + "&local=true")); + } else { + url = url.replaceAll("https://" + Pattern.quote(matcher.group()), Matcher.quoteReplacement("https://" + invidiousHost + "/" + youtubeId + "&local=true")); } } } } - if( status.getReblog() == null) { + if (status.getReblog() == null) { status.setWebviewURL(url); - }else{ + } else { status.getReblog().setWebviewURL(url); } notifyStatusChanged(status); } }); - }else{ + } else { holder.status_cardview.setVisibility(View.GONE); holder.status_cardview_video.setVisibility(View.GONE); } @@ -2648,7 +2372,7 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct if (MainActivity.social == UpdateAccountInfoAsyncTask.SOCIAL.PIXELFED || (quick_reply && type != RetrieveFeedsAsyncTask.Type.REMOTE_INSTANCE && type != RetrieveFeedsAsyncTask.Type.NEWS)) { - if( social == UpdateAccountInfoAsyncTask.SOCIAL.PIXELFED){ + if (social == UpdateAccountInfoAsyncTask.SOCIAL.PIXELFED) { holder.quick_reply_switch_to_full.setVisibility(View.GONE); } if (context instanceof BaseMainActivity) { @@ -2685,10 +2409,10 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct holder.quick_reply_text.requestFocus(); EditText content_cw = new EditText(context); content_cw.setText(status.getReblog() != null ? status.getReblog().getSpoiler_text() : status.getSpoiler_text()); - if( status.getQuickReplyContent() == null ) { + if (status.getQuickReplyContent() == null) { TootActivity.manageMentions(context, social, userId, holder.quick_reply_text, content_cw, holder.toot_space_left, status.getReblog() != null ? status.getReblog() : status); - }else{ + } else { holder.quick_reply_text.setText(status.getQuickReplyContent()); } TextWatcher textWatcher = TootActivity.initializeTextWatcher(context, social, status, holder.quick_reply_text, content_cw, holder.toot_space_left, null, null, StatusListAdapter.this, StatusListAdapter.this, StatusListAdapter.this); @@ -2768,7 +2492,7 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct holder.quick_reply_privacy.setImageResource(R.drawable.ic_mail_outline_toot); break; } - if( status.getQuickReplyPrivacy() != null){ + if (status.getQuickReplyPrivacy() != null) { switch (status.getQuickReplyPrivacy()) { case "public": holder.quick_reply_privacy.setImageResource(R.drawable.ic_public_toot); @@ -3497,7 +3221,6 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct } - private void loadAttachments(final Status status, final ViewHolder holder, boolean blur) { SharedPreferences sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, MODE_PRIVATE); boolean fullAttachement = sharedpreferences.getBoolean(Helper.SET_FULL_PREVIEW, false); @@ -4135,16 +3858,16 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct splitToot = Helper.splitToots(toot_content.getText().toString().trim(), finalSplit_toot_size, isChecked); textView.setText(""); int inc = 0; - for(String prev: splitToot){ - if( inc < splitToot.size()-1) { + for (String prev : splitToot) { + if (inc < splitToot.size() - 1) { textView.setText(textView.getText() + prev + "\n----------\n"); } } } }); int inc = 0; - for(String prev: splitToot){ - if( inc < splitToot.size()-1) { + for (String prev : splitToot) { + if (inc < splitToot.size() - 1) { textView.setText(textView.getText() + prev + "\n----------\n"); } } @@ -4168,8 +3891,7 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct } - - private void createAndSendToot(Status status, String content_type, String userId, String instance){ + private void createAndSendToot(Status status, String content_type, String userId, String instance) { Status toot = new Status(); if (content_type != null) toot.setContentType(content_type); @@ -4186,8 +3908,6 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct status.setQuickReplyContent(null); } - - @Override public void onRetrieveFeeds(APIResponse apiResponse) { @@ -4205,7 +3925,6 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct } - @Override public void onRetrieveAccount(Card card) { if (conversationPosition < this.statuses.size() && card != null) @@ -4214,7 +3933,6 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct statusListAdapter.notifyItemChanged(conversationPosition); } - @Override public void onPostAction(int statusCode, API.StatusAction statusAction, String targetedId, Error error) { @@ -4297,25 +4015,25 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct //noinspection ConstantConditions if (statusListAdapter.getItemAt(i) != null && statusListAdapter.getItemAt(i).getId().equals(status.getId())) { try { - if( statuses.get(i).isFocused()){ + if (statuses.get(i).isFocused()) { status.setFocused(true); } - if( statuses.get(i).isFetchMore()){ + if (statuses.get(i).isFetchMore()) { status.setFetchMore(true); } - if( statuses.get(i).isShortReply()){ + if (statuses.get(i).isShortReply()) { status.setShortReply(true); } - if( statuses.get(i).getQuickReplyContent() != null){ + if (statuses.get(i).getQuickReplyContent() != null) { status.setQuickReplyContent(statuses.get(i).getQuickReplyContent()); } - if( statuses.get(i).getQuickReplyPrivacy() != null){ + if (statuses.get(i).getQuickReplyPrivacy() != null) { status.setQuickReplyPrivacy(statuses.get(i).getQuickReplyPrivacy()); } - if( statuses.get(i).isShowTopLine()){ + if (statuses.get(i).isShowTopLine()) { status.setShowTopLine(true); } - if( statuses.get(i).isShowBottomLine()){ + if (statuses.get(i).isShowBottomLine()) { status.setShowBottomLine(true); } statuses.set(i, status); @@ -4343,25 +4061,25 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct //noinspection ConstantConditions if (statusListAdapter.getItemAt(i) != null && statusListAdapter.getItemAt(i).getId().equals(status.getId())) { try { - if( statuses.get(i).isFocused()){ + if (statuses.get(i).isFocused()) { status.setFocused(true); } - if( statuses.get(i).isFetchMore()){ + if (statuses.get(i).isFetchMore()) { status.setFetchMore(true); } - if( statuses.get(i).isShortReply()){ + if (statuses.get(i).isShortReply()) { status.setShortReply(true); } - if( statuses.get(i).getQuickReplyContent() != null){ + if (statuses.get(i).getQuickReplyContent() != null) { status.setQuickReplyContent(statuses.get(i).getQuickReplyContent()); } - if( statuses.get(i).getQuickReplyPrivacy() != null){ + if (statuses.get(i).getQuickReplyPrivacy() != null) { status.setQuickReplyPrivacy(statuses.get(i).getQuickReplyPrivacy()); } - if( statuses.get(i).isShowTopLine()){ + if (statuses.get(i).isShowTopLine()) { status.setShowTopLine(true); } - if( statuses.get(i).isShowBottomLine()){ + if (statuses.get(i).isShowBottomLine()) { status.setShowBottomLine(true); } statuses.set(i, status); @@ -4382,7 +4100,6 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct } } - @Override public void onRetrieveImage(Status status, boolean fromTranslation) { if (status != null) { @@ -4395,7 +4112,6 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct } } - @Override public void onRetrieveEmoji(Status status, boolean fromTranslation) { if (status != null) { @@ -4413,7 +4129,6 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct } - private void translateToot(Status status) { //Manages translations SharedPreferences sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, MODE_PRIVATE); @@ -4477,18 +4192,17 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct this.conversationPosition = position; } - public void storeToot() { //Nothing to store here.... - if (tootReply == null || statusForQuickReply == null || statusForQuickReply.getQuickReplyContent() == null || (statusForQuickReply.getQuickReplyContent().trim().length() == 0 && toot_cw_content.getText().toString().trim().length() == 0)) + if (tootReply == null || statusForQuickReply == null || statusForQuickReply.getQuickReplyContent() == null || (statusForQuickReply.getQuickReplyContent().trim().length() == 0 && toot_cw_content.getText().toString().trim().length() == 0)) return; Status toot = new Status(); if (toot_cw_content.getText().toString().trim().length() > 0) toot.setSpoiler_text(toot_cw_content.getText().toString().trim()); - if( statusForQuickReply.getQuickReplyPrivacy() != null) { + if (statusForQuickReply.getQuickReplyPrivacy() != null) { toot.setVisibility(statusForQuickReply.getQuickReplyPrivacy()); } - if( statusForQuickReply.getQuickReplyContent() != null) { + if (statusForQuickReply.getQuickReplyContent() != null) { toot.setContent(statusForQuickReply.getQuickReplyContent().trim()); } @@ -4509,4 +4223,269 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct } } + private class ViewHolderEmpty extends RecyclerView.ViewHolder { + ViewHolderEmpty(View itemView) { + super(itemView); + } + } + + class ViewHolder extends RecyclerView.ViewHolder { + LinearLayout status_content_container; + LinearLayout status_spoiler_container; + CustomTextView status_spoiler; + Button status_spoiler_button; + CustomTextView status_content; + TextView status_content_translated; + ConstraintLayout status_content_translated_container; + TextView status_account_username; + TextView status_account_displayname, status_account_displayname_owner; + ImageView status_account_profile; + ImageView status_account_profile_boost_by; + ConstraintLayout status_boosted_by_info; + TextView status_reply_count; + TextView status_favorite_count; + TextView status_reblog_count; + TextView status_toot_date; + RelativeLayout status_show_more; + ImageView status_more; + LinearLayout status_document_container; + RelativeLayout status_horizontal_document_container; + ImageView status_prev1; + ImageView status_prev2; + ImageView status_prev3; + ImageView status_prev4; + ImageView status_prev1_play; + ImageView status_prev2_play; + ImageView status_prev3_play; + ImageView status_prev4_play; + ImageView status_prev1_h; + ImageView status_prev2_h; + ImageView status_prev3_h; + ImageView status_prev4_h; + ImageView status_prev1_play_h; + ImageView status_prev2_play_h; + ImageView status_prev3_play_h; + ImageView status_prev4_play_h; + ImageView conversation_pp_1; + ImageView conversation_pp_2; + ImageView conversation_pp_3; + ImageView conversation_pp_4; + ConstraintLayout conversation_pp; + RelativeLayout status_prev4_container; + ImageView status_reply; + ImageView status_pin; + ImageView status_remove; + ImageView status_privacy; + LinearLayout status_container2; + LinearLayout status_container3; + ConstraintLayout main_container; + TextView yandex_translate; + ConstraintLayout status_action_container; + Button fetch_more; + ImageView new_element; + LinearLayout status_spoiler_mention_container; + TextView status_mention_spoiler; + LinearLayout status_cardview; + ImageView status_cardview_image; + TextView status_cardview_title, status_cardview_content, status_cardview_url; + FrameLayout status_cardview_video; + CustomWebview status_cardview_webview; + ImageView hide_preview, hide_preview_h; + TextView status_toot_app; + RelativeLayout webview_preview; + ImageView webview_preview_card; + LinearLayout left_buttons; + Button status_show_more_content; + SparkButton spark_button_fav, spark_button_reblog; + RelativeLayout horizontal_second_image; + + LinearLayout status_peertube_container; + TextView status_peertube_reply, status_peertube_delete, show_more_content; + ImageView cached_status, status_account_bot; + ImageButton fedilab_features; + ImageButton custom_feature_translate; + ImageButton custom_feature_bookmark; + ImageButton custom_feature_timed_mute; + ImageButton custom_feature_schedule; + ImageButton custom_feature_mention; + ImageButton custom_feature_cache; + ConstraintLayout fedilab_features_panel, quick_reply_container; + //Poll + LinearLayout poll_container, single_choice, multiple_choice, rated; + RadioGroup radio_group; + + TextView number_votes, remaining_time; + Button submit_vote, refresh_poll; + + + MastalabAutoCompleteTextView quick_reply_text; + ImageView quick_reply_switch_to_full; + TextView toot_space_left, warning_message; + ImageView quick_reply_emoji; + Button quick_reply_button; + ImageView quick_reply_privacy; + View status_reply_indicator_top, reply_indicator_dot, status_reply_indicator_bottom, status_reply_indicator_diag_top, status_reply_indicator_diag_bottom; + CardView main_card_container; + LinearLayout main_linear_container; + View translation_border_view; + TextView translation_label; + + ViewHolder(View itemView) { + super(itemView); + fetch_more = itemView.findViewById(R.id.fetch_more); + webview_preview_card = itemView.findViewById(R.id.webview_preview_card); + webview_preview = itemView.findViewById(R.id.webview_preview); + status_horizontal_document_container = itemView.findViewById(R.id.status_horizontal_document_container); + status_document_container = itemView.findViewById(R.id.status_document_container); + status_horizontal_document_container = itemView.findViewById(R.id.status_horizontal_document_container); + status_content = itemView.findViewById(R.id.status_content); + status_content_translated = itemView.findViewById(R.id.status_content_translated); + status_account_username = itemView.findViewById(R.id.status_account_username); + status_account_displayname = itemView.findViewById(R.id.status_account_displayname); + status_account_displayname_owner = itemView.findViewById(R.id.status_account_displayname_owner); + status_account_profile = itemView.findViewById(R.id.status_account_profile); + status_account_profile_boost_by = itemView.findViewById(R.id.status_account_profile_boost_by); + status_boosted_by_info = itemView.findViewById(R.id.status_boosted_by_info); + status_reply_count = itemView.findViewById(R.id.status_reply_count); + status_favorite_count = itemView.findViewById(R.id.status_favorite_count); + status_reblog_count = itemView.findViewById(R.id.status_reblog_count); + status_pin = itemView.findViewById(R.id.status_pin); + status_remove = itemView.findViewById(R.id.status_remove); + status_toot_date = itemView.findViewById(R.id.status_toot_date); + status_show_more = itemView.findViewById(R.id.status_show_more); + status_more = itemView.findViewById(R.id.status_more); + status_prev1 = itemView.findViewById(R.id.status_prev1); + status_prev2 = itemView.findViewById(R.id.status_prev2); + status_prev3 = itemView.findViewById(R.id.status_prev3); + status_prev4 = itemView.findViewById(R.id.status_prev4); + status_prev1_play = itemView.findViewById(R.id.status_prev1_play); + status_prev2_play = itemView.findViewById(R.id.status_prev2_play); + status_prev3_play = itemView.findViewById(R.id.status_prev3_play); + status_prev4_play = itemView.findViewById(R.id.status_prev4_play); + status_prev1_h = itemView.findViewById(R.id.status_prev1_h); + status_prev2_h = itemView.findViewById(R.id.status_prev2_h); + status_prev3_h = itemView.findViewById(R.id.status_prev3_h); + status_prev4_h = itemView.findViewById(R.id.status_prev4_h); + status_prev1_play_h = itemView.findViewById(R.id.status_prev1_play_h); + status_prev2_play_h = itemView.findViewById(R.id.status_prev2_play_h); + status_prev3_play_h = itemView.findViewById(R.id.status_prev3_play_h); + status_prev4_play_h = itemView.findViewById(R.id.status_prev4_play_h); + status_container2 = itemView.findViewById(R.id.status_container2); + status_container3 = itemView.findViewById(R.id.status_container3); + status_prev4_container = itemView.findViewById(R.id.status_prev4_container); + status_reply = itemView.findViewById(R.id.status_reply); + status_privacy = itemView.findViewById(R.id.status_privacy); + + status_content_translated_container = itemView.findViewById(R.id.status_content_translated_container); + main_container = itemView.findViewById(R.id.main_container); + status_spoiler_container = itemView.findViewById(R.id.status_spoiler_container); + status_content_container = itemView.findViewById(R.id.status_content_container); + status_spoiler = itemView.findViewById(R.id.status_spoiler); + show_more_content = itemView.findViewById(R.id.show_more_content); + status_spoiler_button = itemView.findViewById(R.id.status_spoiler_button); + yandex_translate = itemView.findViewById(R.id.yandex_translate); + new_element = itemView.findViewById(R.id.new_element); + status_action_container = itemView.findViewById(R.id.status_action_container); + status_spoiler_mention_container = itemView.findViewById(R.id.status_spoiler_mention_container); + status_mention_spoiler = itemView.findViewById(R.id.status_mention_spoiler); + status_cardview = itemView.findViewById(R.id.status_cardview); + status_cardview_image = itemView.findViewById(R.id.status_cardview_image); + status_cardview_title = itemView.findViewById(R.id.status_cardview_title); + status_cardview_content = itemView.findViewById(R.id.status_cardview_content); + status_cardview_url = itemView.findViewById(R.id.status_cardview_url); + status_cardview_video = itemView.findViewById(R.id.status_cardview_video); + status_cardview_webview = itemView.findViewById(R.id.status_cardview_webview); + hide_preview = itemView.findViewById(R.id.hide_preview); + hide_preview_h = itemView.findViewById(R.id.hide_preview_h); + status_toot_app = itemView.findViewById(R.id.status_toot_app); + conversation_pp = itemView.findViewById(R.id.conversation_pp); + conversation_pp_1 = itemView.findViewById(R.id.conversation_pp_1); + conversation_pp_2 = itemView.findViewById(R.id.conversation_pp_2); + conversation_pp_3 = itemView.findViewById(R.id.conversation_pp_3); + conversation_pp_4 = itemView.findViewById(R.id.conversation_pp_4); + left_buttons = itemView.findViewById(R.id.left_buttons); + status_show_more_content = itemView.findViewById(R.id.status_show_more_content); + spark_button_fav = itemView.findViewById(R.id.spark_button_fav); + spark_button_reblog = itemView.findViewById(R.id.spark_button_reblog); + horizontal_second_image = itemView.findViewById(R.id.horizontal_second_image); + + status_peertube_container = itemView.findViewById(R.id.status_peertube_container); + status_peertube_reply = itemView.findViewById(R.id.status_peertube_reply); + status_peertube_delete = itemView.findViewById(R.id.status_peertube_delete); + fedilab_features = itemView.findViewById(R.id.fedilab_features); + fedilab_features_panel = itemView.findViewById(R.id.fedilab_features_panel); + quick_reply_container = itemView.findViewById(R.id.quick_reply_container); + custom_feature_translate = itemView.findViewById(R.id.custom_feature_translate); + custom_feature_bookmark = itemView.findViewById(R.id.custom_feature_bookmark); + custom_feature_timed_mute = itemView.findViewById(R.id.custom_feature_timed_mute); + custom_feature_schedule = itemView.findViewById(R.id.custom_feature_schedule); + custom_feature_mention = itemView.findViewById(R.id.custom_feature_mention); + custom_feature_cache = itemView.findViewById(R.id.custom_feature_cache); + poll_container = itemView.findViewById(R.id.poll_container); + single_choice = itemView.findViewById(R.id.single_choice); + multiple_choice = itemView.findViewById(R.id.multiple_choice); + rated = itemView.findViewById(R.id.rated); + radio_group = itemView.findViewById(R.id.radio_group); + number_votes = itemView.findViewById(R.id.number_votes); + remaining_time = itemView.findViewById(R.id.remaining_time); + submit_vote = itemView.findViewById(R.id.submit_vote); + refresh_poll = itemView.findViewById(R.id.refresh_poll); + cached_status = itemView.findViewById(R.id.cached_status); + status_account_bot = itemView.findViewById(R.id.status_account_bot); + + + quick_reply_text = itemView.findViewById(R.id.quick_reply_text); + quick_reply_switch_to_full = itemView.findViewById(R.id.quick_reply_switch_to_full); + toot_space_left = itemView.findViewById(R.id.toot_space_left); + quick_reply_emoji = itemView.findViewById(R.id.quick_reply_emoji); + quick_reply_button = itemView.findViewById(R.id.quick_reply_button); + quick_reply_privacy = itemView.findViewById(R.id.quick_reply_privacy); + + warning_message = itemView.findViewById(R.id.warning_message); + + status_reply_indicator_bottom = itemView.findViewById(R.id.status_reply_indicator_bottom); + status_reply_indicator_top = itemView.findViewById(R.id.status_reply_indicator_top); + status_reply_indicator_diag_top = itemView.findViewById(R.id.status_reply_indicator_diag_top); + status_reply_indicator_diag_bottom = itemView.findViewById(R.id.status_reply_indicator_diag_bottom); + reply_indicator_dot = itemView.findViewById(R.id.reply_indicator_dot); + Context context = itemView.getContext(); + final SharedPreferences sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, MODE_PRIVATE); + int theme = sharedpreferences.getInt(Helper.SET_THEME, Helper.THEME_DARK); + main_card_container = itemView.findViewById(R.id.main_card_container); + main_linear_container = itemView.findViewById(R.id.main_linear_container); + translation_border_view = itemView.findViewById(R.id.translation_border_view); + translation_label = itemView.findViewById(R.id.translation_label); + } + + public View getView() { + return itemView; + } + + void updateAnimatedEmoji() { + if (type != RetrieveFeedsAsyncTask.Type.CONVERSATION) { + status_account_displayname.invalidate(); + } + status_content.invalidate(); + } + + + private void startUpdateTimer() { + + final SharedPreferences sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, MODE_PRIVATE); + boolean disableAnimatedEmoji = sharedpreferences.getBoolean(Helper.SET_DISABLE_ANIMATED_EMOJI, false); + if (!disableAnimatedEmoji) { + if (BaseMainActivity.timer == null) { + BaseMainActivity.timer = new Timer(); + } + BaseMainActivity.timer.schedule(new TimerTask() { + @Override + public void run() { + mHandler.post(updateAnimatedEmoji); + } + }, 0, 130); + } + } + + } + } \ No newline at end of file diff --git a/app/src/main/java/app/fedilab/android/drawers/StatusReportAdapter.java b/app/src/main/java/app/fedilab/android/drawers/StatusReportAdapter.java index 5cb54b60d..422f375f6 100644 --- a/app/src/main/java/app/fedilab/android/drawers/StatusReportAdapter.java +++ b/app/src/main/java/app/fedilab/android/drawers/StatusReportAdapter.java @@ -69,6 +69,17 @@ public class StatusReportAdapter extends RecyclerView.Adapter implements Filterabl private List tags, tempTags, suggestions; private LayoutInflater layoutInflater; - - public TagsSearchAdapter(Context context, List tags) { - super(context, android.R.layout.simple_list_item_1, tags); - this.tags = tags; - this.tempTags = new ArrayList<>(tags); - this.suggestions = new ArrayList<>(tags); - layoutInflater = LayoutInflater.from(context); - } - - @Override - public int getCount() { - return tags.size(); - } - - @Override - public String getItem(int position) { - return tags.get(position); - } - - @Override - public long getItemId(int position) { - return position; - } - - - @NonNull - @Override - public View getView(final int position, View convertView, @NonNull ViewGroup parent) { - - final String tag = tags.get(position); - final ViewHolder holder; - if (convertView == null) { - convertView = layoutInflater.inflate(R.layout.drawer_tag_search, parent, false); - holder = new ViewHolder(); - holder.tag_name = convertView.findViewById(R.id.tag_name); - convertView.setTag(holder); - } else { - holder = (ViewHolder) convertView.getTag(); - } - holder.tag_name.setText(String.format("#%s", tag)); - - return convertView; - } - - @NonNull - @Override - public Filter getFilter() { - return searchFilter; - } - private Filter searchFilter = new Filter() { @Override public CharSequence convertResultToString(Object resultValue) { @@ -126,6 +75,53 @@ public class TagsSearchAdapter extends ArrayAdapter implements Filterabl } }; + public TagsSearchAdapter(Context context, List tags) { + super(context, android.R.layout.simple_list_item_1, tags); + this.tags = tags; + this.tempTags = new ArrayList<>(tags); + this.suggestions = new ArrayList<>(tags); + layoutInflater = LayoutInflater.from(context); + } + + @Override + public int getCount() { + return tags.size(); + } + + @Override + public String getItem(int position) { + return tags.get(position); + } + + @Override + public long getItemId(int position) { + return position; + } + + @NonNull + @Override + public View getView(final int position, View convertView, @NonNull ViewGroup parent) { + + final String tag = tags.get(position); + final ViewHolder holder; + if (convertView == null) { + convertView = layoutInflater.inflate(R.layout.drawer_tag_search, parent, false); + holder = new ViewHolder(); + holder.tag_name = convertView.findViewById(R.id.tag_name); + convertView.setTag(holder); + } else { + holder = (ViewHolder) convertView.getTag(); + } + holder.tag_name.setText(String.format("#%s", tag)); + + return convertView; + } + + @NonNull + @Override + public Filter getFilter() { + return searchFilter; + } private class ViewHolder { TextView tag_name; diff --git a/app/src/main/java/app/fedilab/android/drawers/WhoToFollowAccountsAdapter.java b/app/src/main/java/app/fedilab/android/drawers/WhoToFollowAccountsAdapter.java index 623ab121f..a204a8f11 100644 --- a/app/src/main/java/app/fedilab/android/drawers/WhoToFollowAccountsAdapter.java +++ b/app/src/main/java/app/fedilab/android/drawers/WhoToFollowAccountsAdapter.java @@ -16,9 +16,6 @@ package app.fedilab.android.drawers; import android.content.Context; - -import com.google.android.material.floatingactionbutton.FloatingActionButton; - import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -26,12 +23,14 @@ import android.widget.BaseAdapter; import android.widget.CheckBox; import android.widget.TextView; +import com.google.android.material.floatingactionbutton.FloatingActionButton; + import java.util.List; +import app.fedilab.android.R; import app.fedilab.android.client.Entities.Account; import app.fedilab.android.client.Entities.TrunkAccount; import app.fedilab.android.helper.CrossActions; -import app.fedilab.android.R; /** diff --git a/app/src/main/java/app/fedilab/android/drawers/WhoToFollowAdapter.java b/app/src/main/java/app/fedilab/android/drawers/WhoToFollowAdapter.java index deaaa3e45..e08526523 100644 --- a/app/src/main/java/app/fedilab/android/drawers/WhoToFollowAdapter.java +++ b/app/src/main/java/app/fedilab/android/drawers/WhoToFollowAdapter.java @@ -19,17 +19,20 @@ import android.content.Context; import android.content.Intent; import android.graphics.drawable.Drawable; import android.os.Bundle; -import androidx.core.content.ContextCompat; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.LinearLayout; import android.widget.TextView; + +import androidx.core.content.ContextCompat; + import java.util.List; -import app.fedilab.android.helper.Helper; + import app.fedilab.android.R; import app.fedilab.android.activities.WhoToFollowActivity; +import app.fedilab.android.helper.Helper; /** diff --git a/app/src/main/java/app/fedilab/android/filelister/FileListerAdapter.java b/app/src/main/java/app/fedilab/android/filelister/FileListerAdapter.java index 44e40d085..30cdfd13f 100644 --- a/app/src/main/java/app/fedilab/android/filelister/FileListerAdapter.java +++ b/app/src/main/java/app/fedilab/android/filelister/FileListerAdapter.java @@ -12,7 +12,6 @@ import android.widget.ImageView; import android.widget.TextView; import androidx.appcompat.app.AlertDialog; -import androidx.appcompat.widget.AppCompatEditText; import androidx.recyclerview.widget.RecyclerView; import org.jetbrains.annotations.NotNull; @@ -63,19 +62,44 @@ class FileListerAdapter extends RecyclerView.Adapter list = CyaneaTheme.Companion.from(Objects.requireNonNull(getActivity()).getAssets(), "themes/cyanea_themes.json"); - if( getActivity() != null && theme != null) { + if (getActivity() != null && theme != null) { SharedPreferences sharedpreferences = getActivity().getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE); SharedPreferences.Editor editor = sharedpreferences.edit(); int i = 0; - if( theme.compareTo("2") == 0 ) { + if (theme.compareTo("2") == 0) { editor.putInt(Helper.SET_THEME, Helper.THEME_LIGHT); - }else if( theme.compareTo("1") == 0 ) { + } else if (theme.compareTo("1") == 0) { editor.putInt(Helper.SET_THEME, Helper.THEME_DARK); i = 1; - }else if( theme.compareTo("3") == 0 ) { + } else if (theme.compareTo("3") == 0) { editor.putInt(Helper.SET_THEME, Helper.THEME_BLACK); i = 2; } @@ -158,12 +157,12 @@ public class ColorSettingsFragment extends PreferenceFragmentCompat implements Toasty.error(getActivity(), getString(R.string.theme_file_error), Toast.LENGTH_LONG).show(); return; } - if( data.getData() != null) { + if (data.getData() != null) { BufferedReader br = null; try { - InputStream inputStream = getActivity().getContentResolver().openInputStream(data.getData() ); + InputStream inputStream = getActivity().getContentResolver().openInputStream(data.getData()); assert inputStream != null; - br = new BufferedReader(new InputStreamReader(inputStream, "UTF-8")); + br = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8)); String sCurrentLine; int i = 0; SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getActivity()); @@ -171,19 +170,19 @@ public class ColorSettingsFragment extends PreferenceFragmentCompat implements editor.putBoolean("use_custom_theme", true); while ((sCurrentLine = br.readLine()) != null) { - if( i > 0 ){ + if (i > 0) { String[] line = sCurrentLine.split(","); - if( line.length > 1 ) { + if (line.length > 1) { String key = line[0]; String value = line[1]; - if( key.compareTo("base_theme") == 0){ + if (key.compareTo("base_theme") == 0) { SharedPreferences sharedpreferences = getActivity().getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE); SharedPreferences.Editor appEditor = sharedpreferences.edit(); appEditor.putInt(Helper.SET_THEME, Integer.parseInt(value)); appEditor.commit(); - }else if( key.compareTo("pref_color_navigation_bar") == 0 || key.compareTo("pref_color_status_bar") == 0){ + } else if (key.compareTo("pref_color_navigation_bar") == 0 || key.compareTo("pref_color_status_bar") == 0) { editor.putBoolean(key, Boolean.valueOf(value)); - }else{ + } else { editor.putInt(key, Integer.valueOf(value)); } } @@ -214,13 +213,13 @@ public class ColorSettingsFragment extends PreferenceFragmentCompat implements e.printStackTrace(); } finally { try { - if (br != null)br.close(); + if (br != null) br.close(); } catch (IOException ex) { ex.printStackTrace(); } } - }else{ + } else { Toasty.error(getActivity(), getString(R.string.theme_file_error), Toast.LENGTH_LONG).show(); } @@ -228,20 +227,20 @@ public class ColorSettingsFragment extends PreferenceFragmentCompat implements } - private void restart(){ + private void restart() { Intent mStartActivity = new Intent(getActivity(), MainActivity.class); int mPendingIntentId = 123456; - PendingIntent mPendingIntent = PendingIntent.getActivity(getActivity(), mPendingIntentId, mStartActivity, PendingIntent.FLAG_CANCEL_CURRENT); - AlarmManager mgr = (AlarmManager)getActivity().getSystemService(Context.ALARM_SERVICE); + PendingIntent mPendingIntent = PendingIntent.getActivity(getActivity(), mPendingIntentId, mStartActivity, PendingIntent.FLAG_CANCEL_CURRENT); + AlarmManager mgr = (AlarmManager) getActivity().getSystemService(Context.ALARM_SERVICE); assert mgr != null; mgr.set(AlarmManager.RTC, System.currentTimeMillis() + 100, mPendingIntent); System.exit(0); - if( getActivity() != null) { + if (getActivity() != null) { getActivity().finish(); } } - private void createPref(){ + private void createPref() { getPreferenceScreen().removeAll(); addPreferencesFromResource(R.xml.fragment_settings_color); PreferenceScreen preferenceScreen = getPreferenceScreen(); @@ -262,7 +261,7 @@ public class ColorSettingsFragment extends PreferenceFragmentCompat implements Preference pref_import = findPreference("pref_import"); Preference pref_export = findPreference("pref_export"); Preference reset_pref = findPreference("reset_pref"); - if( !sharedpreferences.getBoolean("use_custom_theme", false)){ + if (!sharedpreferences.getBoolean("use_custom_theme", false)) { preferenceScreen.removePreference(theme_link_color); preferenceScreen.removePreference(theme_boost_header_color); preferenceScreen.removePreference(theme_statuses_color); @@ -276,7 +275,7 @@ public class ColorSettingsFragment extends PreferenceFragmentCompat implements preferenceScreen.removePreference(reset_pref); preferenceScreen.removePreference(pref_export); - }else{ + } else { preferenceScreen.removePreference(pref_import); } List array = Arrays.asList(getResources().getStringArray(R.array.settings_theme)); @@ -358,7 +357,7 @@ public class ColorSettingsFragment extends PreferenceFragmentCompat implements }); } - private void reset(){ + private void reset() { SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getActivity()); SharedPreferences.Editor editor = prefs.edit(); editor.remove("theme_boost_header_color"); @@ -376,14 +375,13 @@ public class ColorSettingsFragment extends PreferenceFragmentCompat implements } - private void exportColors() { SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getActivity()); try { String fileName = "Fedilab_color_export_" + Helper.dateFileToString(getActivity(), new Date()) + ".csv"; String filePath = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).getAbsolutePath(); String fullPath = filePath + "/" + fileName; - PrintWriter pw = new PrintWriter(new OutputStreamWriter(new FileOutputStream(new File(fullPath)), "UTF-8")); + PrintWriter pw = new PrintWriter(new OutputStreamWriter(new FileOutputStream(new File(fullPath)), StandardCharsets.UTF_8)); StringBuilder builder = new StringBuilder(); builder.append("type").append(','); builder.append("value").append(','); diff --git a/app/src/main/java/app/fedilab/android/fragments/ContentSettingsFragment.java b/app/src/main/java/app/fedilab/android/fragments/ContentSettingsFragment.java index 9f57dbdf1..a2ff09e6e 100644 --- a/app/src/main/java/app/fedilab/android/fragments/ContentSettingsFragment.java +++ b/app/src/main/java/app/fedilab/android/fragments/ContentSettingsFragment.java @@ -61,7 +61,9 @@ import androidx.appcompat.app.AlertDialog; import androidx.appcompat.widget.SwitchCompat; import androidx.fragment.app.Fragment; import androidx.localbroadcastmanager.content.LocalBroadcastManager; + import com.google.common.collect.ImmutableSet; + import org.jetbrains.annotations.NotNull; import java.io.File; @@ -102,7 +104,6 @@ import app.fedilab.android.sqlite.Sqlite; import es.dmoral.toasty.Toasty; import mabbas007.tagsedittext.TagsEditText; - import static android.app.Activity.RESULT_OK; import static android.content.Context.MODE_PRIVATE; import static app.fedilab.android.activities.BaseMainActivity.iconLauncher.ATOM; @@ -122,10 +123,144 @@ import static app.fedilab.android.fragments.ContentSettingsFragment.type.TIMELIN public class ContentSettingsFragment extends Fragment implements OnRetrieveRemoteAccountInterface, OnRetrieveRelationshipInterface { + private static final int ACTIVITY_CHOOSE_FILE = 411; + private static final int ACTIVITY_CHOOSE_SOUND = 412; private type type; private Context context; private AsyncTask asyncTask; - private int countTrans, countLanguage, notificationCount, ledCount, videoSpinnerCount, liveNotificationCount; + private int countTrans, countLanguage, notificationCount, ledCount, videoSpinnerCount, liveNotificationCount; + private List translators = new ArrayList<>(); + private AccountSearchDevAdapter translatorManager; + private TextView set_folder; + private EditText your_api_key; + private int style; + + public static ContentSettingsFragment newInstance(int resId) { + ContentSettingsFragment contentFragment = new ContentSettingsFragment(); + Bundle bundle = new Bundle(); + bundle.putInt(Integer.class.getName(), resId); + contentFragment.setArguments(bundle); + return contentFragment; + } + + //From: https://gist.github.com/asifmujteba/d89ba9074bc941de1eaa#file-asfurihelper + @TargetApi(Build.VERSION_CODES.KITKAT) + public static String getPath(final Context context, final Uri uri) { + final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT; + // DocumentProvider + if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) { + // ExternalStorageProvider + if (isExternalStorageDocument(uri)) { + final String docId = DocumentsContract.getDocumentId(uri); + final String[] split = docId.split(":"); + final String type = split[0]; + + if ("primary".equalsIgnoreCase(type)) { + return Environment.getExternalStorageDirectory() + "/" + split[1]; + } + } + // DownloadsProvider + else if (isDownloadsDocument(uri)) { + + final String id = DocumentsContract.getDocumentId(uri); + final Uri contentUri = ContentUris.withAppendedId( + Uri.parse("content://downloads/public_downloads"), Long.valueOf(id)); + + return getDataColumn(context, contentUri, null, null); + } + // MediaProvider + else if (isMediaDocument(uri)) { + final String docId = DocumentsContract.getDocumentId(uri); + final String[] split = docId.split(":"); + final String type = split[0]; + + Uri contentUri = null; + if ("image".equals(type)) { + contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI; + } else if ("video".equals(type)) { + contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI; + } else if ("audio".equals(type)) { + contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; + } + + final String selection = "_id=?"; + final String[] selectionArgs = new String[]{ + split[1] + }; + return getDataColumn(context, contentUri, selection, selectionArgs); + } + } + // MediaStore (and general) + else if ("content".equalsIgnoreCase(uri.getScheme())) { + + // Return the remote address + if (isGooglePhotosUri(uri)) + return uri.getLastPathSegment(); + + return getDataColumn(context, uri, null, null); + } + // File + else if ("file".equalsIgnoreCase(uri.getScheme())) { + return uri.getPath(); + } + + return null; + } + + public static String getDataColumn(Context context, Uri uri, String selection, + String[] selectionArgs) { + + Cursor cursor = null; + final String column = "_data"; + final String[] projection = { + column + }; + + try { + cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs, + null); + if (cursor != null && cursor.moveToFirst()) { + final int index = cursor.getColumnIndexOrThrow(column); + return cursor.getString(index); + } + } finally { + if (cursor != null) + cursor.close(); + } + return null; + } + + /** + * @param uri The Uri to check. + * @return Whether the Uri authority is ExternalStorageProvider. + */ + public static boolean isExternalStorageDocument(Uri uri) { + return "com.android.externalstorage.documents".equals(uri.getAuthority()); + } + + /** + * @param uri The Uri to check. + * @return Whether the Uri authority is DownloadsProvider. + */ + public static boolean isDownloadsDocument(Uri uri) { + return "com.android.providers.downloads.documents".equals(uri.getAuthority()); + } + + /** + * @param uri The Uri to check. + * @return Whether the Uri authority is MediaProvider. + */ + public static boolean isMediaDocument(Uri uri) { + return "com.android.providers.media.documents".equals(uri.getAuthority()); + } + + /** + * @param uri The Uri to check. + * @return Whether the Uri authority is Google Photos. + */ + public static boolean isGooglePhotosUri(Uri uri) { + return "com.google.android.apps.photos.content".equals(uri.getAuthority()); + } @Override public void onRetrieveRemoteAccount(Results results) { @@ -163,33 +298,6 @@ public class ContentSettingsFragment extends Fragment implements OnRetrieveRemot } } - public enum type { - CLOSE, - TIMELINES, - ADMIN, - NOTIFICATIONS, - INTERFACE, - COMPOSE, - LANGUAGE, - MENU, - COLORS - } - private List translators = new ArrayList<>(); - private AccountSearchDevAdapter translatorManager; - private static final int ACTIVITY_CHOOSE_FILE = 411; - private TextView set_folder; - private EditText your_api_key; - private static final int ACTIVITY_CHOOSE_SOUND = 412; - private int style; - - public static ContentSettingsFragment newInstance(int resId) { - ContentSettingsFragment contentFragment = new ContentSettingsFragment(); - Bundle bundle = new Bundle(); - bundle.putInt(Integer.class.getName(), resId); - contentFragment.setArguments(bundle); - return contentFragment; - } - @Override public void onViewCreated(@NotNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); @@ -237,7 +345,6 @@ public class ContentSettingsFragment extends Fragment implements OnRetrieveRemot } } - @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -285,9 +392,9 @@ public class ContentSettingsFragment extends Fragment implements OnRetrieveRemot settings_interface.setVisibility(View.VISIBLE); } else if (type == COMPOSE) { settings_compose.setVisibility(View.VISIBLE); - } else if( type == MENU){ + } else if (type == MENU) { settings_hide_menu.setVisibility(View.VISIBLE); - }else if( type == LANGUAGE){ + } else if (type == LANGUAGE) { settings_translation.setVisibility(View.VISIBLE); } @@ -398,7 +505,7 @@ public class ContentSettingsFragment extends Fragment implements OnRetrieveRemot Spinner set_attachment_group = rootView.findViewById(R.id.set_attachment_group); String[] attachment_labels = {context.getString(R.string.set_attachment_always), context.getString(R.string.set_attachment_wifi), context.getString(R.string.set_attachment_ask)}; ArrayAdapter adapterAttachment = new ArrayAdapter<>(context, - android.R.layout.simple_spinner_dropdown_item,attachment_labels ); + android.R.layout.simple_spinner_dropdown_item, attachment_labels); set_attachment_group.setAdapter(adapterAttachment); int attachmentAction = sharedpreferences.getInt(Helper.SET_ATTACHMENT_ACTION, Helper.ATTACHMENT_ALWAYS); switch (attachmentAction) { @@ -440,8 +547,6 @@ public class ContentSettingsFragment extends Fragment implements OnRetrieveRemot }); - - int videoMode = sharedpreferences.getInt(Helper.SET_VIDEO_MODE, Helper.VIDEO_MODE_DIRECT); @@ -456,11 +561,11 @@ public class ContentSettingsFragment extends Fragment implements OnRetrieveRemot if (videoMode == Helper.VIDEO_MODE_DIRECT) positionVideoMode = 1; videoSpinnerCount = 0; - video_mode_spinner.setSelection(positionVideoMode ); + video_mode_spinner.setSelection(positionVideoMode); video_mode_spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView parent, View view, int position, long id) { - if( videoSpinnerCount > 0 ) { + if (videoSpinnerCount > 0) { SharedPreferences.Editor editor = sharedpreferences.edit(); switch (position) { /*case 0: @@ -476,7 +581,7 @@ public class ContentSettingsFragment extends Fragment implements OnRetrieveRemot editor.apply(); break; } - }else{ + } else { videoSpinnerCount++; } } @@ -800,9 +905,9 @@ public class ContentSettingsFragment extends Fragment implements OnRetrieveRemot @Override public void afterTextChanged(Editable s) { SharedPreferences.Editor editor = sharedpreferences.edit(); - if( s.toString().trim().length() > 0) { + if (s.toString().trim().length() > 0) { editor.putString(Helper.SET_INVIDIOUS_HOST, s.toString().toLowerCase().trim()); - }else{ + } else { editor.putString(Helper.SET_INVIDIOUS_HOST, null); } editor.apply(); @@ -852,9 +957,9 @@ public class ContentSettingsFragment extends Fragment implements OnRetrieveRemot @Override public void afterTextChanged(Editable s) { SharedPreferences.Editor editor = sharedpreferences.edit(); - if( s.toString().trim().length() > 0) { + if (s.toString().trim().length() > 0) { editor.putString(Helper.SET_NITTER_HOST, s.toString().toLowerCase().trim()); - }else{ + } else { editor.putString(Helper.SET_NITTER_HOST, null); } editor.apply(); @@ -1034,7 +1139,7 @@ public class ContentSettingsFragment extends Fragment implements OnRetrieveRemot Spinner set_mode = rootView.findViewById(R.id.set_mode); String[] mode_labels = {context.getString(R.string.set_normal), context.getString(R.string.set_compact), context.getString(R.string.set_console)}; ArrayAdapter adapterMode = new ArrayAdapter<>(context, - android.R.layout.simple_spinner_dropdown_item,mode_labels ); + android.R.layout.simple_spinner_dropdown_item, mode_labels); set_mode.setAdapter(adapterMode); boolean compact_mode = sharedpreferences.getBoolean(Helper.SET_COMPACT_MODE, false); boolean console_mode = sharedpreferences.getBoolean(Helper.SET_CONSOLE_MODE, false); @@ -1079,7 +1184,6 @@ public class ContentSettingsFragment extends Fragment implements OnRetrieveRemot }); - boolean share_details = sharedpreferences.getBoolean(Helper.SET_SHARE_DETAILS, true); final SwitchCompat set_share_details = rootView.findViewById(R.id.set_share_details); set_share_details.setChecked(share_details); @@ -1219,21 +1323,19 @@ public class ContentSettingsFragment extends Fragment implements OnRetrieveRemot }); - - //Live notification mode final Spinner set_live_type = rootView.findViewById(R.id.set_live_type); String[] labels = {context.getString(R.string.live_notif), context.getString(R.string.live_delayed), context.getString(R.string.no_live_notif)}; ArrayAdapter adapterLive = new ArrayAdapter<>(context, - android.R.layout.simple_spinner_dropdown_item,labels ); + android.R.layout.simple_spinner_dropdown_item, labels); - LinearLayout live_notif_per_account = rootView.findViewById(R.id.live_notif_per_account); + LinearLayout live_notif_per_account = rootView.findViewById(R.id.live_notif_per_account); set_live_type.setAdapter(adapterLive); - if( Helper.liveNotifType(context) == Helper.NOTIF_NONE){ + if (Helper.liveNotifType(context) == Helper.NOTIF_NONE) { live_notif_per_account.setVisibility(View.GONE); } TextView set_live_type_indication = rootView.findViewById(R.id.set_live_type_indication); - switch (Helper.liveNotifType(context)){ + switch (Helper.liveNotifType(context)) { case Helper.NOTIF_LIVE: set_live_type_indication.setText(R.string.live_notif_indication); break; @@ -1249,7 +1351,7 @@ public class ContentSettingsFragment extends Fragment implements OnRetrieveRemot set_live_type.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView parent, View view, int position, long id) { - if( liveNotificationCount > 0 ) { + if (liveNotificationCount > 0) { SharedPreferences.Editor editor = sharedpreferences.edit(); switch (position) { case Helper.NOTIF_LIVE: @@ -1290,7 +1392,7 @@ public class ContentSettingsFragment extends Fragment implements OnRetrieveRemot set_live_type_indication.setText(R.string.no_live_indication); break; } - }else{ + } else { liveNotificationCount++; } } @@ -1302,7 +1404,6 @@ public class ContentSettingsFragment extends Fragment implements OnRetrieveRemot }); - boolean capitalize = sharedpreferences.getBoolean(Helper.SET_CAPITALIZE, true); final SwitchCompat set_capitalize = rootView.findViewById(R.id.set_capitalize); set_capitalize.setChecked(capitalize); @@ -1445,7 +1546,6 @@ public class ContentSettingsFragment extends Fragment implements OnRetrieveRemot SeekBar toot_per_page = rootView.findViewById(R.id.set_toot_per_page); final TextView set_toot_per_page_count = rootView.findViewById(R.id.set_toot_per_page_count); - ; toot_per_page.setMax(20); int tootperpage = sharedpreferences.getInt(Helper.SET_TOOT_PER_PAGE, Helper.TOOTS_PER_PAGE); toot_per_page.setProgress(tootperpage - Helper.TOOTS_PER_PAGE); @@ -1713,7 +1813,7 @@ public class ContentSettingsFragment extends Fragment implements OnRetrieveRemot translation_layout_spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView parent, View view, int position, long id) { - if( countTrans > 0) { + if (countTrans > 0) { SharedPreferences.Editor editor = sharedpreferences.edit(); switch (position) { case 0: @@ -1743,7 +1843,7 @@ public class ContentSettingsFragment extends Fragment implements OnRetrieveRemot Intent intent = new Intent(context, MainActivity.class); intent.putExtra(Helper.INTENT_ACTION, Helper.BACK_TO_SETTINGS); startActivity(intent); - }else{ + } else { countTrans++; } } @@ -1783,7 +1883,6 @@ public class ContentSettingsFragment extends Fragment implements OnRetrieveRemot }); - boolean notif_follow = sharedpreferences.getBoolean(Helper.SET_NOTIF_FOLLOW, true); boolean notif_add = sharedpreferences.getBoolean(Helper.SET_NOTIF_ADD, true); boolean notif_mention = sharedpreferences.getBoolean(Helper.SET_NOTIF_MENTION, true); @@ -1947,8 +2046,8 @@ public class ContentSettingsFragment extends Fragment implements OnRetrieveRemot @Override public void onTimeSet(TimePicker view, int hourOfDay, int minute) { SharedPreferences.Editor editor = sharedpreferences.edit(); - String hours = (String.valueOf(hourOfDay).length() == 1) ? "0" + String.valueOf(hourOfDay) : String.valueOf(hourOfDay); - String minutes = (String.valueOf(minute).length() == 1) ? "0" + String.valueOf(minute) : String.valueOf(minute); + String hours = (String.valueOf(hourOfDay).length() == 1) ? "0" + hourOfDay : String.valueOf(hourOfDay); + String minutes = (String.valueOf(minute).length() == 1) ? "0" + minute : String.valueOf(minute); String newDate = hours + ":" + minutes; if (Helper.compareDate(context, newDate, false)) { editor.putString(Helper.SET_TIME_FROM, newDate); @@ -1973,8 +2072,8 @@ public class ContentSettingsFragment extends Fragment implements OnRetrieveRemot @Override public void onTimeSet(TimePicker view, int hourOfDay, int minute) { SharedPreferences.Editor editor = sharedpreferences.edit(); - String hours = (String.valueOf(hourOfDay).length() == 1) ? "0" + String.valueOf(hourOfDay) : String.valueOf(hourOfDay); - String minutes = (String.valueOf(minute).length() == 1) ? "0" + String.valueOf(minute) : String.valueOf(minute); + String hours = (String.valueOf(hourOfDay).length() == 1) ? "0" + hourOfDay : String.valueOf(hourOfDay); + String minutes = (String.valueOf(minute).length() == 1) ? "0" + minute : String.valueOf(minute); String newDate = hours + ":" + minutes; if (Helper.compareDate(context, newDate, true)) { editor.putString(Helper.SET_TIME_TO, newDate); @@ -2012,7 +2111,7 @@ public class ContentSettingsFragment extends Fragment implements OnRetrieveRemot action_notification.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView parent, View view, int position, long id) { - if( notificationCount > 0) { + if (notificationCount > 0) { SharedPreferences.Editor editor = sharedpreferences.edit(); switch (position) { @@ -2025,7 +2124,7 @@ public class ContentSettingsFragment extends Fragment implements OnRetrieveRemot editor.apply(); break; } - }else{ + } else { notificationCount++; } } @@ -2137,11 +2236,11 @@ public class ContentSettingsFragment extends Fragment implements OnRetrieveRemot led_colour_spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView parent, View view, int position, long id) { - if( ledCount > 0 ) { + if (ledCount > 0) { SharedPreferences.Editor editor = sharedpreferences.edit(); editor.putInt(Helper.SET_LED_COLOUR, position); editor.apply(); - }else{ + } else { ledCount++; } @@ -2217,11 +2316,6 @@ public class ContentSettingsFragment extends Fragment implements OnRetrieveRemot }); - - - - - Button about_translation = rootView.findViewById(R.id.about_translation); @@ -2239,7 +2333,7 @@ public class ContentSettingsFragment extends Fragment implements OnRetrieveRemot translatorManager = new AccountSearchDevAdapter(translators); lv_translator_manager.setAdapter(translatorManager); - if( type == LANGUAGE) { + if (type == LANGUAGE) { asyncTask = new RetrieveRemoteDataAsyncTask(context, "ButterflyOfFire", "mstdn.fr", ContentSettingsFragment.this).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); } @@ -2257,7 +2351,7 @@ public class ContentSettingsFragment extends Fragment implements OnRetrieveRemot set_change_locale.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView parent, View view, int position, long id) { - if( countLanguage > 0 ) { + if (countLanguage > 0) { SharedPreferences.Editor editor = sharedpreferences.edit(); switch (position) { case 0: @@ -2353,7 +2447,7 @@ public class ContentSettingsFragment extends Fragment implements OnRetrieveRemot Intent mainIntent = Intent.makeRestartActivityTask(componentName); startActivity(mainIntent); Runtime.getRuntime().exit(0); - }else{ + } else { countLanguage++; } } @@ -2382,7 +2476,7 @@ public class ContentSettingsFragment extends Fragment implements OnRetrieveRemot icon_selector.findViewById(R.id.icon_bubbles).setOnClickListener(v1 -> { hideAllIcons(context); - setIcon(context,"Bubbles"); + setIcon(context, "Bubbles"); SharedPreferences.Editor editor2 = sharedpreferences.edit(); editor2 = sharedpreferences.edit(); editor2.putString(Helper.LOGO_LAUNCHER, "bubbles"); @@ -2393,7 +2487,7 @@ public class ContentSettingsFragment extends Fragment implements OnRetrieveRemot icon_selector.findViewById(R.id.icon_fediverse).setOnClickListener(v1 -> { hideAllIcons(context); - setIcon(context,"Fediverse"); + setIcon(context, "Fediverse"); SharedPreferences.Editor editor2 = sharedpreferences.edit(); editor2 = sharedpreferences.edit(); editor2.putString(Helper.LOGO_LAUNCHER, "fediverse"); @@ -2404,7 +2498,7 @@ public class ContentSettingsFragment extends Fragment implements OnRetrieveRemot icon_selector.findViewById(R.id.icon_hero).setOnClickListener(v1 -> { hideAllIcons(context); - setIcon(context,"Hero"); + setIcon(context, "Hero"); SharedPreferences.Editor editor2 = sharedpreferences.edit(); editor2 = sharedpreferences.edit(); editor2.putString(Helper.LOGO_LAUNCHER, "hero"); @@ -2415,7 +2509,7 @@ public class ContentSettingsFragment extends Fragment implements OnRetrieveRemot icon_selector.findViewById(R.id.icon_atom).setOnClickListener(v1 -> { hideAllIcons(context); - setIcon(context,"Atom"); + setIcon(context, "Atom"); SharedPreferences.Editor editor2 = sharedpreferences.edit(); editor2.putString(Helper.LOGO_LAUNCHER, "atom"); editor2.apply(); @@ -2425,7 +2519,7 @@ public class ContentSettingsFragment extends Fragment implements OnRetrieveRemot icon_selector.findViewById(R.id.icon_braincrash).setOnClickListener(v1 -> { hideAllIcons(context); - setIcon(context,"BrainCrash"); + setIcon(context, "BrainCrash"); SharedPreferences.Editor editor2 = sharedpreferences.edit(); editor2.putString(Helper.LOGO_LAUNCHER, "braincrash"); editor2.apply(); @@ -2435,7 +2529,7 @@ public class ContentSettingsFragment extends Fragment implements OnRetrieveRemot icon_selector.findViewById(R.id.icon_mastalab).setOnClickListener(v1 -> { hideAllIcons(context); - setIcon(context,"Mastalab"); + setIcon(context, "Mastalab"); SharedPreferences.Editor editor2 = sharedpreferences.edit(); editor2.putString(Helper.LOGO_LAUNCHER, "mastalab"); editor2.apply(); @@ -2450,34 +2544,34 @@ public class ContentSettingsFragment extends Fragment implements OnRetrieveRemot private void hideAllIcons(Context context) { context.getPackageManager().setComponentEnabledSetting( - new ComponentName(context.getPackageName(),"app.fedilab.android.activities.MainActivity.Bubbles"), - PackageManager.COMPONENT_ENABLED_STATE_DISABLED,PackageManager.DONT_KILL_APP); + new ComponentName(context.getPackageName(), "app.fedilab.android.activities.MainActivity.Bubbles"), + PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP); context.getPackageManager().setComponentEnabledSetting( - new ComponentName(context.getPackageName(),"app.fedilab.android.activities.MainActivity.Fediverse"), - PackageManager.COMPONENT_ENABLED_STATE_DISABLED,PackageManager.DONT_KILL_APP); + new ComponentName(context.getPackageName(), "app.fedilab.android.activities.MainActivity.Fediverse"), + PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP); context.getPackageManager().setComponentEnabledSetting( - new ComponentName(context.getPackageName(),"app.fedilab.android.activities.MainActivity.Hero"), - PackageManager.COMPONENT_ENABLED_STATE_DISABLED,PackageManager.DONT_KILL_APP); + new ComponentName(context.getPackageName(), "app.fedilab.android.activities.MainActivity.Hero"), + PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP); context.getPackageManager().setComponentEnabledSetting( - new ComponentName(context.getPackageName(),"app.fedilab.android.activities.MainActivity.Atom"), - PackageManager.COMPONENT_ENABLED_STATE_DISABLED,PackageManager.DONT_KILL_APP); + new ComponentName(context.getPackageName(), "app.fedilab.android.activities.MainActivity.Atom"), + PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP); context.getPackageManager().setComponentEnabledSetting( - new ComponentName(context.getPackageName(),"app.fedilab.android.activities.MainActivity.BrainCrash"), - PackageManager.COMPONENT_ENABLED_STATE_DISABLED,PackageManager.DONT_KILL_APP); + new ComponentName(context.getPackageName(), "app.fedilab.android.activities.MainActivity.BrainCrash"), + PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP); context.getPackageManager().setComponentEnabledSetting( - new ComponentName(context.getPackageName(),"app.fedilab.android.activities.MainActivity.Mastalab"), - PackageManager.COMPONENT_ENABLED_STATE_DISABLED,PackageManager.DONT_KILL_APP); + new ComponentName(context.getPackageName(), "app.fedilab.android.activities.MainActivity.Mastalab"), + PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP); } private void setIcon(Context context, String iconName) { context.getPackageManager().setComponentEnabledSetting( - new ComponentName(context.getPackageName(),"app.fedilab.android.activities.MainActivity." + iconName), - PackageManager.COMPONENT_ENABLED_STATE_ENABLED,PackageManager.DONT_KILL_APP); + new ComponentName(context.getPackageName(), "app.fedilab.android.activities.MainActivity." + iconName), + PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP); } @Override @@ -2488,130 +2582,21 @@ public class ContentSettingsFragment extends Fragment implements OnRetrieveRemot public void onDestroy() { super.onDestroy(); - if( type == LANGUAGE) { + if (type == LANGUAGE) { if (asyncTask != null && asyncTask.getStatus() == AsyncTask.Status.RUNNING) asyncTask.cancel(true); } } - //From: https://gist.github.com/asifmujteba/d89ba9074bc941de1eaa#file-asfurihelper - @TargetApi(Build.VERSION_CODES.KITKAT) - public static String getPath(final Context context, final Uri uri) { - final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT; - // DocumentProvider - if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) { - // ExternalStorageProvider - if (isExternalStorageDocument(uri)) { - final String docId = DocumentsContract.getDocumentId(uri); - final String[] split = docId.split(":"); - final String type = split[0]; - - if ("primary".equalsIgnoreCase(type)) { - return Environment.getExternalStorageDirectory() + "/" + split[1]; - } - } - // DownloadsProvider - else if (isDownloadsDocument(uri)) { - - final String id = DocumentsContract.getDocumentId(uri); - final Uri contentUri = ContentUris.withAppendedId( - Uri.parse("content://downloads/public_downloads"), Long.valueOf(id)); - - return getDataColumn(context, contentUri, null, null); - } - // MediaProvider - else if (isMediaDocument(uri)) { - final String docId = DocumentsContract.getDocumentId(uri); - final String[] split = docId.split(":"); - final String type = split[0]; - - Uri contentUri = null; - if ("image".equals(type)) { - contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI; - } else if ("video".equals(type)) { - contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI; - } else if ("audio".equals(type)) { - contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; - } - - final String selection = "_id=?"; - final String[] selectionArgs = new String[]{ - split[1] - }; - return getDataColumn(context, contentUri, selection, selectionArgs); - } - } - // MediaStore (and general) - else if ("content".equalsIgnoreCase(uri.getScheme())) { - - // Return the remote address - if (isGooglePhotosUri(uri)) - return uri.getLastPathSegment(); - - return getDataColumn(context, uri, null, null); - } - // File - else if ("file".equalsIgnoreCase(uri.getScheme())) { - return uri.getPath(); - } - - return null; - } - - public static String getDataColumn(Context context, Uri uri, String selection, - String[] selectionArgs) { - - Cursor cursor = null; - final String column = "_data"; - final String[] projection = { - column - }; - - try { - cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs, - null); - if (cursor != null && cursor.moveToFirst()) { - final int index = cursor.getColumnIndexOrThrow(column); - return cursor.getString(index); - } - } finally { - if (cursor != null) - cursor.close(); - } - return null; - } - - - - /** - * @param uri The Uri to check. - * @return Whether the Uri authority is ExternalStorageProvider. - */ - public static boolean isExternalStorageDocument(Uri uri) { - return "com.android.externalstorage.documents".equals(uri.getAuthority()); - } - - /** - * @param uri The Uri to check. - * @return Whether the Uri authority is DownloadsProvider. - */ - public static boolean isDownloadsDocument(Uri uri) { - return "com.android.providers.downloads.documents".equals(uri.getAuthority()); - } - - /** - * @param uri The Uri to check. - * @return Whether the Uri authority is MediaProvider. - */ - public static boolean isMediaDocument(Uri uri) { - return "com.android.providers.media.documents".equals(uri.getAuthority()); - } - - /** - * @param uri The Uri to check. - * @return Whether the Uri authority is Google Photos. - */ - public static boolean isGooglePhotosUri(Uri uri) { - return "com.google.android.apps.photos.content".equals(uri.getAuthority()); + public enum type { + CLOSE, + TIMELINES, + ADMIN, + NOTIFICATIONS, + INTERFACE, + COMPOSE, + LANGUAGE, + MENU, + COLORS } } diff --git a/app/src/main/java/app/fedilab/android/fragments/DisplayAccountsFragment.java b/app/src/main/java/app/fedilab/android/fragments/DisplayAccountsFragment.java index 338c98808..7d57534cb 100644 --- a/app/src/main/java/app/fedilab/android/fragments/DisplayAccountsFragment.java +++ b/app/src/main/java/app/fedilab/android/fragments/DisplayAccountsFragment.java @@ -18,38 +18,36 @@ import android.content.Context; import android.content.SharedPreferences; import android.os.AsyncTask; import android.os.Bundle; - -import androidx.annotation.NonNull; -import androidx.fragment.app.Fragment; -import androidx.core.content.ContextCompat; -import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; -import androidx.recyclerview.widget.DividerItemDecoration; -import androidx.recyclerview.widget.LinearLayoutManager; -import androidx.recyclerview.widget.RecyclerView; - import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.RelativeLayout; import android.widget.Toast; +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.recyclerview.widget.DividerItemDecoration; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; +import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; + import java.util.ArrayList; import java.util.List; +import app.fedilab.android.R; +import app.fedilab.android.activities.MainActivity; import app.fedilab.android.activities.TootInfoActivity; +import app.fedilab.android.asynctasks.RetrieveAccountsAsyncTask; +import app.fedilab.android.asynctasks.RetrieveManyRelationshipsAsyncTask; +import app.fedilab.android.asynctasks.UpdateAccountInfoAsyncTask; import app.fedilab.android.client.APIResponse; import app.fedilab.android.client.Entities.Account; import app.fedilab.android.client.Entities.Relationship; import app.fedilab.android.drawers.AccountsListAdapter; import app.fedilab.android.helper.Helper; -import es.dmoral.toasty.Toasty; -import app.fedilab.android.R; -import app.fedilab.android.activities.MainActivity; -import app.fedilab.android.asynctasks.RetrieveAccountsAsyncTask; -import app.fedilab.android.asynctasks.RetrieveManyRelationshipsAsyncTask; -import app.fedilab.android.asynctasks.UpdateAccountInfoAsyncTask; import app.fedilab.android.interfaces.OnRetrieveAccountsInterface; import app.fedilab.android.interfaces.OnRetrieveManyRelationshipsInterface; +import es.dmoral.toasty.Toasty; /** @@ -193,10 +191,10 @@ public class DisplayAccountsFragment extends Fragment implements OnRetrieveAccou mainLoader.setVisibility(View.GONE); nextElementLoader.setVisibility(View.GONE); if (apiResponse.getError() != null) { - if(apiResponse.getError().getError().length() < 100) { + if (apiResponse.getError().getError().length() < 100) { Toasty.error(context, apiResponse.getError().getError(), Toast.LENGTH_LONG).show(); - }else{ - Toasty.error(context, getString(R.string.long_api_error,"\ud83d\ude05"), Toast.LENGTH_LONG).show(); + } else { + Toasty.error(context, getString(R.string.long_api_error, "\ud83d\ude05"), Toast.LENGTH_LONG).show(); } swipeRefreshLayout.setRefreshing(false); swiped = false; @@ -248,10 +246,10 @@ public class DisplayAccountsFragment extends Fragment implements OnRetrieveAccou @Override public void onRetrieveRelationship(APIResponse apiResponse) { if (apiResponse.getError() != null) { - if(apiResponse.getError().getError().length() < 100) { + if (apiResponse.getError().getError().length() < 100) { Toasty.error(context, apiResponse.getError().getError(), Toast.LENGTH_LONG).show(); - }else{ - Toasty.error(context, getString(R.string.long_api_error,"\ud83d\ude05"), Toast.LENGTH_LONG).show(); + } else { + Toasty.error(context, getString(R.string.long_api_error, "\ud83d\ude05"), Toast.LENGTH_LONG).show(); } return; } diff --git a/app/src/main/java/app/fedilab/android/fragments/DisplayAdminAccountsFragment.java b/app/src/main/java/app/fedilab/android/fragments/DisplayAdminAccountsFragment.java index 23d091901..b5e499c1a 100644 --- a/app/src/main/java/app/fedilab/android/fragments/DisplayAdminAccountsFragment.java +++ b/app/src/main/java/app/fedilab/android/fragments/DisplayAdminAccountsFragment.java @@ -15,7 +15,6 @@ package app.fedilab.android.fragments; * see . */ import android.content.Context; -import android.content.SharedPreferences; import android.os.AsyncTask; import android.os.Bundle; import android.view.LayoutInflater; @@ -25,7 +24,6 @@ import android.widget.RelativeLayout; import android.widget.Toast; import androidx.annotation.NonNull; -import androidx.core.content.ContextCompat; import androidx.fragment.app.Fragment; import androidx.recyclerview.widget.DividerItemDecoration; import androidx.recyclerview.widget.LinearLayoutManager; @@ -43,7 +41,6 @@ import app.fedilab.android.client.APIResponse; import app.fedilab.android.client.Entities.AccountAdmin; import app.fedilab.android.client.Entities.AdminAction; import app.fedilab.android.drawers.AccountsAdminListAdapter; -import app.fedilab.android.helper.Helper; import app.fedilab.android.interfaces.OnAdminActionInterface; import es.dmoral.toasty.Toasty; @@ -210,10 +207,10 @@ public class DisplayAdminAccountsFragment extends Fragment implements OnAdminAct mainLoader.setVisibility(View.GONE); nextElementLoader.setVisibility(View.GONE); if (apiResponse.getError() != null) { - if(apiResponse.getError().getError().length() < 100) { + if (apiResponse.getError().getError().length() < 100) { Toasty.error(context, apiResponse.getError().getError(), Toast.LENGTH_LONG).show(); - }else{ - Toasty.error(context, getString(R.string.long_api_error,"\ud83d\ude05"), Toast.LENGTH_LONG).show(); + } else { + Toasty.error(context, getString(R.string.long_api_error, "\ud83d\ude05"), Toast.LENGTH_LONG).show(); } swipeRefreshLayout.setRefreshing(false); swiped = false; diff --git a/app/src/main/java/app/fedilab/android/fragments/DisplayAdminReportsFragment.java b/app/src/main/java/app/fedilab/android/fragments/DisplayAdminReportsFragment.java index de52cfa0c..c08cb9cb7 100644 --- a/app/src/main/java/app/fedilab/android/fragments/DisplayAdminReportsFragment.java +++ b/app/src/main/java/app/fedilab/android/fragments/DisplayAdminReportsFragment.java @@ -18,19 +18,15 @@ import android.app.AlertDialog; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; -import android.content.SharedPreferences; import android.os.AsyncTask; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; -import android.widget.EditText; -import android.widget.LinearLayout; import android.widget.RelativeLayout; import android.widget.Toast; import androidx.annotation.NonNull; -import androidx.core.content.ContextCompat; import androidx.fragment.app.Fragment; import androidx.recyclerview.widget.DividerItemDecoration; import androidx.recyclerview.widget.LinearLayoutManager; @@ -42,8 +38,6 @@ import java.util.List; import app.fedilab.android.R; import app.fedilab.android.activities.LoginActivity; -import app.fedilab.android.activities.PeertubeActivity; -import app.fedilab.android.asynctasks.PostActionAsyncTask; import app.fedilab.android.asynctasks.PostAdminActionAsyncTask; import app.fedilab.android.asynctasks.RetrieveAccountsAsyncTask; import app.fedilab.android.client.API; @@ -51,7 +45,6 @@ import app.fedilab.android.client.APIResponse; import app.fedilab.android.client.Entities.AdminAction; import app.fedilab.android.client.Entities.Report; import app.fedilab.android.drawers.ReportsListAdapter; -import app.fedilab.android.helper.Helper; import app.fedilab.android.interfaces.OnAdminActionInterface; import es.dmoral.toasty.Toasty; @@ -217,10 +210,10 @@ public class DisplayAdminReportsFragment extends Fragment implements OnAdminActi }); builderInner.show(); } else { - if(apiResponse.getError().getError().length() < 100) { + if (apiResponse.getError().getError().length() < 100) { Toasty.error(context, apiResponse.getError().getError(), Toast.LENGTH_LONG).show(); - }else{ - Toasty.error(context, getString(R.string.long_api_error,"\ud83d\ude05"), Toast.LENGTH_LONG).show(); + } else { + Toasty.error(context, getString(R.string.long_api_error, "\ud83d\ude05"), Toast.LENGTH_LONG).show(); } } return; diff --git a/app/src/main/java/app/fedilab/android/fragments/DisplayBookmarksPixelfedFragment.java b/app/src/main/java/app/fedilab/android/fragments/DisplayBookmarksPixelfedFragment.java index cacd01631..fb82e6f58 100644 --- a/app/src/main/java/app/fedilab/android/fragments/DisplayBookmarksPixelfedFragment.java +++ b/app/src/main/java/app/fedilab/android/fragments/DisplayBookmarksPixelfedFragment.java @@ -44,7 +44,6 @@ import app.fedilab.android.asynctasks.RetrieveFeedsAsyncTask; import app.fedilab.android.client.APIResponse; import app.fedilab.android.client.Entities.Status; import app.fedilab.android.drawers.PixelfedListAdapter; -import app.fedilab.android.drawers.StatusListAdapter; import app.fedilab.android.helper.Helper; import app.fedilab.android.interfaces.OnRetrieveFeedsInterface; import app.fedilab.android.sqlite.Sqlite; @@ -110,7 +109,7 @@ public class DisplayBookmarksPixelfedFragment extends Fragment implements OnRetr statuses = apiResponse.getStatuses(); if (statuses != null && statuses.size() > 0) { LinearLayoutManager mLayoutManager = new LinearLayoutManager(context); - pixelfedListAdapter = new PixelfedListAdapter(RetrieveFeedsAsyncTask.Type.CACHE_BOOKMARKS, this.statuses); + pixelfedListAdapter = new PixelfedListAdapter(RetrieveFeedsAsyncTask.Type.CACHE_BOOKMARKS, this.statuses); lv_status.setAdapter(pixelfedListAdapter); lv_status.setLayoutManager(mLayoutManager); } else { diff --git a/app/src/main/java/app/fedilab/android/fragments/DisplayDraftsFragment.java b/app/src/main/java/app/fedilab/android/fragments/DisplayDraftsFragment.java index 883ddfb47..0101cdf0f 100644 --- a/app/src/main/java/app/fedilab/android/fragments/DisplayDraftsFragment.java +++ b/app/src/main/java/app/fedilab/android/fragments/DisplayDraftsFragment.java @@ -19,32 +19,28 @@ import android.content.DialogInterface; import android.content.SharedPreferences; import android.database.sqlite.SQLiteDatabase; import android.os.Bundle; - -import androidx.annotation.NonNull; - -import com.google.android.material.floatingactionbutton.FloatingActionButton; - -import androidx.fragment.app.Fragment; -import androidx.appcompat.app.AlertDialog; - import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ListView; import android.widget.RelativeLayout; +import androidx.annotation.NonNull; +import androidx.appcompat.app.AlertDialog; +import androidx.fragment.app.Fragment; + +import com.google.android.material.floatingactionbutton.FloatingActionButton; + import java.util.ArrayList; import java.util.List; +import app.fedilab.android.R; +import app.fedilab.android.activities.MainActivity; import app.fedilab.android.client.Entities.StoredStatus; import app.fedilab.android.drawers.DraftsListAdapter; import app.fedilab.android.helper.Helper; import app.fedilab.android.sqlite.Sqlite; import app.fedilab.android.sqlite.StatusStoredDAO; -import app.fedilab.android.activities.MainActivity; -import app.fedilab.android.R; - -import static app.fedilab.android.helper.Helper.changeDrawableColor; /** diff --git a/app/src/main/java/app/fedilab/android/fragments/DisplayFavoritesPeertubeFragment.java b/app/src/main/java/app/fedilab/android/fragments/DisplayFavoritesPeertubeFragment.java index fde074e28..ced513056 100644 --- a/app/src/main/java/app/fedilab/android/fragments/DisplayFavoritesPeertubeFragment.java +++ b/app/src/main/java/app/fedilab/android/fragments/DisplayFavoritesPeertubeFragment.java @@ -20,34 +20,32 @@ import android.content.SharedPreferences; import android.database.sqlite.SQLiteDatabase; import android.os.AsyncTask; import android.os.Bundle; - -import androidx.annotation.NonNull; - -import com.google.android.material.floatingactionbutton.FloatingActionButton; - -import androidx.fragment.app.Fragment; -import androidx.appcompat.app.AlertDialog; -import androidx.recyclerview.widget.LinearLayoutManager; -import androidx.recyclerview.widget.RecyclerView; - import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.RelativeLayout; +import androidx.annotation.NonNull; +import androidx.appcompat.app.AlertDialog; +import androidx.fragment.app.Fragment; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.google.android.material.floatingactionbutton.FloatingActionButton; + import java.util.ArrayList; import java.util.List; +import app.fedilab.android.R; +import app.fedilab.android.activities.MainActivity; +import app.fedilab.android.asynctasks.RetrieveFeedsAsyncTask; import app.fedilab.android.client.APIResponse; import app.fedilab.android.client.Entities.Peertube; import app.fedilab.android.drawers.PeertubeAdapter; import app.fedilab.android.helper.Helper; +import app.fedilab.android.interfaces.OnRetrieveFeedsInterface; import app.fedilab.android.sqlite.PeertubeFavoritesDAO; import app.fedilab.android.sqlite.Sqlite; -import app.fedilab.android.R; -import app.fedilab.android.activities.MainActivity; -import app.fedilab.android.asynctasks.RetrieveFeedsAsyncTask; -import app.fedilab.android.interfaces.OnRetrieveFeedsInterface; /** diff --git a/app/src/main/java/app/fedilab/android/fragments/DisplayFiltersFragment.java b/app/src/main/java/app/fedilab/android/fragments/DisplayFiltersFragment.java index abc50d299..0d76f7abd 100644 --- a/app/src/main/java/app/fedilab/android/fragments/DisplayFiltersFragment.java +++ b/app/src/main/java/app/fedilab/android/fragments/DisplayFiltersFragment.java @@ -14,21 +14,12 @@ package app.fedilab.android.fragments; * You should have received a copy of the GNU General Public License along with Fedilab; if not, * see . */ -import android.annotation.SuppressLint; import android.content.Context; import android.content.DialogInterface; import android.content.SharedPreferences; import android.database.sqlite.SQLiteDatabase; import android.os.AsyncTask; import android.os.Bundle; - -import androidx.annotation.NonNull; - -import com.google.android.material.floatingactionbutton.FloatingActionButton; - -import androidx.fragment.app.Fragment; -import androidx.appcompat.app.AlertDialog; - import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -44,22 +35,28 @@ import android.widget.RelativeLayout; import android.widget.Spinner; import android.widget.Toast; +import androidx.annotation.NonNull; +import androidx.appcompat.app.AlertDialog; +import androidx.fragment.app.Fragment; + +import com.google.android.material.floatingactionbutton.FloatingActionButton; + import java.util.ArrayList; import java.util.List; import java.util.Objects; +import app.fedilab.android.R; +import app.fedilab.android.activities.MainActivity; +import app.fedilab.android.asynctasks.ManageFiltersAsyncTask; import app.fedilab.android.client.APIResponse; import app.fedilab.android.client.Entities.Filters; import app.fedilab.android.client.Entities.ManageTimelines; import app.fedilab.android.drawers.FilterAdapter; import app.fedilab.android.helper.Helper; +import app.fedilab.android.interfaces.OnFilterActionInterface; import app.fedilab.android.sqlite.Sqlite; import app.fedilab.android.sqlite.TimelinesDAO; import es.dmoral.toasty.Toasty; -import app.fedilab.android.R; -import app.fedilab.android.activities.MainActivity; -import app.fedilab.android.asynctasks.ManageFiltersAsyncTask; -import app.fedilab.android.interfaces.OnFilterActionInterface; import static app.fedilab.android.activities.BaseMainActivity.mPageReferenceMap; @@ -241,10 +238,10 @@ public class DisplayFiltersFragment extends Fragment implements OnFilterActionIn mainLoader.setVisibility(View.GONE); add_new.setEnabled(true); if (apiResponse.getError() != null) { - if(apiResponse.getError().getError().length() < 100) { + if (apiResponse.getError().getError().length() < 100) { Toasty.error(context, apiResponse.getError().getError(), Toast.LENGTH_LONG).show(); - }else{ - Toasty.error(context, getString(R.string.long_api_error,"\ud83d\ude05"), Toast.LENGTH_LONG).show(); + } else { + Toasty.error(context, getString(R.string.long_api_error, "\ud83d\ude05"), Toast.LENGTH_LONG).show(); } return; } diff --git a/app/src/main/java/app/fedilab/android/fragments/DisplayFollowRequestSentFragment.java b/app/src/main/java/app/fedilab/android/fragments/DisplayFollowRequestSentFragment.java index 61ab148e7..9efc8ad12 100644 --- a/app/src/main/java/app/fedilab/android/fragments/DisplayFollowRequestSentFragment.java +++ b/app/src/main/java/app/fedilab/android/fragments/DisplayFollowRequestSentFragment.java @@ -18,15 +18,6 @@ import android.content.Context; import android.content.SharedPreferences; import android.os.AsyncTask; import android.os.Bundle; - -import androidx.annotation.NonNull; -import androidx.fragment.app.Fragment; -import androidx.core.content.ContextCompat; -import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; -import androidx.recyclerview.widget.DividerItemDecoration; -import androidx.recyclerview.widget.LinearLayoutManager; -import androidx.recyclerview.widget.RecyclerView; - import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -34,17 +25,24 @@ import android.widget.RelativeLayout; import android.widget.TextView; import android.widget.Toast; +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.recyclerview.widget.DividerItemDecoration; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; +import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; + import java.util.ArrayList; import java.util.List; +import app.fedilab.android.R; +import app.fedilab.android.asynctasks.RetrieveFollowRequestSentAsyncTask; import app.fedilab.android.client.APIResponse; import app.fedilab.android.client.Entities.Account; import app.fedilab.android.drawers.AccountsFollowRequestAdapter; import app.fedilab.android.helper.Helper; -import es.dmoral.toasty.Toasty; -import app.fedilab.android.R; -import app.fedilab.android.asynctasks.RetrieveFollowRequestSentAsyncTask; import app.fedilab.android.interfaces.OnRetrieveAccountsInterface; +import es.dmoral.toasty.Toasty; /** @@ -165,10 +163,10 @@ public class DisplayFollowRequestSentFragment extends Fragment implements OnRetr mainLoader.setVisibility(View.GONE); nextElementLoader.setVisibility(View.GONE); if (apiResponse.getError() != null) { - if(apiResponse.getError().getError().length() < 100) { + if (apiResponse.getError().getError().length() < 100) { Toasty.error(context, apiResponse.getError().getError(), Toast.LENGTH_LONG).show(); - }else{ - Toasty.error(context, getString(R.string.long_api_error,"\ud83d\ude05"), Toast.LENGTH_LONG).show(); + } else { + Toasty.error(context, getString(R.string.long_api_error, "\ud83d\ude05"), Toast.LENGTH_LONG).show(); } flag_loading = false; swipeRefreshLayout.setRefreshing(false); diff --git a/app/src/main/java/app/fedilab/android/fragments/DisplayHowToFragment.java b/app/src/main/java/app/fedilab/android/fragments/DisplayHowToFragment.java index 42c2662f8..bdea5fa41 100644 --- a/app/src/main/java/app/fedilab/android/fragments/DisplayHowToFragment.java +++ b/app/src/main/java/app/fedilab/android/fragments/DisplayHowToFragment.java @@ -17,10 +17,6 @@ package app.fedilab.android.fragments; import android.content.Context; import android.os.AsyncTask; import android.os.Bundle; - -import androidx.annotation.NonNull; -import androidx.fragment.app.Fragment; - import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -28,17 +24,20 @@ import android.widget.ListView; import android.widget.RelativeLayout; import android.widget.Toast; +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; + import org.jetbrains.annotations.NotNull; import java.util.List; +import app.fedilab.android.R; +import app.fedilab.android.asynctasks.RetrieveHowToAsyncTask; import app.fedilab.android.client.APIResponse; import app.fedilab.android.client.Entities.HowToVideo; import app.fedilab.android.drawers.HowToVideosAdapter; -import es.dmoral.toasty.Toasty; -import app.fedilab.android.R; -import app.fedilab.android.asynctasks.RetrieveHowToAsyncTask; import app.fedilab.android.interfaces.OnRetrieveHowToInterface; +import es.dmoral.toasty.Toasty; /** @@ -96,10 +95,10 @@ public class DisplayHowToFragment extends Fragment implements OnRetrieveHowToInt public void onRetrieveHowTo(APIResponse apiResponse) { mainLoader.setVisibility(View.GONE); if (apiResponse.getError() != null) { - if(apiResponse.getError().getError().length() < 100) { + if (apiResponse.getError().getError().length() < 100) { Toasty.error(context, apiResponse.getError().getError(), Toast.LENGTH_LONG).show(); - }else{ - Toasty.error(context, getString(R.string.long_api_error,"\ud83d\ude05"), Toast.LENGTH_LONG).show(); + } else { + Toasty.error(context, getString(R.string.long_api_error, "\ud83d\ude05"), Toast.LENGTH_LONG).show(); } return; } diff --git a/app/src/main/java/app/fedilab/android/fragments/DisplayListsFragment.java b/app/src/main/java/app/fedilab/android/fragments/DisplayListsFragment.java index a88d07822..280645164 100644 --- a/app/src/main/java/app/fedilab/android/fragments/DisplayListsFragment.java +++ b/app/src/main/java/app/fedilab/android/fragments/DisplayListsFragment.java @@ -21,15 +21,6 @@ import android.content.Intent; import android.content.SharedPreferences; import android.os.AsyncTask; import android.os.Bundle; - -import androidx.annotation.NonNull; - -import com.google.android.material.floatingactionbutton.FloatingActionButton; - -import androidx.fragment.app.Fragment; -import androidx.appcompat.app.AlertDialog; -import androidx.localbroadcastmanager.content.LocalBroadcastManager; - import android.text.InputFilter; import android.view.LayoutInflater; import android.view.View; @@ -42,20 +33,27 @@ import android.widget.ListView; import android.widget.RelativeLayout; import android.widget.Toast; +import androidx.annotation.NonNull; +import androidx.appcompat.app.AlertDialog; +import androidx.fragment.app.Fragment; +import androidx.localbroadcastmanager.content.LocalBroadcastManager; + +import com.google.android.material.floatingactionbutton.FloatingActionButton; + import org.jetbrains.annotations.NotNull; import java.util.ArrayList; import java.util.List; -import app.fedilab.android.client.APIResponse; -import app.fedilab.android.drawers.ListAdapter; -import app.fedilab.android.helper.Helper; -import es.dmoral.toasty.Toasty; import app.fedilab.android.R; import app.fedilab.android.activities.ListActivity; import app.fedilab.android.activities.MainActivity; import app.fedilab.android.asynctasks.ManageListsAsyncTask; +import app.fedilab.android.client.APIResponse; +import app.fedilab.android.drawers.ListAdapter; +import app.fedilab.android.helper.Helper; import app.fedilab.android.interfaces.OnListActionInterface; +import es.dmoral.toasty.Toasty; /** @@ -178,10 +176,10 @@ public class DisplayListsFragment extends Fragment implements OnListActionInterf mainLoader.setVisibility(View.GONE); add_new.setEnabled(true); if (apiResponse.getError() != null) { - if(apiResponse.getError().getError().length() < 100) { + if (apiResponse.getError().getError().length() < 100) { Toasty.error(context, apiResponse.getError().getError(), Toast.LENGTH_LONG).show(); - }else{ - Toasty.error(context, getString(R.string.long_api_error,"\ud83d\ude05"), Toast.LENGTH_LONG).show(); + } else { + Toasty.error(context, getString(R.string.long_api_error, "\ud83d\ude05"), Toast.LENGTH_LONG).show(); } return; } diff --git a/app/src/main/java/app/fedilab/android/fragments/DisplayMediaFragment.java b/app/src/main/java/app/fedilab/android/fragments/DisplayMediaFragment.java index bddfb7ead..ea980efd3 100644 --- a/app/src/main/java/app/fedilab/android/fragments/DisplayMediaFragment.java +++ b/app/src/main/java/app/fedilab/android/fragments/DisplayMediaFragment.java @@ -20,30 +20,29 @@ import android.os.AsyncTask; import android.os.Bundle; import android.os.Handler; import android.os.Looper; - -import androidx.annotation.NonNull; -import androidx.fragment.app.Fragment; -import androidx.recyclerview.widget.GridLayoutManager; -import androidx.recyclerview.widget.RecyclerView; - import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.RelativeLayout; import android.widget.Toast; +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + import java.util.ArrayList; import java.util.List; +import app.fedilab.android.R; +import app.fedilab.android.asynctasks.RetrieveFeedsAsyncTask; import app.fedilab.android.client.APIResponse; import app.fedilab.android.client.Entities.Attachment; import app.fedilab.android.client.Entities.Status; import app.fedilab.android.drawers.ImageAdapter; import app.fedilab.android.helper.Helper; -import es.dmoral.toasty.Toasty; -import app.fedilab.android.R; -import app.fedilab.android.asynctasks.RetrieveFeedsAsyncTask; import app.fedilab.android.interfaces.OnRetrieveFeedsInterface; +import es.dmoral.toasty.Toasty; /** @@ -53,6 +52,7 @@ import app.fedilab.android.interfaces.OnRetrieveFeedsInterface; public class DisplayMediaFragment extends Fragment implements OnRetrieveFeedsInterface { + boolean firstTootsLoaded; private boolean flag_loading; private Context context; private AsyncTask asyncTask; @@ -61,7 +61,6 @@ public class DisplayMediaFragment extends Fragment implements OnRetrieveFeedsInt private boolean firstLoad; private String targetedId; private boolean showMediaOnly, showPinned, showReply; - boolean firstTootsLoaded; private SharedPreferences sharedpreferences; private ArrayList statuses; private ImageAdapter gridAdaper; @@ -179,10 +178,10 @@ public class DisplayMediaFragment extends Fragment implements OnRetrieveFeedsInt //Discards 404 - error which can often happen due to toots which have been deleted if (apiResponse == null || apiResponse.getError() != null && apiResponse.getError().getStatusCode() != 404) { if (apiResponse != null && apiResponse.getError() != null && apiResponse.getError().getError() != null) - if(apiResponse.getError().getError().length() < 100) { + if (apiResponse.getError().getError().length() < 100) { Toasty.error(context, apiResponse.getError().getError(), Toast.LENGTH_LONG).show(); - }else{ - Toasty.error(context, getString(R.string.long_api_error,"\ud83d\ude05"), Toast.LENGTH_LONG).show(); + } else { + Toasty.error(context, getString(R.string.long_api_error, "\ud83d\ude05"), Toast.LENGTH_LONG).show(); } else Toasty.error(context, context.getString(R.string.toast_error), Toast.LENGTH_LONG).show(); diff --git a/app/src/main/java/app/fedilab/android/fragments/DisplayMutedInstanceFragment.java b/app/src/main/java/app/fedilab/android/fragments/DisplayMutedInstanceFragment.java index 19d1797a8..e07ff8f58 100644 --- a/app/src/main/java/app/fedilab/android/fragments/DisplayMutedInstanceFragment.java +++ b/app/src/main/java/app/fedilab/android/fragments/DisplayMutedInstanceFragment.java @@ -14,22 +14,11 @@ package app.fedilab.android.fragments; * You should have received a copy of the GNU General Public License along with Fedilab; if not, * see . */ -import android.annotation.SuppressLint; import android.content.Context; import android.content.DialogInterface; import android.content.SharedPreferences; import android.os.AsyncTask; import android.os.Bundle; - -import androidx.annotation.NonNull; -import androidx.appcompat.app.AlertDialog; -import androidx.fragment.app.Fragment; -import androidx.core.content.ContextCompat; -import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; -import androidx.recyclerview.widget.DividerItemDecoration; -import androidx.recyclerview.widget.LinearLayoutManager; -import androidx.recyclerview.widget.RecyclerView; - import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -39,23 +28,31 @@ import android.widget.LinearLayout; import android.widget.RelativeLayout; import android.widget.Toast; +import androidx.annotation.NonNull; +import androidx.appcompat.app.AlertDialog; +import androidx.fragment.app.Fragment; +import androidx.recyclerview.widget.DividerItemDecoration; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; +import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; + import com.google.android.material.floatingactionbutton.FloatingActionButton; import java.util.ArrayList; import java.util.List; +import app.fedilab.android.R; import app.fedilab.android.activities.MainActivity; import app.fedilab.android.asynctasks.PostActionAsyncTask; +import app.fedilab.android.asynctasks.RetrieveDomainsAsyncTask; import app.fedilab.android.client.API; import app.fedilab.android.client.APIResponse; import app.fedilab.android.client.Entities.Error; import app.fedilab.android.drawers.DomainsListAdapter; import app.fedilab.android.helper.Helper; import app.fedilab.android.interfaces.OnPostActionInterface; -import es.dmoral.toasty.Toasty; -import app.fedilab.android.R; -import app.fedilab.android.asynctasks.RetrieveDomainsAsyncTask; import app.fedilab.android.interfaces.OnRetrieveDomainsInterface; +import es.dmoral.toasty.Toasty; /** @@ -225,10 +222,10 @@ public class DisplayMutedInstanceFragment extends Fragment implements OnRetrieve mainLoader.setVisibility(View.GONE); nextElementLoader.setVisibility(View.GONE); if (apiResponse.getError() != null) { - if(apiResponse.getError().getError().length() < 100) { + if (apiResponse.getError().getError().length() < 100) { Toasty.error(context, apiResponse.getError().getError(), Toast.LENGTH_LONG).show(); - }else{ - Toasty.error(context, getString(R.string.long_api_error,"\ud83d\ude05"), Toast.LENGTH_LONG).show(); + } else { + Toasty.error(context, getString(R.string.long_api_error, "\ud83d\ude05"), Toast.LENGTH_LONG).show(); } swipeRefreshLayout.setRefreshing(false); swiped = false; diff --git a/app/src/main/java/app/fedilab/android/fragments/DisplayNotificationsFragment.java b/app/src/main/java/app/fedilab/android/fragments/DisplayNotificationsFragment.java index c7acd655a..f5006553b 100644 --- a/app/src/main/java/app/fedilab/android/fragments/DisplayNotificationsFragment.java +++ b/app/src/main/java/app/fedilab/android/fragments/DisplayNotificationsFragment.java @@ -24,43 +24,41 @@ import android.os.AsyncTask; import android.os.Bundle; import android.os.Handler; import android.os.Looper; - -import androidx.annotation.NonNull; -import androidx.fragment.app.Fragment; -import androidx.localbroadcastmanager.content.LocalBroadcastManager; -import androidx.preference.PreferenceManager; -import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; -import androidx.recyclerview.widget.LinearLayoutManager; -import androidx.recyclerview.widget.RecyclerView; - import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.RelativeLayout; import android.widget.Toast; +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.localbroadcastmanager.content.LocalBroadcastManager; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; +import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; + import org.jetbrains.annotations.NotNull; import java.util.ArrayList; import java.util.List; +import app.fedilab.android.R; +import app.fedilab.android.activities.MainActivity; +import app.fedilab.android.asynctasks.RetrieveMissingNotificationsAsyncTask; +import app.fedilab.android.asynctasks.RetrieveNotificationsAsyncTask; +import app.fedilab.android.asynctasks.UpdateAccountInfoAsyncTask; import app.fedilab.android.client.APIResponse; import app.fedilab.android.client.Entities.Account; import app.fedilab.android.client.Entities.Notification; import app.fedilab.android.client.Entities.Status; import app.fedilab.android.drawers.NotificationsListAdapter; import app.fedilab.android.helper.Helper; +import app.fedilab.android.interfaces.OnRetrieveMissingNotificationsInterface; +import app.fedilab.android.interfaces.OnRetrieveNotificationsInterface; import app.fedilab.android.services.LiveNotificationDelayedService; import app.fedilab.android.sqlite.AccountDAO; import app.fedilab.android.sqlite.Sqlite; import es.dmoral.toasty.Toasty; -import app.fedilab.android.R; -import app.fedilab.android.activities.MainActivity; -import app.fedilab.android.asynctasks.RetrieveMissingNotificationsAsyncTask; -import app.fedilab.android.asynctasks.RetrieveNotificationsAsyncTask; -import app.fedilab.android.asynctasks.UpdateAccountInfoAsyncTask; -import app.fedilab.android.interfaces.OnRetrieveMissingNotificationsInterface; -import app.fedilab.android.interfaces.OnRetrieveNotificationsInterface; import static android.content.Context.MODE_PRIVATE; import static app.fedilab.android.activities.BaseMainActivity.countNewNotifications; @@ -73,6 +71,8 @@ import static app.fedilab.android.activities.BaseMainActivity.countNewNotificati public class DisplayNotificationsFragment extends Fragment implements OnRetrieveNotificationsInterface, OnRetrieveMissingNotificationsInterface { + LinearLayoutManager mLayoutManager; + Type type; private boolean flag_loading; private Context context; private AsyncTask asyncTask; @@ -86,24 +86,12 @@ public class DisplayNotificationsFragment extends Fragment implements OnRetrieve private RecyclerView lv_notifications; private String userId, instance; private SharedPreferences sharedpreferences; - LinearLayoutManager mLayoutManager; private BroadcastReceiver receive_action; private BroadcastReceiver receive_data; public DisplayNotificationsFragment() { } - public enum Type { - ALL, - MENTION, - FAVORITE, - BOOST, - POLL, - FOLLOW - } - - Type type; - @Override public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { @@ -230,13 +218,11 @@ public class DisplayNotificationsFragment extends Fragment implements OnRetrieve return rootView; } - @Override public void onCreate(Bundle saveInstance) { super.onCreate(saveInstance); } - @Override public void onAttach(@NotNull Context context) { super.onAttach(context); @@ -292,10 +278,10 @@ public class DisplayNotificationsFragment extends Fragment implements OnRetrieve String lastReadNotifications = sharedpreferences.getString(Helper.LAST_NOTIFICATION_MAX_ID + userId + instance, null); if (apiResponse.getError() != null) { - if(apiResponse.getError().getError().length() < 100) { + if (apiResponse.getError().getError().length() < 100) { Toasty.error(context, apiResponse.getError().getError(), Toast.LENGTH_LONG).show(); - }else{ - Toasty.error(context, getString(R.string.long_api_error,"\ud83d\ude05"), Toast.LENGTH_LONG).show(); + } else { + Toasty.error(context, getString(R.string.long_api_error, "\ud83d\ude05"), Toast.LENGTH_LONG).show(); } flag_loading = false; swipeRefreshLayout.setRefreshing(false); @@ -409,7 +395,6 @@ public class DisplayNotificationsFragment extends Fragment implements OnRetrieve asyncTask = new RetrieveNotificationsAsyncTask(context, type, true, null, null, DisplayNotificationsFragment.this).execute(); } - public void refresh(Notification notification) { if (context == null) return; @@ -438,7 +423,6 @@ public class DisplayNotificationsFragment extends Fragment implements OnRetrieve } } - @Override public void onRetrieveMissingNotifications(List notifications) { flag_loading = false; @@ -484,7 +468,6 @@ public class DisplayNotificationsFragment extends Fragment implements OnRetrieve } } - /** * Records the id of the notification only if its greater than the previous one. * @@ -502,7 +485,6 @@ public class DisplayNotificationsFragment extends Fragment implements OnRetrieve } } - /** * Records the id of the notification only if its greater than the previous one. */ @@ -517,4 +499,14 @@ public class DisplayNotificationsFragment extends Fragment implements OnRetrieve } } } + + + public enum Type { + ALL, + MENTION, + FAVORITE, + BOOST, + POLL, + FOLLOW + } } diff --git a/app/src/main/java/app/fedilab/android/fragments/DisplayPeertubeNotificationsFragment.java b/app/src/main/java/app/fedilab/android/fragments/DisplayPeertubeNotificationsFragment.java index 5a01f0813..b6eb699f1 100644 --- a/app/src/main/java/app/fedilab/android/fragments/DisplayPeertubeNotificationsFragment.java +++ b/app/src/main/java/app/fedilab/android/fragments/DisplayPeertubeNotificationsFragment.java @@ -20,33 +20,31 @@ import android.os.AsyncTask; import android.os.Bundle; import android.os.Handler; import android.os.Looper; - -import androidx.annotation.NonNull; -import androidx.fragment.app.Fragment; -import androidx.core.content.ContextCompat; -import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; -import androidx.recyclerview.widget.LinearLayoutManager; -import androidx.recyclerview.widget.RecyclerView; - import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.RelativeLayout; import android.widget.Toast; +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; +import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; + import java.util.ArrayList; import java.util.List; +import app.fedilab.android.R; +import app.fedilab.android.activities.MainActivity; +import app.fedilab.android.asynctasks.RetrievePeertubeNotificationsAsyncTask; import app.fedilab.android.client.APIResponse; import app.fedilab.android.client.Entities.Account; import app.fedilab.android.client.Entities.PeertubeNotification; import app.fedilab.android.drawers.PeertubeNotificationsListAdapter; import app.fedilab.android.helper.Helper; -import es.dmoral.toasty.Toasty; -import app.fedilab.android.R; -import app.fedilab.android.activities.MainActivity; -import app.fedilab.android.asynctasks.RetrievePeertubeNotificationsAsyncTask; import app.fedilab.android.interfaces.OnRetrievePeertubeNotificationsInterface; +import es.dmoral.toasty.Toasty; /** @@ -56,22 +54,6 @@ import app.fedilab.android.interfaces.OnRetrievePeertubeNotificationsInterface; public class DisplayPeertubeNotificationsFragment extends Fragment implements OnRetrievePeertubeNotificationsInterface { - private boolean flag_loading; - private Context context; - private AsyncTask asyncTask; - private PeertubeNotificationsListAdapter notificationsListAdapter; - private String max_id; - private List notifications; - private RelativeLayout mainLoader, nextElementLoader, textviewNoAction; - private boolean firstLoad; - private SwipeRefreshLayout swipeRefreshLayout; - private boolean swiped; - private RecyclerView lv_notifications; - private String userId, instance; - private SharedPreferences sharedpreferences; - LinearLayoutManager mLayoutManager; - - //Peertube notification type public static int NEW_VIDEO_FROM_SUBSCRIPTION = 1; public static int NEW_COMMENT_ON_MY_VIDEO = 2; @@ -84,6 +66,20 @@ public class DisplayPeertubeNotificationsFragment extends Fragment implements On public static int NEW_USER_REGISTRATION = 9; public static int NEW_FOLLOW = 10; public static int COMMENT_MENTION = 11; + LinearLayoutManager mLayoutManager; + private boolean flag_loading; + private Context context; + private AsyncTask asyncTask; + private PeertubeNotificationsListAdapter notificationsListAdapter; + private String max_id; + private List notifications; + private RelativeLayout mainLoader, nextElementLoader, textviewNoAction; + private boolean firstLoad; + private SwipeRefreshLayout swipeRefreshLayout; + private boolean swiped; + private RecyclerView lv_notifications; + private String userId, instance; + private SharedPreferences sharedpreferences; public DisplayPeertubeNotificationsFragment() { } @@ -234,10 +230,10 @@ public class DisplayPeertubeNotificationsFragment extends Fragment implements On nextElementLoader.setVisibility(View.GONE); String lastReadNotifications = sharedpreferences.getString(Helper.LAST_NOTIFICATION_MAX_ID + userId + instance, null); if (apiResponse.getError() != null) { - if(apiResponse.getError().getError().length() < 100) { + if (apiResponse.getError().getError().length() < 100) { Toasty.error(context, apiResponse.getError().getError(), Toast.LENGTH_LONG).show(); - }else{ - Toasty.error(context, getString(R.string.long_api_error,"\ud83d\ude05"), Toast.LENGTH_LONG).show(); + } else { + Toasty.error(context, getString(R.string.long_api_error, "\ud83d\ude05"), Toast.LENGTH_LONG).show(); } flag_loading = false; swipeRefreshLayout.setRefreshing(false); diff --git a/app/src/main/java/app/fedilab/android/fragments/DisplayPlaylistsFragment.java b/app/src/main/java/app/fedilab/android/fragments/DisplayPlaylistsFragment.java index 467e62213..8990cb590 100644 --- a/app/src/main/java/app/fedilab/android/fragments/DisplayPlaylistsFragment.java +++ b/app/src/main/java/app/fedilab/android/fragments/DisplayPlaylistsFragment.java @@ -14,7 +14,6 @@ package app.fedilab.android.fragments; * You should have received a copy of the GNU General Public License along with Fedilab; if not, * see . */ -import android.annotation.SuppressLint; import android.app.Activity; import android.content.Context; import android.content.DialogInterface; @@ -22,15 +21,6 @@ import android.content.Intent; import android.content.SharedPreferences; import android.os.AsyncTask; import android.os.Bundle; - -import androidx.annotation.NonNull; - -import com.google.android.material.floatingactionbutton.FloatingActionButton; - -import androidx.fragment.app.Fragment; -import androidx.fragment.app.FragmentTransaction; -import androidx.appcompat.app.AlertDialog; - import android.text.InputFilter; import android.view.LayoutInflater; import android.view.View; @@ -44,6 +34,12 @@ import android.widget.ListView; import android.widget.RelativeLayout; import android.widget.Toast; +import androidx.annotation.NonNull; +import androidx.appcompat.app.AlertDialog; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentTransaction; + +import com.google.android.material.floatingactionbutton.FloatingActionButton; import com.jaredrummler.materialspinner.MaterialSpinner; import net.gotev.uploadservice.MultipartUploadRequest; @@ -138,10 +134,10 @@ public class DisplayPlaylistsFragment extends Fragment implements OnPlaylistActi int i = 0; while (it.hasNext()) { Map.Entry pair = (Map.Entry) it.next(); - if (translations == null || translations.size() == 0 || !translations.containsKey((String) pair.getValue())) + if (translations == null || translations.size() == 0 || !translations.containsKey(pair.getValue())) privaciesA[i] = (String) pair.getValue(); else - privaciesA[i] = translations.get((String) pair.getValue()); + privaciesA[i] = translations.get(pair.getValue()); it.remove(); i++; } @@ -317,10 +313,10 @@ public class DisplayPlaylistsFragment extends Fragment implements OnPlaylistActi mainLoader.setVisibility(View.GONE); add_new.setEnabled(true); if (apiResponse.getError() != null) { - if(apiResponse.getError().getError().length() < 100) { + if (apiResponse.getError().getError().length() < 100) { Toasty.error(context, apiResponse.getError().getError(), Toast.LENGTH_LONG).show(); - }else{ - Toasty.error(context, getString(R.string.long_api_error,"\ud83d\ude05"), Toast.LENGTH_LONG).show(); + } else { + Toasty.error(context, getString(R.string.long_api_error, "\ud83d\ude05"), Toast.LENGTH_LONG).show(); } return; } @@ -344,10 +340,10 @@ public class DisplayPlaylistsFragment extends Fragment implements OnPlaylistActi playlistAdapter.notifyDataSetChanged(); textviewNoAction.setVisibility(View.GONE); } else { - if(apiResponse.getError().getError().length() < 100) { + if (apiResponse.getError().getError().length() < 100) { Toasty.error(context, apiResponse.getError().getError(), Toast.LENGTH_LONG).show(); - }else{ - Toasty.error(context, getString(R.string.long_api_error,"\ud83d\ude05"), Toast.LENGTH_LONG).show(); + } else { + Toasty.error(context, getString(R.string.long_api_error, "\ud83d\ude05"), Toast.LENGTH_LONG).show(); } } } else if (actionType == ManagePlaylistsAsyncTask.action.DELETE_PLAYLIST) { @@ -371,10 +367,10 @@ public class DisplayPlaylistsFragment extends Fragment implements OnPlaylistActi public void onRetrievePeertubeChannels(APIResponse apiResponse) { if (apiResponse.getError() != null || apiResponse.getAccounts() == null || apiResponse.getAccounts().size() == 0) { if (apiResponse.getError() != null && apiResponse.getError().getError() != null) - if(apiResponse.getError().getError().length() < 100) { + if (apiResponse.getError().getError().length() < 100) { Toasty.error(context, apiResponse.getError().getError(), Toast.LENGTH_LONG).show(); - }else{ - Toasty.error(context, getString(R.string.long_api_error,"\ud83d\ude05"), Toast.LENGTH_LONG).show(); + } else { + Toasty.error(context, getString(R.string.long_api_error, "\ud83d\ude05"), Toast.LENGTH_LONG).show(); } else Toasty.error(context, getString(R.string.toast_error), Toast.LENGTH_LONG).show(); @@ -417,10 +413,10 @@ public class DisplayPlaylistsFragment extends Fragment implements OnPlaylistActi i = 0; while (it.hasNext()) { Map.Entry pair = (Map.Entry) it.next(); - if (translations == null || translations.size() == 0 || !translations.containsKey((String) pair.getValue())) + if (translations == null || translations.size() == 0 || !translations.containsKey(pair.getValue())) privaciesA[i] = (String) pair.getValue(); else - privaciesA[i] = translations.get((String) pair.getValue()); + privaciesA[i] = translations.get(pair.getValue()); it.remove(); i++; } diff --git a/app/src/main/java/app/fedilab/android/fragments/DisplayScheduledTootsFragment.java b/app/src/main/java/app/fedilab/android/fragments/DisplayScheduledTootsFragment.java index 606e22786..fdf3e0cd9 100644 --- a/app/src/main/java/app/fedilab/android/fragments/DisplayScheduledTootsFragment.java +++ b/app/src/main/java/app/fedilab/android/fragments/DisplayScheduledTootsFragment.java @@ -26,10 +26,6 @@ import android.os.Build; import android.os.Bundle; import android.os.PowerManager; import android.provider.Settings; - -import androidx.annotation.NonNull; -import androidx.fragment.app.Fragment; - import android.text.Html; import android.text.Spanned; import android.view.LayoutInflater; @@ -41,24 +37,25 @@ import android.widget.RelativeLayout; import android.widget.TextView; import android.widget.Toast; +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; + import java.util.ArrayList; import java.util.List; +import app.fedilab.android.R; +import app.fedilab.android.asynctasks.RetrieveFeedsAsyncTask; +import app.fedilab.android.asynctasks.RetrieveScheduledTootsAsyncTask; import app.fedilab.android.client.APIResponse; import app.fedilab.android.client.Entities.StoredStatus; import app.fedilab.android.drawers.ScheduledTootsListAdapter; import app.fedilab.android.helper.Helper; +import app.fedilab.android.interfaces.OnRetrieveFeedsInterface; +import app.fedilab.android.interfaces.OnRetrieveScheduledTootsInterface; import app.fedilab.android.sqlite.BoostScheduleDAO; import app.fedilab.android.sqlite.Sqlite; import app.fedilab.android.sqlite.StatusStoredDAO; import es.dmoral.toasty.Toasty; -import app.fedilab.android.R; -import app.fedilab.android.asynctasks.RetrieveFeedsAsyncTask; -import app.fedilab.android.asynctasks.RetrieveScheduledTootsAsyncTask; -import app.fedilab.android.interfaces.OnRetrieveFeedsInterface; -import app.fedilab.android.interfaces.OnRetrieveScheduledTootsInterface; - -import static app.fedilab.android.helper.Helper.changeDrawableColor; /** @@ -78,12 +75,6 @@ public class DisplayScheduledTootsFragment extends Fragment implements OnRetriev private boolean firstCall; private ScheduledTootsListAdapter scheduledTootsListAdapter; - public enum typeOfSchedule { - TOOT, - BOOST, - SERVER - } - @Override public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { @@ -118,10 +109,10 @@ public class DisplayScheduledTootsFragment extends Fragment implements OnRetriev @Override public void onRetrieveFeeds(APIResponse apiResponse) { if (apiResponse.getError() != null && apiResponse.getError().getStatusCode() != 404) { - if(apiResponse.getError().getError().length() < 100) { + if (apiResponse.getError().getError().length() < 100) { Toasty.error(context, apiResponse.getError().getError(), Toast.LENGTH_LONG).show(); - }else{ - Toasty.error(context, getString(R.string.long_api_error,"\ud83d\ude05"), Toast.LENGTH_LONG).show(); + } else { + Toasty.error(context, getString(R.string.long_api_error, "\ud83d\ude05"), Toast.LENGTH_LONG).show(); } return; } @@ -202,7 +193,6 @@ public class DisplayScheduledTootsFragment extends Fragment implements OnRetriev super.onCreate(saveInstance); } - @Override public void onAttach(Context context) { super.onAttach(context); @@ -215,7 +205,6 @@ public class DisplayScheduledTootsFragment extends Fragment implements OnRetriev asyncTask.cancel(true); } - @Override public void onRetrieveScheduledToots(List storedStatuses) { @@ -241,4 +230,11 @@ public class DisplayScheduledTootsFragment extends Fragment implements OnRetriev } } } + + + public enum typeOfSchedule { + TOOT, + BOOST, + SERVER + } } diff --git a/app/src/main/java/app/fedilab/android/fragments/DisplaySearchFragment.java b/app/src/main/java/app/fedilab/android/fragments/DisplaySearchFragment.java index bc8c8dcc3..08b3be430 100644 --- a/app/src/main/java/app/fedilab/android/fragments/DisplaySearchFragment.java +++ b/app/src/main/java/app/fedilab/android/fragments/DisplaySearchFragment.java @@ -14,21 +14,12 @@ package app.fedilab.android.fragments; * You should have received a copy of the GNU General Public License along with Fedilab; if not, * see . */ -import android.annotation.SuppressLint; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.SharedPreferences; import android.database.sqlite.SQLiteDatabase; import android.os.Bundle; - -import androidx.annotation.NonNull; - -import com.google.android.material.floatingactionbutton.FloatingActionButton; - -import androidx.fragment.app.Fragment; -import androidx.appcompat.app.AlertDialog; - import android.text.InputFilter; import android.view.LayoutInflater; import android.view.View; @@ -40,17 +31,21 @@ import android.widget.LinearLayout; import android.widget.ListView; import android.widget.RelativeLayout; +import androidx.annotation.NonNull; +import androidx.appcompat.app.AlertDialog; +import androidx.fragment.app.Fragment; + +import com.google.android.material.floatingactionbutton.FloatingActionButton; + import java.util.ArrayList; import java.util.List; +import app.fedilab.android.R; +import app.fedilab.android.activities.MainActivity; import app.fedilab.android.drawers.SearchTootsListAdapter; import app.fedilab.android.helper.Helper; import app.fedilab.android.sqlite.SearchDAO; import app.fedilab.android.sqlite.Sqlite; -import app.fedilab.android.activities.MainActivity; -import app.fedilab.android.R; - -import static app.fedilab.android.helper.Helper.changeDrawableColor; /** diff --git a/app/src/main/java/app/fedilab/android/fragments/DisplaySearchTagsFragment.java b/app/src/main/java/app/fedilab/android/fragments/DisplaySearchTagsFragment.java index 8523c00c0..ac0bedece 100644 --- a/app/src/main/java/app/fedilab/android/fragments/DisplaySearchTagsFragment.java +++ b/app/src/main/java/app/fedilab/android/fragments/DisplaySearchTagsFragment.java @@ -15,32 +15,30 @@ package app.fedilab.android.fragments; * see . */ import android.content.Context; -import android.content.SharedPreferences; import android.os.AsyncTask; import android.os.Bundle; - -import androidx.annotation.NonNull; -import androidx.fragment.app.Fragment; -import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; -import androidx.recyclerview.widget.LinearLayoutManager; -import androidx.recyclerview.widget.RecyclerView; - import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.RelativeLayout; import android.widget.Toast; +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; +import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; + import java.util.ArrayList; import java.util.List; +import app.fedilab.android.R; +import app.fedilab.android.asynctasks.RetrieveSearchAsyncTask; import app.fedilab.android.client.API; import app.fedilab.android.client.APIResponse; import app.fedilab.android.drawers.SearchTagsAdapter; -import es.dmoral.toasty.Toasty; -import app.fedilab.android.R; -import app.fedilab.android.asynctasks.RetrieveSearchAsyncTask; import app.fedilab.android.interfaces.OnRetrieveSearchInterface; +import es.dmoral.toasty.Toasty; /** @@ -174,10 +172,10 @@ public class DisplaySearchTagsFragment extends Fragment implements OnRetrieveSea swipeRefreshLayout.setRefreshing(false); if (apiResponse.getError() != null) { if (apiResponse.getError().getError() != null) - if(apiResponse.getError().getError().length() < 100) { + if (apiResponse.getError().getError().length() < 100) { Toasty.error(context, apiResponse.getError().getError(), Toast.LENGTH_LONG).show(); - }else{ - Toasty.error(context, getString(R.string.long_api_error,"\ud83d\ude05"), Toast.LENGTH_LONG).show(); + } else { + Toasty.error(context, getString(R.string.long_api_error, "\ud83d\ude05"), Toast.LENGTH_LONG).show(); } else Toasty.error(context, context.getString(R.string.toast_error), Toast.LENGTH_LONG).show(); diff --git a/app/src/main/java/app/fedilab/android/fragments/DisplayStatusFragment.java b/app/src/main/java/app/fedilab/android/fragments/DisplayStatusFragment.java index a410c1921..8a76cd9b6 100644 --- a/app/src/main/java/app/fedilab/android/fragments/DisplayStatusFragment.java +++ b/app/src/main/java/app/fedilab/android/fragments/DisplayStatusFragment.java @@ -25,15 +25,6 @@ import android.os.AsyncTask; import android.os.Bundle; import android.os.Handler; import android.os.Looper; - -import androidx.annotation.NonNull; -import androidx.fragment.app.Fragment; -import androidx.localbroadcastmanager.content.LocalBroadcastManager; -import androidx.preference.PreferenceManager; -import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; -import androidx.recyclerview.widget.LinearLayoutManager; -import androidx.recyclerview.widget.RecyclerView; - import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -42,11 +33,27 @@ import android.widget.RelativeLayout; import android.widget.TextView; import android.widget.Toast; +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.localbroadcastmanager.content.LocalBroadcastManager; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; +import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; + import java.util.ArrayList; import java.util.Date; import java.util.Iterator; import java.util.List; +import app.fedilab.android.R; +import app.fedilab.android.activities.BaseMainActivity; +import app.fedilab.android.activities.MainActivity; +import app.fedilab.android.asynctasks.ManageListsAsyncTask; +import app.fedilab.android.asynctasks.RetrieveFeedsAfterBookmarkAsyncTask; +import app.fedilab.android.asynctasks.RetrieveFeedsAsyncTask; +import app.fedilab.android.asynctasks.RetrieveMissingFeedsAsyncTask; +import app.fedilab.android.asynctasks.RetrievePeertubeSearchAsyncTask; +import app.fedilab.android.asynctasks.UpdateAccountInfoAsyncTask; import app.fedilab.android.client.APIResponse; import app.fedilab.android.client.Entities.Account; import app.fedilab.android.client.Entities.Conversation; @@ -60,25 +67,16 @@ import app.fedilab.android.drawers.PeertubeAdapter; import app.fedilab.android.drawers.PixelfedListAdapter; import app.fedilab.android.drawers.StatusListAdapter; import app.fedilab.android.helper.Helper; +import app.fedilab.android.interfaces.OnListActionInterface; +import app.fedilab.android.interfaces.OnRetrieveFeedsAfterBookmarkInterface; +import app.fedilab.android.interfaces.OnRetrieveFeedsInterface; +import app.fedilab.android.interfaces.OnRetrieveMissingFeedsInterface; import app.fedilab.android.services.StreamingFederatedTimelineService; import app.fedilab.android.services.StreamingLocalTimelineService; import app.fedilab.android.sqlite.InstancesDAO; import app.fedilab.android.sqlite.SearchDAO; import app.fedilab.android.sqlite.Sqlite; import es.dmoral.toasty.Toasty; -import app.fedilab.android.R; -import app.fedilab.android.activities.BaseMainActivity; -import app.fedilab.android.activities.MainActivity; -import app.fedilab.android.asynctasks.ManageListsAsyncTask; -import app.fedilab.android.asynctasks.RetrieveFeedsAfterBookmarkAsyncTask; -import app.fedilab.android.asynctasks.RetrieveFeedsAsyncTask; -import app.fedilab.android.asynctasks.RetrieveMissingFeedsAsyncTask; -import app.fedilab.android.asynctasks.RetrievePeertubeSearchAsyncTask; -import app.fedilab.android.asynctasks.UpdateAccountInfoAsyncTask; -import app.fedilab.android.interfaces.OnListActionInterface; -import app.fedilab.android.interfaces.OnRetrieveFeedsAfterBookmarkInterface; -import app.fedilab.android.interfaces.OnRetrieveFeedsInterface; -import app.fedilab.android.interfaces.OnRetrieveMissingFeedsInterface; /** @@ -88,6 +86,7 @@ import app.fedilab.android.interfaces.OnRetrieveMissingFeedsInterface; public class DisplayStatusFragment extends Fragment implements OnRetrieveFeedsInterface, OnRetrieveMissingFeedsInterface, OnRetrieveFeedsAfterBookmarkInterface, OnListActionInterface { + LinearLayoutManager mLayoutManager; private boolean flag_loading; private Context context; private AsyncTask asyncTask; @@ -107,7 +106,6 @@ public class DisplayStatusFragment extends Fragment implements OnRetrieveFeedsIn private RecyclerView lv_status; private boolean showMediaOnly, showPinned, showReply; private Intent streamingFederatedIntent, streamingLocalIntent; - LinearLayoutManager mLayoutManager; private boolean firstTootsLoaded; private String userId, instance; private SharedPreferences sharedpreferences; @@ -325,7 +323,7 @@ public class DisplayStatusFragment extends Fragment implements OnRetrieveFeedsIn nextElementLoader.setVisibility(View.GONE); } } - if ((type == RetrieveFeedsAsyncTask.Type.HOME|| type == RetrieveFeedsAsyncTask.Type.PF_HOME) && statuses != null && statuses.size() > firstVisibleItem && firstVisibleItem >= 0) { + if ((type == RetrieveFeedsAsyncTask.Type.HOME || type == RetrieveFeedsAsyncTask.Type.PF_HOME) && statuses != null && statuses.size() > firstVisibleItem && firstVisibleItem >= 0) { Date bookmarkL = statuses.get(firstVisibleItem).getCreated_at(); updatedBookMark = statuses.get(firstVisibleItem).getId(); updatedBookMarkDate = statuses.get(firstVisibleItem).getCreated_at(); @@ -342,7 +340,7 @@ public class DisplayStatusFragment extends Fragment implements OnRetrieveFeedsIn swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { @Override public void onRefresh() { - if (type == RetrieveFeedsAsyncTask.Type.HOME|| type == RetrieveFeedsAsyncTask.Type.PF_HOME) + if (type == RetrieveFeedsAsyncTask.Type.HOME || type == RetrieveFeedsAsyncTask.Type.PF_HOME) MainActivity.countNewStatus = 0; isSwipped = true; if (type != RetrieveFeedsAsyncTask.Type.CONVERSATION) @@ -401,7 +399,7 @@ public class DisplayStatusFragment extends Fragment implements OnRetrieveFeedsIn swipeRefreshLayout.clearAnimation(); } //Store bookmark on pause - if (context instanceof BaseMainActivity && (type == RetrieveFeedsAsyncTask.Type.HOME|| type == RetrieveFeedsAsyncTask.Type.PF_HOME)) { + if (context instanceof BaseMainActivity && (type == RetrieveFeedsAsyncTask.Type.HOME || type == RetrieveFeedsAsyncTask.Type.PF_HOME)) { SharedPreferences.Editor editor = sharedpreferences.edit(); if (updatedBookMark != null) editor.putString(Helper.BOOKMARK_ID + userId + instance, updatedBookMark); @@ -413,9 +411,9 @@ public class DisplayStatusFragment extends Fragment implements OnRetrieveFeedsIn editor.putString(Helper.LAST_READ_TOOT_DATE + userId + instance, Helper.dateToString(lastReadTootDate)); editor.apply(); } - if( getActivity() != null) { + if (getActivity() != null) { InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE); - if( imm != null && getView() != null) { + if (imm != null && getView() != null) { imm.hideSoftInputFromWindow(getView().getWindowToken(), 0); } } @@ -479,10 +477,10 @@ public class DisplayStatusFragment extends Fragment implements OnRetrieveFeedsIn if (apiResponse == null) Toasty.error(context, context.getString(R.string.toast_error), Toast.LENGTH_LONG).show(); else { - if(apiResponse.getError().getError().length() < 100) { + if (apiResponse.getError().getError().length() < 100) { Toasty.error(context, apiResponse.getError().getError(), Toast.LENGTH_LONG).show(); - }else{ - Toasty.error(context, getString(R.string.long_api_error,"\ud83d\ude05"), Toast.LENGTH_LONG).show(); + } else { + Toasty.error(context, getString(R.string.long_api_error, "\ud83d\ude05"), Toast.LENGTH_LONG).show(); } } swipeRefreshLayout.setRefreshing(false); @@ -574,7 +572,7 @@ public class DisplayStatusFragment extends Fragment implements OnRetrieveFeedsIn //First toot are loaded as soon as the bookmark has been retrieved //Only for the Home timeline - if ((type == RetrieveFeedsAsyncTask.Type.HOME|| type == RetrieveFeedsAsyncTask.Type.PF_HOME) && !firstTootsLoaded) { + if ((type == RetrieveFeedsAsyncTask.Type.HOME || type == RetrieveFeedsAsyncTask.Type.PF_HOME) && !firstTootsLoaded) { boolean remember_position_home = sharedpreferences.getBoolean(Helper.SET_REMEMBER_POSITION_HOME, true); if (remember_position_home) asyncTask = new RetrieveFeedsAfterBookmarkAsyncTask(context, null, false, DisplayStatusFragment.this).execute(); @@ -626,7 +624,7 @@ public class DisplayStatusFragment extends Fragment implements OnRetrieveFeedsIn tempTootResult.add(status); if (tempTootResult.size() > 0) status = tempTootResult.get(0); - if (type == RetrieveFeedsAsyncTask.Type.HOME|| type == RetrieveFeedsAsyncTask.Type.PF_HOME) { + if (type == RetrieveFeedsAsyncTask.Type.HOME || type == RetrieveFeedsAsyncTask.Type.PF_HOME) { //Makes sure the status is not already displayed if (!statuses.contains(status)) { @@ -663,7 +661,8 @@ public class DisplayStatusFragment extends Fragment implements OnRetrieveFeedsIn if (lv_status != null) { try { lv_status.setAdapter(null); - }catch (Exception ignored){} + } catch (Exception ignored) { + } } super.onDestroyView(); } @@ -673,7 +672,7 @@ public class DisplayStatusFragment extends Fragment implements OnRetrieveFeedsIn super.onResume(); swipeRefreshLayout.setEnabled(true); boolean liveNotifications = sharedpreferences.getBoolean(Helper.SET_LIVE_NOTIFICATIONS, true); - if (type == RetrieveFeedsAsyncTask.Type.HOME|| type == RetrieveFeedsAsyncTask.Type.PF_HOME) { + if (type == RetrieveFeedsAsyncTask.Type.HOME || type == RetrieveFeedsAsyncTask.Type.PF_HOME) { if (getUserVisibleHint()) { if (statuses != null && statuses.size() > 0 && asyncTask.getStatus() != AsyncTask.Status.RUNNING) { retrieveMissingToots(statuses.get(0).getId()); @@ -777,7 +776,7 @@ public class DisplayStatusFragment extends Fragment implements OnRetrieveFeedsIn return; int liveNotifications = Helper.liveNotifType(context); //Store last toot id for home timeline to avoid to notify for those that have been already seen - if (type == RetrieveFeedsAsyncTask.Type.HOME|| type == RetrieveFeedsAsyncTask.Type.PF_HOME) { + if (type == RetrieveFeedsAsyncTask.Type.HOME || type == RetrieveFeedsAsyncTask.Type.PF_HOME) { if (visible) { if (statuses != null && statuses.size() > 0) { retrieveMissingToots(statuses.get(0).getId()); @@ -946,7 +945,7 @@ public class DisplayStatusFragment extends Fragment implements OnRetrieveFeedsIn else if (artListAdapter != null && instanceType.equals("ART")) artListAdapter.notifyItemRangeInserted(0, inserted); try { - if (type == RetrieveFeedsAsyncTask.Type.HOME|| type == RetrieveFeedsAsyncTask.Type.PF_HOME) + if (type == RetrieveFeedsAsyncTask.Type.HOME || type == RetrieveFeedsAsyncTask.Type.PF_HOME) ((MainActivity) context).updateHomeCounter(); else { if (type != RetrieveFeedsAsyncTask.Type.CONVERSATION) @@ -971,12 +970,11 @@ public class DisplayStatusFragment extends Fragment implements OnRetrieveFeedsIn if (apiResponse == null || (apiResponse.getError() != null && apiResponse.getError().getStatusCode() != 404)) { if (apiResponse == null) Toasty.error(context, context.getString(R.string.toast_error), Toast.LENGTH_LONG).show(); - else - if(apiResponse.getError().getError().length() < 100) { - Toasty.error(context, apiResponse.getError().getError(), Toast.LENGTH_LONG).show(); - }else{ - Toasty.error(context, getString(R.string.long_api_error,"\ud83d\ude05"), Toast.LENGTH_LONG).show(); - } + else if (apiResponse.getError().getError().length() < 100) { + Toasty.error(context, apiResponse.getError().getError(), Toast.LENGTH_LONG).show(); + } else { + Toasty.error(context, getString(R.string.long_api_error, "\ud83d\ude05"), Toast.LENGTH_LONG).show(); + } swipeRefreshLayout.setRefreshing(false); flag_loading = false; return; @@ -1031,9 +1029,9 @@ public class DisplayStatusFragment extends Fragment implements OnRetrieveFeedsIn StatusListAdapter.fetch_all_more = false; } this.statuses.addAll(position, tmpStatuses); - if( statusListAdapter != null) + if (statusListAdapter != null) statusListAdapter.notifyItemRangeInserted(position, tmpStatuses.size()); - if( pixelfedListAdapter != null) + if (pixelfedListAdapter != null) pixelfedListAdapter.notifyItemRangeInserted(position, tmpStatuses.size()); boolean display_content_after_fetch_more = sharedpreferences.getBoolean(Helper.SET_DISPLAY_CONTENT_AFTER_FM, true); if (position > 0 && display_content_after_fetch_more) @@ -1108,15 +1106,15 @@ public class DisplayStatusFragment extends Fragment implements OnRetrieveFeedsIn mainLoader.setVisibility(View.GONE); nextElementLoader.setVisibility(View.GONE); //Discards 404 - error which can often happen due to toots which have been deleted - if( context == null){ + if (context == null) { return; } if (apiResponse.getError() != null) { if (!apiResponse.getError().getError().startsWith("404 -")) - if(apiResponse.getError().getError().length() < 100) { + if (apiResponse.getError().getError().length() < 100) { Toasty.error(context, apiResponse.getError().getError(), Toast.LENGTH_LONG).show(); - }else{ - Toasty.error(context, getString(R.string.long_api_error,"\ud83d\ude05"), Toast.LENGTH_LONG).show(); + } else { + Toasty.error(context, getString(R.string.long_api_error, "\ud83d\ude05"), Toast.LENGTH_LONG).show(); } swipeRefreshLayout.setRefreshing(false); isSwipped = false; diff --git a/app/src/main/java/app/fedilab/android/fragments/MediaSliderFragment.java b/app/src/main/java/app/fedilab/android/fragments/MediaSliderFragment.java index b682bc5ed..22635d514 100644 --- a/app/src/main/java/app/fedilab/android/fragments/MediaSliderFragment.java +++ b/app/src/main/java/app/fedilab/android/fragments/MediaSliderFragment.java @@ -30,16 +30,17 @@ import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.WindowManager; -import android.webkit.WebView; import android.widget.FrameLayout; import android.widget.ImageButton; import android.widget.ImageView; import android.widget.ProgressBar; import android.widget.RelativeLayout; import android.widget.TextView; + import androidx.annotation.NonNull; import androidx.core.content.ContextCompat; import androidx.fragment.app.Fragment; + import com.bumptech.glide.Glide; import com.bumptech.glide.request.target.SimpleTarget; import com.bumptech.glide.request.transition.Transition; @@ -55,12 +56,16 @@ import com.google.android.exoplayer2.ui.SimpleExoPlayerView; import com.google.android.exoplayer2.upstream.DataSource; import com.google.android.exoplayer2.upstream.DefaultDataSourceFactory; import com.google.android.exoplayer2.util.Util; + import org.jetbrains.annotations.NotNull; + import java.security.KeyManagementException; import java.security.NoSuchAlgorithmException; import java.util.Timer; import java.util.TimerTask; + import javax.net.ssl.HttpsURLConnection; + import app.fedilab.android.R; import app.fedilab.android.activities.SlideMediaActivity; import app.fedilab.android.client.Entities.Attachment; @@ -83,17 +88,14 @@ import static cafe.adriel.androidaudiorecorder.Util.getDarkerColor; public class MediaSliderFragment extends Fragment implements MediaPlayer.OnCompletionListener { - + private static final Handler HANDLER = new Handler(); private Context context; private int mediaPosition; - - private SimpleExoPlayer player; private MediaPlayer playeraudio; private Timer timer; private int playerSecondsElapsed; private String url; - private RelativeLayout loader; private PhotoView imageView; private TextView message_ready; @@ -103,7 +105,6 @@ public class MediaSliderFragment extends Fragment implements MediaPlayer.OnCompl private TextView timerView; private ImageButton playView; private GLAudioVisualizationView visualizerView; - private static final Handler HANDLER = new Handler(); public MediaSliderFragment() { } @@ -164,12 +165,12 @@ public class MediaSliderFragment extends Fragment implements MediaPlayer.OnCompl public void onMatrixChanged(RectF rect) { canSwipe = (imageView.getScale() == 1); - if( !canSwipe){ - if( ! ((SlideMediaActivity)context).getFullScreen()) { + if (!canSwipe) { + if (!((SlideMediaActivity) context).getFullScreen()) { ((SlideMediaActivity) context).setFullscreen(true); } ((SlideMediaActivity) context).enableSliding(false); - }else{ + } else { ((SlideMediaActivity) context).enableSliding(true); } } @@ -262,29 +263,29 @@ public class MediaSliderFragment extends Fragment implements MediaPlayer.OnCompl break; case "web": loader.setVisibility(View.GONE); - webview_video = Helper.initializeWebview((Activity)context, R.id.webview_video); + webview_video = Helper.initializeWebview((Activity) context, R.id.webview_video); webview_video.setVisibility(View.VISIBLE); FrameLayout webview_container = rootView.findViewById(R.id.main_media_frame); final ViewGroup videoLayout = rootView.findViewById(R.id.videoLayout); - MastalabWebChromeClient mastalabWebChromeClient = new MastalabWebChromeClient((Activity)context, webview_video, webview_container, videoLayout); + MastalabWebChromeClient mastalabWebChromeClient = new MastalabWebChromeClient((Activity) context, webview_video, webview_container, videoLayout); mastalabWebChromeClient.setOnToggledFullscreen(new MastalabWebChromeClient.ToggledFullscreenCallback() { @Override public void toggledFullscreen(boolean fullscreen) { if (fullscreen) { videoLayout.setVisibility(View.VISIBLE); - WindowManager.LayoutParams attrs = ((Activity)context).getWindow().getAttributes(); + WindowManager.LayoutParams attrs = ((Activity) context).getWindow().getAttributes(); attrs.flags |= WindowManager.LayoutParams.FLAG_FULLSCREEN; attrs.flags |= WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON; - ((Activity)context).getWindow().setAttributes(attrs); - ((Activity)context).getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LOW_PROFILE); + ((Activity) context).getWindow().setAttributes(attrs); + ((Activity) context).getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LOW_PROFILE); } else { - WindowManager.LayoutParams attrs = ((Activity)context).getWindow().getAttributes(); + WindowManager.LayoutParams attrs = ((Activity) context).getWindow().getAttributes(); attrs.flags &= ~WindowManager.LayoutParams.FLAG_FULLSCREEN; attrs.flags &= ~WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON; - ((Activity)context).getWindow().setAttributes(attrs); - ((Activity)context).getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE); + ((Activity) context).getWindow().setAttributes(attrs); + ((Activity) context).getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE); videoLayout.setVisibility(View.GONE); } } @@ -294,7 +295,7 @@ public class MediaSliderFragment extends Fragment implements MediaPlayer.OnCompl webview_video.getSettings().setDomStorageEnabled(true); webview_video.getSettings().setAppCacheEnabled(true); webview_video.getSettings().setMediaPlaybackRequiresUserGesture(false); - webview_video.setWebViewClient(new MastalabWebViewClient((Activity)context)); + webview_video.setWebViewClient(new MastalabWebViewClient((Activity) context)); webview_video.loadUrl(attachment.getUrl()); break; case "audio": @@ -393,7 +394,7 @@ public class MediaSliderFragment extends Fragment implements MediaPlayer.OnCompl } private void updateTimer() { - ((Activity)context).runOnUiThread(new Runnable() { + ((Activity) context).runOnUiThread(new Runnable() { @Override public void run() { playerSecondsElapsed++; @@ -433,16 +434,12 @@ public class MediaSliderFragment extends Fragment implements MediaPlayer.OnCompl } - - - @Override public void onCreate(Bundle saveInstance) { super.onCreate(saveInstance); } - @Override public void onAttach(@NotNull Context context) { super.onAttach(context); @@ -497,7 +494,7 @@ public class MediaSliderFragment extends Fragment implements MediaPlayer.OnCompl } } - public boolean canSwipe(){ + public boolean canSwipe() { return canSwipe; } diff --git a/app/src/main/java/app/fedilab/android/fragments/SettingsPeertubeFragment.java b/app/src/main/java/app/fedilab/android/fragments/SettingsPeertubeFragment.java index 13f41c276..b881d605d 100644 --- a/app/src/main/java/app/fedilab/android/fragments/SettingsPeertubeFragment.java +++ b/app/src/main/java/app/fedilab/android/fragments/SettingsPeertubeFragment.java @@ -17,10 +17,6 @@ package app.fedilab.android.fragments; import android.content.Context; import android.content.SharedPreferences; import android.os.Bundle; - -import androidx.annotation.NonNull; -import androidx.fragment.app.Fragment; - import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -29,8 +25,11 @@ import android.widget.ArrayAdapter; import android.widget.CheckBox; import android.widget.Spinner; -import app.fedilab.android.helper.Helper; +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; + import app.fedilab.android.R; +import app.fedilab.android.helper.Helper; /** diff --git a/app/src/main/java/app/fedilab/android/fragments/TabLayoutNotificationsFragment.java b/app/src/main/java/app/fedilab/android/fragments/TabLayoutNotificationsFragment.java index 5f31a9df2..831e47473 100644 --- a/app/src/main/java/app/fedilab/android/fragments/TabLayoutNotificationsFragment.java +++ b/app/src/main/java/app/fedilab/android/fragments/TabLayoutNotificationsFragment.java @@ -19,29 +19,27 @@ import android.content.Context; import android.content.SharedPreferences; import android.graphics.PorterDuff; import android.os.Bundle; - -import androidx.annotation.NonNull; - -import com.google.android.material.tabs.TabLayout; - -import androidx.fragment.app.Fragment; -import androidx.fragment.app.FragmentManager; -import androidx.fragment.app.FragmentStatePagerAdapter; -import androidx.core.content.ContextCompat; -import androidx.viewpager.widget.ViewPager; - import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; +import androidx.annotation.NonNull; +import androidx.core.content.ContextCompat; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentStatePagerAdapter; +import androidx.viewpager.widget.ViewPager; + +import com.google.android.material.tabs.TabLayout; + import java.util.Objects; -import app.fedilab.android.helper.Helper; -import app.fedilab.android.helper.SwipeControledViewPager; import app.fedilab.android.R; import app.fedilab.android.activities.MainActivity; import app.fedilab.android.asynctasks.UpdateAccountInfoAsyncTask; +import app.fedilab.android.helper.Helper; +import app.fedilab.android.helper.SwipeControledViewPager; /** @@ -187,6 +185,24 @@ public class TabLayoutNotificationsFragment extends Fragment { this.context = context; } + public void refreshAll() { + if (viewPager == null) + return; + FragmentStatePagerAdapter a = (FragmentStatePagerAdapter) viewPager.getAdapter(); + if (a != null) { + DisplayNotificationsFragment notifAll = (DisplayNotificationsFragment) a.instantiateItem(viewPager, 0); + notifAll.refreshAll(); + } + } + + public void retrieveMissingNotifications(String sinceId) { + FragmentStatePagerAdapter a = (FragmentStatePagerAdapter) viewPager.getAdapter(); + if (a != null) { + DisplayNotificationsFragment notifAll = (DisplayNotificationsFragment) a.instantiateItem(viewPager, 0); + notifAll.retrieveMissingNotifications(sinceId); + } + } + /** * Page Adapter for settings */ @@ -252,22 +268,4 @@ public class TabLayoutNotificationsFragment extends Fragment { return mNumOfTabs; } } - - public void refreshAll() { - if (viewPager == null) - return; - FragmentStatePagerAdapter a = (FragmentStatePagerAdapter) viewPager.getAdapter(); - if (a != null) { - DisplayNotificationsFragment notifAll = (DisplayNotificationsFragment) a.instantiateItem(viewPager, 0); - notifAll.refreshAll(); - } - } - - public void retrieveMissingNotifications(String sinceId) { - FragmentStatePagerAdapter a = (FragmentStatePagerAdapter) viewPager.getAdapter(); - if (a != null) { - DisplayNotificationsFragment notifAll = (DisplayNotificationsFragment) a.instantiateItem(viewPager, 0); - notifAll.retrieveMissingNotifications(sinceId); - } - } } \ No newline at end of file diff --git a/app/src/main/java/app/fedilab/android/fragments/TabLayoutScheduleFragment.java b/app/src/main/java/app/fedilab/android/fragments/TabLayoutScheduleFragment.java index 39514c7db..66e75041b 100644 --- a/app/src/main/java/app/fedilab/android/fragments/TabLayoutScheduleFragment.java +++ b/app/src/main/java/app/fedilab/android/fragments/TabLayoutScheduleFragment.java @@ -15,20 +15,18 @@ package app.fedilab.android.fragments; * see . */ import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; import androidx.annotation.NonNull; - -import com.google.android.material.tabs.TabLayout; - import androidx.core.content.ContextCompat; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentStatePagerAdapter; import androidx.viewpager.widget.ViewPager; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; +import com.google.android.material.tabs.TabLayout; import java.util.Objects; diff --git a/app/src/main/java/app/fedilab/android/fragments/TabLayoutTootsFragment.java b/app/src/main/java/app/fedilab/android/fragments/TabLayoutTootsFragment.java index d5f965def..fe54ff24f 100644 --- a/app/src/main/java/app/fedilab/android/fragments/TabLayoutTootsFragment.java +++ b/app/src/main/java/app/fedilab/android/fragments/TabLayoutTootsFragment.java @@ -15,25 +15,22 @@ package app.fedilab.android.fragments; * see . */ import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; import androidx.annotation.NonNull; - -import com.google.android.material.tabs.TabLayout; - import androidx.core.content.ContextCompat; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentStatePagerAdapter; import androidx.viewpager.widget.ViewPager; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; +import com.google.android.material.tabs.TabLayout; import java.util.Objects; import app.fedilab.android.R; -import app.fedilab.android.activities.BaseMainActivity; import app.fedilab.android.activities.MainActivity; import app.fedilab.android.asynctasks.RetrieveFeedsAsyncTask; import app.fedilab.android.asynctasks.UpdateAccountInfoAsyncTask; @@ -93,6 +90,10 @@ public class TabLayoutTootsFragment extends Fragment { return inflatedView; } + public ViewPager getViewPager() { + return viewPager; + } + /** * Page Adapter for settings */ @@ -149,8 +150,4 @@ public class TabLayoutTootsFragment extends Fragment { return mNumOfTabs; } } - - public ViewPager getViewPager() { - return viewPager; - } } \ No newline at end of file diff --git a/app/src/main/java/app/fedilab/android/fragments/WhoToFollowFragment.java b/app/src/main/java/app/fedilab/android/fragments/WhoToFollowFragment.java index 7f751ef16..2f6baacdd 100644 --- a/app/src/main/java/app/fedilab/android/fragments/WhoToFollowFragment.java +++ b/app/src/main/java/app/fedilab/android/fragments/WhoToFollowFragment.java @@ -18,10 +18,6 @@ import android.content.Context; import android.content.SharedPreferences; import android.os.AsyncTask; import android.os.Bundle; - -import androidx.annotation.NonNull; -import androidx.fragment.app.Fragment; - import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -29,19 +25,22 @@ import android.widget.ListView; import android.widget.RelativeLayout; import android.widget.Toast; +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; + import org.jetbrains.annotations.NotNull; import java.util.Calendar; import java.util.Date; import java.util.List; +import app.fedilab.android.R; +import app.fedilab.android.asynctasks.WhoToFollowAsyncTask; import app.fedilab.android.client.Entities.TrunkAccount; import app.fedilab.android.drawers.WhoToFollowAdapter; import app.fedilab.android.helper.Helper; -import es.dmoral.toasty.Toasty; -import app.fedilab.android.R; -import app.fedilab.android.asynctasks.WhoToFollowAsyncTask; import app.fedilab.android.interfaces.OnRetrieveWhoToFollowInterface; +import es.dmoral.toasty.Toasty; /** diff --git a/app/src/main/java/app/fedilab/android/helper/CrossActions.java b/app/src/main/java/app/fedilab/android/helper/CrossActions.java index 07422e589..50cf6e353 100644 --- a/app/src/main/java/app/fedilab/android/helper/CrossActions.java +++ b/app/src/main/java/app/fedilab/android/helper/CrossActions.java @@ -23,26 +23,18 @@ import android.database.sqlite.SQLiteDatabase; import android.os.AsyncTask; import android.os.Build; import android.os.Bundle; +import android.text.Html; +import android.widget.Toast; import androidx.appcompat.app.AlertDialog; import androidx.recyclerview.widget.RecyclerView; -import android.text.Html; -import android.widget.Toast; - import java.lang.ref.WeakReference; import java.net.URI; import java.net.URISyntaxException; import java.util.ArrayList; import java.util.List; -import app.fedilab.android.client.API; -import app.fedilab.android.client.APIResponse; -import app.fedilab.android.client.Entities.Account; -import app.fedilab.android.client.Entities.Mention; -import app.fedilab.android.client.Entities.Results; -import app.fedilab.android.client.Entities.Status; -import es.dmoral.toasty.Toasty; import app.fedilab.android.R; import app.fedilab.android.activities.BaseActivity; import app.fedilab.android.activities.ShowAccountActivity; @@ -50,6 +42,12 @@ import app.fedilab.android.activities.ShowConversationActivity; import app.fedilab.android.activities.TootActivity; import app.fedilab.android.asynctasks.PostActionAsyncTask; import app.fedilab.android.asynctasks.RetrieveFeedsAsyncTask; +import app.fedilab.android.client.API; +import app.fedilab.android.client.APIResponse; +import app.fedilab.android.client.Entities.Account; +import app.fedilab.android.client.Entities.Mention; +import app.fedilab.android.client.Entities.Results; +import app.fedilab.android.client.Entities.Status; import app.fedilab.android.drawers.AccountsSearchAdapter; import app.fedilab.android.drawers.PixelfedListAdapter; import app.fedilab.android.drawers.StatusListAdapter; @@ -57,6 +55,7 @@ import app.fedilab.android.interfaces.OnPostActionInterface; import app.fedilab.android.sqlite.AccountDAO; import app.fedilab.android.sqlite.Sqlite; import app.fedilab.android.sqlite.StatusCacheDAO; +import es.dmoral.toasty.Toasty; /** * Will handle cross actions between accounts boost/favourites/pin and replies @@ -281,8 +280,8 @@ public class CrossActions { public static void followPeertubeChannel(final Context context, Account remoteAccount, OnPostActionInterface onPostActionInterface) { new AsyncTask() { - private WeakReference contextReference = new WeakReference<>(context); Results response; + private WeakReference contextReference = new WeakReference<>(context); @Override protected void onPreExecute() { @@ -320,8 +319,8 @@ public class CrossActions { Account account = new AccountDAO(context, db).getUniqAccount(userId, instance); new AsyncTask() { - private WeakReference contextReference = new WeakReference<>(context); Results response; + private WeakReference contextReference = new WeakReference<>(context); @Override protected void onPreExecute() { @@ -405,8 +404,8 @@ public class CrossActions { Account account = new AccountDAO(context, db).getUniqAccount(userId, instance); new AsyncTask() { - private WeakReference contextReference = new WeakReference<>(context); Results response; + private WeakReference contextReference = new WeakReference<>(context); @Override protected void onPreExecute() { @@ -447,8 +446,8 @@ public class CrossActions { Account account = new AccountDAO(context, db).getUniqAccount(userId, instance); new AsyncTask() { - private WeakReference contextReference = new WeakReference<>(context); Results response; + private WeakReference contextReference = new WeakReference<>(context); @Override protected void onPreExecute() { @@ -484,7 +483,7 @@ public class CrossActions { List accounts = connectedAccounts(context, status, false); API.StatusAction doAction; //Only bookmark the initial status - if( status.getReblog() != null){ + if (status.getReblog() != null) { status = status.getReblog(); } if (accounts.size() == 1 || limitedToOwner) { @@ -528,8 +527,8 @@ public class CrossActions { public void onClick(final DialogInterface dialog, int which) { final Account account = accountArray[which]; new AsyncTask() { - private WeakReference contextReference = new WeakReference<>(context); Results response; + private WeakReference contextReference = new WeakReference<>(context); @Override protected void onPreExecute() { diff --git a/app/src/main/java/app/fedilab/android/helper/CustomTextView.java b/app/src/main/java/app/fedilab/android/helper/CustomTextView.java index 53fcb1f0c..36dccfa19 100644 --- a/app/src/main/java/app/fedilab/android/helper/CustomTextView.java +++ b/app/src/main/java/app/fedilab/android/helper/CustomTextView.java @@ -20,14 +20,13 @@ import android.content.Context; import android.content.SharedPreferences; import android.content.res.TypedArray; import android.graphics.Paint; +import android.text.SpannableStringBuilder; +import android.util.AttributeSet; import androidx.annotation.DimenRes; import androidx.annotation.Px; import androidx.appcompat.widget.AppCompatTextView; -import android.text.SpannableStringBuilder; -import android.util.AttributeSet; - import com.vanniktech.emoji.EmojiManager; import app.fedilab.android.R; diff --git a/app/src/main/java/app/fedilab/android/helper/ExpandableHeightListView.java b/app/src/main/java/app/fedilab/android/helper/ExpandableHeightListView.java index 894ac5042..82a3b53e8 100644 --- a/app/src/main/java/app/fedilab/android/helper/ExpandableHeightListView.java +++ b/app/src/main/java/app/fedilab/android/helper/ExpandableHeightListView.java @@ -31,6 +31,10 @@ public class ExpandableHeightListView extends ListView { return expanded; } + public void setExpanded(@SuppressWarnings("SameParameterValue") boolean expanded) { + this.expanded = expanded; + } + @Override public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { // HACK! TAKE THAT ANDROID! @@ -47,8 +51,4 @@ public class ExpandableHeightListView extends ListView { super.onMeasure(widthMeasureSpec, heightMeasureSpec); } } - - public void setExpanded(@SuppressWarnings("SameParameterValue") boolean expanded) { - this.expanded = expanded; - } } \ No newline at end of file diff --git a/app/src/main/java/app/fedilab/android/helper/FilterToots.java b/app/src/main/java/app/fedilab/android/helper/FilterToots.java index 6d638415f..d1f535ac3 100644 --- a/app/src/main/java/app/fedilab/android/helper/FilterToots.java +++ b/app/src/main/java/app/fedilab/android/helper/FilterToots.java @@ -21,6 +21,19 @@ package app.fedilab.android.helper; public class FilterToots { + private typeFilter pinned = typeFilter.BOTH; + private typeFilter boosts = typeFilter.BOTH; + private typeFilter replies = typeFilter.BOTH; + private typeFilter media = typeFilter.BOTH; + private typeOrder order = typeOrder.DESC; + private boolean v_public = true; + private boolean v_unlisted = true; + private boolean v_direct = true; + private boolean v_private = true; + private String filter = null; + private String dateIni = null; + private String dateEnd = null; + public typeOrder getOrder() { return order; } @@ -29,34 +42,6 @@ public class FilterToots { this.order = order; } - public enum typeFilter { - NONE, - ONLY, - BOTH - } - - public enum typeOrder { - DESC, - ASC, - } - - private typeFilter pinned = typeFilter.BOTH; - private typeFilter boosts = typeFilter.BOTH; - private typeFilter replies = typeFilter.BOTH; - private typeFilter media = typeFilter.BOTH; - private typeOrder order = typeOrder.DESC; - - private boolean v_public = true; - private boolean v_unlisted = true; - private boolean v_direct = true; - private boolean v_private = true; - - private String filter = null; - - - private String dateIni = null; - private String dateEnd = null; - public typeFilter getPinned() { return pinned; } @@ -144,4 +129,15 @@ public class FilterToots { public void setDateEnd(String dateEnd) { this.dateEnd = dateEnd; } + + public enum typeFilter { + NONE, + ONLY, + BOTH + } + + public enum typeOrder { + DESC, + ASC, + } } diff --git a/app/src/main/java/app/fedilab/android/helper/FullScreenMediaController.java b/app/src/main/java/app/fedilab/android/helper/FullScreenMediaController.java index 72fec1349..18137caea 100644 --- a/app/src/main/java/app/fedilab/android/helper/FullScreenMediaController.java +++ b/app/src/main/java/app/fedilab/android/helper/FullScreenMediaController.java @@ -24,9 +24,9 @@ import android.widget.Button; import android.widget.ImageButton; import android.widget.MediaController; -import app.fedilab.android.client.Entities.Peertube; import app.fedilab.android.R; import app.fedilab.android.activities.PeertubeActivity; +import app.fedilab.android.client.Entities.Peertube; /** @@ -41,11 +41,6 @@ public class FullScreenMediaController extends MediaController { private Peertube peertube; private String resolutionVal; - public enum fullscreen { - OFF, - ON - } - public FullScreenMediaController(Context context) { super(context); this.context = context; @@ -133,4 +128,9 @@ public class FullScreenMediaController extends MediaController { fullScreen.setImageDrawable(resources.getDrawable(R.drawable.ic_fullscreen)); } } + + public enum fullscreen { + OFF, + ON + } } \ No newline at end of file diff --git a/app/src/main/java/app/fedilab/android/helper/Helper.java b/app/src/main/java/app/fedilab/android/helper/Helper.java index fa201bb83..24f4c2bef 100644 --- a/app/src/main/java/app/fedilab/android/helper/Helper.java +++ b/app/src/main/java/app/fedilab/android/helper/Helper.java @@ -61,22 +61,6 @@ import android.os.Environment; import android.provider.DocumentsContract; import android.provider.MediaStore; import android.provider.OpenableColumns; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.appcompat.widget.SwitchCompat; -import androidx.browser.customtabs.CustomTabsIntent; - -import com.google.android.material.navigation.NavigationView; - -import androidx.exifinterface.media.ExifInterface; -import androidx.core.app.NotificationCompat; -import androidx.core.app.NotificationManagerCompat; -import androidx.core.content.ContextCompat; -import androidx.core.graphics.drawable.DrawableCompat; -import androidx.appcompat.app.AlertDialog; -import androidx.preference.PreferenceManager; - import android.text.Html; import android.text.SpannableString; import android.text.Spanned; @@ -111,6 +95,18 @@ import android.widget.ScrollView; import android.widget.TextView; import android.widget.Toast; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.appcompat.app.AlertDialog; +import androidx.appcompat.widget.SwitchCompat; +import androidx.browser.customtabs.CustomTabsIntent; +import androidx.core.app.NotificationCompat; +import androidx.core.app.NotificationManagerCompat; +import androidx.core.content.ContextCompat; +import androidx.core.graphics.drawable.DrawableCompat; +import androidx.exifinterface.media.ExifInterface; +import androidx.preference.PreferenceManager; + import com.bumptech.glide.Glide; import com.bumptech.glide.load.DataSource; import com.bumptech.glide.load.engine.GlideException; @@ -121,13 +117,11 @@ import com.bumptech.glide.request.RequestOptions; import com.bumptech.glide.request.target.SimpleTarget; import com.bumptech.glide.request.target.Target; import com.bumptech.glide.request.transition.Transition; +import com.google.android.material.navigation.NavigationView; import com.google.android.material.tabs.TabLayout; import com.google.common.reflect.TypeToken; import com.google.gson.Gson; import com.iceteck.silicompressorr.SiliCompressor; -import com.jaredrummler.cyanea.Cyanea; -import com.jaredrummler.cyanea.prefs.CyaneaTheme; -import com.jaredrummler.materialspinner.MaterialSpinner; import com.oguzdev.circularfloatingactionmenu.library.FloatingActionButton; import com.oguzdev.circularfloatingactionmenu.library.FloatingActionMenu; import com.oguzdev.circularfloatingactionmenu.library.SubActionButton; @@ -195,8 +189,19 @@ import java.util.regex.Pattern; import javax.net.ssl.SSLContext; import app.fedilab.android.BuildConfig; +import app.fedilab.android.R; +import app.fedilab.android.activities.BaseMainActivity; +import app.fedilab.android.activities.HashTagActivity; +import app.fedilab.android.activities.LoginActivity; +import app.fedilab.android.activities.MainActivity; +import app.fedilab.android.activities.MainApplication; import app.fedilab.android.activities.MutedInstanceActivity; +import app.fedilab.android.activities.ShowAccountActivity; +import app.fedilab.android.activities.WebviewActivity; import app.fedilab.android.asynctasks.PostActionAsyncTask; +import app.fedilab.android.asynctasks.RemoveAccountAsyncTask; +import app.fedilab.android.asynctasks.RetrieveFeedsAsyncTask; +import app.fedilab.android.asynctasks.UpdateAccountInfoAsyncTask; import app.fedilab.android.client.API; import app.fedilab.android.client.APIResponse; import app.fedilab.android.client.Entities.Account; @@ -214,24 +219,13 @@ import app.fedilab.android.client.Entities.TagTimeline; import app.fedilab.android.client.Tls12SocketFactory; import app.fedilab.android.services.LiveNotificationDelayedService; import app.fedilab.android.services.LiveNotificationService; +import app.fedilab.android.sqlite.AccountDAO; import app.fedilab.android.sqlite.MainMenuDAO; +import app.fedilab.android.sqlite.Sqlite; import app.fedilab.android.sqlite.StatusCacheDAO; import app.fedilab.android.sqlite.TimelineCacheDAO; import app.fedilab.android.webview.CustomWebview; import es.dmoral.toasty.Toasty; -import app.fedilab.android.R; -import app.fedilab.android.activities.BaseMainActivity; -import app.fedilab.android.activities.HashTagActivity; -import app.fedilab.android.activities.LoginActivity; -import app.fedilab.android.activities.MainActivity; -import app.fedilab.android.activities.MainApplication; -import app.fedilab.android.activities.ShowAccountActivity; -import app.fedilab.android.activities.WebviewActivity; -import app.fedilab.android.asynctasks.RemoveAccountAsyncTask; -import app.fedilab.android.asynctasks.RetrieveFeedsAsyncTask; -import app.fedilab.android.asynctasks.UpdateAccountInfoAsyncTask; -import app.fedilab.android.sqlite.AccountDAO; -import app.fedilab.android.sqlite.Sqlite; import info.guardianproject.netcipher.client.StrongBuilder; import info.guardianproject.netcipher.client.StrongOkHttpClientBuilder; import okhttp3.ConnectionSpec; @@ -239,6 +233,7 @@ import okhttp3.OkHttpClient; import okhttp3.TlsVersion; import static android.content.Context.DOWNLOAD_SERVICE; +import static app.fedilab.android.activities.BaseMainActivity.filters; import static app.fedilab.android.activities.BaseMainActivity.mutedAccount; import static app.fedilab.android.activities.BaseMainActivity.regex_home; import static app.fedilab.android.activities.BaseMainActivity.regex_local; @@ -247,7 +242,6 @@ import static app.fedilab.android.helper.Helper.NotifType.MENTION; import static app.fedilab.android.sqlite.StatusCacheDAO.ARCHIVE_CACHE; import static app.fedilab.android.sqlite.StatusCacheDAO.BOOKMARK_CACHE; import static com.koushikdutta.async.util.StreamUtility.copyStream; -import static app.fedilab.android.activities.BaseMainActivity.filters; /** @@ -520,63 +514,76 @@ public class Helper { public static final String SET_YANDEX_API_KEY = "set_yandex_api_key"; public static final String SET_DEEPL_API_KEY = "set_deepl_api_key"; public static final String VIDEO_ID = "video_id_update"; - - private static boolean menuAccountsOpened = false; - - - private static final Pattern SHORTNAME_PATTERN = Pattern.compile(":( |)([-+\\w]+):"); - public static final Pattern urlPattern = Pattern.compile( "(?i)\\b((?:[a-z][\\w-]+:(?:/{1,3}|[a-z0-9%])|www\\d{0,3}[.]|[a-z0-9.\\-]+[.][a-z]{2,10}/)(?:[^\\s()<>]+|\\(([^\\s()<>]+|(\\([^\\s()<>]+\\)))*\\))+(?:\\(([^\\s()<>]+|(\\([^\\s()<>]+\\)))*\\)|[^\\s`!()\\[\\]{};:'\".,<>?«»“”‘’]))", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL); - public static final Pattern hashtagPattern = Pattern.compile("(#[\\w_A-zÀ-ÿ]+)"); public static final Pattern groupPattern = Pattern.compile("(\\![\\w_]+(\\s|$))"); public static final Pattern twitterPattern = Pattern.compile("((@[\\w]+)@twitter\\.com)"); - public static final Pattern youtubePattern = Pattern.compile("(www\\.|m\\.)?(youtube\\.com|youtu\\.be|youtube-nocookie\\.com)\\/(((?!(\"|'|<)).)*)"); public static final Pattern nitterPattern = Pattern.compile("(mobile\\.|www\\.)?twitter.com([\\w-/]+)"); - private static final Pattern mentionPattern = Pattern.compile("(@[\\w_]+(\\s|$))"); - private static final Pattern mentionLongPattern = Pattern.compile("(@[\\w_-]+@[a-z0-9.\\-]+[.][a-z]{2,10})"); - private static final Pattern mentionSearchPattern = Pattern.compile("(@[\\w_-]+@[a-z0-9.\\-]+|@[\\w_-]+)"); public static final Pattern xmppPattern = Pattern.compile("xmpp\\:[-a-zA-Z0-9+$&@#\\/%?=~_|!:,.;]*[-a-zA-Z0-9+&@#\\/%=~_|]"); - - //Default values public final static int DEFAULT_VIDEO_WIDTH = 640; public final static int DEFAULT_VIDEO_HEIGHT = 360; public final static int DEFAULT_VIDEO_BITRATE = 450000; + private static final Pattern SHORTNAME_PATTERN = Pattern.compile(":( |)([-+\\w]+):"); + private static final Pattern mentionPattern = Pattern.compile("(@[\\w_]+(\\s|$))"); + private static final Pattern mentionLongPattern = Pattern.compile("(@[\\w_-]+@[a-z0-9.\\-]+[.][a-z]{2,10})"); + private static final Pattern mentionSearchPattern = Pattern.compile("(@[\\w_-]+@[a-z0-9.\\-]+|@[\\w_-]+)"); + /* + * List from ClearUrls + * https://gitlab.com/KevinRoebert/ClearUrls/blob/master/data/data.min.json#L106 + */ + private static final String[] UTM_PARAMS = { + "utm_\\w+", + "ga_source", + "ga_medium", + "ga_term", + "ga_content", + "ga_campaign", + "ga_place", + "yclid", + "_openstat", + "fb_action_ids", + "fb_action_types", + "fb_source", + "fb_ref", + "fbclid", + "action_object_map", + "action_type_map", + "action_ref_map", + "gs_l", + "mkt_tok", + "hmb_campaign", + "hmb_medium", + "hmb_source", + "[\\?|&]ref[\\_]?" - //Event Type - public enum EventStreaming { - UPDATE, - NOTIFICATION, - DELETE, - NONE - } + }; + public static volatile boolean orbotConnected = false; + public static String[] ALPHA = {"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", + "s", "t", "u", "v", "w", "x", "y", "z", "1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "!", ",", "?", + ".", "'"}; + public static String[] MORSE = {".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "....", "..", ".---", "-.-", ".-..", + "--", "-.", "---", ".--.", "--.-", ".-.", "...", "-", "..-", "...-", ".--", "-..-", "-.--", "--..", ".----", + "..---", "...--", "....-", ".....", "-....", "--...", "---..", "----.", "-----", "-.-.--", "--..--", + "..--..", ".-.-.-", ".----.",}; + public static HashMap sleeps = new HashMap<>(); + private static boolean menuAccountsOpened = false; + //Emoji manager + private static Map emoji = new HashMap<>(); - public enum NotifType { - FOLLLOW, - MENTION, - BOOST, - FAV, - POLL, - BACKUP, - STORE, - TOOT - } - - - public static int liveNotifType(Context context){ + public static int liveNotifType(Context context) { SharedPreferences sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE); - boolean live = sharedpreferences.getBoolean(Helper.SET_LIVE_NOTIFICATIONS, false ); - boolean delayed = sharedpreferences.getBoolean(Helper.SET_DELAYED_NOTIFICATIONS, true ); - if( delayed){ + boolean live = sharedpreferences.getBoolean(Helper.SET_LIVE_NOTIFICATIONS, false); + boolean delayed = sharedpreferences.getBoolean(Helper.SET_DELAYED_NOTIFICATIONS, true); + if (delayed) { return Helper.NOTIF_DELAYED; - }else if( live ){ + } else if (live) { return Helper.NOTIF_LIVE; - }else { + } else { return Helper.NOTIF_NONE; } } @@ -612,15 +619,12 @@ public class Helper { return input; } - //Emoji manager - private static Map emoji = new HashMap<>(); - public static void fillMapEmoji(Context context) { try { BufferedReader br = new BufferedReader(new InputStreamReader(context.getAssets().open("emoji.csv"))); String line; while ((line = br.readLine()) != null) { - String str[] = line.split(","); + String[] str = line.split(","); String unicode = null; if (str.length == 2) unicode = new String(new int[]{Integer.parseInt(str[1].replace("0x", "").trim(), 16)}, 0, 1); @@ -734,7 +738,6 @@ public class Helper { } - /** * Convert String date from Mastodon * @@ -826,7 +829,7 @@ public class Helper { * @return String */ public static String longDateToString(Date date) { - DateFormat df = DateFormat.getDateTimeInstance(DateFormat.MEDIUM,DateFormat.SHORT, Locale.getDefault()); + DateFormat df = DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.SHORT, Locale.getDefault()); return df.format(date); } @@ -951,7 +954,6 @@ public class Helper { return (activeNetwork != null && activeNetwork.getType() == ConnectivityManager.TYPE_WIFI); } - public static String dateDiffFull(Date dateToot) { SimpleDateFormat df = (SimpleDateFormat) DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.MEDIUM, Locale.getDefault()); try { @@ -1063,7 +1065,6 @@ public class Helper { Toasty.success(context, message, Toast.LENGTH_LONG).show(); } - /** * Manage downloads with URLs * @@ -1115,8 +1116,6 @@ public class Helper { alert.show(); } - - /** * Manage downloads with URLs * @@ -1143,7 +1142,6 @@ public class Helper { return dm.enqueue(request); } - public static String getMimeType(String url) { String type = null; String extension = MimeTypeMap.getFileExtensionFromUrl(url); @@ -1153,7 +1151,6 @@ public class Helper { return type; } - public static boolean isNumeric(String str) { return str.matches("-?\\d+(\\.\\d+)?"); } @@ -1313,7 +1310,6 @@ public class Helper { notificationManager.notify(0, summaryNotification); } - /** * Manage downloads with URLs * @@ -1404,7 +1400,6 @@ public class Helper { } } - /** * Copy a file by transferring bytes from in to out * @@ -1461,7 +1456,6 @@ public class Helper { } } - /** * Converts dp to pixel * @@ -1475,7 +1469,6 @@ public class Helper { return dp * ((float) metrics.densityDpi / DisplayMetrics.DENSITY_DEFAULT); } - /** * Toggle for the menu (ie: main menu or accounts menu) * @@ -1731,7 +1724,6 @@ public class Helper { } } - /** * Changes the user in shared preferences * @@ -1776,13 +1768,12 @@ public class Helper { activity.startActivity(changeAccount); } - - public static int getNotificationIcon(Context context){ + public static int getNotificationIcon(Context context) { final SharedPreferences sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE); String logo = sharedpreferences.getString(Helper.LOGO_LAUNCHER, "bubbles"); switch (logo) { case "bubbles": - return R.drawable.ic_plain_bubbles; + return R.drawable.ic_plain_bubbles; case "fediverse": return R.drawable.ic_plain_fediverse; case "hero": @@ -1798,7 +1789,7 @@ public class Helper { } } - public static int getMainLogo(Context context){ + public static int getMainLogo(Context context) { final SharedPreferences sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE); String logo = sharedpreferences.getString(Helper.LOGO_LAUNCHER, "bubbles"); switch (logo) { @@ -1819,8 +1810,6 @@ public class Helper { } } - - @SuppressWarnings("SameParameterValue") private static Bitmap getRoundedCornerBitmap(Bitmap bitmap, int roundPixelSize) { Bitmap output = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Bitmap.Config.RGB_565); @@ -1835,7 +1824,6 @@ public class Helper { return output; } - public static Map sortByValue(Map map) { List> list = new LinkedList<>(map.entrySet()); Collections.sort(list, new Comparator() { @@ -1847,7 +1835,7 @@ public class Helper { Map result = new LinkedHashMap<>(); for (Iterator> it = list.iterator(); it.hasNext(); ) { - Map.Entry entry = (Map.Entry) it.next(); + Map.Entry entry = it.next(); result.put(entry.getKey(), entry.getValue()); } return result; @@ -1863,7 +1851,6 @@ public class Helper { loadGiF(activity, account.getAvatar(), imageView); } - public static SpannableString makeMentionsClick(final Context context, List mentions) { String cw_mention = ""; @@ -1875,7 +1862,7 @@ public class Helper { SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); int l_c = prefs.getInt("theme_link_color", -1); final SharedPreferences sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE); - if( l_c == -1) { + if (l_c == -1) { l_c = ThemeHelper.getAttColor(context, R.attr.linkColor); } final int link_color = l_c; @@ -2189,7 +2176,6 @@ public class Helper { }); } - /** * Retrieves the cache size * @@ -2233,7 +2219,6 @@ public class Helper { } } - /*** * Check if the account bio contents urls & tags and fills the content with ClickableSpan * Click on url => webview or external app @@ -2278,7 +2263,7 @@ public class Helper { SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); int l_c = prefs.getInt("theme_link_color", -1); - if( l_c == -1) { + if (l_c == -1) { l_c = ThemeHelper.getAttColor(context, R.attr.linkColor); } final int link_color = l_c; @@ -2419,7 +2404,6 @@ public class Helper { return spannableString; } - public static CustomWebview initializeWebview(Activity activity, int webviewId) { CustomWebview webView = activity.findViewById(webviewId); @@ -2458,7 +2442,6 @@ public class Helper { return webView; } - public static String md5(final String s) { final String MD5 = "MD5"; try { @@ -2466,7 +2449,7 @@ public class Helper { MessageDigest digest = java.security.MessageDigest .getInstance(MD5); digest.update(s.getBytes()); - byte messageDigest[] = digest.digest(); + byte[] messageDigest = digest.digest(); // Create Hex String StringBuilder hexString = new StringBuilder(); @@ -2494,13 +2477,13 @@ public class Helper { int color; try { color = Color.parseColor(context.getString(hexaColor)); - }catch (Resources.NotFoundException e){ + } catch (Resources.NotFoundException e) { try { TypedValue typedValue = new TypedValue(); Resources.Theme theme = context.getTheme(); theme.resolveAttribute(hexaColor, typedValue, true); color = typedValue.data; - }catch (Resources.NotFoundException ed) { + } catch (Resources.NotFoundException ed) { color = hexaColor; } } @@ -2522,7 +2505,7 @@ public class Helper { int color; try { color = context.getResources().getColor(hexaColor); - }catch (Resources.NotFoundException e){ + } catch (Resources.NotFoundException e) { color = hexaColor; } imageView.setColorFilter(color); @@ -2540,7 +2523,7 @@ public class Helper { int color; try { color = context.getResources().getColor(hexaColor); - }catch (Resources.NotFoundException e){ + } catch (Resources.NotFoundException e) { color = hexaColor; } imageButton.setColorFilter(color); @@ -2558,7 +2541,7 @@ public class Helper { int color; try { color = context.getResources().getColor(hexaColor); - }catch (Resources.NotFoundException e){ + } catch (Resources.NotFoundException e) { color = hexaColor; } button.setTextColor(color); @@ -2584,7 +2567,6 @@ public class Helper { return locale; } - /** * Compare date with these in shared pref. * @@ -2621,7 +2603,6 @@ public class Helper { } } - /** * Tells if the the service can notify depending of the current hour and minutes * @@ -2642,8 +2623,8 @@ public class Helper { Calendar now = Calendar.getInstance(); int hour = now.get(Calendar.HOUR_OF_DAY); int minute = now.get(Calendar.MINUTE); - String hourS = String.valueOf(hour).length() == 1 ? "0" + String.valueOf(hour) : String.valueOf(hour); - String minuteS = String.valueOf(minute).length() == 1 ? "0" + String.valueOf(minute) : String.valueOf(minute); + String hourS = String.valueOf(hour).length() == 1 ? "0" + hour : String.valueOf(hour); + String minuteS = String.valueOf(minute).length() == 1 ? "0" + minute : String.valueOf(minute); String currentDate = hourS + ":" + minuteS; try { Locale userLocale; @@ -2667,7 +2648,6 @@ public class Helper { } } - /** * Unserialized a * @@ -2698,7 +2678,6 @@ public class Helper { } } - /** * Unserialized a TagTimeline * @@ -2729,7 +2708,6 @@ public class Helper { } } - /** * Unserialized a RemoteInstance * @@ -2760,7 +2738,6 @@ public class Helper { } } - /** * Unserialized a Locale * @@ -2911,7 +2888,6 @@ public class Helper { } } - /** * Serialized a Account class * @@ -2944,7 +2920,6 @@ public class Helper { } } - /** * Serialized a List of Emojis class * @@ -2976,7 +2951,6 @@ public class Helper { } } - /** * Serialized a List of a Attachment class * @@ -3009,7 +2983,6 @@ public class Helper { } } - /** * Serialized a List of a Mention class * @@ -3041,7 +3014,6 @@ public class Helper { } } - /** * Serialized a List of a Tag class * @@ -3073,7 +3045,6 @@ public class Helper { } } - /** * Check if a job id is in array of ids * @@ -3090,7 +3061,6 @@ public class Helper { return false; } - public static void unCheckAllMenuItems(NavigationView navigationView) { navigationView.setCheckedItem(R.id.menu_none); unCheckAllMenuItemsRec(navigationView.getMenu()); @@ -3108,7 +3078,6 @@ public class Helper { } } - /** * Changes the menu layout * @@ -3142,7 +3111,6 @@ public class Helper { tableLayout.setVisibility(View.VISIBLE); } - /** * Get a bitmap from a view * @@ -3186,7 +3154,6 @@ public class Helper { return returnedBitmap; } - @SuppressLint("DefaultLocale") public static String withSuffix(long count) { if (count < 1000) return "" + count; @@ -3206,7 +3173,6 @@ public class Helper { "kMGTPE".charAt(exp - 1)); } - public static Bitmap addBorder(Bitmap resource, Context context) { int w = resource.getWidth(); int h = resource.getHeight(); @@ -3322,7 +3288,6 @@ public class Helper { } - /** * Manage URLs to open (built-in or external app) * @@ -3365,7 +3330,6 @@ public class Helper { } } - public static void installProvider() { boolean patch_provider = true; @@ -3383,18 +3347,11 @@ public class Helper { } } - - public enum MediaType { - MEDIA, - PROFILE - } - - public static String compressImagePath(Context context, android.net.Uri uriFile) { ContentResolver cr = context.getContentResolver(); String mime = cr.getType(uriFile); - File destinationDirectory = new File(context.getCacheDir().getAbsolutePath()+"/compress"); + File destinationDirectory = new File(context.getCacheDir().getAbsolutePath() + "/compress"); if (!destinationDirectory.exists()) { destinationDirectory.mkdirs(); } @@ -3424,40 +3381,41 @@ public class Helper { } SharedPreferences sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, android.content.Context.MODE_PRIVATE); boolean compressed = sharedpreferences.getBoolean(Helper.SET_PICTURE_COMPRESSED, true); - if( compressed) { + if (compressed) { try { return SiliCompressor.with(context).compress(uriFile.toString(), destinationDirectory); - }catch (Exception ignored){} + } catch (Exception ignored) { + } } } else { SharedPreferences sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, android.content.Context.MODE_PRIVATE); boolean compressed = sharedpreferences.getBoolean(Helper.SET_VIDEO_COMPRESSED, true); - if( compressed) { + if (compressed) { try { MediaMetadataRetriever retriever = new MediaMetadataRetriever(); - retriever.setDataSource(getRealPathFromURI(context,uriFile)); + retriever.setDataSource(getRealPathFromURI(context, uriFile)); int width = Integer.valueOf(retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_WIDTH)); int height = Integer.valueOf(retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_HEIGHT)); retriever.release(); int newHeight = height; - if( width > DEFAULT_VIDEO_WIDTH) { + if (width > DEFAULT_VIDEO_WIDTH) { newHeight = height * DEFAULT_VIDEO_WIDTH / width; } - return SiliCompressor.with(context).compressVideo(getRealPathFromURI(context,uriFile), context.getCacheDir().getAbsolutePath()+"/compress/", DEFAULT_VIDEO_WIDTH, newHeight, DEFAULT_VIDEO_BITRATE); - } catch (Exception ignored) { } + return SiliCompressor.with(context).compressVideo(getRealPathFromURI(context, uriFile), context.getCacheDir().getAbsolutePath() + "/compress/", DEFAULT_VIDEO_WIDTH, newHeight, DEFAULT_VIDEO_BITRATE); + } catch (Exception ignored) { + } } } return null; } - public static ByteArrayInputStream compressImage(Context context, android.net.Uri uriFile) { ContentResolver cr = context.getContentResolver(); String mime = cr.getType(uriFile); ByteArrayInputStream bs = null; - File destinationDirectory = new File(context.getCacheDir().getAbsolutePath()+"/compress"); + File destinationDirectory = new File(context.getCacheDir().getAbsolutePath() + "/compress"); if (!destinationDirectory.exists()) { destinationDirectory.mkdirs(); } @@ -3489,21 +3447,21 @@ public class Helper { } SharedPreferences sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, android.content.Context.MODE_PRIVATE); boolean compressed = sharedpreferences.getBoolean(Helper.SET_PICTURE_COMPRESSED, true); - if( compressed) { + if (compressed) { try { String filePath = SiliCompressor.with(context).compress(uriFile.toString(), destinationDirectory); resizedIS = new FileInputStream(filePath); - } catch (IOException|ArithmeticException e) { + } catch (IOException | ArithmeticException e) { e.printStackTrace(); } - if( resizedIS == null){ + if (resizedIS == null) { try { resizedIS = context.getContentResolver().openInputStream(uriFile); } catch (FileNotFoundException e) { e.printStackTrace(); } } - }else{ + } else { try { resizedIS = context.getContentResolver().openInputStream(uriFile); } catch (IOException e) { @@ -3526,19 +3484,19 @@ public class Helper { } else { SharedPreferences sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, android.content.Context.MODE_PRIVATE); boolean compressed = sharedpreferences.getBoolean(Helper.SET_VIDEO_COMPRESSED, true); - if( compressed) { + if (compressed) { String filePath = null; try { MediaMetadataRetriever retriever = new MediaMetadataRetriever(); - retriever.setDataSource(getRealPathFromURI(context,uriFile)); + retriever.setDataSource(getRealPathFromURI(context, uriFile)); int width = Integer.valueOf(retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_WIDTH)); int height = Integer.valueOf(retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_HEIGHT)); retriever.release(); int newHeight = height; - if( width > DEFAULT_VIDEO_WIDTH) { + if (width > DEFAULT_VIDEO_WIDTH) { newHeight = height * DEFAULT_VIDEO_WIDTH / width; } - filePath = SiliCompressor.with(context).compressVideo(getRealPathFromURI(context,uriFile), context.getCacheDir().getAbsolutePath()+"/compress/", DEFAULT_VIDEO_WIDTH, newHeight, DEFAULT_VIDEO_BITRATE); + filePath = SiliCompressor.with(context).compressVideo(getRealPathFromURI(context, uriFile), context.getCacheDir().getAbsolutePath() + "/compress/", DEFAULT_VIDEO_WIDTH, newHeight, DEFAULT_VIDEO_BITRATE); } catch (URISyntaxException e) { e.printStackTrace(); @@ -3549,14 +3507,14 @@ public class Helper { } catch (FileNotFoundException e) { e.printStackTrace(); } - if( resizedIS == null){ + if (resizedIS == null) { try { resizedIS = context.getContentResolver().openInputStream(uriFile); } catch (FileNotFoundException e) { e.printStackTrace(); } } - }else{ + } else { try { resizedIS = context.getContentResolver().openInputStream(uriFile); } catch (FileNotFoundException e) { @@ -3582,8 +3540,7 @@ public class Helper { return bs; } - - public static String getRealPathFromURI(Context context, Uri uri) throws URISyntaxException { + public static String getRealPathFromURI(Context context, Uri uri) throws URISyntaxException { String selection = null; String[] selectionArgs = null; // Uri is different in versions after KITKAT (Android 4.4), we need to @@ -3656,7 +3613,6 @@ public class Helper { return "com.google.android.apps.photos.content".equals(uri.getAuthority()); } - public static String getFileName(Context context, Uri uri) { ContentResolver resolver = context.getContentResolver(); Cursor returnCursor = @@ -3669,16 +3625,16 @@ public class Helper { returnCursor.close(); Random r = new Random(); int suf = r.nextInt(9999 - 1000) + 1000; - return String.valueOf(suf) + name; + return suf + name; } catch (Exception e) { Random r = new Random(); int suf = r.nextInt(9999 - 1000) + 1000; ContentResolver cr = context.getContentResolver(); String mime = cr.getType(uri); if (mime != null && mime.split("/").length > 1) - return "__" + String.valueOf(suf) + "." + mime.split("/")[1]; + return "__" + suf + "." + mime.split("/")[1]; else - return "__" + String.valueOf(suf) + ".jpg"; + return "__" + suf + ".jpg"; } } @@ -3697,7 +3653,6 @@ public class Helper { return bmToCompress; } - @SuppressWarnings({"WeakerAccess", "unused"}) public static void largeLog(String content) { if (content.length() > 4000) { @@ -3708,7 +3663,6 @@ public class Helper { } } - /** * Allows to split the toot by dot "." for sentences - adds number at the end automatically * @@ -3723,7 +3677,7 @@ public class Helper { ArrayList mentions = new ArrayList<>(); int mentionLength = 0; StringBuilder mentionString = new StringBuilder(); - if( reportMentions) { + if (reportMentions) { Matcher matcher = mentionLongPattern.matcher(content); while (matcher.find()) { String mentionLong = matcher.group(1); @@ -3767,11 +3721,11 @@ public class Helper { if (reply.size() > 1) { int i = 0; for (String r : reply) { - if (mentions.size() > 0 ) { + if (mentions.size() > 0) { String tmpMention = mentionString.toString(); for (String mention : mentions) { - if(r.contains(mention)){ - tmpMention = tmpMention.replace(mention,""); + if (r.contains(mention)) { + tmpMention = tmpMention.replace(mention, ""); } } reply.set(i, r + " " + tmpMention + " - " + (i + 1) + "/" + reply.size()); @@ -3784,7 +3738,6 @@ public class Helper { return reply; } - public static int countLength(String text) { if (text == null) { return 0; @@ -3805,7 +3758,6 @@ public class Helper { return text.length() - countWithEmoji(text); } - public static int countWithEmoji(String text) { int emojiCount = 0; for (int i = 0; i < text.length(); i++) { @@ -3890,11 +3842,9 @@ public class Helper { return false; } } - if (mutedAccount != null && mutedAccount.size() > 0 && (mutedAccount.contains(status.getAccount().getId()) || (status.getReblog() != null && mutedAccount.contains(status.getReblog().getAccount().getId()))) ) + if (mutedAccount != null && mutedAccount.size() > 0 && (mutedAccount.contains(status.getAccount().getId()) || (status.getReblog() != null && mutedAccount.contains(status.getReblog().getAccount().getId())))) return false; - if (status.isNotice()) - return false; - return true; + return !status.isNotice(); } public static void colorizeIconMenu(Menu menu, int toolbarIconsColor) { @@ -3941,7 +3891,6 @@ public class Helper { } } - public static String getLocalesTwoChars(int stringLocaleId) { switch (stringLocaleId) { case R.string.default_language: @@ -3997,7 +3946,6 @@ public class Helper { } } - public static int languageSpinnerPosition(Context context) { SharedPreferences sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, android.content.Context.MODE_PRIVATE); String defaultLocaleString = sharedpreferences.getString(Helper.SET_DEFAULT_LOCALE_NEW, "NOT_DEFINED"); @@ -4088,104 +4036,6 @@ public class Helper { return context.getResources().getBoolean(R.bool.isTablet); } - - public static class CacheTask extends AsyncTask { - private float cacheSize; - private WeakReference contextReference; - - public CacheTask(Context context) { - contextReference = new WeakReference<>(context); - } - - @Override - protected Void doInBackground(Void... params) { - long sizeCache = Helper.cacheSize(contextReference.get().getCacheDir().getParentFile()); - cacheSize = 0; - if (sizeCache > 0) { - cacheSize = (float) sizeCache / 1000000.0f; - } - return null; - } - - @Override - protected void onPostExecute(Void result) { - int style; - SharedPreferences sharedpreferences = contextReference.get().getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE); - final int theme = sharedpreferences.getInt(Helper.SET_THEME, Helper.THEME_DARK); - if (theme == Helper.THEME_DARK) { - style = R.style.DialogDark; - } else if (theme == Helper.THEME_BLACK) { - style = R.style.DialogBlack; - } else { - style = R.style.Dialog; - } - AlertDialog.Builder builder = new AlertDialog.Builder(contextReference.get(), style); - LayoutInflater inflater = ((MainActivity) contextReference.get()).getLayoutInflater(); - View dialogView = inflater.inflate(R.layout.popup_cache, new LinearLayout((MainActivity) contextReference.get()), false); - TextView message = dialogView.findViewById(R.id.message); - message.setText(contextReference.get().getString(R.string.cache_message, String.format("%s %s", String.format(Locale.getDefault(), "%.2f", cacheSize), contextReference.get().getString(R.string.cache_units)))); - builder.setView(dialogView); - builder.setTitle(R.string.cache_title); - final CheckBox cache_timeline = dialogView.findViewById(R.id.cache_timeline); - final CheckBox cache_owntoots = dialogView.findViewById(R.id.cache_owntoots); - final CheckBox cache_bookmarks = dialogView.findViewById(R.id.cache_bookmarks); - final SwitchCompat clean_all = dialogView.findViewById(R.id.clean_all); - final float finalCacheSize = cacheSize; - builder - .setPositiveButton(R.string.clear, new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int which) { - // continue with delete - AsyncTask.execute(new Runnable() { - @Override - public void run() { - try { - String path = contextReference.get().getCacheDir().getParentFile().getPath(); - File dir = new File(path); - if (dir.isDirectory()) { - Helper.deleteDir(dir); - } - SQLiteDatabase db = Sqlite.getInstance(contextReference.get(), Sqlite.DB_NAME, null, Sqlite.DB_VERSION).open(); - new StatusCacheDAO(contextReference.get(), db).removeDuplicate(); - if (clean_all.isChecked()) { - if (cache_timeline.isChecked()) { - new TimelineCacheDAO(contextReference.get(), db).removeAll(); - } - if (cache_owntoots.isChecked()) { - new StatusCacheDAO(contextReference.get(), db).removeAll(ARCHIVE_CACHE); - } - if (cache_bookmarks.isChecked()) { - new StatusCacheDAO(contextReference.get(), db).removeAll(BOOKMARK_CACHE); - } - } else { - if (cache_timeline.isChecked()) { - new TimelineCacheDAO(contextReference.get(), db).removeAllConnected(); - } - if (cache_owntoots.isChecked()) { - new StatusCacheDAO(contextReference.get(), db).removeAllStatus(ARCHIVE_CACHE); - } - if (cache_bookmarks.isChecked()) { - new StatusCacheDAO(contextReference.get(), db).removeAllStatus(BOOKMARK_CACHE); - } - } - } catch (Exception ignored) { - } - } - }); - Toasty.success(contextReference.get(), contextReference.get().getString(R.string.toast_cache_clear, String.format("%s %s", String.format(Locale.getDefault(), "%.2f", finalCacheSize), contextReference.get().getString(R.string.cache_units))), Toast.LENGTH_LONG).show(); - dialog.dismiss(); - } - }) - .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int which) { - dialog.dismiss(); - } - }) - .setIcon(android.R.drawable.ic_dialog_alert) - .show(); - } - } - - public static String getFilePathFromURI(Context context, Uri contentUri) { //copy file and send new file path String fileName = getFileName(contentUri); @@ -4221,38 +4071,6 @@ public class Helper { } } - - /* - * List from ClearUrls - * https://gitlab.com/KevinRoebert/ClearUrls/blob/master/data/data.min.json#L106 - */ - private static final String[] UTM_PARAMS = { - "utm_\\w+", - "ga_source", - "ga_medium", - "ga_term", - "ga_content", - "ga_campaign", - "ga_place", - "yclid", - "_openstat", - "fb_action_ids", - "fb_action_types", - "fb_source", - "fb_ref", - "fbclid", - "action_object_map", - "action_type_map", - "action_ref_map", - "gs_l", - "mkt_tok", - "hmb_campaign", - "hmb_medium", - "hmb_source", - "[\\?|&]ref[\\_]?" - - }; - public static String remove_tracking_param(String original_content) { if (original_content == null) return original_content; @@ -4377,9 +4195,6 @@ public class Helper { return Uri.parse(path); } - - public static volatile boolean orbotConnected = false; - public static void initNetCipher(Context context) { Context appContext = context.getApplicationContext(); @@ -4410,7 +4225,6 @@ public class Helper { } } - public static OkHttpClient getHttpClient(Context context) { SharedPreferences sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE); boolean proxyEnabled = sharedpreferences.getBoolean(Helper.SET_PROXY_ENABLED, false); @@ -4447,7 +4261,7 @@ public class Helper { } catch (Exception e) { proxy = null; } - if( proxy != null) { + if (proxy != null) { clientBuilder.proxy(proxy); } } @@ -4478,7 +4292,6 @@ public class Helper { return client; } - public static void exportInstanceBlock(Context context, String username) { String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.ENGLISH).format(new Date()); @@ -4488,8 +4301,8 @@ public class Helper { new AsyncTask>() { - private WeakReference contextReference = new WeakReference<>(context); APIResponse apiResponse; + private WeakReference contextReference = new WeakReference<>(context); @Override protected void onPreExecute() { @@ -4599,7 +4412,6 @@ public class Helper { }.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); } - public static void importInstanceBlock(Context context, HashMap instances) { @@ -4679,8 +4491,8 @@ public class Helper { alertDialog.show(); new AsyncTask>() { - private WeakReference contextReference = new WeakReference<>(context); APIResponse apiResponse; + private WeakReference contextReference = new WeakReference<>(context); @Override protected void onPreExecute() { @@ -4704,15 +4516,6 @@ public class Helper { } - - public static String[] ALPHA = {"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", - "s", "t", "u", "v", "w", "x", "y", "z", "1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "!", ",", "?", - ".", "'"}; - public static String[] MORSE = {".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "....", "..", ".---", "-.-", ".-..", - "--", "-.", "---", ".--.", "--.-", ".-.", "...", "-", "..-", "...-", ".--", "-..-", "-.--", "--..", ".----", - "..---", "...--", "....-", ".....", "-....", "--...", "---..", "----.", "-----", "-.-.--", "--..--", - "..--..", ".-.-.-", ".----.",}; - public static Bitmap drawableToBitmap(Drawable drawable) { Bitmap bitmap; @@ -4735,12 +4538,10 @@ public class Helper { return bitmap; } - public static HashMap sleeps = new HashMap<>(); - public static void startStreaming(Context context) { int liveNotifications = Helper.liveNotifType(context); Intent streamingIntent = null; - switch (liveNotifications){ + switch (liveNotifications) { case Helper.NOTIF_LIVE: streamingIntent = new Intent(context, LiveNotificationService.class); break; @@ -4748,7 +4549,7 @@ public class Helper { streamingIntent = new Intent(context, LiveNotificationDelayedService.class); break; } - if( streamingIntent != null) { + if (streamingIntent != null) { try { if (Build.VERSION.SDK_INT >= 26) { context.startForegroundService(streamingIntent); @@ -4756,14 +4557,14 @@ public class Helper { context.startService(streamingIntent); } context.startService(streamingIntent); - } catch (Exception ignored) {} + } catch (Exception ignored) { + } } } - - public static boolean canFetchList(Context context, Account account){ + public static boolean canFetchList(Context context, Account account) { SharedPreferences sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE); - String lastDateListRefresh = sharedpreferences.getString(Helper.LAST_DATE_LIST_FETCH+account.getId()+account.getInstance(), null); + String lastDateListRefresh = sharedpreferences.getString(Helper.LAST_DATE_LIST_FETCH + account.getId() + account.getInstance(), null); Calendar cal = Calendar.getInstance(); cal.setTime(new Date()); cal.add(Calendar.HOUR, -24); @@ -4772,9 +4573,9 @@ public class Helper { return (lastRefresh == null || lastRefresh.before(dateAllowed)); } - public static UpdateAccountInfoAsyncTask.SOCIAL setSoftware(String social, boolean updateSocial){ + public static UpdateAccountInfoAsyncTask.SOCIAL setSoftware(String social, boolean updateSocial) { //Update the static variable which manages account type - if( updateSocial) { + if (updateSocial) { if (social == null || social.equals("MASTODON")) MainActivity.social = UpdateAccountInfoAsyncTask.SOCIAL.MASTODON; else if (social.equals("PEERTUBE")) @@ -4804,4 +4605,125 @@ public class Helper { return socialNetwork; } + //Event Type + public enum EventStreaming { + UPDATE, + NOTIFICATION, + DELETE, + NONE + } + + public enum NotifType { + FOLLLOW, + MENTION, + BOOST, + FAV, + POLL, + BACKUP, + STORE, + TOOT + } + + + public enum MediaType { + MEDIA, + PROFILE + } + + public static class CacheTask extends AsyncTask { + private float cacheSize; + private WeakReference contextReference; + + public CacheTask(Context context) { + contextReference = new WeakReference<>(context); + } + + @Override + protected Void doInBackground(Void... params) { + long sizeCache = Helper.cacheSize(contextReference.get().getCacheDir().getParentFile()); + cacheSize = 0; + if (sizeCache > 0) { + cacheSize = (float) sizeCache / 1000000.0f; + } + return null; + } + + @Override + protected void onPostExecute(Void result) { + int style; + SharedPreferences sharedpreferences = contextReference.get().getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE); + final int theme = sharedpreferences.getInt(Helper.SET_THEME, Helper.THEME_DARK); + if (theme == Helper.THEME_DARK) { + style = R.style.DialogDark; + } else if (theme == Helper.THEME_BLACK) { + style = R.style.DialogBlack; + } else { + style = R.style.Dialog; + } + AlertDialog.Builder builder = new AlertDialog.Builder(contextReference.get(), style); + LayoutInflater inflater = ((MainActivity) contextReference.get()).getLayoutInflater(); + View dialogView = inflater.inflate(R.layout.popup_cache, new LinearLayout(contextReference.get()), false); + TextView message = dialogView.findViewById(R.id.message); + message.setText(contextReference.get().getString(R.string.cache_message, String.format("%s %s", String.format(Locale.getDefault(), "%.2f", cacheSize), contextReference.get().getString(R.string.cache_units)))); + builder.setView(dialogView); + builder.setTitle(R.string.cache_title); + final CheckBox cache_timeline = dialogView.findViewById(R.id.cache_timeline); + final CheckBox cache_owntoots = dialogView.findViewById(R.id.cache_owntoots); + final CheckBox cache_bookmarks = dialogView.findViewById(R.id.cache_bookmarks); + final SwitchCompat clean_all = dialogView.findViewById(R.id.clean_all); + final float finalCacheSize = cacheSize; + builder + .setPositiveButton(R.string.clear, new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + // continue with delete + AsyncTask.execute(new Runnable() { + @Override + public void run() { + try { + String path = contextReference.get().getCacheDir().getParentFile().getPath(); + File dir = new File(path); + if (dir.isDirectory()) { + Helper.deleteDir(dir); + } + SQLiteDatabase db = Sqlite.getInstance(contextReference.get(), Sqlite.DB_NAME, null, Sqlite.DB_VERSION).open(); + new StatusCacheDAO(contextReference.get(), db).removeDuplicate(); + if (clean_all.isChecked()) { + if (cache_timeline.isChecked()) { + new TimelineCacheDAO(contextReference.get(), db).removeAll(); + } + if (cache_owntoots.isChecked()) { + new StatusCacheDAO(contextReference.get(), db).removeAll(ARCHIVE_CACHE); + } + if (cache_bookmarks.isChecked()) { + new StatusCacheDAO(contextReference.get(), db).removeAll(BOOKMARK_CACHE); + } + } else { + if (cache_timeline.isChecked()) { + new TimelineCacheDAO(contextReference.get(), db).removeAllConnected(); + } + if (cache_owntoots.isChecked()) { + new StatusCacheDAO(contextReference.get(), db).removeAllStatus(ARCHIVE_CACHE); + } + if (cache_bookmarks.isChecked()) { + new StatusCacheDAO(contextReference.get(), db).removeAllStatus(BOOKMARK_CACHE); + } + } + } catch (Exception ignored) { + } + } + }); + Toasty.success(contextReference.get(), contextReference.get().getString(R.string.toast_cache_clear, String.format("%s %s", String.format(Locale.getDefault(), "%.2f", finalCacheSize), contextReference.get().getString(R.string.cache_units))), Toast.LENGTH_LONG).show(); + dialog.dismiss(); + } + }) + .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); + } + }) + .setIcon(android.R.drawable.ic_dialog_alert) + .show(); + } + } + } diff --git a/app/src/main/java/app/fedilab/android/helper/MastalabAutoCompleteTextView.java b/app/src/main/java/app/fedilab/android/helper/MastalabAutoCompleteTextView.java index 8f58ed311..06665b5f3 100644 --- a/app/src/main/java/app/fedilab/android/helper/MastalabAutoCompleteTextView.java +++ b/app/src/main/java/app/fedilab/android/helper/MastalabAutoCompleteTextView.java @@ -5,14 +5,13 @@ import android.content.Context; import android.content.SharedPreferences; import android.content.res.TypedArray; import android.graphics.Paint; +import android.util.AttributeSet; +import android.view.KeyEvent; import androidx.annotation.CallSuper; import androidx.annotation.DimenRes; import androidx.annotation.Px; -import android.util.AttributeSet; -import android.view.KeyEvent; - import com.vanniktech.emoji.EmojiManager; import com.vanniktech.emoji.emoji.Emoji; @@ -77,6 +76,11 @@ public class MastalabAutoCompleteTextView extends androidx.appcompat.widget.AppC return emojiSize; } + @Override + public final void setEmojiSize(@Px final int pixels) { + setEmojiSize(pixels, true); + } + @Override @CallSuper public void input(final Emoji emoji) { @@ -92,11 +96,6 @@ public class MastalabAutoCompleteTextView extends androidx.appcompat.widget.AppC } } - @Override - public final void setEmojiSize(@Px final int pixels) { - setEmojiSize(pixels, true); - } - @Override public final void setEmojiSize(@Px final int pixels, final boolean shouldInvalidate) { emojiSize = pixels; diff --git a/app/src/main/java/app/fedilab/android/helper/RecyclerItemClickListener.java b/app/src/main/java/app/fedilab/android/helper/RecyclerItemClickListener.java index 9ea08407a..8c4a16e06 100644 --- a/app/src/main/java/app/fedilab/android/helper/RecyclerItemClickListener.java +++ b/app/src/main/java/app/fedilab/android/helper/RecyclerItemClickListener.java @@ -16,11 +16,6 @@ import org.jetbrains.annotations.NotNull; */ public class RecyclerItemClickListener implements RecyclerView.OnItemTouchListener { private final OnItemClickListener mListener; - - public interface OnItemClickListener { - void onItemClick(View view, int position); - } - private final GestureDetector mGestureDetector; public RecyclerItemClickListener(Context context, OnItemClickListener listener) { @@ -50,4 +45,8 @@ public class RecyclerItemClickListener implements RecyclerView.OnItemTouchListen public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) { // do nothing } + + public interface OnItemClickListener { + void onItemClick(View view, int position); + } } \ No newline at end of file diff --git a/app/src/main/java/app/fedilab/android/helper/SwipeControledViewPager.java b/app/src/main/java/app/fedilab/android/helper/SwipeControledViewPager.java index 5627e1f2c..9f3cef164 100644 --- a/app/src/main/java/app/fedilab/android/helper/SwipeControledViewPager.java +++ b/app/src/main/java/app/fedilab/android/helper/SwipeControledViewPager.java @@ -16,11 +16,10 @@ package app.fedilab.android.helper; * see . */ import android.content.Context; +import android.util.AttributeSet; import androidx.viewpager.widget.ViewPager; -import android.util.AttributeSet; - public class SwipeControledViewPager extends ViewPager { private boolean enableSwipe; diff --git a/app/src/main/java/app/fedilab/android/helper/ThemeHelper.java b/app/src/main/java/app/fedilab/android/helper/ThemeHelper.java index 39d91b8d3..db63cad09 100644 --- a/app/src/main/java/app/fedilab/android/helper/ThemeHelper.java +++ b/app/src/main/java/app/fedilab/android/helper/ThemeHelper.java @@ -6,19 +6,17 @@ import android.content.SharedPreferences; import android.content.res.Resources; import android.util.TypedValue; - - import static android.content.Context.MODE_PRIVATE; public class ThemeHelper { - public static void changeTheme(Context context, int theme){ + public static void changeTheme(Context context, int theme) { final SharedPreferences sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, MODE_PRIVATE); } - public static int getAttColor(Context context, int attColor){ + public static int getAttColor(Context context, int attColor) { TypedValue typedValue = new TypedValue(); Resources.Theme theme = context.getTheme(); theme.resolveAttribute(attColor, typedValue, true); diff --git a/app/src/main/java/app/fedilab/android/helper/itemtouchhelper/ItemTouchHelperAdapter.java b/app/src/main/java/app/fedilab/android/helper/itemtouchhelper/ItemTouchHelperAdapter.java index 68f72b9e3..4c3517fc0 100644 --- a/app/src/main/java/app/fedilab/android/helper/itemtouchhelper/ItemTouchHelperAdapter.java +++ b/app/src/main/java/app/fedilab/android/helper/itemtouchhelper/ItemTouchHelperAdapter.java @@ -17,8 +17,8 @@ package app.fedilab.android.helper.itemtouchhelper; */ -import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.ItemTouchHelper; +import androidx.recyclerview.widget.RecyclerView; /** * Interface to listen for a move or dismissal event from a {@link ItemTouchHelper.Callback}. diff --git a/app/src/main/java/app/fedilab/android/helper/itemtouchhelper/SimpleItemTouchHelperCallback.java b/app/src/main/java/app/fedilab/android/helper/itemtouchhelper/SimpleItemTouchHelperCallback.java index 9b38b06b5..f929d9d02 100644 --- a/app/src/main/java/app/fedilab/android/helper/itemtouchhelper/SimpleItemTouchHelperCallback.java +++ b/app/src/main/java/app/fedilab/android/helper/itemtouchhelper/SimpleItemTouchHelperCallback.java @@ -20,8 +20,8 @@ package app.fedilab.android.helper.itemtouchhelper; import android.graphics.Canvas; import androidx.recyclerview.widget.GridLayoutManager; -import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.ItemTouchHelper; +import androidx.recyclerview.widget.RecyclerView; import org.jetbrains.annotations.NotNull; diff --git a/app/src/main/java/app/fedilab/android/imageeditor/ColorPickerAdapter.java b/app/src/main/java/app/fedilab/android/imageeditor/ColorPickerAdapter.java index 33c9f4156..7356faf95 100644 --- a/app/src/main/java/app/fedilab/android/imageeditor/ColorPickerAdapter.java +++ b/app/src/main/java/app/fedilab/android/imageeditor/ColorPickerAdapter.java @@ -7,15 +7,14 @@ import android.graphics.drawable.Drawable; import android.graphics.drawable.LayerDrawable; import android.graphics.drawable.ShapeDrawable; import android.graphics.drawable.shapes.OvalShape; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; import androidx.annotation.NonNull; import androidx.core.content.ContextCompat; import androidx.recyclerview.widget.RecyclerView; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; - import java.util.ArrayList; import java.util.List; @@ -44,6 +43,23 @@ public class ColorPickerAdapter extends RecyclerView.Adapter getDefaultColors(Context context) { + ArrayList colorPickerColors = new ArrayList<>(); + colorPickerColors.add(ContextCompat.getColor(context, R.color.blue_color_picker)); + colorPickerColors.add(ContextCompat.getColor(context, R.color.brown_color_picker)); + colorPickerColors.add(ContextCompat.getColor(context, R.color.green_color_picker)); + colorPickerColors.add(ContextCompat.getColor(context, R.color.orange_color_picker)); + colorPickerColors.add(ContextCompat.getColor(context, R.color.red_color_picker)); + colorPickerColors.add(ContextCompat.getColor(context, R.color.black)); + colorPickerColors.add(ContextCompat.getColor(context, R.color.red_orange_color_picker)); + colorPickerColors.add(ContextCompat.getColor(context, R.color.sky_blue_color_picker)); + colorPickerColors.add(ContextCompat.getColor(context, R.color.violet_color_picker)); + colorPickerColors.add(ContextCompat.getColor(context, R.color.white)); + colorPickerColors.add(ContextCompat.getColor(context, R.color.yellow_color_picker)); + colorPickerColors.add(ContextCompat.getColor(context, R.color.yellow_green_color_picker)); + return colorPickerColors; + } + @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = inflater.inflate(R.layout.color_picker_item_list, parent, false); @@ -86,6 +102,10 @@ public class ColorPickerAdapter extends RecyclerView.Adapter getDefaultColors(Context context) { - ArrayList colorPickerColors = new ArrayList<>(); - colorPickerColors.add(ContextCompat.getColor(context, R.color.blue_color_picker)); - colorPickerColors.add(ContextCompat.getColor(context, R.color.brown_color_picker)); - colorPickerColors.add(ContextCompat.getColor(context, R.color.green_color_picker)); - colorPickerColors.add(ContextCompat.getColor(context, R.color.orange_color_picker)); - colorPickerColors.add(ContextCompat.getColor(context, R.color.red_color_picker)); - colorPickerColors.add(ContextCompat.getColor(context, R.color.black)); - colorPickerColors.add(ContextCompat.getColor(context, R.color.red_orange_color_picker)); - colorPickerColors.add(ContextCompat.getColor(context, R.color.sky_blue_color_picker)); - colorPickerColors.add(ContextCompat.getColor(context, R.color.violet_color_picker)); - colorPickerColors.add(ContextCompat.getColor(context, R.color.white)); - colorPickerColors.add(ContextCompat.getColor(context, R.color.yellow_color_picker)); - colorPickerColors.add(ContextCompat.getColor(context, R.color.yellow_green_color_picker)); - return colorPickerColors; - } } \ No newline at end of file diff --git a/app/src/main/java/app/fedilab/android/imageeditor/EmojiBSFragment.java b/app/src/main/java/app/fedilab/android/imageeditor/EmojiBSFragment.java index fb2bbfd1a..894875914 100644 --- a/app/src/main/java/app/fedilab/android/imageeditor/EmojiBSFragment.java +++ b/app/src/main/java/app/fedilab/android/imageeditor/EmojiBSFragment.java @@ -2,21 +2,19 @@ package app.fedilab.android.imageeditor; import android.annotation.SuppressLint; import android.app.Dialog; - -import androidx.annotation.NonNull; - -import com.google.android.material.bottomsheet.BottomSheetBehavior; -import com.google.android.material.bottomsheet.BottomSheetDialogFragment; - -import androidx.coordinatorlayout.widget.CoordinatorLayout; -import androidx.recyclerview.widget.GridLayoutManager; -import androidx.recyclerview.widget.RecyclerView; - import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; +import androidx.annotation.NonNull; +import androidx.coordinatorlayout.widget.CoordinatorLayout; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.google.android.material.bottomsheet.BottomSheetBehavior; +import com.google.android.material.bottomsheet.BottomSheetDialogFragment; + import org.jetbrains.annotations.NotNull; import java.util.ArrayList; @@ -26,16 +24,7 @@ import ja.burhanrashid52.photoeditor.PhotoEditor; public class EmojiBSFragment extends BottomSheetDialogFragment { - public EmojiBSFragment() { - // Required empty public constructor - } - private EmojiListener mEmojiListener; - - public interface EmojiListener { - void onEmojiClick(String emojiUnicode); - } - private BottomSheetBehavior.BottomSheetCallback mBottomSheetBehaviorCallback = new BottomSheetBehavior.BottomSheetCallback() { @Override @@ -51,6 +40,10 @@ public class EmojiBSFragment extends BottomSheetDialogFragment { } }; + public EmojiBSFragment() { + // Required empty public constructor + } + @SuppressLint("RestrictedApi") @Override public void setupDialog(Dialog dialog, int style) { @@ -76,6 +69,9 @@ public class EmojiBSFragment extends BottomSheetDialogFragment { mEmojiListener = emojiListener; } + public interface EmojiListener { + void onEmojiClick(String emojiUnicode); + } public class EmojiAdapter extends RecyclerView.Adapter { diff --git a/app/src/main/java/app/fedilab/android/imageeditor/PropertiesBSFragment.java b/app/src/main/java/app/fedilab/android/imageeditor/PropertiesBSFragment.java index 235af1689..0142c03ac 100644 --- a/app/src/main/java/app/fedilab/android/imageeditor/PropertiesBSFragment.java +++ b/app/src/main/java/app/fedilab/android/imageeditor/PropertiesBSFragment.java @@ -1,20 +1,18 @@ package app.fedilab.android.imageeditor; import android.os.Bundle; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; - -import com.google.android.material.bottomsheet.BottomSheetDialogFragment; - -import androidx.recyclerview.widget.LinearLayoutManager; -import androidx.recyclerview.widget.RecyclerView; - import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.SeekBar; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.google.android.material.bottomsheet.BottomSheetDialogFragment; + import org.jetbrains.annotations.NotNull; import java.util.Objects; @@ -23,18 +21,10 @@ import app.fedilab.android.R; public class PropertiesBSFragment extends BottomSheetDialogFragment implements SeekBar.OnSeekBarChangeListener { - public PropertiesBSFragment() { - // Required empty public constructor - } - private Properties mProperties; - public interface Properties { - void onColorChanged(int colorCode); - - void onOpacityChanged(int opacity); - - void onBrushSizeChanged(int brushSize); + public PropertiesBSFragment() { + // Required empty public constructor } @Override @@ -102,4 +92,12 @@ public class PropertiesBSFragment extends BottomSheetDialogFragment implements S public void onStopTrackingTouch(SeekBar seekBar) { } + + public interface Properties { + void onColorChanged(int colorCode); + + void onOpacityChanged(int opacity); + + void onBrushSizeChanged(int brushSize); + } } diff --git a/app/src/main/java/app/fedilab/android/imageeditor/StickerBSFragment.java b/app/src/main/java/app/fedilab/android/imageeditor/StickerBSFragment.java index b652877c7..e87a1ab37 100644 --- a/app/src/main/java/app/fedilab/android/imageeditor/StickerBSFragment.java +++ b/app/src/main/java/app/fedilab/android/imageeditor/StickerBSFragment.java @@ -5,42 +5,27 @@ import android.app.Dialog; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.Bundle; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; - -import com.google.android.material.bottomsheet.BottomSheetBehavior; -import com.google.android.material.bottomsheet.BottomSheetDialogFragment; - -import androidx.coordinatorlayout.widget.CoordinatorLayout; -import androidx.recyclerview.widget.GridLayoutManager; -import androidx.recyclerview.widget.RecyclerView; - import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.coordinatorlayout.widget.CoordinatorLayout; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.google.android.material.bottomsheet.BottomSheetBehavior; +import com.google.android.material.bottomsheet.BottomSheetDialogFragment; + import org.jetbrains.annotations.NotNull; import app.fedilab.android.R; public class StickerBSFragment extends BottomSheetDialogFragment { - public StickerBSFragment() { - // Required empty public constructor - } - private StickerListener mStickerListener; - - public void setStickerListener(StickerListener stickerListener) { - mStickerListener = stickerListener; - } - - public interface StickerListener { - void onStickerClick(Bitmap bitmap); - } - private BottomSheetBehavior.BottomSheetCallback mBottomSheetBehaviorCallback = new BottomSheetBehavior.BottomSheetCallback() { @Override @@ -56,6 +41,13 @@ public class StickerBSFragment extends BottomSheetDialogFragment { } }; + public StickerBSFragment() { + // Required empty public constructor + } + + public void setStickerListener(StickerListener stickerListener) { + mStickerListener = stickerListener; + } @SuppressLint("RestrictedApi") @Override @@ -84,6 +76,25 @@ public class StickerBSFragment extends BottomSheetDialogFragment { } + private String convertEmoji(String emoji) { + String returnedEmoji = ""; + try { + int convertEmojiToInt = Integer.parseInt(emoji.substring(2), 16); + returnedEmoji = getEmojiByUnicode(convertEmojiToInt); + } catch (NumberFormatException e) { + returnedEmoji = ""; + } + return returnedEmoji; + } + + private String getEmojiByUnicode(int unicode) { + return new String(Character.toChars(unicode)); + } + + public interface StickerListener { + void onStickerClick(Bitmap bitmap); + } + public class StickerAdapter extends RecyclerView.Adapter { int[] stickerList = new int[]{ @@ -140,19 +151,4 @@ public class StickerBSFragment extends BottomSheetDialogFragment { } } } - - private String convertEmoji(String emoji) { - String returnedEmoji = ""; - try { - int convertEmojiToInt = Integer.parseInt(emoji.substring(2), 16); - returnedEmoji = getEmojiByUnicode(convertEmojiToInt); - } catch (NumberFormatException e) { - returnedEmoji = ""; - } - return returnedEmoji; - } - - private String getEmojiByUnicode(int unicode) { - return new String(Character.toChars(unicode)); - } } \ No newline at end of file diff --git a/app/src/main/java/app/fedilab/android/imageeditor/TextEditorDialogFragment.java b/app/src/main/java/app/fedilab/android/imageeditor/TextEditorDialogFragment.java index 368e15384..e65dcd382 100644 --- a/app/src/main/java/app/fedilab/android/imageeditor/TextEditorDialogFragment.java +++ b/app/src/main/java/app/fedilab/android/imageeditor/TextEditorDialogFragment.java @@ -4,16 +4,6 @@ import android.app.Dialog; import android.content.Context; import android.graphics.drawable.ColorDrawable; import android.os.Bundle; - -import androidx.annotation.ColorInt; -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.fragment.app.DialogFragment; -import androidx.core.content.ContextCompat; -import androidx.appcompat.app.AppCompatActivity; -import androidx.recyclerview.widget.LinearLayoutManager; -import androidx.recyclerview.widget.RecyclerView; - import android.text.TextUtils; import android.view.LayoutInflater; import android.view.View; @@ -22,6 +12,15 @@ import android.view.inputmethod.InputMethodManager; import android.widget.EditText; import android.widget.TextView; +import androidx.annotation.ColorInt; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.appcompat.app.AppCompatActivity; +import androidx.core.content.ContextCompat; +import androidx.fragment.app.DialogFragment; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + import org.jetbrains.annotations.NotNull; import app.fedilab.android.R; @@ -41,11 +40,6 @@ public class TextEditorDialogFragment extends DialogFragment { private int mColorCode; private TextEditor mTextEditor; - public interface TextEditor { - void onDone(String inputText, int colorCode); - } - - //Show dialog with provide text and text color public static TextEditorDialogFragment show(@NonNull AppCompatActivity appCompatActivity, @NonNull String inputText, @@ -126,9 +120,13 @@ public class TextEditorDialogFragment extends DialogFragment { } - //Callback to listener if user is done with text editing public void setOnTextEditorListener(TextEditor textEditor) { mTextEditor = textEditor; } + + + public interface TextEditor { + void onDone(String inputText, int colorCode); + } } \ No newline at end of file diff --git a/app/src/main/java/app/fedilab/android/imageeditor/filters/FilterViewAdapter.java b/app/src/main/java/app/fedilab/android/imageeditor/filters/FilterViewAdapter.java index 73d8dd11e..b38df42d0 100644 --- a/app/src/main/java/app/fedilab/android/imageeditor/filters/FilterViewAdapter.java +++ b/app/src/main/java/app/fedilab/android/imageeditor/filters/FilterViewAdapter.java @@ -4,10 +4,6 @@ import android.content.Context; import android.content.res.AssetManager; import android.graphics.Bitmap; import android.graphics.BitmapFactory; - -import androidx.annotation.NonNull; -import androidx.recyclerview.widget.RecyclerView; - import android.util.Pair; import android.view.LayoutInflater; import android.view.View; @@ -15,6 +11,8 @@ import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView; +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; import java.io.IOException; import java.io.InputStream; @@ -59,23 +57,6 @@ public class FilterViewAdapter extends RecyclerView.Adapter("filters/flip_vertical.png", PhotoFilter.FLIP_VERTICAL)); mPairList.add(new Pair<>("filters/rotate.png", PhotoFilter.ROTATE)); } + + class ViewHolder extends RecyclerView.ViewHolder { + ImageView mImageFilterView; + TextView mTxtFilterName; + + ViewHolder(View itemView) { + super(itemView); + mImageFilterView = itemView.findViewById(R.id.imgFilterView); + mTxtFilterName = itemView.findViewById(R.id.txtFilterName); + itemView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + mFilterListener.onFilterSelected(mPairList.get(getLayoutPosition()).second); + } + }); + } + } } diff --git a/app/src/main/java/app/fedilab/android/imageeditor/tools/EditingToolsAdapter.java b/app/src/main/java/app/fedilab/android/imageeditor/tools/EditingToolsAdapter.java index fd3e39780..81f110251 100644 --- a/app/src/main/java/app/fedilab/android/imageeditor/tools/EditingToolsAdapter.java +++ b/app/src/main/java/app/fedilab/android/imageeditor/tools/EditingToolsAdapter.java @@ -1,14 +1,13 @@ package app.fedilab.android.imageeditor.tools; -import androidx.annotation.NonNull; -import androidx.recyclerview.widget.RecyclerView; - import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView; +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; import java.util.ArrayList; import java.util.List; @@ -36,23 +35,6 @@ public class EditingToolsAdapter extends RecyclerView.Adapter jobRequests = JobManager.instance().getAllJobRequestsForTag(BACKUP_NOTIFICATIONS_SYNC); @@ -81,6 +71,14 @@ public class BackupNotificationsSyncJob extends Job { return jobRequestschedule; } + @NonNull + @Override + protected Result onRunJob(@NonNull Params params) { + //Code refresh here + + backupService(); + return Result.SUCCESS; + } /** * Task in background starts here. diff --git a/app/src/main/java/app/fedilab/android/jobs/BackupStatusesSyncJob.java b/app/src/main/java/app/fedilab/android/jobs/BackupStatusesSyncJob.java index dd2496c64..46832f23d 100644 --- a/app/src/main/java/app/fedilab/android/jobs/BackupStatusesSyncJob.java +++ b/app/src/main/java/app/fedilab/android/jobs/BackupStatusesSyncJob.java @@ -14,57 +14,26 @@ package app.fedilab.android.jobs; * You should have received a copy of the GNU General Public License along with Fedilab; if not, * see . */ -import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.database.sqlite.SQLiteDatabase; -import android.graphics.Bitmap; -import android.graphics.BitmapFactory; -import android.os.Handler; -import android.os.Looper; import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import com.bumptech.glide.Glide; -import com.bumptech.glide.load.DataSource; -import com.bumptech.glide.load.engine.GlideException; -import com.bumptech.glide.request.RequestListener; -import com.bumptech.glide.request.target.SimpleTarget; -import com.bumptech.glide.request.target.Target; -import com.bumptech.glide.request.transition.Transition; import com.evernote.android.job.Job; import com.evernote.android.job.JobManager; import com.evernote.android.job.JobRequest; -import java.util.ArrayList; import java.util.List; import java.util.Set; import java.util.concurrent.TimeUnit; -import app.fedilab.android.R; -import app.fedilab.android.activities.BaseMainActivity; -import app.fedilab.android.activities.MainActivity; -import app.fedilab.android.activities.OwnerStatusActivity; -import app.fedilab.android.client.API; -import app.fedilab.android.client.APIResponse; import app.fedilab.android.client.Entities.Account; -import app.fedilab.android.client.Entities.Notification; -import app.fedilab.android.fragments.DisplayNotificationsFragment; import app.fedilab.android.helper.Helper; import app.fedilab.android.services.BackupStatusInDataBaseService; -import app.fedilab.android.services.BackupStatusService; import app.fedilab.android.sqlite.AccountDAO; import app.fedilab.android.sqlite.Sqlite; -import static app.fedilab.android.helper.Helper.INTENT_ACTION; -import static app.fedilab.android.helper.Helper.INTENT_TARGETED_ACCOUNT; -import static app.fedilab.android.helper.Helper.NOTIFICATION_INTENT; -import static app.fedilab.android.helper.Helper.PREF_INSTANCE; -import static app.fedilab.android.helper.Helper.PREF_KEY_ID; -import static app.fedilab.android.helper.Helper.canNotify; -import static app.fedilab.android.helper.Helper.notify_user; - /** * Created by Thomas on 06/01/2019. @@ -79,16 +48,6 @@ public class BackupStatusesSyncJob extends Job { Helper.installProvider(); } - @NonNull - @Override - protected Result onRunJob(@NonNull Params params) { - //Code refresh here - - backupService(); - return Result.SUCCESS; - } - - public static int schedule(boolean updateCurrent) { Set jobRequests = JobManager.instance().getAllJobRequestsForTag(BACKUP_SYNC); @@ -111,6 +70,14 @@ public class BackupStatusesSyncJob extends Job { return jobRequestschedule; } + @NonNull + @Override + protected Result onRunJob(@NonNull Params params) { + //Code refresh here + + backupService(); + return Result.SUCCESS; + } /** * Task in background starts here. diff --git a/app/src/main/java/app/fedilab/android/jobs/NotificationsSyncJob.java b/app/src/main/java/app/fedilab/android/jobs/NotificationsSyncJob.java index f9917cf99..674706075 100644 --- a/app/src/main/java/app/fedilab/android/jobs/NotificationsSyncJob.java +++ b/app/src/main/java/app/fedilab/android/jobs/NotificationsSyncJob.java @@ -20,7 +20,6 @@ import android.content.SharedPreferences; import android.database.sqlite.SQLiteDatabase; import android.graphics.Bitmap; import android.graphics.BitmapFactory; -import android.graphics.drawable.Drawable; import android.os.Handler; import android.os.Looper; @@ -40,12 +39,10 @@ import com.evernote.android.job.JobRequest; import java.util.ArrayList; import java.util.List; -import java.util.Random; import java.util.Set; import java.util.concurrent.TimeUnit; import app.fedilab.android.R; -import app.fedilab.android.activities.BaseMainActivity; import app.fedilab.android.activities.MainActivity; import app.fedilab.android.client.API; import app.fedilab.android.client.APIResponse; @@ -79,15 +76,6 @@ public class NotificationsSyncJob extends Job { Helper.installProvider(); } - @NonNull - @Override - protected Result onRunJob(@NonNull Params params) { - //Code refresh here - callAsynchronousTask(); - return Result.SUCCESS; - } - - public static int schedule(boolean updateCurrent) { Set jobRequests = JobManager.instance().getAllJobRequestsForTag(NOTIFICATION_REFRESH); @@ -110,6 +98,13 @@ public class NotificationsSyncJob extends Job { return jobRequestschedule; } + @NonNull + @Override + protected Result onRunJob(@NonNull Params params) { + //Code refresh here + callAsynchronousTask(); + return Result.SUCCESS; + } /** * Task in background starts here. @@ -118,7 +113,7 @@ public class NotificationsSyncJob extends Job { if (!canNotify(getContext())) return; int liveNotifications = Helper.liveNotifType(getContext()); - if( liveNotifications != Helper.NOTIF_NONE){ + if (liveNotifications != Helper.NOTIF_NONE) { return; } SQLiteDatabase db = Sqlite.getInstance(getContext(), Sqlite.DB_NAME, null, Sqlite.DB_VERSION).open(); diff --git a/app/src/main/java/app/fedilab/android/jobs/ScheduledBoostsSyncJob.java b/app/src/main/java/app/fedilab/android/jobs/ScheduledBoostsSyncJob.java index f5affe7ff..42e3f8dae 100644 --- a/app/src/main/java/app/fedilab/android/jobs/ScheduledBoostsSyncJob.java +++ b/app/src/main/java/app/fedilab/android/jobs/ScheduledBoostsSyncJob.java @@ -48,6 +48,40 @@ public class ScheduledBoostsSyncJob extends Job { Helper.installProvider(); } + public static int schedule(Context context, Status status, long timestampScheduling) { + + long startMs = (timestampScheduling - new Date().getTime()); + long endMs = startMs + TimeUnit.MINUTES.toMillis(5); + SQLiteDatabase db = Sqlite.getInstance(context, Sqlite.DB_NAME, null, Sqlite.DB_VERSION).open(); + + int jobId = new JobRequest.Builder(ScheduledBoostsSyncJob.SCHEDULED_BOOST) + .setExecutionWindow(startMs, endMs) + .setUpdateCurrent(false) + .setRequiredNetworkType(JobRequest.NetworkType.METERED) + .setRequirementsEnforced(false) + .build() + .schedule(); + new BoostScheduleDAO(context, db).insert(status, jobId, new Date(timestampScheduling)); + return jobId; + } + + public static int scheduleUpdate(Context context, int tootStoredId, long timestampScheduling) { + + long startMs = (timestampScheduling - new Date().getTime()); + long endMs = startMs + TimeUnit.MINUTES.toMillis(5); + SQLiteDatabase db = Sqlite.getInstance(context, Sqlite.DB_NAME, null, Sqlite.DB_VERSION).open(); + + int jobId = new JobRequest.Builder(ScheduledTootsSyncJob.SCHEDULED_TOOT) + .setExecutionWindow(startMs, endMs) + .setUpdateCurrent(false) + .setRequiredNetworkType(JobRequest.NetworkType.METERED) + .setRequirementsEnforced(false) + .build() + .schedule(); + new BoostScheduleDAO(context, db).updateScheduledDate(tootStoredId, jobId, new Date(timestampScheduling)); + return jobId; + } + @NonNull @Override protected Result onRunJob(@NonNull Params params) { @@ -79,40 +113,4 @@ public class ScheduledBoostsSyncJob extends Job { } - public static int schedule(Context context, Status status, long timestampScheduling) { - - long startMs = (timestampScheduling - new Date().getTime()); - long endMs = startMs + TimeUnit.MINUTES.toMillis(5); - SQLiteDatabase db = Sqlite.getInstance(context, Sqlite.DB_NAME, null, Sqlite.DB_VERSION).open(); - - int jobId = new JobRequest.Builder(ScheduledBoostsSyncJob.SCHEDULED_BOOST) - .setExecutionWindow(startMs, endMs) - .setUpdateCurrent(false) - .setRequiredNetworkType(JobRequest.NetworkType.METERED) - .setRequirementsEnforced(false) - .build() - .schedule(); - new BoostScheduleDAO(context, db).insert(status, jobId, new Date(timestampScheduling)); - return jobId; - } - - - public static int scheduleUpdate(Context context, int tootStoredId, long timestampScheduling) { - - long startMs = (timestampScheduling - new Date().getTime()); - long endMs = startMs + TimeUnit.MINUTES.toMillis(5); - SQLiteDatabase db = Sqlite.getInstance(context, Sqlite.DB_NAME, null, Sqlite.DB_VERSION).open(); - - int jobId = new JobRequest.Builder(ScheduledTootsSyncJob.SCHEDULED_TOOT) - .setExecutionWindow(startMs, endMs) - .setUpdateCurrent(false) - .setRequiredNetworkType(JobRequest.NetworkType.METERED) - .setRequirementsEnforced(false) - .build() - .schedule(); - new BoostScheduleDAO(context, db).updateScheduledDate(tootStoredId, jobId, new Date(timestampScheduling)); - return jobId; - } - - } diff --git a/app/src/main/java/app/fedilab/android/jobs/ScheduledTootsSyncJob.java b/app/src/main/java/app/fedilab/android/jobs/ScheduledTootsSyncJob.java index 9452724a7..216bbcd08 100644 --- a/app/src/main/java/app/fedilab/android/jobs/ScheduledTootsSyncJob.java +++ b/app/src/main/java/app/fedilab/android/jobs/ScheduledTootsSyncJob.java @@ -48,6 +48,23 @@ public class ScheduledTootsSyncJob extends Job { Helper.installProvider(); } + public static int schedule(Context context, long id, long timestampScheduling) { + + long startMs = (timestampScheduling - new Date().getTime()); + long endMs = startMs + TimeUnit.MINUTES.toMillis(5); + SQLiteDatabase db = Sqlite.getInstance(context, Sqlite.DB_NAME, null, Sqlite.DB_VERSION).open(); + + int jobId = new JobRequest.Builder(ScheduledTootsSyncJob.SCHEDULED_TOOT) + .setExecutionWindow(startMs, endMs) + .setUpdateCurrent(false) + .setRequiredNetworkType(JobRequest.NetworkType.METERED) + .setRequirementsEnforced(false) + .build() + .schedule(); + new StatusStoredDAO(context, db).scheduleStatus(id, jobId, new Date(timestampScheduling)); + return jobId; + } + @NonNull @Override protected Result onRunJob(@NonNull Params params) { @@ -78,22 +95,4 @@ public class ScheduledTootsSyncJob extends Job { } - public static int schedule(Context context, long id, long timestampScheduling) { - - long startMs = (timestampScheduling - new Date().getTime()); - long endMs = startMs + TimeUnit.MINUTES.toMillis(5); - SQLiteDatabase db = Sqlite.getInstance(context, Sqlite.DB_NAME, null, Sqlite.DB_VERSION).open(); - - int jobId = new JobRequest.Builder(ScheduledTootsSyncJob.SCHEDULED_TOOT) - .setExecutionWindow(startMs, endMs) - .setUpdateCurrent(false) - .setRequiredNetworkType(JobRequest.NetworkType.METERED) - .setRequirementsEnforced(false) - .build() - .schedule(); - new StatusStoredDAO(context, db).scheduleStatus(id, jobId, new Date(timestampScheduling)); - return jobId; - } - - } diff --git a/app/src/main/java/app/fedilab/android/services/BackupNotificationInDataBaseService.java b/app/src/main/java/app/fedilab/android/services/BackupNotificationInDataBaseService.java index 1a18a9a65..68593b9be 100644 --- a/app/src/main/java/app/fedilab/android/services/BackupNotificationInDataBaseService.java +++ b/app/src/main/java/app/fedilab/android/services/BackupNotificationInDataBaseService.java @@ -32,7 +32,6 @@ import java.util.ArrayList; import java.util.List; import app.fedilab.android.R; -import app.fedilab.android.activities.BaseMainActivity; import app.fedilab.android.activities.MainActivity; import app.fedilab.android.client.API; import app.fedilab.android.client.APIResponse; @@ -44,8 +43,6 @@ import app.fedilab.android.sqlite.NotificationCacheDAO; import app.fedilab.android.sqlite.Sqlite; import es.dmoral.toasty.Toasty; -import static app.fedilab.android.helper.Helper.sleeps; - /** * Created by Thomas on 24/08/2019. diff --git a/app/src/main/java/app/fedilab/android/services/BackupStatusInDataBaseService.java b/app/src/main/java/app/fedilab/android/services/BackupStatusInDataBaseService.java index c25f7e820..2b3d3af64 100644 --- a/app/src/main/java/app/fedilab/android/services/BackupStatusInDataBaseService.java +++ b/app/src/main/java/app/fedilab/android/services/BackupStatusInDataBaseService.java @@ -22,18 +22,18 @@ import android.database.sqlite.SQLiteDatabase; import android.graphics.BitmapFactory; import android.os.Handler; import android.os.Looper; +import android.os.SystemClock; +import android.widget.Toast; import androidx.annotation.Nullable; import androidx.localbroadcastmanager.content.LocalBroadcastManager; -import android.os.SystemClock; -import android.widget.Toast; - import java.util.ArrayList; import java.util.Date; import java.util.List; -import app.fedilab.android.activities.BaseMainActivity; +import app.fedilab.android.R; +import app.fedilab.android.activities.MainActivity; import app.fedilab.android.client.API; import app.fedilab.android.client.APIResponse; import app.fedilab.android.client.Entities.Account; @@ -43,8 +43,6 @@ import app.fedilab.android.sqlite.AccountDAO; import app.fedilab.android.sqlite.Sqlite; import app.fedilab.android.sqlite.StatusCacheDAO; import es.dmoral.toasty.Toasty; -import app.fedilab.android.R; -import app.fedilab.android.activities.MainActivity; /** diff --git a/app/src/main/java/app/fedilab/android/services/BackupStatusService.java b/app/src/main/java/app/fedilab/android/services/BackupStatusService.java index 0ef675d54..39761e97d 100644 --- a/app/src/main/java/app/fedilab/android/services/BackupStatusService.java +++ b/app/src/main/java/app/fedilab/android/services/BackupStatusService.java @@ -25,22 +25,22 @@ import android.os.Build; import android.os.Environment; import android.os.Handler; import android.os.Looper; - -import androidx.annotation.Nullable; - import android.os.SystemClock; import android.text.Html; import android.widget.Toast; +import androidx.annotation.Nullable; + import java.io.File; import java.io.FileOutputStream; import java.io.OutputStreamWriter; import java.io.PrintWriter; +import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.Date; import java.util.List; -import app.fedilab.android.activities.BaseMainActivity; +import app.fedilab.android.R; import app.fedilab.android.client.API; import app.fedilab.android.client.APIResponse; import app.fedilab.android.client.Entities.Account; @@ -50,7 +50,6 @@ import app.fedilab.android.helper.Helper; import app.fedilab.android.sqlite.AccountDAO; import app.fedilab.android.sqlite.Sqlite; import es.dmoral.toasty.Toasty; -import app.fedilab.android.R; /** @@ -132,7 +131,7 @@ public class BackupStatusService extends IntentService { String fileName = account.getAcct() + "@" + account.getInstance() + Helper.dateFileToString(getApplicationContext(), new Date()) + ".csv"; String filePath = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).getAbsolutePath(); fullPath = filePath + "/" + fileName; - PrintWriter pw = new PrintWriter(new OutputStreamWriter(new FileOutputStream(new File(fullPath)), "UTF-8")); + PrintWriter pw = new PrintWriter(new OutputStreamWriter(new FileOutputStream(new File(fullPath)), StandardCharsets.UTF_8)); StringBuilder builder = new StringBuilder(); builder.append("id").append(','); builder.append("uri").append(','); @@ -169,9 +168,9 @@ public class BackupStatusService extends IntentService { content = Html.fromHtml(status.getContent()).toString(); builder.append("\"").append(content.replace("\"", "'").replace("\n", " ")).append("\"").append(','); builder.append("\"").append(Helper.shortDateTime(getApplicationContext(), status.getCreated_at())).append("\"").append(','); - builder.append("\"").append(String.valueOf(status.getReblogs_count())).append("\"").append(','); - builder.append("\"").append(String.valueOf(status.getFavourites_count())).append("\"").append(','); - builder.append("\"").append(String.valueOf(status.isSensitive())).append("\"").append(','); + builder.append("\"").append(status.getReblogs_count()).append("\"").append(','); + builder.append("\"").append(status.getFavourites_count()).append("\"").append(','); + builder.append("\"").append(status.isSensitive()).append("\"").append(','); builder.append("\"").append(status.getSpoiler_text() != null ? status.getSpoiler_text() : "").append("\"").append(','); builder.append("\"").append(status.getVisibility()).append("\"").append(','); if (status.getMedia_attachments() != null && status.getMedia_attachments().size() > 0) { diff --git a/app/src/main/java/app/fedilab/android/services/LiveNotificationDelayedService.java b/app/src/main/java/app/fedilab/android/services/LiveNotificationDelayedService.java index 2e88b38a1..7cab70536 100644 --- a/app/src/main/java/app/fedilab/android/services/LiveNotificationDelayedService.java +++ b/app/src/main/java/app/fedilab/android/services/LiveNotificationDelayedService.java @@ -77,13 +77,12 @@ public class LiveNotificationDelayedService extends Service { public static String CHANNEL_ID = "live_notifications"; - protected Account account; - private NotificationChannel channel; public static int totalAccount = 0; public static int eventsCount = 0; public static HashMap since_ids = new HashMap<>(); public static HashMap threads = new HashMap<>(); - + protected Account account; + private NotificationChannel channel; private boolean fetch; @@ -110,7 +109,7 @@ public class LiveNotificationDelayedService extends Service { } } - if( totalAccount > 0) { + if (totalAccount > 0) { Intent myIntent = new Intent(getApplicationContext(), MainActivity.class); PendingIntent pendingIntent = PendingIntent.getActivity( getApplicationContext(), @@ -126,7 +125,7 @@ public class LiveNotificationDelayedService extends Service { .setContentText(getString(R.string.top_notification_message, String.valueOf(totalAccount), String.valueOf(eventsCount))).build(); startForeground(1, notification); - }else{ + } else { stopSelf(); } startStream(); @@ -140,15 +139,13 @@ public class LiveNotificationDelayedService extends Service { stopForeground(true); stopSelf(); } - if( totalAccount > 0) { + if (totalAccount > 0) { return START_STICKY; } return START_NOT_STICKY; } - - private void startStream() { SQLiteDatabase db = Sqlite.getInstance(getApplicationContext(), Sqlite.DB_NAME, null, Sqlite.DB_VERSION).open(); @@ -161,13 +158,13 @@ public class LiveNotificationDelayedService extends Service { for (final Account accountStream : accountStreams) { String key = accountStream.getUsername() + "@" + accountStream.getInstance(); boolean allowStream = sharedpreferences.getBoolean(Helper.SET_ALLOW_STREAM + accountStream.getId() + accountStream.getInstance(), true); - if( !allowStream){ + if (!allowStream) { continue; } - if(!sleeps.containsKey(key)) { + if (!sleeps.containsKey(key)) { sleeps.put(key, 30000); } - if( threads.containsKey(key) && threads.get(key) != null) { + if (threads.containsKey(key) && threads.get(key) != null) { thread = threads.get(key); if (thread != null && !thread.isInterrupted()) { thread.interrupt(); @@ -180,7 +177,7 @@ public class LiveNotificationDelayedService extends Service { while (fetch) { taks(accountStream); fetch = (Helper.liveNotifType(getApplicationContext()) == Helper.NOTIF_DELAYED); - if( sleeps.containsKey(key) && sleeps.get(key) != null){ + if (sleeps.containsKey(key) && sleeps.get(key) != null) { try { Thread.sleep(sleeps.get(key)); } catch (InterruptedException e) { @@ -211,22 +208,23 @@ public class LiveNotificationDelayedService extends Service { API api; api = new API(getApplicationContext(), account.getInstance(), account.getToken()); String last_notifid = null; - if( since_ids.containsKey(key) ){ + if (since_ids.containsKey(key)) { last_notifid = since_ids.get(key); } apiResponse = null; try { apiResponse = api.getNotificationsSince(DisplayNotificationsFragment.Type.ALL, last_notifid, false); - }catch (Exception ignored){} + } catch (Exception ignored) { + } - if( apiResponse != null && apiResponse.getNotifications() != null && apiResponse.getNotifications().size() > 0){ + if (apiResponse != null && apiResponse.getNotifications() != null && apiResponse.getNotifications().size() > 0) { since_ids.put(key, apiResponse.getNotifications().get(0).getId()); for (Notification notification : apiResponse.getNotifications()) { - if( last_notifid != null && notification.getId().compareTo(last_notifid) > 0) { + if (last_notifid != null && notification.getId().compareTo(last_notifid) > 0) { onRetrieveStreaming(account, notification); sleeps.put(key, 30000); - }else { - if( apiResponse.getNotifications().size() == 1) { //TODO: use min id with Pixelfed when available for removing this fix. + } else { + if (apiResponse.getNotifications().size() == 1) { //TODO: use min id with Pixelfed when available for removing this fix. if (sleeps.containsKey(key) && sleeps.get(key) != null) { int newWaitTime = sleeps.get(key) + 30000; if (newWaitTime > 900000) { @@ -240,21 +238,20 @@ public class LiveNotificationDelayedService extends Service { break; } } - }else{ - if( sleeps.containsKey(key) && sleeps.get(key) != null){ + } else { + if (sleeps.containsKey(key) && sleeps.get(key) != null) { int newWaitTime = sleeps.get(key) + 30000; - if( newWaitTime > 900000){ + if (newWaitTime > 900000) { newWaitTime = 900000; } sleeps.put(key, newWaitTime); - }else{ + } else { sleeps.put(key, 60000); } } } - private void onRetrieveStreaming(Account account, Notification notification) { Bundle b = new Bundle(); @@ -287,7 +284,7 @@ public class LiveNotificationDelayedService extends Service { if (!allowStream) { canNotify = false; } - if ((userId == null || !userId.equals(account.getId()) || !activityRunning) && canNotify && notify) { + if ((userId == null || !userId.equals(account.getId()) || !activityRunning) && canNotify && notify) { boolean notif_follow = sharedpreferences.getBoolean(Helper.SET_NOTIF_FOLLOW, true); boolean notif_add = sharedpreferences.getBoolean(Helper.SET_NOTIF_ADD, true); boolean notif_mention = sharedpreferences.getBoolean(Helper.SET_NOTIF_MENTION, true); diff --git a/app/src/main/java/app/fedilab/android/services/LiveNotificationService.java b/app/src/main/java/app/fedilab/android/services/LiveNotificationService.java index b2d5e26d7..abbc1b468 100644 --- a/app/src/main/java/app/fedilab/android/services/LiveNotificationService.java +++ b/app/src/main/java/app/fedilab/android/services/LiveNotificationService.java @@ -67,6 +67,8 @@ import java.util.List; import java.util.Map; import java.util.Objects; +import app.fedilab.android.R; +import app.fedilab.android.activities.MainActivity; import app.fedilab.android.client.API; import app.fedilab.android.client.Entities.Account; import app.fedilab.android.client.Entities.Notification; @@ -74,8 +76,6 @@ import app.fedilab.android.client.TLSSocketFactory; import app.fedilab.android.helper.Helper; import app.fedilab.android.sqlite.AccountDAO; import app.fedilab.android.sqlite.Sqlite; -import app.fedilab.android.R; -import app.fedilab.android.activities.MainActivity; import static androidx.core.text.HtmlCompat.FROM_HTML_MODE_LEGACY; import static app.fedilab.android.helper.Helper.getMainLogo; @@ -89,19 +89,20 @@ import static app.fedilab.android.helper.Helper.getNotificationIcon; public class LiveNotificationService extends Service implements NetworkStateReceiver.NetworkStateReceiverListener { + public static String CHANNEL_ID = "live_notifications"; + public static int totalAccount = 0; + public static int eventsCount = 0; + private static HashMap threads = new HashMap<>(); + private static HashMap lastNotification = new HashMap<>(); + private static HashMap webSocketFutures = new HashMap<>(); + static { Helper.installProvider(); } - public static String CHANNEL_ID = "live_notifications"; protected Account account; - private static HashMap threads = new HashMap<>(); - private static HashMap lastNotification = new HashMap<>(); private NetworkStateReceiver networkStateReceiver; - private static HashMap webSocketFutures = new HashMap<>(); private NotificationChannel channel; - public static int totalAccount = 0; - public static int eventsCount = 0; public void onCreate() { super.onCreate(); @@ -131,7 +132,7 @@ public class LiveNotificationService extends Service implements NetworkStateRece } } } - if( totalAccount > 0) { + if (totalAccount > 0) { Intent myIntent = new Intent(getApplicationContext(), MainActivity.class); PendingIntent pendingIntent = PendingIntent.getActivity( getApplicationContext(), @@ -145,7 +146,7 @@ public class LiveNotificationService extends Service implements NetworkStateRece .setContentText(getString(R.string.top_notification_message, String.valueOf(totalAccount), String.valueOf(eventsCount))).build(); startForeground(1, notification); - }else{ + } else { stopSelf(); } } @@ -175,10 +176,10 @@ public class LiveNotificationService extends Service implements NetworkStateRece stopForeground(true); stopSelf(); } - if( totalAccount > 0) { - return START_STICKY; - } - return START_NOT_STICKY; + if (totalAccount > 0) { + return START_STICKY; + } + return START_NOT_STICKY; } @Override @@ -196,7 +197,6 @@ public class LiveNotificationService extends Service implements NetworkStateRece } - private void taks(Account account) { if (account != null) { diff --git a/app/src/main/java/app/fedilab/android/services/PeertubeUploadReceiver.java b/app/src/main/java/app/fedilab/android/services/PeertubeUploadReceiver.java index 115e4f54e..69dafe235 100644 --- a/app/src/main/java/app/fedilab/android/services/PeertubeUploadReceiver.java +++ b/app/src/main/java/app/fedilab/android/services/PeertubeUploadReceiver.java @@ -18,7 +18,6 @@ import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; - import androidx.localbroadcastmanager.content.LocalBroadcastManager; import net.gotev.uploadservice.ServerResponse; @@ -30,7 +29,6 @@ import org.json.JSONObject; import java.util.ArrayList; -import app.fedilab.android.activities.TootActivity; import app.fedilab.android.helper.Helper; diff --git a/app/src/main/java/app/fedilab/android/services/RestartLiveNotificationReceiver.java b/app/src/main/java/app/fedilab/android/services/RestartLiveNotificationReceiver.java index fb738687f..5105848ab 100644 --- a/app/src/main/java/app/fedilab/android/services/RestartLiveNotificationReceiver.java +++ b/app/src/main/java/app/fedilab/android/services/RestartLiveNotificationReceiver.java @@ -18,7 +18,6 @@ import android.annotation.SuppressLint; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; -import android.content.SharedPreferences; import app.fedilab.android.helper.Helper; @@ -34,13 +33,13 @@ public class RestartLiveNotificationReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { int type = Helper.liveNotifType(context); - if ( type == Helper.NOTIF_DELAYED) { + if (type == Helper.NOTIF_DELAYED) { Intent streamingServiceIntent = new Intent(context.getApplicationContext(), LiveNotificationDelayedService.class); try { context.startService(streamingServiceIntent); } catch (Exception ignored) { } - }else if (type == Helper.NOTIF_LIVE) { + } else if (type == Helper.NOTIF_LIVE) { Intent streamingServiceIntent = new Intent(context.getApplicationContext(), LiveNotificationService.class); try { context.startService(streamingServiceIntent); diff --git a/app/src/main/java/app/fedilab/android/services/StopLiveNotificationReceiver.java b/app/src/main/java/app/fedilab/android/services/StopLiveNotificationReceiver.java index 3e837fe3c..40bf26f30 100644 --- a/app/src/main/java/app/fedilab/android/services/StopLiveNotificationReceiver.java +++ b/app/src/main/java/app/fedilab/android/services/StopLiveNotificationReceiver.java @@ -34,7 +34,9 @@ public class StopLiveNotificationReceiver extends BroadcastReceiver { streamingServiceIntent.putExtra("stop", true); try { context.startService(streamingServiceIntent); - } catch (Exception ignored) { ignored.printStackTrace();} + } catch (Exception ignored) { + ignored.printStackTrace(); + } } } \ No newline at end of file diff --git a/app/src/main/java/app/fedilab/android/services/StreamingFederatedTimelineService.java b/app/src/main/java/app/fedilab/android/services/StreamingFederatedTimelineService.java index 31cb6cbe2..c6029da83 100644 --- a/app/src/main/java/app/fedilab/android/services/StreamingFederatedTimelineService.java +++ b/app/src/main/java/app/fedilab/android/services/StreamingFederatedTimelineService.java @@ -55,10 +55,14 @@ import app.fedilab.android.sqlite.Sqlite; public class StreamingFederatedTimelineService extends IntentService { + private static HttpsURLConnection httpsURLConnection; + static { Helper.installProvider(); } + protected Account account; + /** * Creates an IntentService. Invoked by your subclass's constructor. * @@ -68,15 +72,11 @@ public class StreamingFederatedTimelineService extends IntentService { public StreamingFederatedTimelineService(String name) { super(name); } - @SuppressWarnings("unused") public StreamingFederatedTimelineService() { super("StreamingFederatedTimelineService"); } - private static HttpsURLConnection httpsURLConnection; - protected Account account; - public void onCreate() { super.onCreate(); SharedPreferences sharedpreferences = getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE); diff --git a/app/src/main/java/app/fedilab/android/services/StreamingHomeTimelineService.java b/app/src/main/java/app/fedilab/android/services/StreamingHomeTimelineService.java index 258a02355..0dc3da46f 100644 --- a/app/src/main/java/app/fedilab/android/services/StreamingHomeTimelineService.java +++ b/app/src/main/java/app/fedilab/android/services/StreamingHomeTimelineService.java @@ -55,10 +55,14 @@ import app.fedilab.android.sqlite.Sqlite; public class StreamingHomeTimelineService extends IntentService { + private static HttpsURLConnection httpsURLConnection; + static { Helper.installProvider(); } + protected Account account; + /** * Creates an IntentService. Invoked by your subclass's constructor. * @@ -68,15 +72,11 @@ public class StreamingHomeTimelineService extends IntentService { public StreamingHomeTimelineService(String name) { super(name); } - @SuppressWarnings("unused") public StreamingHomeTimelineService() { super("StreamingHomeTimelineService"); } - private static HttpsURLConnection httpsURLConnection; - protected Account account; - public void onCreate() { super.onCreate(); SharedPreferences sharedpreferences = getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE); diff --git a/app/src/main/java/app/fedilab/android/services/StreamingLocalTimelineService.java b/app/src/main/java/app/fedilab/android/services/StreamingLocalTimelineService.java index 95b963af3..9eb313928 100644 --- a/app/src/main/java/app/fedilab/android/services/StreamingLocalTimelineService.java +++ b/app/src/main/java/app/fedilab/android/services/StreamingLocalTimelineService.java @@ -55,10 +55,14 @@ import app.fedilab.android.sqlite.Sqlite; public class StreamingLocalTimelineService extends IntentService { + private static HttpsURLConnection httpsURLConnection; + static { Helper.installProvider(); } + protected Account account; + /** * Creates an IntentService. Invoked by your subclass's constructor. * @@ -68,15 +72,11 @@ public class StreamingLocalTimelineService extends IntentService { public StreamingLocalTimelineService(String name) { super(name); } - @SuppressWarnings("unused") public StreamingLocalTimelineService() { super("StreamingLocalTimelineService"); } - private static HttpsURLConnection httpsURLConnection; - protected Account account; - public void onCreate() { super.onCreate(); SharedPreferences sharedpreferences = getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE); diff --git a/app/src/main/java/app/fedilab/android/sqlite/AccountDAO.java b/app/src/main/java/app/fedilab/android/sqlite/AccountDAO.java index 60ff6d459..ab6321289 100644 --- a/app/src/main/java/app/fedilab/android/sqlite/AccountDAO.java +++ b/app/src/main/java/app/fedilab/android/sqlite/AccountDAO.java @@ -33,8 +33,8 @@ import app.fedilab.android.helper.Helper; */ public class AccountDAO { - private SQLiteDatabase db; public Context context; + private SQLiteDatabase db; public AccountDAO(Context context, SQLiteDatabase db) { @@ -161,7 +161,7 @@ public class AccountDAO { values.put(Sqlite.COL_HEADER_STATIC, account.getHeader_static()); values.put(Sqlite.COL_CREATED_AT, Helper.dateToString(account.getCreated_at())); values.put(Sqlite.COL_EMOJIS, Helper.emojisToStringStorage(account.getEmojis())); - if( account.getSocial() != null ) { + if (account.getSocial() != null) { values.put(Sqlite.COL_SOCIAL, account.getSocial()); } if (account.getClient_id() != null && account.getClient_secret() != null && account.getRefresh_token() != null) { diff --git a/app/src/main/java/app/fedilab/android/sqlite/BoostScheduleDAO.java b/app/src/main/java/app/fedilab/android/sqlite/BoostScheduleDAO.java index bfbcbf8fa..78c5c5338 100644 --- a/app/src/main/java/app/fedilab/android/sqlite/BoostScheduleDAO.java +++ b/app/src/main/java/app/fedilab/android/sqlite/BoostScheduleDAO.java @@ -36,8 +36,8 @@ import app.fedilab.android.helper.Helper; public class BoostScheduleDAO { - private SQLiteDatabase db; public Context context; + private SQLiteDatabase db; public BoostScheduleDAO(Context context, SQLiteDatabase db) { //Creation of the DB with tables diff --git a/app/src/main/java/app/fedilab/android/sqlite/CustomEmojiDAO.java b/app/src/main/java/app/fedilab/android/sqlite/CustomEmojiDAO.java index de6a24f38..b4935a47d 100644 --- a/app/src/main/java/app/fedilab/android/sqlite/CustomEmojiDAO.java +++ b/app/src/main/java/app/fedilab/android/sqlite/CustomEmojiDAO.java @@ -33,8 +33,8 @@ import app.fedilab.android.helper.Helper; */ public class CustomEmojiDAO { - private SQLiteDatabase db; public Context context; + private SQLiteDatabase db; public CustomEmojiDAO(Context context, SQLiteDatabase db) { diff --git a/app/src/main/java/app/fedilab/android/sqlite/DomainBlockDAO.java b/app/src/main/java/app/fedilab/android/sqlite/DomainBlockDAO.java index a723c0f24..59a3e8cc7 100644 --- a/app/src/main/java/app/fedilab/android/sqlite/DomainBlockDAO.java +++ b/app/src/main/java/app/fedilab/android/sqlite/DomainBlockDAO.java @@ -29,8 +29,8 @@ import java.util.List; */ public class DomainBlockDAO { - private SQLiteDatabase db; public Context context; + private SQLiteDatabase db; public DomainBlockDAO(Context context, SQLiteDatabase db) { //Creation of the DB with tables diff --git a/app/src/main/java/app/fedilab/android/sqlite/InstancesDAO.java b/app/src/main/java/app/fedilab/android/sqlite/InstancesDAO.java index d81190e63..be4e9b188 100644 --- a/app/src/main/java/app/fedilab/android/sqlite/InstancesDAO.java +++ b/app/src/main/java/app/fedilab/android/sqlite/InstancesDAO.java @@ -25,7 +25,6 @@ import java.util.Date; import java.util.List; import app.fedilab.android.client.Entities.RemoteInstance; -import app.fedilab.android.client.Entities.TagTimeline; import app.fedilab.android.helper.Helper; @@ -35,8 +34,8 @@ import app.fedilab.android.helper.Helper; */ public class InstancesDAO { - private SQLiteDatabase db; public Context context; + private SQLiteDatabase db; public InstancesDAO(Context context, SQLiteDatabase db) { //Creation of the DB with tables diff --git a/app/src/main/java/app/fedilab/android/sqlite/MainMenuDAO.java b/app/src/main/java/app/fedilab/android/sqlite/MainMenuDAO.java index d2921e84a..7ad4d1811 100644 --- a/app/src/main/java/app/fedilab/android/sqlite/MainMenuDAO.java +++ b/app/src/main/java/app/fedilab/android/sqlite/MainMenuDAO.java @@ -30,8 +30,8 @@ import app.fedilab.android.helper.Helper; */ public class MainMenuDAO { - private SQLiteDatabase db; public Context context; + private SQLiteDatabase db; public MainMenuDAO(Context context, SQLiteDatabase db) { //Creation of the DB with tables diff --git a/app/src/main/java/app/fedilab/android/sqlite/NotesDAO.java b/app/src/main/java/app/fedilab/android/sqlite/NotesDAO.java index d6367efd8..de9ecb685 100644 --- a/app/src/main/java/app/fedilab/android/sqlite/NotesDAO.java +++ b/app/src/main/java/app/fedilab/android/sqlite/NotesDAO.java @@ -19,7 +19,9 @@ import android.content.Context; import android.content.SharedPreferences; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; + import java.util.Date; + import app.fedilab.android.client.Entities.UserNote; import app.fedilab.android.helper.Helper; @@ -30,8 +32,8 @@ import app.fedilab.android.helper.Helper; */ public class NotesDAO { - private SQLiteDatabase db; public Context context; + private SQLiteDatabase db; public NotesDAO(Context context, SQLiteDatabase db) { //Creation of the DB with tables @@ -53,7 +55,7 @@ public class NotesDAO { UserNote notes = getUserNote(userNote.getAcct()); //There is a note - if( userNote.getNote() != null && userNote.getNote().trim().length() > 0) { + if (userNote.getNote() != null && userNote.getNote().trim().length() > 0) { if (notes != null) { //Notes already exist, it needs an update ContentValues values = new ContentValues(); values.put(Sqlite.COL_NOTE, userNote.getNote()); @@ -72,14 +74,13 @@ public class NotesDAO { } catch (Exception ignored) { } } - }else{ //It's empty, it's a deletion + } else { //It's empty, it's a deletion db.delete(Sqlite.TABLE_USER_NOTES, Sqlite.COL_ACCT + " = \"" + userNote.getAcct() + "\"", null); } } - //------- GETTERS ------- /** diff --git a/app/src/main/java/app/fedilab/android/sqlite/NotificationCacheDAO.java b/app/src/main/java/app/fedilab/android/sqlite/NotificationCacheDAO.java index b504a80dd..eed2cbb0e 100644 --- a/app/src/main/java/app/fedilab/android/sqlite/NotificationCacheDAO.java +++ b/app/src/main/java/app/fedilab/android/sqlite/NotificationCacheDAO.java @@ -41,8 +41,8 @@ import app.fedilab.android.helper.Helper; */ public class NotificationCacheDAO { - private SQLiteDatabase db; public Context context; + private SQLiteDatabase db; public NotificationCacheDAO(Context context, SQLiteDatabase db) { diff --git a/app/src/main/java/app/fedilab/android/sqlite/PeertubeFavoritesDAO.java b/app/src/main/java/app/fedilab/android/sqlite/PeertubeFavoritesDAO.java index bc49f453a..d90f99042 100644 --- a/app/src/main/java/app/fedilab/android/sqlite/PeertubeFavoritesDAO.java +++ b/app/src/main/java/app/fedilab/android/sqlite/PeertubeFavoritesDAO.java @@ -38,8 +38,8 @@ import app.fedilab.android.helper.Helper; */ public class PeertubeFavoritesDAO { - private SQLiteDatabase db; public Context context; + private SQLiteDatabase db; public PeertubeFavoritesDAO(Context context, SQLiteDatabase db) { //Creation of the DB with tables diff --git a/app/src/main/java/app/fedilab/android/sqlite/SearchDAO.java b/app/src/main/java/app/fedilab/android/sqlite/SearchDAO.java index 03f8b8598..f87057216 100644 --- a/app/src/main/java/app/fedilab/android/sqlite/SearchDAO.java +++ b/app/src/main/java/app/fedilab/android/sqlite/SearchDAO.java @@ -34,8 +34,8 @@ import app.fedilab.android.helper.Helper; */ public class SearchDAO { - private SQLiteDatabase db; public Context context; + private SQLiteDatabase db; private String userId; public SearchDAO(Context context, SQLiteDatabase db) { diff --git a/app/src/main/java/app/fedilab/android/sqlite/Sqlite.java b/app/src/main/java/app/fedilab/android/sqlite/Sqlite.java index e253d7e76..5aee650c4 100644 --- a/app/src/main/java/app/fedilab/android/sqlite/Sqlite.java +++ b/app/src/main/java/app/fedilab/android/sqlite/Sqlite.java @@ -33,12 +33,11 @@ import java.nio.channels.FileChannel; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Locale; -import java.util.Random; +import app.fedilab.android.R; import app.fedilab.android.client.Entities.Account; import app.fedilab.android.helper.Helper; import es.dmoral.toasty.Toasty; -import app.fedilab.android.R; import static android.content.Context.MODE_PRIVATE; @@ -51,62 +50,43 @@ public class Sqlite extends SQLiteOpenHelper { public static final int DB_VERSION = 36; public static final String DB_NAME = "mastodon_etalab_db"; - public static SQLiteDatabase db; - private static Sqlite sInstance; - + //Table for custom emoji + public static final String TABLE_CUSTOM_EMOJI = "CUSTOM_EMOJI"; + //Table for cached statuses + public static final String TABLE_STATUSES_CACHE = "STATUSES_CACHE"; + //Table for timeline cache + public static final String TABLE_TIMELINE_CACHE = "TIMELINE_CACHE"; + //Table for scheduling boosts + public static final String TABLE_BOOST_SCHEDULE = "BOOST_SCHEDULE"; + //Table for blocking tracking domains + public static final String TABLE_TRACKING_BLOCK = "TRACKING_BLOCK"; + //Table for timelines + public static final String TABLE_TIMELINES = "TIMELINES"; + //Table for timelines + public static final String TABLE_REMOTE_INSTANCE_TAGS = "REMOTE_INSTANCE_TAGS"; + //Table for notifications + public static final String TABLE_NOTIFICATION_CACHE = "NOTIFICATION_CACHE"; + //Table for main menu items + public static final String TABLE_MAIN_MENU_ITEMS = "MAIN_MENU_ITEMS"; + //Table for taking notes about accounts + public static final String TABLE_USER_NOTES = "USER_NOTES"; /*** * List of tables to manage users and data */ //Table of owned accounts static final String TABLE_USER_ACCOUNT = "USER_ACCOUNT"; - private static final String TABLE_USER_ACCOUNT_TEMP = "USER_ACCOUNT_TEMP"; //Table of stored status static final String TABLE_STATUSES_STORED = "STATUSES_STORED"; - //Table for custom emoji - public static final String TABLE_CUSTOM_EMOJI = "CUSTOM_EMOJI"; //Table for search static final String TABLE_SEARCH = "SEARCH"; - //Table for temp muting static final String TABLE_TEMP_MUTE = "TEMP_MUTE"; - - //Table for cached statuses - public static final String TABLE_STATUSES_CACHE = "STATUSES_CACHE"; - //Table for instance names static final String TABLE_INSTANCES = "INSTANCES"; - //Table for peertube favorites static final String TABLE_PEERTUBE_FAVOURITES = "PEERTUBE_FAVOURITES"; - - //Table for timeline cache - public static final String TABLE_TIMELINE_CACHE = "TIMELINE_CACHE"; - //Table for tags cache static final String TABLE_CACHE_TAGS = "CACHE_TAGS"; - - //Table for scheduling boosts - public static final String TABLE_BOOST_SCHEDULE = "BOOST_SCHEDULE"; - - //Table for blocking tracking domains - public static final String TABLE_TRACKING_BLOCK = "TRACKING_BLOCK"; - - //Table for timelines - public static final String TABLE_TIMELINES = "TIMELINES"; - - //Table for timelines - public static final String TABLE_REMOTE_INSTANCE_TAGS = "REMOTE_INSTANCE_TAGS"; - - - //Table for notifications - public static final String TABLE_NOTIFICATION_CACHE = "NOTIFICATION_CACHE"; - - //Table for main menu items - public static final String TABLE_MAIN_MENU_ITEMS = "MAIN_MENU_ITEMS"; - - //Table for taking notes about accounts - public static final String TABLE_USER_NOTES = "USER_NOTES"; - static final String COL_USER_ID = "USER_ID"; static final String COL_USERNAME = "USERNAME"; static final String COL_ACCT = "ACCT"; @@ -134,7 +114,76 @@ public class Sqlite extends SQLiteOpenHelper { static final String COL_UPDATED_AT = "UPDATED_AT"; static final String COL_PRIVACY = "PRIVACY"; static final String COL_SENSITIVE = "SENSITIVE"; - + static final String COL_ID = "ID"; + static final String COL_STATUS_SERIALIZED = "STATUS_SERIALIZED"; + static final String COL_STATUS_REPLY_SERIALIZED = "STATUS_REPLY_SERIALIZED"; + static final String COL_DATE_CREATION = "DATE_CREATION"; + static final String COL_IS_SCHEDULED = "IS_SCHEDULED"; + static final String COL_DATE_SCHEDULED = "DATE_SCHEDULED"; + static final String COL_SENT = "SENT"; + static final String COL_DATE_SENT = "DATE_SENT"; + static final String COL_SHORTCODE = "SHORTCODE"; + static final String COL_URL_STATIC = "URL_STATIC"; + static final String COL_KEYWORDS = "KEYWORDS"; + static final String COL_IS_ART = "IS_ART"; + static final String COL_IS_NSFW = "IS_NSFW"; + static final String COL_ANY = "ANY_TAG"; + static final String COL_ALL = "ALL_TAG"; + static final String COL_NONE = "NONE_TAG"; + static final String COL_NAME = "NAME"; + static final String COL_TARGETED_USER_ID = "TARGETED_USER_ID"; + static final String COL_DATE_END = "DATE_END"; + static final String COL_CACHED_ACTION = "CACHED_ACTION"; + static final String COL_STATUS_ID = "STATUS_ID"; + static final String COL_URI = "URI"; + static final String COL_ACCOUNT = "ACCOUNT"; + static final String COL_IN_REPLY_TO_ID = "IN_REPLY_TO_ID"; + static final String COL_IN_REPLY_TO_ACCOUNT_ID = "IN_REPLY_TO_ACCOUNT_ID"; + static final String COL_REBLOG = "REBLOG"; + static final String COL_CONTENT = "CONTENT"; + static final String COL_REBLOGS_COUNT = "REBLOGS_COUNT"; + static final String COL_FAVOURITES_COUNT = "FAVOURITES_COUNT"; + static final String COL_REBLOGGED = "REBLOGGED"; + static final String COL_FAVOURITED = "FAVOURITED"; + static final String COL_MUTED = "MUTED"; + static final String COL_SPOILER_TEXT = "SPOILER_TEXT"; + static final String COL_VISIBILITY = "VISIBILITY"; + static final String COL_MEDIA_ATTACHMENTS = "MEDIA_ATTACHMENTS"; + static final String COL_MENTIONS = "MENTIONS"; + static final String COL_TAGS = "TAGS"; + static final String COL_APPLICATION = "APPLICATION"; + static final String COL_LANGUAGE = "LANGUAGE"; + static final String COL_PINNED = "PINNED"; + static final String COL_DATE_BACKUP = "DATE_BACKUP"; + static final String COL_CARD = "CARD"; + static final String COL_INSTANCE_TYPE = "INSTANCE_TYPE"; + static final String COL_FILTERED_WITH = "FILTERED_WITH"; + static final String COL_UUID = "UUID"; + static final String COL_CACHE = "CACHE"; + static final String COL_DATE = "DATE"; + static final String COL_DOMAIN = "DOMAIN"; + static final String COL_TYPE = "TYPE"; + static final String COL_LIST_TIMELINE = "LIST_TIMELINE"; + static final String COL_DISPLAYED = "DISPLAYED"; + static final String COL_POSITION = "POSITION"; + static final String COL_REMOTE_INSTANCE = "REMOTE_INSTANCE"; + static final String COL_TAG_TIMELINE = "TAG_TIMELINE"; + static final String COL_NOTIFICATION_ID = "NOTIFICATION_ID"; + static final String COL_STATUS_ID_CACHE = "STATUS_ID_CACHE"; + static final String COL_NAV_NEWS = "NAV_NEWS"; + static final String COL_NAV_LIST = "NAV_LIST"; + static final String COL_NAV_SCHEDULED = "NAV_SCHEDULED"; + static final String COL_NAV_ARCHIVE = "NAV_ARCHIVE"; + static final String COL_NAV_ARCHIVE_NOTIFICATIONS = "NAV_ARCHIVE_NOTIFICATIONS"; + static final String COL_NAV_PEERTUBE = "NAV_PEERTUBE"; + static final String COL_NAV_FILTERS = "NAV_FILTERS"; + static final String COL_NAV_HOW_TO_FOLLOW = "NAV_HOW_TO_FOLLOW"; + static final String COL_NAV_ADMINISTRATION = "NAV_ADMINISTRATION"; + static final String COL_NAV_BLOCKED = "NAV_BLOCKED"; + static final String COL_NAV_MUTED = "NAV_MUTED"; + static final String COL_NAV_BLOCKED_DOMAINS = "NAV_BLOCKED_DOMAINS"; + static final String COL_NAV_HOWTO = "NAV_HOWTO"; + private static final String TABLE_USER_ACCOUNT_TEMP = "USER_ACCOUNT_TEMP"; private static final String CREATE_TABLE_USER_ACCOUNT = "CREATE TABLE " + TABLE_USER_ACCOUNT + " (" + COL_USER_ID + " TEXT, " + COL_USERNAME + " TEXT NOT NULL, " + COL_ACCT + " TEXT NOT NULL, " + COL_DISPLAYED_NAME + " TEXT NOT NULL, " + COL_LOCKED + " INTEGER NOT NULL, " @@ -151,140 +200,20 @@ public class Sqlite extends SQLiteOpenHelper { + COL_PRIVACY + " TEXT, " + COL_SENSITIVE + " INTEGER DEFAULT 0, " + COL_INSTANCE + " TEXT NOT NULL, " + COL_OAUTHTOKEN + " TEXT NOT NULL, " + COL_CREATED_AT + " TEXT NOT NULL)"; - - - static final String COL_ID = "ID"; - static final String COL_STATUS_SERIALIZED = "STATUS_SERIALIZED"; - static final String COL_STATUS_REPLY_SERIALIZED = "STATUS_REPLY_SERIALIZED"; - static final String COL_DATE_CREATION = "DATE_CREATION"; - static final String COL_IS_SCHEDULED = "IS_SCHEDULED"; - static final String COL_DATE_SCHEDULED = "DATE_SCHEDULED"; - static final String COL_SENT = "SENT"; - static final String COL_DATE_SENT = "DATE_SENT"; - private static final String CREATE_TABLE_STATUSES_STORED = "CREATE TABLE " + TABLE_STATUSES_STORED + " (" + COL_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + COL_USER_ID + " TEXT NOT NULL, " + COL_INSTANCE + " TEXT NOT NULL, " + COL_STATUS_SERIALIZED + " TEXT NOT NULL, " + COL_STATUS_REPLY_SERIALIZED + " TEXT, " + COL_DATE_CREATION + " TEXT NOT NULL, " + COL_IS_SCHEDULED + " INTEGER NOT NULL, " + COL_DATE_SCHEDULED + " TEXT, " + COL_SENT + " INTEGER NOT NULL, " + COL_DATE_SENT + " TEXT)"; - - - static final String COL_SHORTCODE = "SHORTCODE"; - static final String COL_URL_STATIC = "URL_STATIC"; - private final String CREATE_TABLE_CUSTOM_EMOJI = "CREATE TABLE " + TABLE_CUSTOM_EMOJI + " (" - + COL_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " - + COL_SHORTCODE + " TEXT NOT NULL, " + COL_INSTANCE + " TEXT NOT NULL, " - + COL_URL + " TEXT NOT NULL, " + COL_URL_STATIC + " TEXT NOT NULL, " + COL_DATE_CREATION + " TEXT NOT NULL)"; - - - static final String COL_KEYWORDS = "KEYWORDS"; - static final String COL_IS_ART = "IS_ART"; - static final String COL_IS_NSFW = "IS_NSFW"; - static final String COL_ANY = "ANY_TAG"; - static final String COL_ALL = "ALL_TAG"; - static final String COL_NONE = "NONE_TAG"; - static final String COL_NAME = "NAME"; - private final String CREATE_TABLE_SEARCH = "CREATE TABLE " + TABLE_SEARCH + " (" - + COL_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " - + COL_KEYWORDS + " TEXT NOT NULL, " + COL_USER_ID + " TEXT NOT NULL, " - + COL_ANY + " TEXT, " + COL_ALL + " TEXT, " + COL_NONE + " TEXT, " + COL_NAME + " TEXT, " - + COL_IS_ART + " INTEGER DEFAULT 0, " + COL_IS_NSFW + " INTEGER DEFAULT 0, " - + COL_DATE_CREATION + " TEXT NOT NULL)"; - - static final String COL_TARGETED_USER_ID = "TARGETED_USER_ID"; - static final String COL_DATE_END = "DATE_END"; - private final String CREATE_TABLE_TEMP_MUTE = "CREATE TABLE " + TABLE_TEMP_MUTE + " (" - + COL_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " - + COL_ACCT + " TEXT NOT NULL, " + COL_INSTANCE + " TEXT NOT NULL, " + COL_TARGETED_USER_ID + " TEXT NOT NULL, " + COL_DATE_CREATION + " TEXT NOT NULL, " + COL_DATE_END + " TEXT NOT NULL)"; - - - static final String COL_CACHED_ACTION = "CACHED_ACTION"; - static final String COL_STATUS_ID = "STATUS_ID"; - static final String COL_URI = "URI"; - static final String COL_ACCOUNT = "ACCOUNT"; - static final String COL_IN_REPLY_TO_ID = "IN_REPLY_TO_ID"; - static final String COL_IN_REPLY_TO_ACCOUNT_ID = "IN_REPLY_TO_ACCOUNT_ID"; - static final String COL_REBLOG = "REBLOG"; - static final String COL_CONTENT = "CONTENT"; - static final String COL_REBLOGS_COUNT = "REBLOGS_COUNT"; - static final String COL_FAVOURITES_COUNT = "FAVOURITES_COUNT"; - static final String COL_REBLOGGED = "REBLOGGED"; - static final String COL_FAVOURITED = "FAVOURITED"; - static final String COL_MUTED = "MUTED"; - - static final String COL_SPOILER_TEXT = "SPOILER_TEXT"; - static final String COL_VISIBILITY = "VISIBILITY"; - static final String COL_MEDIA_ATTACHMENTS = "MEDIA_ATTACHMENTS"; - static final String COL_MENTIONS = "MENTIONS"; - static final String COL_TAGS = "TAGS"; - static final String COL_APPLICATION = "APPLICATION"; - static final String COL_LANGUAGE = "LANGUAGE"; - static final String COL_PINNED = "PINNED"; - static final String COL_DATE_BACKUP = "DATE_BACKUP"; - static final String COL_CARD = "CARD"; - - - private final String CREATE_TABLE_STATUSES_CACHE = "CREATE TABLE " + TABLE_STATUSES_CACHE + " (" - + COL_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " - + COL_CACHED_ACTION + " INTEGER NOT NULL, " + COL_INSTANCE + " TEXT NOT NULL, " + COL_USER_ID + " NOT NULL, " + COL_DATE_BACKUP + " TEXT NOT NULL, " - + COL_STATUS_ID + " TEXT NOT NULL, " + COL_URI + " TEXT NOT NULL, " + COL_URL + " TEXT NOT NULL, " - + COL_ACCOUNT + " TEXT NOT NULL, " + COL_IN_REPLY_TO_ID + " TEXT, " + COL_IN_REPLY_TO_ACCOUNT_ID + " TEXT," - + COL_REBLOG + " TEXT, " + COL_CONTENT + " TEXT NOT NULL, " + COL_CREATED_AT + " TEXT NOT NULL, " - + COL_EMOJIS + " TEXT, " + COL_REBLOGS_COUNT + " INTEGER NOT NULL, " + COL_FAVOURITES_COUNT + " INTEGER NOT NULL, " - + COL_REBLOGGED + " INTEGER, " + COL_FAVOURITED + " INTEGER, " + COL_MUTED + " INTEGER, " + COL_SENSITIVE + " INTEGER, " - + COL_SPOILER_TEXT + " TEXT, " + COL_VISIBILITY + " TEXT NOT NULL, " + COL_MEDIA_ATTACHMENTS + " TEXT," + COL_CARD + " TEXT," - + COL_MENTIONS + " TEXT, " + COL_TAGS + " TEXT, " + COL_APPLICATION + " TEXT," - + COL_LANGUAGE + " TEXT," + COL_PINNED + " INTEGER)"; - - private final String CREATE_UNIQUE_CACHE_INDEX = "CREATE UNIQUE INDEX instance_statusid on " - + TABLE_STATUSES_CACHE + "(" + COL_INSTANCE + "," + COL_STATUS_ID + "," + COL_CACHED_ACTION + ")"; - - static final String COL_INSTANCE_TYPE = "INSTANCE_TYPE"; - static final String COL_FILTERED_WITH = "FILTERED_WITH"; - private final String CREATE_TABLE_INSTANCES = "CREATE TABLE " + TABLE_INSTANCES + " (" - + COL_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " - + COL_INSTANCE + " TEXT NOT NULL, " + COL_USER_ID + " TEXT NOT NULL, " + COL_INSTANCE_TYPE + " TEXT, " + COL_TAGS + " TEXT, " + COL_FILTERED_WITH + " TEXT, " + COL_DATE_CREATION + " TEXT NOT NULL)"; - - - static final String COL_UUID = "UUID"; - static final String COL_CACHE = "CACHE"; - static final String COL_DATE = "DATE"; - - private final String CREATE_TABLE_PEERTUBE_FAVOURITES = "CREATE TABLE " - + TABLE_PEERTUBE_FAVOURITES + "(" - + COL_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " - + COL_UUID + " TEXT NOT NULL, " - + COL_INSTANCE + " TEXT NOT NULL, " - + COL_CACHE + " TEXT NOT NULL, " - + COL_DATE + " TEXT NOT NULL)"; - - - private final String CREATE_TABLE_CACHE_TAGS = "CREATE TABLE " - + TABLE_CACHE_TAGS + "(" - + COL_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " - + COL_TAGS + " TEXT NOT NULL)"; - - private static final String CREATE_TABLE_BOOST_SCHEDULE = "CREATE TABLE " + TABLE_BOOST_SCHEDULE + " (" + COL_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + COL_USER_ID + " TEXT NOT NULL, " + COL_INSTANCE + " TEXT NOT NULL, " + COL_STATUS_SERIALIZED + " TEXT NOT NULL, " + COL_DATE_SCHEDULED + " TEXT, " + COL_IS_SCHEDULED + " INTEGER NOT NULL, " + COL_SENT + " INTEGER NOT NULL, " + COL_DATE_SENT + " TEXT)"; - - - static final String COL_DOMAIN = "DOMAIN"; private static final String CREATE_TABLE_TRACKING_BLOCK = "CREATE TABLE " + TABLE_TRACKING_BLOCK + " (" + COL_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + COL_DOMAIN + " TEXT NOT NULL)"; - - static final String COL_TYPE = "TYPE"; - static final String COL_LIST_TIMELINE = "LIST_TIMELINE"; - static final String COL_DISPLAYED = "DISPLAYED"; - static final String COL_POSITION = "POSITION"; - static final String COL_REMOTE_INSTANCE = "REMOTE_INSTANCE"; - static final String COL_TAG_TIMELINE = "TAG_TIMELINE"; - private static final String CREATE_TABLE_TIMELINES = "CREATE TABLE IF NOT EXISTS " + TABLE_TIMELINES + " (" + COL_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + COL_POSITION + " INTEGER NOT NULL, " @@ -294,8 +223,6 @@ public class Sqlite extends SQLiteOpenHelper { + COL_TAG_TIMELINE + " TEXT, " + COL_DISPLAYED + " INTEGER NOT NULL, " + COL_LIST_TIMELINE + " TEXT)"; - - private static final String CREATE_TABLE_TIMELINE_CACHE = "CREATE TABLE " + TABLE_TIMELINE_CACHE + "(" + COL_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " @@ -304,10 +231,6 @@ public class Sqlite extends SQLiteOpenHelper { + COL_USER_ID + " TEXT NOT NULL, " + COL_CACHE + " TEXT NOT NULL, " + COL_DATE + " TEXT NOT NULL)"; - - - static final String COL_NOTIFICATION_ID = "NOTIFICATION_ID"; - static final String COL_STATUS_ID_CACHE = "STATUS_ID_CACHE"; private static final String CREATE_TABLE_NOTIFICATIONS = "CREATE TABLE " + TABLE_NOTIFICATION_CACHE + "(" + COL_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " @@ -320,21 +243,6 @@ public class Sqlite extends SQLiteOpenHelper { + COL_IN_REPLY_TO_ID + " TEXT, " + COL_STATUS_ID_CACHE + " INTEGER, " + COL_CREATED_AT + " TEXT NOT NULL)"; - - static final String COL_NAV_NEWS = "NAV_NEWS"; - static final String COL_NAV_LIST = "NAV_LIST"; - static final String COL_NAV_SCHEDULED = "NAV_SCHEDULED"; - static final String COL_NAV_ARCHIVE = "NAV_ARCHIVE"; - static final String COL_NAV_ARCHIVE_NOTIFICATIONS = "NAV_ARCHIVE_NOTIFICATIONS"; - static final String COL_NAV_PEERTUBE = "NAV_PEERTUBE"; - static final String COL_NAV_FILTERS = "NAV_FILTERS"; - static final String COL_NAV_HOW_TO_FOLLOW = "NAV_HOW_TO_FOLLOW"; - static final String COL_NAV_ADMINISTRATION = "NAV_ADMINISTRATION"; - static final String COL_NAV_BLOCKED = "NAV_BLOCKED"; - static final String COL_NAV_MUTED = "NAV_MUTED"; - static final String COL_NAV_BLOCKED_DOMAINS = "NAV_BLOCKED_DOMAINS"; - static final String COL_NAV_HOWTO = "NAV_HOWTO"; - private static final String CREATE_TABLE_MAIN_MENU_ITEMS = "CREATE TABLE " + TABLE_MAIN_MENU_ITEMS + "(" + COL_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " @@ -353,14 +261,54 @@ public class Sqlite extends SQLiteOpenHelper { + COL_NAV_MUTED + " INTEGER DEFAULT 1, " + COL_NAV_BLOCKED_DOMAINS + " INTEGER DEFAULT 1, " + COL_NAV_HOWTO + " INTEGER DEFAULT 1)"; - - private static final String CREATE_TABLE_USER_NOTES = "CREATE TABLE " + TABLE_USER_NOTES + "(" + COL_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + COL_ACCT + " TEXT NOT NULL, " + COL_NOTE + " TEXT, " + COL_DATE_CREATION + " TEXT NOT NULL)"; + public static SQLiteDatabase db; + private static Sqlite sInstance; + private final String CREATE_TABLE_CUSTOM_EMOJI = "CREATE TABLE " + TABLE_CUSTOM_EMOJI + " (" + + COL_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + + COL_SHORTCODE + " TEXT NOT NULL, " + COL_INSTANCE + " TEXT NOT NULL, " + + COL_URL + " TEXT NOT NULL, " + COL_URL_STATIC + " TEXT NOT NULL, " + COL_DATE_CREATION + " TEXT NOT NULL)"; + private final String CREATE_TABLE_SEARCH = "CREATE TABLE " + TABLE_SEARCH + " (" + + COL_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + + COL_KEYWORDS + " TEXT NOT NULL, " + COL_USER_ID + " TEXT NOT NULL, " + + COL_ANY + " TEXT, " + COL_ALL + " TEXT, " + COL_NONE + " TEXT, " + COL_NAME + " TEXT, " + + COL_IS_ART + " INTEGER DEFAULT 0, " + COL_IS_NSFW + " INTEGER DEFAULT 0, " + + COL_DATE_CREATION + " TEXT NOT NULL)"; + private final String CREATE_TABLE_TEMP_MUTE = "CREATE TABLE " + TABLE_TEMP_MUTE + " (" + + COL_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + + COL_ACCT + " TEXT NOT NULL, " + COL_INSTANCE + " TEXT NOT NULL, " + COL_TARGETED_USER_ID + " TEXT NOT NULL, " + COL_DATE_CREATION + " TEXT NOT NULL, " + COL_DATE_END + " TEXT NOT NULL)"; + private final String CREATE_TABLE_STATUSES_CACHE = "CREATE TABLE " + TABLE_STATUSES_CACHE + " (" + + COL_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + + COL_CACHED_ACTION + " INTEGER NOT NULL, " + COL_INSTANCE + " TEXT NOT NULL, " + COL_USER_ID + " NOT NULL, " + COL_DATE_BACKUP + " TEXT NOT NULL, " + + COL_STATUS_ID + " TEXT NOT NULL, " + COL_URI + " TEXT NOT NULL, " + COL_URL + " TEXT NOT NULL, " + + COL_ACCOUNT + " TEXT NOT NULL, " + COL_IN_REPLY_TO_ID + " TEXT, " + COL_IN_REPLY_TO_ACCOUNT_ID + " TEXT," + + COL_REBLOG + " TEXT, " + COL_CONTENT + " TEXT NOT NULL, " + COL_CREATED_AT + " TEXT NOT NULL, " + + COL_EMOJIS + " TEXT, " + COL_REBLOGS_COUNT + " INTEGER NOT NULL, " + COL_FAVOURITES_COUNT + " INTEGER NOT NULL, " + + COL_REBLOGGED + " INTEGER, " + COL_FAVOURITED + " INTEGER, " + COL_MUTED + " INTEGER, " + COL_SENSITIVE + " INTEGER, " + + COL_SPOILER_TEXT + " TEXT, " + COL_VISIBILITY + " TEXT NOT NULL, " + COL_MEDIA_ATTACHMENTS + " TEXT," + COL_CARD + " TEXT," + + COL_MENTIONS + " TEXT, " + COL_TAGS + " TEXT, " + COL_APPLICATION + " TEXT," + + COL_LANGUAGE + " TEXT," + COL_PINNED + " INTEGER)"; + private final String CREATE_UNIQUE_CACHE_INDEX = "CREATE UNIQUE INDEX instance_statusid on " + + TABLE_STATUSES_CACHE + "(" + COL_INSTANCE + "," + COL_STATUS_ID + "," + COL_CACHED_ACTION + ")"; + private final String CREATE_TABLE_INSTANCES = "CREATE TABLE " + TABLE_INSTANCES + " (" + + COL_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + + COL_INSTANCE + " TEXT NOT NULL, " + COL_USER_ID + " TEXT NOT NULL, " + COL_INSTANCE_TYPE + " TEXT, " + COL_TAGS + " TEXT, " + COL_FILTERED_WITH + " TEXT, " + COL_DATE_CREATION + " TEXT NOT NULL)"; + private final String CREATE_TABLE_PEERTUBE_FAVOURITES = "CREATE TABLE " + + TABLE_PEERTUBE_FAVOURITES + "(" + + COL_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + + COL_UUID + " TEXT NOT NULL, " + + COL_INSTANCE + " TEXT NOT NULL, " + + COL_CACHE + " TEXT NOT NULL, " + + COL_DATE + " TEXT NOT NULL)"; + private final String CREATE_TABLE_CACHE_TAGS = "CREATE TABLE " + + TABLE_CACHE_TAGS + "(" + + COL_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + + COL_TAGS + " TEXT NOT NULL)"; public Sqlite(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) { super(context, name, factory, version); @@ -374,6 +322,57 @@ public class Sqlite extends SQLiteOpenHelper { return sInstance; } + public static void importDB(Activity activity, String backupDBPath) { + try { + db.close(); + File dbDest = activity.getDatabasePath(DB_NAME); + File dbSource = new File(backupDBPath); + FileChannel src = new FileInputStream(dbSource).getChannel(); + FileChannel dst = new FileOutputStream(dbDest).getChannel(); + dst.transferFrom(src, 0, src.size()); + src.close(); + dst.close(); + Helper.logoutCurrentUser(activity); + } catch (Exception e) { + e.printStackTrace(); + Toasty.error(activity.getApplicationContext(), activity.getString(R.string.data_import_error_simple), Toast.LENGTH_LONG).show(); + } + } + + public static void exportDB(Context context) { + try { + File sd = Environment.getExternalStorageDirectory(); + + if (sd.canWrite()) { + + String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.ENGLISH).format(new Date()); + String backupDBPath = "Fedilab_export_" + timeStamp + ".fedilab"; + File dbSource = context.getDatabasePath(DB_NAME); + File dbDest = new File(sd, backupDBPath); + FileChannel src = new FileInputStream(dbSource).getChannel(); + FileChannel dst = new FileOutputStream(dbDest).getChannel(); + dst.transferFrom(src, 0, src.size()); + src.close(); + dst.close(); + final Intent intent = new Intent(); + intent.setAction(android.content.Intent.ACTION_VIEW); + Uri uri = Uri.fromFile(dbDest); + intent.setDataAndType(uri, "*/*"); + SQLiteDatabase db = Sqlite.getInstance(context, Sqlite.DB_NAME, null, Sqlite.DB_VERSION).open(); + SharedPreferences sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, MODE_PRIVATE); + String userId = sharedpreferences.getString(Helper.PREF_KEY_ID, null); + String instance = sharedpreferences.getString(Helper.PREF_INSTANCE, Helper.getLiveInstance(context)); + Account account = new AccountDAO(context, db).getUniqAccount(userId, instance); + Helper.notify_user(context, account, intent, BitmapFactory.decodeResource(context.getResources(), + R.mipmap.ic_launcher_bubbles), Helper.NotifType.STORE, context.getString(R.string.save_over), context.getString(R.string.download_from, backupDBPath)); + Toasty.success(context, context.getString(R.string.data_base_exported), Toast.LENGTH_LONG).show(); + } + } catch (Exception e) { + e.printStackTrace(); + Toasty.error(context, context.getString(R.string.data_export_error_simple), Toast.LENGTH_LONG).show(); + } + } + @Override public void onCreate(SQLiteDatabase db) { db.execSQL(CREATE_TABLE_USER_ACCOUNT); @@ -553,56 +552,4 @@ public class Sqlite extends SQLiteOpenHelper { } - public static void importDB(Activity activity, String backupDBPath) { - try { - db.close(); - File dbDest = activity.getDatabasePath(DB_NAME); - File dbSource = new File(backupDBPath); - FileChannel src = new FileInputStream(dbSource).getChannel(); - FileChannel dst = new FileOutputStream(dbDest).getChannel(); - dst.transferFrom(src, 0, src.size()); - src.close(); - dst.close(); - Helper.logoutCurrentUser(activity); - } catch (Exception e) { - e.printStackTrace(); - Toasty.error(activity.getApplicationContext(), activity.getString(R.string.data_import_error_simple), Toast.LENGTH_LONG).show(); - } - } - - public static void exportDB(Context context) { - try { - File sd = Environment.getExternalStorageDirectory(); - - if (sd.canWrite()) { - - String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.ENGLISH).format(new Date()); - String backupDBPath = "Fedilab_export_" + timeStamp + ".fedilab"; - File dbSource = context.getDatabasePath(DB_NAME); - File dbDest = new File(sd, backupDBPath); - FileChannel src = new FileInputStream(dbSource).getChannel(); - FileChannel dst = new FileOutputStream(dbDest).getChannel(); - dst.transferFrom(src, 0, src.size()); - src.close(); - dst.close(); - final Intent intent = new Intent(); - intent.setAction(android.content.Intent.ACTION_VIEW); - Uri uri = Uri.fromFile(dbDest); - intent.setDataAndType(uri, "*/*"); - SQLiteDatabase db = Sqlite.getInstance(context, Sqlite.DB_NAME, null, Sqlite.DB_VERSION).open(); - SharedPreferences sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, MODE_PRIVATE); - String userId = sharedpreferences.getString(Helper.PREF_KEY_ID, null); - String instance = sharedpreferences.getString(Helper.PREF_INSTANCE, Helper.getLiveInstance(context)); - Account account = new AccountDAO(context, db).getUniqAccount(userId, instance); - Helper.notify_user(context, account, intent, BitmapFactory.decodeResource(context.getResources(), - R.mipmap.ic_launcher_bubbles), Helper.NotifType.STORE, context.getString(R.string.save_over), context.getString(R.string.download_from, backupDBPath)); - Toasty.success(context, context.getString(R.string.data_base_exported), Toast.LENGTH_LONG).show(); - } - } catch (Exception e) { - e.printStackTrace(); - Toasty.error(context, context.getString(R.string.data_export_error_simple), Toast.LENGTH_LONG).show(); - } - } - - } diff --git a/app/src/main/java/app/fedilab/android/sqlite/StatusCacheDAO.java b/app/src/main/java/app/fedilab/android/sqlite/StatusCacheDAO.java index f8a1fa8bb..42b94d9f3 100644 --- a/app/src/main/java/app/fedilab/android/sqlite/StatusCacheDAO.java +++ b/app/src/main/java/app/fedilab/android/sqlite/StatusCacheDAO.java @@ -42,13 +42,12 @@ import app.fedilab.android.helper.Helper; */ public class StatusCacheDAO { - private SQLiteDatabase db; - public Context context; - //Type of cache public static int BOOKMARK_CACHE = 0; public static int ARCHIVE_CACHE = 1; public static int NOTIFICATION_CACHE = 2; + public Context context; + private SQLiteDatabase db; public StatusCacheDAO(Context context, SQLiteDatabase db) { //Creation of the DB with tables @@ -332,9 +331,9 @@ public class StatusCacheDAO { String order = Sqlite.COL_CREATED_AT + " DESC"; if (filterToots.getOrder() != null) { - if( filterToots.getOrder() == FilterToots.typeOrder.ASC ){ + if (filterToots.getOrder() == FilterToots.typeOrder.ASC) { order = Sqlite.COL_CREATED_AT + " ASC"; - }else if(filterToots.getOrder() == FilterToots.typeOrder.DESC) { + } else if (filterToots.getOrder() == FilterToots.typeOrder.DESC) { order = Sqlite.COL_CREATED_AT + " DESC"; } } diff --git a/app/src/main/java/app/fedilab/android/sqlite/StatusStoredDAO.java b/app/src/main/java/app/fedilab/android/sqlite/StatusStoredDAO.java index 3544673dc..889bf0515 100644 --- a/app/src/main/java/app/fedilab/android/sqlite/StatusStoredDAO.java +++ b/app/src/main/java/app/fedilab/android/sqlite/StatusStoredDAO.java @@ -35,8 +35,8 @@ import app.fedilab.android.helper.Helper; */ public class StatusStoredDAO { - private SQLiteDatabase db; public Context context; + private SQLiteDatabase db; public StatusStoredDAO(Context context, SQLiteDatabase db) { diff --git a/app/src/main/java/app/fedilab/android/sqlite/TagsCacheDAO.java b/app/src/main/java/app/fedilab/android/sqlite/TagsCacheDAO.java index 1c44d866f..1a43a3698 100644 --- a/app/src/main/java/app/fedilab/android/sqlite/TagsCacheDAO.java +++ b/app/src/main/java/app/fedilab/android/sqlite/TagsCacheDAO.java @@ -29,8 +29,8 @@ import java.util.List; */ public class TagsCacheDAO { - private SQLiteDatabase db; public Context context; + private SQLiteDatabase db; public TagsCacheDAO(Context context, SQLiteDatabase db) { //Creation of the DB with tables diff --git a/app/src/main/java/app/fedilab/android/sqlite/TempMuteDAO.java b/app/src/main/java/app/fedilab/android/sqlite/TempMuteDAO.java index 14a93d6da..5671f141d 100644 --- a/app/src/main/java/app/fedilab/android/sqlite/TempMuteDAO.java +++ b/app/src/main/java/app/fedilab/android/sqlite/TempMuteDAO.java @@ -33,8 +33,8 @@ import app.fedilab.android.helper.Helper; */ public class TempMuteDAO { - private SQLiteDatabase db; public Context context; + private SQLiteDatabase db; public TempMuteDAO(Context context, SQLiteDatabase db) { //Creation of the DB with tables diff --git a/app/src/main/java/app/fedilab/android/sqlite/TimelineCacheDAO.java b/app/src/main/java/app/fedilab/android/sqlite/TimelineCacheDAO.java index b83f0fea2..f3b0f8b8e 100644 --- a/app/src/main/java/app/fedilab/android/sqlite/TimelineCacheDAO.java +++ b/app/src/main/java/app/fedilab/android/sqlite/TimelineCacheDAO.java @@ -38,8 +38,8 @@ import app.fedilab.android.helper.Helper; */ public class TimelineCacheDAO { - private SQLiteDatabase db; public Context context; + private SQLiteDatabase db; public TimelineCacheDAO(Context context, SQLiteDatabase db) { //Creation of the DB with tables diff --git a/app/src/main/java/app/fedilab/android/sqlite/TimelinesDAO.java b/app/src/main/java/app/fedilab/android/sqlite/TimelinesDAO.java index 019534d6d..710c41a0e 100644 --- a/app/src/main/java/app/fedilab/android/sqlite/TimelinesDAO.java +++ b/app/src/main/java/app/fedilab/android/sqlite/TimelinesDAO.java @@ -29,8 +29,8 @@ import app.fedilab.android.helper.Helper; public class TimelinesDAO { - private SQLiteDatabase db; public Context context; + private SQLiteDatabase db; public TimelinesDAO(Context context, SQLiteDatabase db) { //Creation of the DB with tables diff --git a/app/src/main/java/app/fedilab/android/webview/MastalabWebChromeClient.java b/app/src/main/java/app/fedilab/android/webview/MastalabWebChromeClient.java index 71ab2a15e..72f2c5d0b 100644 --- a/app/src/main/java/app/fedilab/android/webview/MastalabWebChromeClient.java +++ b/app/src/main/java/app/fedilab/android/webview/MastalabWebChromeClient.java @@ -14,14 +14,9 @@ package app.fedilab.android.webview; * You should have received a copy of the GNU General Public License along with Fedilab; if not, * see . */ -import android.annotation.SuppressLint; import android.app.Activity; import android.graphics.Bitmap; import android.media.MediaPlayer; - -import androidx.appcompat.app.ActionBar; -import androidx.appcompat.app.AppCompatActivity; - import android.view.LayoutInflater; import android.view.SurfaceView; import android.view.View; @@ -34,6 +29,9 @@ import android.widget.LinearLayout; import android.widget.ProgressBar; import android.widget.TextView; +import androidx.appcompat.app.ActionBar; +import androidx.appcompat.app.AppCompatActivity; + import app.fedilab.android.R; /** @@ -56,10 +54,6 @@ public class MastalabWebChromeClient extends WebChromeClient implements MediaPla private Activity activity; - public interface ToggledFullscreenCallback { - void toggledFullscreen(boolean fullscreen); - } - public MastalabWebChromeClient(Activity activity, CustomWebview webView, FrameLayout activityNonVideoView, ViewGroup activityVideoView) { this.activity = activity; this.isVideoFullscreen = false; @@ -82,7 +76,6 @@ public class MastalabWebChromeClient extends WebChromeClient implements MediaPla } } - @Override public void onReceivedIcon(WebView view, Bitmap icon) { super.onReceivedIcon(view, icon); @@ -103,9 +96,6 @@ public class MastalabWebChromeClient extends WebChromeClient implements MediaPla } - //FULLSCREEN VIDEO - //Code from https://stackoverflow.com/a/16179544/3197259 - /** * Set a callback that will be fired when the video starts or finishes displaying using a custom view (typically full-screen) * @@ -115,6 +105,9 @@ public class MastalabWebChromeClient extends WebChromeClient implements MediaPla this.toggledFullscreenCallback = callback; } + //FULLSCREEN VIDEO + //Code from https://stackoverflow.com/a/16179544/3197259 + @Override public void onShowCustomView(View view, WebChromeClient.CustomViewCallback callback) { if (view instanceof FrameLayout) { @@ -228,5 +221,9 @@ public class MastalabWebChromeClient extends WebChromeClient implements MediaPla return false; // By returning false, onCompletion() will be called } + public interface ToggledFullscreenCallback { + void toggledFullscreen(boolean fullscreen); + } + } diff --git a/app/src/main/java/app/fedilab/android/webview/MastalabWebViewClient.java b/app/src/main/java/app/fedilab/android/webview/MastalabWebViewClient.java index f4cd20a4c..9718c3b89 100644 --- a/app/src/main/java/app/fedilab/android/webview/MastalabWebViewClient.java +++ b/app/src/main/java/app/fedilab/android/webview/MastalabWebViewClient.java @@ -18,10 +18,6 @@ package app.fedilab.android.webview; import android.app.Activity; import android.graphics.Bitmap; import android.net.http.SslError; - -import androidx.appcompat.app.ActionBar; -import androidx.appcompat.app.AppCompatActivity; - import android.view.LayoutInflater; import android.view.View; import android.webkit.SslErrorHandler; @@ -32,6 +28,9 @@ import android.webkit.WebViewClient; import android.widget.LinearLayout; import android.widget.TextView; +import androidx.appcompat.app.ActionBar; +import androidx.appcompat.app.AppCompatActivity; + import java.io.ByteArrayInputStream; import java.net.URI; import java.net.URISyntaxException; @@ -49,6 +48,7 @@ import app.fedilab.android.helper.Helper; public class MastalabWebViewClient extends WebViewClient { + public List domains = new ArrayList<>(); private Activity activity; private int count = 0; @@ -56,8 +56,6 @@ public class MastalabWebViewClient extends WebViewClient { this.activity = activity; } - public List domains = new ArrayList<>(); - @Override public void onPageFinished(WebView view, String url) { super.onPageFinished(view, url); diff --git a/app/src/main/java/app/fedilab/android/webview/ProxyHelper.java b/app/src/main/java/app/fedilab/android/webview/ProxyHelper.java index 1a4b69792..3035bf57b 100644 --- a/app/src/main/java/app/fedilab/android/webview/ProxyHelper.java +++ b/app/src/main/java/app/fedilab/android/webview/ProxyHelper.java @@ -19,9 +19,7 @@ import android.content.Context; import android.content.Intent; import android.net.Proxy; import android.os.Build; -import android.os.Parcelable; import android.util.ArrayMap; -import android.webkit.WebView; import java.lang.reflect.Constructor; import java.lang.reflect.Field; diff --git a/app/src/main/res/anim/enter_from_left.xml b/app/src/main/res/anim/enter_from_left.xml deleted file mode 100644 index 9f125e05f..000000000 --- a/app/src/main/res/anim/enter_from_left.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - \ No newline at end of file diff --git a/app/src/main/res/anim/enter_from_right.xml b/app/src/main/res/anim/enter_from_right.xml deleted file mode 100644 index 735ae4224..000000000 --- a/app/src/main/res/anim/enter_from_right.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - \ No newline at end of file diff --git a/app/src/main/res/anim/exit_to_left.xml b/app/src/main/res/anim/exit_to_left.xml deleted file mode 100644 index 44e65a752..000000000 --- a/app/src/main/res/anim/exit_to_left.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - \ No newline at end of file diff --git a/app/src/main/res/anim/exit_to_right.xml b/app/src/main/res/anim/exit_to_right.xml deleted file mode 100644 index 6c68a61b7..000000000 --- a/app/src/main/res/anim/exit_to_right.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - \ No newline at end of file diff --git a/app/src/main/res/anim/fadein.xml b/app/src/main/res/anim/fadein.xml deleted file mode 100644 index fe9e8b96a..000000000 --- a/app/src/main/res/anim/fadein.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - \ No newline at end of file diff --git a/app/src/main/res/anim/fadeout.xml b/app/src/main/res/anim/fadeout.xml deleted file mode 100644 index 77de55f71..000000000 --- a/app/src/main/res/anim/fadeout.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable-anydpi-v24/ic_plain_atom.xml b/app/src/main/res/drawable-anydpi-v24/ic_plain_atom.xml index 022db7fbe..03ba819cb 100644 --- a/app/src/main/res/drawable-anydpi-v24/ic_plain_atom.xml +++ b/app/src/main/res/drawable-anydpi-v24/ic_plain_atom.xml @@ -1,23 +1,23 @@ - - - - - + android:viewportHeight="582.036"> + + + + + diff --git a/app/src/main/res/drawable-anydpi-v24/ic_plain_bubbles.xml b/app/src/main/res/drawable-anydpi-v24/ic_plain_bubbles.xml index 84b6de6c5..8c2f265f8 100644 --- a/app/src/main/res/drawable-anydpi-v24/ic_plain_bubbles.xml +++ b/app/src/main/res/drawable-anydpi-v24/ic_plain_bubbles.xml @@ -1,20 +1,21 @@ - - - - + android:viewportHeight="230.31361"> + + + + diff --git a/app/src/main/res/drawable-anydpi-v24/ic_plain_crash.xml b/app/src/main/res/drawable-anydpi-v24/ic_plain_crash.xml index 7df3866f6..8ad12b3de 100644 --- a/app/src/main/res/drawable-anydpi-v24/ic_plain_crash.xml +++ b/app/src/main/res/drawable-anydpi-v24/ic_plain_crash.xml @@ -1,83 +1,83 @@ - - - - - - - - - - - - - - - - - - - - + android:viewportHeight="613.37164"> + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable-anydpi-v24/ic_plain_fediverse.xml b/app/src/main/res/drawable-anydpi-v24/ic_plain_fediverse.xml index b4af6d97e..9f3dc38c2 100644 --- a/app/src/main/res/drawable-anydpi-v24/ic_plain_fediverse.xml +++ b/app/src/main/res/drawable-anydpi-v24/ic_plain_fediverse.xml @@ -1,70 +1,71 @@ - - - - - - - - - - - - - - - - - + android:viewportHeight="234.67982"> + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable-anydpi-v24/ic_plain_hero.xml b/app/src/main/res/drawable-anydpi-v24/ic_plain_hero.xml index 9cc97c40f..da3fb6193 100644 --- a/app/src/main/res/drawable-anydpi-v24/ic_plain_hero.xml +++ b/app/src/main/res/drawable-anydpi-v24/ic_plain_hero.xml @@ -1,20 +1,21 @@ - - - - + android:viewportHeight="741.2781"> + + + + diff --git a/app/src/main/res/drawable-anydpi/ic_account_circle_acct.xml b/app/src/main/res/drawable-anydpi/ic_account_circle_acct.xml index 38d58a889..0db3985c9 100644 --- a/app/src/main/res/drawable-anydpi/ic_account_circle_acct.xml +++ b/app/src/main/res/drawable-anydpi/ic_account_circle_acct.xml @@ -1,5 +1,10 @@ - - + + diff --git a/app/src/main/res/drawable-anydpi/ic_action_add_new.xml b/app/src/main/res/drawable-anydpi/ic_action_add_new.xml index bb025d98c..896a4fe73 100644 --- a/app/src/main/res/drawable-anydpi/ic_action_add_new.xml +++ b/app/src/main/res/drawable-anydpi/ic_action_add_new.xml @@ -1,5 +1,10 @@ - - + + diff --git a/app/src/main/res/drawable-anydpi/ic_add_a_photo_pixelfed.xml b/app/src/main/res/drawable-anydpi/ic_add_a_photo_pixelfed.xml index 31e68300c..6ffa6d24e 100644 --- a/app/src/main/res/drawable-anydpi/ic_add_a_photo_pixelfed.xml +++ b/app/src/main/res/drawable-anydpi/ic_add_a_photo_pixelfed.xml @@ -1,5 +1,10 @@ - - + + diff --git a/app/src/main/res/drawable-anydpi/ic_add_circle.xml b/app/src/main/res/drawable-anydpi/ic_add_circle.xml index 9a67db9a4..5c182bfdd 100644 --- a/app/src/main/res/drawable-anydpi/ic_add_circle.xml +++ b/app/src/main/res/drawable-anydpi/ic_add_circle.xml @@ -1,5 +1,10 @@ - - + + diff --git a/app/src/main/res/drawable-anydpi/ic_add_instance.xml b/app/src/main/res/drawable-anydpi/ic_add_instance.xml deleted file mode 100644 index 3720a72a8..000000000 --- a/app/src/main/res/drawable-anydpi/ic_add_instance.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/app/src/main/res/drawable-anydpi/ic_all_inclusive_menu.xml b/app/src/main/res/drawable-anydpi/ic_all_inclusive_menu.xml index 56656b07b..e920b10f0 100644 --- a/app/src/main/res/drawable-anydpi/ic_all_inclusive_menu.xml +++ b/app/src/main/res/drawable-anydpi/ic_all_inclusive_menu.xml @@ -1,9 +1,9 @@ - + android:height="24dp" + android:tint="#FFFFFF" + android:viewportWidth="24.0" + android:viewportHeight="24.0"> diff --git a/app/src/main/res/drawable-anydpi/ic_archive.xml b/app/src/main/res/drawable-anydpi/ic_archive.xml index bac43ee32..d42be53f7 100644 --- a/app/src/main/res/drawable-anydpi/ic_archive.xml +++ b/app/src/main/res/drawable-anydpi/ic_archive.xml @@ -1,5 +1,10 @@ - - + + diff --git a/app/src/main/res/drawable-anydpi/ic_attach_money.xml b/app/src/main/res/drawable-anydpi/ic_attach_money.xml deleted file mode 100644 index dd93a7599..000000000 --- a/app/src/main/res/drawable-anydpi/ic_attach_money.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/app/src/main/res/drawable-anydpi/ic_audio_wave.xml b/app/src/main/res/drawable-anydpi/ic_audio_wave.xml index 07e9096c0..105bf62e9 100644 --- a/app/src/main/res/drawable-anydpi/ic_audio_wave.xml +++ b/app/src/main/res/drawable-anydpi/ic_audio_wave.xml @@ -4,199 +4,199 @@ android:viewportWidth="105.83" android:viewportHeight="79.372"> + android:strokeLineCap="round" + android:strokeLineJoin="round" /> + android:strokeLineCap="round" + android:strokeLineJoin="round" /> + android:strokeLineCap="round" + android:strokeLineJoin="round" /> + android:strokeLineCap="round" + android:strokeLineJoin="round" /> + android:strokeLineCap="round" + android:strokeLineJoin="round" /> + android:strokeLineCap="round" + android:strokeLineJoin="round" /> + android:strokeLineCap="round" + android:strokeLineJoin="round" /> + android:strokeLineCap="round" + android:strokeLineJoin="round" /> + android:strokeLineCap="round" + android:strokeLineJoin="round" /> + android:strokeLineCap="round" + android:strokeLineJoin="round" /> + android:strokeLineCap="round" + android:strokeLineJoin="round" /> + android:strokeLineCap="round" + android:strokeLineJoin="round" /> + android:strokeLineCap="round" + android:strokeLineJoin="round" /> + android:strokeLineCap="round" + android:strokeLineJoin="round" /> + android:strokeLineCap="round" + android:strokeLineJoin="round" /> + android:strokeLineCap="round" + android:strokeLineJoin="round" /> + android:strokeLineCap="round" + android:strokeLineJoin="round" /> + android:strokeLineCap="round" + android:strokeLineJoin="round" /> + android:strokeLineCap="round" + android:strokeLineJoin="round" /> + android:strokeLineCap="round" + android:strokeLineJoin="round" /> + android:strokeLineCap="round" + android:strokeLineJoin="round" /> + android:strokeLineCap="round" + android:strokeLineJoin="round" /> + android:strokeLineCap="round" + android:strokeLineJoin="round" /> + android:strokeLineCap="round" + android:strokeLineJoin="round" /> + android:strokeLineCap="round" + android:strokeLineJoin="round" /> + android:strokeLineCap="round" + android:strokeLineJoin="round" /> + android:strokeLineCap="round" + android:strokeLineJoin="round" /> + android:strokeLineCap="round" + android:strokeLineJoin="round" /> diff --git a/app/src/main/res/drawable-anydpi/ic_audiotrack_black_48dp.xml b/app/src/main/res/drawable-anydpi/ic_audiotrack_black_48dp.xml index e3c98c009..329c4319c 100644 --- a/app/src/main/res/drawable-anydpi/ic_audiotrack_black_48dp.xml +++ b/app/src/main/res/drawable-anydpi/ic_audiotrack_black_48dp.xml @@ -1,5 +1,10 @@ - - + + diff --git a/app/src/main/res/drawable-anydpi/ic_battery_alert_menu.xml b/app/src/main/res/drawable-anydpi/ic_battery_alert_menu.xml deleted file mode 100644 index 39b1010ee..000000000 --- a/app/src/main/res/drawable-anydpi/ic_battery_alert_menu.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - diff --git a/app/src/main/res/drawable-anydpi/ic_bookmark_white.xml b/app/src/main/res/drawable-anydpi/ic_bookmark_white.xml index 406c421ce..9f63dfcfa 100644 --- a/app/src/main/res/drawable-anydpi/ic_bookmark_white.xml +++ b/app/src/main/res/drawable-anydpi/ic_bookmark_white.xml @@ -1,9 +1,9 @@ - + android:height="24dp" + android:tint="#FFFFFF" + android:viewportWidth="24.0" + android:viewportHeight="24.0"> diff --git a/app/src/main/res/drawable-anydpi/ic_bookmark_white_full.xml b/app/src/main/res/drawable-anydpi/ic_bookmark_white_full.xml index d0cd56690..2e919f18d 100644 --- a/app/src/main/res/drawable-anydpi/ic_bookmark_white_full.xml +++ b/app/src/main/res/drawable-anydpi/ic_bookmark_white_full.xml @@ -1,9 +1,9 @@ - + android:height="24dp" + android:tint="#FFFFFF" + android:viewportWidth="24.0" + android:viewportHeight="24.0"> diff --git a/app/src/main/res/drawable-anydpi/ic_boost_pixelfed.xml b/app/src/main/res/drawable-anydpi/ic_boost_pixelfed.xml deleted file mode 100644 index a10f3b451..000000000 --- a/app/src/main/res/drawable-anydpi/ic_boost_pixelfed.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/app/src/main/res/drawable-anydpi/ic_bot.xml b/app/src/main/res/drawable-anydpi/ic_bot.xml index 3a7d228f3..166f7582c 100644 --- a/app/src/main/res/drawable-anydpi/ic_bot.xml +++ b/app/src/main/res/drawable-anydpi/ic_bot.xml @@ -1,22 +1,22 @@ - + android:height="24dp" + android:viewportWidth="48" + android:viewportHeight="48"> + android:strokeLineJoin="round" /> + android:strokeLineJoin="round" /> @@ -26,48 +26,48 @@ + android:strokeLineJoin="round" /> + android:strokeWidth="2" + android:strokeColor="#B6E9FF" /> + android:strokeLineJoin="round" /> + android:strokeLineJoin="round" /> + android:strokeLineJoin="round" /> + android:strokeLineJoin="round" /> + android:strokeLineJoin="round" /> diff --git a/app/src/main/res/drawable-anydpi/ic_brush.xml b/app/src/main/res/drawable-anydpi/ic_brush.xml deleted file mode 100644 index 4e5affa20..000000000 --- a/app/src/main/res/drawable-anydpi/ic_brush.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/app/src/main/res/drawable-anydpi/ic_brush_white.xml b/app/src/main/res/drawable-anydpi/ic_brush_white.xml deleted file mode 100644 index 461cc1de7..000000000 --- a/app/src/main/res/drawable-anydpi/ic_brush_white.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/app/src/main/res/drawable-anydpi/ic_bug_report.xml b/app/src/main/res/drawable-anydpi/ic_bug_report.xml deleted file mode 100644 index 206702ff2..000000000 --- a/app/src/main/res/drawable-anydpi/ic_bug_report.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/app/src/main/res/drawable-anydpi/ic_check_circle.xml b/app/src/main/res/drawable-anydpi/ic_check_circle.xml index 4057eaf26..73974f508 100644 --- a/app/src/main/res/drawable-anydpi/ic_check_circle.xml +++ b/app/src/main/res/drawable-anydpi/ic_check_circle.xml @@ -1,5 +1,10 @@ - - + + diff --git a/app/src/main/res/drawable-anydpi/ic_check_white_24.xml b/app/src/main/res/drawable-anydpi/ic_check_white_24.xml index 609f5657a..953eb5e25 100644 --- a/app/src/main/res/drawable-anydpi/ic_check_white_24.xml +++ b/app/src/main/res/drawable-anydpi/ic_check_white_24.xml @@ -1,9 +1,9 @@ - + android:height="24dp" + android:tint="#FFFFFF" + android:viewportWidth="24.0" + android:viewportHeight="24.0"> diff --git a/app/src/main/res/drawable-anydpi/ic_cloud_upload.xml b/app/src/main/res/drawable-anydpi/ic_cloud_upload.xml index 809405b0f..028939744 100644 --- a/app/src/main/res/drawable-anydpi/ic_cloud_upload.xml +++ b/app/src/main/res/drawable-anydpi/ic_cloud_upload.xml @@ -1,5 +1,10 @@ - - + + diff --git a/app/src/main/res/drawable-anydpi/ic_comment_peertube.xml b/app/src/main/res/drawable-anydpi/ic_comment_peertube.xml index d5668894a..f5c097cd4 100644 --- a/app/src/main/res/drawable-anydpi/ic_comment_peertube.xml +++ b/app/src/main/res/drawable-anydpi/ic_comment_peertube.xml @@ -1,5 +1,10 @@ - - + + diff --git a/app/src/main/res/drawable-anydpi/ic_create_new_folder_black_48dp.xml b/app/src/main/res/drawable-anydpi/ic_create_new_folder_black_48dp.xml index 2817dafbe..371f71bdd 100644 --- a/app/src/main/res/drawable-anydpi/ic_create_new_folder_black_48dp.xml +++ b/app/src/main/res/drawable-anydpi/ic_create_new_folder_black_48dp.xml @@ -1,5 +1,10 @@ - - + + diff --git a/app/src/main/res/drawable-anydpi/ic_delete_instance.xml b/app/src/main/res/drawable-anydpi/ic_delete_instance.xml deleted file mode 100644 index 881052451..000000000 --- a/app/src/main/res/drawable-anydpi/ic_delete_instance.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/app/src/main/res/drawable-anydpi/ic_delete_media_pixelfed.xml b/app/src/main/res/drawable-anydpi/ic_delete_media_pixelfed.xml index d92a42add..748b9aeda 100644 --- a/app/src/main/res/drawable-anydpi/ic_delete_media_pixelfed.xml +++ b/app/src/main/res/drawable-anydpi/ic_delete_media_pixelfed.xml @@ -1,5 +1,11 @@ - - + + diff --git a/app/src/main/res/drawable-anydpi/ic_edit_black_menu.xml b/app/src/main/res/drawable-anydpi/ic_edit_black_menu.xml deleted file mode 100644 index 133ea4462..000000000 --- a/app/src/main/res/drawable-anydpi/ic_edit_black_menu.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - diff --git a/app/src/main/res/drawable-anydpi/ic_email.xml b/app/src/main/res/drawable-anydpi/ic_email.xml deleted file mode 100644 index 824abfbd0..000000000 --- a/app/src/main/res/drawable-anydpi/ic_email.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/app/src/main/res/drawable-anydpi/ic_eraser.xml b/app/src/main/res/drawable-anydpi/ic_eraser.xml deleted file mode 100644 index 881052451..000000000 --- a/app/src/main/res/drawable-anydpi/ic_eraser.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/app/src/main/res/drawable-anydpi/ic_favorite_peertube_full.xml b/app/src/main/res/drawable-anydpi/ic_favorite_peertube_full.xml index 6195eb601..80e8fb2a4 100644 --- a/app/src/main/res/drawable-anydpi/ic_favorite_peertube_full.xml +++ b/app/src/main/res/drawable-anydpi/ic_favorite_peertube_full.xml @@ -1,5 +1,10 @@ - - + + diff --git a/app/src/main/res/drawable-anydpi/ic_fiber_new_dark.xml b/app/src/main/res/drawable-anydpi/ic_fiber_new_dark.xml deleted file mode 100644 index 42a5d11d5..000000000 --- a/app/src/main/res/drawable-anydpi/ic_fiber_new_dark.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - diff --git a/app/src/main/res/drawable-anydpi/ic_file_download.xml b/app/src/main/res/drawable-anydpi/ic_file_download.xml deleted file mode 100644 index 370bba93d..000000000 --- a/app/src/main/res/drawable-anydpi/ic_file_download.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/app/src/main/res/drawable-anydpi/ic_filter.xml b/app/src/main/res/drawable-anydpi/ic_filter.xml index 19f61d73b..da7bc3af3 100644 --- a/app/src/main/res/drawable-anydpi/ic_filter.xml +++ b/app/src/main/res/drawable-anydpi/ic_filter.xml @@ -1,5 +1,10 @@ - - + + diff --git a/app/src/main/res/drawable-anydpi/ic_filter_list.xml b/app/src/main/res/drawable-anydpi/ic_filter_list.xml index d7d851b14..92207ccff 100644 --- a/app/src/main/res/drawable-anydpi/ic_filter_list.xml +++ b/app/src/main/res/drawable-anydpi/ic_filter_list.xml @@ -1,5 +1,10 @@ - - + + diff --git a/app/src/main/res/drawable-anydpi/ic_folder_black_48dp.xml b/app/src/main/res/drawable-anydpi/ic_folder_black_48dp.xml index 622b84a55..ea7fe4c2f 100644 --- a/app/src/main/res/drawable-anydpi/ic_folder_black_48dp.xml +++ b/app/src/main/res/drawable-anydpi/ic_folder_black_48dp.xml @@ -1,5 +1,10 @@ - - + + diff --git a/app/src/main/res/drawable-anydpi/ic_follow_notif_header.xml b/app/src/main/res/drawable-anydpi/ic_follow_notif_header.xml index 3f37bfea7..da411c644 100644 --- a/app/src/main/res/drawable-anydpi/ic_follow_notif_header.xml +++ b/app/src/main/res/drawable-anydpi/ic_follow_notif_header.xml @@ -1,5 +1,10 @@ - - + + diff --git a/app/src/main/res/drawable-anydpi/ic_fullscreen.xml b/app/src/main/res/drawable-anydpi/ic_fullscreen.xml index 717218b2e..1538efaa2 100644 --- a/app/src/main/res/drawable-anydpi/ic_fullscreen.xml +++ b/app/src/main/res/drawable-anydpi/ic_fullscreen.xml @@ -1,5 +1,10 @@ - - + + diff --git a/app/src/main/res/drawable-anydpi/ic_fullscreen_exit.xml b/app/src/main/res/drawable-anydpi/ic_fullscreen_exit.xml index 3db2edc3f..8ead8e3f1 100644 --- a/app/src/main/res/drawable-anydpi/ic_fullscreen_exit.xml +++ b/app/src/main/res/drawable-anydpi/ic_fullscreen_exit.xml @@ -1,5 +1,10 @@ - - + + diff --git a/app/src/main/res/drawable-anydpi/ic_gif_preview.xml b/app/src/main/res/drawable-anydpi/ic_gif_preview.xml index 312f39e87..5f53ed775 100644 --- a/app/src/main/res/drawable-anydpi/ic_gif_preview.xml +++ b/app/src/main/res/drawable-anydpi/ic_gif_preview.xml @@ -4,25 +4,25 @@ android:viewportWidth="32" android:viewportHeight="32"> + android:strokeColor="#00000000" /> + android:strokeWidth="0.02772964" /> + android:strokeWidth="0.02772964" /> + android:strokeWidth="0.02772964" /> diff --git a/app/src/main/res/drawable-anydpi/ic_gnu_social.xml b/app/src/main/res/drawable-anydpi/ic_gnu_social.xml index da2b3e174..f58faffcc 100644 --- a/app/src/main/res/drawable-anydpi/ic_gnu_social.xml +++ b/app/src/main/res/drawable-anydpi/ic_gnu_social.xml @@ -1,8 +1,8 @@ - + android:height="24dp" + android:viewportWidth="46" + android:viewportHeight="50"> + android:height="24dp" + android:tint="#FFFFFF" + android:viewportWidth="24.0" + android:viewportHeight="24.0"> diff --git a/app/src/main/res/drawable-anydpi/ic_hide_status_bar.xml b/app/src/main/res/drawable-anydpi/ic_hide_status_bar.xml index 3a4ce3d93..043a11f63 100644 --- a/app/src/main/res/drawable-anydpi/ic_hide_status_bar.xml +++ b/app/src/main/res/drawable-anydpi/ic_hide_status_bar.xml @@ -1,9 +1,9 @@ - + android:height="24dp" + android:tint="#FFFFFF" + android:viewportWidth="24.0" + android:viewportHeight="24.0"> diff --git a/app/src/main/res/drawable-anydpi/ic_hourglass_full.xml b/app/src/main/res/drawable-anydpi/ic_hourglass_full.xml index 6c964920a..575fe786d 100644 --- a/app/src/main/res/drawable-anydpi/ic_hourglass_full.xml +++ b/app/src/main/res/drawable-anydpi/ic_hourglass_full.xml @@ -1,5 +1,10 @@ - - + + diff --git a/app/src/main/res/drawable-anydpi/ic_info.xml b/app/src/main/res/drawable-anydpi/ic_info.xml index cfde1244f..673577aa8 100644 --- a/app/src/main/res/drawable-anydpi/ic_info.xml +++ b/app/src/main/res/drawable-anydpi/ic_info.xml @@ -1,5 +1,10 @@ - - + + diff --git a/app/src/main/res/drawable-anydpi/ic_info_white.xml b/app/src/main/res/drawable-anydpi/ic_info_white.xml deleted file mode 100644 index ce292018b..000000000 --- a/app/src/main/res/drawable-anydpi/ic_info_white.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - diff --git a/app/src/main/res/drawable-anydpi/ic_insert_chart.xml b/app/src/main/res/drawable-anydpi/ic_insert_chart.xml index 69c53ba58..4c391a389 100644 --- a/app/src/main/res/drawable-anydpi/ic_insert_chart.xml +++ b/app/src/main/res/drawable-anydpi/ic_insert_chart.xml @@ -1,9 +1,9 @@ - + android:height="24dp" + android:tint="#FFFFFF" + android:viewportWidth="24.0" + android:viewportHeight="24.0"> diff --git a/app/src/main/res/drawable-anydpi/ic_insert_drive_file_black_48dp.xml b/app/src/main/res/drawable-anydpi/ic_insert_drive_file_black_48dp.xml index 5846bdb3b..7fd731b67 100644 --- a/app/src/main/res/drawable-anydpi/ic_insert_drive_file_black_48dp.xml +++ b/app/src/main/res/drawable-anydpi/ic_insert_drive_file_black_48dp.xml @@ -1,5 +1,10 @@ - - + + diff --git a/app/src/main/res/drawable-anydpi/ic_list_instance.xml b/app/src/main/res/drawable-anydpi/ic_list_instance.xml deleted file mode 100644 index 6cca0d54a..000000000 --- a/app/src/main/res/drawable-anydpi/ic_list_instance.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/app/src/main/res/drawable-anydpi/ic_list_timeline.xml b/app/src/main/res/drawable-anydpi/ic_list_timeline.xml deleted file mode 100644 index 1471c52f5..000000000 --- a/app/src/main/res/drawable-anydpi/ic_list_timeline.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/app/src/main/res/drawable-anydpi/ic_logo_button.xml b/app/src/main/res/drawable-anydpi/ic_logo_button.xml index 31d073566..a70da7754 100644 --- a/app/src/main/res/drawable-anydpi/ic_logo_button.xml +++ b/app/src/main/res/drawable-anydpi/ic_logo_button.xml @@ -1,8 +1,8 @@ - + android:height="24dp" + android:viewportWidth="264.59" + android:viewportHeight="264.59"> + android:height="24dp" + android:tint="#FFFFFF" + android:viewportWidth="24.0" + android:viewportHeight="24.0"> diff --git a/app/src/main/res/drawable-anydpi/ic_menu_camera.xml b/app/src/main/res/drawable-anydpi/ic_menu_camera.xml deleted file mode 100644 index 0d9ea104b..000000000 --- a/app/src/main/res/drawable-anydpi/ic_menu_camera.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - diff --git a/app/src/main/res/drawable-anydpi/ic_menu_gallery.xml b/app/src/main/res/drawable-anydpi/ic_menu_gallery.xml deleted file mode 100644 index f6872c409..000000000 --- a/app/src/main/res/drawable-anydpi/ic_menu_gallery.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/app/src/main/res/drawable-anydpi/ic_menu_manage.xml b/app/src/main/res/drawable-anydpi/ic_menu_manage.xml deleted file mode 100644 index c1be60b36..000000000 --- a/app/src/main/res/drawable-anydpi/ic_menu_manage.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - \ No newline at end of file diff --git a/app/src/main/res/drawable-anydpi/ic_menu_menu.xml b/app/src/main/res/drawable-anydpi/ic_menu_menu.xml deleted file mode 100644 index 47d7efa6e..000000000 --- a/app/src/main/res/drawable-anydpi/ic_menu_menu.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - diff --git a/app/src/main/res/drawable-anydpi/ic_menu_send.xml b/app/src/main/res/drawable-anydpi/ic_menu_send.xml deleted file mode 100644 index 00c668c60..000000000 --- a/app/src/main/res/drawable-anydpi/ic_menu_send.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/app/src/main/res/drawable-anydpi/ic_menu_share.xml b/app/src/main/res/drawable-anydpi/ic_menu_share.xml deleted file mode 100644 index a28fb9e28..000000000 --- a/app/src/main/res/drawable-anydpi/ic_menu_share.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/app/src/main/res/drawable-anydpi/ic_menu_slideshow.xml b/app/src/main/res/drawable-anydpi/ic_menu_slideshow.xml deleted file mode 100644 index 209aa6430..000000000 --- a/app/src/main/res/drawable-anydpi/ic_menu_slideshow.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/app/src/main/res/drawable-anydpi/ic_mode_comment_white.xml b/app/src/main/res/drawable-anydpi/ic_mode_comment_white.xml index 2366bcf4b..26cb4ae62 100644 --- a/app/src/main/res/drawable-anydpi/ic_mode_comment_white.xml +++ b/app/src/main/res/drawable-anydpi/ic_mode_comment_white.xml @@ -1,9 +1,9 @@ - + android:height="24dp" + android:tint="#FFFFFF" + android:viewportWidth="24.0" + android:viewportHeight="24.0"> diff --git a/app/src/main/res/drawable-anydpi/ic_more_pixelfed.xml b/app/src/main/res/drawable-anydpi/ic_more_pixelfed.xml index 25b3b74fe..b01e3ce43 100644 --- a/app/src/main/res/drawable-anydpi/ic_more_pixelfed.xml +++ b/app/src/main/res/drawable-anydpi/ic_more_pixelfed.xml @@ -1,5 +1,10 @@ - - + + diff --git a/app/src/main/res/drawable-anydpi/ic_new_releases_black.xml b/app/src/main/res/drawable-anydpi/ic_new_releases_black.xml index 94e57c43d..e6e210968 100644 --- a/app/src/main/res/drawable-anydpi/ic_new_releases_black.xml +++ b/app/src/main/res/drawable-anydpi/ic_new_releases_black.xml @@ -1,9 +1,9 @@ - + android:height="24dp" + android:tint="#14161B" + android:viewportWidth="24.0" + android:viewportHeight="24.0"> diff --git a/app/src/main/res/drawable-anydpi/ic_note.xml b/app/src/main/res/drawable-anydpi/ic_note.xml index e55f93ca8..dbca9ae32 100644 --- a/app/src/main/res/drawable-anydpi/ic_note.xml +++ b/app/src/main/res/drawable-anydpi/ic_note.xml @@ -1,5 +1,10 @@ - - + + diff --git a/app/src/main/res/drawable-anydpi/ic_notifications_menu.xml b/app/src/main/res/drawable-anydpi/ic_notifications_menu.xml deleted file mode 100644 index 5fc97dd9a..000000000 --- a/app/src/main/res/drawable-anydpi/ic_notifications_menu.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - diff --git a/app/src/main/res/drawable-anydpi/ic_notifications_settings.xml b/app/src/main/res/drawable-anydpi/ic_notifications_settings.xml deleted file mode 100644 index 78b75c39b..000000000 --- a/app/src/main/res/drawable-anydpi/ic_notifications_settings.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/app/src/main/res/drawable-anydpi/ic_perm_media.xml b/app/src/main/res/drawable-anydpi/ic_perm_media.xml deleted file mode 100644 index 0a45102de..000000000 --- a/app/src/main/res/drawable-anydpi/ic_perm_media.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/app/src/main/res/drawable-anydpi/ic_photo_black_48dp.xml b/app/src/main/res/drawable-anydpi/ic_photo_black_48dp.xml index 2d49b7393..0350e66e3 100644 --- a/app/src/main/res/drawable-anydpi/ic_photo_black_48dp.xml +++ b/app/src/main/res/drawable-anydpi/ic_photo_black_48dp.xml @@ -1,5 +1,10 @@ - - + + diff --git a/app/src/main/res/drawable-anydpi/ic_pin_drop.xml b/app/src/main/res/drawable-anydpi/ic_pin_drop.xml index f919af48c..550a53cfc 100644 --- a/app/src/main/res/drawable-anydpi/ic_pin_drop.xml +++ b/app/src/main/res/drawable-anydpi/ic_pin_drop.xml @@ -3,8 +3,7 @@ android:height="24dp" android:viewportWidth="24" android:viewportHeight="24"> - + diff --git a/app/src/main/res/drawable-anydpi/ic_pin_drop_p.xml b/app/src/main/res/drawable-anydpi/ic_pin_drop_p.xml index 42a927bfc..6950bef6a 100644 --- a/app/src/main/res/drawable-anydpi/ic_pin_drop_p.xml +++ b/app/src/main/res/drawable-anydpi/ic_pin_drop_p.xml @@ -3,7 +3,7 @@ android:height="24dp" android:viewportWidth="24" android:viewportHeight="24"> - + diff --git a/app/src/main/res/drawable-anydpi/ic_pixelfed_comment.xml b/app/src/main/res/drawable-anydpi/ic_pixelfed_comment.xml index 052eb9133..dab156ca5 100644 --- a/app/src/main/res/drawable-anydpi/ic_pixelfed_comment.xml +++ b/app/src/main/res/drawable-anydpi/ic_pixelfed_comment.xml @@ -1,12 +1,12 @@ - + android:height="32dp" + android:viewportWidth="50" + android:viewportHeight="50"> + android:strokeLineCap="round" /> diff --git a/app/src/main/res/drawable-anydpi/ic_pixelfed_media.xml b/app/src/main/res/drawable-anydpi/ic_pixelfed_media.xml deleted file mode 100644 index 1106f563c..000000000 --- a/app/src/main/res/drawable-anydpi/ic_pixelfed_media.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/app/src/main/res/drawable-anydpi/ic_pixelfed_share.xml b/app/src/main/res/drawable-anydpi/ic_pixelfed_share.xml deleted file mode 100644 index 72848b653..000000000 --- a/app/src/main/res/drawable-anydpi/ic_pixelfed_share.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/app/src/main/res/drawable-anydpi/ic_plus_one.xml b/app/src/main/res/drawable-anydpi/ic_plus_one.xml index 2de8bf968..0da009d0c 100644 --- a/app/src/main/res/drawable-anydpi/ic_plus_one.xml +++ b/app/src/main/res/drawable-anydpi/ic_plus_one.xml @@ -1,5 +1,10 @@ - - + + diff --git a/app/src/main/res/drawable-anydpi/ic_public_world.xml b/app/src/main/res/drawable-anydpi/ic_public_world.xml index 2335a8606..442941a68 100644 --- a/app/src/main/res/drawable-anydpi/ic_public_world.xml +++ b/app/src/main/res/drawable-anydpi/ic_public_world.xml @@ -1,5 +1,10 @@ - - + + diff --git a/app/src/main/res/drawable-anydpi/ic_remove_white.xml b/app/src/main/res/drawable-anydpi/ic_remove_white.xml index f9d32fba9..4d10c6809 100644 --- a/app/src/main/res/drawable-anydpi/ic_remove_white.xml +++ b/app/src/main/res/drawable-anydpi/ic_remove_white.xml @@ -1,9 +1,9 @@ - + android:height="24dp" + android:tint="#FFFFFF" + android:viewportWidth="24.0" + android:viewportHeight="24.0"> diff --git a/app/src/main/res/drawable-anydpi/ic_save.xml b/app/src/main/res/drawable-anydpi/ic_save.xml deleted file mode 100644 index 0651fcc6c..000000000 --- a/app/src/main/res/drawable-anydpi/ic_save.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/app/src/main/res/drawable-anydpi/ic_security_admin.xml b/app/src/main/res/drawable-anydpi/ic_security_admin.xml index c9b7c8f0a..6320e3759 100644 --- a/app/src/main/res/drawable-anydpi/ic_security_admin.xml +++ b/app/src/main/res/drawable-anydpi/ic_security_admin.xml @@ -1,9 +1,9 @@ - + android:height="24dp" + android:tint="#14161B" + android:viewportWidth="24.0" + android:viewportHeight="24.0"> diff --git a/app/src/main/res/drawable-anydpi/ic_security_admin_menu.xml b/app/src/main/res/drawable-anydpi/ic_security_admin_menu.xml deleted file mode 100644 index 499450038..000000000 --- a/app/src/main/res/drawable-anydpi/ic_security_admin_menu.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - diff --git a/app/src/main/res/drawable-anydpi/ic_show_stats.xml b/app/src/main/res/drawable-anydpi/ic_show_stats.xml index 047e0e710..cb9de9461 100644 --- a/app/src/main/res/drawable-anydpi/ic_show_stats.xml +++ b/app/src/main/res/drawable-anydpi/ic_show_stats.xml @@ -1,9 +1,9 @@ - + android:height="24dp" + android:tint="?attr/iconColorMenu" + android:viewportWidth="24.0" + android:viewportHeight="24.0"> diff --git a/app/src/main/res/drawable-anydpi/ic_subdirectory_arrow_left_black_48dp.xml b/app/src/main/res/drawable-anydpi/ic_subdirectory_arrow_left_black_48dp.xml index 55cca5dda..4a9c11c6a 100644 --- a/app/src/main/res/drawable-anydpi/ic_subdirectory_arrow_left_black_48dp.xml +++ b/app/src/main/res/drawable-anydpi/ic_subdirectory_arrow_left_black_48dp.xml @@ -1,5 +1,10 @@ - - + + diff --git a/app/src/main/res/drawable-anydpi/ic_sync.xml b/app/src/main/res/drawable-anydpi/ic_sync.xml index 0eeef0984..5a7e806f4 100644 --- a/app/src/main/res/drawable-anydpi/ic_sync.xml +++ b/app/src/main/res/drawable-anydpi/ic_sync.xml @@ -1,5 +1,10 @@ - - + + diff --git a/app/src/main/res/drawable-anydpi/ic_tablet_menu.xml b/app/src/main/res/drawable-anydpi/ic_tablet_menu.xml deleted file mode 100644 index 826ff9fe5..000000000 --- a/app/src/main/res/drawable-anydpi/ic_tablet_menu.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - diff --git a/app/src/main/res/drawable-anydpi/ic_timelapse.xml b/app/src/main/res/drawable-anydpi/ic_timelapse.xml deleted file mode 100644 index f9fc9eba1..000000000 --- a/app/src/main/res/drawable-anydpi/ic_timelapse.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - diff --git a/app/src/main/res/drawable-anydpi/ic_timeline_menu_s.xml b/app/src/main/res/drawable-anydpi/ic_timeline_menu_s.xml deleted file mode 100644 index eef4821c0..000000000 --- a/app/src/main/res/drawable-anydpi/ic_timeline_menu_s.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - diff --git a/app/src/main/res/drawable-anydpi/ic_translate_menu.xml b/app/src/main/res/drawable-anydpi/ic_translate_menu.xml deleted file mode 100644 index f7f2cf09f..000000000 --- a/app/src/main/res/drawable-anydpi/ic_translate_menu.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/app/src/main/res/drawable-anydpi/ic_translate_white.xml b/app/src/main/res/drawable-anydpi/ic_translate_white.xml index 4c5c302fa..daf50d6da 100644 --- a/app/src/main/res/drawable-anydpi/ic_translate_white.xml +++ b/app/src/main/res/drawable-anydpi/ic_translate_white.xml @@ -1,9 +1,9 @@ - + android:height="24dp" + android:tint="#FFFFFF" + android:viewportWidth="24.0" + android:viewportHeight="24.0"> diff --git a/app/src/main/res/drawable-anydpi/ic_user_minus.xml b/app/src/main/res/drawable-anydpi/ic_user_minus.xml index 87b3df71f..07f485151 100644 --- a/app/src/main/res/drawable-anydpi/ic_user_minus.xml +++ b/app/src/main/res/drawable-anydpi/ic_user_minus.xml @@ -3,7 +3,7 @@ android:height="24dp" android:viewportWidth="24" android:viewportHeight="24"> - + diff --git a/app/src/main/res/drawable-anydpi/ic_user_plus.xml b/app/src/main/res/drawable-anydpi/ic_user_plus.xml index 914c2768a..d3db0c325 100644 --- a/app/src/main/res/drawable-anydpi/ic_user_plus.xml +++ b/app/src/main/res/drawable-anydpi/ic_user_plus.xml @@ -1,5 +1,10 @@ - - + + diff --git a/app/src/main/res/drawable-anydpi/ic_user_remove.xml b/app/src/main/res/drawable-anydpi/ic_user_remove.xml deleted file mode 100644 index f0d9774e9..000000000 --- a/app/src/main/res/drawable-anydpi/ic_user_remove.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/app/src/main/res/drawable-anydpi/ic_user_times.xml b/app/src/main/res/drawable-anydpi/ic_user_times.xml deleted file mode 100644 index 4d2efe12f..000000000 --- a/app/src/main/res/drawable-anydpi/ic_user_times.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - diff --git a/app/src/main/res/drawable-anydpi/ic_video_channel.xml b/app/src/main/res/drawable-anydpi/ic_video_channel.xml deleted file mode 100644 index a2b8e9d87..000000000 --- a/app/src/main/res/drawable-anydpi/ic_video_channel.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/app/src/main/res/drawable-anydpi/ic_video_preview.xml b/app/src/main/res/drawable-anydpi/ic_video_preview.xml index 9273d452e..711e724b3 100644 --- a/app/src/main/res/drawable-anydpi/ic_video_preview.xml +++ b/app/src/main/res/drawable-anydpi/ic_video_preview.xml @@ -1,8 +1,8 @@ - + android:height="24dp" + android:viewportWidth="847" + android:viewportHeight="847"> diff --git a/app/src/main/res/drawable-anydpi/ic_videocam.xml b/app/src/main/res/drawable-anydpi/ic_videocam.xml index f728a2483..e6c213125 100644 --- a/app/src/main/res/drawable-anydpi/ic_videocam.xml +++ b/app/src/main/res/drawable-anydpi/ic_videocam.xml @@ -1,5 +1,10 @@ - - + + diff --git a/app/src/main/res/drawable-anydpi/ic_videocam_black_48dp.xml b/app/src/main/res/drawable-anydpi/ic_videocam_black_48dp.xml index 49dbdbab1..7e17c05ae 100644 --- a/app/src/main/res/drawable-anydpi/ic_videocam_black_48dp.xml +++ b/app/src/main/res/drawable-anydpi/ic_videocam_black_48dp.xml @@ -1,5 +1,10 @@ - - + + diff --git a/app/src/main/res/drawable-anydpi/ic_visibility_off_menu.xml b/app/src/main/res/drawable-anydpi/ic_visibility_off_menu.xml deleted file mode 100644 index 4ac21c06b..000000000 --- a/app/src/main/res/drawable-anydpi/ic_visibility_off_menu.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - diff --git a/app/src/main/res/drawable-hdpi/fedilab_notification_icon.png b/app/src/main/res/drawable-hdpi/fedilab_notification_icon.png deleted file mode 100644 index 044578de5f7c380257543365b3062e6f4b22c6d1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 753 zcmVqE$O9h+X70K3opaAQ_smO6+qM*% z<2bv(IWPhiz&h9h-@zQX2~L8nR13)kSHL&N%szr{keLcG4d8?0&t8JkAjO;p8%}ce z8Po+KrUh&|!PpmYFc~pLU|F(p96STJz!WF5sm+5Nzk-G(8!mzxVOqn@4wr4IcCH92X)&d2$Hs0cUySFtN+F zf?8e9bh(zZpn2E(bZim9kJkP45EEAwhfYuwyy6Y|`Mn6Z&Sgy}yT6wFl8C>-gMd16R3g9UW

^ILrwVy~( zxCb>|cf>V_odJ(HIx_nT#=$Y;ZY&Yh?(s{hx0DG!RBcB%swDCRr~ui?=80+`6Kx=@ zzs7k67bMwiSb}yNCg_W>1f^@{8MoaC^NB{6hnP)w6AVL8lpn9CZs*Q_@!W@c(Rs=h jE_0gd?t}XO?jhJ;8z(p`k%x+A00000NkvXXu0mjfXJS@8 diff --git a/app/src/main/res/drawable-mdpi/fedilab_notification_icon.png b/app/src/main/res/drawable-mdpi/fedilab_notification_icon.png deleted file mode 100644 index 3d43217298c79985fd4b2fe69dfd35bfe622033b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 489 zcmV+zOo3DI0n*?RY=Hp~ z{%_)3Faf?Sb6kREugSw;!*U;=pv#NEoJep74#BfQgzSsBN!|#4l#bIGpYbdNtD59# zejd0HSW!Bjfskm=2lt9Ky`UJhgC`oGDS3{tA#U?uJs1V8;(H$$HVIUUsqbt434s_G z1l3-vC!+DTM*K6Wv|oWT{$9X)W8EZBE(G2|Dd-3DAf;JgvUCUB^1D%hrvIRH9szCO zSJ_m@qRM29IoT9flI8IcL6OK*6jzK+ga%UQBv8x8LnjFGVs>lF^+Y4E>2|R@*!v{d z28*CVX%F%Y)p((U(Mv@why)iryAm)f+TK8mQ^F!J#EFw!qBG!Ccr3j?B4MZGwAIfw zo;L7^Nq84r^T9_)$P$Q>U2g0cw<)lZ8_bBh$ fZ$89gfozXI6v*H{^K~Ee00000NkvXXu0mjfZ7|w3 diff --git a/app/src/main/res/drawable-v24/ic_launcher_atom_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_atom_foreground.xml index c901dbcc5..4422c31ad 100644 --- a/app/src/main/res/drawable-v24/ic_launcher_atom_foreground.xml +++ b/app/src/main/res/drawable-v24/ic_launcher_atom_foreground.xml @@ -4,49 +4,59 @@ android:height="108dp" android:viewportWidth="1066" android:viewportHeight="1066"> - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable-v24/ic_launcher_crash_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_crash_foreground.xml index 34848c2dd..00c86c005 100644 --- a/app/src/main/res/drawable-v24/ic_launcher_crash_foreground.xml +++ b/app/src/main/res/drawable-v24/ic_launcher_crash_foreground.xml @@ -4,259 +4,314 @@ android:height="108dp" android:viewportWidth="1054.6123" android:viewportHeight="1054.6123"> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable-xhdpi/fedilab_notification_icon.png b/app/src/main/res/drawable-xhdpi/fedilab_notification_icon.png deleted file mode 100644 index 73ddbfae16979f434f945f3c6ff9031d349b906d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 976 zcmV;>126oEP)d3yQ&8!<&2oo9PWk z)A*6#tjiS_Ndp)g4dcgvCx$=r8f5ut{Alph@KOi@}s%>zgr`BRVl^dxx0i%w` z9QEozgM$OPF7%{;6W}Gk(Fb6L!}ui7!QnA)Mq6#cUp1#?6TzlBeoG0{Cd7l+ykz9yimX4A3P%mBT0-S8t=Z#uOTFTm1fl z>m=%zYaEI}ku-Y>y_me(LTN{MRq(me;&&Fh55q-D+y=+ai9W zw=vA2sOxlLJZ;N#9r<9tNoh;C0_E*%e--mNL--V-89>Q0dEk5PvSR37fRPOC9FN^L7(Sy>Ay? z5=KxjTWC{O?2#~@>Yq`57I@{7$!8ZB$5AYYLu;SJ?Oc-Xi`!{@yD$-KGxfF)*-%lV z-YwbCAJKMW4Mo$z1va*yiCn#GY61i`6n%xqCdgWS4TuWFSkbmFfx1O;1C5{tl46NVq9ks?C{Y1h7YrDTp&E>7G++Qj zNQ!F|H$n(1_{V(>AjTAhy2rMP*azde@w{X*Vcz?`Z|0ks4(}u3tR#2am*m% zeF!c{jaa-|ri1T;hn(=RA6yI8^h%**(O^CJUdY0DaR7VD2i-0sAKJY(EZNfl=@_`MT9-T+4>O`LPVpPb}CVqaxa#HnQrNE$YQN5?Hr75J5t zT&x7Maf#Cp+~6b|l3dP>OQ4&$098mS@d|h=I0ZbLN#w)er+f<8z;ED5QHwJg{6XVe zd=WgQ#ML+p{LYd{a{Rtg3bb4!H)&Rl0~CInr5x$vsKhw|{9SQj%XPmw2L4@!@us^- z2EQqifX$epf-k|LhR3*EBfjkho4`rnIItRQ05^jFdaj~Lw#69&?o?d(+yKYPf?G@M zUy9(>ehDF+ga!ub0$Obgbdh3p-WjyQ#`bec9P3SRpu&Ep(;g`lwS#R6)S`Ixd@N6< z5b~@C!Cww@H10;&F4}rQmJgLU5YOmE+k*o$D%k#Fjv^ z&_5Lg+L|P%j|QIj+H2&hv}tFk;@iafG8VsuYc&(Ix)6;1(;2L%;7d%Oy{QN63?ZzYu^nj*7VxWyRd>Fi}u1zsMk% z-m92vty4)Q@R_OL-=1yjYzWk3AkZq!9@>5Etg6;tEB(qDihYeIlP+MQ4S{Yq5a=Pr zTj~;Uv!=gPfE2d#8PIdA$3&P{J++t{IU539t-0_{uTh2H&jgAkHVTjlnqo&pKCovh6mXtU1q7nfbbQEb}B2 zNIh7eBvVbbXTM#wqGmqyjbT6j<|K(Dt(7i~6L?1<4-#McQNupH7<_$_B2JcBu`ZsM zcDBzx2h!&4F}QM;#Wq>yb21GECsM!{;PnjTm7E^A&M_M&7CU7@q_aRJgy|2?1b=od zvdh)Q)WLpsEldZ{_p&gqh*|^*k~5eAzXiU_+i4wp@ZL(jnMQe3!<~6{D#k}Gj0_Ll zz`98XXK?#r6syCMFo!tXIMZr{UgWA-V`!q+c=k1#9g$s5I4`ywV0>z{I?7T+94Rt` zjQ7s-*{=*=UBOY5otm+xlanP&X#Dq!E9h1P$XW|%FJ&vRmOGgp&n8yd8yMT9U9%p1 zlI`xPe8Odu@KidH-&RnxWYP%3tkusv8<{q7vLQd3uS%Ohl}@;?11wFOKs6!fDXY^a zP+iCZtxcOiIVapVlpjl*KvH<_4pE@lX?)DD2uU1i?^LBxpova6@4H9WgNmWlcp{)U z`%H#6dy_~*I1y?BF}-GF(hl~pwivWn8Zt);Xqq=G6t9K1Z)!6~BG_NQn{AqXH0QfG o>-RKxzLWHSDpE!nWh4dv0h};Q9Ss&D&j0`b07*qoM6N<$f=E!}D*ylh diff --git a/app/src/main/res/drawable-xxxhdpi/fedilab_notification_icon.png b/app/src/main/res/drawable-xxxhdpi/fedilab_notification_icon.png deleted file mode 100644 index 4dfd3d65f41038613733fc583193d0e3c6311e40..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2206 zcmV;P2x0e$P)zE|)0c2_7hNX*^(cK~CGM{I_BAng4gDyJvdl)0MnLFu$j#s;9c@Rdo}K zS+QcpiWMsn5h28Bg!2j45~dSgCwxNKLHLJol<*&6KjBxxX2P3R4^M zS2`=KgfNHjIpL6y7dFt3gjWb731<`HR?E(cZ%3F(*h)Ae^b3C}y9h54dJ_^>>Es#+ z7h;80is0lRVKre8q3+43_&DJ_!aTxZVNUp~_<&G+(tHv0qIrb72)~H%2yf_55YEVU zxa4R7vo0NY8;SUiV;m~&mp?)?PfLBwMh@Nl` zQO}QhNeTwg}uzwg@L~w?%@+ph-3)d?B(= z{v>pX0<}=CDJJI(`2fPgDy+hzhK;}r>y$7XU?>zNEB_K!5$+*$Vmcb*<`B*z3P8Zg4L zP~`_SnF7Kd$q;X%O2rBlv#$+g$|Yekz!b?BnXkj2(ioQz{?fGh^M=3AMJ4W?P}CA= z5~oU1%j`M|G|pq9g5tTxJR6&QM-+*Q5&JJs6Iih8yetd`7y(z}b)}8fJdehx|9X)l zDBu^Q`x1GT6M7LgIsATJ7~=l7B~~1Vku7|f&%++(z^-PLTNj7~bD2YOmT%GkyaE0$ zVSpt*&8Lk^3Z$CfspE0{Mk%2-k2B0P+bI)zPV_Mx9txkHNnWi^@+6+oCuM_v&ZGer zNJbjh2apt&5*ERC??nQ&8jB`RVeGmoZg&fzfeGd3qZ3W0&@se7qL|P)-mn@}I~%s6 z2?Lxf*~`OUz{rSK`4WV_$bYzC)5*jn`Y6QRkH)Mh8{l>Y1H9{J!z@;4JvYQ&lnpRl z!2le(Uf@$PXcW4r*MTm07FqH@gsFMiVgS{`%Y#1bNvmqf%9$@($@xpvmCsSdLPY~? z(bWowcE`0Io?WgOhB8OA0zA?4ga-ocAp!;Qng;f9vL=6D<}o4U10CHZ-}@Pd@xCQA z3EBXQH5g!}2Ib#@Ql?k=%F8~4XO*ULao+@OfVgB9d_s|1(G^Tq>^)*5^l(YJPeYS{ zlWY#0lmmaRD$6CFn@i|McwbYO!~wXKB809vSnatW-);t-k!f?U;NJ#qfJqvvPop!e zxQht=q3o_m|9KUz_o+RF=d%;d0nGJm#9rZQAqCzkA(9=>DzZMc5D(YJRjH2^+gpN` zIVM8UB8A=@-ZTd}j5*4~stc2hGhu)hB6;diMi!+uyV9TAqQVq4;o9&OCJc}Ve<{;r z+1_DeeL12%qq_+$O=ZNhBqlt~VVn|=uIC`SDn3OLWU>vuLYO*nILac-zJhXs}a2Vrm551!;T_k7YMR13{4;iV3 zrM&bUmy>-z8I#v zTPx0Mtd9nmDZ+A4gNqRva)Qzfzq^tfn?P+dUPSq@NJkq9jZx^+hP)?qRW+K>00;hN zgKP(yra7IN;VV-i?H&_hJEjC0cR>o@)8Fu%8lv>6Q-UqNczog3BH8&YP&3ZWuyH49 zAP3Y&Li2nI5JllON8*{h0qeS-h&S@K zQB{5%e2;ALh7Zj3lX&KAP0D9?+A9`S!A7`SQ3}`d zWG520M22Uv+nFcSE_UQjNJo+FYc=F2pEY1P8H zLzk$p{GNpG99~XWOGzcjy1hd0#T`tWw+g$0IeBVNxJo4NWWG)$FWR^i#M}$mJe@kx zM#7zhO{zdK7_e6j9(9~Y^jjza+YB;nf4gtrOatc z`Q0@8>oFOgl?(o!3mrfCp!j{LH}uuPGX4bYe>$`Y1CsTZD$s;0p&T9vv zo?|Xo_#%2W{t%tBVOWhTd~yNzN!E7@5nxx`kqsgnZYKB10Mi2q1uNaMn*6<%2scyZD#|F5&mBdzdbaq-61qUYvJzHii#{0_FpwkYk)XNF297c?4DNBwSNVE z9hzQjSHC+WlnU>ca=Yp6X=SzR&H&slUanF3`y$Z=GeQm`B;KIkK - + + android:top="-1dp"> - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/card_border_dark.xml b/app/src/main/res/drawable/card_border_dark.xml index ce2832e8e..feb986481 100644 --- a/app/src/main/res/drawable/card_border_dark.xml +++ b/app/src/main/res/drawable/card_border_dark.xml @@ -7,8 +7,8 @@ android:color="@color/cardBorderDark" /> \ No newline at end of file diff --git a/app/src/main/res/drawable/card_border_light.xml b/app/src/main/res/drawable/card_border_light.xml index e29aa9164..fc8bcb9f9 100644 --- a/app/src/main/res/drawable/card_border_light.xml +++ b/app/src/main/res/drawable/card_border_light.xml @@ -7,8 +7,8 @@ android:color="@color/cardBorderLight" /> \ No newline at end of file diff --git a/app/src/main/res/drawable/default_banner.xml b/app/src/main/res/drawable/default_banner.xml index e5ed7539e..2324a79d7 100644 --- a/app/src/main/res/drawable/default_banner.xml +++ b/app/src/main/res/drawable/default_banner.xml @@ -4,7 +4,7 @@ android:viewportWidth="42.333332" android:viewportHeight="23.812502"> + android:pathData="M20.9553,1.8521C20.9288,1.8521 20.9063,1.8711 20.9031,1.8965L20.8633,2.1771C20.7988,2.2036 20.7396,2.2392 20.6845,2.2805L20.421,2.1751C20.3966,2.1651 20.3691,2.175 20.3564,2.1983L20.1445,2.5642C20.1307,2.5875 20.1373,2.6161 20.1574,2.6319L20.3807,2.8065C20.3765,2.8404 20.3729,2.8755 20.3729,2.9104C20.3729,2.9453 20.3765,2.9805 20.3807,3.0143L20.1574,3.189C20.1373,3.2049 20.1318,3.2333 20.1445,3.2566L20.3564,3.6225C20.3691,3.6458 20.3977,3.6542 20.421,3.6458L20.6845,3.5404C20.7396,3.5827 20.7988,3.6173 20.8633,3.6437L20.9031,3.9243C20.9063,3.9497 20.9288,3.9687 20.9553,3.9687L21.3785,3.9687C21.405,3.9687 21.427,3.9497 21.4302,3.9243L21.4705,3.6437C21.5351,3.6172 21.5943,3.5817 21.6493,3.5404L21.9129,3.6458C21.9372,3.6558 21.9648,3.6458 21.9775,3.6225L22.1893,3.2566C22.202,3.2333 22.1965,3.2048 22.1764,3.189L21.9532,3.0143C21.9574,2.9804 21.9604,2.9464 21.9604,2.9104C21.9604,2.8744 21.9574,2.8405 21.9532,2.8065L22.1764,2.6319C22.1965,2.616 22.202,2.5874 22.1893,2.5642L21.9775,2.1983C21.9648,2.175 21.9362,2.1666 21.9129,2.1751L21.6493,2.2805C21.5943,2.2382 21.5351,2.2035 21.4705,2.1771L21.4302,1.8965C21.427,1.8711 21.405,1.8521 21.3785,1.8521L20.9553,1.8521zM27.2686,1.8521C26.6844,1.8521 26.2113,2.3262 26.2113,2.9104C26.2113,3.4946 26.6844,3.9687 27.2686,3.9687C27.8539,3.9687 28.328,3.4946 28.328,2.9104C28.328,2.3262 27.8539,1.8521 27.2686,1.8521zM39.4746,1.8521C38.8904,1.8521 38.4173,2.3262 38.4173,2.9104C38.4173,3.4946 38.8904,3.9687 39.4746,3.9687C40.0598,3.9687 40.534,3.4946 40.534,2.9104C40.534,2.3262 40.0598,1.8521 39.4746,1.8521zM33.3726,1.8986C33.3263,1.8986 33.28,1.9234 33.2589,1.9735L33.0249,2.5254L32.4275,2.5761C32.3187,2.5851 32.2743,2.7204 32.3572,2.7921L32.8109,3.1853L32.675,3.7693C32.6503,3.8756 32.7655,3.9595 32.8595,3.9026L33.3726,3.5936L33.8858,3.9042C33.9798,3.9611 34.0945,3.8767 34.0698,3.7703L33.9338,3.1853L34.3876,2.7921C34.4704,2.7204 34.4271,2.5847 34.3183,2.5761L33.7199,2.5239L33.4863,1.9735C33.4653,1.9234 33.419,1.8986 33.3726,1.8986zM14.7898,1.9301C14.7359,1.9301 14.6916,1.9739 14.6916,2.0278L14.6916,2.126L14.1025,2.126C14.0496,2.126 14.0053,2.1701 14.0053,2.2231C14.0053,2.277 14.0496,2.3203 14.1025,2.3203L15.1004,2.3203C15.0347,2.5105 14.931,2.69 14.7898,2.8469C14.7104,2.7596 14.6436,2.6642 14.5877,2.5642C14.5721,2.5358 14.5436,2.5182 14.5113,2.5182C14.4436,2.5182 14.4004,2.5916 14.4337,2.6505C14.4955,2.7613 14.5708,2.8672 14.6591,2.9652L14.2307,3.3879C14.1914,3.4261 14.1914,3.4887 14.2307,3.5269C14.2689,3.5651 14.331,3.5651 14.3702,3.5269L14.7898,3.1063L14.9877,3.3042C15.0377,3.3542 15.1229,3.3358 15.1474,3.2701C15.1611,3.2348 15.1526,3.1947 15.1252,3.1672L14.92,2.9652L14.9231,2.9621C15.0937,2.7719 15.2154,2.5537 15.2869,2.3223L15.4771,2.3223C15.53,2.3223 15.5737,2.2782 15.5737,2.2252L15.5737,2.2231C15.5737,2.1702 15.53,2.126 15.4771,2.126L14.8875,2.126L14.8875,2.0278C14.8875,1.9739 14.8437,1.9301 14.7898,1.9301zM8.0269,2.0386C7.9584,2.0386 7.9024,2.0947 7.9024,2.1632L7.9024,2.4123C7.9024,2.4808 7.9584,2.5368 8.0269,2.5368L8.276,2.5368C8.3445,2.5368 8.4005,2.4808 8.4005,2.4123L8.4005,2.1632C8.4005,2.0947 8.3445,2.0386 8.276,2.0386L8.0269,2.0386zM8.6496,2.0386C8.5811,2.0386 8.5251,2.0947 8.5251,2.1632L8.5251,2.4123C8.5251,2.4808 8.5811,2.5368 8.6496,2.5368L9.8945,2.5368C9.963,2.5368 10.019,2.4808 10.019,2.4123L10.019,2.1632C10.019,2.0947 9.963,2.0386 9.8945,2.0386L8.6496,2.0386zM27.2697,2.064C27.7374,2.064 28.1161,2.4426 28.1161,2.9104C28.1161,3.3782 27.7374,3.7569 27.2697,3.7569C26.8019,3.7569 26.4232,3.3782 26.4232,2.9104C26.4232,2.4426 26.8019,2.064 27.2697,2.064zM39.4756,2.064C39.9434,2.064 40.3226,2.4426 40.3226,2.9104C40.3226,3.3782 39.9434,3.7569 39.4756,3.7569C39.0078,3.7569 38.6292,3.3782 38.6292,2.9104C38.6292,2.4426 39.0078,2.064 39.4756,2.064zM33.3726,2.2123L33.584,2.712L34.1256,2.759L33.7153,3.1151L33.8388,3.6442L33.3726,3.3626L32.9076,3.6432L33.0311,3.114L32.6207,2.7575L33.1623,2.7104L33.3726,2.2123zM1.9167,2.3223C1.8682,2.3223 1.8266,2.352 1.8087,2.3942C1.8027,2.4082 1.7994,2.424 1.7994,2.4402C1.7994,2.4725 1.8127,2.5021 1.834,2.5234C1.8553,2.5447 1.8843,2.5575 1.9167,2.5575C1.9814,2.5575 2.0345,2.5049 2.0345,2.4402C2.0345,2.3755 1.9814,2.3223 1.9167,2.3223zM2.3875,2.3223C2.3551,2.3223 2.3256,2.3357 2.3043,2.357C2.2829,2.3783 2.2696,2.4078 2.2696,2.4402C2.2696,2.4563 2.273,2.4716 2.2789,2.4856C2.2849,2.4997 2.2936,2.5127 2.3043,2.5234C2.3149,2.534 2.3274,2.5422 2.3415,2.5482C2.3555,2.5541 2.3713,2.5575 2.3875,2.5575L3.7982,2.5575C3.8629,2.5575 3.916,2.5049 3.916,2.4402C3.916,2.3755 3.8629,2.3223 3.7982,2.3223L2.3875,2.3223zM39.4462,2.3812C39.4038,2.3812 39.3697,2.4149 39.3697,2.4572L39.3697,2.9569C39.3697,2.9939 39.3891,3.0289 39.4219,3.0479L39.8611,3.3114C39.8971,3.3326 39.9433,3.3221 39.9645,3.2861C39.9867,3.2501 39.9752,3.2024 39.9381,3.1812L39.5289,2.9378L39.5289,2.4572C39.5289,2.4149 39.4947,2.3812 39.4524,2.3812L39.4462,2.3812zM26.8991,2.4872C26.8113,2.4872 26.7405,2.558 26.7405,2.6458C26.7405,2.7336 26.8113,2.8045 26.8991,2.8045C26.987,2.8045 27.0578,2.7337 27.0578,2.6458C27.0578,2.558 26.987,2.4872 26.8991,2.4872zM27.6402,2.4872C27.5523,2.4872 27.4815,2.558 27.4815,2.6458C27.4815,2.7336 27.5523,2.8045 27.6402,2.8045C27.728,2.8045 27.7988,2.7337 27.7988,2.6458C27.7988,2.558 27.728,2.4872 27.6402,2.4872zM21.1667,2.5399C21.3709,2.5399 21.5372,2.7062 21.5372,2.9104C21.5372,3.1147 21.3709,3.2809 21.1667,3.2809C20.9624,3.2809 20.7967,3.1147 20.7967,2.9104C20.7967,2.7062 20.9624,2.5399 21.1667,2.5399zM8.0269,2.6613C7.9584,2.6613 7.9024,2.7174 7.9024,2.7859L7.9024,3.035C7.9024,3.1035 7.9584,3.1595 8.0269,3.1595L8.276,3.1595C8.3445,3.1595 8.4005,3.1035 8.4005,3.035L8.4005,2.7859C8.4005,2.7174 8.3445,2.6613 8.276,2.6613L8.0269,2.6613zM8.6496,2.6613C8.5811,2.6613 8.5251,2.7174 8.5251,2.7859L8.5251,3.035C8.5251,3.1035 8.5811,3.1595 8.6496,3.1595L9.8945,3.1595C9.963,3.1595 10.019,3.1035 10.019,3.035L10.019,2.7859C10.019,2.7174 9.963,2.6613 9.8945,2.6613L8.6496,2.6613zM15.6228,2.7146C15.564,2.7146 15.5111,2.7506 15.4905,2.8065L15.1309,3.7672C15.1073,3.827 15.1524,3.8907 15.2161,3.8907C15.2544,3.8907 15.2887,3.8676 15.3024,3.8313L15.3898,3.5967L15.8554,3.5967L15.9437,3.8313C15.9575,3.8666 15.9918,3.8907 16.03,3.8907C16.0938,3.8907 16.1389,3.827 16.1163,3.7672L15.7561,2.8065C15.7346,2.7506 15.6816,2.7146 15.6228,2.7146zM1.9167,2.7926C1.9005,2.7926 1.8853,2.7959 1.8712,2.8019C1.8571,2.8079 1.8447,2.8166 1.834,2.8272C1.8127,2.8485 1.7994,2.8781 1.7994,2.9104C1.7994,2.9266 1.8027,2.9418 1.8087,2.9559C1.8146,2.9699 1.8233,2.983 1.834,2.9936C1.8553,3.0149 1.8843,3.0282 1.9167,3.0282C1.9814,3.0282 2.0345,2.9751 2.0345,2.9104C2.0345,2.8457 1.9814,2.7926 1.9167,2.7926zM2.3875,2.7926C2.3551,2.7926 2.3256,2.8059 2.3043,2.8272C2.2936,2.8379 2.2849,2.8509 2.2789,2.8649C2.273,2.879 2.2696,2.8942 2.2696,2.9104C2.2696,2.9589 2.2993,3.001 2.3415,3.0189C2.3555,3.0249 2.3713,3.0282 2.3875,3.0282L3.7982,3.0282C3.8629,3.0282 3.916,2.9751 3.916,2.9104C3.916,2.8457 3.8629,2.7926 3.7982,2.7926L2.3875,2.7926zM15.6228,2.976L15.782,3.4008L15.4642,3.4008L15.6228,2.976zM26.8133,3.1223C26.7731,3.1223 26.7467,3.1664 26.7668,3.2014C26.8674,3.3749 27.0548,3.4923 27.2697,3.4923C27.4845,3.4923 27.6719,3.3749 27.7725,3.2014C27.7926,3.1665 27.7672,3.1223 27.726,3.1223L26.8133,3.1223zM1.9167,3.2634C1.9005,3.2634 1.8853,3.2667 1.8712,3.2727C1.829,3.2906 1.7994,3.3322 1.7994,3.3807C1.7994,3.3968 1.8027,3.4126 1.8087,3.4267C1.8146,3.4407 1.8233,3.4532 1.834,3.4639C1.8553,3.4852 1.8843,3.4985 1.9167,3.4985C1.9328,3.4985 1.9486,3.4952 1.9627,3.4892C2.0048,3.4713 2.0345,3.4292 2.0345,3.3807C2.0345,3.316 1.9814,3.2634 1.9167,3.2634zM2.3875,3.2634C2.3389,3.2634 2.2968,3.293 2.2789,3.3352C2.273,3.3493 2.2696,3.3645 2.2696,3.3807C2.2696,3.4454 2.3228,3.4985 2.3875,3.4985L3.7982,3.4985C3.8629,3.4985 3.916,3.4454 3.916,3.3807C3.916,3.316 3.8629,3.2634 3.7982,3.2634L2.3875,3.2634zM8.0269,3.284C7.9584,3.284 7.9024,3.3401 7.9024,3.4086L7.9024,3.6577C7.9024,3.7262 7.9584,3.7822 8.0269,3.7822L8.276,3.7822C8.3445,3.7822 8.4005,3.7262 8.4005,3.6577L8.4005,3.4086C8.4005,3.3401 8.3445,3.284 8.276,3.284L8.0269,3.284zM8.6496,3.284C8.5811,3.284 8.5251,3.3401 8.5251,3.4086L8.5251,3.6577C8.5251,3.7262 8.5811,3.7822 8.6496,3.7822L9.8945,3.7822C9.963,3.7822 10.019,3.7262 10.019,3.6577L10.019,3.4086C10.019,3.3401 9.963,3.284 9.8945,3.284L8.6496,3.284zM2.0345,6.35C1.9051,6.35 1.7994,6.4558 1.7994,6.5851L1.7994,8.2315C1.7994,8.3609 1.9051,8.4667 2.0345,8.4667L3.6809,8.4667C3.8103,8.4667 3.916,8.3609 3.916,8.2315L3.916,6.5851C3.916,6.4558 3.8103,6.35 3.6809,6.35L2.0345,6.35zM8.9607,6.35C8.7309,6.35 8.5303,6.505 8.4729,6.7278C8.4588,6.7822 8.4908,6.8366 8.5452,6.8507C8.5986,6.8648 8.6541,6.8329 8.6682,6.7784C8.7025,6.6453 8.8226,6.5515 8.9607,6.5515C9.127,6.5515 9.263,6.6875 9.263,6.8538L9.263,7.0554L8.3561,7.0554C8.2452,7.0554 8.1545,7.146 8.1545,7.2569L8.1545,8.2651C8.1545,8.376 8.2452,8.4667 8.3561,8.4667L9.5653,8.4667C9.6762,8.4667 9.7668,8.376 9.7668,8.2651L9.7668,7.2569C9.7668,7.146 9.6762,7.0554 9.5653,7.0554L9.4645,7.0554L9.4645,6.8538C9.4645,6.5757 9.2389,6.35 8.9607,6.35zM21.1636,6.35C20.893,6.352 20.6331,6.3816 20.4814,6.4513C20.4814,6.4513 20.1802,6.5859 20.1802,7.045C20.1802,7.1502 20.1784,7.2761 20.1817,7.4094C20.1926,7.8583 20.2637,8.3005 20.6788,8.4103C20.8702,8.4609 21.0348,8.4719 21.1672,8.4646C21.4072,8.4512 21.5418,8.3788 21.5418,8.3788L21.5341,8.2047C21.5341,8.2047 21.3624,8.2589 21.1698,8.2522C20.9789,8.2462 20.7774,8.2312 20.7465,7.9969C20.7436,7.9763 20.7424,7.9545 20.7424,7.9313C20.7424,7.9313 20.9298,7.9772 21.1672,7.9881C21.3124,7.9941 21.4485,7.9794 21.5868,7.9633C21.852,7.9316 22.0828,7.7685 22.1118,7.6192C22.1575,7.384 22.1537,7.045 22.1537,7.045C22.1537,6.5859 21.8529,6.4513 21.8529,6.4513C21.7013,6.3817 21.4408,6.352 21.1703,6.35L21.1636,6.35zM33.6078,6.35C33.4784,6.35 33.3726,6.4558 33.3726,6.5851L33.3726,7.5908C33.2621,7.5273 33.1256,7.5024 32.9809,7.553C32.8234,7.6094 32.7022,7.7491 32.674,7.9137C32.6199,8.2359 32.893,8.511 33.214,8.4605C33.4445,8.424 33.6078,8.2123 33.6078,7.9783L33.6078,6.8203L33.8429,6.8203C33.9722,6.8203 34.078,6.7145 34.078,6.5851C34.078,6.4558 33.9722,6.35 33.8429,6.35L33.6078,6.35zM28.0463,6.351C27.5562,6.355 26.4635,6.3562 26.4635,6.3562C26.4298,6.3645 26.3482,6.4298 26.2966,6.4802C26.2669,6.5216 26.2281,6.5735 26.2144,6.6337C26.2149,7.1271 26.2113,8.2341 26.2113,8.2341C26.2357,8.2748 26.3062,8.3453 26.3281,8.3674C26.3466,8.386 26.3931,8.4148 26.4304,8.4315C26.4474,8.4391 26.4644,8.4462 26.4826,8.4522L26.4976,8.4574L26.4976,8.4568C26.9584,8.4649 27.5093,8.473 28.0396,8.4517C28.051,8.4497 28.0665,8.4459 28.0743,8.4439C28.2083,8.3866 28.2974,8.2895 28.3264,8.1292C28.3336,7.6915 28.3162,7.1427 28.3094,6.5975C28.2874,6.554 28.2676,6.5033 28.2257,6.4689C28.1794,6.4259 28.1181,6.3795 28.0463,6.351zM40.2735,6.4058C40.2451,6.4058 40.2167,6.4167 40.195,6.4384L39.1971,7.4362L39.5035,7.7427L40.5014,6.7448C40.5448,6.7014 40.5448,6.6312 40.5014,6.5877L40.3521,6.4384C40.3303,6.4167 40.3019,6.4058 40.2735,6.4058zM27.6505,6.426C27.7674,6.4273 27.856,6.4263 27.9978,6.4363C28.0594,6.4607 28.1387,6.4921 28.1869,6.5557C28.2074,6.5813 28.2258,6.6119 28.2339,6.6347C28.2362,7.1212 28.2603,7.6503 28.2365,8.1824C28.2282,8.2177 28.1854,8.2609 28.1544,8.2915C28.112,8.3254 28.0659,8.3604 28.0014,8.3664C27.6888,8.3804 27.3333,8.3692 26.9746,8.3762C26.9723,8.2076 26.9734,8.0825 26.9735,7.923C27.2251,7.9192 27.4101,7.9162 27.6469,7.9122C27.6549,7.7454 27.6512,7.5794 27.6443,7.4109C27.4207,7.4059 27.1967,7.4036 26.973,7.4016C26.973,7.2464 26.9731,7.137 26.9735,6.9929C27.2132,6.9909 27.4322,6.9897 27.65,6.9867C27.6515,6.7998 27.6505,6.6128 27.6505,6.426zM15.3526,6.6389C15.1399,6.6389 14.9676,6.8107 14.9676,7.0233C14.9676,7.236 15.1399,7.4083 15.3526,7.4083C15.5652,7.4083 15.737,7.236 15.737,7.0233C15.737,6.8107 15.5652,6.6389 15.3526,6.6389zM20.8576,6.7092C20.9703,6.7092 21.0555,6.7522 21.1119,6.8389L21.1667,6.9308L21.2214,6.8389C21.2779,6.7522 21.3635,6.7092 21.4762,6.7092C21.5736,6.7092 21.6519,6.7432 21.7119,6.8099C21.7699,6.8767 21.7987,6.9671 21.7987,7.0807L21.7987,7.6367L21.5785,7.6367L21.5785,7.0967C21.5785,6.983 21.5306,6.9257 21.4349,6.9257C21.329,6.9257 21.2762,6.9939 21.2762,7.1293L21.2762,7.4249L21.0571,7.4249L21.0571,7.1293C21.0571,6.9939 21.0043,6.9257 20.8985,6.9257C20.8027,6.9257 20.7548,6.9829 20.7548,7.0967L20.7548,7.6367L20.5347,7.6367L20.5347,7.0807C20.5347,6.9671 20.5639,6.8767 20.622,6.8099C20.6819,6.7431 20.7602,6.7092 20.8576,6.7092zM14.3903,6.9272C14.3374,6.9272 14.2942,6.9704 14.2942,7.0233L14.2942,7.2161L14.1015,7.2161C14.0485,7.2161 14.0053,7.2593 14.0053,7.3122C14.0053,7.3651 14.0486,7.4083 14.1015,7.4083L14.2942,7.4083L14.2942,7.6006C14.2942,7.6535 14.3374,7.6967 14.3903,7.6967C14.4433,7.6967 14.4865,7.6535 14.4865,7.6006L14.4865,7.4083L14.6787,7.4083C14.7316,7.4083 14.7748,7.3651 14.7748,7.3122C14.7748,7.2593 14.7316,7.2161 14.6787,7.2161L14.4865,7.2161L14.4865,7.0233C14.4865,6.9704 14.4432,6.9272 14.3903,6.9272zM8.4568,7.2569L9.4645,7.2569C9.52,7.2569 9.5653,7.3023 9.5653,7.3577L9.5653,8.1644C9.5653,8.2198 9.52,8.2651 9.4645,8.2651L8.4568,8.2651C8.4014,8.2651 8.3561,8.2198 8.3561,8.1644L8.3561,7.3577C8.3561,7.3023 8.4014,7.2569 8.4568,7.2569zM3.1517,7.4466C3.1694,7.4467 3.187,7.4545 3.1988,7.4703L3.6117,8.0207C3.6411,8.0595 3.6129,8.1147 3.5646,8.1147L2.1544,8.1147C2.105,8.1147 2.0778,8.0586 2.1084,8.0197L2.4014,7.6435C2.4237,7.6129 2.4687,7.6116 2.4934,7.6414L2.7399,7.9385L3.1047,7.4693C3.1165,7.454 3.1341,7.4464 3.1517,7.4466zM8.9607,7.5597C8.8498,7.5597 8.7592,7.6504 8.7592,7.7613C8.7592,7.8722 8.8498,7.9628 8.9607,7.9628C9.0716,7.9628 9.1622,7.8722 9.1622,7.7613C9.1622,7.6504 9.0716,7.5597 8.9607,7.5597zM15.3526,7.6006C15.0957,7.6006 14.5826,7.7296 14.5826,7.9856L14.5826,8.0817C14.5826,8.1346 14.6258,8.1778 14.6787,8.1778L16.0259,8.1778C16.0788,8.1778 16.122,8.1346 16.122,8.0817L16.122,7.9856C16.122,7.7296 15.6094,7.6006 15.3526,7.6006zM38.9744,7.6311C38.7895,7.6311 38.64,7.7805 38.64,7.9654C38.64,8.1113 38.5109,8.1881 38.4173,8.1881C38.5198,8.324 38.6945,8.4109 38.8627,8.4109C39.1089,8.4109 39.3082,8.2116 39.3082,7.9654C39.3082,7.7805 39.1593,7.6311 38.9744,7.6311zM21.2979,10.4247A0.2834,0.2754 90.0045,0 0,21.0277 10.6924A0.2834,0.2754 90.0045,0 0,21.2876 10.9911A0.2834,0.2754 90.0045,0 0,21.5775 10.7234A0.2834,0.2754 90.0045,0 0,21.3176 10.4252A0.2834,0.2754 90.0045,0 0,21.2979 10.4247zM21.0034,10.758L20.2184,11.1678A0.3117,0.303 90,0 1,20.3006 11.3357L21.0861,10.9259A0.3117,0.303 90,0 1,21.0034 10.758zM2.8577,10.8479C2.5795,10.8479 2.3539,11.0736 2.3539,11.3518L2.3539,11.5533L2.2531,11.5533C2.1422,11.5533 2.0516,11.6439 2.0516,11.7548L2.0516,12.763C2.0516,12.8739 2.1422,12.9646 2.2531,12.9646L3.4623,12.9646C3.5732,12.9646 3.6639,12.8739 3.6639,12.763L3.6639,11.7548C3.6639,11.644 3.5732,11.5533 3.4623,11.5533L3.3616,11.5533L3.3616,11.3518C3.3616,11.0736 3.1359,10.8479 2.8577,10.8479zM8.2744,10.8479C8.1202,10.8479 7.9959,10.9723 7.9959,11.1265L7.9959,12.2385C7.9959,12.3927 8.1202,12.5171 8.2744,12.5171L9.1002,12.5171C9.0988,12.8319 8.6744,12.9646 8.6744,12.9646C8.6744,12.9646 9.3923,12.9616 9.495,12.5171L9.647,12.5171C9.8011,12.5171 9.9255,12.3927 9.9255,12.2385L9.9255,11.1265C9.9255,10.9723 9.8011,10.8479 9.647,10.8479L8.2744,10.8479zM14.566,10.8479A0.1648,0.1648 0,0 0,14.4017 11.0128L14.4017,12.9646L14.9273,12.9646L14.9273,10.8479L14.566,10.8479zM15.1934,10.8479L15.1934,11.9062L15.5613,11.9062A0.1648,0.1648 0,0 0,15.7257 11.7414L15.7257,10.8479L15.1934,10.8479zM26.4759,10.8479L26.4759,11.9062L27.2697,11.3771L26.4759,10.8479zM27.2697,11.3771L27.2697,12.4354L28.0634,11.9062L27.2697,11.3771zM27.2697,12.4354L26.4759,11.9062L26.4759,12.9646L27.2697,12.4354zM32.9494,10.8479C32.833,10.8479 32.7375,10.9434 32.7375,11.0598L32.7375,11.3952C32.7375,11.4513 32.7598,11.5053 32.8001,11.5455L33.1608,11.9062L32.799,12.268C32.7599,12.3082 32.7375,12.3623 32.7375,12.4184L32.7375,12.7527C32.7375,12.8691 32.833,12.9646 32.9494,12.9646L33.7959,12.9646C33.9123,12.9646 34.0077,12.8692 34.0077,12.7527L34.0077,12.4184C34.0077,12.3623 33.9854,12.3082 33.9462,12.269L33.5845,11.9062L33.9452,11.5466C33.9854,11.5064 34.0077,11.4523 34.0077,11.3962L34.0077,11.0598C34.0077,10.9434 33.9123,10.8479 33.7959,10.8479L32.9494,10.8479zM21.5708,10.852A0.3117,0.303 90,0 1,21.4411 10.9849L22.0622,11.6262A0.3117,0.303 90,0 1,22.1919 11.4934L21.5708,10.852zM21.0892,10.9296L20.6297,11.852L20.7657,11.9925L21.2519,11.0153A0.3117,0.303 90,0 1,21.0892 10.9296zM21.4395,10.9854A0.3117,0.303 90,0 1,21.286 11.0195A0.3117,0.303 90,0 1,21.2592 11.0164L21.3289,11.4748L21.5186,11.5058L21.4395,10.9854zM2.8577,11.0495C3.025,11.0495 3.16,11.1844 3.16,11.3518L3.16,11.5533L2.5554,11.5533L2.5554,11.3518C2.5554,11.1844 2.6904,11.0495 2.8577,11.0495zM33.0553,11.0598L33.6899,11.0598C33.7481,11.0598 33.7959,11.107 33.7959,11.1652L33.7959,11.4298L33.3726,11.8535L32.9494,11.4298L32.9494,11.1652C32.9494,11.107 32.9971,11.0598 33.0553,11.0598zM8.6734,11.0712C8.6798,11.0702 8.6852,11.0711 8.6889,11.0743C8.7184,11.1007 8.6402,11.1265 8.6465,11.2562C8.6493,11.3132 8.632,11.3569 8.7411,11.3569C8.8139,11.3569 8.7837,11.2923 8.8754,11.2923C8.9433,11.2923 8.9543,11.3373 8.9576,11.3657C8.9609,11.3373 8.9725,11.2923 9.0403,11.2923C9.132,11.2923 9.1018,11.3569 9.1746,11.3569C9.2837,11.3569 9.2664,11.3131 9.2692,11.2562C9.2755,11.1265 9.1968,11.1006 9.2263,11.0743C9.2559,11.0479 9.3833,11.2023 9.3865,11.2624C9.3898,11.3253 9.3901,11.4234 9.2966,11.4748C9.4016,11.5776 9.416,11.7145 9.416,11.7145L9.2356,11.7114C9.2356,11.7114 9.1944,11.5252 8.9762,11.5347C8.758,11.5437 8.7297,11.5819 8.7297,11.8127C8.7297,12.0436 8.831,12.1229 8.986,12.129C9.2295,12.138 9.2072,12.0029 9.2072,12.0029L9.0935,12.0086L9.0299,11.838L9.4191,11.838C9.4191,12.0246 9.34,12.3159 8.97,12.2969C8.6,12.2779 8.5179,11.9866 8.5147,11.7905C8.513,11.6826 8.5328,11.5622 8.6217,11.4763C8.527,11.4253 8.5292,11.3258 8.5292,11.2624C8.5292,11.1849 8.6287,11.0788 8.6734,11.0712zM39.0689,11.0903C39.0461,11.0942 39.0238,11.1049 39.0049,11.1239L38.4524,11.6763C38.4055,11.7232 38.4055,11.7989 38.4524,11.8458L39.0049,12.3982C39.0807,12.474 39.2105,12.4211 39.2105,12.314L39.2105,12.1104C39.8121,12.1104 40.2332,12.3032 40.534,12.7243C40.4136,12.1227 40.0527,11.5212 39.2105,11.4009L39.2105,11.4003L39.2105,11.2091C39.2105,11.1288 39.1375,11.0785 39.0689,11.0903zM19.9983,11.1027A0.2834,0.2754 90.0045,0 0,19.7275 11.3704A0.2834,0.2754 90.0045,0 0,19.9874 11.6685A0.2834,0.2754 90.0045,0 0,20.2778 11.4014A0.2834,0.2754 90.0045,0 0,20.0174 11.1027A0.2834,0.2754 90.0045,0 0,19.9983 11.1027zM20.3016,11.3388A0.3117,0.303 90,0 1,20.3052 11.4029A0.3117,0.303 90,0 1,20.2737 11.5249L20.7191,11.5988L20.807,11.4226L20.3016,11.3388zM21.0659,11.4649L20.978,11.6411L22.0312,11.8153A0.3117,0.303 90,0 1,22.0281 11.7533A0.3117,0.303 90,0 1,22.0607 11.6298L21.0659,11.4649zM22.3263,11.4866A0.2834,0.2754 90.0045,0 0,22.0555 11.7548A0.2834,0.2754 90.0045,0 0,22.3159 12.053A0.2834,0.2754 90.0045,0 0,22.6059 11.7858A0.2834,0.2754 90.0045,0 0,22.3459 11.4872A0.2834,0.2754 90.0045,0 0,22.3263 11.4866zM20.2711,11.5295A0.3117,0.303 90,0 1,20.1414 11.6623L20.853,12.3972L21.024,12.3078L20.2711,11.5295zM20.1378,11.6644A0.3117,0.303 90,0 1,19.9864 11.697A0.3117,0.303 90,0 1,19.9569 11.6939L20.0928,12.5884A0.3117,0.303 90,0 1,20.2442 12.5558A0.3117,0.303 90,0 1,20.2732 12.5589L20.1378,11.6644zM21.3692,11.7409L21.5336,12.8245A0.3117,0.303 90,0 1,21.6829 12.7935A0.3117,0.303 90,0 1,21.7144 12.7972L21.5589,11.7729L21.3692,11.7409zM22.0322,11.8205L21.6297,12.0303L21.6591,12.2261L22.1149,11.9884A0.3117,0.303 90,0 1,22.0322 11.8205zM33.3726,11.959L33.7959,12.3827L33.7959,12.6473C33.7959,12.7055 33.7481,12.7527 33.6899,12.7527L33.0553,12.7527C32.9971,12.7527 32.9494,12.7055 32.9494,12.6473L32.9494,12.3827L33.3726,11.959zM22.1175,11.9915L21.7165,12.7972A0.3117,0.303 90,0 1,21.8793 12.8835L22.2803,12.0773A0.3117,0.303 90,0 1,22.1175 11.9915zM2.8577,12.0577C2.9686,12.0577 3.0592,12.1483 3.0592,12.2592C3.0592,12.3701 2.9686,12.4607 2.8577,12.4607C2.7468,12.4607 2.6562,12.3701 2.6562,12.2592C2.6562,12.1483 2.7468,12.0577 2.8577,12.0577zM20.5104,12.0923L20.2778,12.56A0.3117,0.303 90,0 1,20.4401 12.6457L20.6458,12.2323L20.5104,12.0923zM21.3961,12.1522L20.4437,12.6488A0.3117,0.303 90,0 1,20.5264 12.8168L21.4256,12.3476L21.3961,12.1522zM15.1934,12.4385L15.1934,12.9646L15.5613,12.9646A0.1648,0.1648 0,0 0,15.7257 12.7997L15.7257,12.4385L15.1934,12.4385zM21.209,12.499L21.0375,12.5884L21.3982,12.9604A0.3117,0.303 90,0 1,21.5279 12.8276L21.209,12.499zM20.2231,12.5837A0.2834,0.2754 90.0045,0 0,19.9523 12.8514A0.2834,0.2754 90.0045,0 0,20.2122 13.1501A0.2834,0.2754 90.0045,0 0,20.5026 12.8824A0.2834,0.2754 90.0045,0 0,20.2422 12.5842A0.2834,0.2754 90.0045,0 0,20.2231 12.5837zM20.5269,12.8209A0.3117,0.303 90,0 1,20.53 12.884A0.3117,0.303 90,0 1,20.498 13.007L21.3672,13.1506A0.3117,0.303 90,0 1,21.3641 13.0876A0.3117,0.303 90,0 1,21.3956 12.9646L20.5269,12.8209zM21.6617,12.8214A0.2834,0.2754 90.0045,0 0,21.3915 13.0891A0.2834,0.2754 90.0045,0 0,21.6514 13.3873A0.2834,0.2754 90.0045,0 0,21.9413 13.1201A0.2834,0.2754 90.0045,0 0,21.6814 12.8214A0.2834,0.2754 90.0045,0 0,21.6617 12.8214zM2.8577,15.3458C2.6728,15.3458 2.5234,15.4952 2.5234,15.6802L2.5234,16.3484C2.5234,16.5333 2.6728,16.6827 2.8577,16.6827C3.0426,16.6827 3.191,16.5333 3.191,16.3484L3.1921,15.6802C3.1921,15.4952 3.0426,15.3458 2.8577,15.3458zM8.9607,15.3458C8.8706,15.3458 8.7979,15.4185 8.7979,15.5086L8.7979,15.5825C8.4864,15.6563 8.3096,15.9339 8.3096,16.2683L8.3096,16.8114L8.1695,16.9514C8.1011,17.0198 8.1489,17.1369 8.2455,17.1369L9.6749,17.1369C9.7715,17.1369 9.8202,17.0198 9.7519,16.9514L9.6123,16.8114L9.6123,16.2683C9.6123,15.935 9.4339,15.6563 9.1235,15.5825L9.1235,15.5086C9.1235,15.4185 9.0508,15.3458 8.9607,15.3458zM20.3435,15.3458C20.2141,15.3458 20.1083,15.4516 20.1083,15.581L20.1083,17.2274C20.1083,17.3567 20.2141,17.4625 20.3435,17.4625L21.9899,17.4625C22.1192,17.4625 22.225,17.3567 22.225,17.2274L22.225,15.581C22.225,15.4516 22.1192,15.3458 21.9899,15.3458L20.3435,15.3458zM33.3726,15.3458C32.7884,15.3458 32.3143,15.82 32.3143,16.4042C32.3143,16.9884 32.7884,17.4625 33.3726,17.4625C33.9568,17.4625 34.431,16.9884 34.431,16.4042C34.431,15.82 33.9568,15.3458 33.3726,15.3458zM38.8875,15.3458C38.7582,15.3458 38.6524,15.4516 38.6524,15.581L38.6524,17.4625L39.4756,17.1095L40.2988,17.4625L40.2988,15.581C40.2988,15.4516 40.1931,15.3458 40.0637,15.3458L38.8875,15.3458zM14.8394,15.4518C14.7801,15.4518 14.723,15.4771 14.6828,15.5205L14.5526,15.6631L14.2172,15.6631C14.1008,15.6631 14.0053,15.7586 14.0053,15.875L14.0053,17.1452C14.0053,17.2616 14.1008,17.3566 14.2172,17.3566L15.9101,17.3566C16.0266,17.3566 16.122,17.2616 16.122,17.1452L16.122,15.875C16.122,15.7586 16.0266,15.6631 15.9101,15.6631L15.5748,15.6631L15.4435,15.5205C15.4043,15.4771 15.3472,15.4518 15.288,15.4518L14.8394,15.4518zM39.0054,15.581L39.9459,15.581C40.0106,15.581 40.0637,15.6341 40.0637,15.6988L40.0637,17.1095L39.4756,16.8532L38.8875,17.1095L38.8875,15.6988C38.8875,15.6341 38.9407,15.581 39.0054,15.581zM33.6899,15.6197C34,15.7457 34.2191,16.0496 34.2191,16.4042C34.2191,16.6243 34.1345,16.8244 33.9969,16.9747C33.9694,16.889 33.8911,16.8274 33.7959,16.8274L33.6899,16.8274L33.6899,16.5101C33.6899,16.4519 33.6427,16.4042 33.5845,16.4042L32.9494,16.4042L32.9494,16.1923L33.1608,16.1923C33.219,16.1923 33.2667,16.1451 33.2667,16.0869L33.2667,15.875L33.4786,15.875C33.595,15.875 33.6899,15.7795 33.6899,15.6631L33.6899,15.6197zM28.2153,15.737C28.1861,15.7377 28.1572,15.7497 28.1363,15.7732L27.4324,16.5644L27.0697,16.2021C27.0267,16.1591 26.9576,16.1591 26.9146,16.2021L26.2434,16.8739C26.2004,16.9169 26.2004,16.9865 26.2434,17.0295L26.2537,17.0393C26.2967,17.0823 26.3669,17.0823 26.4087,17.0393L26.9927,16.4553L27.3508,16.8134C27.396,16.8586 27.4686,16.8563 27.5105,16.8093L28.3006,15.9205C28.3392,15.8775 28.3367,15.8114 28.2959,15.7696C28.2739,15.7475 28.2445,15.7364 28.2153,15.737zM21.1667,15.8161C21.2313,15.8161 21.2845,15.8692 21.2845,15.9339L21.2845,16.8744C21.2845,16.9391 21.2313,16.9922 21.1667,16.9922C21.102,16.9922 21.0488,16.9391 21.0488,16.8744L21.0488,15.9339C21.0488,15.8692 21.102,15.8161 21.1667,15.8161zM15.0637,15.9809C15.3558,15.9809 15.5928,16.218 15.5928,16.5101C15.5928,16.8022 15.3558,17.0393 15.0637,17.0393C14.7716,17.0393 14.5345,16.8022 14.5345,16.5101C14.5345,16.218 14.7716,15.9809 15.0637,15.9809zM20.6964,16.169C20.7611,16.169 20.8137,16.2217 20.8137,16.2863L20.8137,16.8744C20.8137,16.9391 20.7611,16.9922 20.6964,16.9922C20.6317,16.9922 20.5786,16.9391 20.5786,16.8744L20.5786,16.2863C20.5786,16.2216 20.6317,16.169 20.6964,16.169zM15.0637,16.1923A0.3175,0.3175 0,0 0,14.7464 16.5101A0.3175,0.3175 0,0 0,15.0637 16.8274A0.3175,0.3175 0,0 0,15.381 16.5101A0.3175,0.3175 0,0 0,15.0637 16.1923zM32.5484,16.2145L33.0553,16.7215L33.0553,16.8274C33.0553,16.9438 33.1503,17.0393 33.2667,17.0393L33.2667,17.2434C32.8487,17.1915 32.5262,16.836 32.5262,16.4042C32.5262,16.3386 32.5347,16.2759 32.5484,16.2145zM2.1802,16.3484C2.1223,16.3484 2.0779,16.3996 2.0857,16.4564C2.1369,16.7872 2.4152,17.047 2.7461,17.0971L2.7461,17.3509C2.7461,17.4122 2.7964,17.4625 2.8577,17.4625C2.919,17.4625 2.9693,17.4121 2.9693,17.3509L2.9693,17.0971C3.2991,17.0493 3.5785,16.7872 3.6298,16.4564C3.6376,16.3996 3.5931,16.3484 3.5352,16.3484C3.4884,16.3484 3.4494,16.3818 3.4427,16.4274C3.4015,16.7182 3.1396,16.9168 2.8577,16.9168C2.5759,16.9168 2.3139,16.7193 2.2727,16.4274C2.266,16.3817 2.2259,16.3484 2.1802,16.3484zM21.6369,16.522C21.7016,16.522 21.7547,16.5746 21.7547,16.6393L21.7547,16.8744C21.7547,16.9391 21.7016,16.9922 21.6369,16.9922C21.5722,16.9922 21.5196,16.9391 21.5196,16.8744L21.5196,16.6393C21.5196,16.5746 21.5722,16.522 21.6369,16.522zM8.7437,17.2455C8.7437,17.3649 8.8402,17.4625 8.9607,17.4625C9.0801,17.4625 9.1777,17.3648 9.1777,17.2455L8.7437,17.2455zM3.3869,19.8437L3.3869,20.161L2.1167,20.161L2.1167,20.7961L2.3285,20.7961L2.3285,20.3729L3.3869,20.3729L3.3869,20.6902L3.8101,20.267L3.3869,19.8437zM15.0637,19.8437C14.4795,19.8437 14.0053,20.3179 14.0053,20.9021C14.0053,21.4863 14.4795,21.9604 15.0637,21.9604C15.6479,21.9604 16.122,21.4863 16.122,20.9021C16.122,20.3179 15.6479,19.8437 15.0637,19.8437zM21.1667,19.8437C20.5822,19.8437 20.1083,20.3176 20.1083,20.9021C20.1083,21.4866 20.5822,21.9604 21.1667,21.9604C21.7512,21.9604 22.225,21.4866 22.225,20.9021C22.225,20.3176 21.7512,19.8437 21.1667,19.8437zM27.5523,19.8437L26.8909,20.5052L26.3617,20.5052L26.3617,21.299L26.8909,21.299L27.0304,21.439C27.0304,21.1395 27.2915,20.8401 27.5523,20.8401L27.5523,20.638L27.5523,19.8437zM34.0088,19.8443C33.9766,19.8388 33.9421,19.8627 33.9421,19.9011L33.9421,20.1052L32.6895,20.1052C32.6268,20.1052 32.5758,20.1564 32.5758,20.2189L32.5758,20.6742C32.5758,20.7368 32.6269,20.7884 32.6895,20.7884C32.7521,20.7884 32.8032,20.7368 32.8032,20.6742L32.8032,20.3326L33.9421,20.3326L33.9421,20.5367C33.9421,20.588 34.0034,20.613 34.0387,20.5765L34.3566,20.2587C34.3793,20.236 34.3793,20.2008 34.3566,20.1781L34.0387,19.8603C34.0299,19.8515 34.0195,19.8461 34.0088,19.8443zM8.1142,20.0556C7.9978,20.0556 7.9034,20.1505 7.9034,20.267L7.9024,21.5372C7.9024,21.6536 7.9978,21.7485 8.1142,21.7485L9.8072,21.7485C9.9236,21.7485 10.019,21.6537 10.019,21.5372L10.019,20.267C10.019,20.1506 9.9236,20.0556 9.8072,20.0556L8.1142,20.0556zM38.5351,20.1967C38.4704,20.1967 38.4173,20.2493 38.4173,20.314C38.4173,20.3787 38.4704,20.4318 38.5351,20.4318L40.4161,20.4318C40.4808,20.4318 40.534,20.3787 40.534,20.314C40.534,20.2493 40.4808,20.1967 40.4161,20.1967L38.5351,20.1967zM8.1142,20.267L9.8072,20.267L8.9607,20.7961L8.1142,20.267zM8.1142,20.4789L8.8486,20.9383C8.9173,20.9817 9.004,20.9817 9.0728,20.9383L9.8072,20.4789L9.8072,21.4312C9.8072,21.4894 9.7599,21.5372 9.7017,21.5372L8.2197,21.5372C8.1614,21.5372 8.1142,21.4895 8.1142,21.4312L8.1142,20.4789zM14.9087,20.4789C14.9182,20.4795 14.9278,20.4826 14.9366,20.4892L15.4311,20.8597C15.4597,20.8808 15.4597,20.9233 15.4311,20.9445L14.9366,21.315C14.9016,21.3415 14.8518,21.3169 14.8518,21.2726L14.8518,20.5316C14.8518,20.499 14.8799,20.4769 14.9087,20.4789zM20.9967,20.4882L21.2767,20.4882C21.4596,20.4882 21.608,20.6326 21.608,20.8106C21.608,20.9887 21.4596,21.1331 21.2767,21.1331L21.0824,21.1331L20.8054,21.3982L20.8054,20.6742C20.8054,20.5715 20.8911,20.4882 20.9967,20.4882zM3.2101,20.76C2.8798,20.76 2.6102,21.0301 2.6102,21.3605C2.6102,21.6908 2.8798,21.9604 3.2101,21.9604C3.5405,21.9604 3.8101,21.6908 3.8101,21.3605C3.8101,21.0301 3.5405,20.76 3.2101,20.76zM38.8875,20.7843C38.8229,20.7843 38.7702,20.8374 38.7702,20.9021C38.7702,20.9668 38.8229,21.0199 38.8875,21.0199L40.0637,21.0199C40.1284,21.0199 40.181,20.9668 40.181,20.9021C40.181,20.8374 40.1284,20.7843 40.0637,20.7843L38.8875,20.7843zM27.6562,20.9171C27.3691,20.9171 27.1348,21.1519 27.1348,21.439C27.1348,21.7261 27.3691,21.9604 27.6562,21.9604C27.9433,21.9604 28.1776,21.7261 28.1776,21.439C28.1776,21.1519 27.9433,20.9171 27.6562,20.9171zM3.2101,20.9403C3.4433,20.9403 3.6303,21.1273 3.6303,21.3605C3.6303,21.5936 3.4433,21.7806 3.2101,21.7806C2.977,21.7806 2.79,21.5936 2.79,21.3605C2.79,21.1273 2.977,20.9403 3.2101,20.9403zM34.0558,21.0158C33.9932,21.0158 33.9421,21.0674 33.9421,21.13L33.9421,21.4716L32.8032,21.4716L32.8032,21.2674C32.8032,21.2161 32.7418,21.1911 32.7065,21.2276L32.3887,21.5455C32.3659,21.5682 32.3659,21.6034 32.3887,21.6261L32.7065,21.9439C32.7418,21.9792 32.8032,21.9543 32.8032,21.9031L32.8032,21.6989L34.0558,21.6989C34.1184,21.6989 34.1695,21.6478 34.1695,21.5852L34.1695,21.13C34.1695,21.0674 34.1184,21.0158 34.0558,21.0158zM3.1445,21.0292L3.145,21.393L3.4334,21.6137L3.513,21.5098L3.2753,21.3279L3.2753,21.0292L3.1445,21.0292zM27.6562,21.0736C27.8588,21.0736 28.0215,21.2364 28.0215,21.439C28.0215,21.6416 27.8588,21.8044 27.6562,21.8044C27.4536,21.8044 27.2914,21.6416 27.2914,21.439C27.2914,21.2364 27.4536,21.0736 27.6562,21.0736zM2.3285,21.114L1.9053,21.5372L2.3285,21.9604L2.3285,21.6431L2.575,21.6431C2.5393,21.5702 2.5197,21.4922 2.5197,21.4312L2.3285,21.4312L2.3285,21.114zM27.6562,21.1326L27.6562,21.439L27.4397,21.6555A0.3063,0.3063 0,0 0,27.8092 21.7041A0.3063,0.3063 0,0 0,27.9523 21.3594A0.3063,0.3063 0,0 0,27.6562 21.1326zM39.3578,21.3723C39.2931,21.3723 39.2405,21.4255 39.2405,21.4902C39.2405,21.5549 39.2931,21.6075 39.3578,21.6075L39.5934,21.6075C39.6581,21.6075 39.7108,21.5549 39.7108,21.4902C39.7108,21.4255 39.6581,21.3723 39.5934,21.3723L39.3578,21.3723z" /> diff --git a/app/src/main/res/drawable/diag_bottom.xml b/app/src/main/res/drawable/diag_bottom.xml index b61b9cb08..90330373e 100644 --- a/app/src/main/res/drawable/diag_bottom.xml +++ b/app/src/main/res/drawable/diag_bottom.xml @@ -11,7 +11,7 @@ android:top="1dip"> + android:color="?colorAccent" /> diff --git a/app/src/main/res/drawable/diag_bottom_android4.xml b/app/src/main/res/drawable/diag_bottom_android4.xml index bd7a79a1c..0e523e5a4 100644 --- a/app/src/main/res/drawable/diag_bottom_android4.xml +++ b/app/src/main/res/drawable/diag_bottom_android4.xml @@ -11,7 +11,7 @@ android:top="1dip"> + android:color="@color/mastodonC4" /> diff --git a/app/src/main/res/drawable/diag_top.xml b/app/src/main/res/drawable/diag_top.xml index c967844ae..302a3484f 100644 --- a/app/src/main/res/drawable/diag_top.xml +++ b/app/src/main/res/drawable/diag_top.xml @@ -11,7 +11,7 @@ android:top="1dp"> + android:color="?colorAccent" /> diff --git a/app/src/main/res/drawable/diag_top_android4.xml b/app/src/main/res/drawable/diag_top_android4.xml index a4c4e62a1..0b1f3d373 100644 --- a/app/src/main/res/drawable/diag_top_android4.xml +++ b/app/src/main/res/drawable/diag_top_android4.xml @@ -11,7 +11,7 @@ android:top="1dp"> + android:color="@color/mastodonC4" /> diff --git a/app/src/main/res/drawable/fedilab_logo.xml b/app/src/main/res/drawable/fedilab_logo.xml deleted file mode 100644 index 5a94c5794..000000000 --- a/app/src/main/res/drawable/fedilab_logo.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - diff --git a/app/src/main/res/drawable/fedilab_logo_bubbles.xml b/app/src/main/res/drawable/fedilab_logo_bubbles.xml index 3c63e8f44..01e2fc41e 100644 --- a/app/src/main/res/drawable/fedilab_logo_bubbles.xml +++ b/app/src/main/res/drawable/fedilab_logo_bubbles.xml @@ -3,10 +3,10 @@ android:height="200dp" android:viewportWidth="52.917" android:viewportHeight="52.917"> - - + + diff --git a/app/src/main/res/drawable/ic_export_bookmarks.xml b/app/src/main/res/drawable/ic_export_bookmarks.xml index 70e551331..80db994bb 100644 --- a/app/src/main/res/drawable/ic_export_bookmarks.xml +++ b/app/src/main/res/drawable/ic_export_bookmarks.xml @@ -1,5 +1,10 @@ - - + + diff --git a/app/src/main/res/drawable/ic_import_bookmarks.xml b/app/src/main/res/drawable/ic_import_bookmarks.xml index b8e836142..97bdac0f1 100644 --- a/app/src/main/res/drawable/ic_import_bookmarks.xml +++ b/app/src/main/res/drawable/ic_import_bookmarks.xml @@ -1,5 +1,10 @@ - - + + diff --git a/app/src/main/res/drawable/ic_launcher_bubbles_foreground.xml b/app/src/main/res/drawable/ic_launcher_bubbles_foreground.xml index c73b113e5..7543a5993 100644 --- a/app/src/main/res/drawable/ic_launcher_bubbles_foreground.xml +++ b/app/src/main/res/drawable/ic_launcher_bubbles_foreground.xml @@ -3,17 +3,18 @@ android:height="108dp" android:viewportWidth="401.51514" android:viewportHeight="401.51514"> - - - - + + + + diff --git a/app/src/main/res/drawable/ic_launcher_fediverse_foreground.xml b/app/src/main/res/drawable/ic_launcher_fediverse_foreground.xml index 593835c1a..1c0764333 100644 --- a/app/src/main/res/drawable/ic_launcher_fediverse_foreground.xml +++ b/app/src/main/res/drawable/ic_launcher_fediverse_foreground.xml @@ -3,67 +3,68 @@ android:height="108dp" android:viewportWidth="426.75806" android:viewportHeight="426.75806"> - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_launcher_foreground.xml b/app/src/main/res/drawable/ic_launcher_foreground.xml deleted file mode 100644 index 557ef0905..000000000 --- a/app/src/main/res/drawable/ic_launcher_foreground.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - diff --git a/app/src/main/res/drawable/ic_launcher_hero_foreground.xml b/app/src/main/res/drawable/ic_launcher_hero_foreground.xml index 354e59635..870333922 100644 --- a/app/src/main/res/drawable/ic_launcher_hero_foreground.xml +++ b/app/src/main/res/drawable/ic_launcher_hero_foreground.xml @@ -3,22 +3,23 @@ android:height="108dp" android:viewportWidth="1402.7397" android:viewportHeight="1402.7397"> - - - - - - - + + + + + + + diff --git a/app/src/main/res/drawable/imageview_border.xml b/app/src/main/res/drawable/imageview_border.xml deleted file mode 100644 index 382d1d8df..000000000 --- a/app/src/main/res/drawable/imageview_border.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/imageview_border_black.xml b/app/src/main/res/drawable/imageview_border_black.xml deleted file mode 100644 index 77a7133f4..000000000 --- a/app/src/main/res/drawable/imageview_border_black.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/imageview_border_dark.xml b/app/src/main/res/drawable/imageview_border_dark.xml deleted file mode 100644 index f719c8bfc..000000000 --- a/app/src/main/res/drawable/imageview_border_dark.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/line_divider_black.xml b/app/src/main/res/drawable/line_divider_black.xml deleted file mode 100644 index c8938bd99..000000000 --- a/app/src/main/res/drawable/line_divider_black.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/line_divider_dark.xml b/app/src/main/res/drawable/line_divider_dark.xml deleted file mode 100644 index 2799d2d28..000000000 --- a/app/src/main/res/drawable/line_divider_dark.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/line_divider_light.xml b/app/src/main/res/drawable/line_divider_light.xml deleted file mode 100644 index 2799d2d28..000000000 --- a/app/src/main/res/drawable/line_divider_light.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/media_message_border.xml b/app/src/main/res/drawable/media_message_border.xml index 78e02e5a2..1385c9931 100644 --- a/app/src/main/res/drawable/media_message_border.xml +++ b/app/src/main/res/drawable/media_message_border.xml @@ -7,14 +7,14 @@ android:color="@color/mastodonC1" /> + android:top="1dp" /> \ No newline at end of file diff --git a/app/src/main/res/drawable/menu_item_selector.xml b/app/src/main/res/drawable/menu_item_selector.xml deleted file mode 100644 index b6bb25816..000000000 --- a/app/src/main/res/drawable/menu_item_selector.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/menu_item_selector_black.xml b/app/src/main/res/drawable/menu_item_selector_black.xml deleted file mode 100644 index 98f16dde7..000000000 --- a/app/src/main/res/drawable/menu_item_selector_black.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/menu_item_selector_light.xml b/app/src/main/res/drawable/menu_item_selector_light.xml deleted file mode 100644 index 81920e103..000000000 --- a/app/src/main/res/drawable/menu_item_selector_light.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/menu_selector.xml b/app/src/main/res/drawable/menu_selector.xml deleted file mode 100644 index 527657ce3..000000000 --- a/app/src/main/res/drawable/menu_selector.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/menu_selector_black.xml b/app/src/main/res/drawable/menu_selector_black.xml deleted file mode 100644 index a112f234a..000000000 --- a/app/src/main/res/drawable/menu_selector_black.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/menu_selector_dark.xml b/app/src/main/res/drawable/menu_selector_dark.xml deleted file mode 100644 index a89799b2e..000000000 --- a/app/src/main/res/drawable/menu_selector_dark.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/quick_reply_background.xml b/app/src/main/res/drawable/quick_reply_background.xml deleted file mode 100644 index ed4f9ff61..000000000 --- a/app/src/main/res/drawable/quick_reply_background.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/quick_reply_background_black.xml b/app/src/main/res/drawable/quick_reply_background_black.xml deleted file mode 100644 index a291f9abd..000000000 --- a/app/src/main/res/drawable/quick_reply_background_black.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/quick_reply_background_light.xml b/app/src/main/res/drawable/quick_reply_background_light.xml deleted file mode 100644 index 4229165a7..000000000 --- a/app/src/main/res/drawable/quick_reply_background_light.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/rounded_corner_10.xml b/app/src/main/res/drawable/rounded_corner_10.xml deleted file mode 100644 index 1d5ca0768..000000000 --- a/app/src/main/res/drawable/rounded_corner_10.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/rounded_label_sensitive.xml b/app/src/main/res/drawable/rounded_label_sensitive.xml index 74c364724..56f2b860f 100644 --- a/app/src/main/res/drawable/rounded_label_sensitive.xml +++ b/app/src/main/res/drawable/rounded_label_sensitive.xml @@ -7,9 +7,9 @@ diff --git a/app/src/main/res/drawable/shape_border_bottom_settings.xml b/app/src/main/res/drawable/shape_border_bottom_settings.xml deleted file mode 100644 index b089c7fe9..000000000 --- a/app/src/main/res/drawable/shape_border_bottom_settings.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_border_bottom_settings_black.xml b/app/src/main/res/drawable/shape_border_bottom_settings_black.xml deleted file mode 100644 index 2b649184f..000000000 --- a/app/src/main/res/drawable/shape_border_bottom_settings_black.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_border_bottom_settings_dark.xml b/app/src/main/res/drawable/shape_border_bottom_settings_dark.xml deleted file mode 100644 index 547a0ea07..000000000 --- a/app/src/main/res/drawable/shape_border_bottom_settings_dark.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/side_nav_bar.xml b/app/src/main/res/drawable/side_nav_bar.xml deleted file mode 100644 index 9ba9700ca..000000000 --- a/app/src/main/res/drawable/side_nav_bar.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/side_nav_bar_black.xml b/app/src/main/res/drawable/side_nav_bar_black.xml deleted file mode 100644 index a0d127490..000000000 --- a/app/src/main/res/drawable/side_nav_bar_black.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/side_nav_bar_dark.xml b/app/src/main/res/drawable/side_nav_bar_dark.xml deleted file mode 100644 index 27d494b12..000000000 --- a/app/src/main/res/drawable/side_nav_bar_dark.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/unfollow_color.xml b/app/src/main/res/drawable/unfollow_color.xml deleted file mode 100644 index a30c51f10..000000000 --- a/app/src/main/res/drawable/unfollow_color.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/app/src/main/res/layout-sw600dp/activity_about.xml b/app/src/main/res/layout-sw600dp/activity_about.xml index e170a8b13..7780fd3c6 100644 --- a/app/src/main/res/layout-sw600dp/activity_about.xml +++ b/app/src/main/res/layout-sw600dp/activity_about.xml @@ -26,22 +26,22 @@ android:orientation="vertical"> + android:textSize="22sp" /> + android:layout_height="wrap_content" + android:layout_gravity="center_horizontal" + android:layout_marginTop="10dp" + android:gravity="center_horizontal" + android:textSize="18sp" /> + android:textSize="16sp" /> + android:layout_marginBottom="20dp" + android:textSize="18sp" + android:visibility="gone" /> \ No newline at end of file diff --git a/app/src/main/res/layout/row_editing_tools.xml b/app/src/main/res/layout/row_editing_tools.xml index 7b8cc5e72..82ec064d1 100644 --- a/app/src/main/res/layout/row_editing_tools.xml +++ b/app/src/main/res/layout/row_editing_tools.xml @@ -14,11 +14,11 @@ android:layout_height="@dimen/editor_size" android:layout_margin="4dp" android:layout_marginBottom="8dp" + android:contentDescription="@string/label_brush" + app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintBottom_toBottomOf="parent" - tools:src="@drawable/ic_brush_edit" - android:contentDescription="@string/label_brush" /> + tools:src="@drawable/ic_brush_edit" /> + android:layout_height="wrap_content" + android:orientation="vertical"> + android:layout_height="wrap_content" + android:orientation="vertical"> \ No newline at end of file diff --git a/app/src/main/res/layout/showaccount_actionbar.xml b/app/src/main/res/layout/showaccount_actionbar.xml deleted file mode 100644 index cd0328d47..000000000 --- a/app/src/main/res/layout/showaccount_actionbar.xml +++ /dev/null @@ -1,45 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/simple_action_bar.xml b/app/src/main/res/layout/simple_action_bar.xml index c40302fcb..0c06e3199 100644 --- a/app/src/main/res/layout/simple_action_bar.xml +++ b/app/src/main/res/layout/simple_action_bar.xml @@ -18,43 +18,43 @@ xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/toolbar" - android:contentInsetLeft="0dp" - android:contentInsetStart="0dp" - app:contentInsetLeft="0dp" - app:contentInsetStart="0dp" - android:contentInsetRight="0dp" - android:contentInsetEnd="0dp" - app:contentInsetRight="0dp" - app:contentInsetEnd="0dp" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="?colorPrimary" + android:contentInsetStart="0dp" + android:contentInsetLeft="0dp" + android:contentInsetEnd="0dp" + android:contentInsetRight="0dp" + app:contentInsetEnd="0dp" + app:contentInsetLeft="0dp" + app:contentInsetRight="0dp" + app:contentInsetStart="0dp" tools:ignore="UnusedAttribute"> + android:contentDescription="@string/close" + android:gravity="center_vertical" + android:src="@drawable/ic_close" + android:tint="?attr/iconColorMenu" /> + android:contentDescription="@string/profile_picture" + android:gravity="center_vertical" /> + android:layout_gravity="center_vertical" + android:textSize="14sp" /> \ No newline at end of file diff --git a/app/src/main/res/layout/simple_bar.xml b/app/src/main/res/layout/simple_bar.xml index 3bbf10b01..3310950a8 100644 --- a/app/src/main/res/layout/simple_bar.xml +++ b/app/src/main/res/layout/simple_bar.xml @@ -18,37 +18,37 @@ xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/toolbar" - android:contentInsetLeft="0dp" - android:contentInsetStart="0dp" - app:contentInsetLeft="0dp" - app:contentInsetStart="0dp" - android:contentInsetRight="0dp" - android:contentInsetEnd="0dp" - app:contentInsetRight="0dp" - app:contentInsetEnd="0dp" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="?colorPrimary" + android:contentInsetStart="0dp" + android:contentInsetLeft="0dp" + android:contentInsetEnd="0dp" + android:contentInsetRight="0dp" + app:contentInsetEnd="0dp" + app:contentInsetLeft="0dp" + app:contentInsetRight="0dp" + app:contentInsetStart="0dp" tools:ignore="UnusedAttribute"> + android:contentDescription="@string/close" + android:gravity="center_vertical" + android:src="@drawable/ic_close" + android:tint="?attr/iconColorMenu" /> + android:scrollHorizontally="true" + android:textSize="16sp" /> \ No newline at end of file diff --git a/app/src/main/res/layout/simple_bar_add.xml b/app/src/main/res/layout/simple_bar_add.xml index aa3fbf8d1..659593862 100644 --- a/app/src/main/res/layout/simple_bar_add.xml +++ b/app/src/main/res/layout/simple_bar_add.xml @@ -18,17 +18,17 @@ xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/toolbar" - android:contentInsetLeft="0dp" - android:contentInsetStart="0dp" - app:contentInsetLeft="0dp" - app:contentInsetStart="0dp" - android:contentInsetRight="0dp" - android:contentInsetEnd="0dp" - app:contentInsetRight="0dp" - app:contentInsetEnd="0dp" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="?colorPrimary" + android:contentInsetStart="0dp" + android:contentInsetLeft="0dp" + android:contentInsetEnd="0dp" + android:contentInsetRight="0dp" + app:contentInsetEnd="0dp" + app:contentInsetLeft="0dp" + app:contentInsetRight="0dp" + app:contentInsetStart="0dp" tools:ignore="UnusedAttribute"> + android:contentDescription="@string/close" + android:gravity="center_vertical" + android:src="@drawable/ic_close" + android:tint="?attr/iconColorMenu" /> + android:scrollHorizontally="true" + android:textSize="16sp" /> + android:src="@drawable/ic_add" + android:tooltipText="@string/add_remote_instance" /> \ No newline at end of file diff --git a/app/src/main/res/layout/simple_bar_muted_instance.xml b/app/src/main/res/layout/simple_bar_muted_instance.xml index 46902c395..06894e9c5 100644 --- a/app/src/main/res/layout/simple_bar_muted_instance.xml +++ b/app/src/main/res/layout/simple_bar_muted_instance.xml @@ -18,17 +18,17 @@ xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/toolbar" - android:contentInsetLeft="0dp" - android:contentInsetStart="0dp" - app:contentInsetLeft="0dp" - app:contentInsetStart="0dp" - android:contentInsetRight="0dp" - android:contentInsetEnd="0dp" - app:contentInsetRight="0dp" - app:contentInsetEnd="0dp" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="?colorPrimary" + android:contentInsetStart="0dp" + android:contentInsetLeft="0dp" + android:contentInsetEnd="0dp" + android:contentInsetRight="0dp" + app:contentInsetEnd="0dp" + app:contentInsetLeft="0dp" + app:contentInsetRight="0dp" + app:contentInsetStart="0dp" tools:ignore="UnusedAttribute"> + android:contentDescription="@string/close" + android:gravity="center_vertical" + android:src="@drawable/ic_close" /> + android:scrollHorizontally="true" + android:textSize="16sp" /> + android:src="@drawable/ic_more_vert" + android:tooltipText="@string/open_menu" /> \ No newline at end of file diff --git a/app/src/main/res/layout/stats_owner_notifications.xml b/app/src/main/res/layout/stats_owner_notifications.xml index ee92be619..303a4e79f 100644 --- a/app/src/main/res/layout/stats_owner_notifications.xml +++ b/app/src/main/res/layout/stats_owner_notifications.xml @@ -15,10 +15,10 @@ see . --> + android:layout_height="wrap_content" + android:paddingLeft="@dimen/fab_margin" + android:paddingRight="@dimen/fab_margin"> + android:paddingRight="@dimen/activity_vertical_margin"> + android:layout_height="wrap_content" + android:layout_gravity="center_vertical" + android:text="@string/display_charts" + android:textSize="16sp" /> + android:layout_marginStart="15dp" + android:contentDescription="@string/validate" + android:scaleType="centerCrop" + android:src="@drawable/ic_insert_chart" /> + android:layout_height="wrap_content" + android:layout_weight="2" + android:text="@string/first_notification_date" /> + android:layout_height="wrap_content" + android:layout_weight="1" + android:textAlignment="textEnd" /> + android:layout_height="wrap_content" + android:layout_weight="2" + android:text="@string/last_notification_date" /> + android:layout_height="wrap_content" + android:layout_weight="1" + android:textAlignment="textEnd" /> + android:layout_height="wrap_content" + android:layout_weight="2" + android:text="@string/frequency" /> + android:layout_height="wrap_content" + android:layout_weight="1" + android:textAlignment="textEnd" /> + android:layout_height="wrap_content" + android:layout_weight="2" + android:text="@string/total_notifications" /> + android:layout_height="wrap_content" + android:layout_weight="1" + android:textAlignment="textEnd" /> + android:layout_height="wrap_content" + android:layout_weight="2" + android:text="@string/number_boosts" /> + android:layout_height="wrap_content" + android:layout_weight="1" + android:textAlignment="textEnd" /> + android:layout_height="wrap_content" + android:layout_weight="2" + android:text="@string/number_favourites" /> + android:layout_height="wrap_content" + android:layout_weight="1" + android:textAlignment="textEnd" /> + android:layout_height="wrap_content" + android:layout_weight="2" + android:text="@string/number_mentions" /> + android:layout_height="wrap_content" + android:layout_weight="1" + android:textAlignment="textEnd" /> + android:layout_height="wrap_content" + android:layout_weight="2" + android:text="@string/number_follows" /> + android:layout_height="wrap_content" + android:layout_weight="1" + android:textAlignment="textEnd" /> + android:layout_height="wrap_content" + android:layout_weight="2" + android:text="@string/number_polls" /> + android:layout_height="wrap_content" + android:layout_weight="1" + android:textAlignment="textEnd" /> + android:gravity="center" + android:visibility="gone"> . --> + android:layout_height="match_parent" + android:paddingLeft="@dimen/fab_margin" + android:paddingRight="@dimen/fab_margin"> + android:paddingRight="@dimen/activity_vertical_margin"> + android:layout_height="wrap_content" + android:layout_gravity="center_vertical" + android:text="@string/display_charts" + android:textSize="16sp" /> + android:layout_marginStart="15dp" + android:contentDescription="@string/validate" + android:scaleType="centerCrop" + android:src="@drawable/ic_insert_chart" /> + android:layout_height="wrap_content" + android:layout_weight="2" + android:text="@string/first_toot_date" /> + android:layout_height="wrap_content" + android:layout_weight="1" + android:textAlignment="textEnd" /> + android:layout_height="wrap_content" + android:layout_weight="2" + android:text="@string/last_toot_date" /> + android:layout_height="wrap_content" + android:layout_weight="1" + android:textAlignment="textEnd" /> + android:layout_height="wrap_content" + android:layout_weight="2" + android:text="@string/frequency" /> + android:layout_height="wrap_content" + android:layout_weight="1" + android:textAlignment="textEnd" /> + android:layout_height="wrap_content" + android:layout_weight="2" + android:text="@string/total_statuses" /> + android:layout_height="wrap_content" + android:layout_weight="1" + android:textAlignment="textEnd" /> + android:layout_height="wrap_content" + android:layout_weight="2" + android:text="@string/number_boosts" /> + android:layout_height="wrap_content" + android:layout_weight="1" + android:textAlignment="textEnd" /> + android:layout_height="wrap_content" + android:layout_weight="2" + android:text="@string/number_replies" /> + android:layout_height="wrap_content" + android:layout_weight="1" + android:textAlignment="textEnd" /> + android:layout_height="wrap_content" + android:layout_weight="2" + android:text="@string/number_statuses" /> + android:layout_height="wrap_content" + android:layout_weight="1" + android:textAlignment="textEnd" /> + android:layout_height="wrap_content" + android:layout_weight="2" + android:text="@string/number_with_media" /> + android:layout_height="wrap_content" + android:layout_weight="1" + android:textAlignment="textEnd" /> + android:layout_height="wrap_content" + android:layout_weight="2" + android:text="@string/number_with_cw" /> + android:layout_height="wrap_content" + android:layout_weight="1" + android:textAlignment="textEnd" /> + android:layout_height="wrap_content" + android:layout_weight="2" + android:text="@string/number_with_sensitive_media" /> + android:layout_height="wrap_content" + android:layout_weight="1" + android:textAlignment="textEnd" /> @@ -341,17 +341,17 @@ android:orientation="horizontal"> + android:layout_height="wrap_content" + android:layout_weight="2" + android:text="@string/v_public" /> + android:layout_height="wrap_content" + android:layout_weight="1" + android:textAlignment="textEnd" /> + android:layout_height="wrap_content" + android:layout_weight="2" + android:text="@string/v_unlisted" /> + android:layout_height="wrap_content" + android:layout_weight="1" + android:textAlignment="textEnd" /> + android:layout_height="wrap_content" + android:layout_weight="2" + android:text="@string/v_private" /> + android:layout_height="wrap_content" + android:layout_weight="1" + android:textAlignment="textEnd" /> + android:layout_height="wrap_content" + android:layout_weight="2" + android:text="@string/v_direct" /> + android:layout_height="wrap_content" + android:layout_weight="1" + android:textAlignment="textEnd" /> + android:gravity="center" + android:visibility="gone"> + android:layout_height="25dp" + android:layout_centerInParent="true" + android:scaleType="fitXY" /> + android:textSize="12sp" + android:visibility="gone" /> \ No newline at end of file diff --git a/app/src/main/res/layout/tablayout_notifications.xml b/app/src/main/res/layout/tablayout_notifications.xml index 327277639..884a4fa60 100644 --- a/app/src/main/res/layout/tablayout_notifications.xml +++ b/app/src/main/res/layout/tablayout_notifications.xml @@ -17,18 +17,18 @@ + android:orientation="vertical"> + app:tabSelectedTextColor="?colorAccent" /> - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/tablayout_toots.xml b/app/src/main/res/layout/tablayout_toots.xml index c9e144b2f..ada6ad780 100644 --- a/app/src/main/res/layout/tablayout_toots.xml +++ b/app/src/main/res/layout/tablayout_toots.xml @@ -22,12 +22,12 @@ + app:tabSelectedTextColor="?colorAccent" /> + android:layout_height="wrap_content" + android:orientation="vertical"> \ No newline at end of file diff --git a/app/src/main/res/layout/tags_any.xml b/app/src/main/res/layout/tags_any.xml index 766a9b95d..22a72f106 100644 --- a/app/src/main/res/layout/tags_any.xml +++ b/app/src/main/res/layout/tags_any.xml @@ -1,14 +1,14 @@ + android:layout_height="wrap_content" + android:orientation="vertical"> \ No newline at end of file diff --git a/app/src/main/res/layout/tags_instance.xml b/app/src/main/res/layout/tags_instance.xml index 71b85e9da..17d505dd3 100644 --- a/app/src/main/res/layout/tags_instance.xml +++ b/app/src/main/res/layout/tags_instance.xml @@ -1,14 +1,14 @@ + android:layout_height="wrap_content" + android:orientation="vertical"> \ No newline at end of file diff --git a/app/src/main/res/layout/tags_name.xml b/app/src/main/res/layout/tags_name.xml index 6b42bdfe2..42ad47c99 100644 --- a/app/src/main/res/layout/tags_name.xml +++ b/app/src/main/res/layout/tags_name.xml @@ -1,14 +1,14 @@ + android:layout_height="wrap_content" + android:orientation="vertical"> \ No newline at end of file diff --git a/app/src/main/res/layout/tags_none.xml b/app/src/main/res/layout/tags_none.xml deleted file mode 100644 index c7f36e33a..000000000 --- a/app/src/main/res/layout/tags_none.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/toot_action_bar.xml b/app/src/main/res/layout/toot_action_bar.xml index 9e50cc806..9e3091ca4 100644 --- a/app/src/main/res/layout/toot_action_bar.xml +++ b/app/src/main/res/layout/toot_action_bar.xml @@ -18,51 +18,51 @@ xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/toolbar" - android:contentInsetLeft="0dp" - android:contentInsetStart="0dp" - app:contentInsetLeft="0dp" - app:contentInsetStart="0dp" - android:contentInsetRight="0dp" - android:contentInsetEnd="0dp" - app:contentInsetRight="0dp" - app:contentInsetEnd="0dp" android:layout_width="match_parent" android:layout_height="wrap_content" + android:contentInsetStart="0dp" + android:contentInsetLeft="0dp" + android:contentInsetEnd="0dp" + android:contentInsetRight="0dp" + app:contentInsetEnd="0dp" + app:contentInsetLeft="0dp" + app:contentInsetRight="0dp" + app:contentInsetStart="0dp" tools:ignore="UnusedAttribute"> + android:contentDescription="@string/close" + android:gravity="center_vertical" + android:src="@drawable/ic_close" /> + android:contentDescription="@string/profile_picture" + android:gravity="center_vertical" /> + android:layout_height="30dp" + android:layout_gravity="center_vertical" + android:layout_marginEnd="10dp" + android:gravity="center_vertical" + android:indeterminate="true" + android:visibility="gone" /> + android:layout_gravity="center_vertical" + android:textSize="14sp" /> \ No newline at end of file diff --git a/app/src/main/res/layout/toot_buttons.xml b/app/src/main/res/layout/toot_buttons.xml deleted file mode 100644 index 26338cb5f..000000000 --- a/app/src/main/res/layout/toot_buttons.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/update_account.xml b/app/src/main/res/layout/update_account.xml index 70df21faa..ec71b7209 100644 --- a/app/src/main/res/layout/update_account.xml +++ b/app/src/main/res/layout/update_account.xml @@ -14,25 +14,25 @@ You should have received a copy of the GNU General Public License along with Fedilab; if not, see . --> - + android:layout_gravity="center_vertical" + android:gravity="center_vertical"> + android:tint="?attr/iconColor" /> \ No newline at end of file diff --git a/app/src/main/res/layout/user_search_result.xml b/app/src/main/res/layout/user_search_result.xml deleted file mode 100644 index a72f8f284..000000000 --- a/app/src/main/res/layout/user_search_result.xml +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/webview_actionbar.xml b/app/src/main/res/layout/webview_actionbar.xml index fd825edd2..e301c9628 100644 --- a/app/src/main/res/layout/webview_actionbar.xml +++ b/app/src/main/res/layout/webview_actionbar.xml @@ -22,20 +22,20 @@ tools:ignore="UseCompoundDrawables"> + android:layout_gravity="center_vertical" + android:layout_marginStart="5dp" + android:layout_marginLeft="5dp" + android:layout_weight="1" + android:maxLines="1" + android:textSize="12sp" /> \ No newline at end of file diff --git a/app/src/main/res/menu/activity_main_drawer.xml b/app/src/main/res/menu/activity_main_drawer.xml index 8e014dea9..9b499ea2f 100644 --- a/app/src/main/res/menu/activity_main_drawer.xml +++ b/app/src/main/res/menu/activity_main_drawer.xml @@ -4,8 +4,8 @@ + android:id="@+id/nav_main_com" + android:title="@string/communication_menu_title">

+ android:title="@string/action_news" + app:actionLayout="@layout/item_menu_news" /> + android:title="@string/action_groups" + android:visible="false" /> + android:id="@+id/nav_peertube_comm" + android:title="@string/communication_menu_title"> + android:id="@+id/nav_pixelfed_comm" + android:title="@string/communication_menu_title"> + android:id="@+id/nav_main_opt" + android:title="@string/neutral_menu_title"> - + diff --git a/app/src/main/res/menu/main_compose_pixelfed.xml b/app/src/main/res/menu/main_compose_pixelfed.xml index 1a42fe206..66d08ccf4 100644 --- a/app/src/main/res/menu/main_compose_pixelfed.xml +++ b/app/src/main/res/menu/main_compose_pixelfed.xml @@ -3,22 +3,22 @@ xmlns:app="http://schemas.android.com/apk/res-auto"> diff --git a/app/src/main/res/menu/main_list.xml b/app/src/main/res/menu/main_list.xml index 93746e0ad..90e57a852 100644 --- a/app/src/main/res/menu/main_list.xml +++ b/app/src/main/res/menu/main_list.xml @@ -3,13 +3,13 @@ xmlns:app="http://schemas.android.com/apk/res-auto"> diff --git a/app/src/main/res/menu/main_login.xml b/app/src/main/res/menu/main_login.xml index 215eac8c8..62e5a8518 100644 --- a/app/src/main/res/menu/main_login.xml +++ b/app/src/main/res/menu/main_login.xml @@ -15,16 +15,16 @@ app:showAsAction="never" /> + app:actionViewClass="android.widget.CheckBox" /> + app:actionViewClass="android.widget.CheckBox" /> diff --git a/app/src/main/res/menu/main_media.xml b/app/src/main/res/menu/main_media.xml deleted file mode 100644 index 5363985ba..000000000 --- a/app/src/main/res/menu/main_media.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - diff --git a/app/src/main/res/menu/main_showaccount.xml b/app/src/main/res/menu/main_showaccount.xml index 385f078b9..9d2a6dcc8 100644 --- a/app/src/main/res/menu/main_showaccount.xml +++ b/app/src/main/res/menu/main_showaccount.xml @@ -3,43 +3,43 @@ xmlns:app="http://schemas.android.com/apk/res-auto"> diff --git a/app/src/main/res/menu/main_toot.xml b/app/src/main/res/menu/main_toot.xml index 77e207ae6..55d5436fe 100644 --- a/app/src/main/res/menu/main_toot.xml +++ b/app/src/main/res/menu/main_toot.xml @@ -3,57 +3,57 @@ xmlns:app="http://schemas.android.com/apk/res-auto"> diff --git a/app/src/main/res/menu/main_webview.xml b/app/src/main/res/menu/main_webview.xml index d8f37aae2..db523701b 100644 --- a/app/src/main/res/menu/main_webview.xml +++ b/app/src/main/res/menu/main_webview.xml @@ -8,13 +8,13 @@ app:showAsAction="always" /> diff --git a/app/src/main/res/menu/menu_accounts.xml b/app/src/main/res/menu/menu_accounts.xml index 891ed2c9a..2c23a2a96 100644 --- a/app/src/main/res/menu/menu_accounts.xml +++ b/app/src/main/res/menu/menu_accounts.xml @@ -1,6 +1,5 @@ - + diff --git a/app/src/main/res/menu/option_filter_admin_accounts.xml b/app/src/main/res/menu/option_filter_admin_accounts.xml index 37b9dfe16..e3fa3bb93 100644 --- a/app/src/main/res/menu/option_filter_admin_accounts.xml +++ b/app/src/main/res/menu/option_filter_admin_accounts.xml @@ -1,7 +1,7 @@ - + - + - + - + + android:title="@string/filter_regex" + app:showAsAction="always" /> diff --git a/app/src/main/res/menu/option_filter_toots_account.xml b/app/src/main/res/menu/option_filter_toots_account.xml index 82923a890..58022375e 100644 --- a/app/src/main/res/menu/option_filter_toots_account.xml +++ b/app/src/main/res/menu/option_filter_toots_account.xml @@ -1,7 +1,7 @@ - + diff --git a/app/src/main/res/menu/option_tag_timeline.xml b/app/src/main/res/menu/option_tag_timeline.xml index a4f4a1d9f..d08fde7e5 100644 --- a/app/src/main/res/menu/option_tag_timeline.xml +++ b/app/src/main/res/menu/option_tag_timeline.xml @@ -1,11 +1,11 @@ - + + android:title="@string/change_tag_column" + app:showAsAction="always" /> + android:title="@string/any_tags" + app:showAsAction="always" /> + android:title="@string/all_tags" + app:showAsAction="always" /> + android:title="@string/none_tags" + app:showAsAction="always" /> + افتح القائمة اغلق القائمة @@ -16,8 +15,6 @@ إلغاء تنزيل تنزيل %1$s - اكتمل التنزيل - حفظ %1$s تم حفظ الصورة ملف: %1$s كلمة السر @@ -25,10 +22,8 @@ الحسابات التبويقات الوسوم - الرمز المميز حفظ استعادة - المصادقة بخطوتين ؟ لم يتم العثور على أية نتيجة! مثيل الخادم مثيل الخادم: mastodon.social @@ -39,10 +34,7 @@ تعديل حدد صورة… تنظيف - الميكروفون آلة التصوير - قل شيئا من فضلك - معذرة! إنّ جهازك لا يدعَم الإدخال الصوتي! حذف الكل ترجم هذا التبويق. برمجة @@ -59,7 +51,6 @@ الردود اسم المستخدم المسودات - هناك بيانات جديدة متوفرة! هل تودّ عرضها؟ المفضلة متابِعون جدد الإشارات @@ -78,18 +69,12 @@ التواصل الحسابات المكتومة الحسابات المحظورة - تابع عن بعد الإشعارات طلبات المتابعة - التحسينات الإعدادات - الملف الشخصي - ماذا تريد أن تفعل؟ حذف حساب هل تود إزالة حساب %1$s من التطبيق ؟ إرسال بريد إلكتروني - يرجى اختيار ملف - لم يتم العثور على أي تطبيق لإدارة الملفات! اضغط على رابط المسار لتعديله فشل! التبويقات المبرمجة @@ -99,10 +84,6 @@ الإشعارات الحية لا توجد هناك أية تبويقات لعرضها - تمت إضافة التبويق إلى مفضلاتك - تمت إزالة التبويق من مفضلاتك! - تمت ترقية التبويق! - تم إلغاء ترقية التبويق! رقاه %1$s هل تود إضافة هذا التبويق إلى مفضلاتك ؟ هل تود إزالة هذا التبويق من مفضلاتك ؟ @@ -134,14 +115,6 @@ هل تود حذف هذا التبويق؟ هل تريد حقا حذف و إعادة صياغة هذا التبويق؟ - - %d رد - ردّ واحد %d - %d ردّين - %d ردود - %d ردود - %d ردود - الفواصل المرجعية إضافة إلى الفواصل المرجعية حذف الفاصلة المرجعية @@ -163,7 +136,6 @@ الرد على تبويق كتابة كويت رد على كويت - لقد بلغت حد الـ 500 حرف المسموح به! تحديد وسائط طرأ هناك خطأ أثناء اختيار الوسائط! هل تود حذف هذه الصورة؟ @@ -197,7 +169,6 @@ ترجمة التبويقات: البحث عن مثيلات الخوادم: مصمم الأيقونات: - مُصمِّم الرأسية: محادثة @@ -227,7 +198,6 @@ رقى تبويقك أُعجِب بتبويقك يتابعك - تبويق حديث مِن %1$s و اشعار آخَر و إشعار آخر @@ -236,14 +206,6 @@ و %d اشعارات و %d إشعارات أخرى - - وتبويقين %d آخرين لاكتشافهما - وتبويق آخر لاكتشافه - وتبويقين آخرين لاكتشافهما - و %d تبويقات أخرى لاكتشافها - و %d تبويقات أخرى لاكتشافها - و %d تبويقات أخرى لاكتشافها - %d إعجاب %d إعجاب @@ -283,7 +245,6 @@ يبدو أنّ اسم نطاق مثيل الخادوم غير صالح! طرأ هناك خطأ أثناء التحوّل مِن حساب إلى آخر! وقع خطأ أثناء عملية البحث! - تعذَّر تسجيل الدخول إلى حسابك! تم حفظ بيانات الملف الشخصي بنجاح! لا يمكن اتخاذ أي إجراء تم حفظ الصورة بنجاح! @@ -292,12 +253,8 @@ تم حِفظ المُسوَدَّة! هل أنت متأكد من أنّ مثيل الخادوم هذا يسمح بهذا الكمّ من الأحرف؟ عادةً ما تكون القيمة تقرب من 500 حرف. لقد تم تغيير نمط عرض التبويقات على الحساب %1$s - لا يمكن أن يكون اسم المثيل واسم الشاشة فارغين! - تحسين التحميل عدد التبويقات التي يتم تحميلها كل مرة - عدد الحسابات التي يتم تحميلها كل مرة - عدد الإخطارات التي يتم تحميلها كل مرة دائما واي فاي أُطلُب @@ -306,13 +263,9 @@ عرض المزيد… اعرض أقل… محتوى حساس - إظهار نص الرسالة السابقة في الردود - إظهار الخيط المحلي - إظهار الخيط الفديرالي تعطيل الصور الرمزية المتحركة المسار: حفظ تلقائي للمسودات - عرض العدادات إضافة روابط الوسائط في التبويقات تنبيهي عندما يتبعني أحدهم تنبيهي عندما يقوم أحدهم بترقية منشوري @@ -324,7 +277,6 @@ تفعيل الإخطار في وضع الواي فاي فقط هل تود الإشعار؟ كتم الاشعارات - الوضع الليلي مهلة عرض الـ NSFW (بالثواني، 0 يعني مُعطَّل) تعديل الملف الشخصي المشاركة المخصصة @@ -348,12 +300,6 @@ تفعيل الجافاسكريبت توسيع نافذة التحذير عن المحتوى تلقائيًا تقبُّل كعكات الطرف الثالث - نسق الخيوط: - - التبويبات - القائمة - التبويبات والقائمة - يانديكس DeepL @@ -365,15 +311,6 @@ فاتحة سوداء - - لا - 512 ك.ب - 1 م.ب - 2 م.ب - 4 م.ب - 6 م.ب - 8 م.ب - اختيار لون الإشعار الضوئي: أزرق @@ -384,13 +321,9 @@ أصفر أبيض - الإخطار عن التبويقات الجديدة على الخط الرئيسي اتبع - إلغاء المتابعة - حظر إلغاء الحظر كتم - بلا إجراء إلغاء الكتم تم إرسال الطلب يتابعك @@ -403,8 +336,6 @@ الرجاء التأكّد مِن الإشعارات المدفوعة التي تودّ تلقيها. بإمكانك تفعيل أو تعطيل هذه الإشعارات لاحقًا عبر الإعدادات (في تبويب الإخطارات). - للتبويقات غير المقروءة على الخط الزمني الرئيسي ؟ - للإشعارات غير المقروءة ؟ مسح ذاكرة التخزين المؤقت هناك %1$s من البيانات في ذاكرة التخزين المؤقتة.\n\nهل تودّ إزالتها ؟ @@ -414,7 +345,6 @@ العنوان العنوان… الوصف - الوصف… الكلمات المفتاحية الكلمات المفتاحية… @@ -431,7 +361,6 @@ إظهار المدبسة لا توجد أي نتيجة تتطابق طلب البحث! النسخ الاحتياطي لتبويقات حساب %1$s - نسخ احتياطي لإشعارات %1$s تمت عملية استرجاع %1$s تبويقات جديدة %1$s إشعارات جديدة تم استيرادها @@ -486,18 +415,14 @@ هل تود فعلا حذف هذه القائمة ؟ لا تزال هذه القائمة فارغة إلى حد الآن. سوف تظهر هنا تبويقات الأعضاء المنتمين إليها حالَما يقومون بالنشر. إضافة إلى القائمة - إزالة من القائمة إنشاء قائمة جديدة حذف القائمة تعديل القائمة عنوان جديد للقائمة - البحث فيما بين الحسابات التي تتبعها - قوائمك تمت إضافة الحساب إلى القائمة! لا توجد لديك أية قوائم إلى حدّ الآن! %1$s انتقلَ إلى %2$s - عرض عدد الترقيات والمفضلة هل المصادقة لا تعمل؟ b>وهنا بعض الاختبارات التي قد تساعدكم:</b>\n\n - تحققوا من عدم وجود الأخطاء الإملائية في اسم مثيل الخادم\n\n @@ -514,25 +439,19 @@ تم تصدير %1$s تبويقات من أصل %2$s. طرأ هناك خطأ أثناء تصدير بيانات %1$s حدث خطأ ما عند تصدير البيانات! - تم استيراد البيانات! حدث خطأ ما عند استيراد البيانات! البروكسي - النوع تشغيل البروكسي؟ المضيف المنفذ اسم المستخدم كلمة السر - السمة: - الوضع المختصر إضافة التفاصيل عند مشاركة تبويق ما ادعم التطبيق على ليبيراباي هناك خطأ في العبارة المنطقية! - ليس لديك حساب بعد؟ لم يتم العثور على أي خيط زمني في مثيل الخادم هذا! هل تريد إزالة مثيل الخادم هذا؟ - إنّك بصدد حذف %s مِن قائمة مثيلات الخوادم التي تتبعها. ترجِم إلى اتبع مثيل الخادم إنّك مُتابِع لمثيل الخادم هذا! @@ -541,10 +460,8 @@ معلومات إخفاء ترقيات %s أوصِ به على صفحتك - إخفاء كل شيء مِن %s إظهار ترقيات %s إلغاء التوصية مِن صفحتك - إظهار كل شيء قادم مِن %s تمت توصية الحساب على صفحتك الشخصية تم إلغاء توصية هذا الحساب مِن صفحتك سيتم إظهار الترقيات الآن! @@ -565,7 +482,6 @@ سياق عامل التصفية مجالات تطبيق عامل التصفية تنتهي صلاحيته بعد - إضافة عامل تصفية جديد متأكد مِن حذف عامل التصفية؟ تحديث عامل التصفية إنشاء عامل تصفية @@ -580,13 +496,11 @@ تمت عملية إضافة الحسابات إلى القائمة إضافة الحسابات إلى القائمة لم تقم بعد بإنشاء قائمة. اضغط على زر \"+\" لإنشاء قائمة. - إنك لا تتابع حاليا أي مثيل خادم عن بُعد. اضغط على زر \"+\" لإضافة واحد. حسابات للمُتابَعة جذع API لا يمكن متابعة الحساب·ات جلب الحسابات عن بُعد توسيع الوسائط المخفية تلقائيًا - إظهار زر متابَعة مثيلات الخوادم مُتابِع جديد ترقية جديدة مفضلة جديدة @@ -611,7 +525,6 @@ جارٍ جلب المنشور عن بُعد تعليق مثيل خادم بيرتيوب - عرض الخيط المحلي للرسائل الخاصة كن الأول في التعليق على هذا الفيديو بالضغط على الزر الأيمن في الأعلى! %s مشاهدات المدة: %s @@ -623,10 +536,6 @@ تم إزالة الفيديو من الفواصل المرجعية! لا توجد أية فيديوهات بيرتيوب في مفضلاتك! قناة - لا توجد أية قناة بيرتيوب - لا توجد أية مثيلات خوادم بيرتيوب - لا توجد أية مثيلات خوادم ماستدون - ليس هناك أية قائمة الفيديوهات القنوات استخدم إيموجي وان @@ -634,12 +543,7 @@ عرض المعاينات في كافة التبويقات مصمم واجهة المستخدم الجديدة عرض معاينات الفيديوهات - الدعم عبر غيت لاب - الابلاغ عن عِلّة - لا توجد هناك برامج بريد الكترونية مثبتة. - إرسال تقرير الأعطاب تم نسخ معرف الحساب إلى الحافظة! - تحسينات طاقة البطارية تغيير اللغة اللغة الافتراضية تقسيم التبويقات الطويلة @@ -651,7 +555,6 @@ تم حفظ الوسم! تم تعديل الوسم بنجاح! تم حذف الوسم! - إظهار الخيط الفني برمجة الترقية تمت برمجة الترقية! ليس هناك أية برمجة للترقية للعرض! @@ -690,12 +593,7 @@ يمكنكم الشروع في كتابة الحروف الأولى وستُقترَحُ عليكم أسماء.\n\n ⚠ زِرّ \"تسجيل الدخول\" سوف يعمل فقط إذا كان الخادم شغّالاً واسمه صالح! - في هذا الحقل، قم بكتابة عنوان بريك الإلكتروني المرتبط بحسابك على ماستدون. - - هذه هي الخطوة الأخيرة. ادخل كلمتك السرية ثم انقر على تسجيل الدخول. - تفاصيل أكثر - إن كنت قد قمت بتفعيل المصادقة بخطوتين (2FA)، يمكنك استخدام هذا الرابط.\nيمكنك استخدامه كذلك إن كنت لا ترغب في ادخال بيانات تسجيل الدخول الخاصة بك هنا. اللغات الوسائط فقط @@ -707,16 +605,13 @@ بوت مثيل خادم بيكسل فد مثيل خادم ماستدون - لا توجد مثيلات خوادم لبيكسل فد إحدى هذه الكلمات كل هذه الكلمات لا شيء من هذه أي من هذه الكلمات (مفصولة بمسافة) كافة هذه الكلمات (مفصولة بمسافة) - لاشيء من هذه الكلمات (مفصولة بمسافة) أضف بعض الكلمات للتصفية (مفصولة بمسافة) تغيير اسم العمود - لا توجد أية مثيلات خوادم ميسكي مثيل خادم ميسكي ليس هناك أي تطبيق مثبّت على جهازك يدعم هذا الرابط. الاشتراكات @@ -733,7 +628,6 @@ اختر الملف المراد ارساله فيديوهاتي العنوان - الفئات الرخصة الفئة اللغة @@ -748,14 +642,10 @@ اضغط هنا لتعديل بيانات الفيديو. احذف الفيديو هل أنت متأكد أنك تود حذف هذا الفيديو؟ - لم يتم إرسال أية فيديوهات بعد! عرض الفيديوهات الحساسة - القناة الافتراضية لـ %s لا توجد أية فيديوهات لعرضها! - إضافة الوسائط إلى المفضلة اترك تعليقاً شارك - صوري اختر أسلوب برمجة التبويقات عبر الجهاز عبر الخادِم @@ -763,12 +653,8 @@ التبويقات (الجهاز) تغيير إظهار التبويقات الجديدة فوق زر \"عرض المزيد\" - التأكيدات الخيوط الزمنية - خدمة الإشعارات الواجهة - المحتوى المخفي - التحرير المتراسلون %1$s على الفيديو %2$s]]> %1$s يتابع قناتك %2$s الآن]]> @@ -783,7 +669,6 @@ استورد البيانات حدّد الملف الذي تريد استيراده حدث خطأ عند اختيار ملف النسخ الاحتياطي! - رجاءً لا تقم بإيقاف التطبيق ريثما تكتمل العملية. لن يأخذ ذلك وقتًا كثيرا. أضف تعليقًا عامًا ارسل تعليق لا يوجد اتصال بالإنترنت. تم تخزين رسالتك في المسودات. @@ -824,18 +709,14 @@ ينتهي في %s تحديث استطلاع الرأي تصويت - لا يمكن إرفاق استطلاع للرأي في الرسائل المباشِرة! لقد انقضت مدة استطلاع رأي قد قُمتَ بالتصويت عليه مِن قَبل لقد انتهت مدة استطلاع رأي قد قُمتَ بنشره تخصيص الفئات - الأخبار الفترة الزمنية خيارات متقدمة عرض شارة \'new\' على التبويقات غير المقروءة - عرض الخيط الزمني لبيرتيوب Peertube - إخفاء اللسان نقل الخيط الزمني إخفاء الخيط الزمني إعادة ترتيب الخيوط الزمنية @@ -845,10 +726,8 @@ إلغاء يجب الإبقاء على لسانَين ظاهرين! إعادة ترتيب الخيوط الزمنية - استخدم القوائم قصد حذف هذه القائمة! الخيوط الرئيسية يمكن فقط إخفاءها! BBCode - إضافة خيط زمني اعتبار الوسائط دائما كحساسة مثيل خادم GNU منشور مُخزَّن @@ -863,14 +742,11 @@ التاريخ قوائم التشغيل الاسم العلني - الخصوصية - إنشاء ليس لديك أي قوائم تشغيل. انقر على أيقونة \"+\" لإضافة قائمة تشغيل جديدة يجب عليك إدخال اسم علني! القناة لازمة إن كانت قائمة التشغيل متاحة للعامة. إنشاء قائمة تشغيل قائمة التشغيل هذه فارغة حاليا. - تحرير الوسائط إعادة المعرض إيموجي @@ -878,7 +754,6 @@ مِمْحاة نص فلتر - ضبط فرشاة هل أنت متأكد من الخروج دون حفظ الصورة؟ تجاهل @@ -886,7 +761,6 @@ تم حفظ الصورة بنجاح! فشل في حفظ الصورة الشفافيّة - اقتصاص تمكين محرر الصور إضافة خيار إلى الاستطلاع إزالة آخر عنصر في الاستطلاع @@ -898,10 +772,8 @@ فترة الكتم اذكر الحساب تحديث ذاكرة التخزين المؤقت - اعرض من رقاه أو أضافه إلى مفضلته اذكر هذا المنشور الأخبار - عرض أخبار حساب Fedilab عام إقليمية فن @@ -945,7 +817,6 @@ أعد توصيل الحساب لقد فشل التطبيق في الوصول إلى ميزات الإشراف. قد تحتاج إلى إعادة توصيل الحساب قصد الحصول على التصريحات اللازمة لذلك. لم يتم حله - تم حله عن بعد نشط معلّق @@ -961,7 +832,6 @@ تعطيل اكتمه أخبر المستخدم عبر البريد الإلكتروني - نفّذ الإجراء تحذير مخصص المستخدم المُشرف @@ -993,7 +863,6 @@ محتوى فارغ! اعرض زر ميزات Fedilab يحتاج التطبيق إلى الوصول إلى تسجيل الصوت - حدث خطأ عند تسجيل الرسالة الصوتية! رسالة صوتية تمكين الرد السريع لا يتمكن الحساب الذي يتم الرد عليه من قد رؤية رسالتك! @@ -1001,9 +870,7 @@ عند التعطيل سيتم حجب المحتوى الحساس بواسطة زر حفظ الوسائط بالحجم الكامل بضغطة مطولة على معاينات إضافة زر بعلامات الحذف في أعلى يمين كل العلامات والمنشورات والقوائم والمثيلات - عرض عنصر في القائمة الرئيسية من أجل الوصول السريع إلى الخط الزمني مستهدفا #Fedilab الوسم الحفاظ على اتصال مفتوح إلى API البث للإخطارات الفورية. - عندما يكون التطبيق في الخلفية, سوف يبقا على اتصال بواجهة برمجة التطبيقات API. قم بتعطيله إذا كنت ترغب في الحفاظ على البطارية. خلال هذه الفتحة الزمنية سيقوم التطبيق بإرسال إخطارات. يمكنك عكس (أي تصميت) هذا الفتحة الزمنية باستخدام الزر الموافق. اعرض زر فيديلاب تحت الصورة الشخصية على شكل اختصار لولوج خاصيات البرنامج. إتاحة الرد مباشرة في الخط الزمني أدنى المنشورات @@ -1015,9 +882,6 @@ تمكن هذه الأوسمة من تصفية المنشورات من الحسابات. سيتوجب استخدام قائمة السياق لمعاينتهم. إدراج سطر جديد تلقائيا بعد الذكر لتكبير الحرف الأول تمكين صناع المحتوى من مشاركة المنشورات في RSS الخاص بهم - الخيوط - الواجهة - البطارية التحرير عدد المحاولة الأقصى عند تحميل وسائط إنشاء مجلد جديد هنا @@ -1028,9 +892,7 @@ المجلد الافتراضي المجلد إنشاء مجلد - استعمال المتصفح المفضل داخل التطبيق. عند تعطيل الروابط سيتم فتحها خارجيا عرض رسالة بعد تمام العمليات كالدعم والتفضيل وغيرها؟ - تصدير مثيلات الخوادم المكتومة لقد تم تصدير مثيلات الخوادم المكتومة! إضافة مثيل خادم تصدير مثيلات الخوادم @@ -1130,7 +992,6 @@ أدخل مضيفك المخصص أو اتركه فارغًا لاستخدام nitter.net أخفِ شريط إشعارات Fedilab لإخفاء الإشعارات المتبقية على شريط الحالة ، اضغط على زر أيقونة العين ثم قم بإلغاء تحديد: \"العرض على شريط الحالة\" - تمكين الإشعارات المتأخرة سيتم تأجيل الإشعارات كل 30 ثانية. الشيء الذي من شأنه أن يسمح باستنزاف أقل للبطارية. تم تأخير الإشعارات الحية ليس هناك إشعارات حية @@ -1156,7 +1017,6 @@ عنوان للفيديو انظم إلى PeerTube أبلُغ مِن العُمر 16 سنة علئ الأقل وأوافق على %1$s لهذا الخادم - الألوان الروابط Change the color of links (URLs, mentions, tags, etc.) in messages رأسية إعادات النشر @@ -1168,15 +1028,12 @@ صفّر الأيقونات لون الأيقونات السفلية على الخيوط - الخلفية - تغيير لون خلفية الخيوط العامة دبّس هذا الوسم شعار مثيل الخادم عدّل الصفحة التعريفية القيام بإجراء الترجمة معاينة الصورة - Change the theme Text color Change the text color in pots Apply changes diff --git a/app/src/main/res/values-bn/strings.xml b/app/src/main/res/values-bn/strings.xml index aa1192364..81fd469d3 100644 --- a/app/src/main/res/values-bn/strings.xml +++ b/app/src/main/res/values-bn/strings.xml @@ -1,5 +1,4 @@ - - + মেনু খুলুন মেনু বন্ধ করুন @@ -16,8 +15,6 @@ বাতিল ডাউনলোড ডাউনলোড করা হচ্ছে %1$s - ডাউনলোড সম্পূর্ণ হয়েছে - %1$s সংরক্ষণ করুন মিডিয়া সংরক্ষিত ফাইল: %1$s পাসওয়ার্ড @@ -25,10 +22,8 @@ অ্যাকাউন্টগুলি টুটগুলি ট্যাগগুলি - টোকেন সংরক্ষণ পুনঃস্থাপন - দুই ধাপে প্রমাণীকরণ? কোনও ফলাফল পাওয়া যায় নি! ইনস্ট্যান্স ইনস্ট্যান্স: mastodon.social @@ -39,10 +34,7 @@ পরিবর্তন একটি ছবি নির্বাচন করুন… পরিষ্কার - মাইক্রোফোন ক্য়ামেরা - দোয়া করে কিছু বলুন - দুঃখিত! আপনার ডিভাইস ভয়েস ইনপুটসমর্থন করে না! সব মুছে দিন টুট টি অনুবাদ করুন। সময়সূচি @@ -59,7 +51,6 @@ উত্তরগুলি ব্যবহারকারীর নাম ড্রাফটগুলি - নতুন তথ্য পাওয়া গেছে! আপনি তাদের প্রদর্শন করতে চান? প্রিয়াগুলি নতুন অনুসরণকারী উল্লেখগুলি @@ -78,18 +69,12 @@ যোগাযোগ নিঃশব্দ ব্যবহারকারী অবরুদ্ধ ব্যবহারকারী - দূরবর্তী অনুসরণ বিজ্ঞপ্তিগুলি অনুসরণ অনুরোধগুলি - অপ্টিমাইজেশন বিন্যাস - প্রোফাইল - আপনি কি করতে চান? একটি অ্যাকাউন্ট মুছেন আপনি কি এই %1$s একাউন্ট টি এপ্লিকেশন থেকে মুছে ফেলতে চান? একটি ইমেইল পাঠান - অনুগ্রহ করে একটি ফাইল নির্বাচন করুন - কোন ফাইল এক্সপ্লোরার পাওয়া যে নি! এটি পরিবর্তন করার জন্য পথে ক্লিক করুন ব্যর্থ! নির্ধারিত টুটগুলি @@ -99,10 +84,6 @@ লাইভ বিজ্ঞপ্তিগুলি প্রদর্শনের জন্য কোন টুট নেই - টুটটি প্রিয়গুলি সূচিতে যুক্ত হয়েছিল - টুটটি প্রিয়গুলি সূচি থেকে সরানো হয়েছিল! - The toot was boosted! - The toot is no longer boosted! Boosted by %1$s এই টুটটি আপনার পছন্দসইয়ের সাথে যুক্ত করবেন? আপনার পছন্দসই থেকে এই টুট সরাবেন? @@ -134,10 +115,6 @@ এই টুট টি মুছে ফেলবেন? Delete & re-draft this toot? - - %d reply - %d replies - Bookmarks Add to bookmarks Remove bookmark @@ -159,7 +136,6 @@ Reply to a toot Write a queet Reply to a queet - You have reached the 500 characters allowed! Select a media An error occurred while selecting the media! Delete this media? @@ -193,7 +169,6 @@ Translation of toots: Search instances: Icon designer: - Banner designer: Conversation @@ -223,15 +198,10 @@ boosted your status favourited your status followed you - New toot from %1$s and another notification and %d other notifications - - and another toot to discover - and %d other toots to discover - %d like %d likes @@ -267,7 +237,6 @@ The instance domain does not seem to be valid! An error occurred while switching between accounts! An error occurred while searching! - Can not log in! The profile data have been saved! No action can be taken The media has been saved! @@ -276,12 +245,8 @@ Draft saved! Are you sure this instance allows this number of characters? Usually, this value is close to 500 characters. Visibility of the toots has been changed for the account %1$s - Instance name and screen name cannot be blank! - Optimisation of loading Number of toots per load - Number of accounts per load - Number of notifications per load Always WIFI Ask @@ -290,13 +255,9 @@ Show more… Show less… Sensitive content - Display previous message in responses - Display local timeline - Display federated timeline Disable GIF avatars Path: Save drafts automatically - Display counters Add URL of media in toots Notify when someone follows you Notify when someone boosts your status @@ -308,7 +269,6 @@ Notify in WIFI only Notify? Silent Notifications - Night mode NSFW view timeout (seconds, 0 means off) Edit profile Custom sharing @@ -332,12 +292,6 @@ Enable Javascript Automatically expand cw Allow third-party cookies - Layout for timelines: - - Tabs - Menu - Tabs and menu - Yandex DeepL @@ -349,15 +303,6 @@ Light Black - - No - 512 Kb - 1 Mb - 2 Mb - 4 Mb - 6 Mb - 8 Mb - Set LED colour: Blue @@ -368,13 +313,9 @@ Yellow White - Notify for new toots on the home timeline Follow - Unfollow - Block Unblock Mute - No action Unmute Request sent Follows you @@ -387,8 +328,6 @@ Please, confirm push notifications that you want to receive. You can enable or disable these notifications later in settings (Notifications tab). - For unread toots in home time-line? - For unread notifications? Clear cache There are %1$s of data in cache.\n\nWould you like to delete them? @@ -398,7 +337,6 @@ Title Title… Description - Description… Keywords Keywords… @@ -415,7 +353,6 @@ Show pinned No matching result found! Backup toots for %1$s - Backup notifications for %1$s %1$s new toots have been imported %1$s new notifications have been imported @@ -471,18 +408,14 @@ Are you sure you want to permanently delete this list? There is nothing in this list yet. When members of this list post new statuses, they will appear here. Add to list - Remove from list Add list Delete list Edit list New list title - Search among people you follow - Your lists The account was added to the list! You don\'t have any lists yet! %1$s has moved to %2$s - Show boosts/favourites count Authentication does not work? Here are some checks that might help:\n\n - Check there is no spelling mistakes in the instance name\n\n @@ -499,25 +432,19 @@ %1$s toots out of %2$s have been exported. Something went wrong when exporting data for %1$s Something went wrong when exporting data! - Data have been imported! Something went wrong when importing data! Proxy - Type Enable proxy? Host Port Login Password - Theme: - Compact mode Add toot details when sharing Support the app on Liberapay There is an error in the regular expression! - No account yet? No timelines was found on this instance! Delete this instance? - You are going to delete %s from your followed instances. Translate in Follow instance You already follow this instance! @@ -526,10 +453,8 @@ Information Hide boosts from %s Feature on profile - Hide everything from %s Show boosts from %s Don\'t feature on profile - Show everything from %s The account is now featured on profile The account is no longer featured on profile Boosts are now shown! @@ -550,7 +475,6 @@ Filter contexts One or multiple contexts where the filter should apply Expire after - Add New Filter Delete filter? Update filter Create filter @@ -565,13 +489,11 @@ Accounts were added to the list Adding accounts to the list You have not created a list yet. Tap on the \"+\" button to add a new one. - You don\'t follow any remote instances. Tap on the \"+\" button to add a new one. Who to follow Trunk API Account(s) can\'t be followed Fetching remote account Automatically expand hidden media - Display follow instances button New follow New Boost New Favourite @@ -596,7 +518,6 @@ Fetching remote status Comment Peertube instance - Display private messages timeline Be the first to leave a comment on this video with the top right button! %s views Duration: %s @@ -608,10 +529,6 @@ The video has been removed from bookmarks! There is no Peertube videos in your favourites! Channel - No Peertube channels - No Peertube instances - No Mastodon instances - No lists Videos Channels Use Emoji One @@ -619,12 +536,7 @@ Display previews in all toots New UX/UI designer Display video previews - Gitlab Support - Bug Report - There are no email clients installed. - Send a bug report The account id has been copied in the clipboard! - Optimization of the battery Change the language Default language Truncate long toots @@ -636,7 +548,6 @@ The tag has been stored! The tag has been changed! The tag has been deleted! - Display Art timeline Schedule boost The boost is scheduled! No scheduled boost to display! @@ -675,12 +586,7 @@ You can start writing first letters and names will be suggested.\n\n ⚠ The Login button will only work if the instance name is valid and the instance is up! - In this field, write the email that is attached to your Mastodon account. - - Last step is to enter your password and tap on Login. - More information - If you use 2FA (Two-factor authentication), you need to use this link.\nYou can also use it if you do not want to enter your credentials here. Languages Media only @@ -692,16 +598,13 @@ Bot Pixelfed instance Mastodon instance - No Pixelfed instances Any of these All of these None of these Any of these words (space-separated) All these words (space-separated) - None of these words (space-separated) Add some words to filter (space-separated) Change column name - No Misskey instances Misskey instance No app supporting this link is installed on your device. Subscriptions @@ -718,7 +621,6 @@ Select the file to upload My videos Title - Categories License Category Language @@ -733,14 +635,10 @@ Tap here to edit the video data. Delete video Are you sure to delete this video? - No videos uploaded yet! Display NSFW videos - Default %s channel No videos to display! - Add media to favorites Leave a comment Share - My pictures Choose a schedule mode From device From server @@ -748,12 +646,8 @@ Toots (Device) Modify Display new toots above the \"Fetch more\" button - Confirmations Timelines - Notification service Interface - Hidden content - Composing Contacts %1$s commented your video %2$s]]> %1$s is following your channel %2$s]]> @@ -768,7 +662,6 @@ Import Data Select the file to import An error occurred when selecting the backup file! - Please, don\'t kill the app while processing. That can\'t be quite long. Add a public comment Send comment There is no Internet connection. Your message has been stored in drafts. @@ -809,18 +702,14 @@ end at %s Refresh poll Vote - A poll cannot be attached to a direct message! A poll you have voted in has ended A poll you tooted has ended Customize Categories - News Time slot Advanced Display \'new\' badge on unread toots - Display Peertube timeline Peertube - Hide the tab Move timeline Hide timeline Reorder timelines @@ -830,10 +719,8 @@ Undo You need to keep two visible tabs! Reorder timelines - Use the lists entry for deleting this list! Main timelines can only be hidden! BBCode - Add a timeline Always mark media as sensitive GNU instance Cached status @@ -848,14 +735,11 @@ History Playlists Display name - Privacy - Create You don\'t have any playlists. Tap on the \"+\" icon to add a new playlist You must provide a display name! The channel is required when the playlist is public. Create a playlist There is nothing in this playlist yet. - Edit media redo Gallery Emoji @@ -863,7 +747,6 @@ Eraser Text Filter - Adjust Brush Are you sure you want to exit without saving the image? Discard @@ -871,7 +754,6 @@ Image Saved Successfully! Failed to save Image Opacity - Crop Enable photo editor Add a poll item Remove last poll item @@ -883,10 +765,8 @@ Timed mute Mention the account Refresh cache - See who boosted and added to favorites Mention the status News - Display news from Fedilab\'s account General Regional Art @@ -930,7 +810,6 @@ Reconnect the account The application failed to access the admin features. You might need to reconnect the account for having the correct scope. Unresolved - Resolved Remote Active Pending @@ -946,7 +825,6 @@ Disable Silence Notify the user per e-mail - Perform action Custom warning User Moderator @@ -978,7 +856,6 @@ Empty content! Display Fedilab features button The application needs to access audio recording - An error occurred when recording the voice message! Voice message Enable quick reply The account you are replying might not see your message! @@ -986,9 +863,7 @@ If disabled, sensitive media will be hidden with a button Store media in full size with a long press on previews Add an ellipse button at the top right for listing all tags/instances/lists - Display an item in the main menu for a quick access to the timeline targeting #Fedilab tag Keep an open connection to the streaming API for live notifications. - When the app is in background, it will keep a connection to the streaming API. Disable it if you care about your battery. During the time slot, the app will send notifications. You can reverse (ie: silent) this time slot with the right spinner. Display a Fedilab button below profile picture. It is a shortcut for accessing in-app features. Allow to reply directly in timelines below statuses @@ -1000,9 +875,6 @@ These tags will allow to filter statuses from profiles. You will have to use the context menu for seeing them. Automatically insert a line break after the mention to capitalize the first letter Allow content creators to share statuses to their RSS feeds - Timelines - Interface - Battery Compose Maximum retry times when uploading media Create a new Folder here @@ -1013,9 +885,7 @@ Default Directory Folder Create folder - Use your favourite browser inside the application. By disabling, links will be opened externally Display a toast message after an action has been completed (boost, fav, etc.)? - Export muted instances Muted instances have been exported! Add an instance Export instances @@ -1111,7 +981,6 @@ Enter your custom host or leave blank for using nitter.net Hide Fedilab notification bar For hiding the remaining notification in the status bar, tap on the eye icon button then uncheck: \"Display in status bar\" - Enable delayed notifications Notifications will be delayed every 30 seconds. That will allow to drain less battery. Live notifications delayed No live notifications @@ -1137,7 +1006,6 @@ Title for the video Join Peertube I am at least 16 years old and agree to the %1$s of this instance - Colors Links Change the color of links (URLs, mentions, tags, etc.) in messages Reblogs header @@ -1149,15 +1017,12 @@ Reset Icons Color of bottom icons in timelines - Background - Change the background color for timelines Pin this tag Logo of the instance Edit profile Make an action Translation Image preview - Change the theme Text color Change the text color in pots Apply changes diff --git a/app/src/main/res/values-br/strings.xml b/app/src/main/res/values-br/strings.xml index 233c386b9..8c9e339fc 100644 --- a/app/src/main/res/values-br/strings.xml +++ b/app/src/main/res/values-br/strings.xml @@ -1,5 +1,4 @@ - - + Open the menu Close the menu @@ -16,8 +15,6 @@ Cancel Download Download %1$s - Download complete - Save %1$s Media saved File: %1$s Password @@ -25,10 +22,8 @@ Accounts Toots Tags - Token Save Restore - Two-step authentication? No results! Instance Instance: mastodon.social @@ -39,10 +34,7 @@ Change Select a picture… Clean - Microphone Camera - Please, say something - Sorry! Your device does not support the voice input! Delete all Translate this toot. Schedule @@ -59,7 +51,6 @@ Replies User name Drafts - New data are available! Do you want to display them? Favourites New followers Mentions @@ -78,18 +69,12 @@ Communication Muted users Blocked users - Remote follow Notifications Follow requests - Optimization Settings - Profile - What do you want to do? Delete an account Delete the account %1$s from the application? Send an email - Please select a file - No file explorer found! Tap on the path to change it Failed! Scheduled toots @@ -99,10 +84,6 @@ Live notifications No toot to display - The toot was added to favourites - The toot was removed from favourites! - The toot was boosted! - The toot is no longer boosted! Boosted by %1$s Add this toot to your favourites? Remove this toot from your favourites? @@ -134,13 +115,6 @@ Remove this toot? Delete & re-draft this toot? - - %d reply - %d replies - %d replies - %d replies - %d replies - Bookmarks Add to bookmarks Remove bookmark @@ -162,7 +136,6 @@ Reply to a toot Write a queet Reply to a queet - You have reached the 500 characters allowed! Select a media An error occurred while selecting the media! Delete this media? @@ -196,7 +169,6 @@ Translation of toots: Search instances: Icon designer: - Banner designer: Conversation @@ -226,7 +198,6 @@ boosted your status favourited your status followed you - New toot from %1$s and another notification and %d other notifications @@ -234,13 +205,6 @@ and %d other notifications and %d other notifications - - and another toot to discover - and %d other toots to discover - and %d other toots to discover - and %d other toots to discover - and %d other toots to discover - %d like %d likes @@ -279,7 +243,6 @@ The instance domain does not seem to be valid! An error occurred while switching between accounts! An error occurred while searching! - Can not log in! The profile data have been saved! No action can be taken The media has been saved! @@ -288,12 +251,8 @@ Draft saved! Are you sure this instance allows this number of characters? Usually, this value is close to 500 characters. Visibility of the toots has been changed for the account %1$s - Instance name and screen name cannot be blank! - Optimisation of loading Number of toots per load - Number of accounts per load - Number of notifications per load Always WIFI Ask @@ -302,13 +261,9 @@ Show more… Show less… Sensitive content - Display previous message in responses - Display local timeline - Display federated timeline Disable GIF avatars Path: Save drafts automatically - Display counters Add URL of media in toots Notify when someone follows you Notify when someone boosts your status @@ -320,7 +275,6 @@ Notify in WIFI only Notify? Silent Notifications - Night mode NSFW view timeout (seconds, 0 means off) Edit profile Custom sharing @@ -344,12 +298,6 @@ Enable Javascript Automatically expand cw Allow third-party cookies - Layout for timelines: - - Tabs - Menu - Tabs and menu - Yandex DeepL @@ -361,15 +309,6 @@ Light Black - - No - 512 Kb - 1 Mb - 2 Mb - 4 Mb - 6 Mb - 8 Mb - Set LED colour: Blue @@ -380,13 +319,9 @@ Yellow White - Notify for new toots on the home timeline Follow - Unfollow - Block Unblock Mute - No action Unmute Request sent Follows you @@ -399,8 +334,6 @@ Please, confirm push notifications that you want to receive. You can enable or disable these notifications later in settings (Notifications tab). - For unread toots in home time-line? - For unread notifications? Clear cache There are %1$s of data in cache.\n\nWould you like to delete them? @@ -410,7 +343,6 @@ Title Title… Description - Description… Keywords Keywords… @@ -427,7 +359,6 @@ Show pinned No matching result found! Backup toots for %1$s - Backup notifications for %1$s %1$s new toots have been imported %1$s new notifications have been imported @@ -483,18 +414,14 @@ Are you sure you want to permanently delete this list? There is nothing in this list yet. When members of this list post new statuses, they will appear here. Add to list - Remove from list Add list Delete list Edit list New list title - Search among people you follow - Your lists The account was added to the list! You don\'t have any lists yet! %1$s has moved to %2$s - Show boosts/favourites count Authentication does not work? Here are some checks that might help:\n\n - Check there is no spelling mistakes in the instance name\n\n @@ -511,25 +438,19 @@ %1$s toots out of %2$s have been exported. Something went wrong when exporting data for %1$s Something went wrong when exporting data! - Data have been imported! Something went wrong when importing data! Proxy - Type Enable proxy? Host Port Login Password - Theme: - Compact mode Add toot details when sharing Support the app on Liberapay There is an error in the regular expression! - No account yet? No timelines was found on this instance! Delete this instance? - You are going to delete %s from your followed instances. Translate in Follow instance You already follow this instance! @@ -538,10 +459,8 @@ Information Hide boosts from %s Feature on profile - Hide everything from %s Show boosts from %s Don\'t feature on profile - Show everything from %s The account is now featured on profile The account is no longer featured on profile Boosts are now shown! @@ -562,7 +481,6 @@ Filter contexts One or multiple contexts where the filter should apply Expire after - Add New Filter Delete filter? Update filter Create filter @@ -577,13 +495,11 @@ Accounts were added to the list Adding accounts to the list You have not created a list yet. Tap on the \"+\" button to add a new one. - You don\'t follow any remote instances. Tap on the \"+\" button to add a new one. Who to follow Trunk API Account(s) can\'t be followed Fetching remote account Automatically expand hidden media - Display follow instances button New follow New Boost New Favourite @@ -608,7 +524,6 @@ Fetching remote status Comment Peertube instance - Display private messages timeline Be the first to leave a comment on this video with the top right button! %s views Duration: %s @@ -620,10 +535,6 @@ The video has been removed from bookmarks! There is no Peertube videos in your favourites! Channel - No Peertube channels - No Peertube instances - No Mastodon instances - No lists Videos Channels Use Emoji One @@ -631,12 +542,7 @@ Display previews in all toots New UX/UI designer Display video previews - Gitlab Support - Bug Report - There are no email clients installed. - Send a bug report The account id has been copied in the clipboard! - Optimization of the battery Change the language Default language Truncate long toots @@ -648,7 +554,6 @@ The tag has been stored! The tag has been changed! The tag has been deleted! - Display Art timeline Schedule boost The boost is scheduled! No scheduled boost to display! @@ -687,12 +592,7 @@ You can start writing first letters and names will be suggested.\n\n ⚠ The Login button will only work if the instance name is valid and the instance is up! - In this field, write the email that is attached to your Mastodon account. - - Last step is to enter your password and tap on Login. - More information - If you use 2FA (Two-factor authentication), you need to use this link.\nYou can also use it if you do not want to enter your credentials here. Languages Media only @@ -704,16 +604,13 @@ Bot Pixelfed instance Mastodon instance - No Pixelfed instances Any of these All of these None of these Any of these words (space-separated) All these words (space-separated) - None of these words (space-separated) Add some words to filter (space-separated) Change column name - No Misskey instances Misskey instance No app supporting this link is installed on your device. Subscriptions @@ -730,7 +627,6 @@ Select the file to upload My videos Title - Categories License Category Language @@ -745,14 +641,10 @@ Tap here to edit the video data. Delete video Are you sure to delete this video? - No videos uploaded yet! Display NSFW videos - Default %s channel No videos to display! - Add media to favorites Leave a comment Share - My pictures Choose a schedule mode From device From server @@ -760,12 +652,8 @@ Toots (Device) Modify Display new toots above the \"Fetch more\" button - Confirmations Timelines - Notification service Interface - Hidden content - Composing Contacts %1$s commented your video %2$s]]> %1$s is following your channel %2$s]]> @@ -780,7 +668,6 @@ Import Data Select the file to import An error occurred when selecting the backup file! - Please, don\'t kill the app while processing. That can\'t be quite long. Add a public comment Send comment There is no Internet connection. Your message has been stored in drafts. @@ -821,18 +708,14 @@ end at %s Refresh poll Vote - A poll cannot be attached to a direct message! A poll you have voted in has ended A poll you tooted has ended Customize Categories - News Time slot Advanced Display \'new\' badge on unread toots - Display Peertube timeline Peertube - Hide the tab Move timeline Hide timeline Reorder timelines @@ -842,10 +725,8 @@ Undo You need to keep two visible tabs! Reorder timelines - Use the lists entry for deleting this list! Main timelines can only be hidden! BBCode - Add a timeline Always mark media as sensitive GNU instance Cached status @@ -860,14 +741,11 @@ History Playlists Display name - Privacy - Create You don\'t have any playlists. Tap on the \"+\" icon to add a new playlist You must provide a display name! The channel is required when the playlist is public. Create a playlist There is nothing in this playlist yet. - Edit media redo Gallery Emoji @@ -875,7 +753,6 @@ Eraser Text Filter - Adjust Brush Are you sure you want to exit without saving the image? Discard @@ -883,7 +760,6 @@ Image Saved Successfully! Failed to save Image Opacity - Crop Enable photo editor Add a poll item Remove last poll item @@ -895,10 +771,8 @@ Timed mute Mention the account Refresh cache - See who boosted and added to favorites Mention the status News - Display news from Fedilab\'s account General Regional Art @@ -942,7 +816,6 @@ Reconnect the account The application failed to access the admin features. You might need to reconnect the account for having the correct scope. Unresolved - Resolved Remote Active Pending @@ -958,7 +831,6 @@ Disable Silence Notify the user per e-mail - Perform action Custom warning User Moderator @@ -990,7 +862,6 @@ Empty content! Display Fedilab features button The application needs to access audio recording - An error occurred when recording the voice message! Voice message Enable quick reply The account you are replying might not see your message! @@ -998,9 +869,7 @@ If disabled, sensitive media will be hidden with a button Store media in full size with a long press on previews Add an ellipse button at the top right for listing all tags/instances/lists - Display an item in the main menu for a quick access to the timeline targeting #Fedilab tag Keep an open connection to the streaming API for live notifications. - When the app is in background, it will keep a connection to the streaming API. Disable it if you care about your battery. During the time slot, the app will send notifications. You can reverse (ie: silent) this time slot with the right spinner. Display a Fedilab button below profile picture. It is a shortcut for accessing in-app features. Allow to reply directly in timelines below statuses @@ -1012,9 +881,6 @@ These tags will allow to filter statuses from profiles. You will have to use the context menu for seeing them. Automatically insert a line break after the mention to capitalize the first letter Allow content creators to share statuses to their RSS feeds - Timelines - Interface - Battery Compose Maximum retry times when uploading media Create a new Folder here @@ -1025,9 +891,7 @@ Default Directory Folder Create folder - Use your favourite browser inside the application. By disabling, links will be opened externally Display a toast message after an action has been completed (boost, fav, etc.)? - Export muted instances Muted instances have been exported! Add an instance Export instances @@ -1126,7 +990,6 @@ Enter your custom host or leave blank for using nitter.net Hide Fedilab notification bar For hiding the remaining notification in the status bar, tap on the eye icon button then uncheck: \"Display in status bar\" - Enable delayed notifications Notifications will be delayed every 30 seconds. That will allow to drain less battery. Live notifications delayed No live notifications @@ -1152,7 +1015,6 @@ Title for the video Join Peertube I am at least 16 years old and agree to the %1$s of this instance - Colors Links Change the color of links (URLs, mentions, tags, etc.) in messages Reblogs header @@ -1164,15 +1026,12 @@ Reset Icons Color of bottom icons in timelines - Background - Change the background color for timelines Pin this tag Logo of the instance Edit profile Make an action Translation Image preview - Change the theme Text color Change the text color in pots Apply changes diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml index 806c3fcc7..47fe9d68a 100644 --- a/app/src/main/res/values-ca/strings.xml +++ b/app/src/main/res/values-ca/strings.xml @@ -1,5 +1,4 @@ - - + Obre el menú Tanca el menú @@ -16,8 +15,6 @@ Cancel·la Baixa Baixa %1$s - La baixada ha finalitzat - Desa %1$s S\'ha desat l\'element multimèdia Document: %1$s Contrasenya @@ -25,10 +22,8 @@ Comptes Toots Etiquetes - Identificador Desa Restaura - Autenticació de dos factors? No hi ha cap resultat! Instància Intància: mastodon.social @@ -39,10 +34,7 @@ Canvia Seleccioneu una imatge… Neteja - Micròfon Càmera - Digues alguna cosa - El vostre aparell sembla que no permet la introducció de veu! Suprimeix-ho tot Tradueix aquest toot. Temporalitza @@ -59,7 +51,6 @@ Respostes Nom d\'usuari Esborranys - Hi ha noves dades disponibles! Les voleu visualitzar? Preferits Seguidors nous Mencions @@ -78,18 +69,12 @@ Comunicació Usuaris silenciats Usuaris blocats - Seguiment remot Notificacions Peticions de seguiment - Optimització Configuració - Perfil - Què vols fer? Suprimeix un compte Voleu suprimir el compte %1$s de l\'aplicació? Envia un correu electrònic - Selecciona un document - No es troba un explorador de documents! Feu clic en a la ruta per canviar-la Ha fallat! Toots temporalitzats @@ -99,10 +84,6 @@ Notificacions en directe Cap toot per mostrar - El toot s\'ha afegit als preferits - El toot s\'ha suprimit dels preferits! - S\'ha difós el toot! - El toot ja no està difós! Difós per %1$s Afegir aquest toot als favorits? Esborrar aquest toot dels favorits? @@ -134,10 +115,6 @@ Vols suprimir aquest toot? Suprimir & tornar a redactar aquest toot? - - %d respondre - %d respostes - Marcadors Afegeix als marcadors Suprimeix el marcador @@ -159,7 +136,6 @@ Respon a un toot Escriu un quit Respon a un quit - Heu assolit els 500 caràcters permesos! Escull un recurs multimèdia S\'ha produït un error en seleccionar el recurs multimèdia! Vols suprimir aquest mèdia? @@ -193,7 +169,6 @@ Traducció dels toots: Cerca instàncies: Disseny d\'icones: - Disseny de banderoles: Conversa @@ -223,15 +198,10 @@ ha difós el teu estatus ha marcat com a preferit el teu estatus t\'ha començat a seguir - Nou toot provinent de %1$s i un altra notificació i %d altres notificacions - - i un altre toot per descobrir - i %d toots més per descobrir - %d agradament %d agradament @@ -267,7 +237,6 @@ El domini de la instància no sembla vàlid! Hi ha hagut un error en passar d\'un compte a l\'altre! Hi ha hagut un error durant la cerca! - No es pot iniciar la sessió! S\'han guardat les dades del perfil! No es pot endegar cap acció El mèdia s\'ha guardat! @@ -276,12 +245,8 @@ S\'ha desat l\'esborrany! Estàs segur que aquesta instància permet tants caràcters? El valor usual s\'aproxima a 500 caràcters. S\'ha canviat la visibilitat dels toots d\'aquest compte %1$s - El noms de la instància i de la pantalla no poden quedar en blanc! - Optimització de la càrrega Nombre de toots per càrrega - Nombre de comptes per càrrega - Nombre de notificacions per càrrega Sempre Wi-Fi Demana @@ -290,13 +255,9 @@ Mostra\'n més... Mostra\'n menys... Contingut sensible - Mostra el missatge anterior en les respostes - Mostra la pissarra local - Mostra la pissarra federada Desactiva els avatars GIF Camí: Desa els esborrany automàticament - Mostra els comptadors Afegeix als toots els URL dels mèdia Avisa quan algú et comenci a seguir Avisa quan algú difongui el teu estatus @@ -308,7 +269,6 @@ Enviar avisos només per WIFI Avisar? Notificacions silencioses - Mode nocturn Límit per mostrar material ofensiu (en segons, 0 és desactivat) Edita el perfil Personalitza el compartir @@ -332,12 +292,6 @@ Habilita el Javascript Expandir automàticament el ca Permetre galetes de tercers - Disposició de les pissarres: - - Pestanyes - Menú - Pestanyes i menú - Yandex DeepL @@ -349,15 +303,6 @@ Clar Negre - - No - 512 Kb - 1 Mb - 2 Mb - 4 Mb - 6 Mb - 8 Mb - Color del LED: Blau @@ -368,13 +313,9 @@ Groc Blanc - Avisa dels toots nous a la pissarra pròpia Segueix - Deixa de seguir - Bloca Deixa de blocar Silencia - Cap acció Deixa de silenciar S\'ha enviat la petició Et segueix @@ -386,8 +327,6 @@ Notificacions emergents Sisplau, confirma les notificacions emergents que vols rebre. Pots habilitar o deshabilitar les notificacions més endavant als ajustaments (Pestanya de notificacions). - Per als toots no llegits a la pissarra pròpia? - Per a notificacions no llegides? Netejar la memòria cau Hi ha %1$s de dades a la memòria cau.\n\nVoldries eliminar-les? @@ -397,7 +336,6 @@ Pots habilitar o deshabilitar les notificacions més endavant als ajustaments (P Títol Títol… Descripció - Descripció… Paraules clau Paraules clau… @@ -414,7 +352,6 @@ Pots habilitar o deshabilitar les notificacions més endavant als ajustaments (P Mostra els fixats No s`han trobat textos coincidents! Còpia de seguretat dels toots per %1$s - Quarda còpia de les notificacions de %1$s S\'han importat %1$s toots nous %1$s notificacions noves s\'han importat @@ -468,18 +405,14 @@ Quan s\'esborra l\'aplicació s\'eliminen les dades immediatament.\n Segur que vols suprimir permanentment la llista? No hi ha encara res a la llista. Quan els membres de la llista pengin nous estatus, apareixeran aquí. Afegeix a una llista - Suprimeix de la llista Afegeix una llista Suprimeix la llista Edita la llista Títol de llista nou - Cerca entre la gent a qui segueixes - Les teves llistes S\'ha afegit el compte a la llista! Encara no tens cap llista! %1$s s\'ha traslladat a %2$s - Mostra el recompte de difusions/preferits L\'autenticació falla? Aquí hi ha algunes comprovacions potencialment útils:\n\n - Comprova que no hi hagi errors de picatge en el nom de la instància\n\n - Comprova que no tinguis la instància inactiva\n\n - Si tens l\'autenticació de dos factors (2FA), prova l\'enllaç de la part inferior (després d\'entrar el nom de la instància)\n\n - L\'enllaç el pots fer servir encara que no tinguis la 2FA\n\n - Si encara no rutlla, sisplau obre fil del Framagit a https://framagit.org/tom79/fedilab/issues @@ -491,25 +424,19 @@ Quan s\'esborra l\'aplicació s\'eliminen les dades immediatament.\n S\'han exportat %1$s toots d\'un total de %2$s. Ha fallat alguna cosa durant l\'exportació de dades de %1$s Ha fallat alguna cosa mentre s\'exportaven dades! - S\'han importat dades! Ha fallat alguna cosa mentre s\'importaven dades! Servidor intermediari - Tipus Vols habilitar el servidor intermediari? Servidor Port Iniciar Sessió Contrasenya - Tema: - Mode Compacte Inclou detalls del toot en compartir-lo Dona suport a l\'App al Liberapay Hi ha un error en l\'expressió regular! - No tens compte encara? En aquesta instància no hi hem trobat pissarres! Esborrar la instància? - Ara eliminaràs %s de les instàncies que segueixes. Tradueix al Segueix la instància Ja estàs seguint aquesta instància! @@ -518,10 +445,8 @@ Quan s\'esborra l\'aplicació s\'eliminen les dades immediatament.\n Informació Amaga les difusions de %s Incloure al perfil - Amaga-ho tot de %s Mostra difusions de %s No incloure al perfil - Mostra tot el de %s El compte ara s\'inclou al perfil El compte ja no s\'inclou al perfil Les difusions estan visibles! @@ -542,7 +467,6 @@ Quan s\'esborra l\'aplicació s\'eliminen les dades immediatament.\n Contexts de filtre El context o conjunt de contexts on ha d\'operar un filtre Expira el - Nou filtre Eliminar el filtre? Actualitza el filtre Crear un filtre @@ -557,13 +481,11 @@ Quan s\'esborra l\'aplicació s\'eliminen les dades immediatament.\n S\'han afegit els comptes a la llista Afegint comptes a la llista No has creat cap llista encara. Clica el botó \"+\" per afegir-ne una. - No estàs seguint cap instància remota. Fes clic al botó \"+\" per afegir-ne una. A qui seguir API troncal No es pot seguir el(s) compte(s) Arreplegant compte remot Expandeix automàticament els mèdia amagats - Mostrar el botó de seguiment d\'instàncies Nou seguidor Nova difusió Nou preferit @@ -588,7 +510,6 @@ Quan s\'esborra l\'aplicació s\'eliminen les dades immediatament.\n Arreplegant l\'estatus remot Comentari Instància de Peertube - Mostra la pissarra de missatges privats Estrena els comentaris a aquest vídeo amb el botó de dalt a la dreta! %s visites Durada: %s @@ -600,10 +521,6 @@ Quan s\'esborra l\'aplicació s\'eliminen les dades immediatament.\n S\'ha eliminat el vídeo d\'entre els marcadors! No tens vídeos de Peertube als preferits! Canal - No hi ha canals de Peertube - No hi ha instàncies de Peertube - No hi ha instàncies de Mastodont - No hi ha llistes Vídeos Canals Fer ús d\' Emoji One @@ -611,12 +528,7 @@ Quan s\'esborra l\'aplicació s\'eliminen les dades immediatament.\n Mostra la vista preliminar de tots els toots Nou dissenyador UX/UI Mostrar les vistes preliminars dels vídeos - Servei a l\'usuari de Gitlab - Informe d\'errors - No hi ha clients de correu electrònic instal·lats. - Envia un informe d\'errors S\'ha copiat la id del compte al portapapers! - Optimització de la bateria Canvi d\'idioma Idioma per defecte Truncar els toots llargs @@ -628,7 +540,6 @@ Quan s\'esborra l\'aplicació s\'eliminen les dades immediatament.\n L\'etiqueta s\'ha guardat! S\'ha canviat l\'etiqueta! S\'ha eliminat l\'etiqueta! - Mostra la pissarra d\'Art Temporalitza difusió Aquesta difusió s\'ha temporalitzat! No hi ha temporalitzacions de difusió per mostrar! @@ -667,12 +578,7 @@ Quan s\'esborra l\'aplicació s\'eliminen les dades immediatament.\n Pots començar amb les primeres lletres i ja se suggeriran noms.\n\n ⚠ El botó d\'inici de sessió només funcionarà si el nom d\'instància és vàlid i la instància està activa! - En aquest camp, hi escrius el correu electrònic associat al teu compte de mastodont. - - L\'últim pas consisteix en introduir la contrasenya i clicar a \"Inici de sessió\". - Més informació - Si fas ús del 2FA (autenticació de dos factors), et cal emprar aquest enllaç.\nTambé pots utilitzar-lo si no vols introduir les credencials aquí. Idiomes Només mèdia @@ -684,16 +590,13 @@ Quan s\'esborra l\'aplicació s\'eliminen les dades immediatament.\n Bot Instància Pixelfed Instància de mastodont - No hi ha instàncies de Pixelfed Qualsevol d\'aquests Tots aquests Cap d\'aquests Qualsevol d\'aquestes paraules (separades-per-espais) Totes aquestes paraules (separades-per-espais) - Cap d\'aquestes paraules (separades per espais) Afegir paraules al filtre (separades per espais) Canvi de nom de columna - No hi ha instàncies de Misskey Instància Misskey No tens instal·lada cap app que gestioni aquest tipus d\'enllaç. Subscripcions @@ -710,7 +613,6 @@ Quan s\'esborra l\'aplicació s\'eliminen les dades immediatament.\n Seleccioneu el document per carregar Els meus vídeos Títol - Categories Llicència Categoria Idioma @@ -725,14 +627,10 @@ Quan s\'esborra l\'aplicació s\'eliminen les dades immediatament.\n Feu clic aquí per editar les dades de vídeo. Eliminar vídeo Segur que vols suprimir aquest vídeo? - No s\'han carregat vídeos encara! Mostra vídeos de contingut sensible - Canal %s per defecte No hi ha vídeos per mostrar! - Afegeix un mèdia als preferits Deixa un comentari Comparteix - Les meves imatges Tria un mode de temporització Des del dispositiu Des del servidor @@ -740,12 +638,8 @@ Quan s\'esborra l\'aplicació s\'eliminen les dades immediatament.\n Toots (al meu dispositiu) Modifica Mostra nous toots per damunt del botó \"Arreplegar-ne més\" - Confirmacions Pissarres - Servei de notificacions Interfícies - Contingut ocult - Composició Contactes %1$s ha comentat el teu vídeo %2$s]]> %1$s segueix el teu canal %2$s]]> @@ -760,7 +654,6 @@ Quan s\'esborra l\'aplicació s\'eliminen les dades immediatament.\n Importar dades Selecciona el document a importar S\'ha produït un error en seleccionar la còpia de seguretat! - Si us plau, no atureu l\'app a mig procés. Això no ha de durar gaire. Afegir un comentari públic Enviar comentari No hi ha connexió a Internet. El missatge s\'ha guardat entre els esborranys. @@ -801,18 +694,14 @@ Quan s\'esborra l\'aplicació s\'eliminen les dades immediatament.\n acaba a %s Actualitza l\'enquesta Vota - No es pot adjuntar enquestes a un missatge directe! S\'ha acabat una enquesta en què havies participat Ha finalitzat una enquesta on has votat Personalitza Categories - Notícies Franja horària Avançat Mostra el senyal \'nou\' en brams no llegits - Mostra pissarra del Peertube Canal de paers - Amaga la pestanya Mou la pissarra Amaga el cronograma Reordenar els cronogrames @@ -822,10 +711,8 @@ Quan s\'esborra l\'aplicació s\'eliminen les dades immediatament.\n Desfés Cal que restin visibles dues pestanyes! Reordenar les pissarres - Per esborrar aquesta llista, cal fer-ho des de les llistes entrades! Les pissarres principals només es poden amagar! Codi-BB - Afegir una pissarra Tots els mèdia són material sensible Instància de GNU Estatus en memòria cau @@ -840,14 +727,11 @@ Quan s\'esborra l\'aplicació s\'eliminen les dades immediatament.\n Historial Llistes de reproducció Nom que es mostrarà - Privacitat - Crea No tens llistes de reproducció. Clica la icona \"+\" per afegir-ne de noves Cal que et mostris amb algun nom! Aquest canal és obligat quan la llista és pública. Crea una llista de reproducció La llista encara és buida. - Editar document multimèdia tornar-hi Galeria Emoticones @@ -855,7 +739,6 @@ Quan s\'esborra l\'aplicació s\'eliminen les dades immediatament.\n Goma d\'esborrar Text Filtre - Ajustar Pinzell Esteu segur per sortir sense desar la imatge? Descarta @@ -863,7 +746,6 @@ Quan s\'esborra l\'aplicació s\'eliminen les dades immediatament.\n Imatge desada amb èxit! No s\'ha pogut desar la imatge Opacitat - Retalla Habilita l\'editor de fotos Afegeix un ítem a l\'enquesta Eliminar el darrer ítem de l\'enquesta @@ -875,10 +757,8 @@ Quan s\'esborra l\'aplicació s\'eliminen les dades immediatament.\n Silenciament programat Esmenta el compte Refrescar la memòria cau - Mirar qui t\'ha amplificat i afegit a preferits Esmenta l\'estatus Notícies - Mostra notícies del compte de Fedilab General Regional Art @@ -922,7 +802,6 @@ Quan s\'esborra l\'aplicació s\'eliminen les dades immediatament.\n Reconnectar el compte L\'aplicació no ha pogut accedir a les característiques d\'administrador. Pot ser que calgui reconnectar amb el compte per tenir totes les funcions. No està resolt - Resolt Remot Actiu Pendent @@ -938,7 +817,6 @@ Quan s\'esborra l\'aplicació s\'eliminen les dades immediatament.\n Deshabilita Silenciar Notificar usuari per correu-e - Executar acció Advertiment personalitzat Usuari Moderador @@ -970,7 +848,6 @@ Quan s\'esborra l\'aplicació s\'eliminen les dades immediatament.\n Buida el contingut! Mostrar el botó de funcionalitats de Fedilab A l\'aplicació li cal accedir a la gravadora d\'àudio - S\'ha produït un error en gravar el missatge de veu! Missatge de veu Activa resposta ràpida El compte a qui respons pot ser que no pugui veure el teu missatge! @@ -978,9 +855,7 @@ Quan s\'esborra l\'aplicació s\'eliminen les dades immediatament.\n Quan està desactivat, els mèdia senzills resten amagats amb un botó Guarda els mèdia a mida completa pitjant les previsualitzacions durant un segon Afegeix un botó el·lipse a dalt a la dreta per llistar totes les etiquetes/instàncies/llistes - Mostra un element al menú principal per a un accés ràpid a la pissarra que mostra l\'etiqueta #Fedilab Mantenir connexió oberta a l\'API de streaming per a rebre notificacions contínuament. - Mentre l\'app estigui en latència, mantindrà una connexió amb l\'API de streaming. Desactiva-ho si et preocupa la bateria. Dins el període definit, l\'app enviarà notificacions. Pots revertir (p. e. silenciar) aquest període amb el spinner adequat. Mostrar un botó de Fedilab sota la imatge de perfil. És una drecera per accedir a funcions de l\'app. Permet de respondre directament dins les pissarres sota les infos d\'estat @@ -992,9 +867,6 @@ Quan s\'esborra l\'aplicació s\'eliminen les dades immediatament.\n Aquestes etiquetes permetran de filtrar els estatus dels perfils. Hauràs de fer servir el menú conceptual per veure\'ls. Inserir automàticament un salt de línia després de la menció de primera lletra en majúscula Permet als creadors de continguts de compartir estatus en els seus RSS - Pissarres - Interfície - Bateria Redactar Màxim d\'intents quan es penja un mèdia Crear una carpeta nova aquí @@ -1005,9 +877,7 @@ Quan s\'esborra l\'aplicació s\'eliminen les dades immediatament.\n Directori Predeterminat Carpeta Crear carpeta - Utilitza el teu navegador preferit dins l\'aplicació. Si es desactiva, els enllaços s\'obriran externament Vols veure missatges efímers després de completar accions (difusió, pref, etc.)? - Exporta instàncies silenciades Les instàncies silenciades s\'han exportat! Afegir una instància Exportació d\'instàncies @@ -1103,7 +973,6 @@ Quan s\'esborra l\'aplicació s\'eliminen les dades immediatament.\n Introdueix aquí el teu hoste personalitzat o deixa-ho en blanc i s\'usarà nitter.net Hide Fedilab notification bar For hiding the remaining notification in the status bar, tap on the eye icon button then uncheck: \"Display in status bar\" - Activa l\'ajornament de notificacions S\'ajornaran les notificacions cada 30 segons. Això permet gastar menys la pila. Notificacions ajornades Notificacions instantànies desactivades @@ -1129,7 +998,6 @@ Quan s\'esborra l\'aplicació s\'eliminen les dades immediatament.\n Títol del vídeo Unir-se al Paertub Tinc almenys 16 anys i accepto les %1$s d\'aquesta instància - Colors Enllaços Canviar el color dels enllaços (Url, mencions, etiquetes, etc.) en els missatges Capçalera de difusions @@ -1141,15 +1009,12 @@ Quan s\'esborra l\'aplicació s\'eliminen les dades immediatament.\n Reiniciar Icones Color de les icones inferiors a les pissarres - Background - Change the background color for timelines Fixa l\'etiqueta Logo de la instància Edita el perfil Endega un acció Traducció Previsualització d\'imatge - Canvia el tema Text color Change the text color in pots Apply changes diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index 7c8df758e..480522c86 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -1,5 +1,4 @@ - - + Otevřít nabídku Zavřít nabídku @@ -16,8 +15,6 @@ Zrušit Stáhnout Stáhnout %1$s - Stahování dokončeno - Uložit %1$s Média uložena Soubor: %1$s Heslo @@ -25,10 +22,8 @@ Účty Tooty Štítky - Token Uložit Obnovit - Dvoufázová autentikace? Žádné výsledky! Instance Instance: mastodon.social @@ -39,10 +34,7 @@ Změnit Vybrat obrázek… Vyčistit - Mikrofon Fotoaparát - Řekněte něco, prosím - Litujeme! Vaše zařízení nepodporuje hlasový vstup! Smazat všechno Přeložit tento toot. Naplánovat @@ -59,7 +51,6 @@ Odpovědi Uživatelské jméno Koncepty - Jsou k dispozici nové údaje! Chcete je zobrazit? Oblíbené Noví sledující Zmínky @@ -78,18 +69,12 @@ Komunikace Ztlumení uživatelé Blokovaní uživatelé - Vzdálený sledující Oznámení Žádost o sledování - Optimalizace Nastavení - Profil - Co chcete udělat? Smazat účet Odstranit účet %1$s z aplikace? Poslat e-mail - Vyberte prosím soubor - Nenalezen průzkumník souborů! Klikněte na cestu pro změnu Neúspěšné! Naplánované tooty @@ -99,10 +84,6 @@ Živá oznámení Žádné tooty k zobrazení - Toot byl přidán k oblíbeným - Toot byl odstraněn z oblíbených! - Toot byl boostnut! - Toot již není boostnut! Boostnuto uživatelem %1$s Přidat tento toot k oblíbeným? Odstranit tento toot z oblíbených? @@ -134,12 +115,6 @@ Odstranit tento toot? Smazat a přepsat tento toot? - - %d odpověď - %d odpovědi - %d odpovědí - %d odpovědí - Záložky Přidat do záložek Odstranit záložku @@ -161,7 +136,6 @@ Odpovědět na toot Napsat queet Odpovědět na queet - Byl dosažen povolený limit 500 znaků! Vybrat média Nastala chyba při výběru média! Smazat médium? @@ -195,7 +169,6 @@ Překládat tooty: Prohledat instance: Návrh ikon: - Návrh banneru: Konverzace @@ -225,19 +198,12 @@ boostnul/a váš toot si oblíbil/a váš toot vás sleduje - Nový toot od uživatele %1$s and další upozornění and %d další upozornění and %d dalších upozornění and %d dalších oznámení - - a další toot k zobrazení - a %d další toots k zobrazení - a %d dalších toots k zobrazení - a %d dalších tootů k zobrazení - %d se líbí %d se líbí @@ -275,7 +241,6 @@ Tato doména není platná! Došlo k chybě při přepínání mezi účty! Při vyhledávání došlo k chybě! - Nemohu se přihlásit! Profil byl uložen! Nelze vykonat akci Média byla uložena! @@ -284,12 +249,8 @@ Koncept uložen! Jste si jisti, že tato instance dovoluje tento počet znaků? Obvyklá hodnota je 500 znaků. Viditelnost tootů byla změněna pro účet %1$s - Jméno instance a zobrazené jméno nemohou být prázdné! - Optimalizace nahrávání dat Počet tootů pro jedno nahrání - Počet účtů pro jedno nahrání - Počet oznámení pro jedno nahrání Vždy WIFI Zeptat se @@ -298,13 +259,9 @@ Ukázat víc… Ukázat méně… Citlivý obsah - Zobrazit předchozí zprávu v odpovědích - Zobrazit místní časovou osu - Zobrazit federovanou časovou osu Zakázat GIF avatary Cesta: Ukládat koncepty automaticky - Zobrazit počítadla Přidat URL médií v tootu Oznámení v případě sledování Oznámení v případě boostnutí vašeho tootu @@ -316,7 +273,6 @@ Oznámení pouze na WIFI Oznámení? Tichá oznámení - Noční režim NSFW prodleva (vteřiny, 0 znamená vypnuto) Upravit profil Vlastní sdílení @@ -340,12 +296,6 @@ Povolit JavaScript Automaticky ukázat cw Povolit soubory cookie třetích stran - Rozložení pro časové osy: - - Záložky - Nabídka - Záložky a menu - Yandex DeepL @@ -357,15 +307,6 @@ Světlé Černá - - Ne - 512 Kb - 1 Mb - 2 Mb - 4 Mb - 6 Mb - 8 Mb - Barva LED: Modrá @@ -376,13 +317,9 @@ Žlutá Bílá - Upozorňovat na nové tooty v domovské časové ose Následovat - Přestat sledovat - Blokovat Odblokovat Ztlumit - Žádná akce Zrušit ztlumení Žádost odeslána Sleduje vás @@ -395,8 +332,6 @@ Prosím potvrďte push oznámení, která chcete dostávat. Toto nastavení můžete změnit později v Nastavení (záložka Oznámení). - Pro nepřečtené tooty v domovské časové ose? - Pro nepřečtená oznámení? Vyprázdnit cache V cache je %1$s dat.\n\nChcete je odstranit? @@ -406,7 +341,6 @@ Název Název… Popis - Popis… Klíčová slova Klíčová slova… @@ -423,7 +357,6 @@ Zobrazit připnuté Nebyly nalezeny odpovídající výsledky! Zálohovat tooty pro uživatele %1$s - Backup notifications for %1$s %1$s nových tootů bylo importováno %1$s new notifications have been imported @@ -477,18 +410,14 @@ Uživatelské jméno a heslo nejsou nikdy ukládány. Jsou použity pouze během Jsi si jist/a, že chceš trvale odstranit tento seznam? Tento seznam je zatím prázdný. Jakmile členové seznamu zvěřejní nové tooty, objeví se zde. Přidat do seznamu - Odebrat ze seznamu Přidat seznam Odstranit seznam Upravit seznam Nový název seznamu - Hledat mezi sledovanými lidmi - Vaše seznamy The account was added to the list! You don\'t have any lists yet! %1$s se přesunul do %2$s - Zobrazit počet boostů/oblíbení Přihlášení nefunguje? Zde jsou kontroly, které by vám mohly pomoct:\n\n - Zkontrolujte, že ve jmménu instance není překlep\n\n @@ -505,25 +434,19 @@ Uživatelské jméno a heslo nejsou nikdy ukládány. Jsou použity pouze během %1$s tootů z %2$s bylo exportováno. Něco se pokazilo během exportu dat pro uživatele %1$s Něco se pokazilo během exportovaní dat! - Data byla importována! Něco se pokazilo během nahrávaní dat! Proxy - Typ Povolit proxy? Host Port Přihlašovací jméno Heslo - Motiv: - Kompaktní mód Přidat podrobnosti tootu při sdílení Podpořit aplikaci na Liberapay Chyba v regulárním výrazu! - Nemáte účet? Časová osa nenalezena na této instanci! Odstranit instanci? - Chystáte se smazat %s z vašich sledovaných instancí. Přeložit v Sledovat instanci Tuto instanci již sledujete! @@ -532,10 +455,8 @@ Uživatelské jméno a heslo nejsou nikdy ukládány. Jsou použity pouze během Informace Skrýt boosty od %s Zmínit v profilu - Skrýt vše od %s Zobrazit boosty od %s Neuvádět v profilu - Ukázat vše od %s Účet je nyní zmíněn v profilu Účet není nadále zmíněn v profilu Boosty jsou nyní zobrazeny! @@ -556,7 +477,6 @@ Uživatelské jméno a heslo nejsou nikdy ukládány. Jsou použity pouze během Kontext filtru Jeden nebo několik kontextů pro aplikaci filtru Vyprší po - Přidat nový filtr Vymazat filtr? Aktualizovat filtr Vytvořit filtr @@ -571,13 +491,11 @@ Uživatelské jméno a heslo nejsou nikdy ukládány. Jsou použity pouze během Účty byly přidány do seznamu Přidávám účty do seznamu Žádný seznam dosud nebyl vytvořen. Můžete vytvořit nový seznam klepnutím na tlačítko \"+\". - Žádné vzdálené instance nejsou zatím sledovány. Klepněte na tlačítko \"+\" pro přidání. Návrhy sledování Trunk API Účet/účty nemohou být sledovány Načítám vzdálený účet Automaticky zobrazovat skrytá média - Zobrazit tlačítko pro sledování instancí Nový sledující Nový boost Nové oblíbení @@ -602,7 +520,6 @@ Uživatelské jméno a heslo nejsou nikdy ukládány. Jsou použity pouze během Načítám vzdálený toot Komentovat Peertube instance - Zobrazit časovou osu se soukromými zprávami Zanechte první komentáře pro toto video. Klepněte na tlačítko vpravo nahoře! %s zhlédnutí Doba trvání: %s @@ -614,10 +531,6 @@ Uživatelské jméno a heslo nejsou nikdy ukládány. Jsou použity pouze během Video bylo odstraněno ze záložek! V oblíbených nemíte žádná videa na PeerTube! Kanál - Žádný Peertube kanál - Žádná Peertube instance - Žádné instance Mastodonu - Žádné seznamy Videa Kanály Použít Emoji One @@ -625,12 +538,7 @@ Uživatelské jméno a heslo nejsou nikdy ukládány. Jsou použity pouze během Zobrazit náhled ve všech tootech Nový UX/UI návrhář Zobrazit náhled videa - Gitlab podpora - Nahlásit chybu - Není instalován žádný e-mailový klient. - Poslat zprávu o chybě Identifikátor účtu byl zkopírován do schránky! - Optimalizace spotřeby energie Změna jazyka Základní jazyk Ořezat dlouhé tooty @@ -642,7 +550,6 @@ Uživatelské jméno a heslo nejsou nikdy ukládány. Jsou použity pouze během Štítek byl uložen! Štítek byl změněn! Štítek byl smazán! - Zobrazit Art časovou osu Naplánovat boost Boost je naplánováo! Žádný naplánovaý boost k zobrazení! @@ -681,11 +588,7 @@ Uživatelské jméno a heslo nejsou nikdy ukládány. Jsou použity pouze během Začněte psát první znaky pro návrh.\n\n ⚠ Tlačítko přihlášení bude fungovat pouze v případě, že je jméno instance platné a instance běží! - V tomto poli vyplňte email, který je svázaný s vaším účtem Mastodon. - - Jako poslední krok vložte své heslo a klepňete na Login. Více informací - V případě, že používáte 2FA (dvoufaktorovou autentizaci), použijte tento odkaz.\nMůžete jej také použít, pokud nechcete vložit své přihlašovací údaje tady. Jazyky Pouze média @@ -697,16 +600,13 @@ Uživatelské jméno a heslo nejsou nikdy ukládány. Jsou použity pouze během Bot Pixelfed instance Instance Mastodon - Žádné Pixelfed instance Kterýkoliv Všechny Žádný Kterékoliv slovo (odělené mezerami) Všechna slova (oddělená mezerami) - Žádné z těchto slov (oddělené mezerami) Add some words to filter (space-separated) Změnit název sloupce - Žádná Misskey instance Misskey instance Na vašem zařízení není nainstalována žádná aplikace podporující tento odkaz. Předplatné @@ -723,7 +623,6 @@ Uživatelské jméno a heslo nejsou nikdy ukládány. Jsou použity pouze během Vybrat soubor pro nahrání Moje videa Název - Kategorie Licence Kategorie Jazyk @@ -738,14 +637,10 @@ Uživatelské jméno a heslo nejsou nikdy ukládány. Jsou použity pouze během Klepněte zde pro editaci video dat. Odstranit video Jste si jistý/á, že chcete smazat toto video? - Žádné videa ještě nebyli nahrávaly! Zobrazit NSFW (18+) videa - Výchozí %s kanál Žádné videa k zobrazení! - Přidat média k oblíbeným Zanechat komentář Sdílet - Moje obrázky Zvolte plánovací režim Ze zařízení Ze serveru @@ -753,12 +648,8 @@ Uživatelské jméno a heslo nejsou nikdy ukládány. Jsou použity pouze během Tooty (zařízení) Upravit Zobrazit nové tooty nad tlačítkem „Načíst více“ - Potvrzení Časové osi - Oznamovací služba Rozhraní - Skrytý obsah - Psaní Kontakty %1$s okomentoval/a vaše video %2$s]]> %1$s sleduje váš kanál %2$s]]> @@ -773,7 +664,6 @@ Uživatelské jméno a heslo nejsou nikdy ukládány. Jsou použity pouze během Importovat data Vyberte soubor, který chcete importovat Při výběru zálohového souboru nastala chyba! - Prosím neukončujte aplikaci počas zpracování. Nemůže to trvat dlouho. Přidat veřejný komentář Odeslat komentář Nelze se připojit k internetu. Vaše zpráva byla uložena do konceptů. @@ -814,18 +704,14 @@ Uživatelské jméno a heslo nejsou nikdy ukládány. Jsou použity pouze během skončit po %s Obnovit anketu Hlasovat - K přímé zprávě nelze připojit anketu! Anketa, ve které jste hlasoval/a, skončila Vaše anketa skončila Přizpůsobit Kategorie - Novinky Časový slot Pokročilé Zobrazit \"new\" na nových tootech - Zobrazit časovou osu PeerTube PeerTube - Skrýt kartu Přesunout časovou osu Skrýt časovou osu Změnit pořadí časových os @@ -835,10 +721,8 @@ Uživatelské jméno a heslo nejsou nikdy ukládány. Jsou použity pouze během Vrátit zpět Musíte si nechat dvě viditelné karty! Změnit pořadí časových os - Použijte položky seznamu k odstranění tohoto seznamu! Hlavní časové linie mohou být pouze skryty! BBCode - Přidat časovou osu Vždy označovat média jako citlivá GNU instance Cached status @@ -853,14 +737,11 @@ Uživatelské jméno a heslo nejsou nikdy ukládány. Jsou použity pouze během Historie Playlisty Zobrazované jméno - Soukromí - Vytvořit You don\'t have any playlists. Tap on the \"+\" icon to add a new playlist Musíte zadat zobrazované jméno! The channel is required when the playlist is public. Vytvořit playlist Na tomto playlistu není zatím nic. - Upravit média provést znovu Galerie Emoji @@ -868,7 +749,6 @@ Uživatelské jméno a heslo nejsou nikdy ukládány. Jsou použity pouze během Guma Text Filtr - Upravit Štětec Jste si jisti, že chcete skončit bez uložení obrázku? Zahodit @@ -876,7 +756,6 @@ Uživatelské jméno a heslo nejsou nikdy ukládány. Jsou použity pouze během Image Saved Successfully! Nepodařilo se uložit obrázek Průhlednost - Oříznout Povolit editor fotografií Přidat položku ankety Odstranit poslední možnost z ankety @@ -888,10 +767,8 @@ Uživatelské jméno a heslo nejsou nikdy ukládány. Jsou použity pouze během Časované ztlumení Mention the account Obnovit cache - See who boosted and added to favorites Zmínit status Novinky - Display news from Fedilab\'s account Základní Regionální Umění @@ -935,7 +812,6 @@ Uživatelské jméno a heslo nejsou nikdy ukládány. Jsou použity pouze během Reconnect the account The application failed to access the admin features. You might need to reconnect the account for having the correct scope. Unresolved - Resolved Remote Active Pending @@ -951,7 +827,6 @@ Uživatelské jméno a heslo nejsou nikdy ukládány. Jsou použity pouze během Disable Silence Notify the user per e-mail - Perform action Custom warning User Moderator @@ -983,7 +858,6 @@ Uživatelské jméno a heslo nejsou nikdy ukládány. Jsou použity pouze během Empty content! Display Fedilab features button The application needs to access audio recording - An error occurred when recording the voice message! Voice message Enable quick reply The account you are replying might not see your message! @@ -991,9 +865,7 @@ Uživatelské jméno a heslo nejsou nikdy ukládány. Jsou použity pouze během If disabled, sensitive media will be hidden with a button Store media in full size with a long press on previews Add an ellipse button at the top right for listing all tags/instances/lists - Display an item in the main menu for a quick access to the timeline targeting #Fedilab tag Keep an open connection to the streaming API for live notifications. - When the app is in background, it will keep a connection to the streaming API. Disable it if you care about your battery. During the time slot, the app will send notifications. You can reverse (ie: silent) this time slot with the right spinner. Display a Fedilab button below profile picture. It is a shortcut for accessing in-app features. Allow to reply directly in timelines below statuses @@ -1005,9 +877,6 @@ Uživatelské jméno a heslo nejsou nikdy ukládány. Jsou použity pouze během These tags will allow to filter statuses from profiles. You will have to use the context menu for seeing them. Automatically insert a line break after the mention to capitalize the first letter Allow content creators to share statuses to their RSS feeds - Timelines - Interface - Battery Compose Maximum retry times when uploading media Create a new Folder here @@ -1018,9 +887,7 @@ Uživatelské jméno a heslo nejsou nikdy ukládány. Jsou použity pouze během Default Directory Folder Create folder - Use your favourite browser inside the application. By disabling, links will be opened externally Display a toast message after an action has been completed (boost, fav, etc.)? - Export muted instances Muted instances have been exported! Add an instance Export instances @@ -1118,7 +985,6 @@ Uživatelské jméno a heslo nejsou nikdy ukládány. Jsou použity pouze během Enter your custom host or leave blank for using nitter.net Hide Fedilab notification bar For hiding the remaining notification in the status bar, tap on the eye icon button then uncheck: \"Display in status bar\" - Enable delayed notifications Notifications will be delayed every 30 seconds. That will allow to drain less battery. Live notifications delayed No live notifications @@ -1144,7 +1010,6 @@ Uživatelské jméno a heslo nejsou nikdy ukládány. Jsou použity pouze během Title for the video Join Peertube I am at least 16 years old and agree to the %1$s of this instance - Colors Links Change the color of links (URLs, mentions, tags, etc.) in messages Reblogs header @@ -1156,15 +1021,12 @@ Uživatelské jméno a heslo nejsou nikdy ukládány. Jsou použity pouze během Reset Icons Color of bottom icons in timelines - Background - Change the background color for timelines Pin this tag Logo of the instance Edit profile Make an action Translation Image preview - Change the theme Text color Change the text color in pots Apply changes diff --git a/app/src/main/res/values-cy/strings.xml b/app/src/main/res/values-cy/strings.xml index a5a56dc8b..be4959dcf 100644 --- a/app/src/main/res/values-cy/strings.xml +++ b/app/src/main/res/values-cy/strings.xml @@ -1,5 +1,4 @@ - - + Agor y ddewislen Cau y ddewislen @@ -16,8 +15,6 @@ Canslo Lawrlwytho Lawrlwytho %1$s - Lawrlwytho wedi\'i gwblhau - Cadw %1$s Arbedwyd y deunydd Ffeil: %1$s Cyfrinair @@ -25,10 +22,8 @@ Cyfrifon Tŵtiau Tagiau - Tocyn Cadw Adfer - Dilysu dau gam? Dim canlyniadau! Achos Achos: mastodon.social @@ -39,10 +34,7 @@ Newid Dewis llun… Glân - Meicroffon Camera - Dwedwch rhywbeth os gwelwch yn dda - Sori! Nid yw\'ch dyfais yn cefnogi mewnbwn llais! Dileu i gyd Cyfieithu\'r tŵt hwn. Amserlen @@ -59,7 +51,6 @@ Ymatebion Enwdefnyddiwr Drafftiau - Mae data newydd ar gael! A ydych eisiau eu harddangos? Ffefrynnau Dilynwyr newydd Crybwylliadau @@ -78,18 +69,12 @@ Cyfathrebu Defnyddwyr mud Defnyddwyr wedi’u blocio - Dilyn o bell Hysbysiadau Dilyn ceisiadau - Optimeiddiad Gosodiadau - Proffil - Beth ydych eisiau ei wneud? Dileu y cyfrif Dileu y cyfrif %1$s o\'r rhaglen? Anfon e-bost - Dewiswch ffeil os gwelwch yn dda - Ni ganfyddwyd archwiliwr ffeil! Cliciwch ar y llwybr i\'w newid Methwyd! Tŵt Newydd @@ -99,10 +84,6 @@ Hysbysiadau byw Dim tŵt i\'w arddangos - Ychwanegwyd y tŵt i\'r ffefrynnau - Gwaredwyd y tŵt o\'r ffefrynnau! - Hybwyd y tŵt! - Nid yw\'r tŵt wedi\'i hybu mwyach! Hybwyd gan %1$s Ychwanegu\'r tŵt hwn i\'ch ffefrynnau? Cael gwared o\'r tŵt hwn o\'ch ffefrynnau? @@ -134,14 +115,6 @@ Cael gwared ar y tŵt hwn? Dileu & ail-ddrafftio\'r tŵt hwn? - - %d o ymateb - %d ymateb - %d replies - %d replies - %d o ymatebion - %d o ymatebion - Llyfrnodau Ychwanegu at llyfrnodau Cael gwared o\'r llyfrnod @@ -163,7 +136,6 @@ Ymateb i dŵt Ysgrifennu cwît Ymateb i gwît - Yr ydych wedi cyrraedd yr uchafswm o 500 nod! Dewis cyfryngau Roedd gwall! Dileu\'r cyfryngau hyn? @@ -197,7 +169,6 @@ Cyfieithiadau\'r tŵtiau: Chwilio achosion: Dylunydd eicon: - Dylunydd baner: Sgwrs @@ -227,7 +198,6 @@ wedi hybu\'ch tŵt wedi nodi\'ch tŵt yn ffefryn wedi\'ch dilyn chi - Tŵt newydd o %1$s ac hysbysiad arall ac %d hysbysiad arall @@ -236,14 +206,6 @@ and %d other notifications and %d other notifications - - a tŵt arall i\'w ddarganfod - a %d tŵt arall i\'w ddarganfod - and %d other toots to discover - and %d other toots to discover - and %d other toots to discover - and %d other toots to discover - %d wedi hoffi %d like @@ -283,7 +245,6 @@ Ymddengys nad yw parth yr achos yn un dilys! Aeth rhywbeth o\'i le tra\'n symud rhwng cyfrifoedd! Aeth rhywbeth o\'i le tra\'n chwilio! - Methwyd i fewngofnodi! Arbedwyd data y proffil! Ni ellir gwneud dim Arbedwyd y cyfryngau! @@ -292,12 +253,8 @@ Arbedwyd y drafft! Ydych chi\'n siwr fyd yr achos hwn yn caniatau y nifer hyn o nodau? Fel arfer, tua 500 o nodau yw\'r nifer a ganiateir. Gwelededd y tŵtiau wedi ei newid ar gyfer y cyfrif %1$s - Ni all enw\'r achos na enw\'r sgrîn fod yn wag! - Optimeiddio llwytho Nifer y tŵtiau i bob llwythiad - Nifer o gyfrifoedd i bob llwythiad - Nifer y hysbysiadau i bob llwythiad Bob tro WIFI Gofyn @@ -306,13 +263,9 @@ Dangos mwy… Dangos llai… Cynnwys sensitif - Dangos negeseuon cynt yn yr ymatebion - Dangos ffrwd leol - Dangos ffrwd y ffederasiwn Diffodd avatars GIF Llwybr: Arbed drafft yn ddiofyn - Arddangos cownteri Ychwanegu URL o\'r cyfryngau yn y tŵtiau Hysbysu pryd mae rhywun yn eich dilyn chi Hysbysu pan mae rhywun yn hybu\'ch statws @@ -324,7 +277,6 @@ Ond hysbysu pan yn gysylltiedig i WIFI Hsybysu? Hysbysiadau distaw - Modd hwyrnos Terfyn amser golwg deunydd anaddas i\'r gweithle (eiliadau, ystyr 0 yw ei fod wedi ei ddiffodd) Golygu proffil Rhannu dethol @@ -348,12 +300,6 @@ Caniatau Javascript Ehangu cw yn awtomataidd Caniatau cwcis trydydd parti - Gosodiad ar gyfer ffrydiau: - - Tabiau - Dewislen - Tabiau a dewislen - Yandex DeepL @@ -365,15 +311,6 @@ Golau Du - - Na - 512 Kb - 1 Mb - 2 Mb - 4 Mb - 6 Mb - 8 Mb - Gosod lliw LED: Glas @@ -384,13 +321,9 @@ Melyn Gwyn - Hysbysu tŵtiau newydd ar y ffrwd gartref Dilyn - Dad-ddilyn - Blocio Dadflocio Mudo - Dim gweithred Dad-dawelu Cais wedi ei anfon Yn eich dilyn chi @@ -403,8 +336,6 @@ Cadarnhewch yr hysbysiadau push yr ydych am eu derbyn. Mae modd galluogi neu diffodd yr hysbysiadau hyn wedyn yn gosodiadau (Tab hysbysiadau). - Ar gyfer tŵtiau heb eu darllen yn y ffrwd? - Ar gyfer hysbysiadau heb eu darllen? Clirio\'r storfa Mae %1$s o ddata yn y storfa.\n\nHoffech chi ei ddileu? @@ -414,7 +345,6 @@ Teitl Teitl… Disgrifiad - Disgrifiad… Allweddeiriau Allweddeiriau… @@ -431,7 +361,6 @@ Dangos yr hyn sydd wedi ei binio Dim byd cyfatebol wedi ei ganfod! Tŵtiau wrth gefn am %1$s - Backup notifications for %1$s Mae %1$s o dŵtiau newydd wedi eu mewnforio %1$s new notifications have been imported @@ -486,18 +415,14 @@ A ydych chi\'n sicr eich bod eisiau dileu y rhestr hon am byth? Does dim byd ar y rhestr hwn eto. Wrthi aelodau\'r rhestr gyhoeddi diwedderiadau, byddent yn ymdangos yma. Ychwanegu i\'r rhestr - Dileu o\'r rhestr Ychwanegu rhestr Dileu rhestr Golygu rhestr Teitl y rhestr newydd - Chwilo ymysg pobl yr ydych yn eu nabod - Eich rhestrau The account was added to the list! You don\'t have any lists yet! Mae %1$s wedi symud i %2$s - Dangos nifer hybiadau/ffefrynnau Dilysu ddim yn gweithio? Dyma ambell wiriad all fod yn help:\n\n - Gwiriwch nad oes camgymeriad sillafu yn enw\'r achos\n\n @@ -514,25 +439,19 @@ Mae %1$s o dŵtiau o\'r %2$s wedi eu hallforio. Aeth rhywbeth o\'i le tra\'n allforio data i %1$s Aeth rhywbeth o le tra\'n allforio data! - Data wedi ei fewnforio! Aeth rhywbeth o le tra\'n mewnforio data! Procsi - Math Galluogi procsi? Gweinydd Porth Mewngofnodi Cyfrinair - Thema: - Modd cryno Ychwanegu manylion tŵt wrth rannu Cefnogi\'r ap ar Liberapay Mae yna wall yn y mynegiad rheolaidd! - Dim cyfrif eto? Ni ddarganfyddwyd unrhyw ffrydiau ar yr achos yma! Dileu yr achos yma? - Yr ydych am ddileu %s o\'r achosion yr ydych yn eu dilyn. Cyfieithu yn Dilyn achos Yr ydych yn dilyn yr achos yma\'n barod! @@ -541,10 +460,8 @@ Gwybodaeth Cuddio hybiadau o %s Dangos ar y proffil - Cuddio popeth o %s Dangos hybiadau o %s Atal rhag ymddangos ar y proffil - Dangos popeth o %s Mae\'r cyfrif hwn nawr yn ymddangos ar y proffil Nid yw\'r cyfrif hwn yn ymddangos ar y proffil mwyach Mae hybiadau nawr yn cael eu dangos! @@ -565,7 +482,6 @@ Hidlo cyd-destunnau Un cyd-destun neu fwy lle dylai\'r hidlydd fod yn berthnasol Yn dod i ben ar ôl - Ychwanegu hidlydd newydd Dileu hidlydd? Diweddaru hidlydd Creu hidlydd @@ -580,13 +496,11 @@ Ychwanegwyd y cyfrifau i\'r rhestr Ychwanegu cyfrifau i\'r rhestr Nid ydych wedi creu rhestr eto. Cliciwch ar y botwm \"+\" i ychwanegu un newydd. - Nid ydych yn dilyn unrhyw achosion anghysbell. Cliciwch ar y botwm \"+\" i ychwanegu un newydd. Pwy i ddilyn API Trunk Ni ellir dilyn y cyfrif(au) Nôl cyfrif anghysbell Ehangu cyfryngau cuddiedig yn awtomatig - Dangos botwm dilyn achosion New follow Hybiad newydd Ffefryn newydd @@ -611,7 +525,6 @@ Nôl statws anghysbell Gwneud sylw Achos Peertube - Dangos ffrwd negeseuon preifat Byddwch y cyntaf i adael sylw ar y fideo hwn gyda\'r botwm ar y dde uchaf! Wedi ei wylio %s gwaith Hyd: %s @@ -623,10 +536,6 @@ Mae\'r fideo wedi ei ddileu o\'r llyfrnodau! Nid oes fideos Peertube yn eich ffefrynnau! Sianel - Dim sianeli Peertube - Dim achosion Peertube - Dim achosion Mastodon - Dim rhestrau Fideos Sianeli Defnyddio Emoji One @@ -634,12 +543,7 @@ Dangos rhaglun ym mhob tŵt Dylunydd UX/UI newydd Dangos rhaglun fideo - Cefnogaeth Gitlab - Adroddiad Byg - Nid oes unrhyw gleientiaid wedi\'u gosod. - Anfon adroddiad byg Mae\'r cyfrif id wedi\'i gopïo yn y clipfwrdd! - Optimeiddio\'r batri Newid iaith Iaith diofyn Cwtogi tŵtiau hir @@ -651,7 +555,6 @@ Mae\'r tag hwn wedi\'i storio! Mae\'r tag hwn wedi\'i newid! Mae\'r tag wedi ei ddileu! - Dangos ffrwd gelf Trefnu bŵst Mae\'r bŵst wedi\'i drefnu! Dim trefniant bŵst i\'w arddangos! @@ -690,12 +593,7 @@ Mae modd i chi ddechrau ysgrifennu llythrennau cychwynol a bydd enwau yn cael eu hawgrymu.\n\n ⚠ Bydd y botwm Mewngofnodi ond yn gweithio os yw enw\'r achos yn ddilys a bod yr achos yn weithredol! - Yn y maes hwn, ysgrifennwch yr ebost sydd wedi ei gysylltu a\'ch cyfrif Mastodon. - - Y cam olaf yw i fewnosod eich cyfrinair a clicio ar Mengofnodi. - Mwy o wybodaeth - Os ydych yn defnyddio 2FA (Dilysu dau gam), mae angen i chi ddefnyddio\'r ddolen yma. \nMae modd i chi ddefnyddio os nad ydych eisiau mewnosod eich cymwysterau yma. Ieithoedd Cyfryngau yn unig @@ -707,16 +605,13 @@ Bot Achos Pixelfed Achos Mastodon - Dim achosion Pixelfed Unrhyw un o rhain Rhain i gyd Dim un o rhain Unrhyw un o\'r geiriau hyn (a gofod rhyngddynt) Yr holl eiriau hyn (a gofod rhyngddynt) - Dim un o\'r geiriau hyn (a gofod rhyngddynt) Add some words to filter (space-separated) Newid enw\'r golofn - Dim achosion Misskey Achos Misskey Nid oes ap sy\'n cefnogi\'r ddolen yma wedi\'i osod ar eich dyfais. Tanysgrifiadau @@ -733,7 +628,6 @@ Dewiswch y ddogfen er mwyn uwchlwytho Fy fideo Teitl - Categorïau Trwydded Categori Iaith @@ -748,14 +642,10 @@ Cliciwch yma i olygu data\'r fideo. Dileu fideo Ydych chi\'n sicr eich bod am ddileu y fideo hwn? - Dim fideo wedi\'i uwchlwytho eto! Dangos fideo anaddas i\'r gweithle - Default %s channel Dim fideo i\'w arddangos! - Ychwanegu cyfryngau i ffefrynnau Gadael sylw Rhannu - Fy lluniau Dewiswch fodd amserlennu O\'r ddyfais O\'r gweinydd @@ -763,12 +653,8 @@ Tŵtiau (Dyfais) Newid Dangos tŵtiau newydd uwchben y botwm \"Nôl mwy\" - Wedi\'u cadarnhau Ffrydiau - Gwasanaeth hysbysu Rhyngwyneb - Cynnwys cuddiedig - Cyfansoddi Cysylltiadau %1$s wneud sylw ar eich fideo %2$s]]> %1$s yn dilyn eich sianel %2$s]]> @@ -783,7 +669,6 @@ Mewnforio Data Dewiswch ddogfen i\'w fewnforio Bu gwall tra\'n dewis y ddogfen wrth gefn! - Peidiwch a lladd yr ap wrth brosesu os gwelwch yn dda. Ni all hynny fod yn hir iawn. Ychwanegu sylw cyhoeddus Anfon sylw Nid oes cyswllt a\'r rhyngrwyd. Mae eich neges wedi ei storio yn y drafftiau. @@ -824,18 +709,14 @@ end at %s Refresh poll Vote - A poll cannot be attached to a direct message! A poll you have voted in has ended A poll you tooted has ended Customize Categories - News Time slot Advanced Display \'new\' badge on unread toots - Display Peertube timeline Peertube - Hide the tab Move timeline Hide timeline Reorder timelines @@ -845,10 +726,8 @@ Undo You need to keep two visible tabs! Reorder timelines - Use the lists entry for deleting this list! Main timelines can only be hidden! BBCode - Add a timeline Always mark media as sensitive GNU instance Cached status @@ -863,14 +742,11 @@ History Playlists Display name - Privacy - Create You don\'t have any playlists. Tap on the \"+\" icon to add a new playlist You must provide a display name! The channel is required when the playlist is public. Create a playlist There is nothing in this playlist yet. - Edit media redo Gallery Emoji @@ -878,7 +754,6 @@ Eraser Text Filter - Adjust Brush Are you sure you want to exit without saving the image? Discard @@ -886,7 +761,6 @@ Image Saved Successfully! Failed to save Image Opacity - Crop Enable photo editor Add a poll item Remove last poll item @@ -898,10 +772,8 @@ Timed mute Mention the account Refresh cache - See who boosted and added to favorites Mention the status News - Display news from Fedilab\'s account General Regional Art @@ -945,7 +817,6 @@ Reconnect the account The application failed to access the admin features. You might need to reconnect the account for having the correct scope. Unresolved - Resolved Remote Active Pending @@ -961,7 +832,6 @@ Disable Silence Notify the user per e-mail - Perform action Custom warning User Moderator @@ -993,7 +863,6 @@ Empty content! Display Fedilab features button The application needs to access audio recording - An error occurred when recording the voice message! Voice message Enable quick reply The account you are replying might not see your message! @@ -1001,9 +870,7 @@ If disabled, sensitive media will be hidden with a button Store media in full size with a long press on previews Add an ellipse button at the top right for listing all tags/instances/lists - Display an item in the main menu for a quick access to the timeline targeting #Fedilab tag Keep an open connection to the streaming API for live notifications. - When the app is in background, it will keep a connection to the streaming API. Disable it if you care about your battery. During the time slot, the app will send notifications. You can reverse (ie: silent) this time slot with the right spinner. Display a Fedilab button below profile picture. It is a shortcut for accessing in-app features. Allow to reply directly in timelines below statuses @@ -1015,9 +882,6 @@ These tags will allow to filter statuses from profiles. You will have to use the context menu for seeing them. Automatically insert a line break after the mention to capitalize the first letter Allow content creators to share statuses to their RSS feeds - Timelines - Interface - Battery Compose Maximum retry times when uploading media Create a new Folder here @@ -1028,9 +892,7 @@ Default Directory Folder Create folder - Use your favourite browser inside the application. By disabling, links will be opened externally Display a toast message after an action has been completed (boost, fav, etc.)? - Export muted instances Muted instances have been exported! Add an instance Export instances @@ -1130,7 +992,6 @@ Enter your custom host or leave blank for using nitter.net Hide Fedilab notification bar For hiding the remaining notification in the status bar, tap on the eye icon button then uncheck: \"Display in status bar\" - Enable delayed notifications Notifications will be delayed every 30 seconds. That will allow to drain less battery. Live notifications delayed No live notifications @@ -1156,7 +1017,6 @@ Title for the video Join Peertube I am at least 16 years old and agree to the %1$s of this instance - Colors Links Change the color of links (URLs, mentions, tags, etc.) in messages Reblogs header @@ -1168,15 +1028,12 @@ Reset Icons Color of bottom icons in timelines - Background - Change the background color for timelines Pin this tag Logo of the instance Edit profile Make an action Translation Image preview - Change the theme Text color Change the text color in pots Apply changes diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml index b98227629..aad8b503b 100644 --- a/app/src/main/res/values-da/strings.xml +++ b/app/src/main/res/values-da/strings.xml @@ -1,5 +1,4 @@ - - + Åbn menuen Luk menuen @@ -16,8 +15,6 @@ Annullér Download Download %1$s - Download fuldført - Gem %1$s Medie gemt Fil: %1$s Adgangskode @@ -25,10 +22,8 @@ Konti Toots Tags - Token Gem Gendan - Tofaktorgodkendelse? Ingen resultater! Instans Instans: mastodon.social @@ -39,10 +34,7 @@ Skift Vælg et billede… Ryd - Mikrofon Kamera - Sig noget - Beklager! Din enhed understøtter ikke stemmeinput! Slet alle Oversæt dette toot. Planlæg @@ -59,7 +51,6 @@ Svar Brugernavn Kladder - Nye data tilgængelige! Ønsker du at vise dem? Favoritter Nye følgere Omtaler @@ -78,18 +69,12 @@ Kommunikation Tavse brugere Blokerede brugere - Fjernfølgning Notifikationer Følgeanmodninger - Optimering Indstillinger - Profil - Hvad ønsker du at foretage dig? Slet en konto Slet kontoen %1$s fra app\'en? Send en e-mail - Vælg en fil - Ingen filhåndtering fundet! Tryk på stien for at ændre den Mislykkedes! Planlagte toots @@ -99,10 +84,6 @@ Live-notifikationer Ingen toot at vise - Toot\'et blev føjet til favoritter - Toot\'et blev fjernet fra favoritter! - Toot\'et blev boostet! - Toot\'et er ikke længere boostet! Boostet af %1$s Føj dette toot til dine favoritter? Fjern dette toot fra dine favoritter? @@ -134,10 +115,6 @@ Fjern dette toot? Slet og omformulér dette toot? - - %d svar - %d svar - Bogmærker Tilføj bogmærke Fjern bogmærke @@ -159,7 +136,6 @@ Besvar et toot Skriv et queet Besvar et queet - Du har nået de tilladte 500 tegn! Vælg et medie En fejl opstod under valg af medie! Slette dette medie? @@ -193,7 +169,6 @@ Oversættelse af toots: Søg instanser: Ikondesigner: - Bannerdesigner: Samtale @@ -223,15 +198,10 @@ boostede din status favoriserede din status fulgte dig - Nyt toot fra %1$s og en anden notifikation og %d andre notifikationer - - og et andet toot at opdage - og %d andre toots at opdage - %d Like %d Likes @@ -267,7 +237,6 @@ Domænet for instansen ser ud til at være ugyldigt! En fejl opstod under kontoskift! En fejl opstod under søgning! - Kan ikke logge ind! Profildata er gemt! Ingen handling kan udføres Mediet er gemt! @@ -276,12 +245,8 @@ Kladde gemt! Sikker på, at denne instans tillader dette antal tegn? Normalt er denne værdi tæt på 500 tegn. Toots-synlighed er ændret for kontoen %1$s - Instans- og kaldenavn er obligatoriske! - Optimering af indlæsning Antal toots pr. indlæsning - Antal konti pr. indlæsning - Antal notifikationer pr. indlæsning Altid Wi-Fi Spørg @@ -290,13 +255,9 @@ Vis mere… Vis mindre… Følsomt indhold - Vis foregående besked i besvarelse - Vis lokal tidslinje - Vis fælles tidslinje Deaktivér GIF-avatarer Sti: Gem kladder automatisk - Vis tællere Tilføj URL på medier i toots Notificér, når en person følger dig Notificér, når nogen booster din status @@ -308,7 +269,6 @@ Notificér kun via Wi-Fi Notificér? Tavse Notifikationer - Nattilstand NSFW-visningstimeout (sekunder, 0 betyder slået fra) Redigér profil Tilpasset deling @@ -332,12 +292,6 @@ Aktivér JavaScript Udvid automatisk cw Tillad tredjeparts-cookies - Tidslinjelayouts: - - Faner - Menu - Faner og menu - Yandex DeepL @@ -349,15 +303,6 @@ Lys Sort - - Nej - 512 Kb - 1 Mb - 2 Mb - 4 Mb - 6 Mb - 8 Mb - Sæt LED-farve: Blå @@ -368,13 +313,9 @@ Gul Hvid - Notificér om nye toots på Hjem-tidslinjen Følg - Stop følgning - Blokér Afblokér Gør tavs - Ingen handling Fjern \"Gør tavs\" Forespørgsel sendt Følger dig @@ -387,8 +328,6 @@ Bekræft de push-notifikationer, du ønsker at modtage. Du kan senere slå disse notifikationer til/fra i indstillinger (fanen Notifikationer). - Til ulæste toots i Hjem-tidslinjen? - Til ulæste notifikationer? Ryd Cache Cachen indeholder %1$s data.\n\nVil du slette dataene? @@ -398,7 +337,6 @@ Titel Titel… Beskrivelse - Beskrivelse… Søgeord Søgeord… @@ -415,7 +353,6 @@ Vis fastgjorte Ingen matchende resultater! Sikkerhedskopiér toots fra %1$s - Sikkerhedskopiér notifikationer for %1$s %1$s nye toots er importeret %1$s nye notifikationer er blevet importeret @@ -471,18 +408,14 @@ Sikker på, at du vil slette denne liste permanent? Der er intet i denne liste endnu. Når listemedlemmer poster nye statusser, vil de fremgå her. Føj til liste - Fjern fra liste Tilføj liste Slet liste Redigér liste Ny listetitel - Søg blandt personer, du følger - Dine lister Kontoen blev føjet til listen! Du har ingen lister endnu! %1$s er flyttet til %2$s - Vis boosts-/favoritantal Kan ikke godkendes? Her er nogle tjek, som måske hjælper:\n\n - Tjek, at der ikke er stavefejl i instansnavnet\n\n @@ -499,25 +432,19 @@ %1$s toots ud af %2$s er eksporteret. Noget gik galt under dataeksporten for %1$s Noget gik galt under dataeksporten! - Data er importeret! Noget gik galt under dataimporten! Proxy - Type Aktivér proxy? Vært Port Brugernavn Adgangskode - Tema: - Kompakt-tilstand Tilføj toot-detaljer ved deling Støt app\'en på Liberapay Der er en fejl i det regulære udtryk! - Ingen konto endnu? Ingen tidslinjer fundet for denne instans! Slet denne instans? - Du er ved at slette %s fra dine fulgte instanser. Oversæt til Følg instans Du følger allerede denne instans! @@ -526,10 +453,8 @@ Information Skjul boosts fra %s Vis på profil - Skjul alt fra %s Vis boosts fra %s Vis ikke på profil - Vis alt fra %s Kontoen fremhæves nu på profilen Kontoen fremhæves ikke længere på profilen Boosts vises nu! @@ -550,7 +475,6 @@ Filterkontekster Én eller flere kontekster, hvortil filteret skal benyttes Udløber efter - Tilføj nyt filter Slet filter? Opdatér filter Opret filter @@ -565,13 +489,11 @@ Konti blev føjet til listen Føjer konti til listen Du har endnu ikke oprettet en liste. Tryk på \"+\"-knappen for at oprette en ny. - Du følger ingen fjerninstans. Tryk på \"+\"-knappen for at tilføje en ny. Hvem man følger Trunk API Konto/konti kan ikke følges Henter fjernkonto Udvid automatisk skjulte medier - Vis knappen \"Følg instanser\" Ny følger Nyt boost Ny favorit @@ -596,7 +518,6 @@ Henter fjernstatus Kommentar Peertube instans - Vis \'private beskeder\'-tidslinje Vær den første til at skrive en kommentar til denne video via den øverste, højre knap! %s visninger Varighed: %s @@ -608,10 +529,6 @@ Videoen er fjernet fra bogmærker! Der er ingen Peertube videoer i dine favoritter! Kanal - Ingen Peertube kanaler - Ingen Peertube instanser - Ingen Mastodon instanser - Ingen lister Videoer Kanaler Brug Emoji One @@ -619,12 +536,7 @@ Forhåndsvis alle toots Ny UI/UX-designer Vis videoforhåndsvisninger - Gitlab Support - Fejlrapport - Ingen e-mail klienter installeret. - Indsend fejlrapport Konto-ID\'en kopieret til udklipsholder! - Batterioptimering Skift sprog Standardsprog Afkort lange toots @@ -636,7 +548,6 @@ Tag\'et er gemt! Tag\'et er ændret! Tag\'et er slettet! - Vis kunsttidslinje Planlæg boost Boostet er planlagt! Ingen planlagte boosts at vise! @@ -675,12 +586,7 @@ Du kan begynde at skrive, hvorefter navneforslag vises.\n\n ⚠ Forbind-knappen vil kun fungere, hvis instansnavnet er korrekt og instansen er online! - Angiv din Mastodon-konto tilknyttede e-mail i dette felt. - - Sidste trin er at angive dit adgangskode og trykke på Log ind. - Mere information - Anvender du 2FA (Tofaktorgodkendelse), skal du benytte dette link.\nDu kan også benytte det, hvis du ikke ønsker at angive dine legitimationsoplysninger her. Sprog Kun medier @@ -692,16 +598,13 @@ Bot Pixelfed instans Mastodon instans - Ingen Pixelfed instanser Enhver af disse Alle disse Ingen af disse Ethvert af disse ord (separeret med mellemrum) Alle disse ord (separeret med mellemrum) - Ingen af disse ord (separeret med mellemrum) Tilføj ord til filter (separeret med mellemrum) Skift kolonnenavn - Ingen Misskey instanser Misskey instans Ingen app på din enhed understøtter dette link. Abonnementer @@ -718,7 +621,6 @@ Vælg fil til upload Mine videoer Titel - Kategorier Licens Kategori Sprog @@ -733,14 +635,10 @@ Tryk hér for at redigere videodata. Slet video Sikker på, at du vil slette denne video? - Ingen videoer uploadet endnu! Vis NSFW-videoer - %s\'s standard kanal Ingen videoer at vise! - Føj medie til favoritter Skriv en kommentar Del - Mine billeder Vælg en planlægningstilstand Fra enhed Fra server @@ -748,12 +646,8 @@ Toots (Enhed) Redigér Vis nye toots over \"Hent flere\"-knappen - Bekræftelser Tidslinjer - Notifikationstjeneste Brugerflade - Skjult indhold - Skrivning Kontakter %1$s kommenterede din video %2$s]]> %1$s følger din kanal %2$s]]> @@ -768,7 +662,6 @@ Importér Data Vælg filen, der skal importeres Der opstod en fejl under valg af sikkerhedskopifil! - Stands ikke app\'en mens processen kører, hvilket ikke bør være længe. Tilføj en offentlig kommentar Send kommentar Der er ingen internetforbindelse. Din besked er blevet gemt i kladder. @@ -809,18 +702,14 @@ slutter %s Opfrisk afstemning Stem - En afstemning kan ikke vedhæftes en direkte besked! En afstemning, hvori du har stemt, er slut En afstemning, du tootede, er slut Tilpas Kategorier - Nyheder Tidsinterval Avanceret Vis \'Ny\'-mærkat på ulæste toots - Vis Peertube-tidslinje Peertube - Skjul fanen Flyt tidslinje Skjul tidslinje Omarrangér tidslinjer @@ -830,10 +719,8 @@ Fortryd Du skal beholde to synlige faner! Omarrangér tidslinjer - Brug \"Lister\" for at slette denne liste! Hovedtidslinjer kan kun skjules! BBkode - Tilføj en tidslinje Markér altid medier som følsomme GNU instans Cachelagret status @@ -848,14 +735,11 @@ Historik Afspilningslister Visningsnavn - Privatliv - Opret Du har ingen afspilningslister. Tryk på \"+\"-ikonet for at tilføje en ny Du skal angive et visningsnavn! Kanalen er obligatorisk, når afspilningslisten er offentlig. Opret afspilningsliste Afspilningslisten er tom. - Redigér medie gendan Galleri Emoji @@ -863,7 +747,6 @@ Viskelæder Tekst Filter - Justér Pensel Sikker på, at du vil afslutte uden at gemme billedet? Kassér @@ -871,7 +754,6 @@ Billede gemt! Mislykkedes at gemme billede Opacitet - Beskær Aktivér fotoredigeringsværktøj Tilføj et afstemningsemne Fjern seneste afstemningsemne @@ -883,10 +765,8 @@ Planlagt tavshed Nævn kontoen Opfrisk cache - Se, hvem der har boostet og føjet til favoritter Nævn statussen Nyheder - Vis nyheder fra Fedilab\'s konto Generelt Regionalt Kunst @@ -930,7 +810,6 @@ Genforbind kontoen App\'en kunne ikke tilgå admin-funktioner. Du skal muligvis genforbinde kontoen, for at kunne tilgå det relevante område. Uløst - Løst Fjernsystem Aktive Afventer @@ -946,7 +825,6 @@ Deaktivér Gør tavs Underrette brugeren pr. e-mail - Udfør handling Tilpasset advarsel Bruger Moderator @@ -978,7 +856,6 @@ Intet indhold! Vis Fedilab-funktionsknap App\'en behøver adgang til lydoptagelse - En fejl opstod under optagelse af talebeskeden! Talebesked Aktivér hurtig visning Kontoen, du besvarer, kan måske ikke se din besked! @@ -986,9 +863,7 @@ Hvis deaktiveret, skjules følsomme medier altid med en knap Lagr medier i fuld størrelse med et langt tryk på forhåndsvisninger Tilføj en ellipseknap øverst til højre for at få vist alle tags/forekomster/lister - Vis et punkt i hovedmenuen for en hurtig adgang til tidslinjmålretnings #Fedilab-tagget Bevar en åben forbindelse til streaming-API\'en for live-notifikationer. - Når app\'en er i baggrunden, vil den bevare en forbindelse til streaming-API\'en. Deaktivé den, hvis du vil spare strøm. I løbet af tidperioden vil app\'en vil sende notifikationer. Du kan ændre (dvs. gøre tavs) denne tidsperiode med den højre kontrol. Vis en Fedilab-knap nedenfor profilbilledet. Det er en genvej for adgang til in-app funktioner. Tillad direkte besvarelse fra tidslinjer under statusser @@ -1000,9 +875,6 @@ Disse tags vil muliggøre at filtrere statusser fra profiler. Du skal benytte kontekstmenuen for at se dem. Auto-indsæt et linjeskift efter nævningen, for at gøre første bogstav til en versal Lader indholdskreatører deler statusser til deres RSS-feeds - Tidslinjer - Brugerflade - Batteri Skriv Maks. antal forsøg ved medie-upload Opret en ny mappe hér @@ -1013,9 +885,7 @@ Standartmappe Mappe Opret mappe - Benyt din foretrukne browser i selve programmet. Ved at deaktivere, åbnes links eksternt Vis en toast-besked efte fuldførelsen af en handling (boost, fav mv.)? - Eksportér forstummede instanser Forstummede instanser er eksporteret! Tilføj en instans Eksportér instanser @@ -1111,7 +981,6 @@ Angiv din tilpassede vært eller udfykd ikke for at benytte nitter.net Skjul Fedilab-notifikationsbjælke For at skjule den resterende notifikation på statusbjælken, så klik på øjeikonknappen og fjern derefter markeringen: \"Vises på statusbjælke\" - Aktivér udskudte notifikationer Notifikationer udskydes hvert 30. sekund. Dette vil betyde lavere batteridræning. Live-notifikationer udskudt Ingen live-notifikationer @@ -1137,7 +1006,6 @@ Videotitlen Deltag i Peertube Jeg er mindst 16 år gammel og accepterer %1$s for denne instans - Farver Links Skift farven på links (URL\'er, omtaler, tags mv.) i beskeder Overskrift på genblogninger @@ -1149,15 +1017,12 @@ Nulstil Ikoner Farve på bundikoner på tidslinjer - Baggrund - Skift baggrundsfarven for tidslinjer Fastgør dette tag Instansens logo Redigér profil Opret en handling Oversættelse Billedforhåndsvisning - Skift tema Tekstfarve Skift tekstfarve på kontainer Effektuér ændringer diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 55eda2e27..6e3acd398 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -1,5 +1,4 @@ - - + Menü öffnen Menü schließen @@ -16,8 +15,6 @@ Abbrechen Herunterladen %1$s herunterladen - Herunterladen abgeschlossen - %1$s speichern Datei gespeichert Datei: %1$s Passwort @@ -25,10 +22,8 @@ Konten Toots Schlagwörter (tags) - Token Speichern Wiederherstellen - Zwei-Faktor-Authentifizierung? Keine Ergebnisse. Instanz Instanz: mastodon.social @@ -39,10 +34,7 @@ Ändern Wähle ein Bild… Bereinigen - Mikrofon Kamera - Bitte sag etwas - Leider unterstützt Ihr Gerät keine Spracheingabe! Alles löschen Toot übersetzen Planen @@ -59,7 +51,6 @@ Antworten Benutzername Entwürfe - Neue Beiträge sind verfügbar! Jetzt anzeigen? Favoriten Neue Folgende Erwähnungen @@ -78,18 +69,12 @@ Kommunikation Stummgeschaltete Nutzer Blockierte Nutzer - Folgen Benachrichtigungen Folgeanfragen - Optimierung Einstellungen - Profil - Was möchtest du tun? Konto löschen Möchtest du das Konto %1$s wirklich aus der App entfernen? E-Mail senden - Datei wählen - Kein Dateimanager gefunden! Pfad anklicken, um ihn zu ändern Fehlgeschlagen! Geplante Toots @@ -99,10 +84,6 @@ Echtzeit-Benachrichtigungen Kein Toot zum Anzeigen - Der Toot wurde zu den Favoriten hinzugefügt - Der Toot wurde aus Ihren Favoriten enfernt! - Toot wurde geteilt! - Toot wird nicht länger geteilt! Geteilt von %1$s Diesen Toot deinen Favoriten hinzufügen? Diesen Toot aus Ihren Favoriten entfernen? @@ -134,10 +115,6 @@ Diesen Toot entfernen? Diesen Toot löschen & neu entwerfen? - - %d Antwort - %d Antworten - Lesezeichen Zu Lesezeichen hinzufügen Lesezeichen löschen @@ -159,7 +136,6 @@ Auf einen Toot antworten Schreib einen Queet Auf einen Queet antworten - Du hast das Limit von 500 Zeichen erreicht! Wähle eine Mediendatei Ein Fehler während der Auswahl ist aufgetreten! Diese Datei löschen? @@ -193,7 +169,6 @@ Toot-Übersetzung: Instanzensuche: Symbolgestalter: - Bannergestalter: Unterhaltung @@ -223,15 +198,10 @@ hat deinen Beitrag geteilt hat deinen Status favorisiert folgt dir - Neuer Toot von %1$s und eine weitere Benachrichtigung und %d weitere Benachrichtigungen - - und ein weiterer Toot zu entdecken - und %d weitere toots zum entdecken - %d gefällt mir %d Gefällt mir @@ -267,7 +237,6 @@ Der Name der Instanz scheint ungültig zu sein! Ein Fehler ist während des Kontowechsels aufgetreten! Ein Fehler ist während der Suche aufgetreten! - Login fehlgeschlagen! Das Profil wurde gespeichert! Keine Aktion kann durchgeführt werden Datei wurde gespeichert! @@ -276,12 +245,8 @@ Entwurf gespeichert! Bist du sicher das diese Instanz die Anzahl an Zeichen unterstützt? Gewöhnlich liegt der Wert bei 500. Sichtbarkeit der Toots für Nutzer %1$s wurde geändert - Instanzname und Benutzername dürfen nicht leer sein! - Optimierter Ladevorgang Anzahl der Toots pro Ladevorgang - Anzahl der Konten pro Ladevorgang - Anzahl der Benachrichtigungen pro Ladevorgang Immer WLAN Fragen @@ -290,13 +255,9 @@ Mehr anzeigen… Zeige weniger… Sensibler Inhalt - Zeige vorherige Nachricht beim Antworten - Lokale Zeitleiste anzeigen - Öffentliche Zeitleiste anzeigen GIF Avatare deaktvieren Pfad: Entwürfe automatisch speichern - Anzahl neuer Beiträge anzeigen Füge die URL bei Anhängen in Toots hinzu mir jemand folgt jemand meinen Beitrag teilt @@ -308,7 +269,6 @@ Nur bei WLAN benachrichtigen Benachrichtigen? Leise Benachrichtigungen - Nachtmodus NSFW Anzeigedauer (in Sekunden, 0 ≙ deaktiviert) Ändere Profil Benutzerdefiniertes Teilen @@ -332,12 +292,6 @@ Javascript aktivieren Inhaltswarnungen (CWs) automatisch einblenden Erlaube Cookies von Drittanbietern - Zeitleisten wie anzeigen: - - Nur als Reiter - Nur als Menü - Reiter und Menü - Yandex DeepL @@ -349,15 +303,6 @@ Hell Schwarz - - Nein - 512 Kb - 1 MB - 2 MB - 4 MB - 6 MB - 8 MB - LED Farbe auswählen Blau @@ -368,13 +313,9 @@ Gelb Weiß - Benachrichtigung für neue Toots auf der Startleiste Folgen - Entfolgen - Blockieren Nicht mehr blockieren Lautlos - Keine Aktion Lautlosmodus beenden Anfrage gesendet folgt dir @@ -385,8 +326,6 @@ Push Benachrichtigungen Bitte bestätige welche Push Benachrichtigungen du erhalten möchtest. Diese können später im Benachrichtungsreiter aktiviert oder deaktiviert werden. - Für ungelesene Toots auf der Startleiste? - Für ungelesene Benachrichtigungen? Speicher leeren Es sind %1$s Daten im Speicher.\n @@ -398,7 +337,6 @@ Titel Titel … Beschreibung - Beschreibung … Schlüsselwörter Schlüsselwörter … @@ -415,7 +353,6 @@ Angeheftet anzeigen Keine passenden Einträge gefunden! Toots sichern fürn %1$s - Benachrichtigungen für %1$s sichern %1$s neue Toots wurden importiert %1$s neue Benachrichtigungen wurden importiert @@ -465,18 +402,14 @@ Durch das Löschen der Anwendung werden diese Daten sofort entfernt.\n Möchtest du diese Liste wirklich dauerhaft löschen? Noch keine Einträge vorhanden. Wenn Mitglieder dieser Liste etwas veröffentlichen, dann wird es hier erscheinen. Zur Liste hinzufügen - Von der Liste entfernen Liste hinzufügen Liste löschen Liste bearbeiten Neuer Listentitel - Suche innerhalb von Leuten denen du folgst - Deine Listen Das Konto wurde zur Liste hinzugefügt! Du hast noch keine Listen! %1$s wurde verschoben nach %2$s - Zeige Anzahl für geteilt/favorisiert Authentifizierung funktioniert nicht? Hier sind einige Vorschläge die helfen könnten:\n\n - Prüfe ob der Instanzname richtig geschrieben ist\n\n @@ -492,25 +425,19 @@ Durch das Löschen der Anwendung werden diese Daten sofort entfernt.\n %1$s Toots von %2$s wurden exportiert. Etwas ist schief gelaufen beim exportieren von%1$s Beim Exportieren von Daten ist ein Problem aufgetreten! - Daten wurden importiert! Beim Importieren von Daten ist ein Problem aufgetreten! Proxy - Typ Proxy aktivieren? Host Port Login Passwort - Thema: - Kompakte Darstellung Toot Details beim Teilen hinzufügen Unterstütze die app auf Liberapay Es gibt einen Fehler im regulären Ausdruck! - Noch ohne Konto? Es wurden keine Zeitleisten in dieser Instanz gefunden! Diese Instanz löschen? - Du löschst %s aus deinen folgenden Instanzen. Übersetzen in Folge Instanz Du folgst dieser Instanz bereits! @@ -519,10 +446,8 @@ Durch das Löschen der Anwendung werden diese Daten sofort entfernt.\n Information Verstecke geteilte Beiträge von %s Auf Profil hervorheben - Verberge alles von %s Geteilte Beiträge von %s anzeigen Nicht mehr im Profil hervorheben - Alles von %s anzeigen Dieser Benutzer wird nun in deinem Profil hervorgehoben Dieser Benutzer wird nicht mehr in deinem Profil hervorgehoben Geteilte Beiträge werden nun angezeigt! @@ -543,7 +468,6 @@ Durch das Löschen der Anwendung werden diese Daten sofort entfernt.\n Kontext filtern Ein oder mehrere Aspekte, wo der Filter greifen soll Verfällt nach - Neuen Filter hinzufügen Filter löschen? Filter aktualisieren Filter erstellen @@ -558,13 +482,11 @@ Durch das Löschen der Anwendung werden diese Daten sofort entfernt.\n Konten wurden der Liste hinzugefügt Füge Konten der Liste hinzu Du hast noch keine Liste erstellt. Drücke auf den \"+\" Knopf um eine anzulegen. - Du folgst keiner entfernten Instanz. Drücke auf den \"+\" Knopf um eine hinzuzufügen. Folgen Trunk API Dem Konto oder den Konten kann nicht gefolgt werden Abruf des Remote-Accounts Versteckte Medien automatisch einblenden - Menüpunkt \"Folge Instanzen\" anzeigen Neuer Folgender Neu geteilt Neuer Favorit @@ -589,7 +511,6 @@ Durch das Löschen der Anwendung werden diese Daten sofort entfernt.\n Rufe entfernten Status ab Kommentar Peertube Instanz - Direktnachrichten als eigene Zeitleiste anzeigen Kommentiere als Erster dieses Video mit den Knopf oben rechts! %s mal gesehen Dauer: %s @@ -601,10 +522,6 @@ Durch das Löschen der Anwendung werden diese Daten sofort entfernt.\n Video wurde aus den Favoriten entfernt! Keine Peertube Videos in den Favoriten! Kanal - Keine Peertube Kanäle - Keine Peertube Instanzen - Keine Mastodon Instanzen - Keine Liste! Videos Kanäle Emoji One verwenden @@ -612,12 +529,7 @@ Durch das Löschen der Anwendung werden diese Daten sofort entfernt.\n Vorschau in allen Toots anzeigen Neuer UX/UI-Designer Video-Vorschau anzeigen - Gitlab Unterstützung - Fehlerbericht - Es ist keine E-Mail Anwendung installiert. - Fehlerbericht senden Konto-ID wurde in die Zwischenablage kopiert! - Akkuoptimierung Sprache ändern Standardsprache Lange Toots kürzen @@ -629,7 +541,6 @@ Durch das Löschen der Anwendung werden diese Daten sofort entfernt.\n Dieses Schlagwort wurde gespeichert! Dieses Schlagwort wurde geändert! Dieses Schlagwort wurde gelöscht! - Kunst-Zeitlinie anzeigen Teilen des Beitrags planen Teilen geplant! Nichts geplant! @@ -667,11 +578,7 @@ Durch das Löschen der Anwendung werden diese Daten sofort entfernt.\n In diesem Feld musst du deinen Instanz-Hostnamen eingeben.\nWenn du zum Beispiel ein Konto auf https://mastodon.social erstellt hast\nschreibe einfach mastodon.social (ohne https://)\n Sobald du die ersten Buchstaben eintippst, werden Namensvorschläge angezeigt\n\n ⚠ Die Schaltfläche „Anmelden” funktioniert nur, wenn der Instanzname gültig und die Instanz erreuchbar ist! - Tragen Sie hier die E-Mail-Adresse ein, die mit ihrem Mastodon-Account verbunden ist. - Als letzten Schritt gib bitte dein Passwort ein und klicke auf Anmelden. - Mehr Informationen - Falls du 2FA (Zwei-Faktor-Authentisierung) verwendest, musst du diesen Link verwenden.\nDu kannst ihn ebenfalls verwenden, wenn du eine Zugangsdaten hier nicht eingeben möchtest. Sprachen Nur Medien @@ -683,16 +590,13 @@ Sobald du die ersten Buchstaben eintippst, werden Namensvorschläge angezeigt\n\ Bot Pixelfed-Instanz Mastodon-Instanz - Keine Pixelfed-Instanzen Irgendwelche davon Alle von denen Keine von denen Eines dieser Wörter (durch Leerzeichen getrennt) Alle diese Wörter (durch Leerzeichen getrennt) - Keines dieser Wörter (durch Leerzeichen getrennt) Wörter zum Filter hinzufügen (durch Leerzeichen getrennt) Spaltenname ändern - Keine Misskey-Instanzen Misskey Instanz Auf Ihrem Gerät ist keine App installiert, die diesen Link unterstützt. Abonnements @@ -709,7 +613,6 @@ Sobald du die ersten Buchstaben eintippst, werden Namensvorschläge angezeigt\n\ Datei zum Hochladen auswählen Eigene Videos Titel - Kategorien Lizenz Kategorie Sprache @@ -724,14 +627,10 @@ Sobald du die ersten Buchstaben eintippst, werden Namensvorschläge angezeigt\n\ Hier klicken, um die Videodaten zu bearbeiten. Video löschen Möchtest du dieses Video wirklich löschen? - Noch keine Videos hochgeladen! Videos mit heiklen Inhalten anzeigen - Standard %s Kanal Keine Videos zum Anzeigen! - Medien zu Favoriten hinzufügen Kommentar schreiben Teilen - Meine Bilder Zeitplanungsmodus wählen Vom Gerät Vom Server @@ -739,12 +638,8 @@ Sobald du die ersten Buchstaben eintippst, werden Namensvorschläge angezeigt\n\ Toots (Gerät) Bearbeiten Neugeladene Toots oberhalb der \"Mehr Toots abrufen\" Schaltfläche anzeigen - Bestätigungen Zeitleisten - Mitteilungsdienst Benutzeroberfläche - Ausgeblendeter Inhalt - Verfassen Kontakte %1$s kommentierte dein Video %2$s]]> %1$s folgt deinem Kanal %2$s]]> @@ -759,7 +654,6 @@ Sobald du die ersten Buchstaben eintippst, werden Namensvorschläge angezeigt\n\ Daten importieren Zu importierende Datei auswählen Bei der Auswahl der Sicherungsdatei ist ein Problem aufgetreten! - Bitte beenden Sie die App nicht während sie ausgeführt wird. Bitte ein wenig Geduld. Einen öffentlichen Kommentar verfassen Kommentar senden Internetverbindung fehlgeschlagen. Ihre Nachricht wurde in Entwürfen gespeichert. @@ -800,18 +694,14 @@ Sobald du die ersten Buchstaben eintippst, werden Namensvorschläge angezeigt\n\ endet um %s Umfrage aktualisieren Abstimmen - Eine Umfrage kann nicht an eine direkte Nachricht angehängt werden! Eine Umfrage, in der du abgestimmt hast, ist beendet Eine Ihrer Umfragen ist beendet Anpassen Kategorien - Neuigkeiten Zeitfenster Erweitert Ungelesene Toots als „Neu” kennzeichnen - Peertube-Zeitleiste anzeigen Peertube - Tab ausblenden Zeitleiste verschieben Zeitleiste ausblenden Zeitleiste neu anordnen @@ -821,10 +711,8 @@ Sobald du die ersten Buchstaben eintippst, werden Namensvorschläge angezeigt\n\ Widerrufen Es müssen zwei sichtbare Tabs vorhanden sein! Zeitleisten neu ordnen - Verwende den Listeneintrag zum Löschen dieser Liste! Hauptzeitleisten können nur ausgeblendet werden! BBCode - Zeitleiste hinzufügen Medien immer als sensibel kennzeichnen GNU-Instanz Gespeicherter Status @@ -839,14 +727,11 @@ Sobald du die ersten Buchstaben eintippst, werden Namensvorschläge angezeigt\n\ Verlauf Wiedergabelisten Anzeigename - Datenschutz - Erstellen Sie haben noch keine Wiedergabelisten. Klicken Sie auf das Symbol „➕”, um eine neue Wiedergabeliste hinzuzufügen. Du musst einen Anzeigenamen angeben! Ein Kanal wird benötigt, wenn es sich um eine öffentliche Wiedergabeliste handelt. Wiedergabeliste erstellen Diese Wiedergabeliste ist leer. - Medien bearbeiten Wiederherstellen Galerie Emoji @@ -854,7 +739,6 @@ Sobald du die ersten Buchstaben eintippst, werden Namensvorschläge angezeigt\n\ Radierer Text Filter - Anpassen Pinsel Möchtest du den Editor wirklich verlassen, ohne die Grafik zu speichern? Verwerfen @@ -862,7 +746,6 @@ Sobald du die ersten Buchstaben eintippst, werden Namensvorschläge angezeigt\n\ Grafik erfolgreich gespeichert! Grafik konnte nicht gespeichert werden Deckkraft - Zuschneiden Fotobearbeitung aktivieren Umfrageelement hinzufügen Letztes Umfrageelement entfernen @@ -874,10 +757,8 @@ Sobald du die ersten Buchstaben eintippst, werden Namensvorschläge angezeigt\n\ Zeitgesteuert lautlos schalten Konto erwähnen Zwischenspeicher aktualisieren - Erfahren, wer die Favoriten unterstützt und hinzugefügt hat Status erwähnen Neuigkeiten - Nachrichten aus dem Fedilab-Konto anzeigen Allgemein Regional Kunst @@ -917,7 +798,6 @@ Sobald du die ersten Buchstaben eintippst, werden Namensvorschläge angezeigt\n\ Erneut mit Konto verbinden Die Anwendung konnte nicht auf die Verwaltungsfunktionen zugreifen. Möglicherweise musst du das Konto erneut verbinden, um vollständigen Zugriff zu erhalten. Ungelöst - Gelöst Fernzugriff Aktiv Anstehend @@ -933,7 +813,6 @@ Sobald du die ersten Buchstaben eintippst, werden Namensvorschläge angezeigt\n\ Deaktivieren Lautlos Nutzer per E-Mail benachrichtigen - Aktion ausführen Benutzerdefinierte Warnung Nutzer Moderator @@ -965,7 +844,6 @@ Sobald du die ersten Buchstaben eintippst, werden Namensvorschläge angezeigt\n\ Kein Inhalt! Schaltfläche Fedilab-Funktionen anzeigen Die Anwendung benötigt Zugriff auf die Audioaufzeichnung - Aufnahme der Sprachnachricht fehlgeschlagen! Sprachnachricht Schnelles Antworten aktivieren Der Nutzer, dem du antwortest, sieht deine Nachricht möglicherweise nicht! @@ -973,9 +851,7 @@ Sobald du die ersten Buchstaben eintippst, werden Namensvorschläge angezeigt\n\ Wenn deaktiviert, werden sensible Medien mit Hilfe einer Schaltfläche ausgeblendet Medien in voller Größe speichern durch langes Antippen der Vorschaubilder Füge oben rechts eine Dreipunkt-Schaltfläche […] hinzu, um alle Schlagwörter/Instanzen/Listen aufzulisten - Anzeige eines Elements im Hauptmenü für einen schnellen Zugriff auf das Zeitlisten-Zielen #Fedilab-Tag Halte eine offene Verbindung zur Streaming-API für Echtzeit-Mitteilungen aufrecht. - Dieser Ordner besteht bereits.\n Bitte gib einen anderen Namen für den Ordner an. Innerhalb des Zeitfensters sendet die App Mitteilungen. Du kannst dieses Zeitfenster mit dem richtigen Drehwähler umkehren (d. h. leise). Zeigt eine Fedilab-Schaltfläche unter dem Profilbild. Dies ermöglicht einen Schnellzugriff auf In-App-Funktionen. Ermöglicht das direkte Antworten in Zeitachsen unterhalb des Status @@ -987,9 +863,6 @@ Sobald du die ersten Buchstaben eintippst, werden Namensvorschläge angezeigt\n\ Diese Schlagwörter ermöglichen es, den Status von Profilen zu filtern. Du musst das Kontextmenü verwenden, um diese anzuzeigen. Automatisches Einfügen eines Zeilenumbruchs nach der Anweisung den ersten Buchstaben groß zu schreiben. Ermöglicht es Inhaltserstellern, den Status ihrer RSS-Feeds zu teilen - Zeitleisten - Benutzeroberfläche - Batterie Verfassen Max. Anzahl Wiederholversuche zum Hochladen von Medien Hier einen neuen Ordner erstellen @@ -1000,9 +873,7 @@ Sobald du die ersten Buchstaben eintippst, werden Namensvorschläge angezeigt\n\ Standardordner Ordner Ordner erstellen - Verwende deinen bevorzugten Browser innerhalb der Anwendung. Durch das Deaktivieren werden Links extern geöffnet Toast-Benachrichtigung anzeigen, nachdem eine Aktion abgeschlossen ist (boost, fav, usw)? - Lautlos geschaltete Instanzen exportieren Lautlos geschaltete Instanzen wurden exportiert! Instanz hinzufügen Instanzen exportieren @@ -1098,7 +969,6 @@ Sobald du die ersten Buchstaben eintippst, werden Namensvorschläge angezeigt\n\ Geben Sie Ihren eigenen Host ein oder lassen Sie leer, um nitter.net zu verwenden Fedilab Benachrichtigungsleiste ausblenden Um die verbleibende Benachrichtigung in der Statusleiste zu verstecken, klicken Sie auf die Augensymbol-Schaltfläche und deaktivieren Sie: \"In Statusleiste anzeigen\" - Verzögerte Benachrichtigungen aktivieren Benachrichtigungen werden 30 Sekunden verzögert. Dadurch wird weniger Akku verbraucht. Verzögerte Echtzeit-Benachrichtigungen Keine Echtzeit-Benachrichtigungen @@ -1124,7 +994,6 @@ Sobald du die ersten Buchstaben eintippst, werden Namensvorschläge angezeigt\n\ Titel für das Video Join Peertube I am at least 16 years old and agree to the %1$s of this instance - Colors Links Change the color of links (URLs, mentions, tags, etc.) in messages Reblogs header @@ -1136,15 +1005,12 @@ Sobald du die ersten Buchstaben eintippst, werden Namensvorschläge angezeigt\n\ Reset Icons Color of bottom icons in timelines - Background - Change the background color for timelines Pin this tag Logo of the instance Edit profile Make an action Translation Image preview - Change the theme Text color Change the text color in pots Apply changes diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index 1cd73e7cf..f17843efc 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -1,5 +1,4 @@ - - + Άνοιγμα μενού Κλείσιμο μενού @@ -16,8 +15,6 @@ Ακύρωση Λήψη Λήψη του %1$s - Η λήψη ολοκληρώθηκε - Αποθήκευση του %1$s Το υλικό αποθηκεύτηκε Αρχείο: %1$s Συνθηματικό @@ -25,10 +22,8 @@ Λογαριασμοί Toots Ετικέτες - Αδειοδοτικό (token) Αποθήκευση Επαναφορά - Διβηματικός έλεγχος ταυτότητας; Κανένα αποτέλεσμα! Υπόσταση Υπόσταση: mastodon.social @@ -39,10 +34,7 @@ Αλλαγή Επιλογή φωτογραφίας… Καθαρισμός - Μικρόφωνο Φωτογραφική μηχανή - Σε παρακαλώ πες κάτι - Λυπάμαι, η συσκευή σου δεν υποστηρίζει φωνητική εισαγωγή! Σβήσε τα όλα Μετέφρασε αυτό το toot. Προγραμματισμός @@ -59,7 +51,6 @@ Απαντήσεις Όνομα χρήστη Προσχέδια - Είναι διαθέσιμα νέα δεδομένα! Να εμφανιστούν; Αγαπημένα Νέοι ακόλουθοι Αναφορές @@ -78,18 +69,12 @@ Επικοινωνία Χρήστες σε σίγαση Χρήστες σε αποκλεισμό - Ακολουθήστε από απόσταση Ειδοποιήσεις Αιτήσεις ακολούθησης - Βελτιστοποίηση Ρυθμίσεις - Πρόσωπο - Τι θέλεις να κάνεις; Διέγραψε έναν λογαριασμό Διέγραψε τον λογαριασμό %1$s από την εφαρμογή; Στείλε ένα email - Παρακαλώ, επιλέξτε ένα αρχείο - Δεν βρέθηκε εφαρμογή περίηγησης αρχείων! Kλίκαρε στη διαδρομή για να την αλλάξεις Απέτυχε! Προγραμματισμένες φωνές @@ -99,10 +84,6 @@ Απ\' ευθείας ειδοποιήσεις Καμία φωνή προς εμφάνιση - Η φωνή προστέθηκε στις αγαπημένες - Η φωνή απομακρύνθηκε από τις αγαπημένες. - Η φωνή ενισχύθηκε. - Αυτή η φωνή δεν είναι ενισχυμένη, πλέον. Ενίσχυση από %1$s Προσθήκη αυτής της φωνής στις αγαπημένες σου; Απομάκρυνση αυτής της φωνής από τις αγαπημένες σου; @@ -134,10 +115,6 @@ Απομάκρυνση αυτής της φωνής; Διαγραφή κ´ επανασχεδίαση αυτής της φωνής; - - %d απάντηση - %d απαντήσεις - Σελιδοδείκτες Προσθήκη στους σελιδοδείκτες Απομάκρυνση του σελιδοδείκτη @@ -159,7 +136,6 @@ Απάντηση σε μια φωνή Γράψιμο ενός ού-ου Απάντηση σε ένα ού-ου - Έχεις χρησιμοποιήσει το πλήθος των 500 επιτρεπόμενων χαρακτήρων. Επιλογή ενός πολυμέσου Παρουσιάστηκε κάποιο σφάλμα κατά την επιλογή του πολυμέσου. Διαγραφή αυτού του πολυμέσου; @@ -193,7 +169,6 @@ Μετάφραση με... : Αναζήτηση για υποστάσεις: Σχεδιαστής εικονιδίου: - Σχεδιαστής σημαίας: Συζήτηση @@ -223,15 +198,10 @@ ενίσχυσε την κατάστασή σου έδειξε προτίμηση στην κατάστασή σου άρχισε να σε παρακολουθεί - Νέα φωνή από %1$s και ακόμη μία ειδοποίηση και %d άλλες ειδοποιήσεις - - και ακόμη μία φωνή για να εξερευνήσεις - και ακόμη %d άλλες φωνές για να εξερευνήσεις - %d, άρεσε %d, άρεσε @@ -267,7 +237,6 @@ Ο τομέας της υπόστασης δεν φαίνεται για έγκυρος. Παρουσιάστηκε κάποιο σφάλμα, κατά την εναλλαγή μεταξύ των λογαριασμών. Παρουσιάστηκε κάποιο σφάλμα κατά την αναζήτηση. - Αδυναμία σύνδεσης. Τα δεδομένα του προσώπου έχουν αποθηκευτεί. Δεν μπορεί να εκτελεστεί καμία ενέργεια Το πολυμέσο αποθηκεύθηκε. @@ -276,12 +245,8 @@ Αποθηκεύτηκε το προσχέδιο. Είσαι σίγουρος πως αυτή η υπόσταση επιτρέπει αυτό το πλήθος των χαρακτήρων; Συνήθως αυτή η τιμή είναι γύρω στους 500 χαρακτήρες. Έχει αλλαχτεί η αναγνωσιμότητα των φωνών, για το λογαριασμό %1$s - Το όνομα της υπόστασης και το όνομα της οθόνης δεν μπορούν να είναι κενά. - Βελτιστοποίηση του φορτώματος Πλήθος φωνών ανά φόρτωμα - Πλήθος λογαριασμών ανά φόρτωμα - Πλήθος ειδοποιήσεων ανά φόρτωμα Πάντα με Γουάι-Φάι Ερώτηση @@ -290,13 +255,9 @@ Εμφάνιση περισσότερων… Εμφάνιση λιγότερων… Ευαίσθητο περιεχόμενο - Προβολή του προπορευόμενου μηνύματος στις αποκρίσεις - Προβολή της τοπικής χρονοστήλης - Προβολή της ομοσπονδιακής χρονοστήλης Απενεργοποίηση των προσωπικών απεικονίσεων μορφής GIF Διαδρομή: Αυτόματη αποθήκευση των προσχεδίων - Προβολή των μετρητών Προσθήκη της διεύθυνσης URL στις φωνές πολυμέσων Ειδοποίηση όταν κάποιος σε παρακολουθεί Ειδοποίηση όταν κάποιος ενισχύει την κατάστασή σου @@ -308,7 +269,6 @@ Ειδοποίηση μόνο όταν σε Γουάι-Φάι Ειδοποιήσεις; Άηχες Ειδοποιήσεις - Κατάσταση λειτουργίας νύχτας Χρόνος λήξης της προβολής των Ακατάλληλων (σε δευτερόλεπτα· το 0 σημαίνει ανενεργό) Επεξεργασία του προσώπου Προσαρμοσμένη κοινοποίηση @@ -332,12 +292,6 @@ Ενεργοποίηση των Σεναρίων της Τζάβα Αυτόματη επέκταση της Προειδοποίησης Περιεχομένου Να επιτρέπονται τα κουλουράκια τρίτων - Διάταξη των χρονοστηλών: - - Καρτέλες - Κατάλογος επιλογών - Καρτέλες και κατάλογος επιλογών - Yandex DeepL @@ -349,15 +303,6 @@ Φωτεινό Μαύρο - - Όχι - 512 Χιλιομπάιτια - 1 Μεγαμπάιτιο - 2 Μεγαμπάιτια - 4 Μεγαμπάιτια - 6 Μεγαμπάιτια - 8 Μεγαμπάιτια - Το χρώμα του λεντιού: Μπλε @@ -368,13 +313,9 @@ Κίτρινο Λευκό - Ειδοποίηση για νέες φωνές στην σπιτική χρονοστήλη Παρακολούθηση - Διακοπή παρακολούθησης - Φραγή Απόφραξη Σίγαση - Καμία κίνηση Ακύρωση της σίγασης Η αίτηση στάλθηκε Σε παρακολουθεί @@ -387,8 +328,6 @@ Παρακαλώ, επιβεβαίωσε τις ειδοποιήσεις προωθήσεων, που θα ήθελες να λαμβάνεις. Μπορείς να ενεργοποιήσεις ή να απενεργοποιήσεις αυτές τις ειδοποιήσεις, αργότερα, στις ρυθμίσεις (στην καρτέλα Ειδοποιήσεων). - Για τις μη διαβασμένες φωνές στην σπιτική χρονοστήλη; - Για τις μη διαβασμένες ειδοποιήσεις; Καθάρισμα της μικραποθήκευσης Υπάρχουν %1$s δεδομένων στην μικραποθήκευση.\n\nΘα ήθελες να διαγραφούν; @@ -398,7 +337,6 @@ Τίτλος Τίτλος… Περιγραφή - Περιγραφή… Λέξεις-κλειδιά Λέξεις-κλειδιά… @@ -415,7 +353,6 @@ Εμφάνιση των καρφιτσωμένων Δεν βρέθηκαν αποτελέσματα που να ταιριάζουν. Δημιουργία αντιγράφου δεδομένων των φωνών του %1$s - Αποθήκευση αντίγραφου ασφαλείας για %1$s Έχουν εισαχθεί %1$s νέες φωνές Έχουν εισαχθεί %1$s νέες ειδοποιήσεις @@ -471,18 +408,14 @@ Σίγουρα, να διαγραφεί αυτό το κατάστιχο, αμετάκλητα; Ακόμη δεν υπάρχει τίποτα σε αυτό το κατάστιχο. Όταν κάποια μέλη αυτού του κατάστιχου θα δημοσιεύσουν νέες καταστάσεις, αυτές θα εμφανιστούν εδώ. Προσθήκη στο κατάστιχο - Απομάκρυνση από το κατάστιχο Προσθήκη κατάστιχου Διαγραφή κατάστιχου Επεξεργασία κατάστιχου Το όνομα του νέου κατάστιχου - Αναζήτηση ανάμεσα σε ανθρώπους που παρακολουθείς - Τα δικά σου κατάστιχα Ο λογαριασμός προστέθηκε στο κατάστιχο. Ακόμα να ορίσεις κάποια κατάστιχα. Το %1$s έχει πάει στο %2$s - Εμφάνιση του μετρητή των ενισχυμένων και των αγαπημένων Μήπως δεν δουλεύει η έλεγχος ταυτότητας; Here are some checks that might help:\n\n - Check there is no spelling mistakes in the instance name\n\n @@ -499,25 +432,19 @@ Εξάχθηκαν %1$s φωνές από τις %2$s . Παρουσιάστηκε κάποιο σφάλμα, κατά την εξαγωγή δεδομένων για το %1$s Παρουσιάστηκε κάποιο σφάλμα, κατά την εξαγωγή δεδομένων. - Έγινε εισαγωγή των δεδομένων. Παρουσιάστηκε κάποιο σφάλμα, κατά την εισαγωγή δεδομένων. Μεσολαβητής - Μορφή Ενεργοποίηση του μεσολαβητή; Οικοδεσπότης Θύρα Σύνδεση Συνθηματικό - Θέμα: - Συμπαγής Κατάσταση Λειτουργίας Προσθήκη των λεπτομερειών των φωνών, κατά το μοίρασμα Υποστήριξη της εφαρμογής στο Liberapay Υπάρχει κάποιο σφάλμα στην κανονική έκφραση. - Ακόμη χωρίς λογαριασμό; Δεν βρέθηκε κάποια χρονοστήλη σε αυτή την υπόσταση. Διαγραφή αυτής της υπόστασης; - Πρόκειται να διαγράψεις την %s , από τις υποστάσεις που παρακολουθείς. Μετάφραση στο Παρακολούθηση της υπόστασης Ήδη παρακολουθείς αυτή την υπόσταση. @@ -526,10 +453,8 @@ Πληροφορίες Απόκρυψη των ενισχύσεων από %s Τοποθέτηση στο πρόσωπο - Απόκρυψη όλων από %s Προβολή των ενισχύσεων από %s Μη τοποθέτηση στο πρόσωπο - Προβολή όλων από %s Ο λογαριασμός έχει τοποθετηθεί, τώρα, σε προεξέχουσα θέση στο πρόσωπο Ο λογαριασμός δεν είναι, πια, τοποθετημένος σε προεξέχουσα θέση στο πρόσωπο Οι ανυψώσεις εμφανίζονται, τώρα. @@ -550,7 +475,6 @@ Προς κοσκίνισμα Μία ή περισσότερες περιοχές, όπου θα εφαρμόζεται το κόσκινο Λήγει μετά από - Προσθήκη Νέου Κόσκινου Διαγραφή του κόσκινου; Ενημέρωση του κόσκινου Δημιουργία κόσκινου @@ -565,13 +489,11 @@ Λογαριασμοί προστέθηκαν στο κατάστιχο Προστίθενται λογαριασμοί στο κατάστιχο Ακόμη δεν έχεις δημιουργήσει ένα κατάστιχο. Για να δημιουργήσεις ένα νέο, κλίκαρε στο κουμπί με το « + ». - Δεν παρακολουθείς καμία απομακρυσμένη υπόσταση. Για να προσθέσεις μία καινούρια, κλίκαρε στο πλήκτρο « + » . Ποιον να παρακολουθείς Trunk API Αδύνατη η παρακολούθηση του λογαριασμού ή των λογαριασμών Λαμβάνεται απομακρυσμένος λογαριασμος Αυτόματη επέκταση των κρυμμένων πολυμέσων - Εμφάνιση του πλήκτρου παρακολούθησης μιας υπόστασης Νέα παρακολούθηση Νέα Ενίσχυση Νέο Αγαπημένο @@ -596,7 +518,6 @@ Λαμβάνει την απομακρυσμένη κατάσταση Σχολιασμός Υπόσταση Peertube - Προβολή της χρονοστήλης των προσωπικών μηνυμάτων Μπορείς να προλάβεις να σχολιάσεις πρώτος αυτό το βίντεο, χρησιμοποιώντας το πλήκτρο, εκεί, πάνω δεξιά. %s προβολές Διάρκεια: %s @@ -608,10 +529,6 @@ Αυτό το βίντεο απομακρύνθηκε από τους σελιδοδείκτες. Δεν υπάρχουν Πειρτιούμπια βίντεα στα αγαπημένα σου. Κανάλι - Κανένα Πειρτιούμπιο κανάλι - Καμία υπόσταση του Peertube - Καμία υπόσταση του Μαστόδοντου - Κανένα κατάστιχο Βίντεα Κανάλια Χρήση του Πρώτου Ιδεογράμματος @@ -619,12 +536,7 @@ Εμφάνιση των προεπισκοπήσεων σε όλες τις φωνές Σχεδιαστής της νέας Εμπειρίας Χρήστη κ´ του νέου Περιβάλλοντος Χρήσης Προβολή των προεπισκοπήσεων των βίντεων - Gitlab Υποστήριξη - Αναφορά Δυσλειτουργίας - Δεν υπάρχει καμιά εγκατεστημένη εφαρμογή ηλεκτρονικού ταχυδρομείου. - Αποστολή μιας αναφοράς δυσλειτουργίας Η ID ταυτότητα του λογαριασμού αντιγράφηκε στο πρόχειρο. - Βελτιστοποίηση της μπαταρίας Αλλαγή της γλώσσας Προεπιλεγμένη γλώσσα Ψαλίδισμα των μακροσκελών φωνών @@ -636,7 +548,6 @@ Η ετικέτα έχει αποθηκευθεί. Η ετικέτα έχει αλλαχτεί. Η ετικέτα έχει διαγραφεί. - Προβολή της Καλλιτεχνικής χρονοστήλης Προγραμματισμός της ενίσχυσης Η ενίσχυση προγραμματίστηκε. Δεν υπάρχει κάποια προγραμματισμένη ενίσχυση για να εμφανιστεί. @@ -675,12 +586,7 @@ Μπορείς να ξεκινήσεις να γράφεις τα πρώτα γράμματα, και θα προταθούν ολόκληρες οι ονομασίες.\n\n ⚠ Το πλήκτρο Σύνδεσης λειτουργεί, μόνο όταν είναι έγκυρο το όνομα της υπόστασης, και είναι η υπόσταση σε λειτουργία! - Στο αυτό πεδίο, εισήγαγε το λογαριασμό του ηλεκτρονικού ταχυδρομείου, ο οποίος είναι συνδεμένος με το λογαριασμό σου στο Μαστόδοντο. - - Τα τελευταία βήματα, είναι η εισαγωγή του συνθηματικού, και το κλικάρισμα στη Σύνδεση. - Περισσότερες πληροφορίες - Αν χρησιμοποιείς 2FA (έλεγχο ταυτότητας δύο παραγόντων), θα πρέπει να χρησιμοποιήσεις και αυτόν τον δεσμό.\nΕπίσης, μπορείς να τον χρησιμοποιήσεις, αν δεν θες να εισάγεις, εδώ, τα διαπιστευτήριά σου. Γλώσσες Μόνο πολυμέσα @@ -692,16 +598,13 @@ Αυτόματος Εργάτης Υπόσταση Pixelfed Υπόσταση Mastodon - Καμία υπόσταση Pixelfed Οποιαδήποτε από τις... Όλες από τις... Καμία από τις... Με οποιαδήποτε από αυτές τις λέξεις (διαχωρισμένες με κενά) Με όλες αυτές τις λέξεις (διαχωρισμένες με κενά) - Με καμία από αυτές τις λέξεις (διαχωρισμένες με κενά) Πρόσθεσε μερικές λέξεις για το κόσκινο (χωρισμένες με κενά) Αλλαγή του ονόματος της στήλης - Καμία υπόσταση Misskey Υπόσταση Misskey Δεν υπάρχει κάποια εφαρμογή εγκατεστημένη στο σύστημά σου, η οποία να υποστηρίζει αυτόν το δεσμό. Συνδρομές @@ -718,7 +621,6 @@ Επέλεξε το αρχείο για αποστολή Τα βίντεά μου Τίτλος - Kατηγορίες Άδεια Κατηγορία Γλώσσα @@ -733,14 +635,10 @@ Κλίκαρε εδώ, για να επεξεργαστείς τα δεδομένα του βίντεου. Διαγραφή του βίντεου Να διαγραφεί το βίντεο, στα σίγουρα; - Ακόμη δεν έχει ανέβει κάποιο βίντεο. Προβολή των Ακατάλληλων βίντεων - Προεπιλεγμένο κανάλι %s Δεν υπάρχουν βίντεα για προβολή. - Προσθήκη πολυμέσου στα αγαπημένα Γράψε ένα σχόλιο Να γυρίζει - Οι εικόνες μου Επιλέξτε μια κατάσταση λειτουργίας προγραμματισμού Από συσκευή Από διακομιστή @@ -748,12 +646,8 @@ Φωνές (Συσκευή) Τροποποίηση Εμφάνιση νέων φωνών πάνω από το πλήκτρο « Λήψη περισσότερων » - Επιβεβαιώσεις Χρονοστήλη - Υπηρεσία ειδοποιήσεων Περιβάλλον Χρήσης - Κρυφό περιεχόμενο - Σύνθεση Επαφές %1$s σχολίασε το βίντεό σου %2$s]]> %1$s παρακολουθεί το κανάλι σου %2$s]]> @@ -768,7 +662,6 @@ Εισαγωγή δεδομένων Επέλεξε το αρχείο προς εισαγωγή Παρουσιάστηκε κάποιο σφάλμα στη συλλογή του αρχείου εξασφάλισης. - Παρακαλώ, μην σκοτώσεις την εφαρμογή όσο γίνεται επεξεργασία. Δεν σκοπεύει να αργήσει και πολύ... Προσθήκη ενός δημόσιου σχόλιου Αποστολή σχόλιου Δεν υπάρχει σύνδεση στο διαδίκτυο. Το μήνυμα σου έχει αποθηκευθεί στα προσχέδια. @@ -809,18 +702,14 @@ τελειώνει στις %s Ανανέωση της ψηφοφορίας Ψήφισμα - Μία ψηφοφορίας δεν μπορεί να προσκολληθεί σε ένα άμεσο μήνυμα. Μία ψηφοφορία στην οποία συμμετείχες έχει τελειώσει Μια ψηφοφορία που κάλεσες τελείωσε Προσαρμογή Κατηγορίες - Νέα Χρονική Περίοδος Προχωρημένα Εμφάνιση το σήματος «νέο», στις αδιάβαστες φωνές - Εμφάνιση της χρονοστήλης του Πειρτιούμπιου Peertube - Απόκρυψη της καρτέλας Μετακίνηση της χρονοστήλης Απόκρυψη της χρονοστήλης Αναδιάταξη των χρονοστήλων @@ -830,10 +719,8 @@ Αναίρεση Θα πρέπει να διατηρείς δύο καρτέλες ορατές. Χρονοστήλες - Χρησιμοποίησε την εισαγωγή των κατάστιχων, για να διαγράψεις αυτό το κατάστιχο. Η κύρια χρονοστήλη μπορεί, μονάχα, να κρυφτεί. BBCode - Προσθήκη χρονοστήλης Πάντα σημείωση των πολυμέσων ως περιέχοντα ευαίσθητο περιεχόμενο Υπόσταση GNU Μικραποθηκευμένη κατάσταση @@ -848,14 +735,11 @@ Ιστορικό Κατάστιχα αναπαραγωγής Προβολή του ονόματος - Ιδιωτικότητα - Δημιουργία Δεν έχεις κανένα κατάστιχο αναπαραγωγής. Κλίκαρε στο εικονίδιο « + », για να προσθέσεις ένα καινούριο κατάστιχο Πρέπει να εισάγεις ένα όνομα ανάγνωσης Το κανάλι απαιτείται, όταν το κατάστιχο αναπαραγωγής είναι δημόσιο. Δημιουργία ενός κατάστιχου αναπαραγωγής Δεν υπάρχει τίποτα στο κατάστιχο αναπαραγωγής, ακόμη. - Επεξεργασία του πολυμέσου επαναφορά Εικονοθήκη Ιδεόγραμμα @@ -863,7 +747,6 @@ Σβήστρα Κείμενο Κόσκινο - Προσαρμογή Πινέλο Έξοδος χωρίς αποθήκευση, εντελώς στα σίγουρα; Απόρριψη @@ -871,7 +754,6 @@ Η Εικόνα Αποθηκεύτηκε Επιτυχώς! Αποτυχία αποθήκευσης της εικόνας Αδιαφάνεια - Περικοπή Ενεργοποίηση του επεξεργαστή φωτογραφιών Προσθήκη ενός αντικειμένου ψηφοφορίας Απομάκρυνση του τελευταίου αντικειμένου ψηφοφορίας @@ -883,10 +765,8 @@ Χρονομετρημένη σίγαση Μνημόνευση του λογαριασμού Ανανέωση της μικραποθήκευσης - Δες ποιος ενίσχυσε και πρόσθεσε στ\' αγαπημένα Μνημόνευση της κατάστασης Νέα - Εμφάνιση των νέων, από το λογαριασμό του Φέντιλαμπ Γενικά Κατά περιοχή Τέχνη @@ -930,7 +810,6 @@ Επανασύνδεση του λογαριασμού The application failed to access the admin features. You might need to reconnect the account for having the correct scope. Αδιευθέτητο - Διευθετημένο Απομακρυσμένο Ενεργό Εκκρεμές @@ -946,7 +825,6 @@ Απενεργοποίηση Φίμωση Notify the user per e-mail - Εκτέλεση ενέργειας Προσαρμοσμένη προειδοποίηση Χρήστης Συντονιστής @@ -978,7 +856,6 @@ Άδειο περιεχόμενο. Προβολή του πλήκτρου λειτουργιών του Φέντιλαμπ Η εφαρμογή πρέπει να έχει πρόσβαση στην εγγραφή ήχου - Παρουσιάστηκε κάποιο σφάλμα, κατά την εγγραφή του φωνητικού μηνύματος. Ηχητικό μήνυμα Ενεργοποίηση των γρήγορων απαντήσεων Ο λογαριασμός, στον οποίο απαντάς, ίσως να μην μπορεί να δει το μήνυμά σου. @@ -986,9 +863,7 @@ Αν απενεργοποιηθεί, τα πολυμέσα με ευαίσθητο περιεχόμενο θα αποκρύπτονται με ένα πλήκτρο Αποθήκευση των πολυμέσων, στις πλήρης διαστάσεις τους, με πάτημα διαρκείας στην προ-επισκόπηση Add an ellipse button at the top right for listing all tags/instances/lists - Display an item in the main menu for a quick access to the timeline targeting #Fedilab tag Διατήρηση συνεχής της σύνδεσης στην API, που παρέχει τη ροή, για ζωντανές ειδοποιήσεις. - Όταν η εφαρμογή θα τρέχει στο παρασκήνιο, θα διατηρεί μία σύνδεση στην API που παρέχει τη ροή. Απενεργοποίησε αυτή την επιλογή, αν σε νοιάζει το πόσο θα κρατάει η μπαταρία σου. During the time slot, the app will send notifications. You can reverse (ie: silent) this time slot with the right spinner. Προβολή ενός Φενδιλάμπιου πλήκτρου κάτω από την εικόνα του προσώπου. Είναι μια συντόμευση, η οποία επιτρέπει την πρόσβαση σε λειτουργίες της εφαρμογής. Επιτρέπει την άμεση απόκριση, στις χρονοστήλες, κάτω από τις καταστάσεις @@ -1000,9 +875,6 @@ These tags will allow to filter statuses from profiles. You will have to use the context menu for seeing them. Αυτόματη εισαγωγή μίας νέας γραμμής, μετά από μια μνημόνευση, και μετατροπή του πρώτου γράμματος σε κεφαλαίο Allow content creators to share statuses to their RSS feeds - Χρονοστήλες - Περιβάλλον Χρήσης - Μπαταρία Δημιουργία Μέγιστο πλήθος προσπαθειών όταν ανεβαίνουν πολυμέσα Δημιουργία, εδώ, ενός νέου Φάκελου @@ -1013,9 +885,7 @@ Προεπιλεγμένος Κατάλογος Φάκελος Δημιουργία φακέλου - Χρήση του προτιμώμενου περιηγητή εντός της εφαρμογής. Αν απενεργοποιηθεί οι δεσμοί θα ανοίγουν εξωτερικά. Να προβάλλεται ένα φρυγαναίικο μήνυμα, μετά την ολοκλήρωση μίας ενέργειας (ενίσχυση, αγαπημένο, κλπ) ; - Εξαγωγή των φιμωμένων υποστάσεων Οι φιμωμένες υποστάσεις εξάχθηκαν. Προσθήκη μιας υπόστασης Εξαγωγή των υποστάσεων @@ -1111,7 +981,6 @@ οικοδεσπότης (ή κενό για το nitter.net) Απόκρυψη της γραμμής ειδοποιήσεων του Φέντιλαμπ Για απόκρυψη της υπόλοιπης ειδοποίησης στη γραμμή κατάστασης, πίεσε στο πλήκτρο με το μάτι, και μετά απο-επέλεξε την...: «Προβολή στη γραμμή κατάστασης» - Ενεργοποίηση των ειδοποιήσεων με καθυστέρηση Οι ειδοποιήσεις θα καθυστερούν κάθε 30 δευτερόλεπτα. Αυτό θα βοηθήσει στην χαμηλότερη απομύζηση της μπαταρίας. Οι ζωντανές ειδοποιήσεις είναι με καθυστέρηση Καθόλου ζωντανές ειδοποιήσεις @@ -1137,7 +1006,6 @@ Τίτλος του βίντεου Συμμετοχή στο Peertube Είμαι μεγαλύτερος από από 16 χρονών, και συμφωνώ με %1$s αυτής της υπόστασης - Χρώματα Σύνδεσμοι Αλλαγή των χρωμάτων των συνδέσμων (URL, μνημονεύσεις, ετικέτες, κλπ) στα μηνύματα Reblogs header @@ -1149,15 +1017,12 @@ Επαναφορά Εικονίδια Χρώμα των κάτω εικονιδίων στις χρονοστήλες - Παρασκήνιο - Αλλαγή του χρώματος παρασκηνίου στις χρονοστήλες Καρφίτσωμα αυτής της ετικέτας Το λογότυπο της υπόστασης Επεξεργασία του προσώπου Make an action Μετάφραση Προεπισκόπηση εικόνας - Change the theme Text color Change the text color in pots Apply changes diff --git a/app/src/main/res/values-eo/strings.xml b/app/src/main/res/values-eo/strings.xml index 16e47752a..f7eb8cc2f 100644 --- a/app/src/main/res/values-eo/strings.xml +++ b/app/src/main/res/values-eo/strings.xml @@ -1,5 +1,4 @@ - - + Malfermi la menuo Fermi la menuo @@ -16,8 +15,6 @@ Nuligi Elŝuti Elŝutante %1$s - Elŝutado plenumita - Konservi %1$s Aŭdvidaĵo savita Dosiero: %1$s Pasvorto @@ -25,10 +22,8 @@ Kontaj Mesaĝoj Etikedoj - Ĵetono Konservu Restarigu - Dufaktora aŭtentigo? Neniu rezultoj! Instanco Instanco: mastodon.social @@ -39,10 +34,7 @@ Ŝangi Elekti bildon… Pura - Mikrofono Fotilo - Bonvolu, diri ion - Pardonu! Via aparato ne subtenas voĉan enigon! Forigu ĉiujn Traduki tiun Mesaĝon. Plano @@ -59,7 +51,6 @@ Respondoj Uzantnomo Malnetoj - Nova datumo estas havebla! Ĉu vi volas aperigi ilin? Stelumoj Novaj sekvantoj Mencioj @@ -78,18 +69,12 @@ Komunikado Silentigitaj uzantoj Blokitaj uzantoj - Izolita sekvi Sciigoj Petoj de sekvado - Optimigo Agordoj - Profilo - Kion vi volas? Forigi konton Forigi la konton %1$s de la apliko? Sendi per retmesaĝo - Bonvolu elekti dosieron - Neniu dosiero esploristo trovis! Tap on the path to change it Fiaskis! Planita hupoj @@ -99,10 +84,6 @@ Puŝsciigoj Neniu hup por montri - La hup estis aldonita al stelumoj - The toot was removed from favourites! - La mesaĝon diskonigis! - La mesaĝon maldiskonigis! Diskonigita de %1$s Aldoni mesaĝon al vian stelumajn? Remove this toot from your favourites? @@ -134,10 +115,6 @@ Forigi ĉi-tiun hup? Delete & re-draft this toot? - - %d respondo - %d respondoj - Legosignoj Aldonu legosignon Forigu legosignon @@ -159,7 +136,6 @@ Respondi mesaĝon Skribi queet Respondi queet - Vi atingis la 500 karakteroj permesis! Elekti aŭdovidaĵon An error occurred while selecting the media! Forigi ĉi tiun aŭdovidaĵon? @@ -193,7 +169,6 @@ Traduka de mesaĝoj: Serĉi instencoj: Icon designer: - Banner designer: Konversacio @@ -223,15 +198,10 @@ {name} diskonigis vian mesaĝon {name} stelumis vian mesaĝon %s eksekvis vin - Nova mesaĝo de %1$s and another notification and %d other notifications - - and another toot to discover - and %d other toots to discover - %d ŝato %d ŝatoj @@ -267,7 +237,6 @@ The instance domain does not seem to be valid! An error occurred while switching between accounts! An error occurred while searching! - Ne povas ensaluti! La profila datumoj estis savita! No action can be taken La aŭdvidaĵo estis konservita! @@ -276,12 +245,8 @@ Malneto saviĝis! Are you sure this instance allows this number of characters? Usually, this value is close to 500 characters. Visibility of the toots has been changed for the account %1$s - Instance name and screen name cannot be blank! - Optimisation of loading Number of toots per load - Number of accounts per load - Number of notifications per load Ĉiam sendrata reto Demandi @@ -290,13 +255,9 @@ Montru pli… Montru malpli… Tikla enhavo - Montri antaŭa mesaĝo en respondoj - Montri loka tempolinio - Display federated timeline Disable GIF avatars Vojo: Save drafts automatically - Montri sumigiloj Add URL of media in toots Notify when someone follows you Notify when someone boosts your status @@ -308,7 +269,6 @@ Notify in WIFI only Sciigi? Silent Notifications - Nokta reĝimo NSFW view timeout (seconds, 0 means off) Redakti profilon Custom sharing @@ -332,12 +292,6 @@ Ebligi Ĝavoskripton Automatically expand cw Permesi tria-partiaj kuketojn - Layout for timelines: - - Langetoj - Menuo - Tabs and menu - Jandekso DeepL @@ -349,15 +303,6 @@ Luma Nigra - - Ne - 512 Ko - 1 Mo - 2 Mo - 4 Mo - 6 Mo - 8 Mo - Set LED colour: Blua @@ -368,13 +313,9 @@ Flava Blanka - Notify for new toots on the home timeline Sekvu - Malsekvu - Bloku Malbloku Silentigu - Neniu ago Malsilentigu Peto sendita Sekvas vin @@ -387,8 +328,6 @@ Please, confirm push notifications that you want to receive. You can enable or disable these notifications later in settings (Notifications tab). - For unread toots in home time-line? - For unread notifications? Vakigi Kaŝmemoron There are %1$s of data in cache.\n\nWould you like to delete them? @@ -398,7 +337,6 @@ Titolo Titolo… Priskribo - Priskribo… Ŝlosilvortoj Ŝlosilvortoj… @@ -415,7 +353,6 @@ Montri aplingitaj No matching result found! Backup toots for %1$s - Backup notifications for %1$s %1$s new toots have been imported %1$s new notifications have been imported @@ -471,18 +408,14 @@ Ĉu vi certas, ke vi volas porĉiame forigi ĉi tiun liston? Ankoraŭ estas nenio en ĉi tiu listo. Kiam membroj de ĉi tiu listo afiŝos novajn mesaĝojn, ili aperos ĉi tie. Aldoni al la listo - Forigi el listo Aldoni al la listo Forigi la liston Redakti la liston Nova listo titolo - Serĉi homojn ke vi sekvas - Via listoj La konto estis aldonita al la listo! You don\'t have any lists yet! %1$s has moved to %2$s - Show boosts/favourites count Authentication does not work? Here are some checks that might help:\n\n - Check there is no spelling mistakes in the instance name\n\n @@ -499,25 +432,19 @@ %1$s toots out of %2$s have been exported. Something went wrong when exporting data for %1$s Something went wrong when exporting data! - Data have been imported! Something went wrong when importing data! Prokurilo - Tipo Enable proxy? Gastiganto Pordo Ensaluti Pasvorto - Temo: - Kompakta modo Add toot details when sharing Support the app on Liberapay There is an error in the regular expression! - No account yet? No timelines was found on this instance! Delete this instance? - You are going to delete %s from your followed instances. Traduki Sekvi Instanco You already follow this instance! @@ -526,10 +453,8 @@ Informaĵo Hide boosts from %s Montri en profilo - Kaŝi ĉion de %s Montri diskonigojn de %s Ne montri en profilo - Malkaŝi ĉion de %s The account is now featured on profile The account is no longer featured on profile Boosts are now shown! @@ -550,7 +475,6 @@ Filtrilo kuntekstoj One or multiple contexts where the filter should apply Expire after - Add New Filter Forigi filtrilon? Ĝisdatigo filtrilo Krei filtrilon @@ -565,13 +489,11 @@ La kontoj estis aldonita al la listo Aldoni kontojn al la listo You have not created a list yet. Tap on the \"+\" button to add a new one. - You don\'t follow any remote instances. Tap on the \"+\" button to add a new one. Kiu sekvi Trunk API Konto(j) ne povas esti sekvita Fetching remote account Automatically expand hidden media - Display follow instances button New follow Nova Hup Nova Steluma @@ -596,7 +518,6 @@ Fetching remote status Komentu Peertube Instenco - Display private messages timeline Be the first to leave a comment on this video with the top right button! %s vidoj Daŭro: %s @@ -608,10 +529,6 @@ The video has been removed from bookmarks! There is no Peertube videos in your favourites! Kanalo - No Peertube channels - No Peertube instances - No Mastodon instances - Neniu listoj Videoj Kanaloj Uzi Emoji One @@ -619,12 +536,7 @@ Display previews in all toots New UX/UI designer Display video previews - Gitlab Support - Cimraporto - There are no email clients installed. - Send a bug report The account id has been copied in the clipboard! - Optimization of the battery Ŝanĝi lingvon Defaŭlta lingvon Truncate long toots @@ -636,7 +548,6 @@ The tag has been stored! The tag has been changed! The tag has been deleted! - Montri Arta tempolinio Schedule boost The boost is scheduled! No scheduled boost to display! @@ -675,12 +586,7 @@ You can start writing first letters and names will be suggested.\n\n ⚠ The Login button will only work if the instance name is valid and the instance is up! - In this field, write the email that is attached to your Mastodon account. - - Last step is to enter your password and click on Login. - More information - If you use 2FA (Two-factor authentication), you need to use this link.\nYou can also use it if you do not want to enter your credentials here. Lingvoj Nur aŭdvidaĵo @@ -692,16 +598,13 @@ Boto Pixelfed instenco Mastodono Instenco - Neniam Pixelfed instencojn Iu ajn de ĉi tiuj Ĉiuj de ĉi tiuj None of these Any of these words (space-separated) All these words (space-separated) - None of these words (space-separated) Add some words to filter (space-separated) Change column name - No Misskey instances Misskey instance No app supporting this link is installed on your device. Abonoj @@ -718,7 +621,6 @@ Select the file to upload Mia videoj Titolo - Kategorioj Permesilo Kategorio Lingvo @@ -733,14 +635,10 @@ Tap here to edit the video data. Forigi video Ĉu vi certas, ke vi volas forigi ĉi tiun filmeton? - No videos uploaded yet! Display NSFW videos - Default %s channel No videos to display! - Aldonu aŭdvidaĵojn stelumej Lasi komenton Konigi - Miaj Bildoj Choose a schedule mode De aparato De servilo @@ -748,12 +646,8 @@ Hupoj (Aparato) Ŝanĝi Display new toots above the \"Fetch more\" button - Konfirmoj Tempolinioj - Notification service Interfaco - Kaŝita enhavo - Composing Kontaktoj %1$s commented your video %2$s]]> %1$s is following your channel %2$s]]> @@ -768,7 +662,6 @@ Import Data Elektu dosieron por importi An error occurred when selecting the backup file! - Please, don\'t kill the app while processing. That can\'t be quite long. Add a public comment Sendi komenton There is no Internet connection. Your message has been stored in drafts. @@ -809,18 +702,14 @@ end at %s Refresh poll Voĉdoni - A poll cannot be attached to a direct message! Partoprenita balotenketo finiĝis A poll you tooted has ended Customize Kategorioj - Novaĵoj Time slot Altnivela Display \'new\' badge on unread toots - Display Peertube timeline Peertube - Hide the tab Movi templinio Kaŝi templinio Reordigi templinioj @@ -830,10 +719,8 @@ Rezigni You need to keep two visible tabs! Reorder timelines - Use the lists entry for deleting this list! Main timelines can only be hidden! BBCode - Add a timeline Ĉiam marki aŭdovidaĵojn tiklaj GNU instenco Cached status @@ -848,14 +735,11 @@ History Playlists Montri nomon - Privateco - Krei You don\'t have any playlists. Tap on the \"+\" icon to add a new playlist You must provide a display name! The channel is required when the playlist is public. Create a playlist There is nothing in this playlist yet. - Redaktu aŭdvidaĵo refari Galerio Emoĝio @@ -863,7 +747,6 @@ Skrapileto Teksto Filtrilo - Alĝustigi Brush Are you sure you want to exit without saving the image? Nuligi @@ -871,7 +754,6 @@ Image Saved Successfully! Failed to save Image Opakeco - Stuci Enable photo editor Add a poll item Remove last poll item @@ -883,10 +765,8 @@ Timed mute Mention the account Refresh cache - See who boosted and added to favorites Mention the status News - Display news from Fedilab\'s account Ĝeneralaj Regiona Arto @@ -930,7 +810,6 @@ Reconnect the account The application failed to access the admin features. You might need to reconnect the account for having the correct scope. Nesolvitaj - Solvita Remote Active Pending @@ -946,7 +825,6 @@ Malŝalti Silentigi Notify the user per e-mail - Perform action Custom warning Uzanto Kontrolanto @@ -978,7 +856,6 @@ Empty content! Display Fedilab features button The application needs to access audio recording - An error occurred when recording the voice message! Voĉmesaĝo Enable quick reply The account you are replying might not see your message! @@ -986,9 +863,7 @@ If disabled, sensitive media will be hidden with a button Store media in full size with a long press on previews Add an ellipse button at the top right for listing all tags/instances/lists - Display an item in the main menu for a quick access to the timeline targeting #Fedilab tag Keep an open connection to the streaming API for live notifications. - When the app is in background, it will keep a connection to the streaming API. Disable it if you care about your battery. During the time slot, the app will send notifications. You can reverse (ie: silent) this time slot with the right spinner. Display a Fedilab button below profile picture. It is a shortcut for accessing in-app features. Allow to reply directly in timelines below statuses @@ -1000,9 +875,6 @@ These tags will allow to filter statuses from profiles. You will have to use the context menu for seeing them. Automatically insert a line break after the mention to capitalize the first letter Allow content creators to share statuses to their RSS feeds - Tempolinioj - Interfaco - Baterio Verki Maximum retry times when uploading media Create a new Folder here @@ -1013,9 +885,7 @@ Default Directory Dosierujo Krei dosierujon - Use your favourite browser inside the application. By disabling, links will be opened externally Display a toast message after an action has been completed (boost, fav, etc.)? - Export muted instances Muted instances have been exported! Aldoni instencon Export instances @@ -1111,7 +981,6 @@ Enter your custom host or leave blank for using nitter.net Hide Fedilab notification bar For hiding the remaining notification in the status bar, tap on the eye icon button then uncheck: \"Display in status bar\" - Enable delayed notifications Notifications will be delayed every 30 seconds. That will allow to drain less battery. Live notifications delayed No live notifications @@ -1137,7 +1006,6 @@ Title for the video Join Peertube I am at least 16 years old and agree to the %1$s of this instance - Colors Links Change the color of links (URLs, mentions, tags, etc.) in messages Reblogs header @@ -1149,15 +1017,12 @@ Reset Icons Color of bottom icons in timelines - Background - Change the background color for timelines Pin this tag Logo of the instance Edit profile Make an action Translation Image preview - Change the theme Text color Change the text color in pots Apply changes diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 5794639cd..2316c96ae 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -1,5 +1,4 @@ - - + Abrir el menú Cerrar menú @@ -16,8 +15,6 @@ Cancelar Descargar Descargando %1$s - Descarga completada - Guardado %1$s Archivos multimedia guardados Archivo: %1$s Contraseña @@ -25,10 +22,8 @@ Cuentas Toots Etiquetas - Ficha Guardar Restaurar - ¿Autenticación de dos pasos? ¡No hay resultados! Instancia Instancia: mastodon.social @@ -39,10 +34,7 @@ Cambiar Seleccionar una imagen… Borrar - Micrófono Cámara - Por favor, di algo - ¡Lo sentimos! ¡Tu dispositivo no es compatible con la entrada de voz! Eliminar todo Traducir este toot. Programa @@ -59,7 +51,6 @@ Respuestas Nombre de usuario Borradores - ¡Nuevos datos están disponibles! ¿Quieres mostrarlos? Favoritos Nuevos seguidores Menciones @@ -78,18 +69,12 @@ Comunicación Usuarios silenciados Usuarios bloqueados - Seguimiento remoto Notificaciones Solicitud de seguir - Optimización Configuración - Perfil - ¿Qué quieres hacer? Eliminar una cuenta ¿Borrar la cuenta %1$s de la aplicación? Envíar un correo - Por favor, seleccione un archivo - ¡Ningún explorador de archivos encontrado! Haz clic en la dirección para cambiarla ¡Falló! Toots programados @@ -99,10 +84,6 @@ Notificaciones Ningún toot para mostrar - El toot fue agregado a favoritos - ¡El toot fue removido de favoritos! - ¡El toot fue retooteado! - ¡El toot ya no está retooteado! Retooteado por %1$s ¿Agregar este toot a favoritos? ¿Remover este toot de tus favoritos? @@ -134,10 +115,6 @@ ¿Remover este toot? Borrar & redactar este Toot? - - %d respuesta - %d respuesta - Marcapáginas Añadir a marcapáginas Remover marcapágina @@ -159,7 +136,6 @@ Responder a un toot Escribir un queet Responder a un queet - ¡Has alcanzado los 500 caracteres permitidos! Selecciona un medio ¡Un error ocurrió mientras seleccionaba un contenido multimedia! ¿Eliminar este contenido multimedia? @@ -193,7 +169,6 @@ Traducción de los toots: Búsqueda de instancias: Diseñador de ícono: - Diseñador de banner: Conversación @@ -223,15 +198,10 @@ retooteó tu estado marcó como favorito tu estado te siguió - Nuevo toot de %1$s y otra notificación y otra notificación - - y otro toot para descubrir - y %d otros toot para descubrir - %d me gusta %d me gusta @@ -267,7 +237,6 @@ ¡El dominio de la instancia no parece estar validado! ¡Un error ocurrió mientras cambiaba entre cuentas! ¡Un error ocurrió mientras buscaba! - ¡No puede iniciar sesión! ¡Los datos del perfil han sido guardados! Ninguna acción puede ser tomada ¡El contenido multimedia ha sido guardado! @@ -276,12 +245,8 @@ ¡Borrador guardado! ¿Estás seguro que esta instancia permite este número de caracteres? Usualmente, este valor es cercano a 500 caracteres. La visibilidad de los toots ha sido cambiado para la cuenta %1$s - ¡Nombre de la instancia y nombre de pantalla no puede estar en blanco! - Optimización de la carga Número de toots por carga - Número de cuentas por carga - Número de notificaciones por carga Siempre WI-FI Preguntar @@ -290,13 +255,9 @@ Mostrar más… Mostrar menos… Contenido sensible - Mostrar mensajes previos en las respuestas - Mostrar timeline local - Mostrar timline federado Desactivar avatares GIF Ruta: Guardar borradores automáticamente - Mostrar contadores Agregar URL del contenido multimedia en toots Notificar cuando alguien te siga Notificar cuando alguien retootee tu estado @@ -308,7 +269,6 @@ Notificaciones en WI-FI solamente ¿Notificar? Notificaciones silenciosas - Modo nocturno Tiempo de vista de contenido sensible (segundos, 0 significa terminado) Editar perfil Compartición personalizada @@ -332,12 +292,6 @@ Permitir Javascripts Expandir cw automáticamente Permitir cookies de terceros - Diseño para líneas de tiempo: - - Pestañas - Menú - Pestañas y menú - Yandex DeepL @@ -349,15 +303,6 @@ Claro Negro - - No - 512 KB - 1 MB - 2 MB - 4 Mb - 6 Mb - 8 Mb - Establecer color LED: Azul @@ -368,13 +313,9 @@ Amarillo Blanco - Notificar para nuevos toots en la cronología de inicio Seguir - Dejar de Seguir - Bloquear Desbloquear Silenciar - Ninguna acción Dejar de silenciar Solicitud enviada Te sigue @@ -386,8 +327,6 @@ Notificaciones Push Por favor, confirma notificaciones push que quieres recibir. Tú puede activar o desactivar esas notificaciones después en configuración (pestaña de notificaciones). - ¿Para toots no leídos en el timeline del inicio? - ¿Para notificaciones sin leer? Borrar caché Hay %1$s de data en caché.\n\n ¿Quieres eliminarlos? @@ -397,7 +336,6 @@ Tú puede activar o desactivar esas notificaciones después en configuración (p Título Título… Descripción - Descripción… Palabras Claves Palabras clave… @@ -414,7 +352,6 @@ Tú puede activar o desactivar esas notificaciones después en configuración (p Mostrar fijados ¡Ningún resultado encontrado! Respaldar toots de %1$s - Copia de seguridad de notificaciones para %1$s %1$s toots nuevos han sido importados %1$s nuevas notificaciones han sido importadas @@ -467,18 +404,14 @@ https://yandex.ru/legal/confidential/?lang=en ¿Seguro que deseas eliminar esta lista de forma permanente? No hay ninguna lista aún. Cuando los miembros de esta lista publiquen nuevos estados, apareceran aquí. Agregar a la lista - Eliminar de la lista Añadir lista Borrar lista Editar lista Nuevo título de lista - Buscar entre la gente que sigues - Tus listas ¡La cuenta fue añadida a la lista! ¡Aún no tienes ninguna lista! %1$s se ha movido a %2$s - Mostrar contador de retoots/favoritos ¿No funciona la autenticación? Aquí hay una lista de vistos que pueden ayudar \n\n -Revisa que no hay ningún error de escritura en la instancia del nombre \n\n @@ -494,25 +427,19 @@ https://yandex.ru/legal/confidential/?lang=en %1$s toots de %2$s han sido exportados. Hubo algún error al exportar los datos de %1$s ! Algo salió mal al exportar datos! - ! Los datos han sido importados! ! Algo salió mal al importar datos! Proxy - Tipo ¿Habilitar proxy? Host Puerto Usuario Contraseña - Tema: - Modo compacto Agregar datos del toot al compartir Apoya la aplicación en Liberapay Hay un error en la expresión regular! - ¿Sin cuenta todavía? ¡No líneas de tiempo se encontraron en esta instancia! ¿Borrar esta instancia? - Vas a borrar %s de tus instancias seguidas. Traducir en Seguir instancia ¡Tu ya sigues esta instancia! @@ -521,10 +448,8 @@ https://yandex.ru/legal/confidential/?lang=en Información Ocultar boosts de %s Destacar en perfil - Ocultar todo de %s Mostrar boosts de %s No muestre en perfil - Mostrar todo de %s La cuenta ha sido promocionada en el perfil La cuenta ya no aparece en el perfil ¡Ya aparecen los boosts! @@ -545,7 +470,6 @@ https://yandex.ru/legal/confidential/?lang=en Filtrar contenido Uno o varios contextos donde el filtro debería aplicar Expirar después de - Añadir nuevo filtro ¿Eliminar filtro? Actualizar filtro Crear filtro @@ -560,13 +484,11 @@ https://yandex.ru/legal/confidential/?lang=en Las cuentas fueron añadidas a la lista Añadiendo cuentas a la lista Todavía no has creado una lista. Haz clic en el botón \"+\" para añadir una nueva. - No estás siguiendo ninguna instancia remota. Haz clic en el botón \"+\" para añadir una nueva. A quiénes seguir Trunk API La(s) cuenta(s) no puede(n) ser seguida(s) Compilando cuenta remota Expandir automáticamente contenido multimedia oculto - Mostrar el botón para seguir instancias Nuevo seguidor Nuevo Boost Nuevo Favorito @@ -591,7 +513,6 @@ https://yandex.ru/legal/confidential/?lang=en Obteniendo estatus remoto Comentar Instancia de Peertube - Mostrar línea de tiempo de mensajes privados ¡Sé el primero en dejar un comentario en este video con el botón superior derecho! %s visitas Duración: %s @@ -603,10 +524,6 @@ https://yandex.ru/legal/confidential/?lang=en ¡Estado ha sido eliminado de tus favoritos! ¡No hay videos de Peertube en tus favoritos! Canal - No hay canales de Peertube - No hay instancias de Peertube - No hay instancias de Mastodon - Sin listas Vídeos Canales Usar Emoji One @@ -614,12 +531,7 @@ https://yandex.ru/legal/confidential/?lang=en Mostrar vistas previas de todos los toots Nuevo diseñador UX/UI Mostrar previsualización de videos - Soporte de Gitlab - Informe de error - No hay clientes de correo electrónico instalados. - Mandar un reporte del error ! La identificación de la cuenta ha sido copiada en el portapapeles! - Optimización de la batería Cambiar idioma Idioma predeterminado Truncar toots largos @@ -631,7 +543,6 @@ https://yandex.ru/legal/confidential/?lang=en Se ha guardado la etiqueta. ¡La etiqueta ha sido cambiada! ¡Se ha borrado la etiqueta! - Mostrar la línea de tiempo de arte Aumento de horario ¡El impulso está programado! ¡Ningún impulso programado para mostrar! @@ -669,12 +580,7 @@ https://yandex.ru/legal/confidential/?lang=en En este campo, debe escribir el nombre de host de su instancia. \ Npor ejemplo, si creó su cuenta en https: //mastodon.social \ nSólo escriba mastodon.social (sin https: //) \norte          Puede comenzar a escribir las primeras letras y se sugerirán los nombres. \ N \ n          ⚠ El botón Iniciar sesión solo funcionará si el nombre de la instancia es válido y la instancia está activa! - En este campo, escriba el correo electrónico que está conectado a tu cuenta de Mastodon. - - Último paso es introducir su contraseña y haga clic en Inicio de sesión. - Más información - Si utilizas 2FA (autenticación de dos factores), es necesario utilizar este enlace. \nTu también puedes utilizarlo si no deseas ingresar tus credenciales aquí. Idiomas Solo media @@ -686,16 +592,13 @@ https://yandex.ru/legal/confidential/?lang=en Bot Instancia Pixelfed Instancia de Mastodon - No hay instancia de Pixelfed Cualquiera de estos Todos estos Ninguno de estos Cualquiera de estas palabras (separados por espacios) Todas estas palabras (separados por espacios) - Ninguna de estas palabras (separados por espacios) Agregar algunas palabras para filtrar (separados por espacios) Cambiar nombre de columna - No hay instancias Misskey Instancia Misskey Ninguna aplicación que soporte este enlace está instalada en su dispositivo. Suscripciones @@ -712,7 +615,6 @@ https://yandex.ru/legal/confidential/?lang=en Seleciona un archivo para subir Mis videos Título - Categorías Licencia Categoría Idioma @@ -727,14 +629,10 @@ https://yandex.ru/legal/confidential/?lang=en Haga clic aquí para editar los datos del vídeo. Eliminar vídeo ¿Está seguro de eliminar este video? - ! Todavía no se ha subido ningún vídeo! Mostrar vídeos NSFW - Canal por defecto %s ¡No hay videos para ver! - Añadir media a favoritos Dejar un comentario Compartir - Mis imágenes Elija un modo de programación Desde dispositivo Desde servidor @@ -742,12 +640,8 @@ https://yandex.ru/legal/confidential/?lang=en Toots (Dispositivo) Modificar Mostrar nuevos toots sobre el botón \"Obtener más\" - Confirmaciones Líneas de tiempo - Servicio de notificaciones Interfaz - Contenido oculto - Composición Contactos %1$s comentó tu vídeo %2$s]]> %1$s está siguiendo tu canal %2$s]]> @@ -762,7 +656,6 @@ https://yandex.ru/legal/confidential/?lang=en Importar Datos Selecciona el archivo para importar ! Se produjo un error al seleccionar el archivo de copia de seguridad! - Por favor, no mates la aplicación mientras se procesa. Eso no puede ser muy largo. Agrega un comentario público Enviar comentario No hay conexión a internet. Su mensaje ha sido almacenado en borradores. @@ -803,18 +696,14 @@ https://yandex.ru/legal/confidential/?lang=en final en %s Actualizar encuesta Votar - ¡Una encuesta no puede ser adjunta a un mensaje directo! Una encuesta en la que has votado ha terminado Una encuesta que usted tooteo ha terminado Personalizar Categorías - Noticias Intervalo de tiempo Avanzado Mostrar insignia \'nuevo\' en los toots no leídos - Mostrar línea de tiempo de Peertube Peertube - Ocultar la pestaña Mover la línea de tiempo Ocultar la línea de tiempo Reordenar las líneas de tiempo @@ -824,10 +713,8 @@ https://yandex.ru/legal/confidential/?lang=en Deshacer ¡Necesitas mantener dos pestañas visibles! Reordenar las líneas de tiempo - ¡Usa la entrada de listas para eliminar esta lista! ¡Las líneas de tiempo principales sólo pueden ser ocultadas! BBCode - Agregar una línea de tiempo Marcar siempre los medios como sensibles Instancia GNU Estatus en caché @@ -842,14 +729,11 @@ https://yandex.ru/legal/confidential/?lang=en Historia Listas de reproducción Nombra para mostrar - Privacidad - Crear Usted no tiene ninguna lista de reproducción. Haga clic en el icono \"+\" para agregar una nueva lista de reproducción ¡Debes proporcionar un nombre a mostrar! El canal es necesario cuando la lista de reproducción es pública. Crear una lista de reproducción No hay nada en esta lista de reproducción todavía. - Editar multimedia rehacer Galería Emoji @@ -857,7 +741,6 @@ https://yandex.ru/legal/confidential/?lang=en Borrador Texto Filtrar - Ajustar Pincel ¿Estás seguro de que deseas salir sin guardar la imagen? Descartar @@ -865,7 +748,6 @@ https://yandex.ru/legal/confidential/?lang=en ¡Imagen guardada con éxito! Error al guardar la Imagen Opacidad - Cortar Habilitar el editor de fotos Añadir un elemento a la encuesta Eliminar último elemento de la encuesta @@ -877,10 +759,8 @@ https://yandex.ru/legal/confidential/?lang=en Silenciador temporizado Mencionar la cuenta Actualizar el caché - Ver quién ha impulsado y añadido a favoritos Mencionar el estatus Noticias - Mostrar noticias de la cuenta de Fedilab General Regional Arte @@ -924,7 +804,6 @@ https://yandex.ru/legal/confidential/?lang=en Reconectar la cuenta La aplicación no ha podido acceder a las funciones de administrador. Puede que necesite volver a conectar la cuenta para tener el alcance correcto. No resuelto - Resuelto Remoto Activo Pendiente @@ -940,7 +819,6 @@ https://yandex.ru/legal/confidential/?lang=en Desactivar Silenciar Notificar al usuario por correo electrónico - Ejecutar acción Advertencia personalizada Usuario Moderador @@ -972,7 +850,6 @@ https://yandex.ru/legal/confidential/?lang=en ¡Contenido vacío! Mostrar botón de características de Fedilab La aplicación necesita acceder a la grabación de audio - ¡Se ha producido un error al grabar el mensaje de voz! Mensaje de voz Activar respuesta rápida ¡La cuenta a la que estás respondiendo podría no ver tu mensaje! @@ -980,9 +857,7 @@ https://yandex.ru/legal/confidential/?lang=en Si está desactivado, el contenido multimedia sensible será ocultado con un botón Almacenar contenido multimedia a tamaño completo con una pulsación larga en la previsualización Agregar un botón de elipse en la parte superior derecha para listar todas las etiquetas/instancias/listas - Mostrar un elemento en el menú principal para un acceso rápido a la línea de tiempo con la etiqueta #Fedilab Mantenga una conexión abierta a la API de streaming para notificaciones en vivo. - Cuando la aplicación esté en segundo plano, mantendrá una conexión con la API de streaming. Deshabilítalo si te importa tu batería. Durante el intervalo de tiempo, la aplicación enviará notificaciones. Puede revertir (es decir: silenciar) este intervalo de tiempo con el botón derecho. Mostrar un botón de Fedilab debajo de la imagen de perfil. Es un acceso directo para acceder a las características de la aplicación. Permite responder directamente en las líneas de tiempo debajo de los estados @@ -994,9 +869,6 @@ https://yandex.ru/legal/confidential/?lang=en Estas etiquetas permitirán filtrar los estados de los perfiles. Tendrá que usar el menú contextual para verlos. Insertar automáticamente un salto de línea después de la mención para poner en mayúscula la primera letra Permitir a los creadores de contenido compartir los estados en sus fuentes RSS - Líneas de tiempo - Interfaz - Batería Redactar Tiempo máximo de reintentos al subir contenido multimedia Crear una nueva Carpeta aquí @@ -1007,9 +879,7 @@ https://yandex.ru/legal/confidential/?lang=en Directorio por defecto Carpeta Crear carpeta - Usa tu navegador favorito dentro de la aplicación. Al desactivarlo, los enlaces se abrirán externamente ¿Mostrar mensaje de felicitación tras completar una acción (impulsar, favorito, etc.)? - Exportar instancias silenciadas ¡Se han exportado las instancias silenciadas! Añadir una instancia Exportar instancias @@ -1105,7 +975,6 @@ https://yandex.ru/legal/confidential/?lang=en Introduce tu host personalizado o deja en blanco para usar nitter.net Ocultar la barra de notificaciones de Fedilab Para ocultar el resto de la notificación en la barra de estado, presione en el botón con el ícono de un ojo y luego desactivar \"Mostrar en la barra de estado\" - Activa el retraso de notificaciones Las notificaciones se retrasarán cada 30 segundos. Esto permitirá gastar menos batería. Notificaciones en vivo retrasadas Sin notificaciones en vivo @@ -1131,7 +1000,6 @@ https://yandex.ru/legal/confidential/?lang=en Título del vídeo Unirse a Peertube Tengo al menos 16 años y estoy de acuerdo con los %1$s de esta instancia - Colores Enlaces Cambiar el color de los enlaces (Url, menciones, etiquetas, etc.) en los mensajes Cabecera de impulsos @@ -1143,15 +1011,12 @@ https://yandex.ru/legal/confidential/?lang=en Restablecer Iconos Color de los iconos inferiores en las líneas de tiempo - Fondo - Cambiar el color de fondo de las líneas de tiempo Fijar esta etiqueta Logo de la instancia Editar perfil Realizar una acción Traducción Vista previa de imagen - Cambiar el tema Color del texto Cambiar el color del texto en las publicaciones Aplicar cambios diff --git a/app/src/main/res/values-eu/strings.xml b/app/src/main/res/values-eu/strings.xml index 633003b75..c1c2a8477 100644 --- a/app/src/main/res/values-eu/strings.xml +++ b/app/src/main/res/values-eu/strings.xml @@ -1,5 +1,4 @@ - - + Ireki menua Itxi menua @@ -16,8 +15,6 @@ Utzi Deskargatu Deskargatu %1$s - Deskarga osatuta - Gorde %1$s Multimedia gordeta Fitxategia: %1$s Pasahitza @@ -25,10 +22,8 @@ Kontuak Toot-ak Etiketak - Tokena Gorde Berrezarri - Bi pausutako autentifikazioa? Emaitzarik ez! Instantzia Instantzia: mastodon.social @@ -39,10 +34,7 @@ Aldatu Hautatu irudi bat… Garbitu - Mikrofonoa Kamera - Esan zerbait - Zure gailuak ez du onartzen ahots sarrera! Ezabatu guztiak Itzuli toot hau. Programatu @@ -59,7 +51,6 @@ Erantzunak Erabiltzaile-izena Zirriborroak - Datu berriak daude eskuragarri! Bistaratu nahi dituzu? Gogokoak Jarraitzaile berriak Aipamenak @@ -78,18 +69,12 @@ Komunikazioa Mutututako erabiltzaileak Blokeatutako erabiltzaileak - Urruneko jarraitzea Jakinarazpenak Jarraitzeko eskaerak - Optimizazioa Ezarpenak - Profila - Zer egin nahi duzu? Ezabatu kontu bat Ezabatu %1$s kontua aplikaziotik? Bidali e-mail bat - Hautatu fitxategi bat - Ez da fitxategi arakatzailerik aurkitu! Egin klik bide-izenean berau aldatzeko Huts egin du! Programatutako toot-ak @@ -99,10 +84,6 @@ Zuzeneko jakinarazpenak Ez dago toot-ik bistaratzeko - Toot-a gogokoetara gehitu da - Toot-a gogokoetatik kendu da! - Toot-ari bultzada eman zaio! - Toot-ari bultzada kendu zaio! %1$s(e)k bultzatua Gehitu toot hau zure gogokoetara? Kendu toot hau zure gogokoetatik? @@ -134,10 +115,6 @@ Kendu toot hau? Ezabatu eta berridatzi toot hau? - - erantzun %d - %d erantzun - Gogokoak Gehitu gogokoetara Kendu gogokoa @@ -159,7 +136,6 @@ Erantzun toot bati Idatzi queet bat Erantzun queet bat - Gehienez onartzen diren 500 karaktereetara iritsi zara! Hautatu multimedia bat Errorea gertatu da multimedia aukeratzean! Ezabatu multimedia hau? @@ -193,7 +169,6 @@ Toot-en itzulpena: Bilatu instantziak: Ikonoaren diseinatzailea: - Bandaren diseinatzailea: Elkarrizketa @@ -223,15 +198,10 @@ erabiltzaileak zure mezuari bultzada eman dio erabiltzaileak zure mezua gogoko du zu jarraitzen hasi da - %1$s erabiltzailearen toot berria eta beste jakinarazpen bat eta beste %d jakinarazpen - - eta beste toot bat ikusteke - eta beste %d toot ikusteke - gogoko %d %d gogoko @@ -267,7 +237,6 @@ Instantziaren domeinua ez dirudi baliozkoa! Errore bat gertatu da kontuen artean aldatzean! Errore bat gertatu da bilatu bitartean! - Ezin da saioa hasi! Profileko datuak gorde dira! Ezin da ekintzarik egin Multimedia gorde da! @@ -276,12 +245,8 @@ Zirriborroa gordeta! Ziur instantzia honek hainbeste karaktere onartzen dituela? Orokorrean, balio hau 500 inguru izaten da. %1$s kontuaren toot-en ikusgaitasuna aldatu da - Instantziaren izena eta pantaila izena ezin dira hutsik egon! - Kargaren optimizazioa Toot kopurua kargako - Kontu kopurua kargako - Jakinarazpen kopurua kargako Beti WIFI Galdetu @@ -290,13 +255,9 @@ Erakutsi gehiago… Erakutsi gutxiago… Eduki hunkigarria - Erakutsi aurreko mezua erantzunetan - Bistaratu denbora-lerro lokala - Bistaratu denbora-lerro federatua Desgaitu GIF abatarrak Bidea: Gorde zirriborroak automatikoki - Erakutsi kontagailuak Gehitu multimediaren URLa toot-etan Jakinarazi norbaitek jarraitzen dizunean Jakinarazi norbaitek zure mezuari bultzada ematean @@ -308,7 +269,6 @@ Jakinarazi WIFI bidez besterik ez Jakinarazi? Jakinarazpen isilak - Gau modua NSFW ikusteko denbora-muga (segundoak, 0 itzalita) Editatu profila Partekatze pertsonalizatua @@ -332,12 +292,6 @@ Gaitu JavaScript Hedatu automatikoki CW Baimendu hirugarrengoen cookie-ak - Denbora lerroen diseinua: - - Fitxak - Menua - Fitxak eta menuak - Yandex Ez @@ -349,15 +303,6 @@ Argia Beltza - - Ez - 512 KB - 1 MB - 2 MB - 4 MB - 6 MB - 8 MB - Ezarri LEDaren kolorea: Urdina @@ -368,13 +313,9 @@ Horia Zuria - Jakinarazi hasierako denbora-lerroan toot berriak daudenean Jarraitu - Utzi jarraitzeari - Blokeatu Desblokeatu Mututu - Ekintzarik ez Desmututu Eskaera bidalita Zu jarraitzen @@ -387,8 +328,6 @@ Berretsi jaso nahi dituzun push jakinarazpenak. Jakinarazpen hauek gero ezarpenetan aktibatu edo desaktibatu ditzakezu (Jakinarazpenak fitxa). - Irakurri gabeko toot-ak hasiera denbora-lerroan? - Irakurri gabeko jakinarazpenentzat? Garbitu cache-a %1$s datu daude cachean.\n\nEzabatu nahi dituzu? @@ -398,7 +337,6 @@ Izenburua Izenburua… Deskripzioa - Deskripzioa… Hitz gakoak Hitz gakoak… @@ -415,7 +353,6 @@ Erakutsi finkatuta Ez da emaitzarik aurkitu! Egin %1$s kontuko toot-en babes-kopia - Egin %1$s(r)en jakinarazpenen babes-kopia %1$s toot inportatu dira %1$s jakinarazpen berri inportatu dira @@ -471,18 +408,14 @@ Ziur betiko ezabatu nahi duzula zerrenda hau? Ez dago ezer zerrenda honetan. Zerrenda honetako kideek mezu berriak bidaltzean, hemen agertuko dira. Gehitu zerrendara - Kendu zerrendatik Gehitu zerrenda Ezabatu zerrenda Editatu zerrenda Zerrenda berriaren izena - Bilatu jarraitzen duzun jendearen artean - Zure zerrendak Kontua zerrendara gehitu da! Ez duzu zerrendarik oraindik! %1$s %2$s(e)ra mugitu da - Erakutsi bultzada/gogoko kopurua Autentifikazioa ez dabil? Hona lagundu dezaketen egiaztaketa batzuk:\n\n - Egiaztatu ez dagoela akatsik instantziaren izenean\n\n @@ -499,25 +432,19 @@ %1$s toot esportatu dira %2$stik. Zerbait ez da behar bezala joan %1$s(e)ko datuak esportatzean Zerbait ez da behar bezala joan datuak esportatzean! - Datuak inportatu dira! Zerbait ez da behar bezala joan datuak inportatzean! Proxya - Mota Gaitu proxya? Ostalaria Ataka Saioa Pasahitza - Itxura: - Modu trinkoa Gehitu toot-aren xehetasunak partekatzean Babestu aplikazioa Liberapay bidez Errore bat dago adierazpen erregularrean! - Konturik ez oraindik? Ez da denbora-lerrorik aurkitu instantzia honetan! Ezabatu instantzia hau? - %s ezabatuko duzu jarraitutako instantzietatik. Itzuli Jarraitu instantzia Dagoeneko jarraitzen duzu instantzia hau! @@ -526,10 +453,8 @@ Informazioa Ezkutatu %s(r)en bultzadak Nabarmendu profilean - Ezkutatu %s(r) guztia Erakutzi %s(r)en bultzadak Ez nabarmendu profilean - Erakutsi %s(r) guztia Kontu hau orain profilean nabarmentzen da Kontu hau ez da jada profilean nabarmentzen Bultzadak orain erakusten dira! @@ -550,7 +475,6 @@ Iragazkien testuinguruak Iragazkia aplikatzeko testuinguru bat edo gehiago Iraungitze data - Gehitu iragazki berria Ezabatu iragazkia? Eguneratu iragazkia Sortu iragazkia @@ -565,13 +489,11 @@ Kontuak zerrendara gehitu dira Kontuak zerrendara gehitzen Ez duzu zerrendarik gehitu oraindik. Sakatu \"+\" botoia berri bat gehitzeko. - Ez duzu urruneko instantziarik jarraitzen. Sakatu \"+\" botoia berri bat gehitzeko. Nor jarraitu Trunk APIa Ezin da/dira kontua/k jarraitu Urruneko kontua eskuratzen Hedatu automatikoki ezkutatutako multimedia - Erakutsi instantziak jarraitzeko botoia Jarraipen berria Bultzada berria Gogoko berria @@ -596,7 +518,6 @@ Urruneko mezua jasotzen Iruzkina Peertube instantzia - Bistaratu mezu pribatuen denbora-lerroa Izan bideo honetan iruzkin bat uzten lehena goian eskuinean dagoen botoiarekin! %s ikustaldi Iraupena: %s @@ -608,10 +529,6 @@ Bideoa gogokoetatik kendu da! Ez dago Peertubeko bideorik gogokoetan! Kanala - Peertubeko kanalik ez - Peertube instantziarik ez - Mastodon instantziarik ez - Zerrendarik ez Bideoak Kanalak Erabili Emoji One @@ -619,12 +536,7 @@ Erakutsi aurrebistak toot guztietan Interfazearen diseinatzaile berria Erakutsi bideoen aurrebista - Gitlab euskarria - Akats txostena - Ez dago e-mail bezerorik instalatuta. - Bidali akats txostena Kontuaren id-a arbelera kopiatu da! - Bateriaren optimizazioa Aldatu hizkuntza Lehenetsitako hizkuntza Moztu toot luzeak @@ -636,7 +548,6 @@ Etiketa gorde da! Etiketa aldatu da! Etiketa ezabatu da! - Bistaratu arte denbora-lerroa Programatu bultzada Bultzada programatu da! Ez dago programatutako bultzadarik bistaratzeko! @@ -675,11 +586,7 @@ Idazten hasi zaitezke eta izenak proposatuko zaizkizu.\n\n ⚠ Konektatu botoiak instantzia baliogarria bada eta martxan badago funtzionatuko du, bestela ez! - Eremu honetan, idatzi zure Mastodon kontura lotutako e-mail helbidea. - - Azken urratsa zure pasahitza sartzea da eta Hasi saioa botoia sakatzea. Informazio gehiago - 2FA (bi faktoreetako autentifikazioa) erabiltzen baduzu, esteka hau erabili behar duzu.\nHemen zure kredentzialak sartu nahi ez badituzu erabili dezakezu baita ere. Hizkuntzak Multimedia besterik ez @@ -691,16 +598,13 @@ Bota Pixelfed instantzia Mastodon instantzia - Pixelfed instantziarik ez Hauetako edozein Hauek guztiak Hauetako bat ere ez Hitz hauetako edozein (zuriunez banatuta) Hitz hauek guztiak (zuriunez banatuta) - Hitz hauetako bat ere ez (zuriunez banatuta) Gehitu iragazi beharreko hitzak (zuriuneekin bereizita) Aldatu zutabearen izena - Misskey instantziarik ez Misskey instantzia Ez dago esteka hau onartzen duen aplikaziorik zure gailuan instalatuta. Harpidetzak @@ -717,7 +621,6 @@ Hautatu igo nahi duzun fitxategia Nire bideoak Izenburua - Kategoriak Lizentzia Kategoria Hizkuntza @@ -732,14 +635,10 @@ Sakatu hemen bideoaren datuak editatzeko. Ezabatu bideoa Bideo hau ezabatu nahi duzula ziur al zaude? - Oraindik ez duzu bideorik igo! Erakutsi bideo hunkigarriak - %s kanal lehenetsia Ez dago bideorik bistaratzeko! - Gehitu multimedia gogokoetara Egin iruzkin bat Partekatu - Nire irudiak Hautatu programazio modua Gailutik Zerbitzaritik @@ -747,12 +646,8 @@ Tootak (gailua) Aldatu Erakutsi toot berriak \"jaso gehiago\" botoiaren gainetik - Berrespenak Denbora-lerroak - Jakinarazpen zerbitzua Interfazea - Eduki ezkutua - Idazten Kontaktuak %1$s erabiltzaileak zure %2$s bideoan iruzkina egin du]]> %1$s erabiltzaileak zure %2$s kanala jarraitzen du]]> @@ -767,7 +662,6 @@ Inportatu datuak Hautatu inportatu beharreko fitxategia Errore bat gertatu da babes-kopia fitxategi bat hautatzean! - Ez hil aplikazioa prozesatzen dagoela. Ez du hain luze hartuko. Gehitu iruzkin publikoa Bidali iruzkina Ez dago Internet konexiorik. Zure mezua zirriborroetan gorde da. @@ -808,18 +702,14 @@ amaiera: %s Freskatu inkesta Eman botoa - Ezin da inkesta bat txertatu mezu zuen batean! Zuk erantzun duzun inkesta bat bukatu da Zuk bidalitako inkesta bat amaitu da Pertsonalizatu Kategoriak - Berriak Denbora tartea Aurreratua Erakutsi \'berria\' ikurra irakurri gabeko toot-etan - Erakutsi Peertube debora-lerroa Peertube - Ezkutatu fitxa Aldatu denbora-lerroa lekuz Ezkutatu denbora-lerroa Antolatu denbora-lerroak @@ -829,10 +719,8 @@ Desegin Bi fitxa ikusgai mantendu behar dituzu! Antolatu denbora-lerroak - Erabili zerrenden sarrera zerrenda hau ezabatzeko! Denbora-lerro nagusiak ezkutatu besterik ezin dira egin! BBCode - Gehitu denbora-lerro bat Beti markatu multimedia mingarri gisa GNU instantzia Cachean gordetako mezua @@ -847,14 +735,11 @@ Historiala Erreprodukzio-zerrendak Pantaila-izena - Pribatutasuna - Sortu Ez duzu erreprodukzio-zerrendarik. Sakatu \'+\' ikonoa erreprodukzio-zerrenda berria gehitzeko Pantaila-izen bat eman behar duzu! Kanala beharrezkoa da erreprodukzio-zerrenda publikoa bada. Sortu erreprodukzio-zerrenda Ez dago ezer erreprodukzio-zerrenda honetan oraindik. - Editatu multimedia berregin Galeria Emoji @@ -862,7 +747,6 @@ Ezabagailua Testua Iragazi - Doitu Brotxa Ziur al zaude irudia gorde gabe atera nahi duzula? Baztertu @@ -870,7 +754,6 @@ Irudia ongi gorde da! Huts egin du irudia gordetzean Opakutasuna - Moztu Gaitu argazki-editorea Gehitu elementu bat inkestara Kendu inkestako azken elementua @@ -882,10 +765,8 @@ Denbora baterako mutututa Aipatu kontua Freskatu cachea - Ikusi nork eman dion bultzada eta nork gehitu duen gogokoetara Aipatu mezua Berriak - Bistaratu berriak Fedilab kontutik Orokorra Eskualdekoa Artea @@ -929,7 +810,6 @@ Berriro konektatu kontua Aplikazioak huts egin du administrazio ezaugarriak atzitzean. Kontua berriro konektatu behar zenezake ingurune egokia izateko. Ebatzi gabe - Ebatzita Urrunekoa Aktiboa Egiteke @@ -945,7 +825,6 @@ Desgaitu Isilarazi Jakinarazi erabiltzaileari e-mail bidez - Burutu ekintza Abisu pertsonalizatua Erabiltzailea Moderatzailea @@ -977,7 +856,6 @@ Edukia hutsik! Bistaratu Fedilaben ezaugarrien botoia Aplikazioak audioa grabatzeko baimena behar du - Errore bat gertatu da ahots-mezua grabatzean! Ahots-mezua Gaitu erantzun azkarra Erantzuten ari zaren kontuak agian ez du zure mezua ikusiko! @@ -985,9 +863,7 @@ Desgaituta badago, multimedia hunkigarria botoi batekin ezkutatuko da Gorde multimedia tamaina osoan aurrebistetan luze sakatuz Gehitu botoi bat goi-eskuin erpinean etiketa, instantzia eta zerrenda guztiak erakusteko - Bistaratu elementu bat menu nagusian #Fedilab etiketa erakusten duen denbora-lerrora sarbide azkarra izateko Mantendu konexio bat irekita API jariora zuzeneko jakinarazpenetarako. - Aplikazioa bigarren planoan dagoenean, API jariora konexio bat mantenduko du. Desgaitu bateriak arduratzen bazaitu. Denbora tarte horretan aplikazioak jakinarazpenak igorriko ditu. Denbora tartea alderantzikatu dezakezu (adib. isildu) eskuineko kontrolarekin. Bistaratu Fedilab botoi bat profilaren argazkiaren azpian. Aplikazio barneko ezaugarriak atzitzeko lasterbide bat da. Baimendu denbora-lerroetan zuzenean mezuen azpian erantzutea @@ -999,9 +875,6 @@ Etiketa hauek profilen mezuak iragaztea ahalbidetzen dute. Laster-menua erabili beharko duzu hauek ikusteko. Txertatu lerro saltoa automatikoki aipamenaren ostean lehen hitza letra larriz jartzeko Ahalbidetu eduki sortzaileei mezuak bere RSS jarioen bidez partekatzea - Denbora-lerroak - Interfazea - Bateria Idazketa Gehieneko saiakera kopurua multimedia igotzean Sortu karpeta berria hemen @@ -1012,9 +885,7 @@ Direktorio lehenetsia Karpeta Sortu karpeta - Erabili zure gogoko nabigatzailea aplikazio barruan. Desgaitzen bada, estekak kanpoan irekiko dira Bistaratu laster-jakinarazpen bat ekintzaren bat burutu eta gero (bultzada, gogokoa, eta abar)? - Esportatu mutututako instantziak Mutututako instantziak esportatu dira! Gehitu instantzia bat Esportatu instantziak @@ -1109,7 +980,6 @@ Sartu zure ostalari pertsonalizatua edo laga hutsik nitter.net erabiltzeko Ezkutatu Fedilab jakinarazpen-barra Egoera barran geratzen den jakinarazpena ezkutatzeko, sakatu begiaren ikonoa eta desmarkatu \"Erakutsi egoera-barran\" - Gaitu atzeratutako jakinarazpenak Jakinarazpenak 30 segundo atzeratuko dira. Honela bateria gutxiago erabiliko da. Zuzeneko jakinarazpenak atzeratuak Zuzeneko jakinarazpenik ez @@ -1135,7 +1005,6 @@ Bideoaren izenburua Elkartu Peertube-ra 16 urte edo gehiago ditut eta instantzia honen %1$s onartzen ditut - Koloreak Estekak Aldatu mezuetako esteken koloreak (URL-ak, aipamenak, etiketak, eta abar) Bultzaden goiburua @@ -1147,15 +1016,12 @@ Berrezarri Ikonoak Denbora-lerroen azpialdeko botoien kolorea - Atzealdea - Aldatu denbora-lerroen atzealdearen kolorea Finkatu etiketa hau Instantziaren logoa Editatu profila Burutu ekintza bat Itzulpena Irudiaren aurrebista - Change the theme Text color Change the text color in pots Apply changes diff --git a/app/src/main/res/values-fa/strings.xml b/app/src/main/res/values-fa/strings.xml index b56f20d12..1f16250ec 100644 --- a/app/src/main/res/values-fa/strings.xml +++ b/app/src/main/res/values-fa/strings.xml @@ -1,5 +1,4 @@ - - + باز کردن منو بستن منو @@ -16,8 +15,6 @@ لغو بارگیری بارگیری %1$s - بارگیری کامل شد - ذخیره %1$s رسانه، ذخیره شد پرونده: %1$s گذرواژه @@ -25,10 +22,8 @@ حساب‌ها بوق‌ها برچسب‌ها - توکن ذخیره بازگردانی - احراز هویت دو مرحله‌ای؟ بی نتیجه! نمونه نمونه: mastodon.social @@ -39,10 +34,7 @@ تغییر دادن انتخاب تصویر... پاک‌سازی - میکروفن دوربین - لطفاً چیزی بگویید - متاسفم! دستگاه شما از ورودی صدا پشتیبانی نمی‌کند! حذف همه ترجمه این بوق. زمان‌بندی @@ -59,7 +51,6 @@ پاسخ‌ها نام کاربری پیش‌نویس‌ها - New data are available! Do you want to display them? پسندها دنبال‌کننده‌های جدید اشاره‌ها @@ -78,18 +69,12 @@ ارتباطات Muted users Blocked users - Remote follow اعلان‌ها درخواست پیگیری - بهینه‌سازی تنظیمات - نمایه - چه کار می‌خواهید بکنید؟ حذف یک حساب حذف حساب %1$s از برنامه؟ فرستادن یک رایانامه - لطفا پرونده‌ای را انتخاب کنید - هیچ مرورگر پرونده‌ای یافت نشد! برای تغییر مسیر، روی آن کلیک کنید ناموفق! بوق‌های زمان‌بندی شده @@ -99,10 +84,6 @@ اعلان‌های زنده بوقی برای نمایش نیست - این بوق به پسندیده‌ها اضافه شد - این بوق از پسندیده‌ها حذف شد! - این بوق تقویت شد! - این بوق دیگر تقویت نشده است! تقویت شده توسط %1$s Add this toot to your favourites? Remove this toot from your favourites? @@ -134,10 +115,6 @@ این بوق پاک شود؟ این بوق پاک و بازنویسی شود؟ - - %d پاسخ - %d پاسخ - نشانک‌ها افزودن به نشانک‌ها حذف نشانک @@ -159,7 +136,6 @@ Reply to a toot Write a queet Reply to a queet - You have reached the 500 characters allowed! Select a media An error occurred while selecting the media! Delete this media? @@ -193,7 +169,6 @@ Translation of toots: Search instances: Icon designer: - Banner designer: Conversation @@ -223,15 +198,10 @@ boosted your status favourited your status followed you - New toot from %1$s and another notification and %d other notifications - - and another toot to discover - and %d other toots to discover - %d like %d likes @@ -267,7 +237,6 @@ The instance domain does not seem to be valid! An error occurred while switching between accounts! An error occurred while searching! - Can not log in! The profile data have been saved! No action can be taken The media has been saved! @@ -276,12 +245,8 @@ Draft saved! Are you sure this instance allows this number of characters? Usually, this value is close to 500 characters. Visibility of the toots has been changed for the account %1$s - Instance name and screen name cannot be blank! - Optimisation of loading Number of toots per load - Number of accounts per load - Number of notifications per load Always WIFI Ask @@ -290,13 +255,9 @@ Show more… Show less… Sensitive content - Display previous message in responses - Display local timeline - Display federated timeline Disable GIF avatars Path: Save drafts automatically - Display counters Add URL of media in toots Notify when someone follows you Notify when someone boosts your status @@ -308,7 +269,6 @@ Notify in WIFI only Notify? Silent Notifications - Night mode NSFW view timeout (seconds, 0 means off) Edit profile Custom sharing @@ -332,12 +292,6 @@ Enable Javascript Automatically expand cw Allow third-party cookies - Layout for timelines: - - Tabs - Menu - Tabs and menu - Yandex DeepL @@ -349,15 +303,6 @@ Light Black - - No - 512 Kb - 1 Mb - 2 Mb - 4 Mb - 6 Mb - 8 Mb - Set LED colour: Blue @@ -368,13 +313,9 @@ Yellow White - Notify for new toots on the home timeline Follow - Unfollow - Block Unblock Mute - No action Unmute Request sent Follows you @@ -387,8 +328,6 @@ Please, confirm push notifications that you want to receive. You can enable or disable these notifications later in settings (Notifications tab). - For unread toots in home time-line? - For unread notifications? Clear cache There are %1$s of data in cache.\n\nWould you like to delete them? @@ -398,7 +337,6 @@ Title Title… Description - Description… Keywords Keywords… @@ -415,7 +353,6 @@ Show pinned No matching result found! Backup toots for %1$s - Backup notifications for %1$s %1$s new toots have been imported %1$s new notifications have been imported @@ -471,18 +408,14 @@ Are you sure you want to permanently delete this list? There is nothing in this list yet. When members of this list post new statuses, they will appear here. Add to list - Remove from list Add list Delete list Edit list New list title - Search among people you follow - Your lists The account was added to the list! You don\'t have any lists yet! %1$s has moved to %2$s - Show boosts/favourites count Authentication does not work? Here are some checks that might help:\n\n - Check there is no spelling mistakes in the instance name\n\n @@ -499,25 +432,19 @@ %1$s toots out of %2$s have been exported. Something went wrong when exporting data for %1$s Something went wrong when exporting data! - Data have been imported! Something went wrong when importing data! Proxy - Type Enable proxy? Host Port Login Password - Theme: - Compact mode Add toot details when sharing Support the app on Liberapay There is an error in the regular expression! - No account yet? No timelines was found on this instance! Delete this instance? - You are going to delete %s from your followed instances. Translate in Follow instance You already follow this instance! @@ -526,10 +453,8 @@ Information Hide boosts from %s Feature on profile - Hide everything from %s Show boosts from %s Don\'t feature on profile - Show everything from %s The account is now featured on profile The account is no longer featured on profile Boosts are now shown! @@ -550,7 +475,6 @@ Filter contexts One or multiple contexts where the filter should apply Expire after - Add New Filter Delete filter? Update filter Create filter @@ -565,13 +489,11 @@ Accounts were added to the list Adding accounts to the list You have not created a list yet. Tap on the \"+\" button to add a new one. - You don\'t follow any remote instances. Tap on the \"+\" button to add a new one. Who to follow Trunk API Account(s) can\'t be followed Fetching remote account Automatically expand hidden media - Display follow instances button New follow New Boost New Favourite @@ -596,7 +518,6 @@ Fetching remote status Comment Peertube instance - Display private messages timeline Be the first to leave a comment on this video with the top right button! %s views Duration: %s @@ -608,10 +529,6 @@ این ویدیو از نشانک‌ها پاک شده است! There is no Peertube videos in your favourites! Channel - No Peertube channels - No Peertube instances - No Mastodon instances - No lists Videos Channels Use Emoji One @@ -619,12 +536,7 @@ Display previews in all toots New UX/UI designer Display video previews - Gitlab Support - Bug Report - There are no email clients installed. - Send a bug report The account id has been copied in the clipboard! - Optimization of the battery Change the language Default language Truncate long toots @@ -636,7 +548,6 @@ The tag has been stored! The tag has been changed! The tag has been deleted! - Display Art timeline Schedule boost The boost is scheduled! No scheduled boost to display! @@ -675,12 +586,7 @@ You can start writing first letters and names will be suggested.\n\n ⚠ The Login button will only work if the instance name is valid and the instance is up! - In this field, write the email that is attached to your Mastodon account. - - Last step is to enter your password and click on Login. - More information - If you use 2FA (Two-factor authentication), you need to use this link.\nYou can also use it if you do not want to enter your credentials here. Languages Media only @@ -692,16 +598,13 @@ Bot Pixelfed instance Mastodon instance - No Pixelfed instances Any of these All of these None of these Any of these words (space-separated) All these words (space-separated) - None of these words (space-separated) Add some words to filter (space-separated) Change column name - No Misskey instances Misskey instance No app supporting this link is installed on your device. Subscriptions @@ -718,7 +621,6 @@ Select the file to upload My videos Title - Categories License Category Language @@ -733,14 +635,10 @@ Tap here to edit the video data. Delete video Are you sure to delete this video? - No videos uploaded yet! Display NSFW videos - Default %s channel No videos to display! - Add media to favorites Leave a comment Share - My pictures Choose a schedule mode From device From server @@ -748,12 +646,8 @@ Toots (Device) Modify Display new toots above the \"Fetch more\" button - Confirmations Timelines - Notification service Interface - Hidden content - Composing Contacts %1$s commented your video %2$s]]> %1$s is following your channel %2$s]]> @@ -768,7 +662,6 @@ Import Data Select the file to import An error occurred when selecting the backup file! - Please, don\'t kill the app while processing. That can\'t be quite long. Add a public comment Send comment There is no Internet connection. Your message has been stored in drafts. @@ -809,18 +702,14 @@ end at %s Refresh poll Vote - A poll cannot be attached to a direct message! A poll you have voted in has ended A poll you tooted has ended Customize Categories - News Time slot Advanced Display \'new\' badge on unread toots - Display Peertube timeline Peertube - Hide the tab Move timeline Hide timeline Reorder timelines @@ -830,10 +719,8 @@ Undo You need to keep two visible tabs! Reorder timelines - Use the lists entry for deleting this list! Main timelines can only be hidden! BBCode - Add a timeline Always mark media as sensitive GNU instance Cached status @@ -848,14 +735,11 @@ History Playlists Display name - Privacy - Create You don\'t have any playlists. Tap on the \"+\" icon to add a new playlist You must provide a display name! The channel is required when the playlist is public. Create a playlist There is nothing in this playlist yet. - Edit media redo Gallery Emoji @@ -863,7 +747,6 @@ Eraser Text Filter - Adjust Brush Are you sure you want to exit without saving the image? Discard @@ -871,7 +754,6 @@ Image Saved Successfully! Failed to save Image Opacity - Crop Enable photo editor Add a poll item Remove last poll item @@ -883,10 +765,8 @@ Timed mute Mention the account Refresh cache - See who boosted and added to favorites Mention the status News - Display news from Fedilab\'s account General Regional Art @@ -930,7 +810,6 @@ Reconnect the account The application failed to access the admin features. You might need to reconnect the account for having the correct scope. Unresolved - Resolved Remote Active Pending @@ -946,7 +825,6 @@ Disable Silence Notify the user per e-mail - Perform action Custom warning User Moderator @@ -978,7 +856,6 @@ Empty content! Display Fedilab features button The application needs to access audio recording - An error occurred when recording the voice message! Voice message Enable quick reply The account you are replying might not see your message! @@ -986,9 +863,7 @@ If disabled, sensitive media will be hidden with a button Store media in full size with a long press on previews Add an ellipse button at the top right for listing all tags/instances/lists - Display an item in the main menu for a quick access to the timeline targeting #Fedilab tag Keep an open connection to the streaming API for live notifications. - When the app is in background, it will keep a connection to the streaming API. Disable it if you care about your battery. During the time slot, the app will send notifications. You can reverse (ie: silent) this time slot with the right spinner. Display a Fedilab button below profile picture. It is a shortcut for accessing in-app features. Allow to reply directly in timelines below statuses @@ -1000,9 +875,6 @@ These tags will allow to filter statuses from profiles. You will have to use the context menu for seeing them. Automatically insert a line break after the mention to capitalize the first letter Allow content creators to share statuses to their RSS feeds - Timelines - Interface - Battery Compose Maximum retry times when uploading media Create a new Folder here @@ -1013,9 +885,7 @@ Default Directory Folder Create folder - Use your favourite browser inside the application. By disabling, links will be opened externally Display a toast message after an action has been completed (boost, fav, etc.)? - Export muted instances Muted instances have been exported! Add an instance Export instances @@ -1111,7 +981,6 @@ Enter your custom host or leave blank for using nitter.net Hide Fedilab notification bar For hiding the remaining notification in the status bar, tap on the eye icon button then uncheck: \"Display in status bar\" - Enable delayed notifications Notifications will be delayed every 30 seconds. That will allow to drain less battery. Live notifications delayed No live notifications @@ -1137,7 +1006,6 @@ Title for the video Join Peertube I am at least 16 years old and agree to the %1$s of this instance - Colors Links Change the color of links (URLs, mentions, tags, etc.) in messages Reblogs header @@ -1149,15 +1017,12 @@ Reset Icons Color of bottom icons in timelines - Background - Change the background color for timelines Pin this tag Logo of the instance Edit profile Make an action Translation Image preview - Change the theme Text color Change the text color in pots Apply changes diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 0365d695b..4fe1424bf 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -1,5 +1,4 @@ - - + Ouvrir le menu Fermer le menu @@ -16,8 +15,6 @@ Annuler Télécharger Télécharger %1$s - Téléchargement terminé - Sauvegarder %1$s Enregistrement terminé Fichier : %1$s Mot de passe @@ -25,10 +22,8 @@ Comptes Pouets Étiquettes - Jeton Sauvegarder Restaurer - Authentification en deux étapes ? Aucun résultat ! Instance Instance : mastodon.social @@ -39,10 +34,7 @@ Changer Sélectionnez une photo… Nettoyer - Microphone Appareil photo - Veuillez dire quelque chose - Désolé ! Votre appareil ne supporte pas la commande vocale ! Tout effacer Traduire ce pouet. Programmer @@ -59,7 +51,6 @@ Réponses Nom d’utilisateur Brouillons - De nouvelles données sont disponibles ! Souhaitez-vous les afficher ? Favoris Nouveaux⋅elles abonné⋅e⋅s Mentions @@ -78,18 +69,12 @@ Communication Utilisateurs en sourdine Utilisateurs bloqués - Suivre à distance Notifications Demandes d’abonnements - Optimisation Paramètres - Profil - Que souhaitez-vous faire ? Supprimer un compte Supprimer le compte %1$s de l’application ? Envoyer un Email - Veuillez sélectionner un fichier - Aucun explorateur de fichiers trouvé ! Cliquer sur le chemin pour le changer Erreur ! Pouets programmés @@ -99,10 +84,6 @@ Notifications en direct Aucun pouet à afficher ! - Pouet ajouté aux favoris ! - Pouet supprimé des favoris ! - Le pouet a été partagé ! - Pouet supprimé du partage ! Partagé par %1$s Ajouter ce pouet aux favoris ? Supprimer ce pouet des favoris ? @@ -134,10 +115,6 @@ Supprimer ce pouet ? Supprimer & réécrire ce pouet ? - - %d réponse - %d réponses - Signets Ajouter aux signets Supprimer le signet @@ -159,7 +136,6 @@ Répondre à un pouet Rédiger un queet Répondre à un queet - Vous avez atteint les 500 caractères autorisés ! Sélectionnez un média Une erreur s’est produite lors de la sélection du média ! Supprimer le média ? @@ -193,7 +169,6 @@ Traduction des pouets : Recherche d’instances : Concepteur de l’icône : - Concepteur de la bannière : Conversation @@ -223,15 +198,10 @@ a partagé votre pouet a ajouté votre pouet à ses favoris vous suit - Nouveau pouet de %1$s et %d autre notification et %d autres notifications - - et %d autre pouet à découvrir - et %d autres pouets à découvrir - %d aime %d aimes @@ -267,7 +237,6 @@ Le nom de l’instance ne semble pas être valide ! Une erreur s’est produite pendant le chargement du compte ! Une erreur s’est produite lors de la recherche ! - Impossible de vous connecter ! Les données du profil ont été sauvegardées ! Aucune action ne peut être réalisée Le média a été enregistré ! @@ -276,12 +245,8 @@ Brouillon enregistré ! Êtes-vous sûr que cette instance autorise ce nombre de caractères ? Habituellement, cette valeur est proche de 500 caractères. La visibilité des pouets a été changée pour le compte %1$s - Il faut renseigner une instance et un nom d’utilisateur ! - Optimisation du chargement Nombre de pouets par chargement - Nombre de comptes par chargement - Nombre de notifications par chargement Toujours WIFI Demander @@ -290,13 +255,9 @@ Afficher le contenu ? Afficher moins… Charger les images sensibles - Afficher le message précédent lors d’une réponse - Afficher le fil local - Afficher le fil public Désactiver l’animation des avatars Destination : Enregistrer les brouillons automatiquement - Afficher les compteurs Ajouter l’URL des médias dans les pouets Notifier lorsque quelqu’un me suit Notifier lorsque quelqu’un partage mes pouets @@ -308,7 +269,6 @@ Notifier en WIFI seulement Notifier ? Utiliser le vibreur - Mode nuit Délai d’affichage NSFW (en secondes, 0 signifie aucun délai) Modifier le profil Partage personnalisé @@ -332,12 +292,6 @@ Activer Javascript Afficher automatiquement le contenu masqué Autoriser les cookies tiers - Disposition des fils : - - Onglets - Menu - Onglets et menu - Yandex DeepL @@ -349,15 +303,6 @@ Clair Noir - - Non - 512 Ko - 1 Mo - 2 Mo - 4 Mo - 6 Mo - 8 Mo - Couleur de la LED : Bleu @@ -368,13 +313,9 @@ Jaune Blanc - Notifier lors de nouveaux pouets sur la page d’accueil Suivre - Se désabonner - Bloquer Débloquer Masquer - Aucune action Afficher Demande envoyée Vous suit @@ -387,8 +328,6 @@ Veuillez confirmer les notifications que vous souhaitez recevoir. Vous pourrez les activer ou les désactiver plus tard dans les paramètres (onglet Notifications). - Pour les pouets non lus sur la page d’accueil - Pour les notifications non lues ? Nettoyage du cache Il y a %1$s de données en cache.\n\nSouhaitez-vous les supprimer ? @@ -398,7 +337,6 @@ Titre Titre… Description - Description… Mots clés Mots clés… @@ -415,7 +353,6 @@ Pouets épinglés Aucun résultat avec ce filtre ! Sauvegarde des pouets pour %1$s - Sauvegarde des notifications pour %1$s %1$s nouveaux pouets ont été importés %1$s nouvelles notifications ont été importées @@ -470,18 +407,14 @@ Êtes-vous sûr de vouloir supprimer définitivement cette liste ? Il n’y a rien dans cette liste pour l’instant. Ajouter à la liste - Supprimer de la liste Ajouter une liste Supprimer la liste Modifier la liste Titre de la nouvelle liste - Rechercher parmi les gens que vous suivez - Vos listes Le compte a été ajouté à la liste ! Vous n’avez pas encore de listes ! %1$s a été déplacé vers %2$s - Afficher le nombre de partages/favoris Problème de connexion ? Voici quelques vérifications qui pourraient aider : \n\n - Vérifier qu’il n’y a pas d’erreur dans le nom de l’instance\n\n @@ -497,25 +430,19 @@ %1$s pouets sur %2$s ont été exportés. Une erreur est survenue lors de l’exportation des pouets pour %1$s Quelque chose a mal tourné lors de l’exportation de données ! - Les données ont été importées ! Quelque chose a mal tourné lors de l’importation de données ! Proxy - Type Activer le proxy ? Serveur Port Identifiant Mot de passe - Thème : - Mode compact Ajouter les détails du pouet en le partageant Soutenir l’app sur Liberapay Il y a une erreur dans l’expression régulière ! - Vous n’avez pas encore de compte ? Aucun fil n’a été trouvé sur cette instance ! Désirez-vous effacer cette instance ? - Vous êtes sur le point de supprimer %s des instances suivies. Traduire en Suivre l’instance Vous suivez déjà cette instance ! @@ -524,10 +451,8 @@ Information Masquer les boosts de %s Recommander - Tout masquer venant de %s Afficher les boosts de %s Ne pas recommander - Tout afficher venant de %s Ce compte est maintenant recommandé sur votre profil Ce compte n’est plus recommandé sur votre profil Les boosts sont maintenant masqués ! @@ -548,7 +473,6 @@ Contextes du filtre Un ou plusieurs contextes où le filtre devrait s’appliquer Expire après - Ajouter un nouveau filtre Supprimer le filtre ? Mettre à jour le filtre Créer un filtre @@ -563,13 +487,11 @@ Les comptes ont été ajoutés à la liste Ajout des comptes dans la liste Vous n\'avez pas encore créé de liste. Cliquez sur le bouton \"+\" pour en ajouter une. - Vous ne suivez aucune instance. Cliquez sur le bouton \"+\" pour en ajouter une. Comptes suggérés API Trunk Abonnement impossible au(x) compte(s) Recherche du compte distant Étendre automatiquement les médias cachés - Afficher le bouton de suivi d’instances Nouvel abonnement Nouveau partage Nouveau Favori @@ -594,7 +516,6 @@ Récupération du statut distant Commenter Instance PeerTube - Afficher le fil des messages privés Soyez le·a premier·ère à laisser un commentaire sur cette vidéo en utilisant le bouton supérieur droit ! %s vues Durée : %s @@ -606,10 +527,6 @@ La vidéo a été retirée de vos favoris ! Il n’y a aucune vidéo Peertube dans vos favoris ! Chaîne - Aucune chaîne PeerTube - Aucune instance PeerTube - Aucune instance Mastodon - Aucune liste Vidéos Chaînes Utiliser les EmojiOne @@ -617,12 +534,7 @@ Afficher les aperçus dans tous les pouets Nouveau·lle UX/UI Designer·use Afficher les aperçus des vidéos - Support de Gitlab - Signaler un bogue - Aucun client de messagerie n’est installé. - Envoyer un rapport de bogue L’ID du compte été copié vers le presse-papiers ! - Optimisation de la batterie Changer de langue Langue par défaut Tronquer les longs pouets @@ -634,7 +546,6 @@ L’étiquette a été restaurée ! L’étiquette a été modifiée ! L’étiquette a été supprimée ! - Afficher le fil artistique Programmer un boost Le boost est programmé ! Aucun boost programmé à afficher ! @@ -672,12 +583,7 @@ Renseignez le nom de domaine de votre instance dans ce champs.\nPar exemple, si vous avez créé un compte sur https://mastodon.social\nécrivez simplement mastodon.social(sans le https://)\n Commencez à saisir les premières lettres et des domaines vous seront suggérés. \n\n Le bouton de connexion s’activera une fois qu’un domaine valide sera renseigné et que l’instance est active ! - Dans ce champs, saisissez l’adresse de courrier relative à votre compte Mastodon et/ou Pleroma. - - Dernière étape consiste à saisir votre mot de passe puis cliquer sur « Connexion ». - Plus d’informations - Si vous utilisez 2FA (authentification à deux facteurs), vous devez utiliser ce lien. \nVous pouvez également l’utiliser si vous ne souhaitez pas saisir vos identifiants ici. Langues Médias seulement @@ -689,16 +595,13 @@ Le bouton de connexion s’activera une fois qu’un domaine valide sera renseig Robot Instance PixelFed Instance Mastodon - Aucune instance PixelFed N’importe lequel Tous Aucun N’importe lequel de ces mots (séparés par des espaces) Tous ces mots (séparés par des espaces) - Aucun de ces mots (séparés par des espaces) Ajouter quelques mots à filtrer (séparés par un espace) Renommer la colonne - Aucune instance Misskey Instance Misskey Aucune application prenant en charge ce lien n’est installée sur votre appareil. Abonnements @@ -715,7 +618,6 @@ Le bouton de connexion s’activera une fois qu’un domaine valide sera renseig Sélectionnez un fichier à transférer Mes vidéos Titre - Catégories Licence Catégorie Langue @@ -730,14 +632,10 @@ Le bouton de connexion s’activera une fois qu’un domaine valide sera renseig Cliquez ici pour éditer les données de la vidéo. Supprimer la vidéo Êtes-vous sûr de vouloir supprimer cette vidéo ? - Aucune vidéo n’a encore été transférée ! Afficher les vidéos sensibles - Chaîne par défaut de %s Aucune vidéo n’est disponible ! - Ajouter le média aux favoris Laisser un commentaire Partager - Mes images Choisissez un mode pour la planification Depuis l’appareil Depuis le serveur @@ -745,12 +643,8 @@ Le bouton de connexion s’activera une fois qu’un domaine valide sera renseig Pouets (Appareil) Modifier Afficher les nouveaux pouets au-dessus du bouton « Afficher le contenu ? » - Confirmations Les fils - Service des notifications Interface - Contenu masqué - Rédaction Contacts %1$s a commenté votre vidéo %2$s]]> %1$s suit votre chaîne %2$s]]> @@ -765,7 +659,6 @@ Le bouton de connexion s’activera une fois qu’un domaine valide sera renseig Importer les données Sélectionner le fichier à importer Une erreur s’est produite lors de la sélection du fichier de sauvegarde ! - S’il vous plaît, ne tuez pas l’application pendant le traitement. Il ne sera pas très long. Ajouter un commentaire public Envoyer un commentaire Il n’y a pas de connexion Internet. Votre message a été stocké dans les brouillons. @@ -806,18 +699,14 @@ Le bouton de connexion s’activera une fois qu’un domaine valide sera renseig fin à %s Actualiser le sondage Voter - Un sondage ne peut pas être attaché à un message direct ! Un sondage auquel vous avez participé est maintenant terminé Un sondage que vous avez publié est maintenant terminé Personnaliser Catégories - Actualités Créneau horaire Avancé Afficher le badge \'new\' sur les pouets non lus - Afficher le fil PeerTube PeerTube - Cacher l’onglet Déplacer le fil Cacher le fil Réorganiser les fils @@ -827,10 +716,8 @@ Le bouton de connexion s’activera une fois qu’un domaine valide sera renseig Annuler Vous devez garder deux onglets visibles ! Réorganiser les fils - Utilisez l\'entrée des listes pour supprimer cette liste ! Les fils principaux ne peuvent qu’être masqués ! BBCode - Ajouter un fil Toujours marquer le média comme sensible Instance GNU Statut en cache @@ -845,14 +732,11 @@ Le bouton de connexion s’activera une fois qu’un domaine valide sera renseig Historique Listes de lecture Nom d\'affichage - Confidentialité - Créer Vous n\'avez aucune liste de lecture. Cliquez sur l\'icône « + » pour en ajouter une Vous devez fournir un nom d\'affichage ! Un canal est requis lorsque la liste de lecture est publique. Créer une liste de lecture Cette liste de lecture est vide. - Modifier le média rétablir Galerie Émoji @@ -860,7 +744,6 @@ Le bouton de connexion s’activera une fois qu’un domaine valide sera renseig Gomme Texte Filtre - Ajuster Pinceau Êtes-vous sûr de vouloir quitter sans enregistrer l\'image ? Abandonner @@ -868,7 +751,6 @@ Le bouton de connexion s’activera une fois qu’un domaine valide sera renseig Image enregistrée avec succès ! Échec de l\'enregistrement de l\'image Transparence - Rogner Activer l\'éditeur d\'images Ajouter un élément de sondage Supprimer le dernier élément de sondage @@ -880,10 +762,8 @@ Le bouton de connexion s’activera une fois qu’un domaine valide sera renseig Temporairement muet Mentionner le compte Rafraîchir le cache - Voir qui a boosté et ajouté aux favoris Mentionner le statut Actualité - Afficher les nouvelles du compte de Fedilab Général Régional Art @@ -927,7 +807,6 @@ Le bouton de connexion s’activera une fois qu’un domaine valide sera renseig Reconnecter le compte L\'application n\'a pas accès aux fonctionnalités d\'administration. Vous devrez peut-être reconnecter le compte pour obtenir les autorisations nécessaires. Non résolu - Résolu Distant Actif En attente @@ -943,7 +822,6 @@ Le bouton de connexion s’activera une fois qu’un domaine valide sera renseig Désactiver Mettre en sourdine Notifier l\'utilisateur·rice par e-mail - Effectuer l\'action Avertissement personnalisé Utilsateur·rice Modérateur·rice @@ -975,7 +853,6 @@ Le bouton de connexion s’activera une fois qu’un domaine valide sera renseig Contenu vide ! Afficher le bouton des fonctionnalités de Fedilab L\'application a besoin d\'accéder à l\'enregistrement audio - Une erreur est survenue lors de l\'enregistrement du message vocal ! Message vocal Activer la réponse rapide Le compte auquel vous répondez ne peut voir votre message ! @@ -983,9 +860,7 @@ Le bouton de connexion s’activera une fois qu’un domaine valide sera renseig Si désactivé, les médias sensibles seront cachés avec un bouton Enregistre les médias en plein format lors d\'un appui long sur les prévisualisations Ajoute un bouton dans le coin supérieur droit pour lister tous les tags/instances/listes - Affiche un élément dans le menu principal pour un accès rapide au fil avec le tag #Fedilab Garde une connexion ouverte à l\'API de streaming pour les notifications en direct. - Lorsque l’application est en arrière-plan, elle gardera une connexion à l’API de streaming. Désactivez-la si vous vous souciez de votre batterie. Durant cette période de temps, l’application enverra des notifications. Vous pouvez inverser (i. e. : silencer) ce laps de temps à l’aide du sélecteur. Affiche un bouton Fedilab. C\'est un raccourci pour accéder aux fonctionnalités de l\'application. Permet de répondre directement dans les fils, en bas des statuts @@ -997,9 +872,6 @@ Le bouton de connexion s’activera une fois qu’un domaine valide sera renseig Ces tags permettent de filtrer les statuts dans les profils. Vous devrez utiliser le menu contextuel pour les voir. Insère automatiquement une nouvelle ligne après la mention afin de mettre la première lettre en majuscule Permet aux créateurs de contenu de partager leurs statuts sur leurs flux RSS - Fils - Interface - Batterie Rédaction Nombre maximum de tentatives lors du téléversement de médias Créer un nouveau dossier ici @@ -1010,9 +882,7 @@ Le bouton de connexion s’activera une fois qu’un domaine valide sera renseig Dossier par défaut Dossier Créer un dossier - Utilisez votre navigateur préféré intégré dans l\'application. En le désactivant, les liens seront ouverts via un navigateur externe Afficher un message après qu’une action soit terminée (partage, favori, etc.) ? - Exporter les instances mises en sourdine Les instances mises en sourdine ont été exportées ! Ajouter une instance Exporter des instances @@ -1108,7 +978,6 @@ Le bouton de connexion s’activera une fois qu’un domaine valide sera renseig Entrez votre nom de domaine personnalisé ou laissez vide pour utiliser nitter.net Masquer la barre de notification de Fedilab Pour cacher le reste de la notification dans la barre de statut, cliquez sur le bouton en forme d\'œil, puis décochez: \"Afficher dans la barre de statut\" - Activer les notifications différées Les notifications seront mises à jour toutes les 30 secondes. Cela permet de réduire la consommation de la batterie. Notifications en direct différées Aucune notification en direct @@ -1134,7 +1003,6 @@ Le bouton de connexion s’activera une fois qu’un domaine valide sera renseig Titre de la vidéo Rejoignez Peertube J\'ai au moins 16 ans et je suis d\'accord avec les %1$s de cette instance - Couleurs Liens Changer la couleur des liens (URL, mentions, tags, etc.) dans les messages Reblogs header @@ -1146,15 +1014,12 @@ Le bouton de connexion s’activera une fois qu’un domaine valide sera renseig Réinitialiser Icônes Couleur des icônes du bas dans les fils - Arrière-plan - Changer la couleur d\'arrière-plan des fils Épingler ce tag Logo de l\'instance Éditer le profil Faire une action Traduction Aperçu de l\'image - Changer le thème Couleur du texte Changer la couleur du texte dans les publications/messages Appliquer les modifications diff --git a/app/src/main/res/values-gl/strings.xml b/app/src/main/res/values-gl/strings.xml index bf649afcb..187863142 100644 --- a/app/src/main/res/values-gl/strings.xml +++ b/app/src/main/res/values-gl/strings.xml @@ -1,5 +1,4 @@ - - + Abrir o menú Pechar o menú @@ -16,8 +15,6 @@ Cancelar Descargar Descargar %1$s - Descarga completa - Gardar %1$s Medios gardados Ficheiro: %1$s Contrasinal @@ -25,10 +22,8 @@ Contas Toots Etiquetas - Testemuño Gardar Restaurar - Autenticación en dous pasos? Sen resultados! Instancia Instancia: mastodon.social @@ -39,10 +34,7 @@ Cambiar Escoller imaxe… Limpar - Micrófono Cámara - Por favor, diga algo - Lamentámolo! O seu dispositivo non permite a entrada de voz! Elimnar todo Traducir este toot. Programar @@ -59,7 +51,6 @@ Respostas Nome de usuaria Borradores - Novos datos dispoñibles! Desexa mostralos? Favoritas Novas seguidoras Mencións @@ -78,18 +69,12 @@ Comunicación Usuarias acaladas Usuarias bloqueadas - Seguimento remoto Notificacións Solicitudes de seguimento - Optimización Axustes - Perfil - Qué quere facer? Eliminar a conta Eliminar a conta %1$s de esta aplicación? Enviar un correo-e - Por favor, escolla un ficheiro - Non atopamos un explorador de ficheiros! Pulse na ruta para cambiala Fallo! Toots programados @@ -99,10 +84,6 @@ Notificacións ao vivo Sen toot que mostrar - O toot foi engadido aos favoritos - O toot foi eliminado dos favoritos! - O toot foi promovido! - Este toot xa non está promovido! Promovido por %1$s Engadir este toot aos seus favoritos? Eliminar este toot dos seus favoritos? @@ -134,10 +115,6 @@ Eliminar este toot? Eliminar & rescribir este toot? - - %d resposta - %d respostas - Marcadores Engadir a marcadores Eliminar marcador @@ -159,7 +136,6 @@ Resposte a un toot Escriba un queet Resposte a un queet - Acadou os 500 caracteres permitidos! Escolla medios Algo fallou ao engadir os medios! Eliminar este elemento? @@ -193,7 +169,6 @@ Tradución dos toots: Buscar instancias: Deseño de iconas: - Deseño da banda: Conversa @@ -223,15 +198,10 @@ promoveu o seu estado favoreceu o seu estado segueuna - Novo toot desde %1$s e outra notificación e outras %d notificacións - - e outro toot a descubrir - e %d toots máis a descubrir - %d gústame %d gústame @@ -267,7 +237,6 @@ O dominio da instancia non semella ser válido! Algo fallou mentras cambiaba de conta! Algo fallou ao buscar! - Non puido conectar! Gardáronse os datos do perfil! Non se poden realizar accións Gardáronse os medios! @@ -276,12 +245,8 @@ Borrador gardado! Está segura de que esta instancia permite este número de caracteres? Habitualmente este valor está próximo aos 500 caracteres. Cambiouse a visibilidade dos toots para a conta %1$s - O nome da instancia e o nome mostrado non poden quedar baldeiros! - Optimización da descarga Número de toots por carga - Número de contas por carga - Número de notificacións por carga Sempre WiFi Solicitar @@ -290,13 +255,9 @@ Mostrar máis… Mostrar menos… Contido sensible - Mostrar mensaxe anterior nas respostas - Mostrar liña temporal local - Mostrar liña temporal federada Desactivar avatares GIF Ruta: Gardar borradores automáticamente - Mostrar contadores Engadir a URL dos medios nos toots Notificar cando alguén a segue Notificar cando alguén promove un dos seus toots @@ -308,7 +269,6 @@ Notificar só cando WiFi Notificar? Notificacións silenciosas - Modo nocturno Caducidade da vista NSFW (en segundos, 0 é apagado) Editar perfil Compartición personalizada @@ -332,12 +292,6 @@ Activar javascript Expandir automáticamente CW Permitir testemuños de terceiros - Aspecto das liñas temporais: - - Pestanas - Menú - Pestanas e menú - Yandex DeppL @@ -349,15 +303,6 @@ Claro Negro - - Non - 512 Kb - 1 Mb - 2 Mb - 4 Mb - 6 Mb - 8 Mb - Cor do LED: Azul @@ -368,13 +313,9 @@ Amarelo Branco - Notificar os novos toots na liña temporal de Inicio Seguir - Non seguir - Bloquear Desbloquear Acalar - Sen acción Non acalar Petición enviada Séguea @@ -387,8 +328,6 @@ Por favor, confirme cales son as notificacións push que quere recibir. Posteriormente pode activar ou desactivar estas notificacións en Axustes (pestana Notificacións). - Para os toots non lidos no Inicio? - Para as notificacións non lidas? Limpar caché Hai %1$s de datos na caché.\n\nDesexa eliminalos? @@ -398,7 +337,6 @@ Título Título… Descrición - Descrición… Palabras chave Palabras chave… @@ -415,7 +353,6 @@ Mostrar fixados Non se atoparon resultados! Respaldar toots para %1$s - Respaldar notificacións de %1$s %1$s novos toots foron importados Importáronse %1$s novas notificacións @@ -471,18 +408,14 @@ Está segura de querer eliminar esta listaxe? Aínda non hai nada na lista. Cando as usuarias da lista publiquen novos estados, aparecerán aquí. Engadir a lista - Eliminar da lista Engadir lista Eliminar lista Editar lista Novo título da listaxe - Buscar entre a xente a que vostede segue - As súas listas A conta foi engadida a lista! Aínda non tes ningunha lista! %1$s mudouse a %2$s - Mostrar a conta de promocións/favoritos Non funciona a autenticación? Aquí ten unhas comprobacións que poderían axudarlle:\n\n - Comprobe que non ten fallos escribindo o nome da instancia\n\n @@ -499,25 +432,19 @@ %1$s toots de %2$s foron exportados. Algo fallou mentras se exportaban os datos para %1$s Algo fallou ao exportar os datos! - Importáronse os datos! Algo fallou ao importar os datos! Proxy - Tipo Activar proxy? Host Porto Conectar Contrasinal - Decorado: - Modo compacto Engadir detalles do toot ao compartir Axude a app en Liberapay Hai un fallo na expresión regular! - Sen conta aínda? Non se atoparon liñas temporais en esta instancia! Eliminar esta instancia? - Vai eliminar %s das instancias que está a seguir. Traducir en Seguir instancia Xa segue a esta instancia! @@ -526,10 +453,8 @@ Información Ocultar promocións desde %s Mostar no perfil - Ocultar todo de %s Mostrar promocións desde %s Non mostrar no perfil - Mostrar todo desde %s A conta está agora mostrada no perfil A conta xa non aparece no perfil Agora móstranse as promocións! @@ -550,7 +475,6 @@ Filtrar contextos Un o varios contextos onde se debe aplicar o filtro Caducar tras - Engadir novo filtro Eliminar filtro? Actualizar filtro Crear filtro @@ -565,13 +489,11 @@ Engadíronse contas a listaxe Engadindo contas a listaxe Aínda non creou listaxes. Pulse no botón \"+\" para engadir unha nova. - Non segue a ningunha instancia remota. Pulse no botón \"+\" para engadir unha nova. A quen seguir Trunk API Conta(s) que non poden ser seguidas Obtendo conta remota Mostrar automáticamente medios ocultos - Mostrar botón de seguimento de instancias Novo seguimento Nova promoción Novo favorito @@ -596,7 +518,6 @@ Obtendo estado remoto Comentar Instancia Peertube - Mostrar mensaxes privadas na liña temporal Sexa a primeira en deixar un comentario a este vídeo co botón superior dereito! %s vistas Duración: %s @@ -608,10 +529,6 @@ Este vídeo foi eliminado dos marcadores! Non ten vídeos de Peertube nos seus favoritos! Canle - Sen canles Peertube - Sen instancias Peertube - Sen instancias Mastodon - Sen listas Vídeos Canles Utilizar Emoji One @@ -619,12 +536,7 @@ Mostrar vista previa en todos os toots Deseñador/a da nova UX/UI Mostrar vista previa de vídeos - Soporte Gitlab - Informe de fallos - Non ten instalado un cliente de correo-e. - Envíe un informe de fallos Copiouse o id de conta ao portapapeis! - Optimizacións da batería Cambiar o idioma Idioma por omisión Cortar en varios os toots longos @@ -636,7 +548,6 @@ Gardouse a etiqueta! A etiqueta foi cambiada! Eliminouse a etiqueta! - Mostrar liña temporal Art Programar promoción A promoción foi programada! Non ten promocións programadas que mostrar! @@ -674,14 +585,8 @@ En este campo, debe escribir o nome do servidor da súa instancia.\nPor exemplo, se creou a súa conta en https://mastodon.social\ndebe escribir mastodon.social (sen https://)\n Pode iniciar a escribir o nome e irá obtendo suxestións de servidores.\n\n ⚠ O botón de conexión só estará activo se o nome da instancia é válido e a instancia está activa! - - En este campo, escriba o correo electrónico ligado a súa conta en Mastodon. - - O último paso é introducir o contrasinal e pulsa en Conectar. - Máis información - Se utiliza 2FA (doble factor de autenticación), debe utilizar esta ligazón.\nTamén pode utilizalo se non quere introducir as súas credenciais aquí. Idiomas Só medios @@ -693,16 +598,13 @@ Bot Instancia Pixelfed Instancia Mastodon - Sen instancias Pixelfed Calquera de estos Todos estos Ningún de estos Calquera de estas palabras (separadas por espazos) Todas estas palabras (separadas por espazos) - Ningunha de estas palabras (separadas por espazos) Engade algunha palabra para filtrar (separadas por espazos) Cambiar o nome da columna - Sen instancias Misskey Instancia Misskey Non ten ningunha app no dispositivo para este tipo de ligazón. Suscricións @@ -719,7 +621,6 @@ Escolla o ficheiro a subir Os meus vídeos Título - Categorías Licenza Categoría Idioma @@ -734,14 +635,10 @@ Pulse aquí para editar datos do vídeo. Eliminar vídeo Seguro que quere eliminar este vídeo? - Aínda non ten vídeos subidos! Mostar vídeos NSFW - Canal por omisión de %s Sen vídeos que mostrar! - Engadir medios a favoritos Deixar comentario Compartir - As miñas fotos Escolla un método de programación Desde dispositivo Desde servidor @@ -749,12 +646,8 @@ Toots (Dispositivo) Modificar Mostrar novos toots enriba do botón \"Obter máis\" - Confirmacións Liñas temporais - Servizo de notificación Interface - Contido oculto - Redactando Contactos %1$s comentou o seu vídeo %2$s]]> %1$s está a seguir o seu canal %2$s]]> @@ -769,7 +662,6 @@ Importar datos Escoller o ficheiro a importar Algo fallou ao seleccionar o ficheiro de respaldo! - Por favor, non peche a app mentras se procesa. Pode tomar bastante tempo. Engadir un comentario público Enviar comentario Non hai conexión a internet. A súa mensaxe gardouse nos borradores. @@ -810,18 +702,14 @@ finaliza en %s Actualizar sondaxe Votar - Unha sondaxe non se pode anexar a unha mensaxe directa! Rematou a sondaxe na que participou Rematou unha sondaxe na que tooteou Personalizar Categorías - Novas Marxe temporal Avanzado Mostrar enseña \'novo\' nos toots non lidos - Mostrar liña temporal Peertube Peertube - Agochar lapela Mover liña temporal Agochar liña temporal Ordear liñas temporais @@ -831,10 +719,8 @@ Desfacer Debe manter dúas lapelas visibles! Ordear liñas temporais - Utilice os axustes das listas para eliminar esta lista! As liñas temporais principais só poden ocultarse! BBCode - Engadir liña temporal Marcar os medios sempre como sensibles Instancia GNU Estado almacenado @@ -849,14 +735,11 @@ Historial Listas de reproducción Nome público - Intimidade - Crear Non ten listas de reprodución. Pulse na icona \"+\" para engadir unha nova Debe proporcionar un nome público! A canle é requerida cando a lista é pública. Crear lista reproducción Aínda non hai nada en esta lista. - Editar medios refacer Galería Emoji @@ -864,7 +747,6 @@ Eliminador Texto Filtro - Axustar Esborranchar Quere saír sen gardar a imaxe? Descartar @@ -872,7 +754,6 @@ Imaxe gardada! Fallo ao gardar a imaxe Opacidade - Recortar Activar editor de fotos Engadir un elemento a sondaxe Eliminar un elemento a sondaxe @@ -884,10 +765,8 @@ Acalado temporal Mencionar a conta Actualizar caché - Ver quen promoveu e engadeu a favoritos Mencionar o estado Novas - Mostra novas da conta Fedilab Xeral Rexional Arte @@ -931,7 +810,6 @@ Reconectar a conta A aplicación non puido acceder ao área de administración. Podería ter que voltar a conectar para ter o nivel de acceso correcto. Sen resolver - Resolto Remoto Activo Pendente @@ -947,7 +825,6 @@ Desactivar Acalar Enviar aviso por correo-e - Executar acción Aviso personalizado Usuaria Moderación @@ -979,7 +856,6 @@ Sen contido! Mostrar botón características Fedilab A aplicación precisa acceso a gravación de audio - Algo fallou ao gravar a mensaxe de voz! Mensaxe de voz Activar resposta rápida A conta a que está a respostar podería non ver a súa mensaxe! @@ -987,9 +863,7 @@ Se desactivado, os medios sensibles estarán ocultos con un botón Gardar medios a resolución completa con pulsación longa na vista previa Engadir un botón elíptico arriba a dereita para listar todas as etiquetas/instancias/listas - Mostrar un elemento no menú principal para acceso rápido a liña temporal coa etiqueta #Fedilab Manter conexión aberta ao fluxo API para notificacións ao vivo. - Cando a app está en segundo plano, manterá unha conexión ao fluxo da API. Desactivar se lle preocupa a batería. Durante o tempo marcado, a app enviará notificacións. Pode revertir (silenciar) esta marxe coa roda da dereita. Mostar un botón Fedilab debaixo da imaxe de perfil. É un atallo para acceder a funcións propias da app. Permitir respostar directamente en liñas temporais baixo os estados @@ -1001,9 +875,6 @@ Estas etiquetas permitiranlle filtrar estados dos perfís. Poderá utilizar o menú contextual para velas. Inserta automáticamente un salto de liña tras a mención para por en maiúscula a primeira letra Permitir as creadoras de contido compartir estados desde as súas fontes RSS - Liñas temporais - Interface - Batería Redactar Máx. número de intentos ao subir medios Crear novo Cartafol aquí @@ -1014,9 +885,7 @@ Directorio por omisión Cartafol Crear cartafol - Utilice o navegador favorito dentro da aplicación. Desactivando, as ligazóns abriranse externamente Mostrar mensaxe amigable tras terse completado unha acción (promo, fav, etc.)? - Exportar instancias acaladas Exportáronse as instancias acaladas! Engadir unha instancia Exportar instancias @@ -1112,7 +981,6 @@ Introduza o seu servidor personalizado ou deixe baldeiro para utilizar nitter.net Ocultar barra de notificacións de Fedilab Para ocultar as notificacións remanentes na barra de estado, pulsa na icona do ollo e desmarca: \"Mostrar en barra de estado\" - Activar notificacións retardadas As notificacións retrasaranse cada 30 segundos. Esto permite aforrar batería. Notificacións ao vivo retardadas Sen notificacións ao vivo @@ -1138,7 +1006,6 @@ Título para o vídeo Unirse a Peertube Teño 16 anos ao menos e acepto os %1$s de esta instancia - Cores Ligazóns Cambiar cor das ligazóns (URLs, mencións, etiquetas, etc.) nas mensaxes Cabeceira das repeticións @@ -1150,15 +1017,12 @@ Restablecer Iconas Cor das iconas inferiores nas liñas temporais - Fondo - Cambiar a cor de fondo nas liñas temporais Fixar esta etiqueta Logo da instancia Editar perfil Tomar decisión Tradución Vista previa da imaxe - Cambiar decorado Text color Change the text color in pots Apply changes diff --git a/app/src/main/res/values-hi/strings.xml b/app/src/main/res/values-hi/strings.xml index 969775d38..301449556 100644 --- a/app/src/main/res/values-hi/strings.xml +++ b/app/src/main/res/values-hi/strings.xml @@ -1,5 +1,4 @@ - - + मेन्यू खोलें मेन्यू बंद करें @@ -16,8 +15,6 @@ रद्द करें डाउन्लोड डाउन्लोड %1$s - डाउनलोड संपन्न - संचित करें %1$s मीडिया संचित कर लिया गया है फ़ाइल: %1$s पासवर्ड @@ -25,10 +22,8 @@ खाते लेख टैग्स - टोकन सहेजें पहले जैसा करें - दो-चरणीय प्रमाणीकरण? कोई परिणाम नहीं! इंस्टंस इंस्टंस: mastodon.social @@ -39,10 +34,7 @@ बदलें एक चित्र चुनें साफ करें - ध्वनिग्राही कैमरा - कृपया कुछ कहिये - क्षमा करें! आपका उपकरण वाणी इंपुट का समर्थन नहीं करता है! सब हटाएँ इस संदेश का अनुवाद करें शैड्यूल @@ -59,7 +51,6 @@ जवाब उपयोगकर्ता का नाम मसौदे - नए डेटा उपलब्ध है! क्या आप उन्हें प्रदर्शित करना चाहेंगे? पसंदीदा नए अनुयायी उल्लेख @@ -78,18 +69,12 @@ संचार मौन किये गये उप्योगकर्ता प्रतिबंधित उप्योगकर्ता - दूरवर्ती अनुसरण सूचनाएँ अनुसरण करने की गुज़ारिशें - इष्टतमीकरण सैटिंग्स - वर्णन - आप क्या करना चाहेंगे? खाता नष्ट करें %1$s खाते को एप्लीकेशन से हटाएं? ईमेल भेजें - कृपया एक फ़ाइल चुनें - फ़ाइल एक्सप्लोरर नहीं मिला! मार्ग को बदलने के लिये उस पर क्लिक कीजिये असफल! परिगणित लेख @@ -99,10 +84,6 @@ लाईव सूचनाएं दिखाने के लिये एक भी संदेश नहीं है - संदेश को पसंदीदा पृष्ठ में जोड़ दिया गया है - संदेश को पसंदीदा पृष्ठ से हटा दिया गया है - संदेश को बूस्ट कर दिया गया है! - संदेश अब बूस्ट नहीं है! बूस्ट किया %1$s इस संदेश को अपने फ़ेवरेट्स में जोड़े? इस संदेश को अपने फ़ेवरेट्स से हटाएं? @@ -134,10 +115,6 @@ इस संदेश को हटाएं? संदेश हटाएं और दोबारा लिखे? - - %d जवाब - %d जवाब - बुकमार्क्स बुकमार्क्स में जोड़ें बुकमार्क हटाएं @@ -159,7 +136,6 @@ संदेश का जवाब दे Write a queet Reply to a queet - आप अनुमत ५०० अक्षरों की सीमा तक पहुंच चुके हैं! मीडिया को चुनें मीडिया चुनते वक्त कुछ गड़बड़ी हो गई! इस मीडिया को मिटा दें? @@ -193,7 +169,6 @@ लेखों का अनुवाद: इंस्टंस को खोजें: आइकाॅन डिज़ाइनर: - बैनर डिज़ाइनर: बातचीत @@ -223,15 +198,10 @@ आपका लेख बूस्ट किया आपका लेख पसंद किया आपका अनुसरण किया - %1$s से नया लेख एक और सूचना %d अन्य सूचनाएं - - एक और लेख खोजने के लिये - %d अन्य लेख खोजने के लिये - %d like %d likes @@ -267,7 +237,6 @@ यह इंस्टंस डोमेन वैध नहीं लग रहा! खाता बदलते समय कुछ गड़बड़ी हो गयी! खोजते समय कुछ गड़बड़ी हुई! - लाॅगइन नहीं हो सका! प्रोफ़ाइल डेटा सहेजा गया! कार्यवाही नामुमकिन मीडिया को सहेज लिया! @@ -276,12 +245,8 @@ मसौदा सहेजा! क्या आप सुनिश्चित है कि यह इंस्टंस इतने सारे अक्षर स्वीकार करता है? आम तौर पर यह मूल्य ५०० अक्षरों के करीब होता है। %1$s खाते के लेखों की दृश्यता को बदल दिया गया है - इंस्टंस का नाम और आपका नाम खाली नहीं हो सकते! - लोडिंग का इष्टतमीकरण लेखों की संख्या प्रति लोड - खातो की संख्या प्रति लोड - सूचनाओ की संख्या प्रति लोड हमेशा वाईफ़ाई पूछें @@ -290,13 +255,9 @@ और दिखाएं कम दिखाएं संवेदनशील विषय वस्तु - जवाबों में पिछला संदेश दिखाएं - लोकल टाइम्लाइन दिखाएं - फ़ैडरेटेड टाइम्लाइन दिखाएं गिफ़ अवतार निष्क्रिय करें मार्ग: मसौदे स्वतः सहेजें - काउंटर दिखाएं मीडिया के यूआरएल को लेखों में जोड़े अनुसरण होने पर सूचित करें आपके लेख बूस्ट होने पर सूचित करें @@ -308,7 +269,6 @@ केवल वाईफ़ाई पे सूचित करें सूचित करें? शांत सूचनाएं - रात्रि मोड NSFW दृश्य विराम (सेकेंड, ० मतलब बंद) प्रोफ़ाइल संपादित करें Custom sharing @@ -332,12 +292,6 @@ जावास्क्रिप्ट चालू करें स्वतः cw खोलें तीसरी पार्टी कुकीज़ को स्वीकारें - टाइम्लाइनो का अभिन्यास: - - टैब्स - मेन्यू - टैब्स एवं मेन्यू - यैंडैक्स डीपएल @@ -349,15 +303,6 @@ हल्का काला - - नहीं - ५१२ केबी - १ एमबी - २ एमबी - 4 Mb - 6 Mb - 8 Mb - एलईडी का रंग चुनें: नीला @@ -368,13 +313,9 @@ पीला सफेद - मुख्यपृष्ट पे नये लेखों के लिये सूचित करें अनुसरण करें - अनुसरण ना करें - अवरुद्ध मुक्त करें मौन करें - कोई क्रिया नहीं मौन तोड़ें अनुरोध भेज दिया आपका अनुसरण कर रहे हैं @@ -387,8 +328,6 @@ कृप्या उन पुश सूचनाएं को पक्का करें जो आप पाना चाहते हैं। आप सूचनाओं को बाद में सेटिंग्स में जाकर सक्रिय या निश्क्रिय कर सकते हैं (सूचनाएं टैब)। - मुख्यपृष्ट में अपठित लेखो के लिये? - अपठित सूचनाओं के लिये? कैश साफ़ करें कैश में %1$s डेटा है। \n\nक्या आप उन्हें मिटाना चाहेंगे? @@ -398,7 +337,6 @@ शीर्षक शीर्षक… विवरण - विवरण… Keywords Keywords… @@ -415,7 +353,6 @@ जड़े हुए दिखाएं कोई मिलता-जुलता परिणाम नहीं मिला! %1$s के लेखों को बैकअप करें - Backup notifications for %1$s %1$s नये लेख आयात कर लिये गये है %1$s new notifications have been imported @@ -465,18 +402,14 @@ क्या आप वाकई इस सूची को हमेशा के लिये मिटाना चाहते हैं? यह सूची फिलहाल खाली है। जब इस सूची के सदस्य नये लेख प्रकाशित करेंगे तब वे इधर दिखेंगे। सूची में जोड़ें - सूची से निकालें सूची जोड़ें सूची मिटाएं सूची संपादित करें नये सूची का शीर्षक - उनमें खोजें जिनका आप अनुसरण करते हैं - आपकी सूचियाँ The account was added to the list! You don\'t have any lists yet! %1$s %2$s पे चले गये है - बूस्ट/पसंदीदा की गिनती दिखाएं प्रमाणीकरण काम नहीं कर रहा? यह कुछ चैक्स हैं जो मदद करें:\n\n - जांचे कि इंस्टंस के नाम में कोई गलती तो नहीं ह\n\n @@ -492,25 +425,19 @@ %2$s लेखो में से %1$s लेखों का आयात कर लिया। %1$s के लिये डेटा निर्यात करते समय गड़बड़ी हो गयी Something went wrong when exporting data! - Data have been imported! Something went wrong when importing data! प्रॉक्सी - प्रकार प्राॅक्सी चालू करें? मेज़बान पोर्ट लॉगइन पासवर्ड - रूपरंग: - काॅम्पैक्ट मोड लेख को सांझा करते समय उसकी जानकारी जोड़ें लीबरापे पे एेप का समर्थन करें आम अभिव्यंजना में एक गड़बड़ी है! - कोई खाता नहीं है? इस इंस्टंस पे कोई टाइम्लाइन नहीं मिली! इस इंस्टंस को मिटाएं? - आप %s को अपने अनुसरण करते इंस्टंस से मिटाने वाले है। में अनुवाद करें इंस्टंस का अनुसरण करें आप इस इंस्टंस का पहले से अनुसरण कर रहे हैं! @@ -519,10 +446,8 @@ जानकारी %s के बूस्ट छुपाएं प्रोफ़ाइल पे पेश करें - %s के सारी चीज़े छुपाएं %s के बूस्ट दिखाएं प्रोफ़ाइल पे पेश ना करें - %s के सारी चीज़ें दिखाएं खाता अब प्रोफ़ाइल पे पेश है खाता अब प्रोफ़ाइल पे पेश नहीं है बूस्ट अब प्रस्तुत होंगे! @@ -543,7 +468,6 @@ संदर्भ छाटें एक या अनेक संदर्भ जहाँ छन्नी लागू हो के बाद खत्म हो - नयी छन्नी जोड़ें छन्नी मिटाएं? छन्नी का नवीनीकरण करें छन्नी बनाएं @@ -558,13 +482,11 @@ खातों को सूची में जोड़ दिया खोतों को सूची में जोड़ जा रहा है आपने कोई सूची नहीं बनाई है। एक नयी सूची बनाने के लिये \"+\" बटन पे क्लिक करें। - आप किसी भी दूर्वती इंस्टंस का अनुसरण नहीं कर रहे हैं। करने के लिये \"+\" बटन पे क्लिक करें। किसका अनुसरण करें ट्रंक एपीआई खातों का अनुसरण नहीं हो पाया दूरर्वती खाता लाया जा रहा है स्वतः छुपाए गये मिडिया को दिखाएं - इंस्टंस का अनुसरण बटन दिखाएं नया अनुसरण नया बूस्ट नया पसंदीदा @@ -589,7 +511,6 @@ दूरर्वती लेखों को लाया जा रहा है टिप्पणी पीयरट्यूब इंस्टंस - निजी संदेश टाइम्लाइन दिखाएं वीडियो पे सबसे पहले टिप्पणी करने वाले बने ऊपरी दाई ओर वाले बटन के साथ! %s बार देखा अवधि: %s @@ -601,10 +522,6 @@ इस वीडियो को बुकमार्क्स से हटा दिया गया है! आपके पसंदीदा सूची में कोई पीयरट्यूब वीडियो नहीं है! चैनल - कोई पीयरट्यूब चैनल नहीं है - कोई पीयरट्यूब इंस्टंस नहीं है - कोई मैस्टोडाॅन इंस्टंस नहीं है - कोई सूची नहीं है वीडियो चैनल इमोजी वन इस्तेमाल करें @@ -612,12 +529,7 @@ सभी लेखो में पूर्वदर्शन लागू करें नया UX/UI डिज़ाइनर वीडियो के पूर्वदर्शन छवियां दिखाएं - गिटलैब समर्थन - त्रुटि रिपोर्ट - कोई ईमेल एेप स्थापित नहीं है। - ऋुटि रिपोर्ट भेजें खाते की आईडी की प्रतिलिपि क्लिपबोर्ड में छाप दी है! - बैटरी का इष्टतमीकरण भाषा बदलें पूर्वनिर्धारित भाषा लंबे लेखों को छोटा करें @@ -629,7 +541,6 @@ टैग को सहेज लिया! टैग को बदल दिया! टैग को मिटा दिया! - कला टाइम्लाइन दिखाएं बूस्ट शैड्यूल करें बूस्ट परिगणित हो गया! कोई परिगणित बूस्ट मौजूद नहीं है! @@ -667,10 +578,7 @@ यहाँ अपने इंस्टंस के मेज़बान का नाम डालें।\nउदाहरण, अगर आपने https://mastodon.social\n पे खाता बनाया है तो बस लिखें mastodon.social (https:// के बिना)\n आप जब पहले अक्षर लिखना शुरू करेंगे तब नामों का सुझाव दिया जाएगा।\n\n ⚠ लाॅगइन बटन सिर्फ़ तब काम करेगा जब इंसटंस का नाम वैध है और इंस्टंस काम कर रहा है! - यहाँ अपने मैस्टोडाॅन खाते से जुड़े ईमेल को लिखें। - आखरी चरण में अपना पासवर्ड डाले और फिर लाॅगइन पे क्लिक करें। अधिक जानकारी - अगर आप 2FA (दो-चरणीय प्रमाणीकरण) चालू करना चाहते है तो फिर इस लिंक का उपयोग करें।\nअगर आपको अपना ईमेल और पासवर्ड यहाँ नहीं डालना है तब इसे इस्तेमाल करें। भाषाएँ सिर्फ़ मीडिया @@ -682,16 +590,13 @@ बॉट पिक्सलफ़ैड इंस्टंस मैस्टोडाॅन इंस्टंस - कोई पिक्सलफ़ैड इंस्टंस नहीं है इनमें से कोई भी यह सभी कोई भी नहीं कोई भी शब्द (स्पेस से अलग किये हूए) सभी शब्द (स्पेस से अलग किये हूए) - कोई भी शब्द नहीं (स्पेस से अलग किये हूए) Add some words to filter (space-separated) काॅलम क नाम बदलें - No Misskey instances Misskey instance No app supporting this link is installed on your device. सदस्यता @@ -708,7 +613,6 @@ अपलोड करने के लिए फ़ाइल का चयन करें मेरे वीडियो शीर्षक: - श्रेणियाँ लाइसेंस वर्ग भाषा @@ -723,14 +627,10 @@ Tap here to edit the video data. वीडियो हटाएँ Are you sure to delete this video? - अभी तक कोई वीडियो अपलोड नहीं किया गया! Display NSFW videos - Default %s channel No videos to display! - पसंदीदा में जोड़ें कोई टिप्पणी लिखें शेयर करें - मेरे चित्र चुनें एक कार्यक्रम मोड डिवाइस से सर्वर से @@ -738,12 +638,8 @@ Toots (Device) परिवर्तित करें Display new toots above the \"Fetch more\" button - Confirmations समयरेखा - अधिसूचना सेवा Interface - Hidden content - रचना संपर्क सूची %1$s commented your video %2$s]]> %1$s is following your channel %2$s]]> @@ -758,7 +654,6 @@ Import Data Select the file to import An error occurred when selecting the backup file! - Please, don\'t kill the app while processing. That can\'t be quite long. एक सार्वजनिक टिप्पणी जोड़ें टिप्पणी भेजे There is no Internet connection. Your message has been stored in drafts. @@ -799,18 +694,14 @@ end at %s Refresh poll मत - A poll cannot be attached to a direct message! A poll you have voted in has ended A poll you tooted has ended Customize श्रेणियाँ - समाचार Time slot Advanced Display \'new\' badge on unread toots - Display Peertube timeline Peertube - Hide the tab Move timeline Hide timeline Reorder timelines @@ -820,10 +711,8 @@ Undo You need to keep two visible tabs! Reorder timelines - Use the lists entry for deleting this list! Main timelines can only be hidden! BBCode - Add a timeline Always mark media as sensitive GNU instance Cached status @@ -838,14 +727,11 @@ इतिहास गानो की सूची प्रदर्शित होने वाला नाम - गोपनीयता - बनाएँ You don\'t have any playlists. Tap on the \"+\" icon to add a new playlist You must provide a display name! The channel is required when the playlist is public. नई प्लेलिस्ट बनाएं There is nothing in this playlist yet. - Edit media फिर से करें गैलरी इमोजी @@ -853,7 +739,6 @@ रबड़ शब्द फ़िल्टर - Adjust ब्रश Are you sure you want to exit without saving the image? रद्द करें @@ -861,7 +746,6 @@ Image Saved Successfully! Failed to save Image अपारदर्शिता - क्रॉप करें Enable photo editor Add a poll item Remove last poll item @@ -873,10 +757,8 @@ Timed mute Mention the account Refresh cache - See who boosted and added to favorites Mention the status समाचार - Display news from Fedilab\'s account सामान्य Regional कला @@ -920,7 +802,6 @@ Reconnect the account The application failed to access the admin features. You might need to reconnect the account for having the correct scope. Unresolved - Resolved Remote Active Pending @@ -936,7 +817,6 @@ Disable Silence Notify the user per e-mail - Perform action Custom warning User Moderator @@ -968,7 +848,6 @@ Empty content! Display Fedilab features button The application needs to access audio recording - An error occurred when recording the voice message! Voice message Enable quick reply The account you are replying might not see your message! @@ -976,9 +855,7 @@ If disabled, sensitive media will be hidden with a button Store media in full size with a long press on previews Add an ellipse button at the top right for listing all tags/instances/lists - Display an item in the main menu for a quick access to the timeline targeting #Fedilab tag Keep an open connection to the streaming API for live notifications. - When the app is in background, it will keep a connection to the streaming API. Disable it if you care about your battery. During the time slot, the app will send notifications. You can reverse (ie: silent) this time slot with the right spinner. Display a Fedilab button below profile picture. It is a shortcut for accessing in-app features. Allow to reply directly in timelines below statuses @@ -990,9 +867,6 @@ These tags will allow to filter statuses from profiles. You will have to use the context menu for seeing them. Automatically insert a line break after the mention to capitalize the first letter Allow content creators to share statuses to their RSS feeds - Timelines - Interface - Battery Compose Maximum retry times when uploading media Create a new Folder here @@ -1003,9 +877,7 @@ Default Directory Folder Create folder - Use your favourite browser inside the application. By disabling, links will be opened externally Display a toast message after an action has been completed (boost, fav, etc.)? - Export muted instances Muted instances have been exported! Add an instance Export instances @@ -1101,7 +973,6 @@ Enter your custom host or leave blank for using nitter.net Hide Fedilab notification bar For hiding the remaining notification in the status bar, tap on the eye icon button then uncheck: \"Display in status bar\" - Enable delayed notifications Notifications will be delayed every 30 seconds. That will allow to drain less battery. Live notifications delayed No live notifications @@ -1127,7 +998,6 @@ Title for the video Join Peertube I am at least 16 years old and agree to the %1$s of this instance - Colors Links Change the color of links (URLs, mentions, tags, etc.) in messages Reblogs header @@ -1139,15 +1009,12 @@ Reset Icons Color of bottom icons in timelines - Background - Change the background color for timelines Pin this tag Logo of the instance Edit profile Make an action Translation Image preview - Change the theme Text color Change the text color in pots Apply changes diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index 10c71fa2b..d25851034 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -1,5 +1,4 @@ - - + Menü megnyitása Menü bezárása @@ -16,8 +15,6 @@ Mégsem Letöltés %1$s letöltése - A letöltés befejeződött - %1$s mentése Média elmentve Fájl: %1$s Jelszó @@ -25,10 +22,8 @@ Fiókok Tülkök Cimkék - Token Mentés Visszaállítás - Kétlépcsős hitelesítés? Nincs találat! Szerver Szerver: mastodon.social @@ -39,10 +34,7 @@ Módosítás Kép kiválasztása… Tisztítás - Mikrofon Felvétel - Kérlek, mondj valamit - Sajnáljuk, az eszközöd nem támogatja a hangfelvételt! Összes törlése Toot fordítása. Időzítés @@ -59,7 +51,6 @@ Válaszok Felhasználónév Piszkozatok - Új adatok állnak rendelkezésre! Szeretnéd megjeleníteni? Kedvencek Új követők Említések @@ -78,18 +69,12 @@ Kommunikáció Elnémított felhasználók Letiltott felhasználók - Távoli követés Értesítések Követési kérelmek - Optimalizálás Beállítások - Profil - Mit akarsz tenni? Fiók törlése Valóban törölni szeretnéd a %1$s fiókot az alkalmazásból? E-mail küldése - Válassz egy fájlt - Fájlkezelő nem található! Változtatáshoz kattints az elérési útra Sikertelen! Időzített tootok @@ -99,10 +84,6 @@ Valós idejű értesítések Nincs megjeleníthető toot - A toot hozzá lett adva a kedvencekhez - A toot el lett távolítva a kedvencek közül! - A tootot meg lett ismételve! - A tootot többé nincs ismételve! Ismétlés %1$s által Hozzáadod ezt a tootot a kedvencekhez? Eltávolítod ezt a tootot a kedvencek közül? @@ -134,10 +115,6 @@ Eltávolítod ezt a tootot? Törlöd és újrafogalmazod ezt a tootot? - - %d válasz - %d válasz - Könyvjelzők Hozzáadás a könyvjelzőkhöz Könyvjelző eltávolítása @@ -159,7 +136,6 @@ Válaszolj egy tootra Írj egy queetet Válaszolj egy queetre! - Elérted az 500 karakteres limitet! Média kiválasztása Hiba történt a média kiválasztásakor! Törli ezt a médiát? @@ -193,7 +169,6 @@ Tootok fordítása: Szerver keresése: Ikontervező: - Bannertervező: Beszélgetés @@ -223,15 +198,10 @@ megismételte posztodat lájkolta a posztodat követett téged - Új toot %1$s felhasználótól és még egy értesítés és még %d értesítés - - és még egy felfedezhető toot - és még %d felfedezhető toot - %d lájkolás %d lájkolás @@ -267,7 +237,6 @@ A szerver doménje érvénytelennek tűnik! Hiba történt a fiókváltás során! Hiba történt a keresés közben! - A bejelentkezés sikertelen! A profiladatokat elmentettük! Nem lehet végrehajtani ezt a műveletet Média elmentve! @@ -276,12 +245,8 @@ Piszkozat elmentve! Biztos vagy benne, hogy ez a szerver megenged ennyi karaktert? Ez az érték általában 500 karakter körül van. A tootok láthatósága megváltozott a %1$s fiók számára - A szervernév és a felhasználónév nem maradhat üresen! - Betöltés optimalizálása Tootok száma letöltésenként - Fiókok száma letöltésenként - Értesítések száma letöltésenként Mindig WiFi Kérdezz rá @@ -290,13 +255,9 @@ Mutass többet… Mutass kevesebbet… Bizalmas tartalom - Előző üzenet megjelenítése a válaszokban - Helyi idővonal megjelenítése - Összevont idővonal megjelenítése GIF avatarok kikapcsolása Útvonal: Piszkozatok automatikus mentése - Számlálók megjelenítése Média URL-jének hozzáadása a tootokhoz Értesítsen, amikor valaki követ Értesíts, amikor valaki megismétli a posztodat @@ -308,7 +269,6 @@ Értesítés csak WiFi használatakor Kérsz értesítést? Csendes értesítések - Éjszakai mód NSFW tartalom megjelenítésének ideje (mp, 0 érték kikapcsolja) Profil szerkesztése Egyéni megosztás @@ -332,12 +292,6 @@ Javascript engedélyezése cw automatikus kibontása Harmadik féltől származó sütik engedélyezése - Idővonalak elrendezése: - - Lapok - Menü - Lapok és menü - Yandex DeepL @@ -349,15 +303,6 @@ Világos Fekete - - Nem - 512 Kb - 1 Mb - 2 Mb - 4 Mb - 6 Mb - 8 Mb - LED színének beállítása: Kék @@ -368,13 +313,9 @@ Sárga Fehér - Értesíts, mikor a kezdőlap idővonalán új toot jelenik meg Követés - Követés megszűntetése - Letilt Letiltás feloldása Elnémítás - Semmit se tegyen Némítás feloldása Kérés elküldve Követ téged @@ -387,8 +328,6 @@ Kérjük erősítsd meg, mely push-értesítéseket szeretnéd megkapni. Ezeket az értesítéseket később ki- vagy bekapcsolhatod (Értesítések lapon). - For unread toots in home time-line? - For unread notifications? Gyorsítótár ürítése A gyorsítótárban %1$s megjelenítendő elem van.\n\nSzeretnéd törölni őket? @@ -398,7 +337,6 @@ Cím Cím… Leírás - Leírás… Kulcsszavak Kulcsszavak… @@ -415,7 +353,6 @@ Rögzített tootok megjelenítése Nincs találat! %1$s fiók tootjainak archiválása - Backup notifications for %1$s %1$s új tootjait importáltuk %1$s new notifications have been imported @@ -469,18 +406,14 @@ A Yandexnek megvan a saját adatvédelmi szabályzata, ami itt található: http Biztos benne, hogy véglegesen törölni szeretné ezt a listát? Ez a lista még üres. Mikor a lista tagjai posztolnak, azok itt fognak megjelenni. Hozzáadás a listához - Eltávolítás a listáról Új lista Lista törlése Lista szerkesztése Új listacím - Keresés azok között, akiket követsz - Listáid The account was added to the list! You don\'t have any lists yet! %1$s elköltözött ide: %2$s - Mutasd az újratootok/kedvenc posztok számát Nem sikeres a hitelesítés? Íme néhány hasznos tipp:\n\n - Ellenőrizd, hogy nem gépelted-e el a szerver nevét.\n\n @@ -497,25 +430,19 @@ A Yandexnek megvan a saját adatvédelmi szabályzata, ami itt található: http %1$s tootot exportáltunk a %2$s tootból. Valamilyen hiba történt %1$s adatainak exportálása közben Valamilyen hiba történt az exportálás közben! - Az adatok importálása befejeződött! Valamilyen hiba történt az importálás közben! Proxy - Típus Proxy bekapcsolása Proxyszerver neve Port Felhasználónév Jelszó - Téma: - Kompakt mód Toot részleteinek hozzaádása megosztáskor Támogasd az appot a Liberapayen A reguláris kifejezés hibát tartalmaz! - Nincs még fiókja? Ezen a szerveren nem találtunk idővonalat! Töröljuk ezt a szervert? - Ezzel ki fogod törölni %s szervert a követett szerverek listájáról. Fordítsd erre: Szerver követése Már követed ezt a szervert! @@ -524,10 +451,8 @@ A Yandexnek megvan a saját adatvédelmi szabályzata, ami itt található: http Információ %s újratootjainak elrejtése Mutassa a profilban - Rejts el mindent %s-től %s újratootjainak megjelenítése Ne mutassa a profilban - Mutass mindent %s-től A fiókot mostantól mutatjuk a profilban A fiókot többé nem mutatjuk a profilban Mostantól láthatóak az újratootok! @@ -548,7 +473,6 @@ A Yandexnek megvan a saját adatvédelmi szabályzata, ami itt található: http Szűrés kontextusai Egy vagy több kontextus, amire a szűrő alkalmazandó Lejárat dátuma - Új szűrő hozzáadása Törlöd a szűrőt? Szűrő módosítása Szűrő létrehozása @@ -563,13 +487,11 @@ A Yandexnek megvan a saját adatvédelmi szabályzata, ami itt található: http Hozzáadtuk a fiókokat a listához Hozzáadjuk a fiókokat a listához Nem hoztál még létre listát. Kattintson a \"+\" gomb-ra egy új hozzáadásához. - Nem követsz még egyetlen távoli szervert sem. Klikkelj a \"+\" gombra a hozzáadáshoz. Kit érdemes követni Trunk API A fiók(ok) nem követhetőek Betöltjük a távoli fiók adatait Rejtett médiák automatikus kibontása - Megjeleníti a szerverek követése gombot Új követő Új újratoot Új kedvenc @@ -594,7 +516,6 @@ A Yandexnek megvan a saját adatvédelmi szabályzata, ami itt található: http Betöltjük a távoli posztot Hozzászólás Peertube szerver - Privát üzenetek idővonalának megjelenítése Legyél te az első, aki hozzászól ehhez a videóhoz a jobb felső gomb segítségével! %s megtekintés Időtartam: %s @@ -606,10 +527,6 @@ A Yandexnek megvan a saját adatvédelmi szabályzata, ami itt található: http Eltávolítottuk a videót a könyvjelzők közül! Nincs Peertube videó a kedvenceid között! Csatorna - Nincsenek Peertube csatornák - Nincsenek Peertube szerverek - Nincsenek Mastodon szerverek - Nincsenek listák Videók Csatornák Emoji One használata @@ -617,12 +534,7 @@ A Yandexnek megvan a saját adatvédelmi szabályzata, ami itt található: http Előnézet megjelenítése minden toothoz Új UX/UI tervező Videó előnézetek megjelenítése - GitLab-támogatás - Hibajelentés - Nincs telepített e-mailkliens. - Hibajelentés küldése A fiók id-jét átmásoltuk a vágólapra! - Akkuhasználat optimalizálása Nyelv megváltoztatása Alapértelmezett nyelv Túl hosszú tootok csonkolása @@ -634,7 +546,6 @@ A Yandexnek megvan a saját adatvédelmi szabályzata, ami itt található: http Eltároltuk a címkét! Megváltoztattuk a címkét! Töröltük a címkét! - Művészies idővonal megjelenítése Újratoot időzítése Az újratoot időzítésre került! Nincs megjeleníthető időzített újratoot! @@ -673,12 +584,7 @@ A Yandexnek megvan a saját adatvédelmi szabályzata, ami itt található: http Kezdd beírni az első néhány betűt és a többit segítünk kiegészíteni.\n\n ⚠ A Bejelentkezés gomb csak akkor fog működni, ha a szervernév érvényes és a szerver elérhető! - Ebbe a mezőbe írd az e-mailcímet, ami a Mastodon-fiókodhoz tartozik. - - Utolsó lépésként írd be a jelszót és klikkelj a Belépés gombra. - További információ - Ha 2FA-t (kétfaktoros hitelesítést) használsz, ezt a linket kell használnod.\nAkkor is használhatod, ha nem akarod ide írni a bejelentkezési adataidat. Nyelvek Csak média @@ -690,16 +596,13 @@ A Yandexnek megvan a saját adatvédelmi szabályzata, ami itt található: http Bot Pixelfed szerver Masztodon szerver - Nincs Pixelfed szerver Bármelyik Mindegyik Egyik sem Bármelyik a következő szavakból (szóközzel elválasztva) Minden szó (szóközzel elválasztva) - Egyik szó sem (szóközzel elválasztva) Néhány szűrő szó hozzáadása (szóközzel elválasztva) Oszlop nevének megváltoztatása - Nincs Misskey szerver Misskey szerver Eszközödön nincs olyan alkalmazás, ami ezt a linket megnyitná. Előfizetések @@ -716,7 +619,6 @@ A Yandexnek megvan a saját adatvédelmi szabályzata, ami itt található: http Feltöltendő fájl kiválasztása Videóim Cím - Kategóriák Licensz Kategória Nyelv @@ -731,14 +633,10 @@ A Yandexnek megvan a saját adatvédelmi szabályzata, ami itt található: http Klikkelj ide a videó adatok szerkesztéséhez. Videó törlése Biztos törölni akarod a videót? - Nincs még feltöltött videó! NSFW videók megjelenítése - Alapértelmezett %s csatorna Nincs megjeleníthető videó! - Média hozzáadása a kedvencekhez Hozzászólok Megosztás - Képeim Ütemezési mód választása Erről az eszközről Szerverről @@ -746,12 +644,8 @@ A Yandexnek megvan a saját adatvédelmi szabályzata, ami itt található: http Tootok (eszköz) Módosítás Új tootok megjelenítése a \"Továbbiak betöltése\" gomb fölött - Megerősítések Idővonalak - Értesítési szolgáltatás Interfész - Rejtett tartalom - Szerkesztés Kapcsolatok %1$s hozzászólt a %2$s videódhoz]]> %1$s követi a %2$s csatornádat]]> @@ -766,7 +660,6 @@ A Yandexnek megvan a saját adatvédelmi szabályzata, ami itt található: http Adat importálása Importálandó fájl kiválasztása Hiba történt a mentés-fájl létrehozásakor! - Ne zárd be az appot a folyamat közben. Hosszú ideig tarthat. Nyilvános hozzászólás hozzáadása Hozzászólás küldése Nincs internet-kapcsolat. Üzenetedet a piszkozatok között tároltuk. @@ -807,18 +700,14 @@ A Yandexnek megvan a saját adatvédelmi szabályzata, ami itt található: http %s-kor ér véget Szavazás frissítése Szavazás - Közvetlen üzenethez nem csatolhatsz szavazást! Véget ért egy szavazás, amiben részt vettél Véget ért egy szavazás, amiben részt vettél Testreszabás Kategóriák - Hírek Idősáv Speciális \"Új\" szimbólumm megjelenítése olvasatlan tootok mellett - Peertube idővonal megjelenítése Peertube - Lap elrejtése Idővonal áthelyezése Idővonal elrejtése Idővonalak átrendezése @@ -828,10 +717,8 @@ A Yandexnek megvan a saját adatvédelmi szabályzata, ami itt található: http Visszavonás Legalább két látható lapnak kell maradni! Idővonalak átrendezése - A lista törléséhez használd a listabejegyzést! A fő idővonalakat csak elrejteni lehet! BBCode - Idővonal hozzáadása Minden médiát jelölj meg érzékenynek GNU szerver Gyorsítótárazott üzenet @@ -846,14 +733,11 @@ A Yandexnek megvan a saját adatvédelmi szabályzata, ami itt található: http Előzmények Lejátszási listák Megjelenítendő név - Adatvédelem - Létrehoz Nincs még lejátszási listád. Klikkelj a \'+\' jelre új lejátszási lista hozzáadásához Meg kell adnod egy megjelenítési nevet! Csatorna kiválasztása szükséges, ha a lejátszási lista nyilvános. Lejátszási lista létrehozása Ez a lejátszási list még üres. - Média szerkesztése Ismétlés Galéria Emoji @@ -861,7 +745,6 @@ A Yandexnek megvan a saját adatvédelmi szabályzata, ami itt található: http Radír Szöveg Szűrő - Beállítás Ecset Biztos, hogy a kép mentése nélkül kilép? Elvet @@ -869,7 +752,6 @@ A Yandexnek megvan a saját adatvédelmi szabályzata, ami itt található: http A kép sikeresen elmentve! Nem sikerült elmenteni a képet Áttetszőség - Körbevágás Fényképszerkesztő bekapcsolása Elem hozzáadása Elem eltávolítása @@ -881,10 +763,8 @@ A Yandexnek megvan a saját adatvédelmi szabályzata, ami itt található: http Időzített elnémítás Fiók megemlítése Gyorsítótár frissítése - Nézd meg ki osztotta újra vagy adta hozzá a kedvencekhez Üzenet megemlítese News - Display news from Fedilab\'s account General Regional Art @@ -928,7 +808,6 @@ A Yandexnek megvan a saját adatvédelmi szabályzata, ami itt található: http Reconnect the account The application failed to access the admin features. You might need to reconnect the account for having the correct scope. Unresolved - Resolved Remote Active Pending @@ -944,7 +823,6 @@ A Yandexnek megvan a saját adatvédelmi szabályzata, ami itt található: http Disable Silence Notify the user per e-mail - Perform action Custom warning User Moderator @@ -976,7 +854,6 @@ A Yandexnek megvan a saját adatvédelmi szabályzata, ami itt található: http Empty content! Display Fedilab features button The application needs to access audio recording - An error occurred when recording the voice message! Voice message Enable quick reply The account you are replying might not see your message! @@ -984,9 +861,7 @@ A Yandexnek megvan a saját adatvédelmi szabályzata, ami itt található: http If disabled, sensitive media will be hidden with a button Store media in full size with a long press on previews Add an ellipse button at the top right for listing all tags/instances/lists - Display an item in the main menu for a quick access to the timeline targeting #Fedilab tag Keep an open connection to the streaming API for live notifications. - When the app is in background, it will keep a connection to the streaming API. Disable it if you care about your battery. During the time slot, the app will send notifications. You can reverse (ie: silent) this time slot with the right spinner. Display a Fedilab button below profile picture. It is a shortcut for accessing in-app features. Allow to reply directly in timelines below statuses @@ -998,9 +873,6 @@ A Yandexnek megvan a saját adatvédelmi szabályzata, ami itt található: http These tags will allow to filter statuses from profiles. You will have to use the context menu for seeing them. Automatically insert a line break after the mention to capitalize the first letter Allow content creators to share statuses to their RSS feeds - Timelines - Interface - Battery Compose Maximum retry times when uploading media Create a new Folder here @@ -1011,9 +883,7 @@ A Yandexnek megvan a saját adatvédelmi szabályzata, ami itt található: http Default Directory Folder Create folder - Use your favourite browser inside the application. By disabling, links will be opened externally Display a toast message after an action has been completed (boost, fav, etc.)? - Export muted instances Muted instances have been exported! Add an instance Export instances @@ -1109,7 +979,6 @@ A Yandexnek megvan a saját adatvédelmi szabályzata, ami itt található: http Enter your custom host or leave blank for using nitter.net Hide Fedilab notification bar For hiding the remaining notification in the status bar, tap on the eye icon button then uncheck: \"Display in status bar\" - Enable delayed notifications Notifications will be delayed every 30 seconds. That will allow to drain less battery. Live notifications delayed No live notifications @@ -1135,7 +1004,6 @@ A Yandexnek megvan a saját adatvédelmi szabályzata, ami itt található: http Title for the video Join Peertube I am at least 16 years old and agree to the %1$s of this instance - Colors Links Change the color of links (URLs, mentions, tags, etc.) in messages Reblogs header @@ -1147,15 +1015,12 @@ A Yandexnek megvan a saját adatvédelmi szabályzata, ami itt található: http Reset Icons Color of bottom icons in timelines - Background - Change the background color for timelines Pin this tag Logo of the instance Edit profile Make an action Translation Image preview - Change the theme Text color Change the text color in pots Apply changes diff --git a/app/src/main/res/values-hy/strings.xml b/app/src/main/res/values-hy/strings.xml index 89bc4a185..919c880b8 100644 --- a/app/src/main/res/values-hy/strings.xml +++ b/app/src/main/res/values-hy/strings.xml @@ -1,5 +1,4 @@ - - + Բացել ընտրացանկը Փակել ընտրացանկը @@ -16,8 +15,6 @@ Չեղարկել Ներբեռնել Ներբեռնել %1$s-ը - Ներբեռնումն ավարտված է - Պահել %1$s-ը Մեդիան պահված է Նիշք․ %1$s Գաղտնաբառ @@ -25,10 +22,8 @@ Հաշիվներ Թթեր Պիտակներ - Կտրոն Պահել Վերականգնել - Երկքայլ իսկորոշո՞ւմ Ոչ մի արդյունք Հանգույց Հանգույց․ mastodon.social @@ -39,10 +34,7 @@ Փոխել Ընտրել նկար… Մաքրել - Խոսափող Խցիկ - Ինչ-որ բան ասա - Ներիր, քո սարքը չի աջակցում ձայնային մուտքագրում։ Ջնջել ամենը Թարգմանել այս թութը։ Հերթ @@ -59,7 +51,6 @@ Արձագանքներ Օգտանուն Սևագրեր - Թարմ տվյալներն հասանելի են։ Ուզու՞մ ես դրանք տեսնել Հավանածներ Նոր հետևողներ Հիշատակումներ @@ -78,18 +69,12 @@ Հաղորդակցում Խլացված օգտատերեր Արգելափակված օգտատերեր - Հետևել հեռակա Ծանուցումներ Հետևելու հայտեր - Լավարկում Կարգավորումներ - Էջ - Ի՞նչ ես ուզում անել Ջնջել հաշիվ Ջնջե՞լ %1$s հաշիվը հավելվածից Ուղարկել էլփոստ - Ընտրիր նիշք - Ոչ մի նիշքախույզ չի հայտնաբերվել! Կտտացրու հետագծի վրա՝ այն փոխելու համար Ձախողում Հերթագրված թութեր @@ -99,10 +84,6 @@ Ուղիղ ծանուցումներ Թութ չկա - Թութն ավելացվել է նախընտրություններին - Թութը հեռացվել է նախընտրություններից - Թութը խրախուսվել է - Թութն այլևս խրախուսված չէ Խրախուսվել է %1$s-ի կողմից Ավելացնե՞լ այս թութը նախընտրություններին Հեռացնե՞լ այս թութը Նախընտրություններից @@ -134,10 +115,6 @@ Հեռացնե՞լ այս թութը Delete & re-draft this toot? - - %d արձագանք - %d արձագանք - Bookmarks Add to bookmarks Remove bookmark @@ -159,7 +136,6 @@ Արձագանքել թութին Write a queet Reply to a queet - Մոտեցել ես 500 նիշ սահմանափակմանը Ընտրել մեդիա Մեդիան ընտրելու ընթացքում սխալ է հայտնվել Ջնջե՞լ այս մեդիան @@ -193,7 +169,6 @@ Թութերի թարգմանությունը․ Փնտրել հանգույցներ․ Պատկերակի հեղինակ․ - Banner designer: Զրույց @@ -223,15 +198,10 @@ -ը խրախուսել է քո թութը -ը գրառումդ ավելացրել է նախընտրումներին -ը հետևում է քեզ - Նոր թութ %1$s-ից և մեկ այլ ծանուցում և %d այլ ծանուցումներ - - և մեկ այլ թութ - և %d այլ թութ - %d like %d likes @@ -267,7 +237,6 @@ Հանգույցի դոմեյնը կարծես անվավեր է Ինչ-որ սխալ տեղի ունեցավ հաշիվը փոխելու ընթացքում Փնտրելիս սխալ տեղի ունեցավ - Չես կարող մուտք գործել Էջի բովանդակությունը պահպանված է Անհնար է ինչ-րո բան անել Մեդիան պահպանված է @@ -276,12 +245,8 @@ Սևագիրը պահված է Վստա՞հ ես որ սույն հանգույցը թույլատրում է նիշերի նման քանակ։ Սովորաբար առավելագույնը 500 նիշն է։ Թութերի տեսանելությունը փոխվել է %1$s հաշվի համար - Հանգույցի ու օգտատիրոջ անունները չեն կարող դատարկ լինել - Բեռնման լավարկում Թութերի քանակը մեկ բեռնման համար - Հաշիվների քանակը՝ մեկ բեռնման համար - Ծանուցումների քանակը՝ մեկ բեռնման համար Միշտ WIFI Հարցնել @@ -290,13 +255,9 @@ Ցույց տալ… Ցույց չտալ… Զգայուն բովանդակություն - Ցուցադրել արձագանքին նախորդող հաղորդագրությունը - Ցուցադրել տեղական հոսքը - Ցուցադրել դաշնային հոսքը Անջատել գիֆ նկարները Հետագիծ․ Ինքնաշխատ պահել սևագրերը - Ցուցադրել հաշվիչները Թութում ներառել մեդիայի հղումը Տեղեկացնել, երբ որևէ մեկը սկսում է հետևել քեզ Տեղեկացնել, երբ որևէ մեկը տարածում է թութդ @@ -308,7 +269,6 @@ Ծանուցել միայն WIFI-ին կպած Ծանուցե՞լ Լուռ ծանուցումներ - Գիշերային ոճ NSFW ցուցադրման տևողությունը(վրկյ-ով, 0-ն անջատելն է) Խմբագրել Էջը Custom sharing @@ -332,12 +292,6 @@ Թույլատրել JavaScript Automatically expand cw Թույլատրել երրորդ կողմի քուքիներ - Հոսքերի չափսը. - - Ներդիրներ - Մենյու - Ներդիրներ և մենյու - Յանդեքս DeepL @@ -349,15 +303,6 @@ Light Black - - Ոչ - 512 կբ - 1 մբ - 2 մբ - 4 Mb - 6 Mb - 8 Mb - Կարգել LED-ի գույնը․ Կապույտ @@ -368,13 +313,9 @@ Դեղին Սպիտակ - Ծանուցել հարազատ հոսքում նոր թթերի դեպքում Հետևել - Չհետևել - Արգելափակել Ապաարգելափակել Խլացնել - Գործողություն չկա Ապախլացնել Հայտն ուղարկված է Հետևում է քեզ @@ -387,8 +328,6 @@ Հաստատիր այն փուշ ծանուցումները, որոնք ցանկանում ես ստանալ։ Հետագայում կարող ես անջատել կամ միացնել այս ծանուցումները կարգավորումներից։ - Հարազատ հոսքում չկարդացած թթերի համա՞ր - Չկարդացած ծանուցումների համա՞ր Մաքրել քեշը Քեշում %1$s բովանդակություն կա։\n\nՑանկանում ես ջնջե՞լ @@ -398,7 +337,6 @@ Title Title… Description - Description… Keywords Keywords… @@ -415,7 +353,6 @@ Show pinned No matching result found! Backup toots for %1$s - Backup notifications for %1$s %1$s new toots have been imported %1$s new notifications have been imported @@ -470,18 +407,14 @@ Վստա՞հ ես, որ ուզում ես ընդմիշտ ջնջել այս ցանկը Այս Ցանկում դեռ ոչինչ չկա։ Երբ ցանկի անդամները նոր գրառումներ կատարեն, դրանք կհայտնվեն այստեղ։ Ավելացնել ցանկին - Հանել ցանկից Ցանկ ավելացնել Ջնջել ցանկը Փոփոխել ցանկը Նոր ցանկի վերնագիր - Փնտրել քո հետևած մարդկանց մեջ - Քո ցանկերը The account was added to the list! You don\'t have any lists yet! %1$s-ը տեղափոխվել է %2$s - Ցուցադրել տարածումների/հավանումների հաշվիչ Իսկորոշումը չի՞ աշխատում Ահա մի քանի բան, որոնք կարող են օգնել․\n\n Համոզվիր, որ ոչ մի սխալ թույլ չես տվել՝ հանգույցի անվան մեջ\n\n @@ -498,25 +431,19 @@ %2$s-ից %1$s թութ արտահանվել է։ Ինչ-որ բան սխալ է գնացել %1$s-ի բովանդակությունն արտահանելու ընթացքում Something went wrong when exporting data! - Data have been imported! Something went wrong when importing data! Պրոքսի - Ձև Միացնե՞լ պրոքսին Հոսթ Պորտ Մուտք Գաղտնաբառ - Theme: - Compact mode Add toot details when sharing Support the app on Liberapay There is an error in the regular expression! - No account yet? No timelines was found on this instance! Delete this instance? - You are going to delete %s from your followed instances. Translate in Follow instance You already follow this instance! @@ -525,10 +452,8 @@ Information Hide boosts from %s Feature on profile - Hide everything from %s Show boosts from %s Don\'t feature on profile - Show everything from %s The account is now featured on profile The account is no longer featured on profile Boosts are now shown! @@ -549,7 +474,6 @@ Filter contexts One or multiple contexts where the filter should apply Expire after - Add New Filter Delete filter? Update filter Create filter @@ -564,13 +488,11 @@ Accounts were added to the list Adding accounts to the list You have not created a list yet. Tap on the \"+\" button to add a new one. - You don\'t follow any remote instances. Tap on the \"+\" button to add a new one. Who to follow Trunk API Account(s) can\'t be followed Fetching remote account Automatically expand hidden media - Display follow instances button New follow New Boost New Favourite @@ -595,7 +517,6 @@ Fetching remote status Comment Peertube instance - Display private messages timeline Be the first to leave a comment on this video with the top right button! %s views Duration: %s @@ -607,10 +528,6 @@ The video has been removed from bookmarks! There is no Peertube videos in your favourites! Channel - No Peertube channels - No Peertube instances - No Mastodon instances - No lists Videos Channels Use Emoji One @@ -618,12 +535,7 @@ Display previews in all toots New UX/UI designer Display video previews - Gitlab Support - Bug Report - There are no email clients installed. - Send a bug report The account id has been copied in the clipboard! - Optimization of the battery Change the language Default language Truncate long toots @@ -635,7 +547,6 @@ The tag has been stored! The tag has been changed! The tag has been deleted! - Display Art timeline Schedule boost The boost is scheduled! No scheduled boost to display! @@ -674,12 +585,7 @@ You can start writing first letters and names will be suggested.\n\n ⚠ The Login button will only work if the instance name is valid and the instance is up! - In this field, write the email that is attached to your Mastodon account. - - Last step is to enter your password and click on Login. - More information - If you use 2FA (Two-factor authentication), you need to use this link.\nYou can also use it if you do not want to enter your credentials here. Լեզուներ Media only @@ -691,16 +597,13 @@ Bot Pixelfed instance Mastodon instance - No Pixelfed instances Any of these All of these None of these Any of these words (space-separated) All these words (space-separated) - None of these words (space-separated) Add some words to filter (space-separated) Change column name - No Misskey instances Misskey instance No app supporting this link is installed on your device. Subscriptions @@ -717,7 +620,6 @@ Select the file to upload My videos Title - Categories License Category Language @@ -732,14 +634,10 @@ Tap here to edit the video data. Delete video Are you sure to delete this video? - No videos uploaded yet! Display NSFW videos - Default %s channel No videos to display! - Add media to favorites Leave a comment Share - My pictures Choose a schedule mode From device From server @@ -747,12 +645,8 @@ Toots (Device) Modify Display new toots above the \"Fetch more\" button - Confirmations Timelines - Notification service Interface - Hidden content - Composing Contacts %1$s commented your video %2$s]]> %1$s is following your channel %2$s]]> @@ -767,7 +661,6 @@ Import Data Select the file to import An error occurred when selecting the backup file! - Please, don\'t kill the app while processing. That can\'t be quite long. Add a public comment Send comment There is no Internet connection. Your message has been stored in drafts. @@ -808,18 +701,14 @@ end at %s Refresh poll Vote - A poll cannot be attached to a direct message! A poll you have voted in has ended A poll you tooted has ended Customize Categories - News Time slot Advanced Display \'new\' badge on unread toots - Display Peertube timeline Peertube - Hide the tab Move timeline Hide timeline Reorder timelines @@ -829,10 +718,8 @@ Undo You need to keep two visible tabs! Reorder timelines - Use the lists entry for deleting this list! Main timelines can only be hidden! BBCode - Add a timeline Always mark media as sensitive GNU instance Cached status @@ -847,14 +734,11 @@ History Playlists Display name - Privacy - Create You don\'t have any playlists. Tap on the \"+\" icon to add a new playlist You must provide a display name! The channel is required when the playlist is public. Create a playlist There is nothing in this playlist yet. - Edit media redo Gallery Emoji @@ -862,7 +746,6 @@ Eraser Text Filter - Adjust Brush Are you sure you want to exit without saving the image? Discard @@ -870,7 +753,6 @@ Image Saved Successfully! Failed to save Image Opacity - Crop Enable photo editor Add a poll item Remove last poll item @@ -882,10 +764,8 @@ Timed mute Mention the account Refresh cache - See who boosted and added to favorites Mention the status News - Display news from Fedilab\'s account General Regional Art @@ -929,7 +809,6 @@ Reconnect the account The application failed to access the admin features. You might need to reconnect the account for having the correct scope. Unresolved - Resolved Remote Active Pending @@ -945,7 +824,6 @@ Disable Silence Notify the user per e-mail - Perform action Custom warning User Moderator @@ -977,7 +855,6 @@ Empty content! Display Fedilab features button The application needs to access audio recording - An error occurred when recording the voice message! Voice message Enable quick reply The account you are replying might not see your message! @@ -985,9 +862,7 @@ If disabled, sensitive media will be hidden with a button Store media in full size with a long press on previews Add an ellipse button at the top right for listing all tags/instances/lists - Display an item in the main menu for a quick access to the timeline targeting #Fedilab tag Keep an open connection to the streaming API for live notifications. - When the app is in background, it will keep a connection to the streaming API. Disable it if you care about your battery. During the time slot, the app will send notifications. You can reverse (ie: silent) this time slot with the right spinner. Display a Fedilab button below profile picture. It is a shortcut for accessing in-app features. Allow to reply directly in timelines below statuses @@ -999,9 +874,6 @@ These tags will allow to filter statuses from profiles. You will have to use the context menu for seeing them. Automatically insert a line break after the mention to capitalize the first letter Allow content creators to share statuses to their RSS feeds - Timelines - Interface - Battery Compose Maximum retry times when uploading media Create a new Folder here @@ -1012,9 +884,7 @@ Default Directory Folder Create folder - Use your favourite browser inside the application. By disabling, links will be opened externally Display a toast message after an action has been completed (boost, fav, etc.)? - Export muted instances Muted instances have been exported! Add an instance Export instances @@ -1110,7 +980,6 @@ Enter your custom host or leave blank for using nitter.net Hide Fedilab notification bar For hiding the remaining notification in the status bar, tap on the eye icon button then uncheck: \"Display in status bar\" - Enable delayed notifications Notifications will be delayed every 30 seconds. That will allow to drain less battery. Live notifications delayed No live notifications @@ -1136,7 +1005,6 @@ Title for the video Join Peertube I am at least 16 years old and agree to the %1$s of this instance - Colors Links Change the color of links (URLs, mentions, tags, etc.) in messages Reblogs header @@ -1148,15 +1016,12 @@ Reset Icons Color of bottom icons in timelines - Background - Change the background color for timelines Pin this tag Logo of the instance Edit profile Make an action Translation Image preview - Change the theme Text color Change the text color in pots Apply changes diff --git a/app/src/main/res/values-id/strings.xml b/app/src/main/res/values-id/strings.xml index 5ce8b66c2..1757533f1 100644 --- a/app/src/main/res/values-id/strings.xml +++ b/app/src/main/res/values-id/strings.xml @@ -1,5 +1,4 @@ - - + Buka menu Tutup menu @@ -16,8 +15,6 @@ Batal Unduh Unduh %1$s - Unduh selesai - Simpan %1$s Media disimpan Berkas: %1$s Kata Sandi @@ -25,10 +22,8 @@ Akun Kutipan Label - Token Simpan Mengembalikan - Otentikasi dua langkah? Tidak ada hasil! Contoh Contoh: mastodon.sosial @@ -39,10 +34,7 @@ Perubahan Memilih gambar… Bersih - Mikropon Kamera - Tolong katakan sesuatu - Maaf! Perangkat Anda tidak mendukung input suara! Hapus semua Terjemahkan modul ini. Susunan acara @@ -59,7 +51,6 @@ Balasan Nama pengguna Konsep - Data baru tersedia! Apakah Anda ingin menampilkan mereka? Favorit Pengikut baru Menyebutkan @@ -78,18 +69,12 @@ Komunikasi Pengguna diredam Pengguna diblokir - Mengikuti terpisah Pemberitahuan Permintaan mengikuti - Optimasi Pengaturan - Profil - Apa yang ingin kamu lakukan? Menghapus akun Hapus akun %1$s dari aplikasi? Kirim sebuah surel - Silahkan pilih file - Penjelajah tidak menemukan file! Klik di Jalur untuk mengubahnya Gagal! Kutipan terjadwal @@ -99,10 +84,6 @@ Pemberitahuan langsung Tidak ada kutipan untuk ditampilkan - Kutipan ditambahkan ke favorit - Kutipan sudah dihapus dari favorit! - Kutipan ditingkatkan! - Kutipan tidak lagi ditingkatkan! Ditingkatkan sebesar %1$s Tambahkan kutipan ini ke favorit kamu? Hapus kutipan ini dari kesukaan Anda? @@ -134,9 +115,6 @@ Menghapus kutipan ini? Delete & re-draft this toot? - - %d balasan - Bookmark Tambahkan ke bookmark Hapus bookmark @@ -158,7 +136,6 @@ Balas ke sebuah kutipan Write a queet Reply to a queet - Kamu sudah mencapai 500 karakter yang diijinkan! Pilih media Terjadi kesalahan saat memilih media! Hapus media ini? @@ -192,7 +169,6 @@ Terjemahan dari kutipan: Contoh pencarian: Perancang ikon: - Desainer banner: Percakapan @@ -222,13 +198,9 @@ tingkatkan status Kamu status kesukaan Kamu mengikutimu - Kutipan baru dari %1$s dan %d pemberitahuan lainnya - - dan %d menemukan kutipan lain - %d likes @@ -263,7 +235,6 @@ Domain contoh sepertinya tidak valid! Terjadi kesalahan saat beralih akun! Terjadi kesalahan saat mencari! - Tidak bisa masuk! Data profil telah disimpan! Tidak dapat diambil tindakan Media telah tersimpan! @@ -272,12 +243,8 @@ Konsep tersimpan! Apakah anda yakin contoh ini memungkinkan jumlah karakter ini? biasanya, nilai mendekati 500 karakter. Visibilitas kutipan telah diubah untuk akun %1$s - Contoh nama dan nama layar tidak boleh kosong! - Pemuatan optimasi Jumlah kutipan per beban - Jumlah akun per beban - Jumlah pemberitahuan per beban Selalu WIFI Menanyakan @@ -286,13 +253,9 @@ Tampilkan lebih banyak… Tampilkan sedikit… Konten sensitif - Tampilan pesan sebelumnya di tanggapan - Tampilkan kronologi lokal - Tampilkan kronologi federasi Nonaktifkan avatar GIF Jalur: Simpan konsep otomatis - Tampilkan konter Tambahkan URL dari media kutipan Beritahu ketika seseorang mengikuti Anda Beritahu ketika seseorang meningkatkan status Anda @@ -304,7 +267,6 @@ Beritahu hanya di WIFI Memberitahu? Diamkan pemberitahuan - Modus malam Lihat NSFW waktu habis (detik, 0 berarti mati) Ubah profil Custom sharing @@ -328,12 +290,6 @@ Aktifkan Javascript Automatically expand cw Izinkan cookie pihak ketiga - Tata letak untuk kronologi: - - Tab - Menu - Tab dan menu - Yandex DeepL @@ -345,15 +301,6 @@ Light Hitam - - No - 512 Kb - 1 Mb - 2 Mb - 4 Mb - 6 Mb - 8 Mb - Atur warna LED: Biru @@ -364,13 +311,9 @@ Kuning Putih - Beritahu kutipan baru di beranda kronologi Ikuti - Berhenti mengikuti - Blokir Buka blokir Bisu - Tidak ada tindakan Bersuara Kirim permintaan Mengikutimu @@ -383,8 +326,6 @@ Tolong konfirmasi penolakan pemberitahuan yang ingin Anda terima. Anda dapat mengaktifkan atau menonaktifkan pemberitahuan ini di setelan (Tab pemberitahuan). - Untuk kutipan yang belum dibaca di beranda kronologi? - Untuk pemberitahuan yang belum dibaca? Kosongkan cache Ada %1$s data dalam cache.\n\nApakah Anda ingin menghapusnya? @@ -394,7 +335,6 @@ Judul Title… Description - Description… Keywords Keywords… @@ -411,7 +351,6 @@ Show pinned No matching result found! Backup toots for %1$s - Backup notifications for %1$s %1$s new toots have been imported %1$s new notifications have been imported @@ -468,18 +407,14 @@ https://yandex.ru/legal/confidential/?lang=en Apakah Anda yakin ingin menghapus secara permanen daftar ini? Belum ada dalam daftar ini. Saat Anggota daftar ini memposting status baru, mereka akan muncul disini. Tambahkan ke daftar - Hapus dari daftar Tambahkan daftar Hapus daftar Edit daftar Judul daftar baru - Pencarian di antara orang yang Anda ikuti - Daftar Anda The account was added to the list! You don\'t have any lists yet! %1$s telah dipindahkan ke%2$s - Tampilkan dorongan/jumlah favorit Otentikasi tidak bekerja? Disini ada beberapa pemeriksaan untuk membantu: \n\n @@ -497,25 +432,19 @@ https://yandex.ru/legal/confidential/?lang=en %1$s panjang dari %2$s telah diekspor. Terdapat kesalahan saat mengekspor data untuk %1$s Something went wrong when exporting data! - Data have been imported! Something went wrong when importing data! Proxy - Type Enable proxy? Host Port Login Password - Theme: - Compact mode Add toot details when sharing Support the app on Liberapay There is an error in the regular expression! - No account yet? No timelines was found on this instance! Delete this instance? - You are going to delete %s from your followed instances. Translate in Follow instance You already follow this instance! @@ -524,10 +453,8 @@ https://yandex.ru/legal/confidential/?lang=en Information Hide boosts from %s Feature on profile - Hide everything from %s Show boosts from %s Don\'t feature on profile - Show everything from %s The account is now featured on profile The account is no longer featured on profile Boosts are now shown! @@ -548,7 +475,6 @@ https://yandex.ru/legal/confidential/?lang=en Filter contexts One or multiple contexts where the filter should apply Expire after - Add New Filter Delete filter? Update filter Create filter @@ -563,13 +489,11 @@ https://yandex.ru/legal/confidential/?lang=en Accounts were added to the list Adding accounts to the list You have not created a list yet. Tap on the \"+\" button to add a new one. - You don\'t follow any remote instances. Tap on the \"+\" button to add a new one. Who to follow Trunk API Account(s) can\'t be followed Fetching remote account Automatically expand hidden media - Display follow instances button New follow New Boost New Favourite @@ -594,7 +518,6 @@ https://yandex.ru/legal/confidential/?lang=en Fetching remote status Comment Peertube instance - Display private messages timeline Be the first to leave a comment on this video with the top right button! %s views Duration: %s @@ -606,10 +529,6 @@ https://yandex.ru/legal/confidential/?lang=en The video has been removed from bookmarks! There is no Peertube videos in your favourites! Channel - No Peertube channels - No Peertube instances - No Mastodon instances - No lists Videos Channels Use Emoji One @@ -617,12 +536,7 @@ https://yandex.ru/legal/confidential/?lang=en Display previews in all toots New UX/UI designer Display video previews - Gitlab Support - Bug Report - There are no email clients installed. - Send a bug report The account id has been copied in the clipboard! - Optimization of the battery Change the language Default language Truncate long toots @@ -634,7 +548,6 @@ https://yandex.ru/legal/confidential/?lang=en The tag has been stored! The tag has been changed! The tag has been deleted! - Display Art timeline Schedule boost The boost is scheduled! No scheduled boost to display! @@ -673,12 +586,7 @@ https://yandex.ru/legal/confidential/?lang=en You can start writing first letters and names will be suggested.\n\n ⚠ The Login button will only work if the instance name is valid and the instance is up! - In this field, write the email that is attached to your Mastodon account. - - Last step is to enter your password and click on Login. - More information - If you use 2FA (Two-factor authentication), you need to use this link.\nYou can also use it if you do not want to enter your credentials here. Languages Media only @@ -690,16 +598,13 @@ https://yandex.ru/legal/confidential/?lang=en Bot Pixelfed instance Mastodon instance - No Pixelfed instances Any of these All of these None of these Any of these words (space-separated) All these words (space-separated) - None of these words (space-separated) Add some words to filter (space-separated) Change column name - No Misskey instances Misskey instance No app supporting this link is installed on your device. Subscriptions @@ -716,7 +621,6 @@ https://yandex.ru/legal/confidential/?lang=en Select the file to upload My videos Title - Categories License Category Language @@ -731,14 +635,10 @@ https://yandex.ru/legal/confidential/?lang=en Tap here to edit the video data. Delete video Are you sure to delete this video? - No videos uploaded yet! Display NSFW videos - Default %s channel No videos to display! - Add media to favorites Leave a comment Share - My pictures Choose a schedule mode From device From server @@ -746,12 +646,8 @@ https://yandex.ru/legal/confidential/?lang=en Toots (Device) Modify Display new toots above the \"Fetch more\" button - Confirmations Timelines - Notification service Interface - Hidden content - Composing Contacts %1$s commented your video %2$s]]> %1$s is following your channel %2$s]]> @@ -766,7 +662,6 @@ https://yandex.ru/legal/confidential/?lang=en Import Data Select the file to import An error occurred when selecting the backup file! - Please, don\'t kill the app while processing. That can\'t be quite long. Add a public comment Send comment There is no Internet connection. Your message has been stored in drafts. @@ -807,18 +702,14 @@ https://yandex.ru/legal/confidential/?lang=en end at %s Refresh poll Vote - A poll cannot be attached to a direct message! A poll you have voted in has ended A poll you tooted has ended Customize Categories - News Time slot Advanced Display \'new\' badge on unread toots - Display Peertube timeline Peertube - Hide the tab Move timeline Hide timeline Reorder timelines @@ -828,10 +719,8 @@ https://yandex.ru/legal/confidential/?lang=en Undo You need to keep two visible tabs! Reorder timelines - Use the lists entry for deleting this list! Main timelines can only be hidden! BBCode - Add a timeline Always mark media as sensitive GNU instance Cached status @@ -846,14 +735,11 @@ https://yandex.ru/legal/confidential/?lang=en History Playlists Display name - Privacy - Create You don\'t have any playlists. Tap on the \"+\" icon to add a new playlist You must provide a display name! The channel is required when the playlist is public. Create a playlist There is nothing in this playlist yet. - Edit media redo Gallery Emoji @@ -861,7 +747,6 @@ https://yandex.ru/legal/confidential/?lang=en Eraser Text Filter - Adjust Brush Are you sure you want to exit without saving the image? Discard @@ -869,7 +754,6 @@ https://yandex.ru/legal/confidential/?lang=en Image Saved Successfully! Failed to save Image Opacity - Crop Enable photo editor Add a poll item Remove last poll item @@ -881,10 +765,8 @@ https://yandex.ru/legal/confidential/?lang=en Timed mute Mention the account Refresh cache - See who boosted and added to favorites Mention the status News - Display news from Fedilab\'s account General Regional Art @@ -928,7 +810,6 @@ https://yandex.ru/legal/confidential/?lang=en Reconnect the account The application failed to access the admin features. You might need to reconnect the account for having the correct scope. Unresolved - Resolved Remote Active Pending @@ -944,7 +825,6 @@ https://yandex.ru/legal/confidential/?lang=en Disable Silence Notify the user per e-mail - Perform action Custom warning User Moderator @@ -976,7 +856,6 @@ https://yandex.ru/legal/confidential/?lang=en Empty content! Display Fedilab features button The application needs to access audio recording - An error occurred when recording the voice message! Voice message Enable quick reply The account you are replying might not see your message! @@ -984,9 +863,7 @@ https://yandex.ru/legal/confidential/?lang=en If disabled, sensitive media will be hidden with a button Store media in full size with a long press on previews Add an ellipse button at the top right for listing all tags/instances/lists - Display an item in the main menu for a quick access to the timeline targeting #Fedilab tag Keep an open connection to the streaming API for live notifications. - When the app is in background, it will keep a connection to the streaming API. Disable it if you care about your battery. During the time slot, the app will send notifications. You can reverse (ie: silent) this time slot with the right spinner. Display a Fedilab button below profile picture. It is a shortcut for accessing in-app features. Allow to reply directly in timelines below statuses @@ -998,9 +875,6 @@ https://yandex.ru/legal/confidential/?lang=en These tags will allow to filter statuses from profiles. You will have to use the context menu for seeing them. Automatically insert a line break after the mention to capitalize the first letter Allow content creators to share statuses to their RSS feeds - Timelines - Interface - Battery Compose Maximum retry times when uploading media Create a new Folder here @@ -1011,9 +885,7 @@ https://yandex.ru/legal/confidential/?lang=en Default Directory Folder Create folder - Use your favourite browser inside the application. By disabling, links will be opened externally Display a toast message after an action has been completed (boost, fav, etc.)? - Export muted instances Muted instances have been exported! Add an instance Export instances @@ -1108,7 +980,6 @@ https://yandex.ru/legal/confidential/?lang=en Enter your custom host or leave blank for using nitter.net Hide Fedilab notification bar For hiding the remaining notification in the status bar, tap on the eye icon button then uncheck: \"Display in status bar\" - Enable delayed notifications Notifications will be delayed every 30 seconds. That will allow to drain less battery. Live notifications delayed No live notifications @@ -1134,7 +1005,6 @@ https://yandex.ru/legal/confidential/?lang=en Title for the video Join Peertube I am at least 16 years old and agree to the %1$s of this instance - Colors Links Change the color of links (URLs, mentions, tags, etc.) in messages Reblogs header @@ -1146,15 +1016,12 @@ https://yandex.ru/legal/confidential/?lang=en Reset Icons Color of bottom icons in timelines - Background - Change the background color for timelines Pin this tag Logo of the instance Edit profile Make an action Translation Image preview - Change the theme Text color Change the text color in pots Apply changes diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index c47b74c9c..0fa130125 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -1,5 +1,4 @@ - - + Apri il menù Chiudi il menù @@ -16,8 +15,6 @@ Annulla Scarica Scarica %1$s - Scaricamento completato - Salva %1$s Media salvato File: %1$s Password @@ -25,10 +22,8 @@ Account Toot Etichette - Token Salva Ripristina - Autenticazione a due fattori? Nessun risultato! Istanza Istanza: mastodon.social @@ -39,10 +34,7 @@ Cambia Seleziona un\'immagine… Pulisci - Microfono Fotocamera - Per favore, dicci qualcosa - Siamo spiacenti! Il tuo dispositivo non supporta l\'inserimento vocale! Elimina tutto Traduci questo toot. Pianifica @@ -59,7 +51,6 @@ Risposte Nome utente Bozze - Sono disponibili nuovi dati! Li vuoi visualizzare? Preferiti Nuovi follower Menzioni @@ -78,18 +69,12 @@ Comunicazione Utenti silenziati Utenti bloccati - Segui da remoto Notifiche Richieste di follow - Ottimizzazione Impostazioni - Profilo - Cosa vuoi fare? Elimina un account Eliminare l\'account %1$s dall\'applicazione? Invia un\'email - Per favore seleziona un file - Nessun gestore file trovato! Fai clic sul percorso per cambiarlo Errore! Toot programmati @@ -99,10 +84,6 @@ Notifiche in tempo reale Nessun toot da mostrare - Il toot è stato aggiunto ai preferiti - Il toot è stato rimosso dai preferiti! - Il toot è stato ricondiviso! - Il toot non è più ricondiviso! Ricondiviso da %1$s Aggiungere questo toot ai tuoi preferiti? Rimuovere questo toot dai tuoi preferiti? @@ -134,10 +115,6 @@ Rimuovere questo toot? Cancellare & riscrivere questo toot? - - %d risposta - %d risposte - Segnalibri Aggiungi ai segnalibri Rimuovi segnalibro @@ -159,7 +136,6 @@ Rispondi ad un toot Scrivi un queet Rispondi ad un queet - Hai raggiunto i 500 caratteri consentiti! Seleziona un media Si è verificato un errore durante la selezione del media! Eliminare questo media? @@ -193,7 +169,6 @@ Traduzione dei toot: Cerca istanze: Designer icona: - Designer banner: Conversazione @@ -223,15 +198,10 @@ ha ricondiviso il tuo stato ha messo tra i preferiti il tuo stato ti segue - Nuovo toot da %1$s e un\'altra notifica e %d altre notifiche - - e un altro toot da scoprire - e altri %d toot da scoprire - %d mi piace %d mi piace @@ -267,7 +237,6 @@ Il dominio dell\'istanza non sembra essere valido! Si è verificato un errore durante il passaggio tra gli account! Si è verificato un errore durante la ricerca! - Impossibile accedere! I dati del profilo sono stati salvati! Nessuna azione può essere intrapresa Il media è stato salvato! @@ -276,12 +245,8 @@ Bozza salvata! Sei sicuro che questa istanza permetta questo numero di caratteri? Normalmente, questo valore è più vicino ai 500 caratteri. La visibilità dei toot è stata cambiata per l\'account %1$s - Il nome dell\'istanza e lo il nome visualizzato non possono essere vuoti! - Ottimizzazioni del caricamento Numero di toot per caricamento - Numero di account per caricamento - Numero di notifiche per caricamento Sempre WIFI Chiedi @@ -290,13 +255,9 @@ Mostra di più… Mostra meno… Contenuto sensibile - Mostra messaggio precedente nelle risposte - Mostra timeline locale - Mostra timeline federata Disabilita avatar GIF Percorso: Salva bozze automaticamente - Mostra contatori Aggiungi URL dei media nei toot Notifica quando qualcuno ti segue Notifica quando qualcuno ricondivide al tuo stato @@ -308,7 +269,6 @@ Notifica solo in WIFI Notifica? Notifiche silenziose - Modalità notturna Timeout visualizzazione NSFW (secondi, 0 significa spento) Modifica profilo Condivisione personalizzata @@ -332,12 +292,6 @@ Abilita Javascript Espandi automaticamente cw Permetti cookie di terze-parti - Layout per le timeline: - - Schede - Menu - Schede e menu - Yandex DeepL @@ -349,15 +303,6 @@ Chiaro Nero - - No - 512 Kb - 1 Mb - 2 Mb - 4 MB - 6 MB - 8 MB - Imposta colore LED: Blu @@ -368,13 +313,9 @@ Giallo Bianco - Notifica nuovi toot nella timeline home Segui - Smetti di seguire - Blocca Sblocca Silenzia - Nessuna azione Non silenziare Richiesta inviata Ti segue @@ -387,8 +328,6 @@ Per favore, conferma le notifiche push che vuoi ricevere. Puoi abilitare o disabilitar queste notifiche dopo nelle impostazioni (Scheda notifiche). - Per i toot non letti nella timeline home? - Per le notifiche non lette? Pulisci cache Ci sono %1$s di dati nella cache.\n\n Li vuoi eliminare? @@ -398,7 +337,6 @@ Titolo Titolo… Descrizione - Descrizione… Parole chiave Parole chiave… @@ -415,7 +353,6 @@ Mostra in evidenza Nessuna corrispondenza trovata! Backup dei toot per %1$s - Backup notifiche per %1$s %1$s nuovi toot sono stati importati %1$s nuove notifiche sono state importate @@ -471,18 +408,14 @@ Sei sicuro di voler eliminare definitivamente questa lista? Non c\'è ancora niente in questa lista. Quando i membri di questa lista postano nuovi stati, questi appariranno qui. Aggiungi alla lista - Rimuovi dall\'elenco Aggiungi lista Elimina lista Modifica lista Titolo della nuova lista - Cerca tra le persone che segui - Le tue liste L\'account è stato aggiunto alla lista! Non hai ancora nessuna lista! %1$s è stato spostato su %2$s - Mostra conteggio ricondivisi/favoriti L\'autenticazione non funziona? Qui ci sono alcuni controlli che possono aiutare:\n\n - Controlla che non ci siano errori di trascrizione nel nome dell\'istanza\n\n @@ -499,25 +432,19 @@ %1$s toot di %2$s sono stati esportati. Qualcosa è andato storto esportando i dati per %1$s Qualcosa è andato storto durante l\'esportazione dei dati! - I dati sono stati importati! Qualcosa è andato storto durante l\'importazione dei dati! Proxy - Tipo Abilitare il proxy? Host Porta Login Password - Tema: - Modalità compatta Aggiungi dettagli del toot quando condividi Supporta l\'app su Liberapay C\'è un errore nell\'espressione regolare! - Non hai ancora un account? Nessuna timeline trovata su questa istanza! Eliminare questa istanza? - Stai per eliminare %s dalle tue istanze seguite. Traduci in Segui istanza Stai già seguendo questa istanza! @@ -526,10 +453,8 @@ Informazioni Nascondi boost da %s Metti in evidenza sul profilo - Nascondi tutto da %s Mostra boost da %s Non mettere in evidenza sul tuo profilo - Mostra tutto da %s L\'account ora è in evidenza sul tuo profilo L\'account ora non è più in evidenza sul tuo profilo I boost ora sono visibili! @@ -550,7 +475,6 @@ Filtra contesti Uno o più contesti dove applicare il filtro Scade dopo - Aggiungi Nuovo Filtro Elimina filtro? Aggiorna filtro Crea filtro @@ -565,13 +489,11 @@ Gli account sono stati aggiunti alla lista Aggiunta degli account alla lista Non hai ancora creato nessuna lista. Clicca sul pulsante \"+\" per aggiungerne una nuova. - Non stai seguendo nessuna istanza remota. Clicca sul pulsante \"+\" per aggiungerne una nuova. Chi seguire API Trunk Il/gli account non può/possono essere seguito/i Recupero dell\'account remoto Espandi automaticamente i media nascosti - Mostra il pulsante per seguire le istanze Una nuova persona ti segue Un nuovo boost Un nuovo mi piace @@ -596,7 +518,6 @@ Recupero dello stato remoto Commenta Istanza Peertube - Mostra la timeline dei messaggi diretti Lascia per primo un commento su questo video premendo il pulsante in alto a destra! %s visualizzazioni Durata: %s @@ -608,10 +529,6 @@ Il video è stato rimosso dai preferiti! Non c\'è nessun video di Peertube nei tuoi preferiti! Canale - Nessun canale di Peertube - Nessuna istanza di Peertube - Nessuna istanza di Mastodon - Nessuna lista Video Canali Utilizza le Emoji One @@ -619,12 +536,7 @@ Mostra anteprime in tutti i toot Nuovo designer UX/UI Mostra le anteprime dei video - Supporto Gitlab - Segnala errori - Non ci sono client email installati. - Invia un rapporto sugli errori L\'ID dell\'account è stato copiato negli appunti! - Ottimizzazione della batteria Cambia lingua Lingua predefinita Tronca toot lunghi @@ -636,7 +548,6 @@ L\'etichetta è stata salvata! L\'etichetta è stata modificata! L\'etichetta è stata eliminata! - Mostra la timeline Arte Programma boost Il boost è programmato! Nessun boost programmato da mostrare! @@ -675,12 +586,7 @@ Puoi iniziare a digitare le prime lettere ed i nomi verranno suggeriti.\n\n ⚠ Il pulsante di accesso funzionerà solo se il nome dell\'istanza è valido e l\'istanza è online! - In questo campo, scrivi l\'indirizzo email collegato al tuo account Mastodon. - - L\'ultimo passaggio è inserire la tua password e premere Accedi. - Più informazioni - Se utilizzi il 2FA (Autenticazione a 2 fattori), hai bisogno di questo collegamento.\nPuoi anche usarlo se non vuoi inserire le tue credenziali qui. Lingue Solo media @@ -692,16 +598,13 @@ Bot Istanza Pixelfed Istanza Mastodon - Nessuna istanza Pixelfed Qualsiasi tra queste Tutte queste Nessuna di queste Qualsiasi tra queste parole (separate da spazi) Tutte queste parole (separate da spazi) - Nessuna di queste parole (separate da spazi) Aggiungi alcune parole da filtrare (separate da spazio) Rinomina colonna - Nessuna istanza Misskey Istanza Misskey Nessuna app che supporta questo collegamento è installata sul tuo dispositivo. Iscrizioni @@ -718,7 +621,6 @@ Seleziona il file da caricare I miei video Titolo - Categorie Licenza Categoria Lingua @@ -733,14 +635,10 @@ Clicca qui per modificare i dati del video. Elimina video Sei sicuro di voler eliminare questo video? - Non è ancora stato caricato nessun video! Mostrare video NSFW - Canale predefinito di %s Nessun video da mostrare! - Aggiungi media ai preferiti Lascia un commento Condividi - Le mie immagini Scegli una modalità di pianificazione Dal dispositivo Dal server @@ -748,12 +646,8 @@ Toot (Dispositivo) Modifica Visualizza nuovi toot sopra il pulsante \"Recupera altri toot\" - Conferme Timeline - Servizio di notifica Interfaccia - Contenuto nascosto - Componendo Contatti %1$s ha commentato il tuo video %2$s]]> %1$s sta seguendo il tuo canale %2$s]]> @@ -768,7 +662,6 @@ Importa dati Seleziona il file da importare Si è verificato un errore durante la selezione del file di backup! - Per favore, non terminare l\'app durante l\'elaborazione. Non ci metterà molto. Aggiungi un commento pubblico Invia commento Non c\'è connessione ad Internet. Il tuo messaggio è stato salvato nelle bozze. @@ -809,18 +702,14 @@ termina tra %s Aggiorna sondaggio Vota - Un sondaggio non può essere allegato ad un messaggio diretto! Un sondaggio in cui hai votato è terminato Un tuo sondaggio è terminato Personalizza Categorie - Novità Fascia oraria Avanzate Mostra l\'icona \'nuovo\' sui toot non letti - Mostra timeline di Peertube Peertube - Nascondi la scheda Sposta timeline Nascondi timeline Riordina timeline @@ -830,10 +719,8 @@ Annulla Devi mantenere almeno due schede visibili! Riordina timeline - Usa la voce delle liste per eliminare questa lista! Le timeline principali possono solo essere nascoste! BBCode - Aggiungi una timeline Segna sempre media come sensibili Istanza GNU Stato in cache @@ -848,14 +735,11 @@ Cronologia Playlist Nome visualizzato - Privacy - Crea Non hai nessuna playlist. Clicca sull\'icona \"+\" per aggiungere una nuova playlist È necessario fornire un nome da visualizzare! Il canale è richiesto quando la playlist è pubblica. Crea una playlist Non c\'è ancora nulla in questa playlist. - Modifica media ripeti Galleria Emoji @@ -863,7 +747,6 @@ Gomma da cancellare Testo Filtro - Regola Pennello Sei sicuro di voler uscire senza salvare l\'immagine? Scarta @@ -871,7 +754,6 @@ Immagine salvata con successo! Impossibile salvare l\'immagine Opacità - Ritaglia Abilita editor foto Aggiungi una voce al sondaggio Rimuovi l\'ultima voce del sondaggio @@ -883,10 +765,8 @@ Silenzio temporizzato Menziona l\'account Aggiorna cache - Guarda chi ha boostato e ha aggiunto ai preferiti Menziona lo stato Novità - Mostra le novità dall\'account di Fedilab Generale Locale Arte @@ -930,7 +810,6 @@ Riconnetti l\'account L\'applicazione non è riuscita ad accedere alle funzionalità di amministrazione. Potresti aver bisogno di riconnettere l\'account per avere le autorizzazioni corrette. Non risolte - Risolte Da remoto Attive In attesa @@ -946,7 +825,6 @@ Disabilita Silenzia Notifica l\'utente via e-mail - Esegui azione Avviso personalizzato Utente Moderatore @@ -978,7 +856,6 @@ Senza contenuto! Mostra il pulsante delle funzionalità di Fedilab L\'applicazione richiede l\'accesso al microfono - Si è verificato un errore durante la registrazione del messaggio vocale! Messaggio vocale Abilita risposta veloce L\'account al quale stai rispondendo potrebbe non vedere il tuo messaggio! @@ -986,9 +863,7 @@ Se disabilitato, i media con contenuti sensibili saranno nascosti con un pulsante Salva media in dimensione originale tenendo premuto nelle anteprime Aggiungi un pulsante con i 3 puntini in alto a destra per elencare tutte le etichette/istanze/liste - Mostra un collegamento nel menu principale per un accesso rapido alla timeline che punta all\'etichetta #Fedilab Tieni una connessione aperta con le API del flusso per notifiche in tempo reale. - Quando l\'app è in background, terrà aperta una connessione con le API del flusso. Disabilita se tieni alla tua batteria. Durante l\'intervallo di tempo, l\'app invierà notifiche. Puoi invertire (es: silenziare) questo intervallo di tempo con il menù a destra. Mostra un pulsante di Fedilab sotto l\'immagine del profilo. Questa è una scorciatoia per accedere alle funzionalità dell\'app. Consenti di rispondere direttamente nelle timeline sotto gli stati @@ -1000,9 +875,6 @@ Queste etichette ti consentono di filtrare stati dai profili. Dovrai usare il menu contestuale per visualizzarli. Inserisci automaticamente un\'interruzione di linea dopo la citazione per mettere in maiuscolo la prima lettera Consenti ai creatori di contenuti di condividere stati ai loro Feed RSS - Timeline - Interfaccia - Batteria Composizione Massimo numero di tentativi per il caricamento dei media Crea una nuova Cartella qui @@ -1013,9 +885,7 @@ Cartella Predefinita Cartella Crea cartella - Usa il tuo browser preferito all\'interno dell\'applicazione. Disabilitandolo, i collegamenti verranno aperti esternamente Mostrare un messaggio a comparsa dopo che un\'azione è stata completata (boost, mi piace, ecc.)? - Esporta istanze silenziate Le istanze silenziate sono state esportate! Aggiungi un istanza Esporta le istanze @@ -1111,7 +981,6 @@ Inserisci il tuo host personalizzato o lascia vuoto per usare nitter.net Nascondi barra di notifica di Fedilab Per nascondere le notifiche rimanenti nella barra di stato, clicca sul pulsante con l\'icona di un occhio e deseleziona: \"Mostra nella barra di stato\" - Abilita notifiche differite Le notifiche saranno differite ogni 30 secondi. Questo consentirà un minore consumo di batteria. Notifiche in tempo reale differite Nessuna notifica in tempo reale @@ -1137,7 +1006,6 @@ Titolo per il video Unisciti a Peertube Ho almeno 16 anni e accetto le %1$s di questa istanza - Colori Collegamenti Cambiare il colore dei collegamenti (URL, menzioni, etichette, ecc.) nei messaggi Intestazione dei reblog @@ -1149,15 +1017,12 @@ Reimposta Icone Colore delle icone sul fondo nelle timeline - Sfondo - Cambia il colore di sfondo per le timeline Metti etichetta in evidenza Logo dell\'istanza Modifica profilo Make an action Traduzione Anteprima immagine - Cambia il tema Colore del testo Change the text color in pots Applica le modifiche diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 62109f22d..bde250862 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -1,5 +1,4 @@ - - + メニューを開く メニューを閉じる @@ -16,8 +15,6 @@ キャンセル ダウンロード ダウンロード: %1$s - ダウンロード完了 - %1$s を保存 メディアを保存しました ファイル:%1$s パスワード @@ -25,10 +22,8 @@ アカウント トゥート タグ - トークン 保存 復元 - 2段階認証を利用していますか? 検索結果はありません! インスタンス インスタンス:mastodon.social @@ -39,10 +34,7 @@ 変更 画像を選択… 削除 - マイク カメラ - 何か話してみてください - お使いのデバイスは音声入力をサポートしておりません! すべて削除 このトゥートを翻訳します。 予約 @@ -59,7 +51,6 @@ 返信 ユーザー名 下書き - 新しいデータが利用可能です! 表示しますか? お気に入り 新しいフォロワー メンション @@ -78,18 +69,12 @@ コミュニケーション ミュートしたユーザー ブロックしたユーザー - リモートフォロー 通知 フォローリクエスト - 最適化 設定 - プロフィール - 何をしますか? アカウントを削除する アプリケーションからアカウント %1$s を削除しますか? メールを送信 - ファイルを選択してください - ファイルエクスプローラが見つかりません! パスをタップして変更する 失敗! トゥート予約 @@ -99,10 +84,6 @@ ライブ通知 トゥートがありません - トゥートがお気に入りに追加されました - トゥートはお気に入りから削除されました! - トゥートをブーストしました! - トゥートのブーストを取り消しました! %1$s にブーストされました このトゥートをお気に入りに追加しますか? このトゥートをお気に入りから削除しますか? @@ -134,9 +115,6 @@ このトゥートを削除しますか? このトゥートを削除して書き直しますか? - - %d が返信 - ブックマーク ブックマークに追加する ブックマークを削除 @@ -158,7 +136,6 @@ トゥートに返信 Queetを書く Queetに返信 - 500文字の制限に達しました! メディアを選択 メディアの選択中にエラーが発生しました。 このメディアを削除しますか? @@ -192,7 +169,6 @@ トゥートの翻訳: インスタンスを検索: アイコンデザイナー: - バナー デザイナー: 会話 @@ -222,13 +198,9 @@ がブーストしました がお気に入りに登録しました があなたをフォローしました - %1$s の新着 別の通知 - - もう一つの発見 - %d いいね @@ -263,7 +235,6 @@ インスタンスのドメインが有効ではないようです! アカウントの切り替え中にエラーが発生しました! 検索中にエラーが発生しました! - ログインできません! プロフィールデータを保存しました! 何もすることはできません メディアを保存しました! @@ -272,12 +243,8 @@ 下書きを保存しました! インスタンスはこの文字数を許可していますか? 通常、この値は500文字程度です。 アカウント %1$s のトゥートの公開範囲が変更されました - インスタンス名と表示名を空欄にすることはできません! - 読み込みの最適化 一回あたりに読み込むトゥートの数 - 一回あたりに読み込むアカウントの数 - 一回あたりに読み込む通知の数 常に Wi-Fi 尋ねる @@ -286,13 +253,9 @@ さらに表示… 一部のみ表示... 閲覧注意 - 応答に前のメッセージを表示する - ローカルタイムラインを表示 - 連合タイムラインを表示 GIFアバターを無効にする パス: 下書きを自動的に保存する - カウンターを表示する トゥートにメディアのURLを追加する フォローされたときに通知 トゥートがブーストされたときに通知する @@ -304,7 +267,6 @@ WIFI接続時のみ通知 通知する サイレント通知 - 夜間モード NSFWビューのタイムアウト(秒、0でオフ) プロフィールを編集 カスタム共有 @@ -328,12 +290,6 @@ Javascript を有効にする CWを自動的に展開する サードパーティのCookieを許可する - タイムラインのレイアウト: - - タブ - メニュー - タブとメニュー - Yandex DeepL @@ -345,15 +301,6 @@ ライト - - なし - 512 KB - 1 MB - 2 MB - 4MB - 6MB - 8MB - LEDの色: @@ -364,13 +311,9 @@ - ホームタイムラインの新しいトゥートを通知 フォローする - フォロー解除 - ブロック ブロック解除 ミュート - 何もしない ミュート解除 リクエスト送信 あなたをフォロー @@ -382,8 +325,6 @@ プッシュ通知 受信したいプッシュ通知を確認してください。 後でこれらの通知を設定で有効または無効にすることができます(通知タブ)。 - ホームタイムラインでの未読トゥートは? - 未読の通知は? キャッシュの消去 キャッシュに %1$s のデータがあります。\n\n削除しますか? @@ -393,7 +334,6 @@ タイトル タイトル… 説明 - 説明… キーワード キーワード… @@ -410,7 +350,6 @@ ピン留めトゥートを表示 一致するものは見つかりませんでした! %1$s のトゥートをバックアップ - %1$sのバックアップ通知 %1$s 件の新しいトゥートをインポートしました %1$s件の新しい通知をインポートしました @@ -461,18 +400,14 @@ このリストを完全に削除してもよろしいですか? このリストにはまだ何もありません。 このリストのメンバーが新しいトゥートを投稿すると、ここに表示されます。 リストに追加 - リストから削除 リストを追加 リストを削除 リストを編集 新しいリストのタイトル - フォローしている人の中から検索 - あなたのリスト アカウントをリストに追加しました! リストはありません! %1$s は %2$s へ引越しました - ブースト/お気に入りの数を表示 認証が機能していませんか? 役立つかもしれない確認事項:\n\n - インスタンス名の記述に間違いが無いかをチェック\n\n @@ -489,25 +424,19 @@ %2$s 件中 %1$s 件のトゥートをエクスポートしました。 %1$s のデータをエクスポート中に問題が発生しました データのエクスポート中に問題が発生しました! - データがインポートされました! データのインポート中に問題が発生しました! プロキシ - タイプ プロキシの有効化 ホスト ポート ログイン パスワード - テーマ: - コンパクト モード 共有時にトゥートの詳細を付加する Liberapayでアプリを支援 正規表現に誤りがあります! - まだアカウントがありませんか? このインスタンスにタイムラインが見つかりませんでした! このインスタンスを削除しますか? - %s をフォローインスタンスから削除しようとしています。 次の言語に翻訳 インスタンスをフォロー 既にこのインスタンスをフォローしています! @@ -516,10 +445,8 @@ 情報 %s からのブーストを非表示 プロフィールで紹介 - %s からの全てを非表示 %s からのブーストを表示 プロフィールから外す - %s からの全てを表示 アカウントはプロフィールで紹介されています プロフィールの紹介からこのアカウントを削除しました ブーストを表示するようにしました! @@ -540,7 +467,6 @@ フィルター対象 フィルターを適用する1つ以上の対象 期限 - 新しいフィルターを追加 フィルターを削除しますか? フィルターの更新 フィルターの作成 @@ -555,13 +481,11 @@ アカウントがリストに追加されました アカウントをリストに追加 まだリストを作成していません。新規に追加するには \"+\" ボタンをタップします。 - リモートインスタンスをフォローしていません。新規に追加するには、 \"+\" ボタンをタップします。 おすすめのアカウント Trunk API アカウントをフォローできません リモートアカウントを取得中です 非表示のメディアを自動的に展開する - フォローインスタンス ボタンを表示する 新しいフォロー 新しいブースト 新しいお気に入り @@ -586,7 +510,6 @@ リモートステータスを取得中 コメント Peertubeインスタンス - プライベートメッセージのタイムラインを表示 右上のボタンをタップして最初のコメントを投稿しましょう! %s 回再生 長さ: %s @@ -598,10 +521,6 @@ この動画をブックマークから削除しました! お気に入りのPeertubeの動画はありません! チャンネル - Peertubeのチャンネルはありません - Peertubeのインスタンスはありません - Mastodonのインスタンスはありません - リストはありません 動画 チャンネル Emoji Oneを使用する @@ -609,12 +528,7 @@ 全てのトゥートでプレビューを表示する 新しいUX/UIデザイナー 動画プレビューを表示する - Gitlabでのサポート - バグ報告 - メールクライアントがインストールされていません。 - バグレポートを送信 アカウントIDをクリップボードにコピーしました! - バッテリー持ちの最適化 言語の変更 既定の言語 長いトゥートを折りたたむ @@ -626,7 +540,6 @@ タグを保存しました! タグを変更しました! タグを削除しました! - アートタイムラインを表示 ブースト予約 ブーストを予約しました! 予約済みブーストはありません! @@ -664,12 +577,7 @@ このフィールドにはサーバーのホスト名を入力してください。\n例えば、https://mastodon.socialでアカウントを作成した場合\nmastodon.socialとだけ入力してください(https://を除く)\n 最初の文字を入力するとそれに続く名前がサジェストされます。\n\n ⚠ログインボタンはサーバー名が有効で、サーバーが稼働しているときのみ有効です! - このフィールドには、Mastodonアカウントに関連付けられたメールアドレスを入力してください。 - - 最後にパスワードを入力してログインをタップしてください。 - 詳しい情報 - 2FA(2段階認証)を利用している場合、このリンクを使用してください。\nログイン情報をここに入力したくない場合にも利用できます。 言語 メディアのみ表示 @@ -681,16 +589,13 @@ ボット Pixelfedインスタンス Mastodonインスタンス - Pixelfedのインスタンスがありません いずれか含む すべてを含む すべて除外 これらの単語を除く(スペースで区切り) 含める単語(スペースで区切り) - 除外する単語(スペースで区切り) フィルターする単語を追加(スペースで区切り) カラムの名前を変更 - Misskeyのインスタンスはありません Misskeyインスタンス このリンクを開けるアプリがインストールされていません。 サブスクリプション @@ -707,7 +612,6 @@ アップロードするファイルを選択する 動画 タイトル - カテゴリ ライセンス カテゴリ 言語 @@ -722,14 +626,10 @@ タップして動画情報を編集します。 動画を削除 この動画を本当に削除しますか? - 動画がアップロードされていません! NSFW動画を表示 - %s のデフォルトチャンネル 動画がありません! - メディアをお気に入りに追加 コメントする 共有 - 自分の写真 予約モードを選択 この端末から サーバーから @@ -737,12 +637,8 @@ トゥート(端末) 変更 新しいトゥートを「もっと見る」ボタンの上に表示する - 確認 タイムライン - 通知サービス インターフェイス - 非表示のコンテンツ - 投稿の作成 連絡先 %1$sが%2$sにコメントしました]]> %1$sが%2$sをフォローしました]]> @@ -757,7 +653,6 @@ データのインポート インポートするファイルを選択 バックアップファイルの選択中にエラーが発生しました! - 処理中にアプリを終了しないでください。そこまで長くはかかりません。 パブリックコメントを追加 コメントを送信 インターネット接続がありません。メッセージは下書きに保存しました。 @@ -798,18 +693,14 @@ %sで締め切り アンケートを更新 投票 - ダイレクトメッセージにはアンケートを設置できません! 投票したアンケートが締め切られました トゥートしたアンケートが締め切られました カスタマイズ カテゴリ - ニュース 時間帯管理 上級者向け 未読のトゥートに「new」バッジを表示する - Peertubeのタイムラインを表示する Peertube - タブを非表示にする タイムラインの移動 タイムラインを非表示にする タイムラインの並び替え @@ -819,10 +710,8 @@ 元に戻す 最低でも2つタブを表示する必要があります! タイムラインの並び替え - このリストを削除するにはリストエントリーを使用してください! メインタイムラインは非表示にしかできません! BBコード - タイムラインを追加 メディアを常に閲覧注意に設定する GNUインスタンス キャッシュされたステータス @@ -837,14 +726,11 @@ 履歴 プレイリスト 表示名 - プライバシー - 作成 プレイリストがありません。プレイリストを作成するには\"+\"アイコンをタップします 表示名を入力する必要があります! プレイリストがパブリックのときにはチャンネルが必要です。 プレイリストを作成 プレイリストにはまだ何もありません。 - メディアを編集 元に戻す ギャラリー 絵文字 @@ -852,7 +738,6 @@ 消しゴム テキスト フィルター - 調整 ブラシ 画像を保存せずに閉じてよろしいですか? 破棄 @@ -860,7 +745,6 @@ 画像が正常に保存されました! 画像を保存できませんでした 透明度 - トリミング 画像エディターを有効化 アンケートの項目を追加 最後のアンケートの項目を削除 @@ -872,10 +756,8 @@ 時限ミュート アカウントをメンション キャッシュをリフレッシュ - ブーストまたはお気に入りに追加したユーザーを表示 ステータスをメンション ニュース - Fedilab公式アカウントからのニュースを表示する 全般 地域 アート @@ -919,7 +801,6 @@ アカウントに再接続 管理者向け機能へのアクヘスに失敗しました。正常な動作のためにはアカウントに再接続する必要があります。 未解決 - 解決済み リモート アクティブ 保留 @@ -935,7 +816,6 @@ 無効 サイレント メールでユーザーに通知 - アクションを実行 カスタム警告文 ユーザー モデレーター @@ -967,7 +847,6 @@ コンテンツが空です! Fedilab機能ボタンを表示する このアプリは音声の録音へのアクセス許可が必要です - ボイスメッセージの録音中にエラーが発生しました! ボイスメッセージ クイック返信を有効化する あなたが返信しているアカウントにはあなたのメッセージが表示されていないかもしれません! @@ -975,9 +854,7 @@ 無効にすると、閲覧注意のメディアは非表示になり、ボタンだけが表示されます プレビューで長押ししてメディアをオリジナルのサイズで保存します 右上にすべてのタグ、インスタンス、リストを表示する楕円のボタンを追加します - メインメニューに #Fedilab タグのタイムラインへのクイックアクセスのための項目を表示します ライブ通知のためにストリーミングAPIへ常時接続します。 - アプリがバックグラウンドに常駐しているとき、ストリーミングAPIへの接続を維持します。バッテリー持ちを気にする場合は無効にしてください。 指定された時間帯に、アプリは通知を送信します。右のスピンボタンを押すと、設定を反転することができます。(指定された時間に非通知) プロフィール画像の下にFedilabボタンを表示します。このボタンはアプリ内機能へのショートカットです。 トゥートの下のタイムラインから直接返信できるようにします。 @@ -989,9 +866,6 @@ これらのタグはプロフィールからトゥートを取り除くことがあります。取り除かれたトゥートを表示するにはコンテキストメニューを使用する必要があります。 最初の文字を大文字にするために、メンションの後に自動的に改行を挿入します コンテンツの作成者がRSSフィードにトゥートを共有できるようになります - タイムライン - インターフェイス - バッテリー トゥートの作成 メディアのアップロード時の最大試行回数 ここに新規フォルダーを作成 @@ -1002,9 +876,7 @@ 既定のディレクトリ フォルダー フォルダーを作成 - アプリ内でお気に入りのブラウザを使用します。無効にすると、リンクは外部アプリで開きます アクション(ブースト、お気に入りなど)が完了したらトースト通知を表示する - ミュートしたインスタンスをエクスポートします ミュートしたインスタンスをエクスポートしました! インスタンスを追加 インスタンスをエクスポート @@ -1098,7 +970,6 @@ カスタムホストを入力してください。空欄にするとnitter.netが使用されます。 通知バーからFedilabを非表示にする ステータスバーに残っている通知を非表示にするには、目のアイコンをタップして「ステータスバーに表示する」のチェックを外します - 通知を遅らせる 通知は30秒ごとに遅延が発生します。バッテリーの持ちが改善します。 遅延ありのライブ通知 ライブ通知なし @@ -1124,7 +995,6 @@ 動画のタイトル Peertubeに参加 私は16歳以上で、インスタンスの %1$s に同意します。 - リンク メッセージ内のリンク(URL、メンション、タグなど)の色を変更する ブーストヘッダー @@ -1136,15 +1006,12 @@ リセット アイコン タイムラインの下部アイコンの色 - 背景 - タイムラインの背景色を変更する Pin this tag Logo of the instance Edit profile Make an action Translation Image preview - Change the theme Text color Change the text color in pots Apply changes diff --git a/app/src/main/res/values-kab/strings.xml b/app/src/main/res/values-kab/strings.xml index d14febcdb..0c36a5fdf 100644 --- a/app/src/main/res/values-kab/strings.xml +++ b/app/src/main/res/values-kab/strings.xml @@ -1,5 +1,4 @@ - - + Ldi umuγ Mdel umuγ @@ -16,8 +15,6 @@ Sefsex Sider Asider n %1$s - Asider yemmed - Ḥrez %1$s Media saved Afaylu: %1$s Awal uffir @@ -25,10 +22,8 @@ Imiḍan Toots Tibzimin - Ajiṭun Aḥrez Err-d - Asesteb s snat n tarrayin? Ulac igemmaḍ! Aqeddac Aqeddac: mastodon.social @@ -39,10 +34,7 @@ Beddel Fren tugna… Sfeḍ - Asawaḍ Takamiṛat - Inid kra - Sorry! Your device does not support the voice input! Kkes kullec Translate this toot. Sγiwes @@ -59,7 +51,6 @@ Tiririt Isem n useqdac Irewwayen - New data are available! Do you want to display them? Ismenyifen Imeḍfaṛen imaynuten Mentions @@ -78,18 +69,12 @@ Taγwalt Muted users Blocked users - Remote follow Ilγuyen Follow requests - Asefrer Iγewwaṛen - Ameγnu - What do you want to do? Kkes amiḍan Delete the account %1$s from the application? Azen imayl - Ma ulac aγilif, fren afaylu - No file explorer found! Tap on the path to change it Icceḍ! Scheduled toots @@ -99,10 +84,6 @@ Live notifications No toot to display - The toot was added to favourites - The toot was removed from favourites! - The toot was boosted! - The toot is no longer boosted! Boosted by %1$s Add this toot to your favourites? Remove this toot from your favourites? @@ -134,10 +115,6 @@ Remove this toot? Delete & re-draft this toot? - - %d reply - %d replies - Ticraḍ Rnu ar ticraḍ Kkes tacreḍt @@ -159,7 +136,6 @@ Reply to a toot Write a queet Reply to a queet - You have reached the 500 characters allowed! Fren allal n teγwalt An error occurred while selecting the media! Delete this media? @@ -193,7 +169,6 @@ Translation of toots: Search instances: Icon designer: - Banner designer: Asqerdec @@ -223,15 +198,10 @@ boosted your status favourited your status i ḍferek id - New toot from %1$s and another notification and %d other notifications - - and another toot to discover - and %d other toots to discover - %d like %d likes @@ -267,7 +237,6 @@ The instance domain does not seem to be valid! An error occurred while switching between accounts! An error occurred while searching! - Can not log in! The profile data have been saved! No action can be taken The media has been saved! @@ -276,12 +245,8 @@ Draft saved! Are you sure this instance allows this number of characters? Usually, this value is close to 500 characters. Visibility of the toots has been changed for the account %1$s - Instance name and screen name cannot be blank! - Optimisation of loading Number of toots per load - Number of accounts per load - Number of notifications per load Yal tikelt WIFI Suter @@ -290,13 +255,9 @@ Sken ugar… Sken kra… Sensitive content - Display previous message in responses - Display local timeline - Display federated timeline Disable GIF avatars Abrid: Save drafts automatically - Display counters Add URL of media in toots Notify when someone follows you Notify when someone boosts your status @@ -308,7 +269,6 @@ Notify in WIFI only Notify? Silent Notifications - Askar n yiḍ NSFW view timeout (seconds, 0 means off) Zreg alegdis Custom sharing @@ -332,12 +292,6 @@ Enable Javascript Automatically expand cw Allow third-party cookies - Layout for timelines: - - Iccaren - Umuγ - Iccaren d wumuγ - Yandex DeepL @@ -349,15 +303,6 @@ Aceɛlal Aberkan - - Ala - 512 Kb - 1 Mb - 2 Mb - 4 Mb - 6 Mb - 8 Mb - Set LED colour: Azegzaw @@ -368,13 +313,9 @@ Awraγ Amellal - Notify for new toots on the home timeline Ḍfeṛ - Unfollow - Seḥbes Serreḥ Susem - No action Unmute Request sent Yeṭafar-ik id @@ -387,8 +328,6 @@ Please, confirm push notifications that you want to receive. You can enable or disable these notifications later in settings (Notifications tab). - For unread toots in home time-line? - For unread notifications? Sfeḍ tuffirt There are %1$s of data in cache.\n\nWould you like to delete them? @@ -398,7 +337,6 @@ Azwel Azwel… Aglam - Aglam… Awalen n tsaruţ Awalen n tsaruţ… @@ -415,7 +353,6 @@ Sseken-ed wid yentan No matching result found! Backup toots for %1$s - Backup notifications for %1$s %1$s new toots have been imported %1$s new notifications have been imported @@ -471,18 +408,14 @@ Are you sure you want to permanently delete this list? There is nothing in this list yet. When members of this list post new statuses, they will appear here. Rnu γer tabdart - Kkes seg tebdart Rnu tabdart Kkes tabdart Edit list New list title - Search among people you follow - Tibdarin-ik·m The account was added to the list! You don\'t have any lists yet! %1$s has moved to %2$s - Show boosts/favourites count Authentication does not work? Here are some checks that might help:\n\n - Check there is no spelling mistakes in the instance name\n\n @@ -499,25 +432,19 @@ %1$s toots out of %2$s have been exported. Something went wrong when exporting data for %1$s Something went wrong when exporting data! - Data have been imported! Something went wrong when importing data! Apṛuksi - Tawsit Rmed apṛuksi? Asenneftaγ Awwur Isem n useqdac Awal uffir - Asentel: - Compact mode Add toot details when sharing Support the app on Liberapay There is an error in the regular expression! - Ur tesɛiḍ ara amiḍan? No timelines was found on this instance! Delete this instance? - You are going to delete %s from your followed instances. Suqel s Follow instance You already follow this instance! @@ -526,10 +453,8 @@ Talγut Hide boosts from %s Feature on profile - Hide everything from %s Show boosts from %s Don\'t feature on profile - Show everything from %s The account is now featured on profile The account is no longer featured on profile Boosts are now shown! @@ -550,7 +475,6 @@ Filter contexts One or multiple contexts where the filter should apply Expire after - Rnu imsizdeg amaynut Kkes imzizdig? Update filter Snulfud imzizdig @@ -565,13 +489,11 @@ Accounts were added to the list Adding accounts to the list You have not created a list yet. Tap on the \"+\" button to add a new one. - You don\'t follow any remote instances. Tap on the \"+\" button to add a new one. Menhu ara ḍefṛeḍ Trunk API Account(s) can\'t be followed Fetching remote account Automatically expand hidden media - Display follow instances button New follow New Boost New Favourite @@ -596,7 +518,6 @@ Fetching remote status Comment Peertube instance - Display private messages timeline Be the first to leave a comment on this video with the top right button! %s n tiẓriwin Tangazt: %s @@ -608,10 +529,6 @@ The video has been removed from bookmarks! There is no Peertube videos in your favourites! Abadu - Wlac kra n ibuda n PeerTube - No Peertube instances - No Mastodon instances - Ulac tibdarin Tividyutin Ibuda Use Emoji One @@ -619,12 +536,7 @@ Display previews in all toots New UX/UI designer Display video previews - Gitlab Support - Bug Report - There are no email clients installed. - Send a bug report The account id has been copied in the clipboard! - Optimization of the battery Beddel tutlayt Tutlayt tamezwarut Truncate long toots @@ -636,7 +548,6 @@ The tag has been stored! The tag has been changed! The tag has been deleted! - Display Art timeline Schedule boost The boost is scheduled! No scheduled boost to display! @@ -675,12 +586,7 @@ You can start writing first letters and names will be suggested.\n\n ⚠ The Login button will only work if the instance name is valid and the instance is up! - In this field, write the email that is attached to your Mastodon account. - - Last step is to enter your password and tap on Login. - Ugar n telγut - If you use 2FA (Two-factor authentication), you need to use this link.\nYou can also use it if you do not want to enter your credentials here. Tutlayin Media only @@ -692,16 +598,13 @@ Buṭ Pixelfed instance Mastodon instance - No Pixelfed instances Any of these All of these None of these Any of these words (space-separated) All these words (space-separated) - None of these words (space-separated) Add some words to filter (space-separated) Beddel isem n wejgu - No Misskey instances Misskey instance No app supporting this link is installed on your device. Subscriptions @@ -718,7 +621,6 @@ Select the file to upload Tibidyutin-iw Azwel - Taggayin Turagt Taggayt Tutlayt @@ -733,14 +635,10 @@ Tap here to edit the video data. Kkes tabidyutt Are you sure to delete this video? - No videos uploaded yet! Display NSFW videos - Default %s channel Ulac kra n tibidyutin ara d-nesken! - Add media to favorites Leave a comment Bḍu - Tugniwin-iw Choose a schedule mode From device From server @@ -748,12 +646,8 @@ Toots (Device) Modify Display new toots above the \"Fetch more\" button - Confirmations Timelines - Notification service Agrudem - Yettwaffer w ugbur - Asuddes Inermisen %1$s commented your video %2$s]]> %1$s is following your channel %2$s]]> @@ -768,7 +662,6 @@ Ekter isefka Select the file to import An error occurred when selecting the backup file! - Please, don\'t kill the app while processing. That can\'t be quite long. Add a public comment Azen awennit There is no Internet connection. Your message has been stored in drafts. @@ -809,18 +702,14 @@ end at %s Refresh poll Vote - A poll cannot be attached to a direct message! A poll you have voted in has ended A poll you tooted has ended Customize Taggayin - Isalen Time slot Talqayt Display \'new\' badge on unread toots - Display Peertube timeline PeerTube - Hide the tab Move timeline Hide timeline Reorder timelines @@ -830,10 +719,8 @@ Sefsex You need to keep two visible tabs! Reorder timelines - Use the lists entry for deleting this list! Main timelines can only be hidden! BBCode - Add a timeline Always mark media as sensitive GNU instance Cached status @@ -848,14 +735,11 @@ Amazray Playlists Display name - Tabaḍnit - Create You don\'t have any playlists. Tap on the \"+\" icon to add a new playlist You must provide a display name! The channel is required when the playlist is public. Create a playlist There is nothing in this playlist yet. - Edit media err-d Gallery Emoji @@ -863,7 +747,6 @@ Eraser Aḍris Filter - Seggem Brush Are you sure you want to exit without saving the image? Discard @@ -871,7 +754,6 @@ Image Saved Successfully! Failed to save Image Opacity - Gzem Enable photo editor Add a poll item Remove last poll item @@ -883,10 +765,8 @@ Timed mute Mention the account Refresh cache - See who boosted and added to favorites Mention the status Isallen - Display news from Fedilab\'s account General Regional Art @@ -930,7 +810,6 @@ Reconnect the account The application failed to access the admin features. You might need to reconnect the account for having the correct scope. Unresolved - Resolved Remote Active Pending @@ -946,7 +825,6 @@ Disable Silence Notify the user per e-mail - Perform action Custom warning Aseqdac Moderator @@ -978,7 +856,6 @@ Agbur d ilem! Display Fedilab features button The application needs to access audio recording - An error occurred when recording the voice message! Voice message Enable quick reply The account you are replying might not see your message! @@ -986,9 +863,7 @@ If disabled, sensitive media will be hidden with a button Store media in full size with a long press on previews Add an ellipse button at the top right for listing all tags/instances/lists - Display an item in the main menu for a quick access to the timeline targeting #Fedilab tag Keep an open connection to the streaming API for live notifications. - When the app is in background, it will keep a connection to the streaming API. Disable it if you care about your battery. During the time slot, the app will send notifications. You can reverse (ie: silent) this time slot with the right spinner. Display a Fedilab button below profile picture. It is a shortcut for accessing in-app features. Allow to reply directly in timelines below statuses @@ -1000,9 +875,6 @@ These tags will allow to filter statuses from profiles. You will have to use the context menu for seeing them. Automatically insert a line break after the mention to capitalize the first letter Allow content creators to share statuses to their RSS feeds - Timelines - Agrudem - Battery Asuddes Maximum retry times when uploading media Create a new Folder here @@ -1013,9 +885,7 @@ Default Directory Folder Create folder - Use your favourite browser inside the application. By disabling, links will be opened externally Display a toast message after an action has been completed (boost, fav, etc.)? - Export muted instances Muted instances have been exported! Add an instance Export instances @@ -1111,7 +981,6 @@ Enter your custom host or leave blank for using nitter.net Hide Fedilab notification bar For hiding the remaining notification in the status bar, tap on the eye icon button then uncheck: \"Display in status bar\" - Enable delayed notifications Notifications will be delayed every 30 seconds. That will allow to drain less battery. Live notifications delayed No live notifications @@ -1137,7 +1006,6 @@ Title for the video Join Peertube I am at least 16 years old and agree to the %1$s of this instance - Colors Links Change the color of links (URLs, mentions, tags, etc.) in messages Reblogs header @@ -1149,15 +1017,12 @@ Reset Icons Color of bottom icons in timelines - Background - Change the background color for timelines Pin this tag Logo of the instance Edit profile Make an action Translation Image preview - Change the theme Text color Change the text color in pots Apply changes diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index b4a8660da..f10937275 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -1,5 +1,4 @@ - - + 메뉴 열기 메뉴 닫기 @@ -16,8 +15,6 @@ 취소 다운로드 다운로드 %1$s - 다운로드 완료 - %1$s을(를) 저장 미디어 저장 완료 파일: %1$s 비밀번호 @@ -25,10 +22,8 @@ 계정 태그 - 토큰 저장 복원 - 2단계 인증을 이용하고 있나요? 결과가 없습니다! 인스턴스 인스턴스: mastodon.social @@ -39,10 +34,7 @@ 변경 사진을 선택... 삭제 - 마이크 카메라 - 무언가를 말해주세요 - 사용중인 단말이 음성 입력을 지원하지 않습니다! 일괄 삭제 이 툿을 번역합니다. 예약 @@ -59,7 +51,6 @@ 답글 사용자명 초안 - 새로운 데이터를 이용할 수 있습니다! 표시할까요? 즐겨찾기 새 팔로워 멘션 @@ -78,18 +69,12 @@ 커뮤니케이션 뮤트한 사용자 차단한 사용자 - 원격 팔로우 알림 팔로우 요청 - 최적화 설정 - 프로필 - 무엇을 하겠습니까? 계정 삭제 응용 프로그램에서 계정 %1$s를 삭제하시겠습니까? 이메일 보내기 - 파일을 선택해주세요 - 파일 탐색기를 찾을 수 없습니다! 경로를 바꾸려면 누르세요 실패! 예약된 툿 @@ -99,10 +84,6 @@ 실시간 알림 표시할 툿이 없습니다 - 툿이 즐겨찾기에 추가되었습니다 - 툿이 즐겨찾기에서 삭제되었습니다! - 툿이 부스트되었습니다! - 툿이 더 이상 부스트되지 않습니다! %1$s에 의해 부스트되었습니다 이 툿을 즐겨찾기에 추가하시겠습니까? 이 툿을 즐겨찾기에서 삭제하시겠습니까? @@ -134,9 +115,6 @@ 이 툿을 삭제하시겠습니까? 이 툿을 삭제하고 다시 쓰시겠습니까? - - 답글 %d개 - 북마크 북마크에 추가 북마크 삭제 @@ -158,7 +136,6 @@ 답글 작성 큇 작성 답글 작성 - 500자 글자제한에 도달했습니다! 미디어 선택 미디어를 선택하는 도중 오류가 발생하였습니다! 이 미디어를 삭제할까요? @@ -192,7 +169,6 @@ 툿 번역: 인스턴스 검색: 아이콘 디자이너 - 배너 디자이너 대화 @@ -222,13 +198,9 @@ 당신의 게시물을 부스트 했습니다 당신의 상태를 마음에 들어했습니다 당신을 팔로우 했습니다 - %1$s의 새로운 툿 그리고 %d개의 다른 알림 - - 그리고 %d개의 새로운 툿 - %d명이 좋아합니다 @@ -263,7 +235,6 @@ The instance domain does not seem to be valid! An error occurred while switching between accounts! An error occurred while searching! - 로그인 할 수 없습니다! The profile data have been saved! 아무 조치를 취할 수 없습니다 미디어가 저장되었습니다! @@ -272,12 +243,8 @@ 초안이 저장 되었습니다! Are you sure this instance allows this number of characters? Usually, this value is close to 500 characters. Visibility of the toots has been changed for the account %1$s - Instance name and screen name cannot be blank! - Optimisation of loading Number of toots per load - Number of accounts per load - Number of notifications per load 항상 Wi-Fi 물어보기 @@ -286,13 +253,9 @@ 더 보기… 접기… 민감한 내용 - 답글에 이전 메시지 표시 - 로컬 타임라인 표시 - 연합타임라인 보기 GIF 아바타 비활성화 경로: 자동으로 초안 저장 - 카운터 표시 툿에 미디어 URL을 추가 누군가가 나를 팔로우 할 때 알림 누군가 내 게시물을 부스트 할 때 알림 @@ -304,7 +267,6 @@ Wi-Fi에 연결 되었을 때만 알림 일림? Silent Notifications - 야간모드 NSFW 보는 시간(초, 0 = 비활성화) 프로필 수정 Custom sharing @@ -328,12 +290,6 @@ 자바스크립트 활성화 CW를 자동으로 펼침 서드파티 쿠키 허용 - 타임라인 레이아웃: - - - 메뉴 - 탭과 메뉴 - Yandex DeepL @@ -345,15 +301,6 @@ 밝음 블랙 - - 아니오 - 512 kB - 1 MB - 2 MB - 4 MB - 6 MB - 8 MB - LED 색 설정 파란색 @@ -364,13 +311,9 @@ 노란색 흰색 - 홈 타임라인의 새로운 글에 대한 알림 팔로우 - 언팔로우 - 차단 차단 해제 뮤트 - 동작 없음 뮤트 해제 요청 보내짐 당신을 팔로우 합니다 @@ -383,8 +326,6 @@ Please, confirm push notifications that you want to receive. You can enable or disable these notifications later in settings (Notifications tab). - For unread toots in home time-line? - For unread notifications? 캐시 지우기 There are %1$s of data in cache.\n\nWould you like to delete them? @@ -394,7 +335,6 @@ 제목 Title… 설명 - 설명… 키워드 키워드… @@ -411,7 +351,6 @@ 고정된 항목 보기 No matching result found! Backup toots for %1$s - Backup notifications for %1$s %1$s new toots have been imported %1$s new notifications have been imported @@ -467,18 +406,14 @@ 이 리스트를 정말로 영원히 삭제하시겠습니까? There is nothing in this list yet. When members of this list post new statuses, they will appear here. 리스트에 추가 - 리스트에서 삭제 리스트 추가 리스트 삭제 리스트 수정 새 리스트 제목 - Search among people you follow - 내 리스트 The account was added to the list! You don\'t have any lists yet! %1$s은 %2$s로 이동했습니다 - 부스트/즐겨찾기 카운트 표시 Authentication does not work? Here are some checks that might help:\n\n - Check there is no spelling mistakes in the instance name\n\n @@ -495,25 +430,19 @@ %1$s toots out of %2$s have been exported. Something went wrong when exporting data for %1$s Something went wrong when exporting data! - Data have been imported! Something went wrong when importing data! 프록시 - 타입 프록시 활성화? 호스트 포트 로그인 비밀번호 - 테마: - 간결한모드 공유할 때 툿의 세부 정보 포함 Support the app on Liberapay There is an error in the regular expression! - No account yet? No timelines was found on this instance! Delete this instance? - You are going to delete %s from your followed instances. Translate in Follow instance You already follow this instance! @@ -522,10 +451,8 @@ Information Hide boosts from %s Feature on profile - Hide everything from %s Show boosts from %s Don\'t feature on profile - Show everything from %s The account is now featured on profile The account is no longer featured on profile Boosts are now shown! @@ -546,7 +473,6 @@ Filter contexts One or multiple contexts where the filter should apply 만료 시간 - 새 필터 추가 필터를 삭제할까요? 필터 갱신 필터 만들기 @@ -561,13 +487,11 @@ Accounts were added to the list Adding accounts to the list You have not created a list yet. Tap on the \"+\" button to add a new one. - You don\'t follow any remote instances. Tap on the \"+\" button to add a new one. Who to follow Trunk API Account(s) can\'t be followed Fetching remote account Automatically expand hidden media - Display follow instances button 새 팔로우 새 부스트 새 즐겨찾기 @@ -592,7 +516,6 @@ Fetching remote status Comment Peertube instance - Display private messages timeline Be the first to leave a comment on this video with the top right button! %s views Duration: %s @@ -604,10 +527,6 @@ The video has been removed from bookmarks! There is no Peertube videos in your favourites! 채널 - No Peertube channels - No Peertube instances - No Mastodon instances - No lists 동영상 채널 Use Emoji One @@ -615,12 +534,7 @@ Display previews in all toots New UX/UI designer Display video previews - Gitlab Support - Bug Report - There are no email clients installed. - Send a bug report 계정의 아이디가 클립보드에 복사되었습니다! - 배터리 최적화 언어 변경 기본 언어 긴 툿 자르기 @@ -632,7 +546,6 @@ 태그가 저장되었습니다! 태그가 변경되었습니다! 태그가 삭제되었습니다! - 예술 타임라인 표시 예약된 부스트 부스트가 예약되었습니다! 예약 된 부스트가 없습니다! @@ -671,12 +584,7 @@ You can start writing first letters and names will be suggested.\n\n ⚠ The Login button will only work if the instance name is valid and the instance is up! - In this field, write the email that is attached to your Mastodon account. - - Last step is to enter your password and click on Login. - 더 많은 정보 - If you use 2FA (Two-factor authentication), you need to use this link.\nYou can also use it if you do not want to enter your credentials here. 언어 미디어만 @@ -688,16 +596,13 @@ 픽셀페드 인스턴스 마스토돈 인스턴스 - No Pixelfed instances Any of these All of these None of these Any of these words (space-separated) All these words (space-separated) - None of these words (space-separated) Add some words to filter (space-separated) Change column name - No Misskey instances Misskey instance No app supporting this link is installed on your device. Subscriptions @@ -714,7 +619,6 @@ Select the file to upload My videos Title - Categories License Category 언어 @@ -729,14 +633,10 @@ Tap here to edit the video data. Delete video Are you sure to delete this video? - No videos uploaded yet! Display NSFW videos - Default %s channel No videos to display! - Add media to favorites Leave a comment Share - My pictures 예약 모드 선택 장치에서 서버에서 @@ -744,12 +644,8 @@ 툿(장치) 변경 \"새로 가져오기\" 버튼 위에 새 툿 표시 - 확인 타임라인 - 알림 서비스 인터페이스 - 숨겨진 내용 - 작성 연락처 %1$s commented your video %2$s]]> %1$s is following your channel %2$s]]> @@ -764,7 +660,6 @@ 데이터 가져오기 가져 올 파일을 선택하세요 An error occurred when selecting the backup file! - Please, don\'t kill the app while processing. That can\'t be quite long. 공개 댓글 추가 댓글 보내기 There is no Internet connection. Your message has been stored in drafts. @@ -805,18 +700,14 @@ end at %s Refresh poll Vote - A poll cannot be attached to a direct message! A poll you have voted in has ended A poll you tooted has ended Customize 카테고리 - News Time slot 고급 Display \'new\' badge on unread toots - Display Peertube timeline Peertube - Hide the tab Move timeline Hide timeline Reorder timelines @@ -826,10 +717,8 @@ Undo You need to keep two visible tabs! Reorder timelines - Use the lists entry for deleting this list! Main timelines can only be hidden! BBCode - Add a timeline Always mark media as sensitive 그누 인스턴스 캐시 된 게시물 @@ -844,14 +733,11 @@ 내역 재생목록 표시되는 이름 - 개인정보 - 생성 You don\'t have any playlists. Tap on the \"+\" icon to add a new playlist You must provide a display name! The channel is required when the playlist is public. Create a playlist There is nothing in this playlist yet. - 미디어 편집 다시 실행 갤러리 에모지 @@ -859,7 +745,6 @@ 지우개 문자 필터 - 조절 저장하지 않고 종료할까요? 버리기 @@ -867,7 +752,6 @@ 성공적으로 저장되었습니다! 저장하는데 실패하였습니다 불투명도 - 잘라내기 사진 편집기 활성화 투표 항목 추가 마지막 투표 항목 지우기 @@ -879,10 +763,8 @@ Timed mute Mention the account 캐시 새로고침 - See who boosted and added to favorites 게시물 언급하기 News - Display news from Fedilab\'s account General Regional Art @@ -926,7 +808,6 @@ Reconnect the account The application failed to access the admin features. You might need to reconnect the account for having the correct scope. Unresolved - Resolved Remote Active Pending @@ -942,7 +823,6 @@ Disable Silence Notify the user per e-mail - Perform action Custom warning User Moderator @@ -974,7 +854,6 @@ Empty content! Display Fedilab features button The application needs to access audio recording - An error occurred when recording the voice message! Voice message Enable quick reply The account you are replying might not see your message! @@ -982,9 +861,7 @@ If disabled, sensitive media will be hidden with a button Store media in full size with a long press on previews Add an ellipse button at the top right for listing all tags/instances/lists - Display an item in the main menu for a quick access to the timeline targeting #Fedilab tag Keep an open connection to the streaming API for live notifications. - When the app is in background, it will keep a connection to the streaming API. Disable it if you care about your battery. During the time slot, the app will send notifications. You can reverse (ie: silent) this time slot with the right spinner. Display a Fedilab button below profile picture. It is a shortcut for accessing in-app features. Allow to reply directly in timelines below statuses @@ -996,9 +873,6 @@ These tags will allow to filter statuses from profiles. You will have to use the context menu for seeing them. Automatically insert a line break after the mention to capitalize the first letter Allow content creators to share statuses to their RSS feeds - Timelines - Interface - Battery Compose Maximum retry times when uploading media Create a new Folder here @@ -1009,9 +883,7 @@ Default Directory Folder Create folder - Use your favourite browser inside the application. By disabling, links will be opened externally Display a toast message after an action has been completed (boost, fav, etc.)? - Export muted instances Muted instances have been exported! Add an instance Export instances @@ -1106,7 +978,6 @@ Enter your custom host or leave blank for using nitter.net Hide Fedilab notification bar For hiding the remaining notification in the status bar, tap on the eye icon button then uncheck: \"Display in status bar\" - Enable delayed notifications Notifications will be delayed every 30 seconds. That will allow to drain less battery. Live notifications delayed No live notifications @@ -1132,7 +1003,6 @@ Title for the video Join Peertube I am at least 16 years old and agree to the %1$s of this instance - Colors Links Change the color of links (URLs, mentions, tags, etc.) in messages Reblogs header @@ -1144,15 +1014,12 @@ Reset Icons Color of bottom icons in timelines - Background - Change the background color for timelines Pin this tag Logo of the instance Edit profile Make an action Translation Image preview - Change the theme Text color Change the text color in pots Apply changes diff --git a/app/src/main/res/values-ml/strings.xml b/app/src/main/res/values-ml/strings.xml index 0eff99859..7812142e5 100644 --- a/app/src/main/res/values-ml/strings.xml +++ b/app/src/main/res/values-ml/strings.xml @@ -1,5 +1,4 @@ - - + മെനു തുറക്കുക മെനു അടയ്ക്കുക @@ -16,8 +15,6 @@ റദ്ദാക്കുക ഇറക്കിവെക്കുക Download %1$s - ഡൗൺലോഡ് പൂർത്തിയായി - സൂക്ഷിക്കൂ %1$s മാധ്യമം സൂക്ഷിക്കപ്പെട്ടിരിക്കുന്നു ഫയൽ %1$s Password @@ -25,10 +22,8 @@ അക്കൗണ്ടുകൾ ടൂട്ടുകൾ ടാഗുകൾ - Token സൂക്ഷിക്കൂ പുനഃസ്ഥാപിക്കുക - രണ്ടു പടിയായി ഉള്ള പ്രമാണീകരണം? ഫലങ്ങൾ ഇല്ല! പതിപ്പ് പതിപ്പ്: മാസ്റ്റോഡോൺ.സോഷ്യൽ @@ -39,10 +34,7 @@ മാറ്റുക ഒരു പടം തിരഞ്ഞെടുക്കൂ… വൃത്തിയാക്കൂ - മൈക്രോഫോണ്‍ ക്യാമറ - ദയവായി, എന്തെങ്കിലും പറയൂ - ക്ഷമിക്കണം. തങ്ങളുടെ ഉപകരണം ശബ്ദം ഒരു ഇൻപുട്ടായി സ്വീകരിക്കുന്നതല്ല! എല്ലാം മായ്ക്കുക ഈ ടൂട്ടിനെ മൊഴി മാറ്റം നടത്തുക. കാര്യക്രമം @@ -59,7 +51,6 @@ മറുപടികൾ ഉപയോക്തൃ നാമം ഡ്രാഫ്റ്റുകൾ - പുതിയ വിവരം ലഭ്യമാണ്. അത് പ്രദർശിപ്പിക്കട്ടെ? പ്രിയപ്പെട്ടവ പുതിയ അനുയായികൾ പ്രതിപാദനങ്ങൾ @@ -78,18 +69,12 @@ ആശയവിനിമയം നിശബ്ദമാക്കപ്പെട്ട ഉപയോക്താക്കൾ തടയപ്പെട്ട ഉപയോക്താക്കൾ - വിദൂരത്തു നിന്ന് പിന്തുടരുക അറിയിപ്പുകൾ പിന്തുടരാൻ ഉള്ള അഭ്യർത്ഥനകൾ - ഉത്തമീകരണം ക്രമീകരണങ്ങള്‍ - രൂപരേഖ - താങ്കൾക്ക് എന്താണ് ചെയ്യേണ്ടത്? അക്കൗണ്ട് ഇല്ലാതാക്കുക Delete the account %1$s from the application? ഇ മെയിൽ അയക്കൂ - ദയവായി ഒരു ഫയൽ തെരഞ്ഞെടുക്കുക - ഫയൽ എക്സ്പ്ലോറർ കണ്ടെത്തിയില്ല! മാറ്റണമെങ്കിൽ ഇവിടെ ക്ലിക്ക് ചെയ്യൂ പരാജയപ്പെട്ടു! മുൻകൂട്ടി നിശ്ചയിച്ച സമയപ്രകാരം ഉള്ള ടൂട്ടുകൾ @@ -99,10 +84,6 @@ തത്സമയ അറിയിപ്പുകൾ പ്രദർശിപ്പിക്കാൻ ടൂട്ടുകൾ ഇല്ല - ഈ ടൂട്ടിനെ പ്രിയപ്പെട്ടവയിലേക്ക് ചേർത്തിരിക്കുന്നു - ഈ ടൂട്ടിനെ പ്രിയപ്പെട്ടവയിൽ നിന്ന് മാറ്റിയിരിക്കുന്നു! - ഈ ടൂട്ടിനെ ബൂസ്റ്റ് ചെയ്തിരിക്കുന്നു! - ഈ ടൂട്ട് ബൂസ്റ്റിൽ നിന്ന് മാറ്റിയിരിക്കുന്നു! ബൂസ്റ്റ് ചെയ്തത് %1$s ഈ ടൂട്ടിനെ പ്രിയപ്പെ ട്ടവയിലേക്ക് ചേർക്കട്ടെ? ഈ ടൂട്ടിനെ പ്രിയപ്പെ ട്ടവയിൽ നിന്ന് മാറ്റട്ടെ? @@ -134,10 +115,6 @@ Remove this toot? Delete & re-draft this toot? - - %d reply - %d replies - Bookmarks Add to bookmarks Remove bookmark @@ -159,7 +136,6 @@ Reply to a toot Write a queet Reply to a queet - You have reached the 500 characters allowed! Select a media An error occurred while selecting the media! Delete this media? @@ -193,7 +169,6 @@ Translation of toots: Search instances: Icon designer: - Banner designer: Conversation @@ -223,15 +198,10 @@ boosted your status favourited your status followed you - New toot from %1$s and another notification and %d other notifications - - and another toot to discover - and %d other toots to discover - %d like %d likes @@ -267,7 +237,6 @@ The instance domain does not seem to be valid! An error occurred while switching between accounts! An error occurred while searching! - Can not log in! The profile data have been saved! No action can be taken The media has been saved! @@ -276,12 +245,8 @@ Draft saved! Are you sure this instance allows this number of characters? Usually, this value is close to 500 characters. Visibility of the toots has been changed for the account %1$s - Instance name and screen name cannot be blank! - Optimisation of loading Number of toots per load - Number of accounts per load - Number of notifications per load Always WIFI Ask @@ -290,13 +255,9 @@ Show more… Show less… Sensitive content - Display previous message in responses - Display local timeline - Display federated timeline Disable GIF avatars Path: Save drafts automatically - Display counters Add URL of media in toots Notify when someone follows you Notify when someone boosts your status @@ -308,7 +269,6 @@ Notify in WIFI only Notify? Silent Notifications - Night mode NSFW view timeout (seconds, 0 means off) Edit profile Custom sharing @@ -332,12 +292,6 @@ Enable Javascript Automatically expand cw Allow third-party cookies - Layout for timelines: - - Tabs - Menu - Tabs and menu - Yandex DeepL @@ -349,15 +303,6 @@ Light Black - - No - 512 Kb - 1 Mb - 2 Mb - 4 Mb - 6 Mb - 8 Mb - Set LED colour: Blue @@ -368,13 +313,9 @@ Yellow White - Notify for new toots on the home timeline Follow - Unfollow - Block Unblock Mute - No action Unmute Request sent Follows you @@ -387,8 +328,6 @@ Please, confirm push notifications that you want to receive. You can enable or disable these notifications later in settings (Notifications tab). - For unread toots in home time-line? - For unread notifications? Clear cache There are %1$s of data in cache.\n\nWould you like to delete them? @@ -398,7 +337,6 @@ Title Title… Description - Description… Keywords Keywords… @@ -415,7 +353,6 @@ Show pinned No matching result found! Backup toots for %1$s - Backup notifications for %1$s %1$s new toots have been imported %1$s new notifications have been imported @@ -471,18 +408,14 @@ Are you sure you want to permanently delete this list? There is nothing in this list yet. When members of this list post new statuses, they will appear here. Add to list - Remove from list Add list Delete list Edit list New list title - Search among people you follow - Your lists The account was added to the list! You don\'t have any lists yet! %1$s has moved to %2$s - Show boosts/favourites count Authentication does not work? Here are some checks that might help:\n\n - Check there is no spelling mistakes in the instance name\n\n @@ -499,25 +432,19 @@ %1$s toots out of %2$s have been exported. Something went wrong when exporting data for %1$s Something went wrong when exporting data! - Data have been imported! Something went wrong when importing data! Proxy - Type Enable proxy? Host Port Login Password - Theme: - Compact mode Add toot details when sharing Support the app on Liberapay There is an error in the regular expression! - No account yet? No timelines was found on this instance! Delete this instance? - You are going to delete %s from your followed instances. Translate in Follow instance You already follow this instance! @@ -526,10 +453,8 @@ Information Hide boosts from %s Feature on profile - Hide everything from %s Show boosts from %s Don\'t feature on profile - Show everything from %s The account is now featured on profile The account is no longer featured on profile Boosts are now shown! @@ -550,7 +475,6 @@ Filter contexts One or multiple contexts where the filter should apply Expire after - Add New Filter Delete filter? Update filter Create filter @@ -565,13 +489,11 @@ Accounts were added to the list Adding accounts to the list You have not created a list yet. Tap on the \"+\" button to add a new one. - You don\'t follow any remote instances. Tap on the \"+\" button to add a new one. Who to follow Trunk API Account(s) can\'t be followed Fetching remote account Automatically expand hidden media - Display follow instances button New follow New Boost New Favourite @@ -596,7 +518,6 @@ Fetching remote status Comment Peertube instance - Display private messages timeline Be the first to leave a comment on this video with the top right button! %s views Duration: %s @@ -608,10 +529,6 @@ The video has been removed from bookmarks! There is no Peertube videos in your favourites! Channel - No Peertube channels - No Peertube instances - No Mastodon instances - No lists Videos Channels Use Emoji One @@ -619,12 +536,7 @@ Display previews in all toots New UX/UI designer Display video previews - Gitlab Support - Bug Report - There are no email clients installed. - Send a bug report The account id has been copied in the clipboard! - Optimization of the battery Change the language Default language Truncate long toots @@ -636,7 +548,6 @@ The tag has been stored! The tag has been changed! The tag has been deleted! - Display Art timeline Schedule boost The boost is scheduled! No scheduled boost to display! @@ -675,12 +586,7 @@ You can start writing first letters and names will be suggested.\n\n ⚠ The Login button will only work if the instance name is valid and the instance is up! - In this field, write the email that is attached to your Mastodon account. - - Last step is to enter your password and tap on Login. - More information - If you use 2FA (Two-factor authentication), you need to use this link.\nYou can also use it if you do not want to enter your credentials here. Languages Media only @@ -692,16 +598,13 @@ Bot Pixelfed instance Mastodon instance - No Pixelfed instances Any of these All of these None of these Any of these words (space-separated) All these words (space-separated) - None of these words (space-separated) Add some words to filter (space-separated) Change column name - No Misskey instances Misskey instance No app supporting this link is installed on your device. Subscriptions @@ -718,7 +621,6 @@ Select the file to upload My videos Title - Categories License Category Language @@ -733,14 +635,10 @@ Tap here to edit the video data. Delete video Are you sure to delete this video? - No videos uploaded yet! Display NSFW videos - Default %s channel No videos to display! - Add media to favorites Leave a comment Share - My pictures Choose a schedule mode From device From server @@ -748,12 +646,8 @@ Toots (Device) Modify Display new toots above the \"Fetch more\" button - Confirmations Timelines - Notification service Interface - Hidden content - Composing Contacts %1$s commented your video %2$s]]> %1$s is following your channel %2$s]]> @@ -768,7 +662,6 @@ Import Data Select the file to import An error occurred when selecting the backup file! - Please, don\'t kill the app while processing. That can\'t be quite long. Add a public comment Send comment There is no Internet connection. Your message has been stored in drafts. @@ -809,18 +702,14 @@ end at %s Refresh poll Vote - A poll cannot be attached to a direct message! A poll you have voted in has ended A poll you tooted has ended Customize Categories - News Time slot Advanced Display \'new\' badge on unread toots - Display Peertube timeline Peertube - Hide the tab Move timeline Hide timeline Reorder timelines @@ -830,10 +719,8 @@ Undo You need to keep two visible tabs! Reorder timelines - Use the lists entry for deleting this list! Main timelines can only be hidden! BBCode - Add a timeline Always mark media as sensitive GNU instance Cached status @@ -848,14 +735,11 @@ History Playlists Display name - Privacy - Create You don\'t have any playlists. Tap on the \"+\" icon to add a new playlist You must provide a display name! The channel is required when the playlist is public. Create a playlist There is nothing in this playlist yet. - Edit media redo Gallery Emoji @@ -863,7 +747,6 @@ Eraser Text Filter - Adjust Brush Are you sure you want to exit without saving the image? Discard @@ -871,7 +754,6 @@ Image Saved Successfully! Failed to save Image Opacity - Crop Enable photo editor Add a poll item Remove last poll item @@ -883,10 +765,8 @@ Timed mute Mention the account Refresh cache - See who boosted and added to favorites Mention the status News - Display news from Fedilab\'s account General Regional Art @@ -930,7 +810,6 @@ Reconnect the account The application failed to access the admin features. You might need to reconnect the account for having the correct scope. Unresolved - Resolved Remote Active Pending @@ -946,7 +825,6 @@ Disable Silence Notify the user per e-mail - Perform action Custom warning User Moderator @@ -978,7 +856,6 @@ Empty content! Display Fedilab features button The application needs to access audio recording - An error occurred when recording the voice message! Voice message Enable quick reply The account you are replying might not see your message! @@ -986,9 +863,7 @@ If disabled, sensitive media will be hidden with a button Store media in full size with a long press on previews Add an ellipse button at the top right for listing all tags/instances/lists - Display an item in the main menu for a quick access to the timeline targeting #Fedilab tag Keep an open connection to the streaming API for live notifications. - When the app is in background, it will keep a connection to the streaming API. Disable it if you care about your battery. During the time slot, the app will send notifications. You can reverse (ie: silent) this time slot with the right spinner. Display a Fedilab button below profile picture. It is a shortcut for accessing in-app features. Allow to reply directly in timelines below statuses @@ -1000,9 +875,6 @@ These tags will allow to filter statuses from profiles. You will have to use the context menu for seeing them. Automatically insert a line break after the mention to capitalize the first letter Allow content creators to share statuses to their RSS feeds - Timelines - Interface - Battery Compose Maximum retry times when uploading media Create a new Folder here @@ -1013,9 +885,7 @@ Default Directory Folder Create folder - Use your favourite browser inside the application. By disabling, links will be opened externally Display a toast message after an action has been completed (boost, fav, etc.)? - Export muted instances Muted instances have been exported! Add an instance Export instances @@ -1111,7 +981,6 @@ Enter your custom host or leave blank for using nitter.net Hide Fedilab notification bar For hiding the remaining notification in the status bar, tap on the eye icon button then uncheck: \"Display in status bar\" - Enable delayed notifications Notifications will be delayed every 30 seconds. That will allow to drain less battery. Live notifications delayed No live notifications @@ -1137,7 +1006,6 @@ Title for the video Join Peertube I am at least 16 years old and agree to the %1$s of this instance - Colors Links Change the color of links (URLs, mentions, tags, etc.) in messages Reblogs header @@ -1149,15 +1017,12 @@ Reset Icons Color of bottom icons in timelines - Background - Change the background color for timelines Pin this tag Logo of the instance Edit profile Make an action Translation Image preview - Change the theme Text color Change the text color in pots Apply changes diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 44621b491..696080caa 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -1,5 +1,4 @@ - - + Menu openen Menu sluiten @@ -16,8 +15,6 @@ Annuleren Downloaden %1$s downloaden - Downloaden voltooid - %1$s opslaan Media opgeslagen Bestand: %1$s Wachtwoord @@ -25,10 +22,8 @@ Accounts Toots Tags - Aanmeldcode Opslaan Herstellen - Tweestapsverificatie? Geen resultaten! Server Server: bv. mastodon.social @@ -39,10 +34,7 @@ Veranderen Kies een afbeelding… Leegmaken - Microfoon Camera - Zeg maar iets - Sorry! Uw apparaat ondersteunt de spraakinvoer niet! Alles verwijderen Deze toot vertalen. Inplannen @@ -59,7 +51,6 @@ Reacties Gebruikersnaam Concepten - Nieuwe gegevens beschikbaar! Wil je deze tonen? Favorieten Nieuwe volgers Meldingen @@ -78,18 +69,12 @@ Communicatie Genegeerde gebruikers Geblokkeerde gebruikers - Extern volgen Meldingen Volgverzoeken - Optimalisatie Instellingen - Profiel - Wat wil je doen? Account verwijderen Account %1$s uit deze app verwijderen? E-mail verzenden - Kies een bestand - Geen bestandsbeheerder gevonden! Op het pad klikken om het te veranderen Mislukt! Ingeplande toots @@ -99,10 +84,6 @@ Livemeldingen Geen toot om weer te geven - De toot is aan jouw favorieten toegevoegd - De toot is uit jouw favorieten verwijderd! - De toot is geboost! - De toot wordt niet langer geboost! Geboost door %1$s Deze toot aan jouw favorieten toevoegen? Deze toot uit jouw favorieten verwijderen? @@ -134,10 +115,6 @@ Toot verwijderen? Deze toot verwijderen en herschrijven? - - %d reactie - %d reacties - Bladwijzers Aan bladwijzers toevoegen Bladwijzer verwijderen @@ -159,7 +136,6 @@ Reageer op een toot Schrijf een queet Op een queet reageren - Je hebt de limiet van 500 tekens bereikt! Kies een afbeelding of video Tijdens het kiezen van een afbeelding of video heeft zich een fout voorgedaan! Media verwijderen? @@ -193,7 +169,6 @@ Vertaling van toots: Servers zoeken: Ontwerper pictogram: - Banner-ontwerper: Conversatie @@ -223,15 +198,10 @@ boostte jouw toot markeerde jouw toot als favoriet volgt jou nu - Nieuwe toot van %1$s en één andere melding en %d andere meldingen - - en één andere toot - en %d andere toots - %d vind-ik-leuk %d vinden dit leuk @@ -267,7 +237,6 @@ De domeinnaam van de server is onjuist! Er ging wat mis tijdens het omschakelen van accounts! Er ging wat mis tijdens het zoeken! - Kan niet aanmelden! De profielgegevens zijn opgeslagen! Er valt niets te doen Media is opgeslagen! @@ -276,12 +245,8 @@ Concept opgeslagen! Weet je zeker dat je op deze server zoveel tekens mag gebruiken? Standaard is er een limiet van 500 karakters. Zichtbaarheid toots van account %1$s is veranderd - Server- en gebruikersnaam kunnen niet leeg blijven! - Optimalisatie laden van gegevens Aantal toots per keer - Aantal accounts per keer - Aantal meldingen per keer Altijd Wifi Vragen @@ -290,13 +255,9 @@ Meer tonen Minder tonen Gevoelige inhoud - Vorig bericht in reacties tonen - Lokale tijdlijn tonen - Globale tijdlijn tonen GIF-avatars uitschakelen Downloadlocatie: Concepten automatisch opslaan - Aantal nieuwe toots bovenaan tijdlijn tonen URL van afbeelding of video aan toot toevoegen Geef een melding wanneer iemand jou volgt Geef een melding wanneer jouw toot is geboost @@ -308,7 +269,6 @@ Alleen met Wifi meldingen tonen Meldingen? Stille meldingen - Donker thema Hoe lang gevoelige inhoud blijven tonen (in seconden, 0 is onbeperkt) Profiel bewerken Handmatig delen @@ -332,12 +292,6 @@ Javascript toegestaan Automatisch tekstwaarschuwingen (cw) uitklappen Cookies van derden accepteren - Lay-out voor tijdlijnen: - - Tabs - Menu - Tabs en menu - Yandex DeepL @@ -349,15 +303,6 @@ Licht Zwart - - Niet - 512 Kb - 1 Mb - 2 Mb - 4 Mb - 6 Mb - 8 Mb - LED-kleur instellen: Blauw @@ -368,13 +313,9 @@ Geel Wit - Geef een melding van nieuwe toots op jouw start-tijdlijn Volgen - Ontvolgen - Blokkeren Deblokkeren Negeren - Geen actie Niet langer negeren Verzoek verzonden Volgt jou @@ -387,8 +328,6 @@ Bevestig de pushmeldingen die jij wilt ontvangen. Je kan deze later in- en uitschakelen in jouw instellingen (onder meldingen). - Voor ongelezen toots in jouw start-tijdlijn? - Voor ongelezen meldingen? Buffer leegmaken De buffer bevat %1$s aan gegevens.\n\nWil je dit verwijderen? @@ -398,7 +337,6 @@ Titel Titel… Omschrijving - Omschrijving… Trefwoorden Trefwoorden… @@ -415,7 +353,6 @@ Vastgezette toots tonen Geen resultaten! Toots back-uppen voor %1$s - Backup notifications for %1$s Er zijn %1$s nieuwe toots geïmporteerd %1$s new notifications have been imported @@ -471,18 +408,14 @@ Weet je zeker dat je deze lijst definitief wilt verwijderen? Er is nog niks in deze lijst. Wanneer lijstleden nieuwe toots publiceren, zijn deze hier te zien. Aan lijst toevoegen - Uit lijst verwijderen Lijst toevoegen Lijst verwijderen Lijst bewerken Naam nieuwe lijst - Zoek naar mensen die je volgt - Jouw lijsten The account was added to the list! You don\'t have any lists yet! %1$s is naar %2$s verhuisd - Aantal boosts/favorieten tonen Problemen met aanmelden? Hier zijn enkele suggesties die wellicht helpen:\n\n - Controleer of er geen spelfout in de domeinnaam van de server zit\n\n @@ -499,25 +432,19 @@ %1$s van de %2$s toots zijn geëxporteerd. Er is iets mis gegaan tijdens het exporteren van de gegevens van %1$s Er is iets misgegaan tijdens het exporteren van de gegevens! - Gegevens zijn geïmporteerd! Er is iets misgegaan tijdens het importeren van de gegevens! Proxy - Type Proxy inschakelen? Host Poort Gebruikersnaam Wachtwoord - Thema: - Compacte modus Volledige toot delen Ondersteun de app op Liberapay Er zit een fout in de reguliere expressie! - Nog geen account? Er zijn geen tijdlijnen op deze server gevonden! Server verwijderen? - Je gaat %s als gevolgde server verwijderen. Vertalen in Server volgen Je volgt deze server al! @@ -526,10 +453,8 @@ Informatie Boosts verbergen van %s Uitlichten op profiel - Verberg alles van %s Toon boosts van %s Niet uitlichten op profiel - Toon alles van %s Het account is nu uitgelicht op het profiel Het account is niet langer uitgelicht op het profiel Boosts worden nu getoond! @@ -550,7 +475,6 @@ Filter contexten Een of meerdere contexten waar de filter van toepassing zou zijn Vervallen na - Nieuwe filter toevoegen Filter verwijderen? Filter bijwerken Filter aanmaken @@ -565,13 +489,11 @@ Accounts zijn toegevoegd aan de lijst Accounts aan de lijst toevoegen Je hebt nog geen lijst gemaakt. Klik op de \"+\" knop om een nieuwe toe te voegen. - Je volgt nog geen externe instanties. Klik op de \"+\" knop om er een toe te voegen. Wie te volgen Trunk-API Account(s) kunnen niet worden gevolgd Extern account ophalen Automatisch als gevoelig gemarkeerde media uitklappen - Knop om servers te volgen tonen Nieuwe volger Nieuwe boost Nieuwe favoriet @@ -596,7 +518,6 @@ Extern bericht ophalen Reageren PeerTube-server - Tijdlijn met directe berichten tonen Wees de eerste om op deze video te reageren m.b.v. de knop rechtsboven! %s keer bekeken Duur: %s @@ -608,10 +529,6 @@ De video is uit de bladwijzers verwijderd! Er zitten geen PeerTube-video\'s tussen jouw favorieten! Kanaal - Geen PeerTube-kanalen - Geen PeerTube-servers - Geen servers - Geen lijsten Video\'s Kanalen Emoji One gebruiken @@ -619,12 +536,7 @@ In alle toots voorvertoningen tonen Nieuwe ontwerper UX/UI Voorbeeldvideo\'s tonen - Ondersteuning via Gitlab - Bugrapport - Er zijn geen e-mailapps geïnstalleerd. - Verzend een bugrapport Het account-ID is naar het klembord gekopieerd! - Accuoptimalisatie Taal veranderen Standaardtaal Lange toots afbreken @@ -636,7 +548,6 @@ De tag is opgeslagen! De tag is veranderd! De tag is verwijderd! - Kunsttijdlijn tonen Boost inplannen De boost is ingepland! Geen ingeplande boost om weer te geven! @@ -674,10 +585,7 @@ In dit veld moet je de hostnaam van jouw server invullen.\nVoorbeeld: als je jouw account hebt aangemaakt op https://mastodon.social\n vul je mastodon.social in (dus zonder https://)\n Je kunt beginnen met typen en er zullen namen gesuggereerd worden.\n\n ⚠ De inlogknop werkt alleen als de naam van de server geldig is, en de server online is! - In dit veld vul je het e-mailadres in dat is gekoppeld aan jouw Mastodonaccount. - De laatste stap is het invoeren van je wachtwoord en het klikken op inloggen. Meer informatie - Als je 2FA (tweestapsverificatie) gebruikt, moet je deze link gebruiken.\nJe kunt het ook gebruiken als je jouw gegevens hier niet wilt invullen. Talen Alleen media @@ -689,16 +597,13 @@ Je kunt beginnen met typen en er zullen namen gesuggereerd worden.\n\n Bot Pixelfedserver Server - Geen Pixelfedservers Eén van deze Al deze Geen van deze Eén van deze woorden (door spaties gescheiden) Al deze woorden (door spaties gescheiden) - Geen van deze woorden (door spaties gescheiden) Voeg een paar woorden aan het filter toe (gescheiden met spaties) Kolomnaam wijzigen - Geen Misskeyservers Misskeyserver Er is geen app op je apparaat geïnstalleerd om deze link mee te openen. Abonnementen @@ -715,7 +620,6 @@ Je kunt beginnen met typen en er zullen namen gesuggereerd worden.\n\n Kies een bestand om te uploaden Mijn video\'s Titel - Categorieën Licentie Categorie Taal @@ -730,14 +634,10 @@ Je kunt beginnen met typen en er zullen namen gesuggereerd worden.\n\n Klik hier om de videogegevens te bewerken. Video verwijderen Weet je zeker dat je deze video wilt verwijderen? - Nog geen video\'s geüpload! NSFW video\'s weergeven - Standaardkanaal %s Geen video\'s om weer te geven! - Aan favorieten toevoegen Reageren Delen - Mijn foto\'s Kies een manier van inplannen Vanaf apparaat Vanaf server @@ -745,12 +645,8 @@ Je kunt beginnen met typen en er zullen namen gesuggereerd worden.\n\n Toots (apparaat) Aanpassen Nieuwe toots boven de \'Meer ophalen\' knop weergeven - Bevestigingen Tijdlijnen - Meldingsservice Gebruikersomgeving - Verborgen inhoud - Schrijven Contacten %1$s heeft op je video gereageerd%2$s]]> %1$s volgt nu je kanaal %2$s]]> @@ -765,7 +661,6 @@ Je kunt beginnen met typen en er zullen namen gesuggereerd worden.\n\n Gegevens importeren Kies het bestand om te importeren Er is een fout opgetreden tijdens het kiezen van het back-upbestand! - De app tijdens het verwerken niet afsluiten. Het duurt niet lang. Een openbare reactie toevoegen Reactie versturen Er is geen internetverbinding. Jouw bericht is als concept opgeslagen. @@ -806,18 +701,14 @@ Je kunt beginnen met typen en er zullen namen gesuggereerd worden.\n\n eindigt op %s Poll vernieuwen Stemmen - Een poll kan niet aan een direct bericht worden toegevoegd! Een poll waarin je hebt gestemd is beëindigd Een poll die je hebt getoot is beëindigd Aanpassen Categorieën - Nieuws Tijdslot Geavanceerd Badge met \'nieuw\' op ongelezen toots tonen - PeerTubetijdlijn tonen PeerTube - Tabblad verbergen Tijdlijn verplaatsen Tijdlijn verbergen Tijdlijnen herordenen @@ -827,10 +718,8 @@ Je kunt beginnen met typen en er zullen namen gesuggereerd worden.\n\n Ongedaan maken Je moet twee zichtbare tabbladen behouden! Tijdlijnen herordenen - Druk lang op de lijstnaam onder lijsten om deze lijst te verwijderen! Hoofdtijdlijnen kunnen alleen worden verborgen! BBCode - Tijdlijn toevoegen Media altijd als gevoelig markeren GNU social-server Gebufferd bericht @@ -845,14 +734,11 @@ Je kunt beginnen met typen en er zullen namen gesuggereerd worden.\n\n Geschiedenis Afspeellijsten Weergavenaam - Privacy - Aanmaken Je hebt geen enkele afspeellijst. Klik op het \"+\"-pictogram om een nieuwe afspeellijst toe te voegen Je moet een weergavenaam invullen! Het kanaal is verplicht wanneer de afspeellijst openbaar is. Afspeellijst aanmaken De afspeellijst is nog leeg. - Media bewerken opnieuw Gallerij Emoji @@ -860,7 +746,6 @@ Je kunt beginnen met typen en er zullen namen gesuggereerd worden.\n\n Gum Tekst Filter - Aanpassen Kwast Weet je zeker dat je wilt afsluiten zonder de afbeelding op te slaan? Weggooien @@ -868,7 +753,6 @@ Je kunt beginnen met typen en er zullen namen gesuggereerd worden.\n\n Afbeelding succesvol opgeslagen! Opslaan van afbeelding mislukt Ondoorzichtigheid - Bijsnijden Fotobewerker inschakelen Een pollkeuze toevoegen Laatste pollkeuze verwijderen @@ -880,10 +764,8 @@ Je kunt beginnen met typen en er zullen namen gesuggereerd worden.\n\n Timed mute Mention the account Refresh cache - See who boosted and added to favorites Mention the status News - Display news from Fedilab\'s account General Regional Art @@ -927,7 +809,6 @@ Je kunt beginnen met typen en er zullen namen gesuggereerd worden.\n\n Reconnect the account The application failed to access the admin features. You might need to reconnect the account for having the correct scope. Unresolved - Resolved Remote Active Pending @@ -943,7 +824,6 @@ Je kunt beginnen met typen en er zullen namen gesuggereerd worden.\n\n Disable Silence Notify the user per e-mail - Perform action Custom warning User Moderator @@ -975,7 +855,6 @@ Je kunt beginnen met typen en er zullen namen gesuggereerd worden.\n\n Empty content! Display Fedilab features button The application needs to access audio recording - An error occurred when recording the voice message! Voice message Enable quick reply The account you are replying might not see your message! @@ -983,9 +862,7 @@ Je kunt beginnen met typen en er zullen namen gesuggereerd worden.\n\n If disabled, sensitive media will be hidden with a button Store media in full size with a long press on previews Add an ellipse button at the top right for listing all tags/instances/lists - Display an item in the main menu for a quick access to the timeline targeting #Fedilab tag Keep an open connection to the streaming API for live notifications. - When the app is in background, it will keep a connection to the streaming API. Disable it if you care about your battery. During the time slot, the app will send notifications. You can reverse (ie: silent) this time slot with the right spinner. Display a Fedilab button below profile picture. It is a shortcut for accessing in-app features. Allow to reply directly in timelines below statuses @@ -997,9 +874,6 @@ Je kunt beginnen met typen en er zullen namen gesuggereerd worden.\n\n These tags will allow to filter statuses from profiles. You will have to use the context menu for seeing them. Automatically insert a line break after the mention to capitalize the first letter Allow content creators to share statuses to their RSS feeds - Timelines - Interface - Battery Compose Maximum retry times when uploading media Create a new Folder here @@ -1010,9 +884,7 @@ Je kunt beginnen met typen en er zullen namen gesuggereerd worden.\n\n Default Directory Folder Create folder - Use your favourite browser inside the application. By disabling, links will be opened externally Display a toast message after an action has been completed (boost, fav, etc.)? - Export muted instances Muted instances have been exported! Add an instance Export instances @@ -1108,7 +980,6 @@ Je kunt beginnen met typen en er zullen namen gesuggereerd worden.\n\n Enter your custom host or leave blank for using nitter.net Hide Fedilab notification bar For hiding the remaining notification in the status bar, tap on the eye icon button then uncheck: \"Display in status bar\" - Enable delayed notifications Notifications will be delayed every 30 seconds. That will allow to drain less battery. Live notifications delayed No live notifications @@ -1134,7 +1005,6 @@ Je kunt beginnen met typen en er zullen namen gesuggereerd worden.\n\n Title for the video Join Peertube I am at least 16 years old and agree to the %1$s of this instance - Colors Links Change the color of links (URLs, mentions, tags, etc.) in messages Reblogs header @@ -1146,15 +1016,12 @@ Je kunt beginnen met typen en er zullen namen gesuggereerd worden.\n\n Reset Icons Color of bottom icons in timelines - Background - Change the background color for timelines Pin this tag Logo of the instance Edit profile Make an action Translation Image preview - Change the theme Text color Change the text color in pots Apply changes diff --git a/app/src/main/res/values-no/strings.xml b/app/src/main/res/values-no/strings.xml index 6d815e299..01681ba74 100644 --- a/app/src/main/res/values-no/strings.xml +++ b/app/src/main/res/values-no/strings.xml @@ -1,5 +1,4 @@ - - + Åpne menyen Lukk menyen @@ -16,8 +15,6 @@ Avbryt Last ned Last ned %1$s - Nedlasting ferdig - Lagre %1$s Media lagret Fil: %1$s Passord @@ -25,10 +22,8 @@ Kontoer Toots Stikkord - Token Lagre Gjenopprett - Tofaktorautentisering? Ingen resultater! Instans Instans: mastodon.social @@ -39,10 +34,7 @@ Endre Velg et bilde… Fjern - Mikrofon Kamera - Si noe, vær så snill - Beklager! Enheten støtter ikke taleinngangen! Vil du slette alt? Oversett dette tootet. Planlegg @@ -59,7 +51,6 @@ Svar Brukernavn Utkast - Nye data er tilgjengelige! Vil du vise dem? Favoritter Nye følgere Nevnelser @@ -78,18 +69,12 @@ Kommunikasjon Dempede brukere Blokkerte brukere - Fjernfølg Varsler Forespørsler om følging - Optimalisering Innstillinger - Profil - Hva vil du gjøre? Slett en konto Slett kontoen %1$s fra applikasjonen? Send en epost - Vennligst velg en fil - Ingen filutforsker funnet! Klikk på stien for å endre den Feilet! Planlagte toots @@ -99,10 +84,6 @@ Direktevarsler Ingen toots å vise - Tootet ble lagt til i favoritter - Tootet ble fjernet fra favoritter! - Tootet ble boostet! - Tootet er ikke lenger boostet! Boostet av %1$s Legge dette tootet til dine favoritter? Fjerne dette tootet fra favorittene dine? @@ -134,10 +115,6 @@ Fjerne dette tootet? Slette og kladde dette tootet på nytt? - - %d svar - %d svar - Bokmerker Legg til bokmerke Fjern fra bokmerker @@ -159,7 +136,6 @@ Svar på et toot Skriv et queet Svar på et queet - Du har nådd de 500 tegnene som er tillatt! Velg et medie Det oppsto en feil under valg av media! Slett dette mediet? @@ -193,7 +169,6 @@ Oversetting av toots: Søk instanser: Ikon-designer: - Banner-designer: Samtale @@ -223,15 +198,10 @@ boostet tootet ditt favoriserte tootet ditt fulgte deg - Ny toot fra %1$s og et annet varsel og %d andre varsler - - og et annet toot å oppdage - og %d andre toots å oppdage - %d liker %d liker @@ -267,7 +237,6 @@ Adressen til instansen ser ikke ut til å være gyldig! Det oppsto en feil under bytte mellom kontoer! Det oppsto en feil under søking! - Kan ikke logge inn! Profildataene er lagret! Ingen handling kan tas Media har blitt lagret! @@ -276,12 +245,8 @@ Utkast lagret! Er du sikker på at denne instansen tillater dette antall tegn? Vanligvis er denne verdien nær 500 tegn. Synligheten til toots er endret for kontoen %1$s - Instansnavn og brukernavn kan ikke være tomt! - Optimalisering av lasting Antall toots per innlasting - Antall kontoer per innlasting - Antall varsler per innlasting Alltid WIFI Spør @@ -290,13 +255,9 @@ Vis mer… Vis mindre… Sensitivt innhold - Vis forrige melding i svar - Vis lokal tidslinje - Vis forent tidslinje Deaktiver GIF-avatarer Sti: Lagre utkast automatisk - Vis tellere Legg til URL til media i toots Varlse når noen følger deg Varsle når noen booster tootene dine @@ -308,7 +269,6 @@ Varsle kun på WIFI Varsle? Dempede varslinger - Nattmodus NSFW visningspause i sekunder (0 betyr ingen visningspause) Rediger profil Tilpasset deling @@ -332,12 +292,6 @@ Aktiver Javascript Utvid cw automatisk Tillat cookies fra tredjeparter - Oppsett for tidslinjer: - - Faner - Meny - Faner og meny - Yandex DeepL @@ -349,15 +303,6 @@ Lyst Svart - - Nei - 512 Kb - 1 Mb - 2 Mb - 4 Mb - 6 Mb - 8 Mb - Angi LED-farge: Blå @@ -368,13 +313,9 @@ Gul Hvit - Varsle om nye toots på hjemmetidslinjen Følg - Slutt å følge - Blokker Slutt å blokkere Demp - Ingen handling Skru av demping Forespørsel sendt Følger deg @@ -386,8 +327,6 @@ Push-varsler Vennligst bekreft push notifications som du vil motta. Du kan aktivere eller deaktivere disse meldingene senere i innstillingene (Meldinger-fanen). - For uleste toots i hjemmetidslinjen? - For uleste varsler? Slett mellomlager Det er %1$s med data i mellomlageret. \n \nVil du slette alle data fra mellomlageret? @@ -397,7 +336,6 @@ Du kan aktivere eller deaktivere disse meldingene senere i innstillingene (Meldi Tittel Tittel… Beskrivelse - Beskrivelse… Nøkkelord Nøkkelord… @@ -414,7 +352,6 @@ Du kan aktivere eller deaktivere disse meldingene senere i innstillingene (Meldi Vis festede Ingen treff! Sikkerhetskopier toots for %1$s - Backup notifications for %1$s %1$s nye toots er importert %1$s new notifications have been imported @@ -464,18 +401,14 @@ Du kan aktivere eller deaktivere disse meldingene senere i innstillingene (Meldi Er du sikker på at du vil slette dette filteret? Det er ingenting i denne listen. Når medlemmer av denne listen legger inn nye statuser, vises de her. Legg til i liste - Fjern fra liste Opprett ny liste Slett liste Rediger liste Tittel på liste - Søk blant personer du følger - Dine lister The account was added to the list! You don\'t have any lists yet! %1$s er flyttet til %2$s - Vis antall boosts/favoritter Får du ikke logget inn? Her er noen ting du kan sjekke:\n\n - Kontroller at det ikke er noen skrivefeil i adressen til instansen\n\n @@ -491,25 +424,19 @@ Du kan aktivere eller deaktivere disse meldingene senere i innstillingene (Meldi %1$s av %2$s toots har blitt eksportert. Noe gikk galt under eksport av data for %1$s Noe gikk galt under eksport av data! - Data er importert! Noe gikk galt under import av data! Proxy - Type Aktivere proxy? Adresse Port Brukernavn Passord - Tema: - Kompakt modus Legg til toot-detaljer ved deling Støtt denne applikasjonen med Liberapay Det er en feil i det regulære uttrykket! - Har du ikke en konto? Fant ingen tidslinjer på denne instansen! Slette denne instansen? - Du er i ferd med å slette %s fra instansene du følger. Oversett med Følg instanse Du følger allerede denne instansen! @@ -518,10 +445,8 @@ Du kan aktivere eller deaktivere disse meldingene senere i innstillingene (Meldi Informasjon Skjul boosts fra %s Vis på profilen - Skjul alt fra %s Vis boosts fra %s Ikke vis på profilen - Vis alt fra %s Brukerkontoen blir nå vist på profilen Brukerkontoen er ikke lenger vist på profilen Boosts blir nå vist! @@ -542,7 +467,6 @@ Du kan aktivere eller deaktivere disse meldingene senere i innstillingene (Meldi Filterkontekst En eller flere kontekster hvor filteret skal gjelde Utløper etter - Legg til filter Slette filteret? Oppdater filter Opprett filter @@ -557,13 +481,11 @@ Du kan aktivere eller deaktivere disse meldingene senere i innstillingene (Meldi Brukerkontoer ble lagt til listen Legger brukerkontoer til listen Du har ikke opprettet noen lister. Klikk på \"+\"-knappen for å opprette en ny. - Du følger ikke noen ekstern instanser. Klikk på \"+\"-knappen for å legge til en ny. Hvem å følge Trunk API Brukerkonto(ene) kan ikke følges Henter ekstern brukerkonto Utvid skjult media automatisk - Vis følg instanser-knappen Ny følger Ny boost Ny favoritt @@ -588,7 +510,6 @@ Du kan aktivere eller deaktivere disse meldingene senere i innstillingene (Meldi Henter ekstern status Kommentar Peertube-instans - Vis tidslinje med private meldinger Vær den første til å kommentere på denne videoen. Bruk knappen oppe til høyre! %s visninger Varighet: %s @@ -600,10 +521,6 @@ Du kan aktivere eller deaktivere disse meldingene senere i innstillingene (Meldi Videoen er fjernet fra bokmerker! Det er ingen Peertube-videoer blant favorittene dine! Kanal - Ingen Peertube-kanaler - Ingen Peertube-instanser - Ingen Mastodon-instanser - Ingen lister Videoer Kanaler Bruk Emoji One @@ -611,12 +528,7 @@ Du kan aktivere eller deaktivere disse meldingene senere i innstillingene (Meldi Forhåndsvis alle toots Ny UX/UI-designer Forhåndsvis videoer - Gitlab brukerstøtte - Feilrapport - Ingen e-postklient er installert. - Send feilrapport Id på brukerkonto er kopiert til utklippstavlen! - Optimalisering av batteriforbruk Endre språk Standardspråk Avkort lange toots @@ -628,7 +540,6 @@ Du kan aktivere eller deaktivere disse meldingene senere i innstillingene (Meldi Stikkordet er lagret! Stikkordet er endret! Stikkordet er slettet! - Vis kunsttidslinje Planlegg boost Boosten er planlagt! Ingen planlagte boosts å vise! @@ -666,10 +577,7 @@ Du kan aktivere eller deaktivere disse meldingene senere i innstillingene (Meldi I dette feltet skriver du adressen til instansen. Hvis du opprettet en konto på https://mastodon.social\n, skriv mastodon.social (uten https://)\n Adresser vil bli foreslått når du begynner å skrive.\n\n ⚠ Logg inn-knappen vil bare fungere hvis navnet på instansen er gyldig, og instansen er oppe (online)! - Skriv e-postadressen tilknyttet Mastodon-kontoen din i dette feltet. - Siste steg er å oppgi passordet ditt, og trykke Logg inn. Mer informasjon - Hvis du bruker tofaktorautentisering (2FA), må du benytte deg av denne linken.\nDu kan også benytte deg av linken dersom du ikke vil skrive inn brukernavn og passord her, men heller logge inn via instansen. Språk Kun media @@ -681,16 +589,13 @@ Adresser vil bli foreslått når du begynner å skrive.\n\n Robot Pixelfed-instans Mastodon-instans - Ingen Pixelfed-instanser Hvilke som helst av disse stikkordene Alle disse stikkordene Ingen av disse stikkordene Hvilke som helst av disse stikkordene (separert med mellomrom) Alle disse ordene (separert med mellomrom) - Ingen av disse stikkordene (separert med mellomrom) Legg noen ord til filteret (skill dem med mellomrom) Endre kolonnenavn - Ingen Misskey-instanser Misskey-instans Ingen app som støtter denne koblingen er installert på enheten. Abonnementer @@ -707,7 +612,6 @@ Adresser vil bli foreslått når du begynner å skrive.\n\n Velg filen som skal lastes opp Mine videoer Tittel - Kategorier Lisens Kategori Språk @@ -722,14 +626,10 @@ Adresser vil bli foreslått når du begynner å skrive.\n\n Klikk her for å redigere videoinformasjon. Slett video Er du sikker på at du vil slette denne videoen? - Ingen videoer er lastet opp! Vis NSFW-videoer - Standard %s-kanal Ingen videoer å vise! - Legg til i favoritter Legg igjen en kommentar Del - Mine bilder Velg en tidsplan-modus Fra enhet Fra server @@ -737,12 +637,8 @@ Adresser vil bli foreslått når du begynner å skrive.\n\n Toots (enhet) Endre Vise nye toots over \"Hent flere toots…\"-knappen - Bekreftelser Tidslinjer - Varslingstjeneste Brukergrensesnitt - Skjult innhold - Komponering Kontakter %1$s kommenterte på din video %2$s]]> %1$s følger din kanal %2$s]]> @@ -757,7 +653,6 @@ Adresser vil bli foreslått når du begynner å skrive.\n\n Importer data Velg filen som skal importeres Det oppsto en feil under valg av fil! - Vennligst ikke stopp programmet mens prosessen kjører. Ny kommentar Send kommentar Enheten er ikke koblet til internett. Meldingen er lagret som kladd. @@ -798,18 +693,14 @@ Adresser vil bli foreslått når du begynner å skrive.\n\n steng %s Oppdater avstemming Stem - En avstemming kan ikke kobles til en direktemelding! En avstemming du har stemt på er avsluttet En avstemming du har tootet er avsluttet Tilpass Kategorier - Nyheter Tidsluke Avansert Vis \"ny\"-merket på uleste toots - Vis Peertube-tidslinje Peertube - Skjul fanen Flytt tidslinje Skjul tidslinje Endre rekkefølge på tidslinjer @@ -819,10 +710,8 @@ Adresser vil bli foreslått når du begynner å skrive.\n\n Angre Du må ha to synlige faner! Endre rekkefølge på tidslinjer - Bruk listeoppføringen for å slette denne listen! Hovedtidslinjer kan bare skjules! BBCode - Legg til tidlinje Marker alltid media som sensitivt GNU-instans Mellomlagret status @@ -837,14 +726,11 @@ Adresser vil bli foreslått når du begynner å skrive.\n\n Historikk Spilleliste Visningsnavn - Personvern - Opprett Du har ingen spillelister. Trykk på \"+\"-ikonet for å opprette en spilleliste Du må oppgi et visningsnavn Kanal er påkrevd når spillelisten er offentlig. Opprett en spilleliste Det er ingenting i denne spilleliste enda. - Rediger media Gjør om igjen Galleri Emoji @@ -852,7 +738,6 @@ Adresser vil bli foreslått når du begynner å skrive.\n\n Viskelær Tekst Filter - Juster Pensel Er du sikker på at du vil avslutte uten å lagre bildet? Forkast @@ -860,7 +745,6 @@ Adresser vil bli foreslått når du begynner å skrive.\n\n Bildet er lagret! Klarte ikke å lagre bildet Opasitet - Beskjær Aktiver bilderedigering Legg til valg Fjern siste valg @@ -872,10 +756,8 @@ Adresser vil bli foreslått når du begynner å skrive.\n\n Tidsbestemt demping Nevn en konto Oppdater mellomlager - Se hvem som har boostet og lagt til i favoritter Nevn statusen Nyheter - Vis nyheter fra Fedilab-kontoen Generelt Regionalt Kunst @@ -918,7 +800,6 @@ Adresser vil bli foreslått når du begynner å skrive.\n\n Reconnect the account The application failed to access the admin features. You might need to reconnect the account for having the correct scope. Unresolved - Resolved Remote Active Pending @@ -934,7 +815,6 @@ Adresser vil bli foreslått når du begynner å skrive.\n\n Disable Silence Notify the user per e-mail - Perform action Custom warning User Moderator @@ -966,7 +846,6 @@ Adresser vil bli foreslått når du begynner å skrive.\n\n Empty content! Display Fedilab features button The application needs to access audio recording - An error occurred when recording the voice message! Voice message Enable quick reply The account you are replying might not see your message! @@ -974,9 +853,7 @@ Adresser vil bli foreslått når du begynner å skrive.\n\n If disabled, sensitive media will be hidden with a button Store media in full size with a long press on previews Add an ellipse button at the top right for listing all tags/instances/lists - Display an item in the main menu for a quick access to the timeline targeting #Fedilab tag Keep an open connection to the streaming API for live notifications. - When the app is in background, it will keep a connection to the streaming API. Disable it if you care about your battery. During the time slot, the app will send notifications. You can reverse (ie: silent) this time slot with the right spinner. Display a Fedilab button below profile picture. It is a shortcut for accessing in-app features. Allow to reply directly in timelines below statuses @@ -988,9 +865,6 @@ Adresser vil bli foreslått når du begynner å skrive.\n\n These tags will allow to filter statuses from profiles. You will have to use the context menu for seeing them. Automatically insert a line break after the mention to capitalize the first letter Allow content creators to share statuses to their RSS feeds - Timelines - Interface - Battery Compose Maximum retry times when uploading media Create a new Folder here @@ -1001,9 +875,7 @@ Adresser vil bli foreslått når du begynner å skrive.\n\n Default Directory Folder Create folder - Use your favourite browser inside the application. By disabling, links will be opened externally Display a toast message after an action has been completed (boost, fav, etc.)? - Export muted instances Muted instances have been exported! Add an instance Export instances @@ -1099,7 +971,6 @@ Adresser vil bli foreslått når du begynner å skrive.\n\n Enter your custom host or leave blank for using nitter.net Hide Fedilab notification bar For hiding the remaining notification in the status bar, tap on the eye icon button then uncheck: \"Display in status bar\" - Enable delayed notifications Notifications will be delayed every 30 seconds. That will allow to drain less battery. Live notifications delayed No live notifications @@ -1125,7 +996,6 @@ Adresser vil bli foreslått når du begynner å skrive.\n\n Title for the video Join Peertube I am at least 16 years old and agree to the %1$s of this instance - Colors Links Change the color of links (URLs, mentions, tags, etc.) in messages Reblogs header @@ -1137,15 +1007,12 @@ Adresser vil bli foreslått når du begynner å skrive.\n\n Reset Icons Color of bottom icons in timelines - Background - Change the background color for timelines Pin this tag Logo of the instance Edit profile Make an action Translation Image preview - Change the theme Text color Change the text color in pots Apply changes diff --git a/app/src/main/res/values-oc/strings.xml b/app/src/main/res/values-oc/strings.xml index 22d6762c8..73e3d6d4d 100644 --- a/app/src/main/res/values-oc/strings.xml +++ b/app/src/main/res/values-oc/strings.xml @@ -1,5 +1,4 @@ - - + Open the menu Close the menu @@ -16,8 +15,6 @@ Cancel Download Download %1$s - Download complete - Save %1$s Media saved File: %1$s Password @@ -25,10 +22,8 @@ Accounts Toots Tags - Token Save Restore - Two-step authentication? No results! Instance Instance: mastodon.social @@ -39,10 +34,7 @@ Change Select a picture… Clean - Microphone Camera - Please, say something - Sorry! Your device does not support the voice input! Delete all Translate this toot. Schedule @@ -59,7 +51,6 @@ Replies User name Drafts - New data are available! Do you want to display them? Favourites New followers Mentions @@ -78,18 +69,12 @@ Communication Muted users Blocked users - Remote follow Notifications Follow requests - Optimization Settings - Profile - What do you want to do? Delete an account Delete the account %1$s from the application? Send an email - Please select a file - No file explorer found! Tap on the path to change it Failed! Scheduled toots @@ -99,10 +84,6 @@ Live notifications No toot to display - The toot was added to favourites - The toot was removed from favourites! - The toot was boosted! - The toot is no longer boosted! Boosted by %1$s Add this toot to your favourites? Remove this toot from your favourites? @@ -134,10 +115,6 @@ Remove this toot? Delete & re-draft this toot? - - %d reply - %d replies - Bookmarks Add to bookmarks Remove bookmark @@ -159,7 +136,6 @@ Reply to a toot Write a queet Reply to a queet - You have reached the 500 characters allowed! Select a media An error occurred while selecting the media! Delete this media? @@ -193,7 +169,6 @@ Translation of toots: Search instances: Icon designer: - Banner designer: Conversation @@ -223,15 +198,10 @@ boosted your status favourited your status followed you - New toot from %1$s and another notification and %d other notifications - - and another toot to discover - and %d other toots to discover - %d like %d likes @@ -267,7 +237,6 @@ The instance domain does not seem to be valid! An error occurred while switching between accounts! An error occurred while searching! - Can not log in! The profile data have been saved! No action can be taken The media has been saved! @@ -276,12 +245,8 @@ Draft saved! Are you sure this instance allows this number of characters? Usually, this value is close to 500 characters. Visibility of the toots has been changed for the account %1$s - Instance name and screen name cannot be blank! - Optimisation of loading Number of toots per load - Number of accounts per load - Number of notifications per load Always WIFI Ask @@ -290,13 +255,9 @@ Show more… Show less… Sensitive content - Display previous message in responses - Display local timeline - Display federated timeline Disable GIF avatars Path: Save drafts automatically - Display counters Add URL of media in toots Notify when someone follows you Notify when someone boosts your status @@ -308,7 +269,6 @@ Notify in WIFI only Notify? Silent Notifications - Night mode NSFW view timeout (seconds, 0 means off) Edit profile Custom sharing @@ -332,12 +292,6 @@ Enable Javascript Automatically expand cw Allow third-party cookies - Layout for timelines: - - Tabs - Menu - Tabs and menu - Yandex DeepL @@ -349,15 +303,6 @@ Light Black - - No - 512 Kb - 1 Mb - 2 Mb - 4 Mb - 6 Mb - 8 Mb - Set LED colour: Blue @@ -368,13 +313,9 @@ Yellow White - Notify for new toots on the home timeline Follow - Unfollow - Block Unblock Mute - No action Unmute Request sent Follows you @@ -387,8 +328,6 @@ Please, confirm push notifications that you want to receive. You can enable or disable these notifications later in settings (Notifications tab). - For unread toots in home time-line? - For unread notifications? Clear cache There are %1$s of data in cache.\n\nWould you like to delete them? @@ -398,7 +337,6 @@ Title Title… Description - Description… Keywords Keywords… @@ -415,7 +353,6 @@ Show pinned No matching result found! Backup toots for %1$s - Backup notifications for %1$s %1$s new toots have been imported %1$s new notifications have been imported @@ -471,18 +408,14 @@ Are you sure you want to permanently delete this list? There is nothing in this list yet. When members of this list post new statuses, they will appear here. Add to list - Remove from list Add list Delete list Edit list New list title - Search among people you follow - Your lists The account was added to the list! You don\'t have any lists yet! %1$s has moved to %2$s - Show boosts/favourites count Authentication does not work? Here are some checks that might help:\n\n - Check there is no spelling mistakes in the instance name\n\n @@ -499,25 +432,19 @@ %1$s toots out of %2$s have been exported. Something went wrong when exporting data for %1$s Something went wrong when exporting data! - Data have been imported! Something went wrong when importing data! Proxy - Type Enable proxy? Host Port Login Password - Theme: - Compact mode Add toot details when sharing Support the app on Liberapay There is an error in the regular expression! - No account yet? No timelines was found on this instance! Delete this instance? - You are going to delete %s from your followed instances. Translate in Follow instance You already follow this instance! @@ -526,10 +453,8 @@ Information Hide boosts from %s Feature on profile - Hide everything from %s Show boosts from %s Don\'t feature on profile - Show everything from %s The account is now featured on profile The account is no longer featured on profile Boosts are now shown! @@ -550,7 +475,6 @@ Filter contexts One or multiple contexts where the filter should apply Expire after - Add New Filter Delete filter? Update filter Create filter @@ -565,13 +489,11 @@ Accounts were added to the list Adding accounts to the list You have not created a list yet. Tap on the \"+\" button to add a new one. - You don\'t follow any remote instances. Tap on the \"+\" button to add a new one. Who to follow Trunk API Account(s) can\'t be followed Fetching remote account Automatically expand hidden media - Display follow instances button New follow New Boost New Favourite @@ -596,7 +518,6 @@ Fetching remote status Comment Peertube instance - Display private messages timeline Be the first to leave a comment on this video with the top right button! %s views Duration: %s @@ -608,10 +529,6 @@ The video has been removed from bookmarks! There is no Peertube videos in your favourites! Channel - No Peertube channels - No Peertube instances - No Mastodon instances - No lists Videos Channels Use Emoji One @@ -619,12 +536,7 @@ Display previews in all toots New UX/UI designer Display video previews - Gitlab Support - Bug Report - There are no email clients installed. - Send a bug report The account id has been copied in the clipboard! - Optimization of the battery Change the language Default language Truncate long toots @@ -636,7 +548,6 @@ The tag has been stored! The tag has been changed! The tag has been deleted! - Display Art timeline Schedule boost The boost is scheduled! No scheduled boost to display! @@ -675,12 +586,7 @@ You can start writing first letters and names will be suggested.\n\n ⚠ The Login button will only work if the instance name is valid and the instance is up! - In this field, write the email that is attached to your Mastodon account. - - Last step is to enter your password and tap on Login. - More information - If you use 2FA (Two-factor authentication), you need to use this link.\nYou can also use it if you do not want to enter your credentials here. Languages Media only @@ -692,16 +598,13 @@ Bot Pixelfed instance Mastodon instance - No Pixelfed instances Any of these All of these None of these Any of these words (space-separated) All these words (space-separated) - None of these words (space-separated) Add some words to filter (space-separated) Change column name - No Misskey instances Misskey instance No app supporting this link is installed on your device. Subscriptions @@ -718,7 +621,6 @@ Select the file to upload My videos Title - Categories License Category Language @@ -733,14 +635,10 @@ Tap here to edit the video data. Delete video Are you sure to delete this video? - No videos uploaded yet! Display NSFW videos - Default %s channel No videos to display! - Add media to favorites Leave a comment Share - My pictures Choose a schedule mode From device From server @@ -748,12 +646,8 @@ Toots (Device) Modify Display new toots above the \"Fetch more\" button - Confirmations Timelines - Notification service Interface - Hidden content - Composing Contacts %1$s commented your video %2$s]]> %1$s is following your channel %2$s]]> @@ -768,7 +662,6 @@ Import Data Select the file to import An error occurred when selecting the backup file! - Please, don\'t kill the app while processing. That can\'t be quite long. Add a public comment Send comment There is no Internet connection. Your message has been stored in drafts. @@ -809,18 +702,14 @@ end at %s Refresh poll Vote - A poll cannot be attached to a direct message! A poll you have voted in has ended A poll you tooted has ended Customize Categories - News Time slot Advanced Display \'new\' badge on unread toots - Display Peertube timeline Peertube - Hide the tab Move timeline Hide timeline Reorder timelines @@ -830,10 +719,8 @@ Undo You need to keep two visible tabs! Reorder timelines - Use the lists entry for deleting this list! Main timelines can only be hidden! BBCode - Add a timeline Always mark media as sensitive GNU instance Cached status @@ -848,14 +735,11 @@ History Playlists Display name - Privacy - Create You don\'t have any playlists. Tap on the \"+\" icon to add a new playlist You must provide a display name! The channel is required when the playlist is public. Create a playlist There is nothing in this playlist yet. - Edit media redo Gallery Emoji @@ -863,7 +747,6 @@ Eraser Text Filter - Adjust Brush Are you sure you want to exit without saving the image? Discard @@ -871,7 +754,6 @@ Image Saved Successfully! Failed to save Image Opacity - Crop Enable photo editor Add a poll item Remove last poll item @@ -883,10 +765,8 @@ Timed mute Mention the account Refresh cache - See who boosted and added to favorites Mention the status News - Display news from Fedilab\'s account General Regional Art @@ -930,7 +810,6 @@ Reconnect the account The application failed to access the admin features. You might need to reconnect the account for having the correct scope. Unresolved - Resolved Remote Active Pending @@ -946,7 +825,6 @@ Disable Silence Notify the user per e-mail - Perform action Custom warning User Moderator @@ -978,7 +856,6 @@ Empty content! Display Fedilab features button The application needs to access audio recording - An error occurred when recording the voice message! Voice message Enable quick reply The account you are replying might not see your message! @@ -986,9 +863,7 @@ If disabled, sensitive media will be hidden with a button Store media in full size with a long press on previews Add an ellipse button at the top right for listing all tags/instances/lists - Display an item in the main menu for a quick access to the timeline targeting #Fedilab tag Keep an open connection to the streaming API for live notifications. - When the app is in background, it will keep a connection to the streaming API. Disable it if you care about your battery. During the time slot, the app will send notifications. You can reverse (ie: silent) this time slot with the right spinner. Display a Fedilab button below profile picture. It is a shortcut for accessing in-app features. Allow to reply directly in timelines below statuses @@ -1000,9 +875,6 @@ These tags will allow to filter statuses from profiles. You will have to use the context menu for seeing them. Automatically insert a line break after the mention to capitalize the first letter Allow content creators to share statuses to their RSS feeds - Timelines - Interface - Battery Compose Maximum retry times when uploading media Create a new Folder here @@ -1013,9 +885,7 @@ Default Directory Folder Create folder - Use your favourite browser inside the application. By disabling, links will be opened externally Display a toast message after an action has been completed (boost, fav, etc.)? - Export muted instances Muted instances have been exported! Add an instance Export instances @@ -1111,7 +981,6 @@ Enter your custom host or leave blank for using nitter.net Hide Fedilab notification bar For hiding the remaining notification in the status bar, tap on the eye icon button then uncheck: \"Display in status bar\" - Enable delayed notifications Notifications will be delayed every 30 seconds. That will allow to drain less battery. Live notifications delayed No live notifications @@ -1137,7 +1006,6 @@ Title for the video Join Peertube I am at least 16 years old and agree to the %1$s of this instance - Colors Links Change the color of links (URLs, mentions, tags, etc.) in messages Reblogs header @@ -1149,15 +1017,12 @@ Reset Icons Color of bottom icons in timelines - Background - Change the background color for timelines Pin this tag Logo of the instance Edit profile Make an action Translation Image preview - Change the theme Text color Change the text color in pots Apply changes diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 041f52d24..ce2f57872 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -1,5 +1,4 @@ - - + Otwórz menu Zamknij menu @@ -16,8 +15,6 @@ Anuluj Pobierz Pobierz %1$s - Pobieranie zakończone - Zapisz %1$s Pliki zapisane Plik: %1$s Hasło @@ -25,10 +22,8 @@ Konta Wpisy Tagi - Token Zapisz Przywracanie - Dwustopniowe uwierzytelnianie? Brak wyników! Instancja Instancja: mastodon.social @@ -39,10 +34,7 @@ Zmień Wybierz zdjęcie… Czyste - Wprowadzanie głosowe Kamera - Proszę, powiedz coś - Przepraszamy! Twoje urządzenie nie obsługuje wprowadzenia głosowego! Usuń wszystko Przetłumacz ten wpis. Harmonogram @@ -59,7 +51,6 @@ Odpowiedzi Nazwa użytkownika Szkice - Znaleziono aktualizacje! Czy chcesz je wyświetlić? Ulubione Nowi śledzący Wspomnienia @@ -78,18 +69,12 @@ Komunikacja Wyciszeni użytkownicy Zablokowani użytkownicy - Zdalne śledzenie Powiadomienia Prośby o śledzenie - Optymalizacja Ustawienia - Profil - Co chcesz zrobić? Usuń konto Usunąć konto %1$s z aplikacji? Wyślij email - Proszę wybrać plik - Nie znaleziono przeglądarki plików! Kliknij na ścieżkę, aby ją zmienić Niepowodzenie! Zaplanowane wpisy @@ -99,10 +84,6 @@ Powiadomienia na żywo Brak wpisów do wyświetlenia - Wpis został dodany do ulubionych - Wpis został usunięty z ulubionych! - Wpis został podbity! - Wpis już nie jest podbity! Podbity przez %1$s Dodać ten wpis do ulubionych? Usunąć ten wpis z ulubionych? @@ -134,12 +115,6 @@ Usunąć ten wpis? Usunąć i przeredagować ten wpis? - - %d odpowiedzi - %d odpowiedzi - %d odpowiedzi - %d odpowiedzi - Zakładki Dodaj do zakładek Usuń zakładkę @@ -161,7 +136,6 @@ Odpowiedz na wpis Nowy wpis Odpowiedz na wpis - Osiągnąłeś limit 500 znaków! Wybierz zawartość Podczas wyboru zawartości wystąpił błąd! Usunąć tą zawartość? @@ -195,7 +169,6 @@ Tłumaczenie wpisów: Więcej o instancjach: Projektant ikon: - Projektant banera: Rozmowa @@ -225,19 +198,12 @@ podbił twój wpis dodał(a) Twój wpis do ulubionych zaczął(-ęła) Cię śledzić - Nowy wpis od %1$s dodaj %d innych powiadomień dodaj %d innych powiadomień dodaj %d innych powiadomień dodaj %d innych powiadomień - - i kolejny %d wpis do odkrycia - i kolejne %d wpisy do odkrycia - i kolejnych %d wpisów do odkrycia - i kolejne %d wpisów do odkrycia - %d like %d likes @@ -275,7 +241,6 @@ Domena instancji jest niepoprawna! Podczas zmiany kont wystąpił błąd! Podczas wyszukiwania wystąpił błąd! - Logowanie nieudane! Dane profilu zostały zapisane! Żadna akcja nie może zostać podjęta Zapisano zawartość multimedialną! @@ -284,12 +249,8 @@ Zapisano szkic! Czy na pewno ta instancja zezwala na więcej, niż domyślne 500 znaków? Widoczność wpisu została zmieniona na %1$s - Nazwa instancji i nazwa ekranu nie mogą być puste! - Optymalizacja ładowania Liczba wpisów do załadowania - Ilość kont do załadowania - Ilość powiadomień do załadowania Zawsze WiFi Zapytaj @@ -298,13 +259,9 @@ Pokaż więcej… Pokaż mniej… Treść wrażliwa - Wyświetl poprzednią wiadomość w odpowiedziach - Wyświetl lokalną oś czasu - Wyświetl globalną oś czasu Wyłącz animowane obrazy profilowe Ścieżka: Automatyczny zapis szkicu - Wyświetl kraje Dodaj adres URL zawartości we wpisach Powiadom mnie, gdy ktoś zaczyna mnie śledzić Powiadom mnie, gdy ktoś podbije mój wpis @@ -316,7 +273,6 @@ Powiadamiaj tylko w sieci WiFi Powiadamiać? Ciche powiadomienia - Tryb nocny Czas do automatycznego ukrycia treści wrażliwej w sekundach. 0 oznacza dezaktywację. Edytuj profil Custom sharing @@ -340,12 +296,6 @@ Włącz Javascript Zawsze rozwijaj ostrzeżenia o zawartości Zezwalaj na pliki cookie firm trzecich - Układ osi czasu: - - Zakładki - Menu - Zakładki i menu - Yandex DeepL @@ -357,15 +307,6 @@ Jasny Czarny - - Nie - 512 Kb - 1 Mb - 2 Mb - 4 Mb - 6 Mb - 8 Mb - Ustaw kolor diody LED: Niebieski @@ -376,13 +317,9 @@ Żółty Biały - Powiadom mnie o nowych wpisach na lokalnej osi czasu Śledź - Przestań śledzić - Zablokuj Odblokuj Wycisz - Brak czynności Wycisz Wysłano prośbę. Śledzi Cię @@ -394,8 +331,6 @@ Powiadomienia Wskaż, jakie powiadomienia chcesz otrzymywać. Możesz włączyć i wyłączyć te powiadomienia w ustawieniach powiadomień. - Dla nieprzeczytanych wpisów w lokalnej osi czasu? - Dla nieprzeczytanych powiadomień? Wyczyść pamięć podręczną Znaleziono %1$s danych w pamięci podręcznej.\n\nCzy chcesz je usunąć? @@ -405,7 +340,6 @@ Tytuł Tytuł… Opis - Description… Keywords Keywords… @@ -422,7 +356,6 @@ Pokaż przypięte Nie znaleziono pasujących wpisów! Kopia zapasowa dla %1$s - Backup notifications for %1$s Zaimportowano %1$s nowych wpisów %1$s new notifications have been imported @@ -477,18 +410,14 @@ Czy na pewno chcesz usunąć tę listę? Nie będzie można cofnąć tej akcji! Nie ma jeszcze nic na tej liście. Kiedy użytkownicy z tej listy dodadzą nowe statusy, wyświetlą się one tutaj. Dodaj do listy - Usuń z listy Dodaj listę Usuń listę Edytuj listę Nowy tytuł listy - Szukaj wśród osób, które śledzisz - Twoje listy The account was added to the list! You don\'t have any lists yet! %1$s przeniósł się do %2$s - Pokaż liczbę podbić i polubień Problem z uwierzytelnieniem? Spróbuj zastosować się do poniższych rad:\n\n - Sprawdź, czy nazwa instancji została poprawnie przepisana\n\n @@ -505,25 +434,19 @@ Wyeksportowano %1$s wpisów z dostępnych %2$s. Coś poszło nie tak podczas próby eksportu danych %1$s Something went wrong when exporting data! - Data have been imported! Something went wrong when importing data! Proxy - Typ Włączyć proxy? Host Port Login Hasło - Motyw: - Tryb kompaktowy Dodaj szczegóły wpisu podczas udostępniania Wesprzyj tą aplikacje na Liberapay Błędne wyrażenie regularne! - Nie masz jeszcze konta? Nie znaleziono żadnych osi czasu na tej instancji! Usunąć tą instancję? - Usuniesz %s z obserwowanych instancji. Przetłumacz na Obserwuj instancję Już obserwujesz tą instancję! @@ -532,10 +455,8 @@ Informacje Ukryj podbicia od %s Polecaj na profilu - Ukryj wszystko od %s Pokazuj podbicia od %s Nie polecaj na profilu - Ukryj wszystko od %s Konto jest teraz polecane na profilu Konto nie jest już polecane na profilu Podbicia są teraz pokazywane! @@ -556,7 +477,6 @@ Filtruj konteksty Jeden lub wiele kontekstów, gdzie stosuje się filtr Wygasaj po - Dodaj nowy filtr Usunąć filtr? Aktualizuj filtr Utwórz Filtr @@ -571,13 +491,11 @@ Konta zostały dodane do listy Dodawanie kont do listy Nie ma jeszcze utworzonej żadnej listy. Kliknij \"+\" aby dodać nową. - Nie obserwujesz żadnych zdalnych instancji. Kliknij \"+\" aby dodać nową. Kogo obserwować Trunk API Nie ma możliwości obserwowania kont(a) Pobieram zdalne konto Automatycznie pokaż ukryte treści multimedialne - Pokazuj przycisk obserwacji instancji Nowy śledzący Nowe Podbicie Nowe ulubione @@ -602,7 +520,6 @@ Pobieram zdalny status Skomentuj Instancja Peertube - Pokaż oś czasu prywatnych wiadomości Bądź pierwszą osobą, która doda komentarz przyciskiem po prawej na górze! %s wyświetleń Długość: %s @@ -614,10 +531,6 @@ Film został usunięty z zakładek! Nie ma filmów peertube w twoich ulubionych! Kanał - Brak kanałów Peertube - Brak instancji Peertube - Brak instancji Mastodon - Brak list Filmy Kanały Użyj Emoji One @@ -625,12 +538,7 @@ Wyświetlaj podgląd we wszystkich wpisach Nowy projektant UX/UI Wyświetl podglądy filmów - Wsparcie Gitlab - Zgłoszenie błędu - Brak zainstalowanych aplikacji pocztowych. - Wyslij raport o błędzie Id konta został skopiowany do schowka! - Optymalizacja baterii Zmień język Domyślny język Przycinaj długie tooty @@ -642,7 +550,6 @@ Tag został zapisany! Tag został zmieniony! Tag został usunięty! - Pokazuj oś czasu sztuki Zaplanuj podbicie Podbicie jest zaplanowane! Brak zaplanowanych podbić! @@ -680,10 +587,7 @@ W tym polu, musisz wpisać nazwę hosta instancji.\nNa przykład, jeżeli konto było zakładane na https://mastodon.social\npo prostu wpisz mastodon.social (bez https://)\n Po wpisaniu kilku liter pojawią sie sugestie.\n\n ⚠ Przycisk logowania zadziała tylko jeśli wpisana nazwa jest poprawna i a sama instancja działa! - Wpisz adres email przypisany do twojego konta Mastodon. - W ostatnim kroku wpisz hasło i kliknij zaloguj. Więcej informacji - Jeśli używasz uwierzytelniania dwu-etapowego, musisz skorzystać z tego linka.\nMożesz też go użyć jeśli nie chcesz wpisywać twoich danych tutaj. Języki Tylko media @@ -695,16 +599,13 @@ Bot Instancja pixelfed Instancja Mastodon - Brak instancji Pixelfed Którekolwiek z wymienionych Wszystkie z wymienionych Zadne z wymienionych Dowolne z tych słów (oddzielone spacją) Wszystkie z tych słów (rozdzielone spacją) - Żadne z tych słów (rozedzielone spacją) Add some words to filter (space-separated) Zmień nazwę kolumny - Brak instancji Misskey Instancja Misskey Brak zainstalowanej aplikacji do otwarcia tego odnośnika. Subskrypcje @@ -721,7 +622,6 @@ Select the file to upload Moje filmy Tytuł - Kategorie Licencja Kategoria Język @@ -736,14 +636,10 @@ Tap here to edit the video data. Usuń film Czy na pewno chcesz usunąć ten film? - No videos uploaded yet! Display NSFW videos - Default %s channel No videos to display! - Add media to favorites Leave a comment Udostępnij - Moje zdjęcia Choose a schedule mode Z urządzenia From server @@ -751,12 +647,8 @@ Toots (Device) Modyfikuj Display new toots above the \"Fetch more\" button - Potwierdzenia Timelines - Notification service Interface - Hidden content - Composing Contacts %1$s commented your video %2$s]]> %1$s is following your channel %2$s]]> @@ -771,7 +663,6 @@ Importuj dane Select the file to import An error occurred when selecting the backup file! - Please, don\'t kill the app while processing. That can\'t be quite long. Add a public comment Send comment There is no Internet connection. Your message has been stored in drafts. @@ -812,18 +703,14 @@ end at %s Refresh poll Vote - A poll cannot be attached to a direct message! A poll you have voted in has ended A poll you tooted has ended Customize Categories - News Time slot Advanced Display \'new\' badge on unread toots - Display Peertube timeline Peertube - Hide the tab Move timeline Hide timeline Reorder timelines @@ -833,10 +720,8 @@ Undo You need to keep two visible tabs! Reorder timelines - Use the lists entry for deleting this list! Main timelines can only be hidden! BBCode - Add a timeline Always mark media as sensitive GNU instance Cached status @@ -851,14 +736,11 @@ History Playlists Display name - Privacy - Create You don\'t have any playlists. Tap on the \"+\" icon to add a new playlist You must provide a display name! The channel is required when the playlist is public. Create a playlist There is nothing in this playlist yet. - Edit media redo Gallery Emoji @@ -866,7 +748,6 @@ Eraser Text Filter - Adjust Brush Are you sure you want to exit without saving the image? Discard @@ -874,7 +755,6 @@ Image Saved Successfully! Failed to save Image Opacity - Crop Enable photo editor Add a poll item Remove last poll item @@ -886,10 +766,8 @@ Timed mute Mention the account Refresh cache - See who boosted and added to favorites Mention the status News - Display news from Fedilab\'s account General Regional Art @@ -933,7 +811,6 @@ Reconnect the account The application failed to access the admin features. You might need to reconnect the account for having the correct scope. Unresolved - Resolved Remote Active Pending @@ -949,7 +826,6 @@ Disable Silence Notify the user per e-mail - Perform action Custom warning User Moderator @@ -981,7 +857,6 @@ Empty content! Display Fedilab features button The application needs to access audio recording - An error occurred when recording the voice message! Voice message Enable quick reply The account you are replying might not see your message! @@ -989,9 +864,7 @@ If disabled, sensitive media will be hidden with a button Store media in full size with a long press on previews Add an ellipse button at the top right for listing all tags/instances/lists - Display an item in the main menu for a quick access to the timeline targeting #Fedilab tag Keep an open connection to the streaming API for live notifications. - When the app is in background, it will keep a connection to the streaming API. Disable it if you care about your battery. During the time slot, the app will send notifications. You can reverse (ie: silent) this time slot with the right spinner. Display a Fedilab button below profile picture. It is a shortcut for accessing in-app features. Allow to reply directly in timelines below statuses @@ -1003,9 +876,6 @@ These tags will allow to filter statuses from profiles. You will have to use the context menu for seeing them. Automatically insert a line break after the mention to capitalize the first letter Allow content creators to share statuses to their RSS feeds - Timelines - Interface - Battery Compose Maximum retry times when uploading media Create a new Folder here @@ -1016,9 +886,7 @@ Default Directory Folder Create folder - Use your favourite browser inside the application. By disabling, links will be opened externally Display a toast message after an action has been completed (boost, fav, etc.)? - Export muted instances Muted instances have been exported! Add an instance Export instances @@ -1116,7 +984,6 @@ Enter your custom host or leave blank for using nitter.net Hide Fedilab notification bar For hiding the remaining notification in the status bar, tap on the eye icon button then uncheck: \"Display in status bar\" - Enable delayed notifications Notifications will be delayed every 30 seconds. That will allow to drain less battery. Live notifications delayed No live notifications @@ -1142,7 +1009,6 @@ Title for the video Join Peertube I am at least 16 years old and agree to the %1$s of this instance - Colors Links Change the color of links (URLs, mentions, tags, etc.) in messages Reblogs header @@ -1154,15 +1020,12 @@ Reset Icons Color of bottom icons in timelines - Background - Change the background color for timelines Pin this tag Logo of the instance Edit profile Make an action Translation Image preview - Change the theme Text color Change the text color in pots Apply changes diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index 10e84d8cb..c2662baac 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -1,5 +1,4 @@ - - + Abrir menu Fechar menu @@ -16,8 +15,6 @@ Cancelar Baixar Baixar %1$s - Download completo - Salvar %1$s Mídia salva Arquivo: %1$s Senha @@ -25,10 +22,8 @@ Contas Toots Tags - Token Salvar Restaurar - Autenticação de dois fatores? Sem resultados! Instância Instância: mastodon.social @@ -39,10 +34,7 @@ Alterar Selecione uma imagem… Limpar - Microfone Câmera - Por favor, diga algo - Desculpe! Seu dispositivo não suporta entrada por voz! Excluir tudo Traduzir este toot. Agendar @@ -59,7 +51,6 @@ Respostas Nome de usuário Rascunhos - Novos dados disponíveis! Deseja vê-los? Favoritos Novos seguidores Menções @@ -78,18 +69,12 @@ Comunicação Usuários silenciados Usuários bloqueados - Seguir remotamente Notificações Seguidores pendentes - Otimização Configurações - Perfil - O que você quer fazer? Remover conta Remover a conta %1$s do aplicativo? Mandar um e-mail - Por favor, selecione um arquivo - Nenhum gerenciador de arquivo encontrado! Toque no caminho para alterá-lo Falhou! Toots agendados @@ -99,10 +84,6 @@ Notificações ao vivo Sem toots - Toot favoritado! - Toot desfavoritado! - Você deu boost! - Você desfez o boost! Levou boost de %1$s Favoritar toot? Desfavoritar toot? @@ -134,10 +115,6 @@ Excluir este toot? Excluir & rascunhar este toot? - - %d resposta - %d respostas - Salvos Salvar Remover dos Salvos @@ -159,7 +136,6 @@ Responder toot Compor queet Responder queet - Você excedeu os 500 caracteres permitidos! Selecionar mídia Ocorreu um erro ao selecionar a mídia! Remover mídia? @@ -193,7 +169,6 @@ Tradução dos toots: Procure instâncias: Designer do ícone: - Designer da capa: Conversa @@ -223,15 +198,10 @@ deu boost no seu toot favoritou seu toot te seguiu - Novo toot de %1$s e outra notificação e outras %d notificações - - e outro %d toot para ver - e outros %d toots para ver - %d favoritou %d favoritaram @@ -267,7 +237,6 @@ Parece que o domínio da instância não é válido! Ocorreu um erro ao alternar entre as contas! Ocorreu um erro na pesquisa! - Não foi possível entrar! Dados de perfil salvos! A ação não pode ser feita ou não é suportada Mídia salva! @@ -276,12 +245,8 @@ Rascunho salvo! Você tem certeza de que sua instância permite esse número de caracteres? Geralmente, são 500 caracteres. Visibilidade dos toots foi alterada na conta %1$s - Nome da instância e nome de exibição não podem ser vazios! - Otimização da timeline Número de toots por vez - Número de contas por vez - Número de notificações por vez Sempre Wi-Fi Perguntar @@ -290,13 +255,9 @@ Mostrar mais… Mostrar menos… Conteúdo sensível - Mostrar toot anterior ao responder - Mostrar timeline local - Mostrar timeline global Desativar GIF Caminho: Salvar rascunhos automaticamente - Mostrar contadores Adicionar link da mídia nos toots Notificar quando alguém te seguir Notificar quando alguém der boost nos seus toots @@ -308,7 +269,6 @@ Notificar somente em Wi-Fi Notificar? Silenciar notificações - Modo noturno Segundos para expirar a prévia de mídia sensível, 0 para desativar. Editar perfil Compartilhamento externo personalizado @@ -332,12 +292,6 @@ Ativar Javascript Expandir AC automaticamente Permitir cookies de terceiros - Modelo das timelines: - - Abas - Menu - Abas e menu - Yandex DeepL @@ -349,15 +303,6 @@ Diurno AMOLED - - Não - 512 kb - 1 Mb - 2 Mb - 4 Mb - 6 Mb - 8 Mb - Cor do LED: Azul @@ -368,13 +313,9 @@ Amarelo Branco - Notificar sobre novos toots na página inicial Seguir - Deixar de seguir - Bloquear Desbloquear Silenciar - Sem ação Desativar silêncio Solicitação enviada Segue você @@ -387,8 +328,6 @@ Por favor, confirme que notificações você quer receber. Você pode ativar ou desativar essas notificações mais tarde em configurações (na aba Notificações). - Para toots não lidos na página inicial? - Para notificações não lidas? Limpar cache Há %1$s de dados em cache.\n\nGostaria de limpá-lo? @@ -398,7 +337,6 @@ Título Título… Descrição - Descrição… Palavras-chave Palavras-chave… @@ -415,7 +353,6 @@ Mostrar fixado Nenhum resultado correspondente encontrado! Fazer backup dos toots de %1$s - Backup notifications for %1$s %1$s novos toots foram importados %1$s new notifications have been imported @@ -471,18 +408,14 @@ Tem certeza de que deseja excluir permanentemente esta lista? Não há nada nesta lista ainda. Quando membros desta lista postarem novos toots, eles aparecerão aqui. Adicionar à lista - Remover da lista Criar lista Excluir lista Editar lista Nome da nova lista - Pesquisar entre pessoas que você segue - Suas listas The account was added to the list! You don\'t have any lists yet! %1$s mudou-se para %2$s - Mostrar número de boosts/favoritos Falha ao autenticar? Aqui estão algumas verificações que podem ajudar:\n\n - Verifique se não há erros de digitação no nome da instância\n\n @@ -499,25 +432,19 @@ %1$s toots de %2$s foram exportados. Algo deu errado enquanto exportava dados de %1$s Algo deu errado ao exportar dados! - Dados foram importados! Algo deu errado ao importar dados! Proxy - Tipo Ativar proxy? Servidor Porta Entrar Senha - Tema: - Modo compacto Adicionar detalhes do toot ao compartilhar Apoie o aplicativo no Liberapay Há um erro na expressão regular! - Sem conta ainda? Nenhuma timeline foi encontrada nesta instância! Deixar de seguir esta instância? - Você vai deixar de seguir a instância %s. Traduzir em %s Seguir instância Você já segue esta instância! @@ -526,10 +453,8 @@ Informação Ocultar boosts de %s Destacar no perfil - Ocultar tudo de %s Mostrar boosts de %s Não destacar no perfil - Mostrar tudo de %s A conta agora é destacada no perfil A conta não é mais destacada no perfil Boosts agora são mostrados! @@ -550,7 +475,6 @@ Contextos do filtro Um ou mais contextos onde o filtro deve ser aplicado Expira após - Criar novo filtro Excluir filtro? Atualizar filtro Criar filtro @@ -565,13 +489,11 @@ Contas adicionadas à lista Adicionando contas à lista Sem listas. Você pode criar uma tocando no botão \"+\". - Sem instâncias. Você pode seguir uma tocando no botão \"+\". Quem seguir: API Trunk Desculpe, é impossível seguir Carregando conta remota! Expandir automaticamente mídias ocultas - Mostrar botão de seguir instâncias Novo seguidor Novo Boost Novo favorito @@ -596,7 +518,6 @@ Carregando toot remoto! Comentar Instância Peertube - Mostrar timeline de mensagens diretas Seja o primeiro a comentar o vídeo tocando no botão superior direito! %s visualizações Duração: %s @@ -608,10 +529,6 @@ Vídeo desfavoritado! Não há vídeos do Peertube em seus favoritos! Canal - Sem canais Peertube - Sem instâncias Peertube - Sem instâncias Mastodon - Sem listas Vídeos Canais Usar Emoji One @@ -619,12 +536,7 @@ Mostrar prévias em todos os toots Designer da nova UX/UI Mostrar prévias de vídeo - Suporte no Gitlab - Relatório de erros - Não há nenhum cliente de email instalado. - Enviar relatório de erros O nome de usuário foi copiado para a área de transferência! - Otimização da bateria Alterar idioma Idioma padrão Delimitar toots longos @@ -636,7 +548,6 @@ A tag foi salva! A tag foi alterada! A tag foi excluída! - Mostrar timeline de Arte Agendar boost Boost agendado! Sem boosts agendados! @@ -675,12 +586,7 @@ Você pode começar digitando as primeiras letras e nomes serão sugeridos.\n\n ⚠ O botão de login só funcionará se o nome da instância for válido e a instância estiver ativa! - Neste campo, digite o e-mail usado na sua conta Mastodon. - - O último passo é digitar sua senha e tocar em Entrar. - Mais informação - Se você usar 2FA (autenticação de dois fatores), você precisa usar este link.\nVocê também pode usá-lo se você não quiser inserir suas credenciais aqui. Idiomas Apenas mídia @@ -692,16 +598,13 @@ Robô Instância Pixelfed Instância Mastodon - Sem instância Pixelfed Qualquer um Todos Nenhum Qualquer uma destas palavras (separadas por espaço) Todas estas palavras (separadas por espaço) - Nenhuma destas palavras (separadas por espaço) Adicione palavras para filtrar (separadas por espaço) Alterar nome da aba - Sem instâncias Misskey Instância Misskey Nenhum aplicativo instalado suporta este link. Inscrições @@ -718,7 +621,6 @@ Selecione o arquivo para enviar Meus vídeos Título - Categorias Licença Categoria Idioma @@ -733,14 +635,10 @@ Toque aqui para editar os dados do vídeo. Excluir vídeo Tem certeza de que deseja excluir este vídeo? - Sem vídeos enviados! Mostrar vídeos sensíveis - Canal %s por padrão Sem vídeos! - Favoritar mídia Deixe um comentário! Compartilhar - Minhas imagens Escolher como agendar Do dispositivo Do servidor @@ -748,12 +646,8 @@ Toots (Disp) Modificar Mostrar novos toots acima do botão \"Ver mais\" - Confirmações Timelines - Serviço de notificação Interface - Conteúdo oculto - Composição Contatos %1$s comentou seu vídeo %2$s]]> %1$s está seguindo seu canal %2$s]]> @@ -768,7 +662,6 @@ Importar dados Selecione o arquivo para importar Ocorreu um erro ao selecionar o arquivo de backup! - Por favor, não feche o aplicativo, não vai demorar muito. Adicionar um comentário público Enviar comentário Não há conexão com a internet. Sua mensagem foi salva em Rascunhos. @@ -809,18 +702,14 @@ termina em %s Atualizar Votar - Uma mensagem direta não pode conter uma enquete! Uma enquete em que você votou terminou Uma enquete sua terminou Personalizar Categorias - Novos! Definição de momento para notificações Avançado Mostrar etiqueta \'new\' em toots não lidos - Mostrar timeline do Peertube Peertube - Ocultar aba Mover timeline Ocultar timeline Reordenar timelines @@ -830,10 +719,8 @@ Desfazer Você precisa manter duas abas visíveis! Reordenar timelines - Vá em Listas para excluir esta lista! Timelines principais só podem ser ocultadas! BBCode - Adicionar timeline Sempre marcar mídia como sensível Instância GNU Toots em cache @@ -848,14 +735,11 @@ Histórico Listas de reprodução Nome de exibição - Privacidade - Criar Sem listas de reprodução. Você pode criar uma tocando no botão \"+\". Você deve inserir um nome de exibição! O canal é necessário quando a lista é pública. Criar uma lista Lista vazia. - Editar mídia refazer Galeria Emoji @@ -863,7 +747,6 @@ Borracha Texto Filtro - Ajustes Pincel Você tem certeza de que deseja sair sem salvar? Cancelar @@ -871,7 +754,6 @@ Imagem salva! Falha ao salvar imagem. Transparência - Recortar Ativar editor de fotos Adicionar um item Excluir último item @@ -883,10 +765,8 @@ Silêncio temporário Mencionar conta Atualizar cache - Ver quem deu boost ou favoritou Mencionar toot Notícias - Mostrar notícias do Fedilab Geral Regional Arte @@ -930,7 +810,6 @@ Restabelecer a conta O aplicativo falhou ao aceder aos recursos da administraçāo. Você pode precisar de reconectar a conta por ter o âmbito de recursos correto. Não Resolvido - Resolvido Remoto Ativa Pendente @@ -946,7 +825,6 @@ Desativar Silenciar Notificar o utilizador por e-mail - Executar ação Aviso personalizado Utilizador Moderador @@ -978,7 +856,6 @@ Conteúdo vazio! Exibir o botão de recursos Fedilab O aplicativo precisa de aceder à gravação de áudio - Ocorreu um erro ao gravar a mensagem de voz! Mensagem de voz Ativar resposta rápida A conta a que está a responder pode não ver sua mensagem! @@ -986,9 +863,7 @@ Se desativado, a média sensível será ocultada com um botão Armazenar a média em tamanho completo com uma pressão longa sobre as pré-visualizações Adicionar um botão elipse na parte superior direita para listar todas as tags/instâncias/listas - Exibir um item no menu principal para um acesso rápido à cronologia direcionada à #Fedilab tag Mantenha uma conexão aberta à API de streaming para notificações ao vivo. - Quando o aplicativo estiver em segundo plano, ele manterá uma conexão com a API de streaming. Desative-o se você se importar com sua bateria. Durante o período de tempo, o aplicativo enviará notificações. Você pode reverter (i. e.: silencioso) este período de tempo com o botão da direita. Exibir um botão Fedilab abaixo da imagem do perfil. É um atalho para aceder a recursos dentro do aplicativo. Permitir responder diretamente em cronologias abaixo dos estados @@ -1000,9 +875,6 @@ Estas tags permitirão filtrar estados de perfis. Você terá que usar o menu de contexto para vê-los. Inserir automaticamente uma quebra de linha, após a menção, para colocar a primeira letra em maiúscula Permitir que criadores de conteúdo partilhem estados para os seus feeds RSS - Cronologias - Interface - Bateria Compor Máximo de tentativas quando fizer o upload de média Criar uma nova pasta aqui @@ -1013,9 +885,7 @@ Diretório inicial Pasta Criar pasta - Use o seu navegador favorito dentro do aplicativo. Ao desativar, os links serão abertos externamente Exibir uma mensagem de felicitação após uma ação ser concluída (partilhar, favorizar, etc.)? - Export muted instances Muted instances have been exported! Add an instance Export instances @@ -1111,7 +981,6 @@ Enter your custom host or leave blank for using nitter.net Hide Fedilab notification bar For hiding the remaining notification in the status bar, tap on the eye icon button then uncheck: \"Display in status bar\" - Enable delayed notifications Notifications will be delayed every 30 seconds. That will allow to drain less battery. Live notifications delayed No live notifications @@ -1137,7 +1006,6 @@ Title for the video Join Peertube I am at least 16 years old and agree to the %1$s of this instance - Colors Links Change the color of links (URLs, mentions, tags, etc.) in messages Reblogs header @@ -1149,15 +1017,12 @@ Reset Icons Color of bottom icons in timelines - Background - Change the background color for timelines Pin this tag Logo of the instance Edit profile Make an action Translation Image preview - Change the theme Text color Change the text color in pots Apply changes diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml index b41f12ab2..988ff8d79 100644 --- a/app/src/main/res/values-ro/strings.xml +++ b/app/src/main/res/values-ro/strings.xml @@ -1,5 +1,4 @@ - - + Deschide meniul Închide meniul @@ -16,8 +15,6 @@ Anulare Descărcați Descărcat %1$s - Descărcare terminată - Salvează %1$s Media salvate Fișier: %1$s Parolă @@ -25,10 +22,8 @@ Conturi Notițe Etichete - Token Salvează Restabilire - Autentificare în două etape? Nici un rezultat! Instanță Instanță: mastodon.social @@ -39,10 +34,7 @@ Modifică Selectează o imagine… Elimină - Microfon Camera - Te rog, spune ceva - Ne pare rău! Dispozitivul nu permite înregistrare vocală! Șterge tot Traduceți această notiță. Planificare @@ -59,7 +51,6 @@ Răspunsuri Utilizator Ciorne - Sunt diponibile noi date! Vrei să fie afișate? Favorite Noi persoane care mă urmăresc Mențiuni @@ -78,18 +69,12 @@ Comunicare Utilizatori trecuți la modul silențios Utilizatori blocați - Urmăriți la distanţă Notificări Urmărește cererea - Optimizare Setări - Profil - Ce vreți să faceți? Șterge contul Șterge contul %1$s din aplicație? Trimite un email - Vă rugăm să selectați un fișier - Nici un dosar explorer găsit! Faceţi clic pe cale pentru a o schimba Nereușit! Notițe programate @@ -99,10 +84,6 @@ Notificări live Nu sunt notițe de afișat - Notița a fost adaugată la favorite - Notița a fost înlăturată la favorite! - Notița a fost amplificată! - Notița nu mai este amplificată! Amplificat de %1$s Adauga acestă notiță la favorite? Înlaătură acestă notiță de la favorite? @@ -134,11 +115,6 @@ Eliminați această notiță? Delete & re-draft this toot? - - %d răspuns - %d răspunsuri - %d răspunsuri - Bookmarks Add to bookmarks Remove bookmark @@ -160,7 +136,6 @@ Răspunde la această notiță Write a queet Reply to a queet - Ai atins 500 de caractere permise! Selectați media A aparut o eroare în timp ce selectați media! Ștergeți? @@ -194,7 +169,6 @@ Traducerea notițelor: Căutare instanțe: Designer-ul iconiței: - Banner designer: Conversație @@ -224,17 +198,11 @@ a amplificat statusul tău a favorizat statusul tău vă urmărește - Nouă notiță de la %1$s și încă o notificare și incă %d alte notificări și incă %d alte notificări - - și încă o notiță de descoperit - și %d altă notiță de descoperit - și %d altă notiță de descoperit - %d like %d likes @@ -271,7 +239,6 @@ Domeniul de instanță nu pare să fie valid! A apărut o eroare în timp ce schimbați între conturi! S-a produs o eroare în timpul căutării! - Nu mă pot autentifica! Datele de profil au fost salvate! Nu se poate efectua nici o acțiune Media a fost salvată! @@ -280,12 +247,8 @@ Ciornă salvată! Ești sigur că această instanță permite acest număr de caractere? De obicei, această valoare este aproape de 500 de caractere. S-a modificat vizibilitatea notițelor pentru contul %1$s - Numele instanţei şi numele ecranului nu poate fi gol! - Optimizarea încărcării Număr de notițe pe încărcare - Număr de conturi pe încărcare - Numărul de notificări pe încărcare Întotdeauna WIFI Întreabă @@ -294,13 +257,9 @@ Arată mai mult… Show less… Conţinut sensibil - Arată mesajul anterior în răspunsuri - Afişare cronologie locală - Afişare cronologie federală Disable GIF avatars Cale: Salvează ciornele automat - Arată contoarele Adauga URL-ul de media în notițe Notifică atunci când cineva vă urmărește Notifica atunci când cineva amplifică statusul @@ -312,7 +271,6 @@ Notifică doar în WIFI Notifică? Notificații silențioase - Mod de noapte NSFW Vezi timp expirare (secunde, 0 înseamnă oprit) Editează profilul Custom sharing @@ -336,12 +294,6 @@ Activează Javascript Automatically expand cw Permite cookies terțiare - Aspectul cronologiei: - - Ferestre - Meniu - Ferestre și meniu - Yandex DeepL @@ -353,15 +305,6 @@ Light Black - - No - 512 Kb - 1 Mb - 2 Mb - 4 Mb - 6 Mb - 8 Mb - Setează culoarea LED: Albastru @@ -372,13 +315,9 @@ Galben Alb - Notifică pentru noi notițe pe cronologia de acasă Urmărește - Nu mai urmări - Blochează Deblochează Mod silențios - Nici o acțiune Înlătură modul silențios Cerere trimisă Vă urmărește @@ -390,8 +329,6 @@ Notificări instant Vă rugăm să confirmați notificările instant pe care doriți să le primiți Puteți să activați sau dezactivați aceste setări, mai târziu (Fereastra de notificații). - Penru notițe necitite în cronologia de acasă? - Pentru notificări necitite? Goliți memoria cache Sunt %1$s din date în memoria cache. \n\nVreți să le ștergeți? @@ -401,7 +338,6 @@ Title Title… Description - Description… Keywords Keywords… @@ -418,7 +354,6 @@ Show pinned No matching result found! Backup toots for %1$s - Backup notifications for %1$s %1$s new toots have been imported %1$s new notifications have been imported @@ -473,18 +408,14 @@ Aceste date sunt strict confidențiale și pot fi folosite doar de aplicație. Are you sure you want to permanently delete this list? There is nothing in this list yet. When members of this list post new statuses, they will appear here. Add to list - Remove from list Add list Delete list Edit list New list title - Search among people you follow - Your lists The account was added to the list! You don\'t have any lists yet! %1$s has moved to %2$s - Show boosts/favourites count Authentication does not work? Here are some checks that might help:\n\n - Check there is no spelling mistakes in the instance name\n\n @@ -501,25 +432,19 @@ Aceste date sunt strict confidențiale și pot fi folosite doar de aplicație. %1$s toots out of %2$s have been exported. Something went wrong when exporting data for %1$s Something went wrong when exporting data! - Data have been imported! Something went wrong when importing data! Proxy - Type Enable proxy? Host Port Login Password - Theme: - Compact mode Add toot details when sharing Support the app on Liberapay There is an error in the regular expression! - No account yet? No timelines was found on this instance! Delete this instance? - You are going to delete %s from your followed instances. Translate in Follow instance You already follow this instance! @@ -528,10 +453,8 @@ Aceste date sunt strict confidențiale și pot fi folosite doar de aplicație. Information Hide boosts from %s Feature on profile - Hide everything from %s Show boosts from %s Don\'t feature on profile - Show everything from %s The account is now featured on profile The account is no longer featured on profile Boosts are now shown! @@ -552,7 +475,6 @@ Aceste date sunt strict confidențiale și pot fi folosite doar de aplicație. Filter contexts One or multiple contexts where the filter should apply Expire after - Add New Filter Delete filter? Update filter Create filter @@ -567,13 +489,11 @@ Aceste date sunt strict confidențiale și pot fi folosite doar de aplicație. Accounts were added to the list Adding accounts to the list You have not created a list yet. Tap on the \"+\" button to add a new one. - You don\'t follow any remote instances. Tap on the \"+\" button to add a new one. Who to follow Trunk API Account(s) can\'t be followed Fetching remote account Automatically expand hidden media - Display follow instances button New follow New Boost New Favourite @@ -598,7 +518,6 @@ Aceste date sunt strict confidențiale și pot fi folosite doar de aplicație. Fetching remote status Comment Peertube instance - Display private messages timeline Be the first to leave a comment on this video with the top right button! %s views Duration: %s @@ -610,10 +529,6 @@ Aceste date sunt strict confidențiale și pot fi folosite doar de aplicație. The video has been removed from bookmarks! There is no Peertube videos in your favourites! Channel - No Peertube channels - No Peertube instances - No Mastodon instances - No lists Videos Channels Use Emoji One @@ -621,12 +536,7 @@ Aceste date sunt strict confidențiale și pot fi folosite doar de aplicație. Display previews in all toots New UX/UI designer Display video previews - Gitlab Support - Bug Report - There are no email clients installed. - Send a bug report The account id has been copied in the clipboard! - Optimization of the battery Change the language Default language Truncate long toots @@ -638,7 +548,6 @@ Aceste date sunt strict confidențiale și pot fi folosite doar de aplicație. The tag has been stored! The tag has been changed! The tag has been deleted! - Display Art timeline Schedule boost The boost is scheduled! No scheduled boost to display! @@ -677,12 +586,7 @@ Aceste date sunt strict confidențiale și pot fi folosite doar de aplicație. You can start writing first letters and names will be suggested.\n\n ⚠ The Login button will only work if the instance name is valid and the instance is up! - In this field, write the email that is attached to your Mastodon account. - - Last step is to enter your password and click on Login. - More information - If you use 2FA (Two-factor authentication), you need to use this link.\nYou can also use it if you do not want to enter your credentials here. Languages Media only @@ -694,16 +598,13 @@ Aceste date sunt strict confidențiale și pot fi folosite doar de aplicație. Bot Pixelfed instance Mastodon instance - No Pixelfed instances Any of these All of these None of these Any of these words (space-separated) All these words (space-separated) - None of these words (space-separated) Add some words to filter (space-separated) Change column name - No Misskey instances Misskey instance No app supporting this link is installed on your device. Subscriptions @@ -720,7 +621,6 @@ Aceste date sunt strict confidențiale și pot fi folosite doar de aplicație. Select the file to upload My videos Title - Categories License Category Language @@ -735,14 +635,10 @@ Aceste date sunt strict confidențiale și pot fi folosite doar de aplicație. Tap here to edit the video data. Delete video Are you sure to delete this video? - No videos uploaded yet! Display NSFW videos - Default %s channel No videos to display! - Add media to favorites Leave a comment Share - My pictures Choose a schedule mode From device From server @@ -750,12 +646,8 @@ Aceste date sunt strict confidențiale și pot fi folosite doar de aplicație. Toots (Device) Modify Display new toots above the \"Fetch more\" button - Confirmations Timelines - Notification service Interface - Hidden content - Composing Contacts %1$s commented your video %2$s]]> %1$s is following your channel %2$s]]> @@ -770,7 +662,6 @@ Aceste date sunt strict confidențiale și pot fi folosite doar de aplicație. Import Data Select the file to import An error occurred when selecting the backup file! - Please, don\'t kill the app while processing. That can\'t be quite long. Add a public comment Send comment There is no Internet connection. Your message has been stored in drafts. @@ -811,18 +702,14 @@ Aceste date sunt strict confidențiale și pot fi folosite doar de aplicație. end at %s Refresh poll Vote - A poll cannot be attached to a direct message! A poll you have voted in has ended A poll you tooted has ended Customize Categories - News Time slot Advanced Display \'new\' badge on unread toots - Display Peertube timeline Peertube - Hide the tab Move timeline Hide timeline Reorder timelines @@ -832,10 +719,8 @@ Aceste date sunt strict confidențiale și pot fi folosite doar de aplicație. Undo You need to keep two visible tabs! Reorder timelines - Use the lists entry for deleting this list! Main timelines can only be hidden! BBCode - Add a timeline Always mark media as sensitive GNU instance Cached status @@ -850,14 +735,11 @@ Aceste date sunt strict confidențiale și pot fi folosite doar de aplicație. History Playlists Display name - Privacy - Create You don\'t have any playlists. Tap on the \"+\" icon to add a new playlist You must provide a display name! The channel is required when the playlist is public. Create a playlist There is nothing in this playlist yet. - Edit media redo Gallery Emoji @@ -865,7 +747,6 @@ Aceste date sunt strict confidențiale și pot fi folosite doar de aplicație. Eraser Text Filter - Adjust Brush Are you sure you want to exit without saving the image? Discard @@ -873,7 +754,6 @@ Aceste date sunt strict confidențiale și pot fi folosite doar de aplicație. Image Saved Successfully! Failed to save Image Opacity - Crop Enable photo editor Add a poll item Remove last poll item @@ -885,10 +765,8 @@ Aceste date sunt strict confidențiale și pot fi folosite doar de aplicație. Timed mute Mention the account Refresh cache - See who boosted and added to favorites Mention the status News - Display news from Fedilab\'s account General Regional Art @@ -932,7 +810,6 @@ Aceste date sunt strict confidențiale și pot fi folosite doar de aplicație. Reconnect the account The application failed to access the admin features. You might need to reconnect the account for having the correct scope. Unresolved - Resolved Remote Active Pending @@ -948,7 +825,6 @@ Aceste date sunt strict confidențiale și pot fi folosite doar de aplicație. Disable Silence Notify the user per e-mail - Perform action Custom warning User Moderator @@ -980,7 +856,6 @@ Aceste date sunt strict confidențiale și pot fi folosite doar de aplicație. Empty content! Display Fedilab features button The application needs to access audio recording - An error occurred when recording the voice message! Voice message Enable quick reply The account you are replying might not see your message! @@ -988,9 +863,7 @@ Aceste date sunt strict confidențiale și pot fi folosite doar de aplicație. If disabled, sensitive media will be hidden with a button Store media in full size with a long press on previews Add an ellipse button at the top right for listing all tags/instances/lists - Display an item in the main menu for a quick access to the timeline targeting #Fedilab tag Keep an open connection to the streaming API for live notifications. - When the app is in background, it will keep a connection to the streaming API. Disable it if you care about your battery. During the time slot, the app will send notifications. You can reverse (ie: silent) this time slot with the right spinner. Display a Fedilab button below profile picture. It is a shortcut for accessing in-app features. Allow to reply directly in timelines below statuses @@ -1002,9 +875,6 @@ Aceste date sunt strict confidențiale și pot fi folosite doar de aplicație. These tags will allow to filter statuses from profiles. You will have to use the context menu for seeing them. Automatically insert a line break after the mention to capitalize the first letter Allow content creators to share statuses to their RSS feeds - Timelines - Interface - Battery Compose Maximum retry times when uploading media Create a new Folder here @@ -1015,9 +885,7 @@ Aceste date sunt strict confidențiale și pot fi folosite doar de aplicație. Default Directory Folder Create folder - Use your favourite browser inside the application. By disabling, links will be opened externally Display a toast message after an action has been completed (boost, fav, etc.)? - Export muted instances Muted instances have been exported! Add an instance Export instances @@ -1114,7 +982,6 @@ Aceste date sunt strict confidențiale și pot fi folosite doar de aplicație. Enter your custom host or leave blank for using nitter.net Hide Fedilab notification bar For hiding the remaining notification in the status bar, tap on the eye icon button then uncheck: \"Display in status bar\" - Enable delayed notifications Notifications will be delayed every 30 seconds. That will allow to drain less battery. Live notifications delayed No live notifications @@ -1140,7 +1007,6 @@ Aceste date sunt strict confidențiale și pot fi folosite doar de aplicație. Title for the video Join Peertube I am at least 16 years old and agree to the %1$s of this instance - Colors Links Change the color of links (URLs, mentions, tags, etc.) in messages Reblogs header @@ -1152,15 +1018,12 @@ Aceste date sunt strict confidențiale și pot fi folosite doar de aplicație. Reset Icons Color of bottom icons in timelines - Background - Change the background color for timelines Pin this tag Logo of the instance Edit profile Make an action Translation Image preview - Change the theme Text color Change the text color in pots Apply changes diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 9725e5e30..1838345c1 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -1,5 +1,4 @@ - - + Открыть меню Закрыть меню @@ -16,8 +15,6 @@ Отмена Скачать Скачать %1$s - Загрузка завершена - Сохранить %1$s Медиафайл сохранен Файл: %1$s Пароль @@ -25,10 +22,8 @@ Аккаунты Туты Теги - Токен Сохранить Восстановить - Двухфакторная аутентификация? Нет результатов! Инстанс Инстанс: mastodon.social @@ -39,10 +34,7 @@ Изменить Выбрать изображение… Очистить - Микрофон Камера - Пожалуйста, скажите что-нибудь - Извините! Ваше устройство не поддерживает голосовой ввод! Удалить все Перевести этот тут. Запланировать @@ -59,7 +51,6 @@ Ответы Имя пользователя Черновики - Доступны новые данные! Вы хотите их отобразить? Избранные Новые подписчики Упоминания @@ -78,18 +69,12 @@ Общение Игнорируемые пользователи Заблокированные пользователи - Внешняя подписка Уведомления Запросы на подписку - Оптимизация Настройки - Профиль - Что вы хотите делать? Удалить аккаунт Удалить аккаунт %1$s из приложения? Отправить email - Выберите файл - Не найден файловый менеджер! Нажмите на путь, чтобы изменить его Ошибка! Запланированные туты @@ -99,10 +84,6 @@ Живые уведомления Нет тутов для отображения - Этот тут был добавлен в избранное - Этот тут был удален из избранного! - Этот тут был продвинут! - Этот тут больше не продвигается! Продвинут %1$s Добавить этот тут в избранное? Удалить этот тут из избранного? @@ -134,12 +115,6 @@ Удалить этот тут? Удалить & переписать этот тут? - - %d ответ - %d ответа - %d ответов - %d ответов - Закладки Добавить в закладки Удалить закладку @@ -161,7 +136,6 @@ Ответ на тут Написать квит Ответить на квит - Вы достигли предела 500 символов! Выбрать медиафайл При выборе медиафайла произошла ошибка! Удалить этот медиафайл? @@ -195,7 +169,6 @@ Перевод тутов: Поиск инстансов: Дизайнер иконки: - Дизайнер баннера: Разговор @@ -225,19 +198,12 @@ ваш статус продвинут добавил ваш статус в избранные подписался на вас - Новый тут от %1$s и другое уведомление и %d других уведомления и %d других уведомлений и %d других уведомлений - - и другой тут для просмотра - и %d других тута для просмотра - и %d других тутов для просмотра - и %d других тутов для просмотра - %d лайк %d лайка @@ -275,7 +241,6 @@ Этот домен инстанса недействителен! При переключении между аккаунтами произошла ошибка! Произошла ошибка при поиске! - Не удалось войти! Данные профиля сохранены! Ничего нельзя сделать Этот медиафайл сохранен! @@ -284,12 +249,8 @@ Черновик сохранен! Вы уверены, что данный сервер допускает такое количество знаков? Обычно это значение близко к 500. Видимость тутов была изменена для аккаунта %1$s - Имя инстанса и отображаемое имя не могут быть пустыми! - Оптимизация загрузки Количество тутов на загрузку - Количество аккаунтов за загрузку - Количество уведомлений за загрузку Всегда WIFI Спрашивать @@ -298,13 +259,9 @@ Еще… Свернуть… Деликатный контент - Отображать предыдущее сообщение в ответах - Показывать локальную ленту - Показывать федеративную ленту Отключить GIF-аватары Путь: Сохранять черновики автоматически - Показывать счетчики Добавлять URL-адрес медиа в туты Уведомлять, когда кто-то подписывается на вас Уведомлять, когда кто-то продвигает ваш статус @@ -316,7 +273,6 @@ Уведомлять только в сети WIFI Уведомлять? Тихие уведомления - Ночной режим Время просмотра NSFW (в секундах, 0 означает выключено) Изменить профиль Пользовательский обмен @@ -340,12 +296,6 @@ Включить Javascript Автоматически раскрывать 18+ Разрешить сторонние куки - Временные рамки ленты: - - Вкладки - Меню - Вкладки и меню - Яндекс DeepL @@ -357,15 +307,6 @@ Светлая Черная - - Нет - 512 КБ - 1 МБ - 2 МБ - 4 МБ - 6 МБ - 8 МБ - Цвет светодиода: Синий @@ -376,13 +317,9 @@ Желтый Белый - Уведомлять о новых тутах в домашней ленте Подписаться - Отписаться - Заблокировать Разблокировать Игнорировать - Нет действия Не игнорировать Запрос отправлен Подписан на вас @@ -395,8 +332,6 @@ Пожалуйста, подтвердите push-уведомления, которые вы хотите получать. Вы можете включить или отключить эти уведомления позже в настройках (вкладка \'Уведомления\'). - Для непрочитанных тутов в домашней ленте? - Для непрочитанных уведомлений? Очистка кэша Данными кэша занято %1$s.\n\nВы хотите их удалить? @@ -406,7 +341,6 @@ Название Название… Описание - Описание… Ключевые слова Ключевые слова… @@ -423,7 +357,6 @@ Показать закрепленные Результатов не найдено! Резервное копирование тутов для %1$s - Резервное копирование уведомлений для %1$s было импортировано %1$s новых тутов было импортировано %1$s новых уведомлений @@ -479,18 +412,14 @@ Вы действительно хотите удалить этот список навсегда? В этом списке пока ничего нет. Когда члены этого списка опубликуют новые статусы, они появятся здесь. Добавить в список - Удалить из списка Добавление списка Удалить список Изменить список Название нового списка - Поиск среди людей, на которых вы подписаны - Ваши списки Аккаунт был добавлен в список! У вас еще нет списков! %1$s был перенесен в %2$s - Показать количество продвигаемых/избранных Аутентификация не работает? Вот некоторые подсказки, которые могут помочь:\n\n - Проверьте, нет ли орфографических ошибок в имени инстанса\n\n @@ -507,25 +436,19 @@ %1$s тутов из %2$s были экспортированы. При экспорте данных для %1$s что-то пошло не так При экспорте данных для что-то пошло не так! - Данные были импортированы! При экспорте данных для что-то пошло не так! Прокси - Тип Включить прокси? Хост Порт Имя пользователя Пароль - Тема: - Компактный режим Добавлять детали тута при перепосте Поддержать приложение на Liberapay В регулярном выражении есть ошибка! - Нет аккаунта? На этом инстансе лент не найдено! Удалить этот инстанс? - Вы собираетесь удалить %s из ваших следующих инстансов. Перевести на Подписаться на инстанс Вы уже подписаны на этот инстанс! @@ -534,10 +457,8 @@ Информация Скрыть продвигаемые от %s Отображать в профиле - Скрыть все от %s Показать продвигаемые от %s Не показывать в профиле - Показать все от %s Этот аккаунт теперь отображается в профиле Этот аккаунт больше не отображается в профиле Продвигаемые теперь отображаются! @@ -558,7 +479,6 @@ Фильтр контекстов Один или несколько контекстов, в которых должен быть применен фильтр Истекает после - Добавить новый фильтр Удалить фильтр? Обновить фильтр Создать фильтр @@ -573,13 +493,11 @@ Аккаунты были добавлены в список Добавление аккаунтов в список Вы еще не создали список. Нажмите \"+\", чтобы добавить первый. - Вы не подписаны на какие-либо внешние инстансы. Нажмите \"+\", чтобы добавить первый. На кого подписаться Trunk API Аккаунт(ы) не могут быть подписаны Получение внешнего аккаунта Показать скрытые медиа автоматически - Отображать кнопку подписки на инстансы Новая подписка Новое продвижение Новое избранное @@ -604,7 +522,6 @@ Получение внешнего статуса Комментарий Инстанс Peertube - Показывать приватные сообщения в ленте Будьте первым прокомментировавшим это видео (при помощи верхней правой кнопки)! %s просмотров Продолжительность: %s @@ -616,10 +533,6 @@ Видео удалено из закладок! В вашем избранном нет видео Peertube! Канал - Нет каналов Peertube - Нет инстансов Peertube - Нет инстансов Mastodon - Нет списков Видео Каналы Использовать Emoji One @@ -627,12 +540,7 @@ Отображать превью для всех тутов Новый дизайнер UX/UI Отображать превью видео - Поддержка Gitlab - Отчет об ошибке - Не найдено приложений для работы с электронной почтой. - Отправить отчет об ошибке Идентификатор учетной записи скопирован в буфер обмена! - Оптимизация батареи Изменить язык Язык по умолчанию Усекать длинные туты @@ -644,7 +552,6 @@ Тег был сохранен! Тег был изменен! Тег был удален! - Показывать ленту Art Расписание продвижения Продвижение запланировано! Нет запланированных продвижений для отображения! @@ -683,12 +590,7 @@ Начните писать, чтобы получить предложения.\n\n ⚠ Кнопка входа будет работать только в случае, если инстанс включен и его имя корректно! - В этом поле укажите адрес электронной почты, который привязан к вашему аккаунту Mastodon. - - Последний шаг - введите свой пароль и нажмите Войти. - Дополнительная информация - Если вы используете 2FA (двухфакторную аутентификацию), вам нужно использовать эту ссылку.\nТакже вы можете ее использовать, если не хотите вводить здесь свои учетные данные. Языки Только медиа @@ -700,16 +602,13 @@ Бот Инстанс Pixelfed Инстанс Mastodon - Нет инстансов Pixelfed Любой из этих Все из этих Ни один из этих Любое из этих слов (через пробел) Все эти слова (через пробел) - Ни одно из этих слов (через пробел) Добавьте слова в фильтр (через пробел) Изменить имя столбца - Нет инстансов Misskey Инстанс Misskey На вашем устройстве не установлено приложение, для открытия этой ссылки. Подписки @@ -726,7 +625,6 @@ Выберите файл для загрузки Мои видео Название - Категории Лицензия Категория Язык @@ -741,14 +639,10 @@ Нажмите здесь, чтобы редактировать данные видео. Удалить видео Вы уверены, что хотите удалить это видео? - Нет загруженных видео! Отображать видео NSFW - Канал по умолчанию %s Нет видео для отображения! - Добавить медиа в избранное Оставить комментарий Поделиться - Мои изображения Выберите режим расписания С устройства С сервера @@ -756,12 +650,8 @@ Туты (Устройство) Изменить Отображать новые туты над кнопкой \'Получить больше\' - Подтверждения Ленты - Служба уведомлений Интерфейс - Скрытый контент - Создание Контакты %1$s прокомментировал ваше видео %2$s]]> %1$s следит за вашим каналом %2$s]]> @@ -776,7 +666,6 @@ Импорт данных Выберите файл для импорта Произошла ошибка при выборе файла резервной копии! - Пожалуйста, не завершайте приложение во время обработки. Это ненадолго. Добавить публичный комментарий Отправить комментарий Нет подключения к интернету. Ваше сообщение было сохранено в черновиках. @@ -817,18 +706,14 @@ заканчивается в %s Обновить опрос Голосовать - Опрос не может быть прикреплен к прямому сообщению! Опрос, в котором вы проголосовали, завершен Один из ваших опросов завершен Настроить Категории - Новости Временной интервал Дополнительно Показывать значок \'new\' на непрочитанных тутах - Показывать ленту Peertube Peertube - Скрыть вкладку Переместить ленту Скрыть ленту Изменить порядок лент @@ -838,10 +723,8 @@ Вернуть Необходимо сохранить две видимые вкладки! Изменение порядка лент - Используйте элемент списка для удаления этого списка! Основные ленты могут быть только скрыты! BBCode - Добавить в ленту Всегда отмечать медиафайлы как деликатный контент Инстанс GNU Состояние кэша @@ -856,14 +739,11 @@ История Плейлисты Отображаемое имя - Конфиденциальность - Создать У вас нет плейлистов. Нажмите на \"+\", чтобы добавить новый Вы должны указать отображаемое имя! Этот канал необходим, когда плейлист общедоступен. Создать плейлист В этом плейлисте пока ничего нет. - Изменить медиа вернуть Галерея Эмодзи @@ -871,7 +751,6 @@ Ластик Текст Фильтр - Подогнать Кисть Вы уверены, что хотите выйти без сохранения изображения? Сбросить @@ -879,7 +758,6 @@ Изображение сохранено успешно! Не удалось сохранить изображение Затенение - Обрезка Включить редактор фотографий Добавить элемент опроса Удалить последний элемент опроса @@ -891,10 +769,8 @@ Временно игнорировать Упомянуть аккаунт Обновить кэш - Посмотреть кто продвинул и добавил в избранное Упомянуть статус Новости - Показывать новости от Fedilab Основной Региональный Искусство @@ -938,7 +814,6 @@ Повторно подключить аккаунт Приложение не смогло получить доступ к функциям администрирования. Возможно вам необходимо повторно подключить учетную запись, чтобы получить нужные права. Нерешенный - Решенный Удаленный Активный В ожидании @@ -954,7 +829,6 @@ Отключение Приглушение Уведомить пользователя по электронной почте - Выполнить действие Предупреждение пользователя Пользователь Модератор @@ -986,7 +860,6 @@ Контента нет! Показать кнопку функций Fedilab Приложению требуется доступ к записи аудио - Произошла ошибка при записи голосового сообщения! Голосовое сообщение Включить быстрый ответ Аккаунт, которому вы отвечаете, может не увидеть ваше сообщение! @@ -994,9 +867,7 @@ Если отключено, деликатный контент будет скрыт кнопкой Сохранять мультимедиа в полном размере при длительном нажатии на превью Добавить кнопку ⋮ в правом верхнем углу для отображения всех тегов /инстансов/списков - Отображать элемент в главном меню для быстрого доступа к ленте с тегом #Fedilab Поддерживать соединение с потоковым API для уведомлений в реальном времени. - Когда приложение работает в фоновом режиме, оно будет поддерживать соединение с потоковым API. Отключите, если вы заботитесь о своей батарее. В течение этого промежутка времени приложение отправит вам уведомление. Вы можете изменить (отключить) этот временной интервал с помощью спиннера. Включает кнопку Fedilab под изображением профиля для быстрого доступа к функциям. Разрешить отвечать прямо в ленте ниже статусов @@ -1008,9 +879,6 @@ Эти теги позволят отфильтровывать статусы из профилей. Вы должны будете использовать контекстное меню для их просмотра. Автоматически вставлять разрыв строки после упоминания для ввода заглавной первой буквы Разрешить создателям контента обмениваться статусами в своих RSS-каналах - Ленты - Интерфейс - Батарея Создание Максимальное количество повторов при загрузке мультимедиа Создать новую папку здесь @@ -1021,9 +889,7 @@ Каталог по умолчанию Папка Создать папку - Используйте свой любимый браузер внутри приложения. При отключении, сылки будут открыты вне Fedilab Отобразить уведомление после выполнения действия (продвижение, добавление в избранные и т. д.)? - Экспорт игнорируемых инстансов Игнорируемые инстансы были экспортированы! Добавить инстанс Экспорт инстансов @@ -1121,7 +987,6 @@ Введите собственный хост или оставьте пустым для использования nitter.net Скрыть панель уведомлений Fedilab Чтобы скрыть уведомление в строке состояния, нажмите на кнопку с пиктограммой глаза и снимите флажок: \"Показывать в строке состояния\" - Включить отложенные уведомления Уведомления будут появляться на 30 секунд позже. Это позволит уменьшить влияние на батарею. Live notifications delayed No live notifications @@ -1147,7 +1012,6 @@ Title for the video Join Peertube I am at least 16 years old and agree to the %1$s of this instance - Colors Links Change the color of links (URLs, mentions, tags, etc.) in messages Reblogs header @@ -1159,15 +1023,12 @@ Reset Icons Color of bottom icons in timelines - Background - Change the background color for timelines Pin this tag Logo of the instance Edit profile Make an action Translation Image preview - Изменить тему Цвет текста Change the text color in pots Применить изменения diff --git a/app/src/main/res/values-si/strings.xml b/app/src/main/res/values-si/strings.xml index 516cc7870..b2264c0bb 100644 --- a/app/src/main/res/values-si/strings.xml +++ b/app/src/main/res/values-si/strings.xml @@ -1,5 +1,4 @@ - - + මෙනුව විවෘත කරන්න මෙනුව වසන්න @@ -16,8 +15,6 @@ අවලංගු කරන්න බාගත කරන්න Download %1$s - බාගතවීම සම්පුර්ණයි - Save %1$s මාධ්‍යය සුරකින ලදී ගොනුව: %1$s මුරපදය @@ -25,10 +22,8 @@ ගිණුම් Toots හැඳුනුම් සංකේත - ටෝකනය සුරකින්න ප්‍රතිස්ථාපනය කරන්න - ද්වි-පියවර සහතික කිරීම? ප්‍රතිඵල නොමැත! Instance Instance: mastodon.social @@ -39,10 +34,7 @@ වෙනස් කරන්න පින්තූරයක් තෝරන්න… Clean - මයික්‍රොෆෝනය කැමරාව - කරුණාකර, යමක් කියන්න - කණගාටුයි! හඬ මගින් ආදානය සඳහා ඔබගේ උපාංගය සහය දක්වන්නෙ නැත! සියල්ල මකන්න Translate this toot. සැලසුම් කරන්න @@ -59,7 +51,6 @@ ප්‍රතිචාර පරිශීලක නාමය කටුසටහන් - නව දත්ත ඇත! ඔබට ඒවා පෙන්වීමට අවශ්‍ය ද? ප්‍රියතම නව අනුගාමිකයන් සඳහන් කිරීම් @@ -78,18 +69,12 @@ සන්නිවේදන නිහඬ කරන ලද පරිශීලකයන් අවහිර කරන ලද පරිශීලකයන් - Remote follow දැනුම්දීම් Follow requests - ප්‍රශස්තිකරණය සැකසුම් - Profile - ඔබට අවශ්‍ය කුමක් කිරීමට ද? ගිණුමක් මකන්න %1$s ගිණුම මෘදුකාංගයෙන් මකා දමනවා ද? විද්‍යුත් ලිපියක් යවන්න - කරුණාකර ගොනුවක් තෝරන්න - No file explorer found! Tap on the path to change it අසාර්ථකයි! Scheduled toots @@ -99,10 +84,6 @@ සජීවී දැනුම්දීම් No toot to display - The toot was added to favourites - The toot was removed from favourites! - The toot was boosted! - The toot is no longer boosted! Boosted by %1$s Add this toot to your favourites? Remove this toot from your favourites? @@ -134,10 +115,6 @@ Remove this toot? Delete & re-draft this toot? - - %d ප්‍රතිචාරය යි - ප්‍රතිචාරය %d යි - පොත් යොමු පොත් යොමුවලට එක් කරන්න පොත් යොමුව ඉවත් කරන්න @@ -159,7 +136,6 @@ Reply to a toot Write a queet Reply to a queet - ලබා දී ඇති අකුරු 500 ක සීමාවට ඔබ ළඟා වී ඇත! Select a media මාධ්‍යය තෝරන අතරතුර දෝෂයක් සිදුවුණා! මෙම මාධ්‍යය මකනවා ද? @@ -193,7 +169,6 @@ Translation of toots: Search instances: Icon designer: - Banner designer: සාකච්ඡාව @@ -223,15 +198,10 @@ boosted your status favourited your status followed you - New toot from %1$s and another notification and %d other notifications - - and another toot to discover - and %d other toots to discover - %d like %d likes @@ -267,7 +237,6 @@ The instance domain does not seem to be valid! ගිණුම් අතර මාරුවනවිට දෝෂයක් සිදුවුණා! සොයන අතරතුර දෝෂයක් සිදුවුණා! - පූරනය වීමට නොහැකි යි! The profile data have been saved! කිසිම ක්‍රියාමාර්ගයක් ගැනීමට නොහැක මාධ්‍යය සුරකින ලදී! @@ -276,12 +245,8 @@ කටුසටහන සුරකින ලදී! Are you sure this instance allows this number of characters? Usually, this value is close to 500 characters. Visibility of the toots has been changed for the account %1$s - Instance name and screen name cannot be blank! - Optimisation of loading Number of toots per load - Number of accounts per load - Number of notifications per load සැමවිටම WIFI අහන්න @@ -290,13 +255,9 @@ තවත් පෙන්වන්න… අඩුවෙන් පෙන්වන්න… සංවේදී අන්තර්ගතයකි - ප්‍රතිචාරවල පෙර පණිවිඩය පෙන්වන්න - ස්ථානීය කාල රේඛාව පෙන්වන්න - ඒකාබද්ධ කාල රේඛාව පෙන්වන්න Disable GIF avatars මාර්ගය: කටුසටහන් ස්වයංක්‍රීයව සුරකින්න - ගණකයන් පෙන්වන්න Add URL of media in toots Notify when someone follows you Notify when someone boosts your status @@ -308,7 +269,6 @@ Notify in WIFI only Notify? Silent Notifications - Night mode NSFW view timeout (seconds, 0 means off) Edit profile Custom sharing @@ -332,12 +292,6 @@ Javascript සක්‍රිය කරන්න Automatically expand cw Allow third-party cookies - කාල රේඛා සඳහා සැලැස්ම: - - Tabs - මෙනු - Tabs and menu - Yandex DeepL @@ -349,15 +303,6 @@ ආලෝකමත් කළු - - නැහැ - 512 Kb - 1 Mb - 2 Mb - 4 Mb - 6 Mb - 8 Mb - LED වර්ණය තෝරන්න: නිල් @@ -368,13 +313,9 @@ කහ සුදු - Notify for new toots on the home timeline Follow - Unfollow - අවහිර කරන්න අවහිර නොකරන්න නිහඬ කරන්න - ක්‍රියාවක් නැත නිහඬ බව නැති කරන්න Request sent Follows you @@ -387,8 +328,6 @@ Please, confirm push notifications that you want to receive. You can enable or disable these notifications later in settings (Notifications tab). - For unread toots in home time-line? - For unread notifications? Clear cache There are %1$s of data in cache.\n\nWould you like to delete them? @@ -398,7 +337,6 @@ Title Title… Description - Description… Keywords Keywords… @@ -415,7 +353,6 @@ Show pinned No matching result found! Backup toots for %1$s - Backup notifications for %1$s %1$s new toots have been imported %1$s new notifications have been imported @@ -471,18 +408,14 @@ මෙම ලැයිස්තුව ස්ථිරවම මකා දැමීමට අවශ්‍ය බව විශ්වාස ද? There is nothing in this list yet. When members of this list post new statuses, they will appear here. ලැයිස්තුවට එකතු කරන්න - ලැයිස්තුවෙන් ඉවත් කරන්න ලැයිස්තුවක් එකතු කරන්න ලැයිස්තුව මකන්න ලැයිස්තුව සංස්කරණය කරන්න New list title - Search among people you follow - Your lists The account was added to the list! You don\'t have any lists yet! %1$s has moved to %2$s - Show boosts/favourites count Authentication does not work? Here are some checks that might help:\n\n - Check there is no spelling mistakes in the instance name\n\n @@ -499,25 +432,19 @@ %1$s toots out of %2$s have been exported. Something went wrong when exporting data for %1$s Something went wrong when exporting data! - Data have been imported! Something went wrong when importing data! Proxy - Type Enable proxy? Host Port Login Password - තේමාව: - සංයුක්ත ආකාරය Add toot details when sharing Liberapay මගින් මෙම මෘදුකාංගයට සඳහා ආධාර කරන්න There is an error in the regular expression! - No account yet? No timelines was found on this instance! Delete this instance? - You are going to delete %s from your followed instances. Translate in Follow instance You already follow this instance! @@ -526,10 +453,8 @@ Information Hide boosts from %s Feature on profile - Hide everything from %s Show boosts from %s Don\'t feature on profile - Show everything from %s The account is now featured on profile The account is no longer featured on profile Boosts are now shown! @@ -550,7 +475,6 @@ Filter contexts One or multiple contexts where the filter should apply Expire after - Add New Filter Delete filter? Update filter Create filter @@ -565,13 +489,11 @@ Accounts were added to the list Adding accounts to the list You have not created a list yet. Tap on the \"+\" button to add a new one. - You don\'t follow any remote instances. Tap on the \"+\" button to add a new one. Who to follow Trunk API Account(s) can\'t be followed Fetching remote account Automatically expand hidden media - Display follow instances button New follow New Boost New Favourite @@ -596,7 +518,6 @@ Fetching remote status Comment Peertube instance - Display private messages timeline Be the first to leave a comment on this video with the top right button! නැරඹුම් %s යි ධාවන කාලය: %s @@ -608,10 +529,6 @@ The video has been removed from bookmarks! There is no Peertube videos in your favourites! නාලිකාව - Peertube නාලිකා නැත - No Peertube instances - No Mastodon instances - ලැයිස්තු නැත වීඩියෝ Channels Use Emoji One @@ -619,12 +536,7 @@ Display previews in all toots New UX/UI designer Display video previews - Gitlab Support - Bug Report - There are no email clients installed. - Send a bug report The account id has been copied in the clipboard! - Optimization of the battery භාෂාව වෙනස් කරන්න ප්රකෘති භාෂාව Truncate long toots @@ -636,7 +548,6 @@ The tag has been stored! The tag has been changed! The tag has been deleted! - කලා කාල රේඛාව පෙන්වන්න Schedule boost The boost is scheduled! No scheduled boost to display! @@ -675,11 +586,7 @@ You can start writing first letters and names will be suggested.\n\n ⚠ The Login button will only work if the instance name is valid and the instance is up! - මෙම ක්ෂේත්‍රයේ, ඔබගේ මැස්ටොඩෝන් ගිණුමට සම්බන්ධ කර ඇති විද්‍යුත් තැපැල් ලිපිනය ලියන්න. - අවසාන පියවර ලෙස ඔබේ මුරපදය ඇතුළත් කර \'පුරන්න\' මත ඔබන්න. - තවත් තොරතුරු - ඔබ 2FA (ද්වි-සාධක සහතික කිරීම) භාවිත කරන්නෙ නම්, ඔබ මෙම සබැඳිය භාවිත කිරීමට අවශ්‍ය යි.\nමෙහි ඔබේ තොරතුරු ඇතුළත් කිරීමට උවමනා නැතිනම් ද ඔබට එය භාවිත කළ හැකි යි. භාෂා මාධ්‍ය පමණයි @@ -691,16 +598,13 @@ Bot Pixelfed instance Mastodon instance - No Pixelfed instances Any of these All of these None of these Any of these words (space-separated) All these words (space-separated) - None of these words (space-separated) Add some words to filter (space-separated) Change column name - No Misskey instances Misskey instance No app supporting this link is installed on your device. Subscriptions @@ -717,7 +621,6 @@ Select the file to upload My videos Title - Categories License Category Language @@ -732,14 +635,10 @@ Tap here to edit the video data. Delete video Are you sure to delete this video? - No videos uploaded yet! Display NSFW videos - Default %s channel No videos to display! - Add media to favorites Leave a comment Share - My pictures Choose a schedule mode From device From server @@ -747,12 +646,8 @@ Toots (Device) Modify Display new toots above the \"Fetch more\" button - Confirmations කාල රේඛා - Notification service Interface - Hidden content - Composing Contacts %1$s commented your video %2$s]]> %1$s is following your channel %2$s]]> @@ -767,7 +662,6 @@ දත්ත ආනයනය Select the file to import An error occurred when selecting the backup file! - Please, don\'t kill the app while processing. That can\'t be quite long. Add a public comment Send comment There is no Internet connection. Your message has been stored in drafts. @@ -808,18 +702,14 @@ end at %s Refresh poll Vote - A poll cannot be attached to a direct message! A poll you have voted in has ended A poll you tooted has ended Customize Categories - News Time slot Advanced Display \'new\' badge on unread toots - Display Peertube timeline Peertube - Hide the tab Move timeline Hide timeline Reorder timelines @@ -829,10 +719,8 @@ Undo You need to keep two visible tabs! Reorder timelines - Use the lists entry for deleting this list! Main timelines can only be hidden! BBCode - Add a timeline Always mark media as sensitive GNU instance Cached status @@ -847,14 +735,11 @@ History Playlists Display name - Privacy - Create You don\'t have any playlists. Tap on the \"+\" icon to add a new playlist You must provide a display name! The channel is required when the playlist is public. Create a playlist There is nothing in this playlist yet. - Edit media redo Gallery Emoji @@ -862,7 +747,6 @@ Eraser Text Filter - Adjust Brush Are you sure you want to exit without saving the image? Discard @@ -870,7 +754,6 @@ Image Saved Successfully! Failed to save Image Opacity - Crop Enable photo editor Add a poll item Remove last poll item @@ -882,10 +765,8 @@ Timed mute Mention the account Refresh cache - See who boosted and added to favorites Mention the status News - Display news from Fedilab\'s account General Regional Art @@ -929,7 +810,6 @@ Reconnect the account The application failed to access the admin features. You might need to reconnect the account for having the correct scope. Unresolved - Resolved Remote Active Pending @@ -945,7 +825,6 @@ Disable Silence Notify the user per e-mail - Perform action Custom warning User Moderator @@ -977,7 +856,6 @@ Empty content! Display Fedilab features button The application needs to access audio recording - An error occurred when recording the voice message! Voice message Enable quick reply The account you are replying might not see your message! @@ -985,9 +863,7 @@ If disabled, sensitive media will be hidden with a button Store media in full size with a long press on previews Add an ellipse button at the top right for listing all tags/instances/lists - Display an item in the main menu for a quick access to the timeline targeting #Fedilab tag Keep an open connection to the streaming API for live notifications. - When the app is in background, it will keep a connection to the streaming API. Disable it if you care about your battery. During the time slot, the app will send notifications. You can reverse (ie: silent) this time slot with the right spinner. Display a Fedilab button below profile picture. It is a shortcut for accessing in-app features. Allow to reply directly in timelines below statuses @@ -999,9 +875,6 @@ These tags will allow to filter statuses from profiles. You will have to use the context menu for seeing them. Automatically insert a line break after the mention to capitalize the first letter Allow content creators to share statuses to their RSS feeds - Timelines - Interface - Battery Compose Maximum retry times when uploading media Create a new Folder here @@ -1012,9 +885,7 @@ Default Directory Folder Create folder - Use your favourite browser inside the application. By disabling, links will be opened externally Display a toast message after an action has been completed (boost, fav, etc.)? - Export muted instances Muted instances have been exported! Add an instance Export instances @@ -1110,7 +981,6 @@ Enter your custom host or leave blank for using nitter.net Hide Fedilab notification bar For hiding the remaining notification in the status bar, tap on the eye icon button then uncheck: \"Display in status bar\" - Enable delayed notifications Notifications will be delayed every 30 seconds. That will allow to drain less battery. Live notifications delayed No live notifications @@ -1136,7 +1006,6 @@ Title for the video Join Peertube I am at least 16 years old and agree to the %1$s of this instance - Colors Links Change the color of links (URLs, mentions, tags, etc.) in messages Reblogs header @@ -1148,15 +1017,12 @@ Reset Icons Color of bottom icons in timelines - Background - Change the background color for timelines Pin this tag Logo of the instance Edit profile Make an action Translation Image preview - Change the theme Text color Change the text color in pots Apply changes diff --git a/app/src/main/res/values-sl/strings.xml b/app/src/main/res/values-sl/strings.xml index 096566de5..cecb31517 100644 --- a/app/src/main/res/values-sl/strings.xml +++ b/app/src/main/res/values-sl/strings.xml @@ -1,5 +1,4 @@ - - + Odpri meni Zapri meni @@ -16,8 +15,6 @@ Prekliči Prenesi Prenos %1$s - Prenos je zaključen - Shrani %1$s Vsebina je shranjena Datoteka: %1$s Geslo @@ -25,10 +22,8 @@ Računi Objave Toots Oznake - Žeton Shrani Obnovi - Želite dvostopenjsko prijavljanje (2FA)? Ni rezultatov. Instanca strežnika Instanca: mastodon.social @@ -39,10 +34,7 @@ Spremeni Izberite sliko … Počisti - Mikrofon Kamera - Prosimo, povejte kar želite - Oprostite. Glasovni vnos ni podprt na vaši napravi. Izbriši vse Prevedi to objavo. Nastavi čas objave @@ -59,7 +51,6 @@ Odgovori Uporabniško ime Osnutki - Novi podatki so na voljo. Jih želite prikazati? Priljubljeni Novi spremljevalci Omembe @@ -78,18 +69,12 @@ Sporočanje Utišani uporabniki Blokirani uporabniki - Oddaljeno spremljanje Obvestila Zahteve za spremljanje - Optimizacija Nastavitve - Profil - Kaj želite storiti? Brisanje računa Ali želite iz aplikacije izbrisati račun %1$s? Pošlji e-pošto - Prosimo izberite datoteko - Ne najdem aplikacije za upravljanje datotek. Pritisnite na pot, če jo želite spremeniti. Ni uspelo. Načrtovane objave @@ -99,10 +84,6 @@ Obvestila v živo Ni objav za prikaz - Objava Toot je dodana med priljubljene - Objava Toot je odstranjena iz priljubljenih. - Objava je ojačana. - Objava ni več ojačana. Ojačano za %1$s Naj dodam to objavo med priljubljene? Naj odstranim to objavo iz priljubljenih? @@ -134,12 +115,6 @@ Želite odstraniti to objavo? Želite izbrisati to objavo in začeti znova? - - %d odgovor - %d odgovora - %d odgovorov - %d odgovorov - Zaznamki Dodaj med zaznamke Odstrani zaznamek @@ -161,7 +136,6 @@ Odgovorite na Toot Write a queet Reply to a queet - Dosegli ste 500 znakov, ki so vam na voljo. Izberite vsebino Prišlo je do napake ob izbiranju vsebine. Želite izbrisati to vsebino? @@ -195,7 +169,6 @@ Prevajanje objav: Iskanje instanc: Oblikovalec ikone: - Oblikovalec plakata: Pogovor @@ -225,19 +198,12 @@ je ojačal tvoj status je všeč tvoja objava spremlja vas - Nova objava uporabnika %1$s in še eno obvestilo in še %d obvestili in še %d obvestil in še %d obvestil - - in še ena zanimiva objava - in še %d zanimivi objavi - in še %d zanimive objave - in še %d zanimivih objav - %d like %d likes @@ -275,7 +241,6 @@ Domena strežniške instance ni videti veljavna. Med preklopom med računi je prišlo do napake. Med iskanjem je prišlo do napake. - Prijava ni mogoča. Podatki o profilu so shranjeni. Nobena akcija ni na voljo Vsebina je shranjena. @@ -284,12 +249,8 @@ Osnutek je shranjen. Ali ste prepričani, da ta instanca omogoča to število znakov? Običajno je ta vrednost približno 500 znakov. Spremenjena je vidnost objav Toot na računu %1$s - Ime instance in ime za prikaz ne smeta biti prazni. - Optimizacija nalaganja Količina objav Toot na vsak prenos - Količina računov na vsak prenos - Količina obvestil ob vsakem nalaganju Vedno WiFi Vprašaj me @@ -298,13 +259,9 @@ Prikaži več … Prikaži manj … Občutljiva vsebina - V odgovorih prikazuj zgodovino sporočil - Prikaži lokalno časovnico - Prikaži združeno časovnico Onemogoči animirane avatarje GIF Pot: Samodejno shranjevanje osnutkov - Prikaz števcev Dodaj naslove URL za vsebine v objavah Toot Obveščaj me o novih spremljevalcih Obveščaj me, ko nekdo ojača moj status @@ -316,7 +273,6 @@ Obveščanj le v omrežju WiFi Obveščanje? Tiha obvestila - Nočni način Časovna omejitev prikaza NSFW (v sekundah, 0 za izklop) Urejanje profila Custom sharing @@ -340,12 +296,6 @@ Omogoči JavaScript Samodejno razširi cw Dovoli tuje piškotke - Postavitev za časovnice: - - Zavihki - Meni - Zavihki in meni - Yandex DeepL @@ -357,15 +307,6 @@ Svetla Črna - - Ne - 512 Kb - 1 Mb - 2 Mb - 4 Mb - 6 Mb - 8 Mb - Barva lučke LED: Modra @@ -376,13 +317,9 @@ Rumena Bela - Obveščaj me o novih objavah Toot na domači časovnici Spremljaj - Ne spremljaj več - Blokiraj Odblokiraj Utišaj - Brez dejanja Dovoli govor Zahteva je poslana Vas spremlja @@ -395,8 +332,6 @@ Prosimo, potrdite potisna obvestila, ki jih želite prejemati. Te nastavitve lahko kasneje omogočite ali onemogočite v nastavitvah (na zavihku Obvestila). - Za neprebrane objave Toot domače časovnice? - Za neprebrana obvestila? Počisti predpomnilnik V predpomnilniku je %1$s podatkov.\n\nAli jih želite izbrisati? @@ -406,7 +341,6 @@ Naslov Naslov… Opis - Opis… Ključne besede Ključne besede… @@ -423,7 +357,6 @@ Prikaži pripeto Ne najdem ujemanj. Arhiviraj objave za %1$s - Backup notifications for %1$s Uvoženih je %1$s novih objav Toot %1$s new notifications have been imported @@ -479,18 +412,14 @@ Ste prepričani, da želite dokončno izbrisati ta seznam? Na tem seznamu še ni ničesar. Na njem bodo vidni statusi članov, ko le-ti objavijo nove statuse. Dodaj na seznam - Odstrani s seznama Dodaj seznam Izbriši seznam Uredi seznam Naslov novega seznama - Išči med svojimi spremljevalci - Tvoji seznami The account was added to the list! You don\'t have any lists yet! %1$s je premaknjen na %2$s - Prikazuj števec ojačanj in priljulbjenih Prijava ne deluje? Sledi nekaj točk, ki so vam lahko v pomoč:\n\n - Preverite, da nimate napak v imenu instance.\n\n @@ -507,25 +436,19 @@ Izvoženih je %1$s objav Toot od skupno %2$s. Med izvažanjem podatkov za %1$s je nekaj šlo narobe Something went wrong when exporting data! - Data have been imported! Something went wrong when importing data! Posredniški strežnik - Tip proksija Omogočim proksi? Gostitelj Vrata Prijava Geslo - Predloga: - Strnjen način Ob deljenju dodaj podrobnosti objave Toot Podprite to aplikacijo na Liberapay Napaka v regularnem izrazu. - Še nimate računa? Na tej instanci ne najdem časovnic. Izbrišem to instanco? - Iz vašega seznama spremljanih instanc boste zbrisali %s. Prevedi v Spremljanje instance To instanco že spremljate. @@ -534,10 +457,8 @@ Informacije Skrij ojačanja pred %s Izpostavi v profilu - Skrij vse od %s Prikaži ojačanja uporabnika %s Ne izpostavljaj v profilu - Prikaži vse od %s Račun je izpostavljen v profilu Račun ni več izpostavljen v profilu Ojačanja so zdaj prikazana. @@ -558,7 +479,6 @@ Konteksti filtra En ali več kontekstov na katerih naj se izvaja ta filter Poteče čez - Dodaj nov filter Brisanje filtra? Posodobitev filtra Ustvarjanje filtra @@ -573,13 +493,11 @@ Računi so dodani na seznam Dodajanje računov na seznam Seznama še niste ustvarili. Pritisnite gumb \"+\", da ustvarite nov seznam. - Ne spremljate nobene oddaljene instance. Pritisnite gumb \"+\", da dodajte novo. Koga naj spremlajm Trunk API Tega računa ne morete spremljati Pridobivanje oddaljenega računa Samodejno razširi skirte vsebine - Prikaži gumb za spremljanje instance Novi spremljevalci Novo ojačanje Nov všeček @@ -604,7 +522,6 @@ Pridobivanje oddaljenih statusov Komentiraj Instanca Peertube - Prikaži časovnico zasebnih sporočil S pritiskom na gumb zgoraj desno lahko kot prvi objavite komentar za ta video. %s ogledov Trajanje: %s @@ -616,10 +533,6 @@ Video je odstranjen iz zaznamkov. V vaših priljubljenih nimate videov Peertube. Kanal - Ni kanalov Peertube - Ni instanc Peertube - Ni instanc Mastodon - Ni seznamov Videi Kanali Uporabi čustvenčke Emoji One @@ -627,12 +540,7 @@ Prikaži predoglede v vseh objavah Nov oblikovalec uporabniške izkušnje Prikaži predogled videov - Podpora na Gitlab-u - Poročilo o napaki - Ni nameščenih odjemalcev e-pošte. - Pošlji poročilo o napaki ID računa je kopiran na odložišče. - Optimizacija porabe energije Spremeni jezik Privzeti jezik Posekaj dolge objave @@ -644,7 +552,6 @@ Oznaka je shranjena. Oznaka je spremenjena. Oznaka je izbrisana. - Prikaži umetniško časovnico Doliči čas ojačanja Določili ste čas ojačanja. Nimate časovno načrtovanih ojačanj. @@ -683,12 +590,7 @@ Ob vpisu prvih nekaj črk vam bomo podali namige možnih imen gostiteljev.\n\n ⚠ Gumb Prijava deluje le, ko je instanca strežnika veljavna in delujoča! - V to polje vpišite naslov e-pošte, ki je vezana na vaš račun Mastodon. - - Zadnji korak je vpis gesla in potrditev s pritiskom na gumb Prijava. - Več informacij - Uporabite to povezavo, če uporabljate dvostopenjsko prijavljanje (2FA).\nLahko jo uporabite tudi, če tu ne želite vnašati svojih prijavnih podatkov. Jeziki Samo vsebine @@ -700,16 +602,13 @@ Robot Instanca Pixelfed Instanca Mastodon - Ni instanc Pixelfed Karkilo od naštetega Vse našteto Nič od naštetega Katerakoli od teh besed (ločene s presledkom) Vse te besede (ločene s presledkom) - Nobena od teh besed (ločene s presledkom) Add some words to filter (space-separated) Preimenuj stolpec - Ni instanc Misskey Instanca Misskey Na vaši napravi ni nameščene aplikcaije, ki podpira to povezavo. Subscriptions @@ -726,7 +625,6 @@ Izberite datoteko za nalaganje Moji videi Naslov - Kategorije Licenca Kategorija Jezik @@ -741,14 +639,10 @@ Kliknite tukaj, če želite urediti podatke videa. Delete video Are you sure to delete this video? - No videos uploaded yet! Display NSFW videos - Default %s channel No videos to display! - Add media to favorites Dodaj komentar Share - My pictures Choose a schedule mode From device From server @@ -756,12 +650,8 @@ Toots (Device) Spremeni Display new toots above the \"Fetch more\" button - Potrditve Časovnice - Storitev obveščanja Vmesnik - Skrita vsebina - Sestavljanje Stiki %1$s commented your video %2$s]]> %1$s is following your channel %2$s]]> @@ -776,7 +666,6 @@ Import Data Select the file to import An error occurred when selecting the backup file! - Please, don\'t kill the app while processing. That can\'t be quite long. Add a public comment Send comment There is no Internet connection. Your message has been stored in drafts. @@ -817,18 +706,14 @@ end at %s Refresh poll Glasuj - A poll cannot be attached to a direct message! A poll you have voted in has ended A poll you tooted has ended Prilagodi Kategorije - Novice Časovni okvir Napredno Display \'new\' badge on unread toots - Prikaži časovnico Peertube Peertube - Hide the tab Move timeline Hide timeline Reorder timelines @@ -838,10 +723,8 @@ Undo You need to keep two visible tabs! Reorder timelines - Use the lists entry for deleting this list! Main timelines can only be hidden! BBCode - Add a timeline Always mark media as sensitive GNU instance Cached status @@ -856,14 +739,11 @@ Zgodovina Seznami predvajanja Prikazno ime - Zasebnost - Ustvari You don\'t have any playlists. Tap on the \"+\" icon to add a new playlist You must provide a display name! The channel is required when the playlist is public. Create a playlist There is nothing in this playlist yet. - Urejanje medijev redo Galerija Smeški @@ -871,7 +751,6 @@ Radirka Besedilo Filter - Prilagodi Čopič Are you sure you want to exit without saving the image? Opusti @@ -879,7 +758,6 @@ Slika je uspešno shranjena. Failed to save Image Prosojnost - Obreži Enable photo editor Add a poll item Remove last poll item @@ -891,10 +769,8 @@ Timed mute Mention the account Refresh cache - See who boosted and added to favorites Mention the status Novice - Display news from Fedilab\'s account Splošno Regionalno Art @@ -938,7 +814,6 @@ Reconnect the account The application failed to access the admin features. You might need to reconnect the account for having the correct scope. Nerazrešeno - Rešeno Oddaljeno Aktivno V teku @@ -954,7 +829,6 @@ Onemogoči Utišaj Obvesti uporabnika po e-pošti - Perform action Custom warning Uporabnik Moderator @@ -986,7 +860,6 @@ Empty content! Display Fedilab features button The application needs to access audio recording - An error occurred when recording the voice message! Voice message Enable quick reply The account you are replying might not see your message! @@ -994,9 +867,7 @@ If disabled, sensitive media will be hidden with a button Store media in full size with a long press on previews Add an ellipse button at the top right for listing all tags/instances/lists - Display an item in the main menu for a quick access to the timeline targeting #Fedilab tag Keep an open connection to the streaming API for live notifications. - When the app is in background, it will keep a connection to the streaming API. Disable it if you care about your battery. During the time slot, the app will send notifications. You can reverse (ie: silent) this time slot with the right spinner. Display a Fedilab button below profile picture. It is a shortcut for accessing in-app features. Allow to reply directly in timelines below statuses @@ -1008,9 +879,6 @@ These tags will allow to filter statuses from profiles. You will have to use the context menu for seeing them. Automatically insert a line break after the mention to capitalize the first letter Allow content creators to share statuses to their RSS feeds - Timelines - Interface - Battery Compose Maximum retry times when uploading media Create a new Folder here @@ -1021,9 +889,7 @@ Default Directory Folder Create folder - Use your favourite browser inside the application. By disabling, links will be opened externally Display a toast message after an action has been completed (boost, fav, etc.)? - Export muted instances Muted instances have been exported! Add an instance Export instances @@ -1121,7 +987,6 @@ Enter your custom host or leave blank for using nitter.net Hide Fedilab notification bar For hiding the remaining notification in the status bar, tap on the eye icon button then uncheck: \"Display in status bar\" - Enable delayed notifications Notifications will be delayed every 30 seconds. That will allow to drain less battery. Live notifications delayed No live notifications @@ -1147,7 +1012,6 @@ Title for the video Join Peertube I am at least 16 years old and agree to the %1$s of this instance - Colors Links Change the color of links (URLs, mentions, tags, etc.) in messages Reblogs header @@ -1159,15 +1023,12 @@ Reset Icons Color of bottom icons in timelines - Background - Change the background color for timelines Pin this tag Logo of the instance Edit profile Make an action Translation Image preview - Change the theme Text color Change the text color in pots Apply changes diff --git a/app/src/main/res/values-sr/strings.xml b/app/src/main/res/values-sr/strings.xml index 75fb3c67b..011ece5f3 100644 --- a/app/src/main/res/values-sr/strings.xml +++ b/app/src/main/res/values-sr/strings.xml @@ -1,5 +1,4 @@ - - + Отвори мени Затвори мени @@ -16,8 +15,6 @@ Поништи Преузми Преузми %1$s - Преузимање завршено - Сачувај %1$s Мултимедија сачувана Фајл: %1$s Лозинка @@ -25,10 +22,8 @@ Налози Тутови Ознаке - Токен Сачувај Поврати - Двострука потврда идентитета? Нема резултата! Инстанца Инстанца: mastodon.social @@ -39,10 +34,7 @@ Измени Одаберите слику… Очисти - Микрофон Камера - Реците нешто - Ваш уређај не подржава гласовни унос! Избриши све Преведи тут. Закажи @@ -59,7 +51,6 @@ Одговори Корисничко име Нацрти - Нови подаци су доступни! Да ли желите да их видите? Омиљени Нови пратиоци Помињања @@ -78,18 +69,12 @@ Комуникација Ућуткани корисници Блокирани корисници - Удаљена праћења Обавештења Захтеви за праћење - Оптимизација Подешавања - Профил - Шта желите да урадите? Избриши налог Избриши налог %1$s из апликације? Пошаљи е-пошту - Изаберите фајл - Није пронађен ниједан менаџер фајлова! Кликните на путању да је промените Неуспешно! Заказани тутови @@ -99,10 +84,6 @@ Обавештења уживо Нема тутова за приказ - Тут је додат у омиљене - Тут је уклоњен из омиљених! - Тут је подржан! - Тут није више подржан! Подржао (ла) %1$s Додај овај тут у омиљене? Уклони овај тут из омиљених? @@ -134,11 +115,6 @@ Уклони овај тут? Избриши & и поново напиши овај тут? - - %d одговор - %d одговора - %d одговора - Забелешке Додај у забелешке Уклони забелешку @@ -160,7 +136,6 @@ Одговори на тут Write a queet Reply to a queet - Достигли сте дозвољених 500 карактера! Одаберите мултимедију Грешка приликом одабирања мултимедије! Уклони ову мултимедију? @@ -194,7 +169,6 @@ Превод тутова: Претражи инстанце: Дизајнер иконица: - Дизајнер банера: Разговор @@ -224,17 +198,11 @@ је подржао Ваш статус је ставио Ваш статус као омиљени Вас је запратио - Нови тут од корисника %1$s и још једно обавештење и још %d обавештења и још %d обавештења - - и још један нов интересантан тут - и још %d нова интересантна тута - и још %d нових интересантних тутова - %d like %d likes @@ -271,7 +239,6 @@ Не делује да је домен инстанце исправан! Дошло је до грешке приликом пребацивања између налога! Грешка приликом претраге! - Не могу да се пријавим! Подаци о профилу су сачувани! Није предузето ништа Мултимедија је сачувана! @@ -280,12 +247,8 @@ Нацрт сачуван! Да ли сте сигурни да ова инстанца дозвољава оволики број карактера? Обично је ова вредност око 500 карактера. Видљивост тутова је промењена за налог %1$s - Име инстанце и име за приказ не могу бити празни! - Оптимизација учитавања Број тутова по једном учитавању - Број налога по једном учитавању - Број обавештења по једном учитавању Увек Само на бежичној мрежи Питај @@ -294,13 +257,9 @@ Прикажи више… Прикажи мање… Осетљив садржај - Прикажи претходне поруке у одговорима - Прикажи локалну лајну - Прикажи федерисану лајну Онемогући GIF аватаре Путања: Аутоматски чувај нацрте - Прикажи бројаче Додај адресу мултимедије у тутове Обавести када Вас неко запрати Обавести када неко подржи Ваш статус @@ -312,7 +271,6 @@ Обавештавај само на бежичној мрежи Обавештења? Тиха обавештења - Ноћни режим NSFW временско ограничење приказа (у секундама, 0 значи искључено) Измени профил Custom sharing @@ -336,12 +294,6 @@ Омогућите JavaScript Аутоматски приказуј осетљиве садржаје Дозволите независне колачиће - Распоред лајни: - - Језичци - Мени - Језичци и мени - Yandex DeepL @@ -353,15 +305,6 @@ Светла Црна - - Не - 512 Ko - 1 Mo - 2 Mo - 4 Mb - 6 Mb - 8 Mb - Постави ЛЕД боју: Плава @@ -372,13 +315,9 @@ Жута Бела - Обавести за нове тутове на сопственој лајни Запрати - Престани да пратиш - Блокирај Одблокирај Ућуткај - Без акције Искључи ућуткивање Захтев послат Прати Вас @@ -391,8 +330,6 @@ Потврдите која брза обавештења желите да примате. Можете укључити и искључити ова обавештења накнадно у подешавањима (језичак за Обавештења). - За непрочитане тутове у сопственој лајни? - За непрочитана обавештења? Обриши кеш Тренутно има %1$s података у кешу.\n\nДа ли желите да их обришете? @@ -402,7 +339,6 @@ Title Title… Description - Description… Keywords Keywords… @@ -419,7 +355,6 @@ Прикажи закачене Нема пронађених резултата! Прављење резерве тутова за %1$s - Backup notifications for %1$s %1$s нови тут је увежен %1$s new notifications have been imported @@ -475,18 +410,14 @@ Да ли сте сигурни да желите да трајно избришете ову листу? Тренутно нема ништа у овој листи. Када чланови ове листе пошаљу нове статусе, они ће се појавити овде. Додај на листу - Уклони са листе Додај листу Обриши листу Измени листу Ново име листе - Претражи међу људима које пратите - Ваше листе The account was added to the list! You don\'t have any lists yet! %1$s се померио на %2$s - Прикажи број подржаних/омиљених Пријављивање не ради? Ево неких провера које могу да помогну:\n\n - Проверите да нема грешака у куцању имена инстанце\n\n @@ -503,25 +434,19 @@ Извежено %1$s од укупно %2$s тутова. Дошло је до грешке приликом извоза података за %1$s Дошло је до грешке приликом извоза података! - Подаци су увезени! Дошло је до грешке приликом увоза података! Прокси - Тип Омогући прокси? Домаћин Порт Пријава Лозинка - Тема: - Сажети режим Додај детаље тута приликом дељења Подржи апликацију на Liberapay-у Постоји грешка у регуларном изразу! - Још немате налог? На овој инстанци није нађена ниједан временска лајна! Избриши ову инстанцу? - Управо ћете избрисати инстанцу %s са листе праћених инстанци. Преведи на Прати инстанцу Већ пратите ову инстанцу! @@ -530,10 +455,8 @@ Информације Сакриј подрше од %s Истакнуто на профилу - Сакриј све од %s Прикажи подршке од %s Не истичи на профилу - Прикажи све од %s Овај налог је сада истакнут на профилу Овај налог није више истакнут на профилу Подршке су сада приказане! @@ -554,7 +477,6 @@ Контекст филтера Један или више контекста где треба да се примени филтер Истиче после - Додај нови филтер Обриши филтер? Ажурирај филтер Направи филтер @@ -569,13 +491,11 @@ Налози су додати на списак Додајем налоге на списак Још нисте направили ниједан списак. Кликните на \"+\" дугме да направите нови. - Тренутно не пратите ниједну удаљену инстанцу. Кликните на \"+\" дугме да додаје нову. Кога пратити Trunk API Налог(зи) не могу бити запраћени Дохватам удаљени налог Аутоматски прошири скривену мултимедију - Прикажи дугме за праћење инстанци Нови пратиоц Нова подршка Нови омиљени @@ -600,7 +520,6 @@ Дохватам удаљени статус Коментар Peertube инстанца - Прикажи временску лајну приватних порука Први оставите коментар на овај видео са овим дугметом горе десно! %s прегледа Трајање: %s @@ -612,10 +531,6 @@ Видео је уклоњен из забелешки! Нема Peertube видео записа у Вашим омиљеним ставкама! Канал - Нема Peertube канала - Нема Peertube инстанци - Нема Мастoдонт инстанци - Нема листи Видео снимци Канали Користите Емоји 1 @@ -623,12 +538,7 @@ Прикажи претпрегледе у свим тутовима Нови дизајнер за UX/UI Прикажи видео претпрегледе - Гитлаб подршка - Пријава грешке - Нема инсталираних клијената е-поште. - Пошаљи пријаву грешку Идентификација налога копирана у клипборд! - Оптимизација батерије Промени језик Подразумевани језик Скратите дугачке тутове @@ -640,7 +550,6 @@ Ознака ускладиштена! Ознака промењена! Ознака избрисана! - Прикажи уметничку лајну Закажи подршке Подршка је заказана! Нема заказаних подршки за приказ! @@ -679,12 +588,7 @@ You can start writing first letters and names will be suggested.\n\n ⚠ The Login button will only work if the instance name is valid and the instance is up! - In this field, write the email that is attached to your Mastodon account. - - Последњи корак је да унесете Вашу лозинку и да кликнете на пријаву. - Више информација - If you use 2FA (Two-factor authentication), you need to use this link.\nYou can also use it if you do not want to enter your credentials here. Језици Само мултимедија @@ -696,16 +600,13 @@ Бот Pixelfed инстанца Мастодонт инстанца - Нема Pixelfed инстанци Било шта од овога Све од овога Ништа од овога Било која од ових речи (одвојених белинама) Све ове речи (одвојене белинама) - Ниједна од ових речи (одвојених белинама) Add some words to filter (space-separated) Измени име колоне - Нема Misskey инстанци Misskey инстанца No app supporting this link is installed on your device. Претплате @@ -722,7 +623,6 @@ Изабери фајл за отпремање Моји видео снимци Наслов - Категорије Лиценца Категорија Језик @@ -737,14 +637,10 @@ Кликните овде да измените видео податке. Обриши видео Да ли сте сигурни да желите да обришете овај видео снимак? - Још нема отпремљених видео снимака! Приказуј NSFW видео снимке - Подразумевани %s канал Нема видео снимака за приказ! - Додај медију у омиљене Остави коментар Подели - Моје слике Одабери режим заказивања Са уређаја Са сервера @@ -752,12 +648,8 @@ Toots (Device) Modify Display new toots above the \"Fetch more\" button - Confirmations Timelines - Notification service Interface - Hidden content - Composing Contacts %1$s commented your video %2$s]]> %1$s is following your channel %2$s]]> @@ -772,7 +664,6 @@ Import Data Select the file to import An error occurred when selecting the backup file! - Please, don\'t kill the app while processing. That can\'t be quite long. Add a public comment Send comment There is no Internet connection. Your message has been stored in drafts. @@ -813,18 +704,14 @@ end at %s Refresh poll Vote - A poll cannot be attached to a direct message! A poll you have voted in has ended A poll you tooted has ended Customize Categories - News Time slot Advanced Display \'new\' badge on unread toots - Display Peertube timeline Peertube - Hide the tab Move timeline Hide timeline Reorder timelines @@ -834,10 +721,8 @@ Undo You need to keep two visible tabs! Reorder timelines - Use the lists entry for deleting this list! Main timelines can only be hidden! BBCode - Add a timeline Always mark media as sensitive GNU instance Cached status @@ -852,14 +737,11 @@ History Playlists Display name - Privacy - Create You don\'t have any playlists. Tap on the \"+\" icon to add a new playlist You must provide a display name! The channel is required when the playlist is public. Create a playlist There is nothing in this playlist yet. - Edit media redo Gallery Emoji @@ -867,7 +749,6 @@ Eraser Text Filter - Adjust Brush Are you sure you want to exit without saving the image? Discard @@ -875,7 +756,6 @@ Image Saved Successfully! Failed to save Image Opacity - Crop Enable photo editor Add a poll item Remove last poll item @@ -887,10 +767,8 @@ Timed mute Mention the account Refresh cache - See who boosted and added to favorites Mention the status News - Display news from Fedilab\'s account General Regional Art @@ -934,7 +812,6 @@ Reconnect the account The application failed to access the admin features. You might need to reconnect the account for having the correct scope. Unresolved - Resolved Remote Active Pending @@ -950,7 +827,6 @@ Disable Silence Notify the user per e-mail - Perform action Custom warning User Moderator @@ -982,7 +858,6 @@ Empty content! Display Fedilab features button The application needs to access audio recording - An error occurred when recording the voice message! Voice message Enable quick reply The account you are replying might not see your message! @@ -990,9 +865,7 @@ If disabled, sensitive media will be hidden with a button Store media in full size with a long press on previews Add an ellipse button at the top right for listing all tags/instances/lists - Display an item in the main menu for a quick access to the timeline targeting #Fedilab tag Keep an open connection to the streaming API for live notifications. - When the app is in background, it will keep a connection to the streaming API. Disable it if you care about your battery. During the time slot, the app will send notifications. You can reverse (ie: silent) this time slot with the right spinner. Display a Fedilab button below profile picture. It is a shortcut for accessing in-app features. Allow to reply directly in timelines below statuses @@ -1004,9 +877,6 @@ These tags will allow to filter statuses from profiles. You will have to use the context menu for seeing them. Automatically insert a line break after the mention to capitalize the first letter Allow content creators to share statuses to their RSS feeds - Timelines - Interface - Battery Compose Maximum retry times when uploading media Create a new Folder here @@ -1017,9 +887,7 @@ Default Directory Folder Create folder - Use your favourite browser inside the application. By disabling, links will be opened externally Display a toast message after an action has been completed (boost, fav, etc.)? - Export muted instances Muted instances have been exported! Add an instance Export instances @@ -1116,7 +984,6 @@ Enter your custom host or leave blank for using nitter.net Hide Fedilab notification bar For hiding the remaining notification in the status bar, tap on the eye icon button then uncheck: \"Display in status bar\" - Enable delayed notifications Notifications will be delayed every 30 seconds. That will allow to drain less battery. Live notifications delayed No live notifications @@ -1142,7 +1009,6 @@ Title for the video Join Peertube I am at least 16 years old and agree to the %1$s of this instance - Colors Links Change the color of links (URLs, mentions, tags, etc.) in messages Reblogs header @@ -1154,15 +1020,12 @@ Reset Icons Color of bottom icons in timelines - Background - Change the background color for timelines Pin this tag Logo of the instance Edit profile Make an action Translation Image preview - Change the theme Text color Change the text color in pots Apply changes diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index 9ec798067..9f0af322a 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -1,5 +1,4 @@ - - + Öppna menyn Stäng menyn @@ -16,8 +15,6 @@ Avbryt Ladda ned Laddat ner %1$s - Nedladdning klar - Spara %1$s Media sparad Fil: %1$s Lösenord @@ -25,10 +22,8 @@ Konton Toots Taggar - Token Spara Återställ - Tvåfaktorsautentisering? Inga resultat! Instans Instans: mastodon.social @@ -39,10 +34,7 @@ Ändra Välj en bild… Rensa - Mikrofon Kamera - Var god säg något - Tyvärr stöder inte din enhet röstinmatning! Ta bort allt Översätt denna toot. Schemalägg @@ -59,7 +51,6 @@ Svar Användarnamn Utkast - Det finns nya data! Vill du visa dem? Favoriter Nya följare Omnämningar @@ -78,18 +69,12 @@ Kommunikation Tystade användare Blockerade användare - Fjärrfölj Notifieringar Följförfrågningar - Optimering Inställningar - Profil - Vad vill du göra? Ta bort ett konto Radera kontot %1$s från programmet? Skicka e-post - Välj en fil - Ingen filhanterare hittad! Klicka på sökvägen för att ändra den Misslyckades! Schemalagda toots @@ -99,10 +84,6 @@ Livenotiser Ingen toot att visa - Tooten lades till i favoriter - Tooten togs bort från favoriter! - Tooten knuffades! - Tooten knuffas inte längre! Knuffad av %1$s Lägg till detta toot till dina favoriter? Ta bort detta toot från dina favoriter? @@ -134,10 +115,6 @@ Ta bort denna toot? Ta bort & skriv om denna toot? - - %d svar - %d svar - Bokmärken Lägger till bokmärke Ta bort bokmärke @@ -159,7 +136,6 @@ Svara på en toot Skriv en queet Svara på en queet - Du har nått de tillåtna 500 tecken! Välj en media Ett fel uppstod när du valde media! Ta bort denna media? @@ -193,7 +169,6 @@ Översättning av toots: Sök instanser: Ikondesigner: - Banner-design av: Konversation @@ -223,15 +198,10 @@ ökat din status favourited din status följt dig - Nya toot från %1$s och en till notifikation och %d till notifikationer - - lägg till en till toot att utforska - lägg till %d till toot att utforska - %d gillar %d gillar @@ -267,7 +237,6 @@ Domäninstansen verkar inte vara giltig! Ett fel uppstod vid växling mellan konton! Ett fel uppstod under sökningen! - Kan inte logga in! Profildata har sparats! Inga åtgärder kan vidtas Inlägget har sparats! @@ -276,12 +245,8 @@ Utkast sparat! Är du säker på att denna instans tillåter detta dessa antal tecken? Vanligtvis, är detta värde ungefär 500 tecken. Synligheten för toots har ändrats för konto %1$s - Instans och skärmnamn får inte vara tomt! - Optimering av laddning Antal toots per laddning - Antal konton per laddning - Antal notifieringar per laddning Alltid WIFI Fråga @@ -290,13 +255,9 @@ Visa mer… Visa mindre… Känsligt innehåll - Visa föregående meddelande i svaren - Visa lokala tidslinje - Visa federerade tidslinje Inaktivera GIF avatarer Sökväg: Spara utkast automatiskt - Visa räknare Lägga till URL för media i toots Meddela när någon följer dig Meddela när någon ökar din status @@ -308,7 +269,6 @@ Notifiera endast över WIFI Notifiera? Tysta aviseringar - Nattläge NSFW visningspaus (i sekunder, 0 betyder av) Ändra profil Anpassad delning @@ -332,12 +292,6 @@ Aktivera Javascript Utöka meddelanden automatiskt Tillåt tredjepartskakor - Layout för tidslinjer: - - Flikar - Meny - Flikar och meny - Yandex DeepL @@ -349,15 +303,6 @@ Ljust Svart - - Nej - 512 KB - 1 MB - 2 MB - 4 Mb - 6 Mb - 8 Mb - Färg på LED: Blå @@ -368,13 +313,9 @@ Gul Vit - Meddela om nya toots på hemtidslinjen Följ - Sluta följa - Blockera Avblockera Tysta - Ingen åtgärd Avtysta Begäran skickad Följer dig @@ -387,8 +328,6 @@ Bekräfta push-meddelanden som du vill ta emot. Du kan aktivera eller inaktivera dessa meddelanden senare i inställningar (fliken aviseringar). - För olästa toots i hemtidslinjen? - För olästa meddelanden? Rensa cache Det finns %1$s av data i cacheminnet.\n\nVill du rensa det? @@ -398,7 +337,6 @@ Titel Titel… Beskrivning - Beskrivning… Nyckelord Nyckelord… @@ -415,7 +353,6 @@ Visa fastnålade Inga matchande resultat hittades! Säkerhetskopiering toots för %1$s - Backupnotifikation för %1$s %1$s nya toots har importerats %1$s nya notifieringar har importerats @@ -471,18 +408,14 @@ Är du säker du vill ta bort listan permanent? Det finns inget i den här listan ännu. När medlemmar av denna lista skickar nya toots, visas de här. Lägg till i lista - Ta bort från listan Lägg till lista Ta bort lista Redigera lista Ny titel för lista - Sök bland användare som du följer - Din lista Kontot har lagts till i listan! Du har inga listor ännu! %1$s har flyttats till %2$s - Visa knuffar/favoriter antal Autentisering fungerar inte? Här är några kontroller som kan hjälpa:\n\n - Kontrollera att det inte finns stavfel i instans namn\n\n @@ -499,25 +432,19 @@ %1$s toots av %2$s har blivit exporterade. Något gick fel vid exporteringen %1$s Något gick fel vid exporteringen! - Data har blivit importerat! Något gick fel vid importeringen! Proxy - Typ Aktivera proxy? Värd Port Logga in Lösenord - Tema: - Kompakt läge Lägg till detaljer om toot vid delning Stöd appen på Liberapay Det finns ett fel i det reguljära uttrycket! - Inget konto ännu? Ingen tidslinje hittades på denna instans! Ta bort denna instans? - Du håller på att ta bort %s från dina instanser. Översätt till Följ instans Du följer redan denna instans! @@ -526,10 +453,8 @@ Information Dölj boosts för %s Visa på profil - Dölj allt för %s Visa boosts från %s Visa inte på profil - Visa allt från %s Konto kommer nu visas på profilen Konton visas inte längre på profilen Boosta visas nu! @@ -550,7 +475,6 @@ Filtrera sammanhang En eller flera sammanhang där filtret ska gälla Upphör efter - Lägg till Filter Ta bort filter? Uppdatera filter Skapa filter @@ -565,13 +489,11 @@ Konton har lagts till i listan Lägg till konton till listan Du har inte skapat någon lista än. Klicka på \"+\" för att skapa en. - Du följer inte någon fjärrinstanser. Klicka på knappen ”+” att lägga till en ny. Vem ska du följa Trunk API Konto(n) kan inte följas Hämtar fjärrkontot Utöka automatiskt dold media - Visa knappen följ instansen Nya följare Ny boost Ny favorit @@ -596,7 +518,6 @@ Hämtar extern status Kommentar Peertube instans - Visa tidslinje med privata meddelanden Bli den första att lämna en kommentar på denna video genom knappen längst upp till höger! %s visningar Varaktighet: %s @@ -608,10 +529,6 @@ Filmen har tagits bort från bokmärken! Det finns inga Peertube-filmer i dina favoriter! Kanal - Ingen Peertube-kanal - Ingen Peertube-instans - Ingen Mastodoninstans - Inga listor Videor Kanal Använd emoji One @@ -619,12 +536,7 @@ Visa förhandsvisning i alla toots Ny UX/UI designer Förhandsvisa filmer - Gitlab support - Felrapport - Det finns ingen e-postklient installerad. - Skicka felrapport Kontoid har kopierats! - Optimering av batteri Ändra språk Standardspråk Avkorta långa toots @@ -636,7 +548,6 @@ Taggen har sparats! Tagen har ändrats! Taggen har tagits bort! - Visa konsttidslinje Schemalägg boost Boosten har schemalagts! Inga schemalagda boosts att visa! @@ -675,12 +586,7 @@ Börja skriv de första bokstäverna, sen kommer förslag att visas.\n\n ⚠ Inloggningsknappen fungerar bara om instansnamnet är giltig och instansen körs! - I det här fältet ange den e-post som är kopplad till kontot på Mastodon. - - Sista steget är att ange ditt lösenord och klicka sen på Login. - Mer information - Om du använder 2FA (två-faktorn autentisering), så måste du använda denna länk.\nDu kan också använda den om du inte vill ange dina autentiseringsuppgifter här. Språk Endast media @@ -692,16 +598,13 @@ Bot Pixelfed instans Mastodon instans - Ingen Pixelfed instans Något av dessa Alla dessa Ingen av dem Någon av dessa ord (mellanrumsseparerade) Alla dessa ord (mellanrumsseparerade) - Inga av dessa ord (mellanrumsseparerade) Lägg till några ord att filtrera (separera med mellanslag) Ändra kolumnnamn - Inga Misskey-instanser Misskey-instans Ingen app finns installerad som kan hantera denna länk. Prenumerationer @@ -718,7 +621,6 @@ Välj en fil som ska laddas upp Mina videoklipp Titel - Kategorier Licens Kategori Språk @@ -733,14 +635,10 @@ Klicka här för att editera videodata. Ta bort film Är du säker på att ta bort denna film? - Inga filmer uppladdade än! Visa NSFW-filmer - Standard %s-kanal Inga filmer att visa! - Lägg till media till favoriter Lämna ett meddelande Dela - Mina bilder Välj ett schema-läge Från enhet Från server @@ -748,12 +646,8 @@ Toots (enhet) Ändra Visa nya toots ovanför knappen ”Hämta mer” - Bekräftelser Tidslinjer - Notifieringstjänst Gränssnitt - Dolt innehåll - Komponering Kontakter %1$s kommenterade din video %2$s]]> %1$s följer din kanal %2$s]]> @@ -768,7 +662,6 @@ Importera data Välj en fil att importera Ett fel uppstod när säkerhetskopia valdes! - Vänligen, döda inte appen medan den bearbetar. Lägg till en publik kommentar Skicka kommentar Det finns ingen Internetanslutning. Ditt meddelande har sparats i utkast. @@ -809,18 +702,14 @@ sluta på %s Uppdatera enkät Rösta - En undersökning kan inte bifogas i ett direktmeddelande! En enkät som du röstat i har avslutats En enkät som du röstat i har avslutats Anpassa Kategorier - Nyheter Tids lucka Avancerad Visa \"nytt\" märke på olästa tootar - Visa Peertube tidslinje Peertube - Dölj fliken Flytta tidslinje Dölj tidslinje Ändra ordning på tidslinjer @@ -830,10 +719,8 @@ Ångra Du måste behålla minst två synliga tabbar! Ändra ordning på tidslinjer - Använd posten listor för att ta bort denna lista! Huvudtidslinjen kan bara döljas! BBCode - Lägg till en tidslinje Markera alltid media som känsligt GNU-instans Cachadstatus @@ -848,14 +735,11 @@ Historik Spellistor Visningsnamn - Sekretess - Skapa Du har inte några spellistor. Klicka på \"+\"-ikonen för att lägga till en ny spellista Du måste ange ett visningsnamn! Kanalen krävs när spellistan är offentliga. Skapa spellista Det finns ingenting i denna spellista ännu. - Editera media gör om Galleri Emoji @@ -863,7 +747,6 @@ Suddigummi Text Filter - Justera Pensel Är du säker på att du vill avsluta utan att spara bilden? Kasta @@ -871,7 +754,6 @@ Bilden har sparats! Kunde inte spara bilden Genomskinlighet - Beskär Aktivera bildeditor Lägg till ett val Ta bort det sista valet @@ -883,10 +765,8 @@ Tidsinställd tystning Nämn kontot Uppdatera cache - Se vem som boostat och lagt till i favoriter Omnämn status Nyheter - Visa nyheter från Fedilabkontot Allmänt Regional Konst @@ -930,7 +810,6 @@ Återanslut kontot Programmet misslyckades med att ansluta administrationsfunktionen. Du måste kanske återansluta för att få rätt rättigheter. Olösta - Lösta Distans Aktiv Väntande @@ -946,7 +825,6 @@ Inaktivera Tyst Meddela användaren per e-post - Utför åtgärd Anpassad varning Användare Moderator @@ -978,7 +856,6 @@ Tomt innehåll! Visa Fedilab funktioner-knapp Programmet behöver tillgång till ljud-inspelning - Ett fel inträffade vid inspelning av röstmeddelande! Röstmeddelande Aktivera snabbsvar Det konto du svarar till kanske inte ser ditt meddelande! @@ -986,9 +863,7 @@ Om inaktiverad så kommer känsligt material att döljas med en knapp Spara media i full upplösning genom att långtrycka på förhandsgranskningen Lägg till en ellips-knapp längst upp till höger för att lista alla taggar/instanser/listor - Visa en post i huvudmenyn för en snabb tillgång till tidslinjen riktat mot #Fedilab taggar Hålla en öppen anslutning till streaming API för live-meddelanden. - När appen är i bakgrunden kommer den att hålla en anslutning till streaming-API. Inaktivera detta om du bryr dig om din batteriförbrukning. Under tiden perioden kommer programmet att skicka meddelanden. Du kan ändra (dvs: tysta) denna period med höger spinner. Visa en Fedilab-knapp nedan profilbilden. Det är en genväg för att få tillgång till in-app-funktioner. Tillåt att svara direkt i tidslinjen nedanför statusen @@ -1000,9 +875,6 @@ Dessa taggar gör det möjligt att filtrera status från profiler. Du måste använda innehållsmenyn för att se dom. Lägg automatiskt till en radbrytning efter omnämnande för att sätta stor bokstav på första ordet Tillåt innehållsskapare att dela statusar till deras RSS-flöden - Tidslinjer - Gränssnitt - Batteri Skapa Maximalt antal försök vi uppladdning av media Skapa en ny mapp här @@ -1013,9 +885,7 @@ Standardmapp Mapp Skapa mapp - Använd din favorit browser i applikationen. Genom att inaktivera så kommer länkar att öppnas externt Visa toast-meddelande när en åtgärd har slutförts (boost, fav, etc.)? - Exportera tystade instanser Tystade instanser har exporterats! Lägg till en instans Exportera instanser @@ -1111,7 +981,6 @@ Ange din egen host eller lämna tomt för att använda nitter.net Dölj Fedilab meddelandefält För att dölja kvarvarande notifieringar i statusbaren, klicka på ögonikons knappen och kryssa ur: \"Visa i statusbar\" - Tillåt senare lagda meddelanden Notifieringar kommer fördröjas var 30:e sekund. Detta kommer att dra mindre ström. Live notifieringar fördröjda Inge live-notifieringar @@ -1137,7 +1006,6 @@ Titel på videon Gå med i Peertube Jag är minst 16 år gammal och godkänner %1$s för denna instans - Färger Länkar Ändra färg på länkar (Url:er, omnämnande, taggar, etc.) i meddelanden Ompublicera-rubrik @@ -1149,15 +1017,12 @@ Återställ Ikoner Färg på bottenikoner i tidslinjer - Bakgrund - Ändra bakgrundsfärgen på tidslinjen Pinna denna tagg Logo of the instance Edit profile Make an action Translation Image preview - Change the theme Text color Change the text color in pots Tillämpa ändringar diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index e67be7842..83ab8e290 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -1,5 +1,4 @@ - - + Menüyü aç Menüyü kapat @@ -16,8 +15,6 @@ Iptal İndir İndirme: %1$s - İndirme tamamlandı - %1$s dosyasını kaydet Medya kaydedildi Dosya: %1$s Şifre @@ -25,10 +22,8 @@ Hesaplar Tootlar Etiketler - Jeton Kaydet Geri yükle - İki adımlı kimlik doğrulama? Sonuç bulunamadı! Örnek Örnek: mastodon.social @@ -39,10 +34,7 @@ Değiştir Resim seç… Temizle - Mikrofon Kamera - Lütfen birşey söyleyin - Üzgünüz! cihazınız ses girişini desteklemiyor! Tümünü sil Bu toot\'u çevir. Zamanlama @@ -59,7 +51,6 @@ Cevaplar Kullanıcı adı Taslaklar - Yeni veri var! Bunları görüntülemek istiyor musun? Favoriler Yeni Takipçiler Söz edilenler @@ -78,18 +69,12 @@ İletişim Susturulmuş Kullanıcılar Engellenen Kullanıcılar - Uzaktan takip Bildirimler Takip İsteği - Optimizasyon Ayarlar - Profil - Ne yapmak istiyorsun? Hesabı sil %1$s hesabı uygulamadan silinsin mi? Bana bir e-posta gönder - Lütfen bir dosya seçin - Hiçbir dosya keşfedici bulunamadı! Değiştirmek için yola tıklayın Başarısız! Planlanan projeler @@ -99,10 +84,6 @@ Anlık Bildirimler Görüntülenecek yazı yok - Toot favorilere eklendi - Toot favorilerden kaldırıldı! - Toot arttırıldı! - Toot artık arttırılmış değil! %1$s arttırdı Bu toot\'u favorilere ekleyin? Bu toot\'u favorilerden kaldırın? @@ -134,10 +115,6 @@ Bu toot\'u sil? Gönderi taslaklara kaydedilip & silinsin mi? - - %d cevap - %d yorum - Yer İmleri Yer imlerine ekle Yer imini kaldır @@ -159,7 +136,6 @@ Toot\'a yanıt ver Bir queet yaz Queet\'e yanıt ver - 500 karakter sınırına ulaştınız! Ortam dosyası seçin Medya dosyasını seçerken bir hata oluştu! Bu ortamı sil? @@ -193,7 +169,6 @@ Modül tercümesi: Arama örnekleri: İkon tararımcısı: - Afiş tasarımcısı: Konuşma @@ -223,15 +198,10 @@ durumunu arttırdı durumunu favorilere ekledi seni takip etti - %1$s\'dan yeni toot ve başka bildirim ve başka bildirim - - ve keşfetmek için başka bir toot - ve keşfetmek için başka bir toot - %d beğenme %d beğeni @@ -267,7 +237,6 @@ Örnek etki alanı geçerli gibi gözükmüyor! Hesaplar arasında geçiş yapılırken bir hata oluştu! Arama sırasında bir hata oluştu! - Giriş yapılamadı! Profil verileri kaydedildi! Yapılabilecek bir işlem yok Medya kaydedildi! @@ -276,12 +245,8 @@ Taslak kaydedildi! Sunucunun bu kadar karaktere izin verdiğinden emin misin? Genelde, 500 civarı karakter olabilir. Toot\'ların görünürlüğünü hesap %1$s için değiştirildi - Sunucu adı ve görünen isim boş olamaz! - Yükleme optimizasyonu Yükleme başına toot - Yükleme başına hesap - Yükleme bşaına bildirim Her zaman WIFI Sor @@ -290,13 +255,9 @@ Daha fazla göster… Daha az göster… Hassas içerik - Ekran yanıt-e doğru önceki iletide - Görüntü yerel zaman çizelgesi - Federasyon zaman çizelgesini göster Haraketli Avatarları Devre Dışı Bırak Yolu: Otomati̇k olarak kaydet - Sayaçları göster Toot\'taki medyanın URL\'sini ekle Biri kullanıcıyı takip ettiğinde bildir Birisi durumunuzu artırdığında bildir @@ -308,7 +269,6 @@ WIFI içinde yalnızca bildir Bildir? Sessiz bildirimler - Gece modu NSFW görünümü zaman aşımı (saniye, kapatmak için sıfır girin) Profil düzenle Özel paylaşım @@ -332,12 +292,6 @@ JavaScript\'i etkinleştir cw\'yi otomatik aç Üçünçü parti çerezlere izin ver - Zaman çizelgeleri için düzen: - - Sekmeler - Menü - Sekmeler ve menü - Yandex DeepL @@ -349,15 +303,6 @@ Açık Siyah - - Hayır - 512KB - 1MB - 2MB - 4 Mb - 6 Mb - 8 Mb - LED rengini ayarla: Mavi @@ -368,13 +313,9 @@ Sarı Beyaz - Ana zaman çizelgesi üzerinde yeni toot için bildir Takip Et - Takip etme - Engelle Engeli kaldır Sustur - Eylem yok Sesi aç İstek gönderildi Sizi takip ediyor @@ -386,8 +327,6 @@ Anlık Bildirimler Lütfen, almak istediğiniz bildirimleri onaylayın.          Bu bildirimleri daha sonra ayarlarda etkinleştirebilir veya devre dışı bırakabilirsiniz (Bildirimler sekmesi). - Evdeki zaman çizgisindeki okunmamış toots için mi? - Okunmamış bildirimler için? Önbelleği temizle Önbellekte bazı öğeler %1$s var.\n\n Onlar da silinsin mi? @@ -397,7 +336,6 @@ Başlık Başlık… Açıklama - Açıklama… Anahtar Sözcükler Anahtar Sözcükler… @@ -414,7 +352,6 @@ Başa tutturulmuşu göster Sonuç bulunamadı! %1$s için toot\'ları yedekle - %1$s için yedekleme bildirimleri %1$s yeni toot alındı %1$s yeni bildirim alındı @@ -465,18 +402,14 @@ Bu listeyi tamamen silmek istediğinden emin misin? Bu listede henüz hiçbir şey yok. Bu listenin üyelerinin yeni gönderileri burada gözükecek. Listeye ekle - Listeden çıkar Liste ekle Listeyi sil Listeyi düzenle Yeni liste başlığı - Takip ettiklerin arasında ara - Listelerin Hesap listeye eklendi! Henüz bir listeniz yok! %1$s, %2$s\'e taşındı - Hızlandırmaları göster/Favori sayısı Kimlik doğrulama çalışmıyor? Yardımı olabilecek bazı kontroller:\n\n - Sunucu adını kontrol et\n\n @@ -493,25 +426,19 @@ %2$s toot\'tan %1$s tanesi dışarı aktarıldı. %1$s toot\'ları dışarı aktarılırken sorun çıktı Veri dışa aktarılırken bir şeyler ters gitti! - Veriler içe aktarıldı! Veri içe aktarılırken bir şeyler ters gitti! Vekil - Tip Proxy aç? Sunucu Port Giriş Parola - Tema: - Kompakt mod Paylaşırken toot detayları ekle Uygulamayı Liberapay ile destekle Düzenli ifadede sorun var! - Henüz hiç hesap yok? Bu sunucuda hiç zaman tüneli bulunamadı! Bu sunucuyu sil? - %s\'i takip edilen sunuculardan çıkaracaksın. Şu dile çevir: Durumları takip et Bu durumu zaten takip ediyorsun! @@ -520,10 +447,8 @@ Bilgi Yinelemelerini gizle %s Profilde göster - Her şeyi gizle %s Yinelemelerini göster %s Profilde gösterme - Her şeyi göster %s Hesap şimdi profilde gösteriliyor Hesap artık profilde gösterilmiyor Yinelemeler şimdi gösterildi! @@ -544,7 +469,6 @@ Filtre içerikleri Filtrenin uygulanacağı bir veya daha fazla içerik Bitiş tarihi - Yeni Filtre Ekle Filtreyi sil? Filtreyi güncelle Filtre oluştur @@ -559,13 +483,11 @@ Hesaplar listeye eklendi Listeye hesaplar ekleniyor Henüz bir liste oluşturmadınız. Yeni bir tane eklemek için \"+\" butonuna basın. - Herhangi bir uzak örnek takip etmiyorsunuz. Yeni bir tane eklemek için \"+\" butonuna basın. Takip edebileceklerin Trunk API Hesap(lar) takip edilemez Uzak hesap alınıyor Gizli medyayı otomatik olarak genişlet - Örnekleri takip et butonunu göster Yeni takip Yeni Yineleme Yeni Favori @@ -590,7 +512,6 @@ Uzak durum alınıyor Yorum Peertube örneği - Özel mesajların zaman çizelgesini göster Sağ üstteki buton ile bu videoya ilk yorum yapan siz olun! %s izleme Süre: %s @@ -602,10 +523,6 @@ Video yer imlerinden kaldırıldı! Favorilerinizde hiç Peertube videosu yok! Kanal - Peertube kanalı yok - Peertube örneği yok - Mastodon örneği yok - Liste yok Videolar Kanallar Emoji One kullan @@ -613,12 +530,7 @@ Tüm tootlarda ön izlemeleri göster Yeni UX/UI tasarımcısı Video ön izlemelerini göster - GitLab Desteği - Hata Raporu - Kurulu e-posta istemcisi yok. - Hata raporu gönder Hesap kimliği panoya kopyalandı! - Pil optimizasyonu Dili değiştir Varsayılan dil Uzun tootları kırp @@ -630,7 +542,6 @@ Etiket kaydedildi! Etiket değiştirildi! Etiket silindi! - Sanatsal zaman çizelgesini göster Yineleme zamanla Yineleme zamanlandı! Gösterilecek zamanlanmış yineleme yok! @@ -669,11 +580,7 @@ You can start writing first letters and names will be suggested.\n\n ⚠ The Login button will only work if the instance name is valid and the instance is up! - Bu alana, Mastodon hesabına bağlantılı olan e-posta adresini yaz. - - Son adım şifreni girmek ve Giriş Yap\'a tıklamaktır. Daha fazla bilgi - 2FA kullanıyorsanız (İki adımlı kimlik doğrulaması), bu linki kullanmanız gerekmektedir.\nKimlik bilgilerinizi buraya girmek istemiyorsanız da kullanabilirsiniz. Diller Sadece medya @@ -685,16 +592,13 @@ Bot Pixelfed örneği Mastodon örneği - Pixelfed örneği yok Bunlardan biri Bunların tamamı Bunların hiçbiri Bu kelimelerden biri (boşlukla-ayrılmış) Bu kelimelerin tamamı (boşlukla-ayrılmış) - Bu kelimelerin hiçbiri (boşlukla-ayrılmış) Filtrelenecek birkaç kelime girin (boşlukla-ayrılmış) Sütun adını değiştir - Misskey örneği yok Misskey örneği Bu bağlantıyı destekleyen hiçbir uygulama cihazınızda yüklü değil. Abonelikler @@ -711,7 +615,6 @@ Karşıya yüklemek için bir dosya seçin Videolarım Başlık - Kategoriler Lisans Kategori Dil @@ -726,14 +629,10 @@ Video verisini düzenlemek için buraya tıklayın. Videoyu sil Bu videoyu silmek istediğinize emin misiniz? - Henüz video eklenmedi! NSFW videoları göster - Varsayılan %s kanalı Görüntülenecek video yok! - Medyayı sık kullanılanlara ekle Yorum bırak Paylaş - Resimlerim Bir zamanlama modu seçin Cihazdan Sunucudan @@ -741,12 +640,8 @@ Tootlar (Cihaz) Değiştir Yeni tootları \"Daha fazla yükle\" butonunun üzerinde göster - Onaylamalar Zaman çizelgeleri - Bildirim hizmeti Arayüz - Gizli içerik - Oluşturma Bağlantılar %1$s, %2$s videonuza yorum yaptı]]> %1$s, %2$s kanalınızı takip ediyor]]> @@ -761,7 +656,6 @@ Verileri içe aktar İçe aktarılacak dosyayı seçin Yedekleme dosyasını seçerken bir hata oluştu! - Lütfen, işleme devam ederken uygulamayı sonlandırmayın. Bu çok uzun sürmez. Herkese açık bir yorum ekle Yorum gönder İnternet bağlantısı yok. Mesajınız taslaklara kaydedildi. @@ -802,18 +696,14 @@ %s\'de bitir Anketi yenile Oy ver - Bir doğrudan mesaja anket eklenemez! Oy verdiğiniz bir anket sona erdi Tootladığınız bir anket sona erdi Özelleştir Kategoriler - Haberler Time slot Gelişmiş Okunmamış tootlarda \'yeni\' rozetini göster - Peertube zaman çizelgesini göster Peertube - Sekmeyi gizle Zaman çizelgesini taşı Zaman çizelgesini gizle Zaman çizelgelerini yeniden sırala @@ -823,10 +713,8 @@ Geri al İki görünür sekme tutmanız gerekmektedir! Zaman çizelgelerini yeniden sırala - Bu listeyi silmek için listedeki girişleri kullanın! Ana zaman çizelgeleri sadece gizlenebilir! BBCode - Zaman çizelgesi ekle Medyayı her zaman hassas olarak işaretle GNU örneği Önbelleğe alınmış durum @@ -841,14 +729,11 @@ History Playlists Display name - Privacy - Create You don\'t have any playlists. Tap on the \"+\" icon to add a new playlist You must provide a display name! The channel is required when the playlist is public. Create a playlist There is nothing in this playlist yet. - Edit media redo Gallery Emoji @@ -856,7 +741,6 @@ Eraser Text Filter - Adjust Brush Are you sure you want to exit without saving the image? Discard @@ -864,7 +748,6 @@ Image Saved Successfully! Failed to save Image Opacity - Crop Enable photo editor Add a poll item Remove last poll item @@ -876,10 +759,8 @@ Timed mute Mention the account Refresh cache - See who boosted and added to favorites Mention the status News - Display news from Fedilab\'s account General Regional Art @@ -923,7 +804,6 @@ Reconnect the account The application failed to access the admin features. You might need to reconnect the account for having the correct scope. Unresolved - Resolved Remote Active Pending @@ -939,7 +819,6 @@ Disable Silence Notify the user per e-mail - Perform action Custom warning User Moderator @@ -971,7 +850,6 @@ Empty content! Display Fedilab features button The application needs to access audio recording - An error occurred when recording the voice message! Voice message Enable quick reply The account you are replying might not see your message! @@ -979,9 +857,7 @@ If disabled, sensitive media will be hidden with a button Store media in full size with a long press on previews Add an ellipse button at the top right for listing all tags/instances/lists - Display an item in the main menu for a quick access to the timeline targeting #Fedilab tag Keep an open connection to the streaming API for live notifications. - When the app is in background, it will keep a connection to the streaming API. Disable it if you care about your battery. During the time slot, the app will send notifications. You can reverse (ie: silent) this time slot with the right spinner. Display a Fedilab button below profile picture. It is a shortcut for accessing in-app features. Allow to reply directly in timelines below statuses @@ -993,9 +869,6 @@ These tags will allow to filter statuses from profiles. You will have to use the context menu for seeing them. Automatically insert a line break after the mention to capitalize the first letter Allow content creators to share statuses to their RSS feeds - Timelines - Interface - Battery Compose Maximum retry times when uploading media Create a new Folder here @@ -1006,9 +879,7 @@ Default Directory Folder Create folder - Use your favourite browser inside the application. By disabling, links will be opened externally Display a toast message after an action has been completed (boost, fav, etc.)? - Export muted instances Muted instances have been exported! Add an instance Export instances @@ -1104,7 +975,6 @@ Enter your custom host or leave blank for using nitter.net Hide Fedilab notification bar For hiding the remaining notification in the status bar, tap on the eye icon button then uncheck: \"Display in status bar\" - Enable delayed notifications Notifications will be delayed every 30 seconds. That will allow to drain less battery. Live notifications delayed No live notifications @@ -1130,7 +1000,6 @@ Video başlığı Join Peertube I am at least 16 years old and agree to the %1$s of this instance - Renkler Linkler Mesajlardaki linklerin (URL\'ler, bahsedilmeler, etiketler, vb.) rengini değiştirin Başlığı tekrar bloglar @@ -1142,15 +1011,12 @@ Sıfırla Simgeler Zaman çizelgelerinin alt kısmındaki simgelerin rengi - Arka plan - Zaman çizelgelerinin arka plan rengini değiştir Pin this tag Logo of the instance Edit profile Make an action Translation Image preview - Change the theme Text color Change the text color in pots Apply changes diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index df81fd508..90e23c43e 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -1,5 +1,4 @@ - - + Відкрити меню Закрити меню @@ -16,8 +15,6 @@ Скасувати Завантажити Завантажити %1$s - Завантаження завершено - Зберегти %1$s Збережені медіа-файли Файл: %1$s Пароль @@ -25,10 +22,8 @@ Облікові записи Передмухнуте Мітки - Токен Зберегти Відновити - Двофакторна авторизація? Нічого не знайдено! Екземпляр Екземпляр: mastodon.social @@ -39,10 +34,7 @@ Змінити Виберіть зображення… Очистити - Мікрофон Камера - Будь ласка, скажіть щось - Вибачте! Пристрій не підтримує введення голосом! Видалити все Перекласти цей дмух. Запланувати @@ -59,7 +51,6 @@ Відповіді Ім\'я користувача Чернетки - Нові дані доступні! Хочете їх переглянути? Обране Нові підписники Згадки @@ -78,18 +69,12 @@ Зв\'язок Приглушені користувачі Заблоковані користувачі - Віддалена підписка Сповіщення Запити на підписку - Оптимізація Налаштування - Профіль - Що ви бажаєте зробити? Видалити обліковий запис Видалити обліковий запис %1$s з застосунку? Надіслати ел. лист - Будь ласка, оберіть файл - Не знайшли файловий провідник! Натисніть на шлях, щоб змінити його Не вдалося! Заплановані дмухи @@ -99,10 +84,6 @@ Живі сповіщення Немає повідомлень для відображення - Дмух додано до обраного - Дмух видалено з обраного! - Передмухнуто! - Більше не передмухнуто! Передмухнув(-ла) %1$s Додати цей дмух до обраного? Видалити цей дмух з обраного? @@ -134,12 +115,6 @@ Видалити цей дмух? Видалити & переробити цей гудок? - - %d відповідь - %d відповідей - %d відповідей - %d відповідей - Закладки Додати в закладки Видалити закладку @@ -161,7 +136,6 @@ Відповісти на дмух Write a queet Reply to a queet - Ви досягли ліміту в 500 символів! Оберіть медіа-файл Сталася помилка під час вибору медіа-файлу! Видалити цей медіа-файл? @@ -195,7 +169,6 @@ Переклад дмухів: Шукати екземпляри: Дизайнер піктограм: - Дизайнер банеру: Розмова @@ -225,19 +198,12 @@ передмухнув ваш статус додав до обраного ваш статус підписався(-лась) на вас - Новий дмух з %1$s додати нове сповіщення додати нове сповіщення додати нове сповіщення додати нове сповіщення - - додати інший дмух до огляду - додати інші дмухи до огляду - додати інші дмухи до огляду - додати інші дмухи до огляду - %d like %d likes @@ -275,7 +241,6 @@ Домен екземпляру не валідний! Сталася помилка під час перемикання облікових записів! Виникла помилка при пошуку! - Не можу увійти! Дані профілю збережено! Ніяка дія не може відбутися Медіа-файл збережено! @@ -284,12 +249,8 @@ Чернетку збережено! Ви впевнені, що цей екземпляр дозволяє таке число символів? Зазвичай, це 500 символів. Видимість дмухів змінена для облікового запису %1$s - Назва екземпляру та ім\'я не можуть бути пустими! - Оптимізація завантаження Число дмухів за одиницю завантаження - Число облікових записів за одиницю завантаження - Число сповіщень за одиницю завантаження Завжди Wi-Fi Запитати @@ -298,13 +259,9 @@ Показати більше… Згорнути… Чутливий вміст - Показати попередні повідомлення у відповідях - Показати локальну стрічку - Показати федеративну стрічку Вимкнути GIF аватари Шлях: Зберігати чернетки автоматично - Показати лічильники Додати URL медіа-файлу до дмуху Сповіщати, якщо хтось підписується Сповіщати, якщо хтось передмухнув ваш статус @@ -316,7 +273,6 @@ Повідомити тільки при Wi-Fi Сповістити? Тихі сповіщення - Нічний режим NSFW тимчасовий (секунди, 0 означає off) Редагувати обліковий запис Custom sharing @@ -340,12 +296,6 @@ Увімкнути JavaScript Автоматично розкривати Cw Приймати куки від сторонніх сайтів - Верстка для стрічок: - - Вкладки - Меню - Вкладки і меню - Яндекс DeepL @@ -357,15 +307,6 @@ Світла Чорна - - Ні - 512 Кб - 1 Мб - 2 Мб - 4 Mb - 6 Mb - 8 Mb - Встановити колір LED: Синій @@ -376,13 +317,9 @@ Жовтий Білий - Сповістити про нові дмухи на домашній стрічці Підписатися - Відписатися - Заблокувати Розблокувати Заглушити - Ніяких дій Скасувати \"ігнор\" Запит надіслано Підписався(-лась) на вас @@ -393,8 +330,6 @@ Push-сповіщення Будь ласка, потрібно підтвердити отримання push-сповіщень. Ви можете змінити налаштування пізніше (вкладка сповіщень). - Для непрочитаних дмухів у домашній стрічці? - Для непрочитаних сповіщень? Очистити кеш Є %1$s даних в кеші..\n\n Хотіли б видалити їх? @@ -404,7 +339,6 @@ Title Title… Description - Description… Keywords Keywords… @@ -421,7 +355,6 @@ Показати закріплені Відповідних повідомлень не знайдено! Резервне копіювання дмухів для %1$s - Backup notifications for %1$s %1$s нових дмухів імпортовано %1$s new notifications have been imported @@ -469,18 +402,14 @@ Ви дійсно бажаєте остаточно видалити цей список? Список пустий. Коли додані до списку почнуть писати, їх статуси з\'являться у списку. Додати до списку - Видалити зі списку Додати список Видалити список Редагувати список Нова назва списку - Шукати серед людей, за якими ви слідкуєте - Ваші списки The account was added to the list! You don\'t have any lists yet! %1$s відправлено до %2$s - Показати лічильники передмухнутого/обраного Автентифікація не працює? Деякі поради, що можуть допомогти:\n\n - Перевірте правильність написання назви екземпляру\n\n @@ -497,25 +426,19 @@ %1$s дмухів з %2$s були експортовані. Щось пройшло не так під час експорту даних з %1$s Something went wrong when exporting data! - Data have been imported! Something went wrong when importing data! Проксі - Тип Увімкнути проксі? Вузол Порт Логін Пароль - Тема: - Компактний режим Додати деталі гудку при поділитися Підтримати додаток на Liberapay Помилка у регулярному виразі! - Немає облікового запису? No timelines was found on this instance! Видалити цей екземпляр? - You are going to delete %s from your followed instances. Перекласти Follow instance You already follow this instance! @@ -524,10 +447,8 @@ Інформація Hide boosts from %s Feature on profile - Сховати все від %s Show boosts from %s Don\'t feature on profile - Показати все від %s The account is now featured on profile The account is no longer featured on profile Boosts are now shown! @@ -548,7 +469,6 @@ Фільтр контексту One or multiple contexts where the filter should apply Закінчується після - Додати новий фільтр Видалити фільтр? Оновлення фільтра Створити фільтр @@ -563,13 +483,11 @@ Accounts were added to the list Adding accounts to the list You have not created a list yet. Tap on the \"+\" button to add a new one. - You don\'t follow any remote instances. Tap on the \"+\" button to add a new one. На кого підписатися Trunk API Account(s) can\'t be followed Fetching remote account Automatically expand hidden media - Display follow instances button New follow New Boost New Favourite @@ -594,7 +512,6 @@ Завантаження віддаленого статусу Коментувати Peertube екземпляр - Показувати стрічку приватних повідомлень Будьте першими, хто залишив коментар до цього відео, використовуючи праву верхню кнопку! %s переглядів Тривалість: %s @@ -606,10 +523,6 @@ Це відео було видалено із закладок! У ваших улюблених немає відео Peertube! Канал - Немає Peertube каналів - Немає Peertube екземплярів - Немає Mastodon екземплярів - Немає списків Відео Канали Use Emoji One @@ -617,12 +530,7 @@ Display previews in all toots New UX/UI designer Display video previews - Gitlab Support - Bug Report - There are no email clients installed. - Send a bug report The account id has been copied in the clipboard! - Optimization of the battery Change the language Default language Truncate long toots @@ -634,7 +542,6 @@ The tag has been stored! The tag has been changed! The tag has been deleted! - Display Art timeline Schedule boost The boost is scheduled! No scheduled boost to display! @@ -673,12 +580,7 @@ You can start writing first letters and names will be suggested.\n\n ⚠ The Login button will only work if the instance name is valid and the instance is up! - In this field, write the email that is attached to your Mastodon account. - - Last step is to enter your password and click on Login. - More information - If you use 2FA (Two-factor authentication), you need to use this link.\nYou can also use it if you do not want to enter your credentials here. Мови Media only @@ -690,16 +592,13 @@ Bot Pixelfed instance Mastodon instance - No Pixelfed instances Any of these All of these None of these Any of these words (space-separated) All these words (space-separated) - None of these words (space-separated) Add some words to filter (space-separated) Change column name - No Misskey instances Misskey instance No app supporting this link is installed on your device. Subscriptions @@ -716,7 +615,6 @@ Select the file to upload My videos Title - Categories License Category Language @@ -731,14 +629,10 @@ Tap here to edit the video data. Delete video Are you sure to delete this video? - No videos uploaded yet! Display NSFW videos - Default %s channel No videos to display! - Add media to favorites Leave a comment Share - My pictures Choose a schedule mode From device From server @@ -746,12 +640,8 @@ Toots (Device) Modify Display new toots above the \"Fetch more\" button - Confirmations Timelines - Notification service Interface - Hidden content - Composing Contacts %1$s commented your video %2$s]]> %1$s is following your channel %2$s]]> @@ -766,7 +656,6 @@ Import Data Select the file to import An error occurred when selecting the backup file! - Please, don\'t kill the app while processing. That can\'t be quite long. Add a public comment Send comment There is no Internet connection. Your message has been stored in drafts. @@ -807,18 +696,14 @@ end at %s Refresh poll Vote - A poll cannot be attached to a direct message! A poll you have voted in has ended A poll you tooted has ended Customize Categories - News Time slot Advanced Display \'new\' badge on unread toots - Display Peertube timeline Peertube - Hide the tab Move timeline Hide timeline Reorder timelines @@ -828,10 +713,8 @@ Undo You need to keep two visible tabs! Reorder timelines - Use the lists entry for deleting this list! Main timelines can only be hidden! BBCode - Add a timeline Always mark media as sensitive GNU instance Cached status @@ -846,14 +729,11 @@ History Playlists Display name - Privacy - Create You don\'t have any playlists. Tap on the \"+\" icon to add a new playlist You must provide a display name! The channel is required when the playlist is public. Create a playlist There is nothing in this playlist yet. - Edit media redo Gallery Emoji @@ -861,7 +741,6 @@ Eraser Text Filter - Adjust Brush Are you sure you want to exit without saving the image? Discard @@ -869,7 +748,6 @@ Image Saved Successfully! Failed to save Image Opacity - Crop Enable photo editor Add a poll item Remove last poll item @@ -881,10 +759,8 @@ Timed mute Mention the account Refresh cache - See who boosted and added to favorites Mention the status News - Display news from Fedilab\'s account General Regional Art @@ -928,7 +804,6 @@ Reconnect the account The application failed to access the admin features. You might need to reconnect the account for having the correct scope. Unresolved - Resolved Remote Active Pending @@ -944,7 +819,6 @@ Disable Silence Notify the user per e-mail - Perform action Custom warning User Moderator @@ -976,7 +850,6 @@ Empty content! Display Fedilab features button The application needs to access audio recording - An error occurred when recording the voice message! Voice message Enable quick reply The account you are replying might not see your message! @@ -984,9 +857,7 @@ If disabled, sensitive media will be hidden with a button Store media in full size with a long press on previews Add an ellipse button at the top right for listing all tags/instances/lists - Display an item in the main menu for a quick access to the timeline targeting #Fedilab tag Keep an open connection to the streaming API for live notifications. - When the app is in background, it will keep a connection to the streaming API. Disable it if you care about your battery. During the time slot, the app will send notifications. You can reverse (ie: silent) this time slot with the right spinner. Display a Fedilab button below profile picture. It is a shortcut for accessing in-app features. Allow to reply directly in timelines below statuses @@ -998,9 +869,6 @@ These tags will allow to filter statuses from profiles. You will have to use the context menu for seeing them. Automatically insert a line break after the mention to capitalize the first letter Allow content creators to share statuses to their RSS feeds - Timelines - Interface - Battery Compose Maximum retry times when uploading media Create a new Folder here @@ -1011,9 +879,7 @@ Default Directory Folder Create folder - Use your favourite browser inside the application. By disabling, links will be opened externally Display a toast message after an action has been completed (boost, fav, etc.)? - Export muted instances Muted instances have been exported! Add an instance Export instances @@ -1111,7 +977,6 @@ Enter your custom host or leave blank for using nitter.net Hide Fedilab notification bar For hiding the remaining notification in the status bar, tap on the eye icon button then uncheck: \"Display in status bar\" - Enable delayed notifications Notifications will be delayed every 30 seconds. That will allow to drain less battery. Live notifications delayed No live notifications @@ -1137,7 +1002,6 @@ Title for the video Join Peertube I am at least 16 years old and agree to the %1$s of this instance - Colors Links Change the color of links (URLs, mentions, tags, etc.) in messages Reblogs header @@ -1149,15 +1013,12 @@ Reset Icons Color of bottom icons in timelines - Background - Change the background color for timelines Pin this tag Logo of the instance Edit profile Make an action Translation Image preview - Change the theme Text color Change the text color in pots Apply changes diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml index 671b7e864..210ed5436 100644 --- a/app/src/main/res/values-vi/strings.xml +++ b/app/src/main/res/values-vi/strings.xml @@ -1,5 +1,4 @@ - - + Mở trình đơn Đóng trình đơn @@ -16,8 +15,6 @@ Hủy Tải về Tải về %1$s - Hoan thanh tải - Lưu %1$s Đã lưu phương tiện Tập tin: %1$s Mật khẩu @@ -25,10 +22,8 @@ Tài khoản Thổi còi Thẻ - Mã thông báo Lưu Khôi phục - Xác thực hai bước? Ko có kết quả! Ví dụ Ví dụ: mastodon.social @@ -39,10 +34,7 @@ Thay đổi Chọn ảnh… Dọn dẹp - Micrô Camera - Xin vui lòng, nói điều gì đó - Lấy làm tiếc! Thiết bị của bạn không hỗ trợ nhập bằng giọng nói! Xóa hết Dịch này thổi còi. Lịch trình @@ -59,7 +51,6 @@ Trả lời Tên người dùng Bản nháp - Dữ liệu mới có sẵn! Bạn có muốn hiển thị chúng? Yêu thích Người theo dõi mới Đề cập đến @@ -78,18 +69,12 @@ Giao tiếp Người dùng bị tắt tiếng Người dùng bị chặn - Theo dõi từ xa Thông báo Theo yêu cầu - Tối ưu hóa Cài đặt - Hồ sơ - Bạn muốn làm gì? Xóa tài khoản Xóa tài khoản %1$s khỏi ứng dụng? Gửi email - Vui lòng chọn một tập tin - Không tìm thấy thám hiểm tệp! Nhấp vào đường dẫn để thay đổi nó Thất bại! Các thổi còi theo lịch @@ -99,10 +84,6 @@ Thông báo trực tiếp Không thổi còi để hiển thị - Các thổi còi đã được thêm vào mục yêu thích - Các thổi còi đã được gỡ bỏ khỏi mục yêu thích! - Thổi còi đã được đẩy mạnh! - Thổi còi không còn được tăng cường! Được thúc đẩy bởi %1$s Thêm cái còi này vào mục yêu thích của bạn? Loại bỏ thổi còi này khỏi mục yêu thích của bạn? @@ -134,9 +115,6 @@ Hủy bỏ thổi còi này? Delete & re-draft this toot? - - %d đáp lại - Bookmarks Add to bookmarks Remove bookmark @@ -158,7 +136,6 @@ Trả lời thổi còi Write a queet Reply to a queet - Bạn đã đạt đến 500 ký tự cho phép! Chọn phương tiện Đã xảy ra lỗi khi chọn phương tiện! Xóa phương tiện này? @@ -192,7 +169,6 @@ Dịch của thổi còi: Trường hợp tìm kiếm: Người thiết kế biểu tượng: - Banner designer: Cuộc hội thoại @@ -222,14 +198,9 @@ đẩy mạnh tình trạng của bạn ưu đãi tình trạng của bạn đã theo bạn - Thổi còi mới từ %1$s và một thông báo khác và %d thông báo khác - - - và một cái còi khác để khám phá -và %d toots khác để khám phá %d likes @@ -265,7 +236,6 @@ và %d toots khác để khám phá Miền dụ không có vẻ là valide! Đã xảy ra lỗi khi chuyển đổi giữa các tài khoản! Đã xảy ra lỗi khi tìm kiếm! - Không thể đăng nhập! Dữ liệu tiểu sử đã được lưu! Không thể thực hiện hành động Các phương tiện truyền thông đã được cứu! @@ -274,12 +244,8 @@ và %d toots khác để khám phá Bản nháp đã được lưu! Bạn có chắc là trường hợp này cho phép số nhân vật này? Thông thường, giá trị này gần 500 ký tự. Tầm nhìn của các toots đã được thay đổi cho tài khoản %1$s - Tên sơ thẩm và tên màn hình không được để trống! - Tối ưu hoá tải Số lượng các toots trên mỗi lần tải - Số tài khoản trên mỗi lần tải - Số thông báo trên mỗi lần tải Luôn luôn WIFI Hỏi @@ -288,13 +254,9 @@ và %d toots khác để khám phá Cho xem nhiều hơn… Show less… Nội dung nhạy cảm - Hiển thị thông báo trước trong câu trả lời - Hiển thị thời gian biểu địa phương - Hiển thị thời gian liên kết Tắt hình đại diện GIF Con đường: Tự động lưu dự thảo - Quầy hiển thị Thêm URL của phương tiện truyền thông vào các toots Thông báo khi ai đó theo bạn Thông báo khi ai đó tăng tình trạng của bạn @@ -306,7 +268,6 @@ và %d toots khác để khám phá Chỉ thông báo bằng WIFI Thông báo? Thông báo im lặng - Chế độ ban đêm Thời gian chờ của NSFW (giây, 0 có nghĩa là tắt) Chỉnh sửa tiểu sử Custom sharing @@ -330,12 +291,6 @@ và %d toots khác để khám phá Bật Javascript Automatically expand cw Cho phép cookie của bên thứ ba - Giao diện cho các mốc thời gian: - - Tab - Thực đơn - Tab và trình đơn - Yandex Không @@ -347,15 +302,6 @@ và %d toots khác để khám phá Light Black - - Không - 512 Kb - 1 Mb - 2 Mb - 4 Mb - 6 Mb - 8 Mb - Đặt màu LED: Màu xanh da trời @@ -366,13 +312,9 @@ và %d toots khác để khám phá Màu vàng Trắng - Thông báo cho những con rết mới trên dòng thời gian nhà Theo - Hủy theo dõi - Khối Mở khóa Tắt tiếng - Không có hành động Bật tiếng Đã gửi yêu cầu Sau bạn @@ -385,8 +327,6 @@ và %d toots khác để khám phá Vui lòng xác nhận thông báo đẩy mà bạn muốn nhận. Bạn có thể bật hoặc tắt các thông báo này sau trong cài đặt (tab Thông báo). - Đối với những con rồng chưa đọc trong dòng thời gian ở nhà? - Đối với thông báo chưa đọc? Xóa bộ nhớ chổ dấu Có %1$s dữ liệu trong bộ nhớ cache.\n\nBạn có muốn xóa chúng? @@ -396,7 +336,6 @@ và %d toots khác để khám phá Title Title… Description - Description… Keywords Keywords… @@ -413,7 +352,6 @@ và %d toots khác để khám phá Show pinned No matching result found! Backup toots for %1$s - Backup notifications for %1$s %1$s new toots have been imported %1$s new notifications have been imported @@ -465,18 +403,14 @@ và %d toots khác để khám phá Bạn có chắc chắn muốn xóa vĩnh viễn danh sách này? Không có gì trong danh sách này. Khi các thành viên của danh sách này đăng các trạng thái mới, chúng sẽ xuất hiện ở đây. Thêm vào danh sách - Xóa từ danh sách Thêm vào danh sách Xoá danh sách Chỉnh sửa danh sách Tiêu đề danh sách mới - Tìm kiếm trong những người bạn theo dõi - Danh sách của bạn The account was added to the list! You don\'t have any lists yet! %1$s đã chuyển sang %2$s - Hiển thị số lần tăng/số lần yêu thích Xác thực không hoạt động? Dưới đây là một số kiểm tra có thể giúp:\n\n - Kiểm tra không có lỗi chính tả trong tên dụ\n\n @@ -493,25 +427,19 @@ và %d toots khác để khám phá %1$s toots out of %2$s have been exported. Something went wrong when exporting data for %1$s Something went wrong when exporting data! - Data have been imported! Something went wrong when importing data! Proxy - Type Enable proxy? Host Port Login Mật khẩu - Theme: - Compact mode Add toot details when sharing Support the app on Liberapay There is an error in the regular expression! - Chưa có tài khoản? No timelines was found on this instance! Delete this instance? - You are going to delete %s from your followed instances. Translate in Follow instance You already follow this instance! @@ -520,10 +448,8 @@ và %d toots khác để khám phá Thông tin Hide boosts from %s Feature on profile - Hide everything from %s Show boosts from %s Don\'t feature on profile - Show everything from %s The account is now featured on profile The account is no longer featured on profile Boosts are now shown! @@ -544,7 +470,6 @@ và %d toots khác để khám phá Filter contexts One or multiple contexts where the filter should apply Expire after - Add New Filter Delete filter? Update filter Create filter @@ -559,13 +484,11 @@ và %d toots khác để khám phá Accounts were added to the list Adding accounts to the list You have not created a list yet. Tap on the \"+\" button to add a new one. - You don\'t follow any remote instances. Tap on the \"+\" button to add a new one. Who to follow Trunk API Account(s) can\'t be followed Fetching remote account Automatically expand hidden media - Display follow instances button New follow New Boost New Favourite @@ -590,7 +513,6 @@ và %d toots khác để khám phá Fetching remote status Comment Peertube instance - Display private messages timeline Be the first to leave a comment on this video with the top right button! %s views Thời gian: %s @@ -602,10 +524,6 @@ và %d toots khác để khám phá The video has been removed from bookmarks! There is no Peertube videos in your favourites! Kênh - No Peertube channels - No Peertube instances - No Mastodon instances - No lists Video Kênh Use Emoji One @@ -613,12 +531,7 @@ và %d toots khác để khám phá Display previews in all toots New UX/UI designer Display video previews - Gitlab Support - Bug Report - There are no email clients installed. - Send a bug report The account id has been copied in the clipboard! - Optimization of the battery Thay đổi ngôn ngữ Ngôn ngữ mặc định Truncate long toots @@ -630,7 +543,6 @@ và %d toots khác để khám phá The tag has been stored! The tag has been changed! The tag has been deleted! - Display Art timeline Schedule boost The boost is scheduled! No scheduled boost to display! @@ -669,12 +581,7 @@ và %d toots khác để khám phá You can start writing first letters and names will be suggested.\n\n ⚠ The Login button will only work if the instance name is valid and the instance is up! - In this field, write the email that is attached to your Mastodon account. - - Last step is to enter your password and click on Login. - More information - If you use 2FA (Two-factor authentication), you need to use this link.\nYou can also use it if you do not want to enter your credentials here. Ngôn ngữ Media only @@ -686,16 +593,13 @@ và %d toots khác để khám phá Bot Pixelfed instance Mastodon instance - No Pixelfed instances Any of these All of these None of these Any of these words (space-separated) All these words (space-separated) - None of these words (space-separated) Add some words to filter (space-separated) Change column name - No Misskey instances Misskey instance No app supporting this link is installed on your device. Subscriptions @@ -712,7 +616,6 @@ và %d toots khác để khám phá Select the file to upload My videos Title - Categories License Category Language @@ -727,14 +630,10 @@ và %d toots khác để khám phá Tap here to edit the video data. Delete video Are you sure to delete this video? - No videos uploaded yet! Display NSFW videos - Default %s channel No videos to display! - Add media to favorites Leave a comment Share - My pictures Choose a schedule mode From device From server @@ -742,12 +641,8 @@ và %d toots khác để khám phá Toots (Device) Modify Display new toots above the \"Fetch more\" button - Confirmations Timelines - Notification service Interface - Hidden content - Composing Contacts %1$s commented your video %2$s]]> %1$s is following your channel %2$s]]> @@ -762,7 +657,6 @@ và %d toots khác để khám phá Import Data Select the file to import An error occurred when selecting the backup file! - Please, don\'t kill the app while processing. That can\'t be quite long. Add a public comment Send comment There is no Internet connection. Your message has been stored in drafts. @@ -803,18 +697,14 @@ và %d toots khác để khám phá end at %s Refresh poll Vote - A poll cannot be attached to a direct message! A poll you have voted in has ended A poll you tooted has ended Customize Categories - News Time slot Advanced Display \'new\' badge on unread toots - Display Peertube timeline Peertube - Hide the tab Move timeline Hide timeline Reorder timelines @@ -824,10 +714,8 @@ và %d toots khác để khám phá Undo You need to keep two visible tabs! Reorder timelines - Use the lists entry for deleting this list! Main timelines can only be hidden! BBCode - Add a timeline Always mark media as sensitive GNU instance Cached status @@ -842,14 +730,11 @@ và %d toots khác để khám phá History Playlists Display name - Privacy - Create You don\'t have any playlists. Tap on the \"+\" icon to add a new playlist You must provide a display name! The channel is required when the playlist is public. Create a playlist There is nothing in this playlist yet. - Edit media redo Gallery Emoji @@ -857,7 +742,6 @@ và %d toots khác để khám phá Eraser Text Filter - Adjust Brush Are you sure you want to exit without saving the image? Discard @@ -865,7 +749,6 @@ và %d toots khác để khám phá Image Saved Successfully! Failed to save Image Opacity - Crop Enable photo editor Add a poll item Remove last poll item @@ -877,10 +760,8 @@ và %d toots khác để khám phá Timed mute Mention the account Refresh cache - See who boosted and added to favorites Mention the status News - Display news from Fedilab\'s account General Regional Art @@ -924,7 +805,6 @@ và %d toots khác để khám phá Reconnect the account The application failed to access the admin features. You might need to reconnect the account for having the correct scope. Unresolved - Resolved Remote Active Pending @@ -940,7 +820,6 @@ và %d toots khác để khám phá Disable Silence Notify the user per e-mail - Perform action Custom warning User Moderator @@ -972,7 +851,6 @@ và %d toots khác để khám phá Empty content! Display Fedilab features button The application needs to access audio recording - An error occurred when recording the voice message! Voice message Enable quick reply The account you are replying might not see your message! @@ -980,9 +858,7 @@ và %d toots khác để khám phá If disabled, sensitive media will be hidden with a button Store media in full size with a long press on previews Add an ellipse button at the top right for listing all tags/instances/lists - Display an item in the main menu for a quick access to the timeline targeting #Fedilab tag Keep an open connection to the streaming API for live notifications. - When the app is in background, it will keep a connection to the streaming API. Disable it if you care about your battery. During the time slot, the app will send notifications. You can reverse (ie: silent) this time slot with the right spinner. Display a Fedilab button below profile picture. It is a shortcut for accessing in-app features. Allow to reply directly in timelines below statuses @@ -994,9 +870,6 @@ và %d toots khác để khám phá These tags will allow to filter statuses from profiles. You will have to use the context menu for seeing them. Automatically insert a line break after the mention to capitalize the first letter Allow content creators to share statuses to their RSS feeds - Timelines - Interface - Battery Compose Maximum retry times when uploading media Create a new Folder here @@ -1007,9 +880,7 @@ và %d toots khác để khám phá Default Directory Folder Create folder - Use your favourite browser inside the application. By disabling, links will be opened externally Display a toast message after an action has been completed (boost, fav, etc.)? - Export muted instances Muted instances have been exported! Add an instance Export instances @@ -1104,7 +975,6 @@ và %d toots khác để khám phá Enter your custom host or leave blank for using nitter.net Hide Fedilab notification bar For hiding the remaining notification in the status bar, tap on the eye icon button then uncheck: \"Display in status bar\" - Enable delayed notifications Notifications will be delayed every 30 seconds. That will allow to drain less battery. Live notifications delayed No live notifications @@ -1130,7 +1000,6 @@ và %d toots khác để khám phá Title for the video Join Peertube I am at least 16 years old and agree to the %1$s of this instance - Colors Links Change the color of links (URLs, mentions, tags, etc.) in messages Reblogs header @@ -1142,15 +1011,12 @@ và %d toots khác để khám phá Reset Icons Color of bottom icons in timelines - Background - Change the background color for timelines Pin this tag Logo of the instance Edit profile Make an action Translation Image preview - Change the theme Text color Change the text color in pots Apply changes diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 4924b187c..689e0158e 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -1,5 +1,4 @@ - - + 打开菜单 关闭菜单 @@ -16,8 +15,6 @@ 取消 下载 下载 %1$s - 下载完成 - 保存 %1$s 媒体已保存 文件:%1$s 密码 @@ -25,10 +22,8 @@ 帐户 嘟文 标签 - 令牌 保存 恢复 - 两步验证? 没有结果! 实例 实例:mastodon.social @@ -39,10 +34,7 @@ 更改 选择图片… 清理 - 话筒 相机 - 请说点什么 - 抱歉!您的设备不支持语音输入。 全部删除 翻译这条嘟文。 定时 @@ -59,7 +51,6 @@ 回复 用户名 草稿 - 有新的数据可用!是否要显示它们? 收藏夹 新关注者 提及 @@ -78,18 +69,12 @@ 交流 已静音用户 已屏蔽用户 - 跨站关注 通知 关注请求 - 优化 设置 - 个人资料 - 您想要做什么? 删除帐户 是否从应用程序中删除帐户 %1$s? 发送电子邮件 - 请选择一个文件 - 找不到文件资源管理器! 点按路径以更改 失败! 定时嘟文 @@ -99,10 +84,6 @@ 实时通知 没有嘟文可以显示 - 已将嘟文加入收藏夹 - 已从收藏夹中移除该嘟文! - 此嘟文已被转嘟! - 此嘟文已不被转嘟! 由 %1$s 转嘟 添加此嘟文到您的收藏夹中? 从您的收藏夹中移除此嘟文? @@ -134,9 +115,6 @@ 移除这条嘟文吗? 删除并重新添加这条嘟文到草稿里? - - %d 条回复 - 书签 加入书签 移除书签 @@ -158,7 +136,6 @@ 回复嘟文 撰写啾文 回复啾文 - 您已达到允许的 500 字符上限! 选择媒体 选择媒体时出现了错误! 删除此媒体吗? @@ -192,7 +169,6 @@ 嘟文的翻译: 搜索实例: 图标设计者: - 横幅设计者: 对话 @@ -222,13 +198,9 @@ 转嘟了您的状态 收藏了您的状态 关注了您 - 来自 %1$s 的新嘟文 和另外 %d 条通知 - - 和另外 %d 条嘟文等待发现 - %d 赞 @@ -263,7 +235,6 @@ 该实例域名似乎是无效的! 在帐户间切换时发生错误! 搜索时出错! - 无法登入! 个人资料数据已保存! 无法进行任何操作 媒体已保存! @@ -272,12 +243,8 @@ 草稿已保存! 您确定此实例允许此数量的字符?通常,该值接近于 500 个字符。 已更改帐户 %1$s 的嘟文可见性 - 实例名称和屏幕名称不能为空! - 加载优化 每次加载的嘟文数量 - 每次加载的帐户数量 - 每次加载的通知数量 始终 WIFI 询问 @@ -286,13 +253,9 @@ 显示更多… 收起… 敏感内容 - 在回复中显示上一条消息 - 显示本地时间线 - 显示联合时间线 禁用 GIF 头像 路径: 自动保存草稿 - 显示计数器 在嘟文中添加媒体的 URL 当有人关注您时通知 当某人转嘟您的状态时通知 @@ -304,7 +267,6 @@ 仅当使用 WiFi 时通知 开启通知? 静音通知 - 夜间模式 NSFW 查看超时(秒,0 表示关闭) 编辑个人资料 自定义分享 @@ -328,12 +290,6 @@ 启用 Javascript 自动展开带有警告的内容 允许第三方 cookie - 时间线布局: - - 选项卡 - 菜单 - 选项卡和菜单 - Yandex DeepL @@ -345,15 +301,6 @@ 亮色 黑色 - - - 512 Kb - 1 Mb - 2 Mb - 4 Mb - 6 Mb - 8 Mb - 设置 LED 颜色: 蓝色 @@ -364,13 +311,9 @@ 黄色 白色 - 当首页时间线上有新的嘟文时通知您 关注 - 取消关注 - 屏蔽 取消屏蔽 静音 - 无操作 取消静音 请求已发送 关注您 @@ -383,8 +326,6 @@ 请确认要接收的推送通知。 您可以稍后在设置(通知选项卡)中启用或禁用这些通知。 - 针对主页时间线的未读嘟文? - 针对未读通知? 清除缓存 缓存中有 %1$s 的数据。\n\n您想要删除它们吗? @@ -394,7 +335,6 @@ 标题 标题… 描述 - 描述… 关键词 关键词… @@ -411,7 +351,6 @@ 显示置顶 未找到匹配的结果! 备份 %1$s 的嘟文 - 备份的通知 %1$s 已导入 %1$s 的新嘟文 %1$s 新的通知已导入 @@ -467,18 +406,14 @@ 您确实要永久删除此列表吗? 这张列表上还没有内容。当此列表的成员发布新状态时,它们将出现在此处。 添加到列表 - 从列表中移除 新建列表 删除列表 编辑列表 新列表标题 - 在您关注的人中搜索 - 您的列表 帐号已添加到列表! 您暂时没有任何列表! %1$s 已被移动到 %2$s - 显示转嘟/收藏数目 身份验证不起作用? 以下是一些可能有用的检查:\n\n - 检查实例名是否拼写错误\n\n @@ -495,25 +430,19 @@ %2$s 条嘟文中的 %1$s 条已被导出。 导出 %1$s 的数据时出现错误 导出数据时出现错误! - 数据已被导入! 导入数据时发生错误! 代理 - 类型 启用代理? 主机 端口 用户名 密码 - 主题: - 紧凑模式 分享时添加嘟文的详细信息 在 Liberapay 上支持这个应用 正则表达式中有错误! - 还没有帐户吗? 未在此实例中找到时间线! 删除此实例? - 您将从下列实例中删除 %s。 翻译为 关注实例 您已关注过该实例! @@ -522,10 +451,8 @@ 信息 隐藏 %s 的转嘟 推荐在个人页上 - 隐藏来自 %s 所有内容 显示 %s 的转嘟 取消推荐在个人页上 - 显示来自 %s 的所有内容 该帐号现在已推荐到个人页上 该帐号已不再推荐到个人页上 现已显示转嘟! @@ -546,7 +473,6 @@ 筛选内容 筛选器将应用到的一个或多个内容 过期于 - 新添筛选器 删除筛选器? 更新筛选器 创建筛选器 @@ -561,13 +487,11 @@ 帐号已添加到列表 正在添加帐号到列表 您还未创建列表。点击“+”按钮新建一个。 - 您没有关注任何远程实例。点击“+”按钮以添加新实例。 关注推荐 Trunk API 无法关注帐号 获取远程帐号 自动展开隐藏媒体 - 显示关注实例按钮 新的粉丝 新的转嘟 新的收藏 @@ -592,7 +516,6 @@ 正在获取远程状态 评论 Peertube 实例 - 显示私人消息时间线 使用右上角的按钮,成为第一个对此视频留言的人! %s 次观看 时长:%s @@ -604,10 +527,6 @@ 此视频已从书签中移除! 您的收藏夹里没有 Peertube 视频。 频道 - 没有 Peertube 频道 - 没有 Peertube 实例 - 没有 Mastodon 实例 - 没有列表 视频 频道 使用 Emoji One @@ -615,12 +534,7 @@ 显示所有嘟文中的预览 新 UX/UI 的设计师 显示视频预览 - Gitlab 支持 - 缺陷报告 - 未安装电子邮件客户端。 - 发送缺陷报告 帐号 ID 已复制到剪贴板! - 电池优化 更改语言 默认语言 截断长嘟文 @@ -632,7 +546,6 @@ 该标签已储存! 该标签已更改! 该标签已删除! - 显示艺术时间线 定时转嘟 转嘟将在预定时间发布! 没有预定的转嘟可以显示! @@ -671,12 +584,7 @@ 您开始填入首个字母后会提示主机名。\n\n ⚠ 登入按钮只有在实例名有效且该实例已上线时有效! - 在此字段中,填写连接到您 Mastondon 帐户的电子邮件。 - - 最后一步是输入您的密码,然后点击登入。 - 更多信息 - 如果您使用 2FA(双因素身份验证),则需要使用此链接。\n如果您不想在此处输入凭据,也可以使用它。 语言 仅限媒体 @@ -688,16 +596,13 @@ 机器人 Pixelfed 实例 长毛象实例 - 没有 Pixelfed 实例 任一 全部 除开 任一关键词(以空格隔开) 全部关键词(以空格隔开) - 除开关键词(以空格隔开) 新增一些文字到过滤器(以空格分开) 更改列名称 - 没有 Misskey 实例 Misskey 实例 您的设备上没有安装任何支持此链接的应用。 订阅 @@ -714,7 +619,6 @@ 选择要上传的文件 我的视频 标题 - 类别 许可协议 类别 语言 @@ -729,14 +633,10 @@ 点击此处编辑视频数据。 删除视频 你确定要删除此视频吗? - 还没有上传的视频! 显示 NSFW 视频 - 默认 %s 频道 没要视频可以显示! - 添加媒体到收藏 发表评论 分享 - 我的图片 选择计划模式 来自设备 来自服务器 @@ -744,12 +644,8 @@ 嘟文(设备) 修改 在“获取更多”按钮上方显示新嘟文 - 确认 时间线 - 通知服务 界面 - 隐藏内容 - 编写 联系人 %1$s 评论了你的视频 %2$s]]> %1$s 关注了您的频道 %2$s]]> @@ -764,7 +660,6 @@ 导入数据 选择要导入的文件 选择备份文件时发生错误! - 处理时不要杀死应用。时间不会太长。 添加公共评论 发送评论 无互联网连接。您的消息已保存在草稿里。 @@ -805,18 +700,14 @@ 在 %s 结束 刷新投票 投票 - 投票无法附加到私信上! 一个你参加过的投票已经结束 您所嘟出的一个投票已经结束 定制 类别 - 新闻 时隙 高级 在未读嘟文上显示“新”徽章 - 显示Peertube时间线 Peertube - 隐藏选项卡 移动时间线 隐藏时间线 记录时间线 @@ -826,10 +717,8 @@ 撤销 您需要保持两条可见的时间线! 记录时间线 - 用列表入口来删除这个列表! 主时间线只能被隐藏! BBCode - 增加一条时间线 总是标记媒体为敏感 GNU实例 高速缓冲的状态 @@ -844,14 +733,11 @@ 历史 播放列表 显示名称 - 隐私 - 创建 你没有任何播放列表。 点击\"+\"图标添加一个新的播放列表 你必须提供显示的名字! 当播放列表是公开的时,该频道是需要的。 创建播放列表 在这个播放列表中还没有任何内容。 - 编辑媒体 重做 相册 Emoji 表情 @@ -859,7 +745,6 @@ 橡皮擦 文本 过滤器 - 调整 画笔 您确定要退出而不保存图像吗? 舍弃 @@ -867,7 +752,6 @@ 图像保存成功! 保存图像失败 不透明度 - 剪裁 启用照片编辑器 添加一个投票项目 删除上一个投票项 @@ -879,10 +763,8 @@ 定时禁言 提及帐户 刷新缓存 - 看看是谁转嘟并添加到收藏夹 提及状态 新闻 - 显示新闻从Fedilab的帐户 常规​​​​​ 区域 艺术 @@ -926,7 +808,6 @@ 重新连接账户 应用程序无法访问管理员功能。您可能需要重新连接账户以拥有正确的范围。 未解决 - 已解决 远程 活动中 待处理 @@ -942,7 +823,6 @@ 禁用 静音 每个电子邮件都通知用户 - 执行操作 自定义警告 用户 主持人 @@ -974,7 +854,6 @@ 空内容! 显示 Fedilab 功能按钮 应用程序需要访问音频录制 - 在录音语音信息时发生错误! 语音消息 启用快速回复 您正在回复的帐户可能看不到您的信息! @@ -982,9 +861,7 @@ 如禁止,敏感媒体总被用一个按钮隐藏 在预览视图上长按可以全尺寸存储媒体 在右上角添加一个省略按钮来列出所有标签/实例/列表 - 在主菜单中显示一个项目,以便快速访问目标为#Fedilab 标签的时间线 保持直播API打开连接,以便实时通知。 - 当应用程序处于后台时,它将保持连接到流媒体API。如果您要节约电池,禁用它。 在时间段期间,应用程序将发送通知。您可以用正确的选择逆反 (如: 静音) 这个时间段。 在档案图片下显示 Fedilab 按钮。它是访问应用内功能的快捷方式。 允许在时间线状态下直接回复 @@ -996,9 +873,6 @@ 这些标签将允许从配置文件中筛选状态。您需要使用上下文菜单来查看这些状态。 在提及后自动插入一个行间来大写第一个字符 允许内容创建者共享 状态到他们的RSS 订阅 - 时间线 - 界面 - 电池 撰写 上传图片最大重试次数 在此创建新文件夹 @@ -1010,9 +884,7 @@ 默认目录 文件夹 创建文件夹 - 在应用程序中使用您最喜欢的浏览器。禁用则链接将在外部打开 操作完成后显示一个 toast 消息(转嘟、收藏等)? - 导出静音实例 已导出静音实例! 添加实例 导出实例 @@ -1106,7 +978,6 @@ 输入你自定义的主机或者留空以使用 nitter.net 隐藏 Fedilab 通知栏 要隐藏留在状态栏里的通知,请点击眼睛图标的按钮,然后取消勾选:“在状态栏内显示” - 启用延迟通知 通知将被延迟为每30秒产生。这将允许耗尽较少电池。 直播通知延迟 没有直播通知 @@ -1132,7 +1003,6 @@ 视频标题 加入Peertube 我至少年满16岁,并同意此实例的 %1$s - 颜色 链接 更改消息中链接的颜色 (URL、提及、标签等) 重发博客标题 @@ -1144,15 +1014,12 @@ 重置 图标 时间线底部图标颜色 - 背景 - 更改时间线的背景颜色 固定此标签 实例的标志 编辑个人资料 添加操作 翻译 图像预览 - 更改主题 文本颜色 更改点的文本颜色 应用更改 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 542256369..9208c982f 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -1,5 +1,4 @@ - - + 開啟選單 關閉選單 @@ -16,8 +15,6 @@ 取消 下載 下載 %1$s - 下載完成 - 儲存 %1$s 媒體已儲存 檔案:%1$s 密碼 @@ -25,10 +22,8 @@ 帳號 嘟文 標籤 - 標記 儲存 還原 - 兩步驟驗證? 沒有結果! 站台 站台:mastodon.social @@ -39,10 +34,7 @@ 變更 選取圖片… 清理 - 麥克風 相機 - 請說點什麼 - 抱歉!您的裝置不支援語音輸入! 全部刪除 翻譯此嘟文。 排程 @@ -59,7 +51,6 @@ 回覆 使用者名稱 草稿 - 有可用的新資料!是否顯示? 最愛 新的關注者 提及 @@ -78,18 +69,12 @@ 通訊 已靜音的使用者 被封鎖的使用者 - 遠端關注 通知 關注請求 - 最佳化 設定 - 個人資料 - 您想要做什麼? 刪除帳號 是否從應用程式刪除 %1$s 帳號? 傳送電子郵件 - 請選擇一個檔案 - 找不到檔案管理員! 點選路徑變更 失敗! 排程的嘟文 @@ -99,10 +84,6 @@ 即時通知 尚無嘟文 - 此嘟文已被加入到最愛中 - 嘟文已從最愛中移除! - 此嘟文已被其他使用者轉嘟! - 無法再轉嘟此嘟文! 被 %1$s 轉嘟 將此嘟文新增到您的最愛? 從您的最愛中移除此嘟文? @@ -134,9 +115,6 @@ 移除此嘟文? 刪除 & 並將此嘟文變回草稿? - - %d 條回覆 - 書籤 新增至書籤 移除書籤 @@ -158,7 +136,6 @@ 回覆一則嘟文 寫一篇 queet 回覆一則 queet - 您已經到達允許的 500 字元! 選取媒體 選擇媒體時發生錯誤! 刪除此媒體? @@ -192,7 +169,6 @@ 嘟文翻譯提供者: 搜尋站台: 圖示設計者: - 橫幅設計師: 對話 @@ -222,13 +198,9 @@ 已轉嘟您的嘟文 將您的嘟文加到最愛 關注了您 - 來自 %1$s 的新嘟文 和另外 %d 個通知 - - 和 %d 個其他的嘟文待發現 - %d 個喜歡 @@ -263,7 +235,6 @@ 站台網域似乎不是有效的網域! 在帳號間切換時發生錯誤! 搜尋時發生錯誤! - 無法登入! 個人資料已儲存! 無法採取行動 媒體已儲存! @@ -272,12 +243,8 @@ 草稿已儲存! 您確定此站台允許此數量的字元嗎?一般來說,此值約為 500 個字元左右。 %1$s 帳號的嘟文可見度已變更 - 站台名稱與畫面名稱不能為空! - 載入最佳化 每次載入的嘟文數量 - 每次載入的帳號數量 - 每次載入的通知數量 總是 Wi-Fi 詢問 @@ -286,13 +253,9 @@ 顯示更多…… 顯示較少…… 敏感內容 - 在回覆中顯示上一個訊息 - 顯示本地時間軸 - 顯示聯盟時間軸 停用 GIF 大頭貼 路徑: 自動儲存草稿 - 顯示計數器 在嘟文中新增媒體的 URL 當有人關注您時通知您 當有人轉嘟您的嘟文時通知 @@ -304,7 +267,6 @@ 僅在使用 Wi-Fi 時才啟用通知 通知? 靜音通知 - 夜間模式 NSFW 檢視逾時(秒,0 代表關閉) 編輯個人資料 自訂分享 @@ -328,12 +290,6 @@ 啟用 Javascript 自動展開 cw 允許第三方 cookies - 時間軸佈局: - - 分頁 - 選單 - 分頁與選單 - Yandex DeepL @@ -345,15 +301,6 @@ - - - 512 Kb - 1 Mb - 2 Mb - 4 Mb - 6 Mb - 8 Mb - 設定 LED 顏色: 藍色 @@ -364,13 +311,9 @@ 黃色 白色 - 在家時間軸上通知新嘟文 關注 - 取消關注 - 封鎖 解除封鎖 靜音 - 沒有動作 取消靜音 已送出請求 關注您 @@ -383,8 +326,6 @@ 請確認要接收的推播通知。 您稍後可以在設定(通知分頁)中啟用或停用這些通知。 - 針對家時間軸的未讀嘟文? - 針對未讀通知? 清除快取 快取中有 %1$s 的資料。\n\n 您要刪除它們嗎? @@ -394,7 +335,6 @@ 標題 標題… 描述 - 描述… 關鍵字 關鍵字… @@ -411,7 +351,6 @@ 顯示已釘選的 找不到符合的結果! %1$s 的嘟文備份 - 備份 %1$s 的通知 %1$s 的新嘟文已匯入 已匯入 %1$s 個新通知 @@ -467,18 +406,14 @@ Yandex 有適當的隱私權政策,可以在這裡找到:https://yandex.ru/l 您確定您想要永久刪除此列表嗎? 這份列表裡沒有東西。當此列表的成員張貼新的狀態時,它們將會出現在這裡。 新增到列表 - 從列表中移除 新增列表 刪除列表 編輯列表 新列表標題 - 搜尋您追蹤的人們 - 您的列表 已將帳號新增至清單中! 您還沒有任何清單! %1$s 已經移動到 %2$s - 顯示嘟文/最愛計數 身份驗證無法運作? 這裡有一些可能會有幫助的檢查:\n\n - 檢查站台名稱沒有拼字錯誤\n\n @@ -495,25 +430,19 @@ Yandex 有適當的隱私權政策,可以在這裡找到:https://yandex.ru/l %2$s 中的 %1$s 個嘟文已匯出。 在匯出 %1$s 資料時發生錯誤 匯出資料時出錯! - 資料已匯入! 匯入資料時出錯! 代理伺服器 - 類型 啟用代理伺服器? 主機 使用者名稱 密碼 - 主題: - 精簡模式 在分享時新增嘟文詳細資訊 在 Liberpay 上支援應用程式 在正規表達式中有錯誤! - 還沒有帳號? 在此站台上找不到時間軸! 刪除此站台? - 您將要從您追蹤的站台中刪除 %s。 翻譯成 追蹤站台 您已經追蹤此站台了! @@ -522,10 +451,8 @@ Yandex 有適當的隱私權政策,可以在這裡找到:https://yandex.ru/l 資訊 隱藏由 %s 轉嘟的嘟文 在個人資料頁面上推薦 - 隱藏 %s 的所有內容 顯示由 %s 轉嘟的嘟文 不要在個人資料頁面上推薦 - 顯示 %s 中的所有內容 帳號已在個人資料頁面上推薦 帳號不再於個人資料頁面上推薦 現在會顯示轉嘟的嘟文了! @@ -546,7 +473,6 @@ Yandex 有適當的隱私權政策,可以在這裡找到:https://yandex.ru/l 過濾內容 過濾器應該套用的一個或多個內容 多久後過期 - 新增過濾器 刪除過濾器? 更新過濾器 建立過濾器 @@ -561,13 +487,11 @@ Yandex 有適當的隱私權政策,可以在這裡找到:https://yandex.ru/l 帳號已新增至列表 正在新增帳號到列表 您尚未建立列表。點選 \"+\" 按鈕以新增一個新的。 - 您未關注任何遠端站台。點選 \"+\" 按鈕以新增一個新的。 要關注誰 Trunk API 無法關注帳號 正在擷取遠端帳號 自動展開隱藏的媒體 - 顯示關注站台按鈕 新關注 新轉嘟 新最愛 @@ -592,7 +516,6 @@ Yandex 有適當的隱私權政策,可以在這裡找到:https://yandex.ru/l 正在擷取遠端狀態 評論 PeerTube 站台 - 顯示私人訊息時間軸 使用右上角的按鈕來成為第一個對這部影片留下評論的人! %s 次檢視 長度:%s @@ -604,10 +527,6 @@ Yandex 有適當的隱私權政策,可以在這裡找到:https://yandex.ru/l 影片已從書籤中移除! 您的最愛中沒有 PeerTube 影片! 頻道 - 沒有 PeerTube 頻道 - 沒有 PeerTube 站台 - 沒有 Mastodon 站台 - 沒有列表 影片 頻道 使用 Emoji One @@ -615,12 +534,7 @@ Yandex 有適當的隱私權政策,可以在這裡找到:https://yandex.ru/l 在所有嘟文中顯示預覽 新的 UX/UI 設計師 顯示影片預覽 - Gitlab 支援 - 錯誤回報 - 沒有安裝任何電子郵件客戶端 - 傳送錯誤報告 帳號 id 已複製到剪貼簿! - 電池最佳化 變更語言 預設語言 截斷長嘟文 @@ -632,7 +546,6 @@ Yandex 有適當的隱私權政策,可以在這裡找到:https://yandex.ru/l 標籤已儲存! 標籤已變更! 標籤已刪除! - 顯示 MastoArt 時間軸 排程轉嘟 已排程轉嘟! 尚無排程轉嘟! @@ -671,12 +584,7 @@ Yandex 有適當的隱私權政策,可以在這裡找到:https://yandex.ru/l 您可以填寫首字母,然後就會有建議的名稱。\n\n ⚠ 登入按鈕將只在站台名稱有效且站台正常運作時才會運作! - 在此欄位,填寫要連結到您的 Mastodon 帳號的電子郵件。 - - 最後一步是輸入您的密碼並點選登入。 - 更多資訊 - 如果您使用雙因素驗證,您必須使用此連結。\n您也可以在不想在此輸入憑證時使用它。 語言 僅媒體 @@ -688,16 +596,13 @@ Yandex 有適當的隱私權政策,可以在這裡找到:https://yandex.ru/l 機器人 Pixelfed 站台 Mastodon 站台 - 沒有 Pixelfed 站台 這些裡面的任何一個 這些全部 這些都不要 這些字詞的其中一個(以空格分開) 這些字詞全部(以空格分開) - 這些字詞都不要(以空格分開) 新增要過濾的字詞(以空格分隔) 變更欄位名稱 - 沒有 Misskey 站台 Misskey 站台 您的裝置上沒有安裝任何支援此連結的應用程式。 訂閱 @@ -714,7 +619,6 @@ Yandex 有適當的隱私權政策,可以在這裡找到:https://yandex.ru/l 選取要上傳的檔案 我的影片 標題 - 分類 授權條款 分類 語言 @@ -729,14 +633,10 @@ Yandex 有適當的隱私權政策,可以在這裡找到:https://yandex.ru/l 點選這裡以編輯影片資料。 刪除影片 您確定要刪除此部影片嗎? - 未有已上傳的影片! 顯示 NSFW 影片 - 預設的 %s 頻道 沒有影片 - 新增媒體到收藏 留下評論 分享 - 我的圖片 選擇排程模式 從裝置 從伺服器 @@ -744,12 +644,8 @@ Yandex 有適當的隱私權政策,可以在這裡找到:https://yandex.ru/l 嘟文(裝置) 修改 在「擷取更多」按鈕之上顯示新嘟文 - 確認 時間軸 - 通知服務 界面 - 隱藏內容 - 正在合成 聯絡人 %1$s 已在您的影片留言 %2$s]]> %1$s 追蹤您的頻道 %2$s]]> @@ -764,7 +660,6 @@ Yandex 有適當的隱私權政策,可以在這裡找到:https://yandex.ru/l 匯入資料 選取要匯入的檔案 選擇備份檔時發生錯誤! - 請不要在處理時砍除應用程式。這不會太久。 新增公開留言 傳送留言 沒有網路連線。您的訊息已經儲存為草稿。 @@ -805,18 +700,14 @@ Yandex 有適當的隱私權政策,可以在這裡找到:https://yandex.ru/l 在 %s 結束投票 重新整理投票 投票 - 投票不能附加到直接訊息中! 您曾投過的投票已經結束 您所嘟過的投票已經結束 自訂 分類 - 新聞 時段 進階 在未讀的嘟文上顯示「新」的標章 - 顯示 PeerTube 時間軸 PeerTube - 隱藏分頁 移動時間軸 隱藏時間軸 重新排列時間軸 @@ -826,10 +717,8 @@ Yandex 有適當的隱私權政策,可以在這裡找到:https://yandex.ru/l 復原 您必須保留兩個可見的分頁! 重新排列時間軸 - 使用清單項目刪除此清單! 主時間軸只能被隱藏! BBCode - 加入動態時報 一律將媒體標記為敏感訊息 GNU 站台 已快取嘟文 @@ -844,14 +733,11 @@ Yandex 有適當的隱私權政策,可以在這裡找到:https://yandex.ru/l 歷史紀錄 播放清單 顯示名稱 - 隱私權 - 建立 您沒有任何播放清單。按一下「+」圖示以新增播放清單 您必須提供顯示名稱! 當播放清單公開時,頻道為必填。 建立播放清單 目前播放清單中還沒有東西。 - 編輯媒體 重作 媒體庫 表情符號 @@ -859,7 +745,6 @@ Yandex 有適當的隱私權政策,可以在這裡找到:https://yandex.ru/l 橡皮擦 文字 過濾 - 調整 筆刷 確定不儲存影像離開? 捨棄 @@ -867,7 +752,6 @@ Yandex 有適當的隱私權政策,可以在這裡找到:https://yandex.ru/l 影像成功儲存! 無法儲存影像 不透明度 - 裁剪 啟用圖片編輯器 新增投票項目 移除末尾投票項目 @@ -879,10 +763,8 @@ Yandex 有適當的隱私權政策,可以在這裡找到:https://yandex.ru/l 定時靜音 提及此帳號 重新快取 - 看看有誰轉嘟並新增到收藏 提及此嘟文 新聞 - 顯示來自 Fedilab 帳號的新聞 一般 地區性 藝術 @@ -926,7 +808,6 @@ Yandex 有適當的隱私權政策,可以在這裡找到:https://yandex.ru/l 重新連結帳號 應用程式無法存取管理功能。您可能需要重新連結帳號才能有正確的功能。 尚未解決 - 已經解決 遠端 活躍 等待中 @@ -942,7 +823,6 @@ Yandex 有適當的隱私權政策,可以在這裡找到:https://yandex.ru/l 停用 靜音 透過電子郵件通知使用者 - 執行動作 自訂警告 使用者 版主 @@ -974,7 +854,6 @@ Yandex 有適當的隱私權政策,可以在這裡找到:https://yandex.ru/l 內容為空! 顯示 Fedilab 功能按鈕 應用程式需要存取音訊錄製 - 錄製音訊訊息時發生錯誤! 音訊訊息 啟用快速回覆 您回覆的帳號可能看不到您的訊息! @@ -982,9 +861,7 @@ Yandex 有適當的隱私權政策,可以在這裡找到:https://yandex.ru/l 若停用,敏感媒體將會隱藏並顯示按鈕 在預覽中長按可以儲存完整大小的媒體 在右上角新增一個按鈕,列出所有標籤/站台/清單 - 在主選單中顯示項目以供快速存取目標為 #Fedilab 標籤的時間軸 保持與串流 API 的開放連線以供即時通知。 - 當應用程式在背景時,它將保持對串流 API 的連線。如果您關心電池的話,請將其停用。 在該時段,應用程式將會傳送通知。您可以使用右側的微調器來反轉(亦即讓其安靜)此時段。 在個人資料圖片下顯示 Fedilab 按鈕。這是存取應用程式內功能的快捷鍵。 允許在時間軸中直接回覆狀態 @@ -996,9 +873,6 @@ Yandex 有適當的隱私權政策,可以在這裡找到:https://yandex.ru/l 這些標籤將允許從個人資料過濾狀態。您必須使用情境選單來查看它們。 在提及後自動插入斷行符號以將首字母大寫 允許內容創作者將狀態分享至他們的 RSS feed - 時間軸 - 介面 - 電量 組成 上傳媒體時的最大重試次數 在此建立新資料夾 @@ -1009,9 +883,7 @@ Yandex 有適當的隱私權政策,可以在這裡找到:https://yandex.ru/l 預設目錄 資料夾 建立資料夾 - 在應用程式中使用您最愛的瀏覽器。停用此選項就可以讓連結在外部打開 在動作完成後顯示快顯訊息(轉嘟、最愛等等)? - 匯出已靜音的站台 靜音的站台已匯出! 新增站台 匯出站台 @@ -1105,7 +977,6 @@ Yandex 有適當的隱私權政策,可以在這裡找到:https://yandex.ru/l 輸入您的自訂主機或留空以使用 nitter.net 隱藏 Fedilab 通知列 要隱藏狀態列中的其餘通知,點擊眼睛圖示的按鈕上然後取消勾選「在狀態列中顯示」 - 啟用延遲通知 通知將會每30秒被延遲一次。這將會降低電池的消耗。 即時通知已延遲 沒有即時通知 @@ -1131,7 +1002,6 @@ Yandex 有適當的隱私權政策,可以在這裡找到:https://yandex.ru/l 影片標題 加入 Peertube 我至少 16 歲並同意此站臺的 %1$s - 顏色 連結 在訊息中變更連結的顏色(URL、提及、標籤等等) 轉發標頭 @@ -1143,15 +1013,12 @@ Yandex 有適當的隱私權政策,可以在這裡找到:https://yandex.ru/l 重設 圖示 時間軸底部圖示的顏色 - 背景 - 變更時間軸背景的顏色 釘選此標籤 站臺圖示 編輯個人資料 做動作 翻譯 圖片預覽 - 變更佈景主題 文字色彩 變更 pots 中的文字色彩 套用變更 diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 2ce7014af..ef430ac0b 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -1,22 +1,13 @@ - + - #0288D1 - #03A9F4 - #4FC3F7 - #263238 - #455A64 - #607D8B #d9d9d9 - #d9d9d9 - - #f3f3f3 #606984 #ca8f04 @@ -24,24 +15,15 @@ #00000000 - #F5F5F5 - #546E7A - #FFF - #C5CAE9 - #E0E0E0 - - #2c2c2c #282c37 #009688 #F44336 #B2DFDB #FFCDD2 - #B3E5FC #D7CCC8 #000 - #050505 #222 #585c67 @@ -50,33 +32,18 @@ #313543 #9baec8 #d9e1e8 - #ebf3fa #efefef #772b90d9 #2b90d9 - #1b80c9 - #8089A4 - #404964 #313543 - #353947 #393f4f - #494f5f - #393f4f #000000 - #151515 - #202020 - #252525 - #202020 #ffffff - #fcfcfc - #f9f9f9 - #f3f3f3 - #ccd7e0 #79bd9a #5579bd9a @@ -93,7 +60,6 @@ #393f4f #393f4f - #d9d9d9 #27a7fc @@ -101,7 +67,6 @@ #27a7fc - #606984 #2b90d9 #F44336 @@ -128,27 +93,13 @@ #8359A3 #FBE870 #C5E17A - #151414 - #000000 - #000000 - #f5f5f5 - - #f5f5f5 - #FFFFFF - #000000 - #000000 - #144365 #14161B #E0E0E0 - #2d313c - #1A1A1A - #E0E0E0 - #D32F2F #388E3C @@ -159,11 +110,8 @@ #388E3C #0288D1 #512DA8 - #FBC02D - #2e2e2e - #c8c8c8 #2e2e2e #c8c8c8 @@ -179,7 +127,6 @@ #FFA000 - #f3f3f3 #606984 diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index c653094b3..23eae0708 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -2,7 +2,6 @@ 16dp 16dp - 10dp 16dp 170dp 5dp @@ -13,9 +12,7 @@ 16dp 5dp 10dp - 2dp 50dp 12sp 35dp - 50dp diff --git a/app/src/main/res/values/drawables.xml b/app/src/main/res/values/drawables.xml index 52c6a6c85..7abc06d3b 100644 --- a/app/src/main/res/values/drawables.xml +++ b/app/src/main/res/values/drawables.xml @@ -1,8 +1 @@ - - @android:drawable/ic_menu_camera - @android:drawable/ic_menu_gallery - @android:drawable/ic_menu_slideshow - @android:drawable/ic_menu_manage - @android:drawable/ic_menu_share - @android:drawable/ic_menu_send - + diff --git a/app/src/main/res/values/ic_launcher_background.xml b/app/src/main/res/values/ic_launcher_background.xml index c5d5899fd..a6b3daec9 100644 --- a/app/src/main/res/values/ic_launcher_background.xml +++ b/app/src/main/res/values/ic_launcher_background.xml @@ -1,4 +1,2 @@ - - #FFFFFF - \ No newline at end of file + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index a68822e64..4946c5e3c 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -17,8 +17,6 @@ Cancel Download Download %1$s - Download complete - Save %1$s Media saved File: %1$s Password @@ -26,10 +24,8 @@ Accounts Toots Tags - Token Save Restore - Two-step authentication? No results! Instance Instance: mastodon.social @@ -40,10 +36,7 @@ Change Select a picture… Clean - Microphone Camera - Please, say something - Sorry! Your device does not support the voice input! Delete all Translate this toot. Schedule @@ -60,7 +53,6 @@ Replies User name Drafts - New data are available! Do you want to display them? Favourites New followers Mentions @@ -70,7 +62,6 @@ Open in browser Translate Please, wait few seconds before making this action. - Queets Home Local timeline @@ -80,18 +71,12 @@ Communication Muted users Blocked users - Remote follow Notifications Follow requests - Optimization Settings - Profile - What do you want to do? Delete an account Delete the account %1$s from the application? Send an email - Please select a file - No file explorer found! Tap on the path to change it Failed! Scheduled toots @@ -101,10 +86,6 @@ Live notifications No toot to display - The toot was added to favourites - The toot was removed from favourites! - The toot was boosted! - The toot is no longer boosted! Boosted by %1$s @@ -143,10 +124,6 @@ Delete & re-draft this toot? - - %d reply - %d replies - Bookmarks Add to bookmarks Remove bookmark @@ -170,7 +147,6 @@ Reply to a toot Write a queet Reply to a queet - You have reached the 500 characters allowed! Select a media An error occurred while selecting the media! Delete this media? @@ -201,7 +177,6 @@ Release %1$s Developer: - \@fedilab License: GNU GPL V3 Source code: @@ -211,7 +186,6 @@ Search instances: instances.social Icon designer: - Banner designer: Conversation @@ -244,15 +218,10 @@ boosted your status favourited your status followed you - New toot from %1$s and another notification and %d other notifications - - and another toot to discover - and %d other toots to discover - %d like %d likes @@ -288,7 +257,6 @@ The instance domain does not seem to be valid! An error occurred while switching between accounts! An error occurred while searching! - Can not log in! The profile data have been saved! No action can be taken The media has been saved! @@ -297,12 +265,8 @@ Draft saved! Are you sure this instance allows this number of characters? Usually, this value is close to 500 characters. Visibility of the toots has been changed for the account %1$s - Instance name and screen name cannot be blank! - Optimisation of loading Number of toots per load - Number of accounts per load - Number of notifications per load Always WIFI Ask @@ -311,13 +275,9 @@ Show more… Show less… Sensitive content - Display previous message in responses - Display local timeline - Display federated timeline Disable GIF avatars Path: Save drafts automatically - Display counters Add URL of media in toots Notify when someone follows you Notify when someone boosts your status @@ -329,7 +289,6 @@ Notify in WIFI only Notify? Silent Notifications - Night mode NSFW view timeout (seconds, 0 means off) Edit profile Custom sharing @@ -354,15 +313,8 @@ Enable Javascript Automatically expand cw Allow third-party cookies - Layout for timelines: - - Tabs - Menu - Tabs and menu - - Yandex DeepL @@ -377,16 +329,6 @@ Black - - No - 512 Kb - 1 Mb - 2 Mb - 4 Mb - 6 Mb - 8 Mb - - Set LED colour: @@ -399,13 +341,10 @@ White - Notify for new toots on the home timeline Follow - Unfollows - Block + s Unblock Mute - No action Unmute Request sent Follows you @@ -421,8 +360,6 @@ Please, confirm push notifications that you want to receive. You can enable or disable these notifications later in settings (Notifications tab). - For unread toots in home time-line? - For unread notifications? Clear cache There are %1$s of data in cache.\n\nWould you like to delete them? @@ -433,7 +370,6 @@ Title Title… Description - Description… Keywords Keywords… @@ -451,7 +387,6 @@ Show pinned No matching result found! Backup toots for %1$s - Backup notifications for %1$s %1$s new toots have been imported %1$s new notifications have been imported @@ -501,8 +436,6 @@ - PhotoView: To manage images\n - <a hreh="http://translate.yandex.com/">Powered by Yandex.Translate</a> - Translation of toots The application offers the ability to translate toots using the locale of the device and the Yandex API.\n @@ -526,20 +459,15 @@ Are you sure you want to permanently delete this list? There is nothing in this list yet. When members of this list post new statuses, they will appear here. Add to list - Remove from list Add list Delete list Edit list New list title - Search among people you follow - Your lists The account was added to the list! You don\'t have any lists yet! %1$s has moved to %2$s - Show boosts/favourites count - Authentication does not work? Here are some checks that might help:\n\n @@ -559,40 +487,31 @@ %1$s toots out of %2$s have been exported. Something went wrong when exporting data for %1$s Something went wrong when exporting data! - Data have been imported! Something went wrong when importing data! Proxy - Type Enable proxy? Host Port Login Password - Theme: - Compact mode Add toot details when sharing Support the app on Liberapay There is an error in the regular expression! - No account yet? No timelines was found on this instance! Delete this instance? - You are going to delete %s from your followed instances. Translate in Follow instance You already follow this instance! The instance is followed! - masto.host Masto.host is our Mastodon hosting partner.\n\nWith this partnership they provide me free hosting for Mastalab\'s instance and in exchange I promote them in here.\n\nTo be clear, there is no money involved or tracking of users. I needed an instance for testing, we talked and agreed on this.\n\nGo check them out if you want to run your own Mastodon instance. Partnerships Information Hide boosts from %s Feature on profile - Hide everything from %s Show boosts from %s Don\'t feature on profile - Show everything from %s The account is now featured on profile The account is no longer featured on profile Boosts are now shown! @@ -613,7 +532,6 @@ Filter contexts One or multiple contexts where the filter should apply Expire after - Add New Filter Delete filter? Update filter Create filter @@ -628,16 +546,14 @@ Accounts were added to the list Adding accounts to the list You have not created a list yet. Tap on the \"+\" button to add a new one. - You don\'t follow any remote instances. Tap on the \"+\" button to add a new one. Who to follow Trunk API Account(s) can\'t be followed Fetching remote account Automatically expand hidden media - Display follow instances button - + HTTP SOCKS @@ -666,7 +582,6 @@ Fetching remote status Comment Peertube instance - Display private messages timeline Be the first to leave a comment on this video with the top right button! %s views Duration: %s @@ -678,10 +593,6 @@ The video has been removed from bookmarks! There is no Peertube videos in your favourites! Channel - No Peertube channels - No Peertube instances - No Mastodon instances - No lists Videos Channels Use Emoji One @@ -689,12 +600,7 @@ Display previews in all toots New UX/UI designer Display video previews - Gitlab Support - Bug Report - There are no email clients installed. - Send a bug report The account id has been copied in the clipboard! - Optimization of the battery Change the language Default language Truncate long toots @@ -706,7 +612,6 @@ The tag has been stored! The tag has been changed! The tag has been deleted! - Display Art timeline Schedule boost The boost is scheduled! No scheduled boost to display! @@ -749,14 +654,7 @@ You can start writing first letters and names will be suggested.\n\n ⚠ The Login button will only work if the instance name is valid and the instance is up! - - In this field, write the email that is attached to your Mastodon account. - - - Last step is to enter your password and tap on Login. - More information - If you use 2FA (Two-factor authentication), you need to use this link.\nYou can also use it if you do not want to enter your credentials here. @@ -793,16 +691,13 @@ Bot Pixelfed instance Mastodon instance - No Pixelfed instances Any of these All of these None of these Any of these words (space-separated) All these words (space-separated) - None of these words (space-separated) Add some words to filter (space-separated) Change column name - No Misskey instances Misskey instance No app supporting this link is installed on your device. Subscriptions @@ -819,7 +714,6 @@ Select the file to upload My videos Title - Categories License Category Language @@ -834,14 +728,10 @@ Tap here to edit the video data. Delete video Are you sure to delete this video? - No videos uploaded yet! Display NSFW videos - Default %s channel No videos to display! - Add media to favorites Leave a comment Share - My pictures Choose a schedule mode From device From server @@ -849,12 +739,8 @@ Toots (Device) Modify Display new toots above the \"Fetch more\" button - Confirmations Timelines - Notification service Interface - Hidden content - Composing Contacts %1$s commented your video %2$s]]> %1$s is following your channel %2$s]]> @@ -870,7 +756,6 @@ Import Data Select the file to import An error occurred when selecting the backup file! - Please, don\'t kill the app while processing. That can\'t be quite long. Add a public comment Send comment There is no Internet connection. Your message has been stored in drafts. @@ -912,18 +797,14 @@ end at %s Refresh poll Vote - A poll cannot be attached to a direct message! A poll you have voted in has ended A poll you tooted has ended Customize Categories - News Time slot Advanced Display \'new\' badge on unread toots - Display Peertube timeline Peertube - Hide the tab Move timeline Hide timeline Reorder timelines @@ -933,10 +814,8 @@ Undo You need to keep two visible tabs! Reorder timelines - Use the lists entry for deleting this list! Main timelines can only be hidden! BBCode - Add a timeline Always mark media as sensitive GNU instance Cached status @@ -951,14 +830,11 @@ History Playlists Display name - Privacy - Create You don\'t have any playlists. Tap on the \"+\" icon to add a new playlist You must provide a display name! The channel is required when the playlist is public. Create a playlist There is nothing in this playlist yet. - Edit media redo Gallery Emoji @@ -966,7 +842,6 @@ Eraser Text Filter - Adjust Brush Are you sure you want to exit without saving the image? Discard @@ -974,7 +849,6 @@ Image Saved Successfully! Failed to save Image Opacity - Crop Enable photo editor Add a poll item Remove last poll item @@ -986,10 +860,8 @@ Timed mute Mention the account Refresh cache - See who boosted and added to favorites Mention the status News - Display news from Fedilab\'s account General Regional Art @@ -1034,7 +906,6 @@ Reconnect the account The application failed to access the admin features. You might need to reconnect the account for having the correct scope. Unresolved - Resolved Remote Active Pending @@ -1050,7 +921,6 @@ Disable Silence Notify the user per e-mail - Perform action Custom warning User Moderator @@ -1082,7 +952,6 @@ Empty content! Display Fedilab features button The application needs to access audio recording - An error occurred when recording the voice message! Voice message Enable quick reply The account you are replying might not see your message! @@ -1090,9 +959,7 @@ If disabled, sensitive media will be hidden with a button Store media in full size with a long press on previews Add an ellipse button at the top right for listing all tags/instances/lists - Display an item in the main menu for a quick access to the timeline targeting #Fedilab tag Keep an open connection to the streaming API for live notifications. - When the app is in background, it will keep a connection to the streaming API. Disable it if you care about your battery. During the time slot, the app will send notifications. You can reverse (ie: silent) this time slot with the right spinner. Display a Fedilab button below profile picture. It is a shortcut for accessing in-app features. Allow to reply directly in timelines below statuses @@ -1104,9 +971,6 @@ These tags will allow to filter statuses from profiles. You will have to use the context menu for seeing them. Automatically insert a line break after the mention to capitalize the first letter Allow content creators to share statuses to their RSS feeds - Timelines - Interface - Battery Compose Maximum retry times when uploading media Create a new Folder here @@ -1117,9 +981,7 @@ Default Directory Folder Create folder - Use your favourite browser inside the application. By disabling, links will be opened externally Display a toast message after an action has been completed (boost, fav, etc.)? - Export muted instances Muted instances have been exported! Add an instance Export instances @@ -1221,7 +1083,6 @@ Hide Fedilab notification bar For hiding the remaining notification in the status bar, tap on the eye icon button then uncheck: \"Display in status bar\" - Enable delayed notifications Notifications will be delayed every 30 seconds. That will allow to drain less battery. Live notifications delayed No live notifications @@ -1247,7 +1108,6 @@ Title for the video Join Peertube I am at least 16 years old and agree to the %1$s of this instance - Colors Links Change the color of links (URLs, mentions, tags, etc.) in messages Reblogs header @@ -1259,15 +1119,12 @@ Reset Icons Color of bottom icons in timelines - Background - Change the background color for timelines Pin this tag Logo of the instance Edit profile Make an action Translation Image preview - Change the theme Text color Change the text color in pots Apply changes diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 93a40f2b0..0aced80cc 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -1,13 +1,13 @@ - + - - - - - - - - + + + + + + + + - + - - - - - -