Showing preview only (4,778K chars total). Download the full file or copy to clipboard to get everything.
Repository: Android-Builds/barinsta
Branch: master
Commit: 52d53c5ad180
Files: 1055
Total size: 4.2 MB
Directory structure:
gitextract_v9zl8srd/
├── .all-contributorsrc
├── .codebeatsettings
├── .github/
│ ├── CODE_OF_CONDUCT.md
│ ├── CONTRIBUTING.md
│ ├── FUNDING.yml
│ ├── ISSUE_TEMPLATE/
│ │ ├── ban_report.md
│ │ ├── bug_report.md
│ │ ├── config.yml
│ │ └── feature_request.md
│ ├── issue_label_bot.yaml
│ └── workflows/
│ ├── github_nightly_release.yml
│ ├── github_pre_release.yml
│ ├── label-bugs.yml
│ └── label-duplicates.yml
├── .gitignore
├── .idea/
│ ├── .gitignore
│ ├── .name
│ ├── codeStyles
│ ├── compiler.xml
│ ├── gradle.xml
│ ├── inspectionProfiles/
│ │ └── profiles_settings.xml
│ ├── jarRepositories.xml
│ ├── misc.xml
│ ├── render.experimental.xml
│ ├── runConfigurations/
│ │ └── app.xml
│ ├── runConfigurations.xml
│ └── vcs.xml
├── .project
├── .settings/
│ └── org.eclipse.buildship.core.prefs
├── CHANGELOG
├── LICENSE
├── README.md
├── SECURITY.md
├── app/
│ ├── .classpath
│ ├── .gitignore
│ ├── .project
│ ├── .settings/
│ │ └── org.eclipse.buildship.core.prefs
│ ├── build.gradle
│ ├── lint.xml
│ ├── proguard-rules.pro
│ ├── schemas/
│ │ └── awais.instagrabber.db.AppDatabase/
│ │ ├── 4.json
│ │ ├── 5.json
│ │ └── 6.json
│ ├── sentry.gradle
│ └── src/
│ ├── androidTest/
│ │ └── java/
│ │ ├── awais/
│ │ │ └── instagrabber/
│ │ │ └── db/
│ │ │ ├── MigrationTest.java
│ │ │ └── dao/
│ │ │ └── RecentSearchDaoTest.kt
│ │ └── awaisomereport/
│ │ └── CrashReporterHelperTest.kt
│ ├── fdroid/
│ │ └── java/
│ │ ├── awais/
│ │ │ └── instagrabber/
│ │ │ ├── fragments/
│ │ │ │ └── settings/
│ │ │ │ └── FlavorSettings.java
│ │ │ └── utils/
│ │ │ └── UpdateChecker.java
│ │ └── awaisomereport/
│ │ └── CrashHandler.kt
│ ├── github/
│ │ ├── AndroidManifest.xml
│ │ ├── java/
│ │ │ ├── awais/
│ │ │ │ └── instagrabber/
│ │ │ │ ├── fragments/
│ │ │ │ │ └── settings/
│ │ │ │ │ └── FlavorSettings.java
│ │ │ │ └── utils/
│ │ │ │ └── UpdateChecker.java
│ │ │ └── awaisomereport/
│ │ │ └── CrashHandler.kt
│ │ └── res/
│ │ ├── values/
│ │ │ └── strings.xml
│ │ ├── values-ar/
│ │ │ └── strings.xml
│ │ ├── values-ca/
│ │ │ └── strings.xml
│ │ ├── values-cs/
│ │ │ └── strings.xml
│ │ ├── values-de/
│ │ │ └── strings.xml
│ │ ├── values-el/
│ │ │ └── strings.xml
│ │ ├── values-es/
│ │ │ └── strings.xml
│ │ ├── values-eu/
│ │ │ └── strings.xml
│ │ ├── values-fa/
│ │ │ └── strings.xml
│ │ ├── values-fr/
│ │ │ └── strings.xml
│ │ ├── values-hi/
│ │ │ └── strings.xml
│ │ ├── values-in/
│ │ │ └── strings.xml
│ │ ├── values-it/
│ │ │ └── strings.xml
│ │ ├── values-ja/
│ │ │ └── strings.xml
│ │ ├── values-ko/
│ │ │ └── strings.xml
│ │ ├── values-mk/
│ │ │ └── strings.xml
│ │ ├── values-nl/
│ │ │ └── strings.xml
│ │ ├── values-or/
│ │ │ └── strings.xml
│ │ ├── values-pl/
│ │ │ └── strings.xml
│ │ ├── values-pt/
│ │ │ └── strings.xml
│ │ ├── values-ru/
│ │ │ └── strings.xml
│ │ ├── values-sk/
│ │ │ └── strings.xml
│ │ ├── values-sv/
│ │ │ └── strings.xml
│ │ ├── values-tr/
│ │ │ └── strings.xml
│ │ ├── values-vi/
│ │ │ └── strings.xml
│ │ ├── values-zh-rCN/
│ │ │ └── strings.xml
│ │ └── values-zh-rTW/
│ │ └── strings.xml
│ ├── main/
│ │ ├── AndroidManifest.xml
│ │ ├── java/
│ │ │ ├── awais/
│ │ │ │ └── instagrabber/
│ │ │ │ ├── InstaGrabberApplication.kt
│ │ │ │ ├── activities/
│ │ │ │ │ ├── BaseLanguageActivity.kt
│ │ │ │ │ ├── CameraActivity.kt
│ │ │ │ │ ├── DirectorySelectActivity.kt
│ │ │ │ │ ├── Login.kt
│ │ │ │ │ └── MainActivity.kt
│ │ │ │ ├── adapters/
│ │ │ │ │ ├── AccountSwitcherAdapter.java
│ │ │ │ │ ├── CommentsAdapter.java
│ │ │ │ │ ├── DirectItemsAdapter.java
│ │ │ │ │ ├── DirectMessageInboxAdapter.java
│ │ │ │ │ ├── DirectPendingUsersAdapter.java
│ │ │ │ │ ├── DirectReactionsAdapter.java
│ │ │ │ │ ├── DirectUsersAdapter.java
│ │ │ │ │ ├── DirectoryFilesAdapter.java
│ │ │ │ │ ├── DiscoverTopicsAdapter.java
│ │ │ │ │ ├── FavoritesAdapter.java
│ │ │ │ │ ├── FeedAdapterV2.java
│ │ │ │ │ ├── FeedItemCallbackAdapter.java
│ │ │ │ │ ├── FeedStoriesAdapter.java
│ │ │ │ │ ├── FeedStoriesListAdapter.java
│ │ │ │ │ ├── FiltersAdapter.java
│ │ │ │ │ ├── FollowAdapter.java
│ │ │ │ │ ├── GifItemsAdapter.java
│ │ │ │ │ ├── HighlightStoriesListAdapter.java
│ │ │ │ │ ├── HighlightsAdapter.java
│ │ │ │ │ ├── KeywordsFilterAdapter.java
│ │ │ │ │ ├── LikesAdapter.java
│ │ │ │ │ ├── NotificationsAdapter.java
│ │ │ │ │ ├── SavedCollectionsAdapter.java
│ │ │ │ │ ├── SearchCategoryAdapter.java
│ │ │ │ │ ├── SearchItemsAdapter.java
│ │ │ │ │ ├── SliderCallbackAdapter.java
│ │ │ │ │ ├── SliderItemsAdapter.java
│ │ │ │ │ ├── StoriesAdapter.java
│ │ │ │ │ ├── TabsAdapter.java
│ │ │ │ │ ├── UserSearchResultsAdapter.java
│ │ │ │ │ └── viewholder/
│ │ │ │ │ ├── CommentViewHolder.java
│ │ │ │ │ ├── DiscoverViewHolder.java
│ │ │ │ │ ├── FavoriteViewHolder.java
│ │ │ │ │ ├── FeedGridItemViewHolder.java
│ │ │ │ │ ├── FeedStoryViewHolder.java
│ │ │ │ │ ├── FilterViewHolder.java
│ │ │ │ │ ├── FollowsViewHolder.java
│ │ │ │ │ ├── HighlightViewHolder.java
│ │ │ │ │ ├── NotificationViewHolder.java
│ │ │ │ │ ├── SearchItemViewHolder.java
│ │ │ │ │ ├── SliderItemViewHolder.java
│ │ │ │ │ ├── SliderPhotoViewHolder.java
│ │ │ │ │ ├── SliderVideoViewHolder.java
│ │ │ │ │ ├── StoryListViewHolder.java
│ │ │ │ │ ├── TabViewHolder.java
│ │ │ │ │ ├── TopicClusterViewHolder.java
│ │ │ │ │ ├── dialogs/
│ │ │ │ │ │ └── KeywordsFilterDialogViewHolder.java
│ │ │ │ │ ├── directmessages/
│ │ │ │ │ │ ├── DirectInboxItemViewHolder.java
│ │ │ │ │ │ ├── DirectItemActionLogViewHolder.java
│ │ │ │ │ │ ├── DirectItemAnimatedMediaViewHolder.java
│ │ │ │ │ │ ├── DirectItemDefaultViewHolder.java
│ │ │ │ │ │ ├── DirectItemLikeViewHolder.java
│ │ │ │ │ │ ├── DirectItemLinkViewHolder.java
│ │ │ │ │ │ ├── DirectItemMediaShareViewHolder.java
│ │ │ │ │ │ ├── DirectItemMediaViewHolder.java
│ │ │ │ │ │ ├── DirectItemPlaceholderViewHolder.java
│ │ │ │ │ │ ├── DirectItemProfileViewHolder.java
│ │ │ │ │ │ ├── DirectItemRavenMediaViewHolder.java
│ │ │ │ │ │ ├── DirectItemReelShareViewHolder.java
│ │ │ │ │ │ ├── DirectItemStoryShareViewHolder.java
│ │ │ │ │ │ ├── DirectItemTextViewHolder.java
│ │ │ │ │ │ ├── DirectItemVideoCallEventViewHolder.java
│ │ │ │ │ │ ├── DirectItemViewHolder.java
│ │ │ │ │ │ ├── DirectItemVoiceMediaViewHolder.java
│ │ │ │ │ │ ├── DirectItemXmaViewHolder.java
│ │ │ │ │ │ ├── DirectPendingUserViewHolder.java
│ │ │ │ │ │ ├── DirectReactionViewHolder.java
│ │ │ │ │ │ ├── DirectUserViewHolder.java
│ │ │ │ │ │ └── RecipientThreadViewHolder.java
│ │ │ │ │ └── feed/
│ │ │ │ │ ├── FeedItemViewHolder.java
│ │ │ │ │ ├── FeedPhotoViewHolder.java
│ │ │ │ │ ├── FeedSliderViewHolder.java
│ │ │ │ │ └── FeedVideoViewHolder.java
│ │ │ │ ├── animations/
│ │ │ │ │ ├── CubicBezierInterpolator.java
│ │ │ │ │ ├── FabAnimation.java
│ │ │ │ │ ├── ResizeAnimation.java
│ │ │ │ │ ├── RevealOutlineAnimation.java
│ │ │ │ │ ├── RoundedRectRevealOutlineProvider.java
│ │ │ │ │ └── ScaleAnimation.java
│ │ │ │ ├── asyncs/
│ │ │ │ │ ├── DiscoverPostFetchService.java
│ │ │ │ │ ├── FeedPostFetchService.java
│ │ │ │ │ ├── HashtagPostFetchService.java
│ │ │ │ │ ├── LocationPostFetchService.java
│ │ │ │ │ ├── ProfilePostFetchService.java
│ │ │ │ │ └── SavedPostFetchService.java
│ │ │ │ ├── backup/
│ │ │ │ │ └── BarinstaBackupAgent.kt
│ │ │ │ ├── broadcasts/
│ │ │ │ │ └── DMRefreshBroadcastReceiver.java
│ │ │ │ ├── customviews/
│ │ │ │ │ ├── BarinstaFragmentNavigator.kt
│ │ │ │ │ ├── BarinstaNavHostFragment.kt
│ │ │ │ │ ├── ChatMessageLayout.java
│ │ │ │ │ ├── CircularImageView.java
│ │ │ │ │ ├── CommentMentionClickSpan.java
│ │ │ │ │ ├── DirectItemContextMenu.java
│ │ │ │ │ ├── DirectItemFrameLayout.java
│ │ │ │ │ ├── FixedImageView.java
│ │ │ │ │ ├── FormattedNumberTextView.java
│ │ │ │ │ ├── InsetsAnimationLinearLayout.java
│ │ │ │ │ ├── InsetsNotifyingCoordinatorLayout.java
│ │ │ │ │ ├── InsetsNotifyingLinearLayout.java
│ │ │ │ │ ├── KeyNotifyingEmojiEditText.java
│ │ │ │ │ ├── MouseDrawer.java
│ │ │ │ │ ├── PostsRecyclerView.java
│ │ │ │ │ ├── PrimaryActionModeCallback.java
│ │ │ │ │ ├── ProfilePicView.java
│ │ │ │ │ ├── RamboTextViewV2.java
│ │ │ │ │ ├── ReactionEmojiTextView.java
│ │ │ │ │ ├── RecordButton.java
│ │ │ │ │ ├── RecordView.java
│ │ │ │ │ ├── SharedElementTransitionDialogFragment.java
│ │ │ │ │ ├── SquareImageView.java
│ │ │ │ │ ├── TextViewDrawableSize.java
│ │ │ │ │ ├── Tooltip.java
│ │ │ │ │ ├── UsernameTextView.java
│ │ │ │ │ ├── VerticalDragHelper.java
│ │ │ │ │ ├── VerticalImageSpan.java
│ │ │ │ │ ├── VideoPlayerCallbackAdapter.java
│ │ │ │ │ ├── VideoPlayerViewHelper.java
│ │ │ │ │ ├── drawee/
│ │ │ │ │ │ ├── AbstractAnimatedZoomableController.java
│ │ │ │ │ │ ├── AnimatedZoomableController.java
│ │ │ │ │ │ ├── DefaultZoomableController.java
│ │ │ │ │ │ ├── DoubleTapGestureListener.java
│ │ │ │ │ │ ├── DraggableZoomableDraweeView.java
│ │ │ │ │ │ ├── GestureListenerWrapper.java
│ │ │ │ │ │ ├── MultiGestureListener.java
│ │ │ │ │ │ ├── MultiPointerGestureDetector.java
│ │ │ │ │ │ ├── MultiZoomableControllerListener.java
│ │ │ │ │ │ ├── TransformGestureDetector.java
│ │ │ │ │ │ ├── ZoomableController.java
│ │ │ │ │ │ └── ZoomableDraweeView.java
│ │ │ │ │ ├── emoji/
│ │ │ │ │ │ ├── Emoji.java
│ │ │ │ │ │ ├── EmojiBottomSheetDialog.java
│ │ │ │ │ │ ├── EmojiCategory.java
│ │ │ │ │ │ ├── EmojiCategoryPageViewHolder.java
│ │ │ │ │ │ ├── EmojiCategoryType.java
│ │ │ │ │ │ ├── EmojiGridAdapter.java
│ │ │ │ │ │ ├── EmojiPicker.java
│ │ │ │ │ │ ├── EmojiPickerPageAdapter.java
│ │ │ │ │ │ ├── EmojiVariantManager.java
│ │ │ │ │ │ ├── EmojiVariantPopup.java
│ │ │ │ │ │ ├── GoogleCompatEmojiDrawable.java
│ │ │ │ │ │ └── ReactionsManager.java
│ │ │ │ │ ├── helpers/
│ │ │ │ │ │ ├── ChangeText.java
│ │ │ │ │ │ ├── ControlFocusInsetsAnimationCallback.java
│ │ │ │ │ │ ├── CustomHideBottomViewOnScrollBehavior.java
│ │ │ │ │ │ ├── EmojiPickerInsetsAnimationCallback.java
│ │ │ │ │ │ ├── GridAutofitLayoutManager.java
│ │ │ │ │ │ ├── GridSpacingItemDecoration.java
│ │ │ │ │ │ ├── HeaderItemDecoration.java
│ │ │ │ │ │ ├── HeightProvider.java
│ │ │ │ │ │ ├── ImageResizingControllerListener.java
│ │ │ │ │ │ ├── NestedCoordinatorLayout.java
│ │ │ │ │ │ ├── NestedScrollableHost.java
│ │ │ │ │ │ ├── PostFetcher.java
│ │ │ │ │ │ ├── RecordViewAnimationHelper.java
│ │ │ │ │ │ ├── RecyclerLazyLoader.java
│ │ │ │ │ │ ├── RecyclerLazyLoaderAtEdge.java
│ │ │ │ │ │ ├── RootViewDeferringInsetsCallback.java
│ │ │ │ │ │ ├── SimpleImeAnimationController.java
│ │ │ │ │ │ ├── SwipeAndRestoreItemTouchHelperCallback.java
│ │ │ │ │ │ ├── SwipeGestureListener.java
│ │ │ │ │ │ ├── TextWatcherAdapter.java
│ │ │ │ │ │ ├── TranslateDeferringInsetsAnimationCallback.java
│ │ │ │ │ │ ├── VerticalSpaceItemDecoration.java
│ │ │ │ │ │ └── VideoAwareRecyclerScroller.java
│ │ │ │ │ └── masoudss_waveform/
│ │ │ │ │ ├── SoundParser.java
│ │ │ │ │ ├── WaveFormProgressChangeListener.java
│ │ │ │ │ ├── WaveGravity.java
│ │ │ │ │ └── WaveformSeekBar.java
│ │ │ │ ├── db/
│ │ │ │ │ ├── AppDatabase.kt
│ │ │ │ │ ├── Converters.kt
│ │ │ │ │ ├── dao/
│ │ │ │ │ │ ├── AccountDao.kt
│ │ │ │ │ │ ├── DMLastNotifiedDao.kt
│ │ │ │ │ │ ├── FavoriteDao.kt
│ │ │ │ │ │ └── RecentSearchDao.kt
│ │ │ │ │ ├── datasources/
│ │ │ │ │ │ ├── AccountDataSource.kt
│ │ │ │ │ │ ├── DMLastNotifiedDataSource.kt
│ │ │ │ │ │ ├── FavoriteDataSource.kt
│ │ │ │ │ │ └── RecentSearchDataSource.kt
│ │ │ │ │ ├── entities/
│ │ │ │ │ │ ├── Account.kt
│ │ │ │ │ │ ├── DMLastNotified.kt
│ │ │ │ │ │ ├── Favorite.kt
│ │ │ │ │ │ └── RecentSearch.kt
│ │ │ │ │ └── repositories/
│ │ │ │ │ ├── AccountRepository.kt
│ │ │ │ │ ├── DMLastNotifiedRepository.kt
│ │ │ │ │ ├── FavoriteRepository.kt
│ │ │ │ │ └── RecentSearchRepository.kt
│ │ │ │ ├── dialogs/
│ │ │ │ │ ├── AccountSwitcherDialogFragment.java
│ │ │ │ │ ├── ConfirmDialogFragment.java
│ │ │ │ │ ├── CreateBackupDialogFragment.java
│ │ │ │ │ ├── DirectItemReactionDialogFragment.java
│ │ │ │ │ ├── EditTextDialogFragment.java
│ │ │ │ │ ├── GifPickerBottomDialogFragment.java
│ │ │ │ │ ├── KeywordsFilterDialog.java
│ │ │ │ │ ├── MultiOptionDialogFragment.java
│ │ │ │ │ ├── PostLoadingDialogFragment.kt
│ │ │ │ │ ├── PostsLayoutPreferencesDialogFragment.kt
│ │ │ │ │ ├── ProfilePicDialogFragment.java
│ │ │ │ │ ├── RestoreBackupDialogFragment.java
│ │ │ │ │ ├── TabOrderPreferenceDialogFragment.java
│ │ │ │ │ └── TimeSettingsDialog.java
│ │ │ │ ├── fragments/
│ │ │ │ │ ├── CollectionPostsFragment.java
│ │ │ │ │ ├── FavoritesFragment.kt
│ │ │ │ │ ├── FollowViewerFragment.kt
│ │ │ │ │ ├── HashTagFragment.java
│ │ │ │ │ ├── LikesViewerFragment.java
│ │ │ │ │ ├── LocationFragment.java
│ │ │ │ │ ├── NotificationsViewerFragment.java
│ │ │ │ │ ├── PostViewV2Fragment.java
│ │ │ │ │ ├── SavedCollectionsFragment.java
│ │ │ │ │ ├── SavedViewerFragment.java
│ │ │ │ │ ├── StoryListViewerFragment.java
│ │ │ │ │ ├── StoryViewerFragment.kt
│ │ │ │ │ ├── UserSearchFragment.kt
│ │ │ │ │ ├── UserSearchMode.kt
│ │ │ │ │ ├── comments/
│ │ │ │ │ │ ├── CommentsViewerFragment.java
│ │ │ │ │ │ ├── Helper.java
│ │ │ │ │ │ └── RepliesFragment.java
│ │ │ │ │ ├── directmessages/
│ │ │ │ │ │ ├── DirectMessageInboxFragment.kt
│ │ │ │ │ │ ├── DirectMessageSettingsFragment.kt
│ │ │ │ │ │ ├── DirectMessageThreadFragment.java
│ │ │ │ │ │ └── DirectPendingInboxFragment.kt
│ │ │ │ │ ├── imageedit/
│ │ │ │ │ │ ├── FiltersFragment.java
│ │ │ │ │ │ ├── ImageEditFragment.java
│ │ │ │ │ │ └── filters/
│ │ │ │ │ │ ├── FiltersHelper.java
│ │ │ │ │ │ ├── custom/
│ │ │ │ │ │ │ ├── GPUImage1977Filter.java
│ │ │ │ │ │ │ ├── GPUImageAdenFilter.java
│ │ │ │ │ │ │ └── GPUImageClarendonFilter.java
│ │ │ │ │ │ ├── filters/
│ │ │ │ │ │ │ ├── AdenFilter.java
│ │ │ │ │ │ │ ├── BilateralBlurFilter.java
│ │ │ │ │ │ │ ├── BoxBlurFilter.java
│ │ │ │ │ │ │ ├── BrightnessFilter.java
│ │ │ │ │ │ │ ├── ClarendonFilter.java
│ │ │ │ │ │ │ ├── ContrastFilter.java
│ │ │ │ │ │ │ ├── ExposureFilter.java
│ │ │ │ │ │ │ ├── Filter.java
│ │ │ │ │ │ │ ├── FilterFactory.java
│ │ │ │ │ │ │ ├── NormalFilter.java
│ │ │ │ │ │ │ ├── One977Filter.java
│ │ │ │ │ │ │ ├── SaturationFilter.java
│ │ │ │ │ │ │ ├── SepiaToneFilter.java
│ │ │ │ │ │ │ ├── SharpenFilter.java
│ │ │ │ │ │ │ ├── VibranceFilter.java
│ │ │ │ │ │ │ └── VignetteFilter.java
│ │ │ │ │ │ └── properties/
│ │ │ │ │ │ ├── ColorProperty.java
│ │ │ │ │ │ ├── FloatProperty.java
│ │ │ │ │ │ ├── PointFProperty.java
│ │ │ │ │ │ └── Property.java
│ │ │ │ │ ├── main/
│ │ │ │ │ │ ├── DiscoverFragment.java
│ │ │ │ │ │ ├── FeedFragment.java
│ │ │ │ │ │ └── ProfileFragment.kt
│ │ │ │ │ ├── search/
│ │ │ │ │ │ ├── SearchCategoryFragment.java
│ │ │ │ │ │ └── SearchFragment.java
│ │ │ │ │ └── settings/
│ │ │ │ │ ├── AboutFragment.java
│ │ │ │ │ ├── BackupPreferencesFragment.java
│ │ │ │ │ ├── BasePreferencesFragment.java
│ │ │ │ │ ├── DMPreferencesFragment.java
│ │ │ │ │ ├── DownloadsPreferencesFragment.java
│ │ │ │ │ ├── GeneralPreferencesFragment.java
│ │ │ │ │ ├── IFlavorSettings.java
│ │ │ │ │ ├── LocalePreferencesFragment.java
│ │ │ │ │ ├── MorePreferencesFragment.java
│ │ │ │ │ ├── NotificationsPreferencesFragment.java
│ │ │ │ │ ├── PostPreferencesFragment.java
│ │ │ │ │ ├── PreferenceHelper.java
│ │ │ │ │ ├── PreferenceKeys.kt
│ │ │ │ │ ├── SettingCategory.java
│ │ │ │ │ ├── SettingsPreferencesFragment.java
│ │ │ │ │ ├── StoriesPreferencesFragment.java
│ │ │ │ │ └── ThemePreferencesFragment.java
│ │ │ │ ├── interfaces/
│ │ │ │ │ ├── FetchListener.java
│ │ │ │ │ ├── LazyLoadListener.java
│ │ │ │ │ ├── OnGroupClickListener.java
│ │ │ │ │ └── SwipeEvent.java
│ │ │ │ ├── managers/
│ │ │ │ │ ├── DirectMessagesManager.kt
│ │ │ │ │ ├── InboxManager.kt
│ │ │ │ │ └── ThreadManager.kt
│ │ │ │ ├── models/
│ │ │ │ │ ├── Comment.kt
│ │ │ │ │ ├── IntentModel.kt
│ │ │ │ │ ├── PostsLayoutPreferences.java
│ │ │ │ │ ├── Resource.kt
│ │ │ │ │ ├── SavedImageEditState.kt
│ │ │ │ │ ├── Tab.kt
│ │ │ │ │ ├── UploadPhotoOptions.kt
│ │ │ │ │ ├── UploadVideoOptions.kt
│ │ │ │ │ └── enums/
│ │ │ │ │ ├── BroadcastItemType.kt
│ │ │ │ │ ├── DirectItemType.kt
│ │ │ │ │ ├── FavoriteType.kt
│ │ │ │ │ ├── FollowingType.kt
│ │ │ │ │ ├── IntentModelType.kt
│ │ │ │ │ ├── MediaItemType.kt
│ │ │ │ │ ├── NotificationType.kt
│ │ │ │ │ ├── PostItemType.kt
│ │ │ │ │ ├── RavenMediaViewMode.kt
│ │ │ │ │ └── StoryPaginationType.kt
│ │ │ │ ├── repositories/
│ │ │ │ │ ├── CollectionRepository.java
│ │ │ │ │ ├── CommentRepository.java
│ │ │ │ │ ├── DirectMessagesService.kt
│ │ │ │ │ ├── DiscoverRepository.java
│ │ │ │ │ ├── FeedRepository.java
│ │ │ │ │ ├── FriendshipService.kt
│ │ │ │ │ ├── GifRepository.java
│ │ │ │ │ ├── GraphQLService.kt
│ │ │ │ │ ├── LocationRepository.java
│ │ │ │ │ ├── MediaService.kt
│ │ │ │ │ ├── NewsRepository.java
│ │ │ │ │ ├── ProfileService.kt
│ │ │ │ │ ├── SearchService.kt
│ │ │ │ │ ├── StoriesService.kt
│ │ │ │ │ ├── TagsRepository.java
│ │ │ │ │ ├── UserService.kt
│ │ │ │ │ ├── requests/
│ │ │ │ │ │ ├── StoryViewerOptions.java
│ │ │ │ │ │ ├── UploadFinishOptions.kt
│ │ │ │ │ │ └── directmessages/
│ │ │ │ │ │ ├── AnimatedMediaBroadcastOptions.kt
│ │ │ │ │ │ ├── BroadcastOptions.kt
│ │ │ │ │ │ ├── LinkBroadcastOptions.kt
│ │ │ │ │ │ ├── MediaShareBroadcastOptions.kt
│ │ │ │ │ │ ├── PhotoBroadcastOptions.kt
│ │ │ │ │ │ ├── ProfileBroadcastOptions.kt
│ │ │ │ │ │ ├── ReactionBroadcastOptions.kt
│ │ │ │ │ │ ├── StoryBroadcastOptions.kt
│ │ │ │ │ │ ├── StoryReplyBroadcastOptions.kt
│ │ │ │ │ │ ├── TextBroadcastOptions.kt
│ │ │ │ │ │ ├── ThreadIdsOrUserIds.kt
│ │ │ │ │ │ ├── VideoBroadcastOptions.kt
│ │ │ │ │ │ └── VoiceBroadcastOptions.kt
│ │ │ │ │ ├── responses/
│ │ │ │ │ │ ├── AnimatedMediaFixedHeight.kt
│ │ │ │ │ │ ├── AnimatedMediaImages.kt
│ │ │ │ │ │ ├── Audio.kt
│ │ │ │ │ │ ├── AymlResponse.kt
│ │ │ │ │ │ ├── Caption.kt
│ │ │ │ │ │ ├── ChildCommentsFetchResponse.kt
│ │ │ │ │ │ ├── CommentsFetchResponse.kt
│ │ │ │ │ │ ├── FriendshipChangeResponse.kt
│ │ │ │ │ │ ├── FriendshipListFetchResponse.kt
│ │ │ │ │ │ ├── FriendshipRestrictResponse.kt
│ │ │ │ │ │ ├── FriendshipStatus.kt
│ │ │ │ │ │ ├── GraphQLUserListFetchResponse.java
│ │ │ │ │ │ ├── Hashtag.kt
│ │ │ │ │ │ ├── ImageUrl.kt
│ │ │ │ │ │ ├── ImageVersions2.kt
│ │ │ │ │ │ ├── LikersResponse.kt
│ │ │ │ │ │ ├── Location.java
│ │ │ │ │ │ ├── LocationFeedResponse.kt
│ │ │ │ │ │ ├── Media.kt
│ │ │ │ │ │ ├── MediaCandidate.kt
│ │ │ │ │ │ ├── MediaInfoResponse.kt
│ │ │ │ │ │ ├── NewsInboxResponse.kt
│ │ │ │ │ │ ├── Place.kt
│ │ │ │ │ │ ├── PostsFetchResponse.kt
│ │ │ │ │ │ ├── TagFeedResponse.kt
│ │ │ │ │ │ ├── User.kt
│ │ │ │ │ │ ├── UserFeedResponse.kt
│ │ │ │ │ │ ├── UserProfileContextLink.kt
│ │ │ │ │ │ ├── UserSearchResponse.kt
│ │ │ │ │ │ ├── UsertagIn.java
│ │ │ │ │ │ ├── Usertags.java
│ │ │ │ │ │ ├── WrappedFeedResponse.java
│ │ │ │ │ │ ├── WrappedMedia.kt
│ │ │ │ │ │ ├── WrappedUser.kt
│ │ │ │ │ │ ├── directmessages/
│ │ │ │ │ │ │ ├── DirectBadgeCount.kt
│ │ │ │ │ │ │ ├── DirectInbox.kt
│ │ │ │ │ │ │ ├── DirectInboxResponse.kt
│ │ │ │ │ │ │ ├── DirectItem.kt
│ │ │ │ │ │ │ ├── DirectItemActionLog.kt
│ │ │ │ │ │ │ ├── DirectItemAnimatedMedia.kt
│ │ │ │ │ │ │ ├── DirectItemClip.kt
│ │ │ │ │ │ │ ├── DirectItemEmojiReaction.kt
│ │ │ │ │ │ │ ├── DirectItemFelixShare.kt
│ │ │ │ │ │ │ ├── DirectItemLink.kt
│ │ │ │ │ │ │ ├── DirectItemLinkContext.kt
│ │ │ │ │ │ │ ├── DirectItemPlaceholder.kt
│ │ │ │ │ │ │ ├── DirectItemReactions.kt
│ │ │ │ │ │ │ ├── DirectItemReelShare.kt
│ │ │ │ │ │ │ ├── DirectItemReelShareReactionInfo.kt
│ │ │ │ │ │ │ ├── DirectItemSeenResponse.kt
│ │ │ │ │ │ │ ├── DirectItemSeenResponsePayload.kt
│ │ │ │ │ │ │ ├── DirectItemStoryShare.kt
│ │ │ │ │ │ │ ├── DirectItemVideoCallEvent.kt
│ │ │ │ │ │ │ ├── DirectItemVisualMedia.kt
│ │ │ │ │ │ │ ├── DirectItemVoiceMedia.kt
│ │ │ │ │ │ │ ├── DirectItemXma.kt
│ │ │ │ │ │ │ ├── DirectThread.kt
│ │ │ │ │ │ │ ├── DirectThreadBroadcastResponse.kt
│ │ │ │ │ │ │ ├── DirectThreadBroadcastResponseMessageMetadata.kt
│ │ │ │ │ │ │ ├── DirectThreadBroadcastResponsePayload.kt
│ │ │ │ │ │ │ ├── DirectThreadDetailsChangeResponse.kt
│ │ │ │ │ │ │ ├── DirectThreadDirectStory.kt
│ │ │ │ │ │ │ ├── DirectThreadFeedResponse.kt
│ │ │ │ │ │ │ ├── DirectThreadLastSeenAt.kt
│ │ │ │ │ │ │ ├── DirectThreadParticipantRequestsResponse.kt
│ │ │ │ │ │ │ ├── RankedRecipient.kt
│ │ │ │ │ │ │ ├── RankedRecipientsResponse.kt
│ │ │ │ │ │ │ ├── RavenExpiringMediaActionSummary.kt
│ │ │ │ │ │ │ ├── TextRange.kt
│ │ │ │ │ │ │ └── ThreadContext.kt
│ │ │ │ │ │ ├── discover/
│ │ │ │ │ │ │ ├── TopicCluster.kt
│ │ │ │ │ │ │ └── TopicalExploreFeedResponse.kt
│ │ │ │ │ │ ├── feed/
│ │ │ │ │ │ │ ├── EndOfFeedDemarcator.java
│ │ │ │ │ │ │ ├── EndOfFeedGroup.java
│ │ │ │ │ │ │ ├── EndOfFeedGroupSet.java
│ │ │ │ │ │ │ └── FeedFetchResponse.java
│ │ │ │ │ │ ├── giphy/
│ │ │ │ │ │ │ ├── GiphyGif.java
│ │ │ │ │ │ │ ├── GiphyGifImage.java
│ │ │ │ │ │ │ ├── GiphyGifImages.java
│ │ │ │ │ │ │ ├── GiphyGifResponse.java
│ │ │ │ │ │ │ └── GiphyGifResults.java
│ │ │ │ │ │ ├── notification/
│ │ │ │ │ │ │ ├── Notification.kt
│ │ │ │ │ │ │ ├── NotificationArgs.java
│ │ │ │ │ │ │ ├── NotificationCounts.kt
│ │ │ │ │ │ │ └── NotificationImage.kt
│ │ │ │ │ │ ├── saved/
│ │ │ │ │ │ │ ├── CollectionsListResponse.kt
│ │ │ │ │ │ │ └── SavedCollection.kt
│ │ │ │ │ │ ├── search/
│ │ │ │ │ │ │ ├── SearchItem.java
│ │ │ │ │ │ │ └── SearchResponse.kt
│ │ │ │ │ │ └── stories/
│ │ │ │ │ │ ├── ArchiveResponse.kt
│ │ │ │ │ │ ├── Broadcast.kt
│ │ │ │ │ │ ├── CoverMedia.kt
│ │ │ │ │ │ ├── PollSticker.kt
│ │ │ │ │ │ ├── QuestionSticker.kt
│ │ │ │ │ │ ├── QuizSticker.kt
│ │ │ │ │ │ ├── ReelsMediaResponse.kt
│ │ │ │ │ │ ├── ReelsResponse.kt
│ │ │ │ │ │ ├── ReelsTrayResponse.kt
│ │ │ │ │ │ ├── SliderSticker.kt
│ │ │ │ │ │ ├── Story.kt
│ │ │ │ │ │ ├── StoryAppAttribution.kt
│ │ │ │ │ │ ├── StoryCta.kt
│ │ │ │ │ │ ├── StoryMedia.kt
│ │ │ │ │ │ ├── StoryMediaResponse.kt
│ │ │ │ │ │ ├── StorySticker.kt
│ │ │ │ │ │ ├── StoryStickerResponse.kt
│ │ │ │ │ │ └── Tally.kt
│ │ │ │ │ └── serializers/
│ │ │ │ │ └── CaptionDeserializer.java
│ │ │ │ ├── services/
│ │ │ │ │ ├── ActivityCheckerService.java
│ │ │ │ │ ├── BootCompletedReceiver.java
│ │ │ │ │ ├── DMSyncAlarmReceiver.java
│ │ │ │ │ ├── DMSyncService.java
│ │ │ │ │ └── DeleteImageIntentService.java
│ │ │ │ ├── utils/
│ │ │ │ │ ├── AppExecutors.kt
│ │ │ │ │ ├── BarinstaDeepLinkHelper.kt
│ │ │ │ │ ├── BitmapUtils.kt
│ │ │ │ │ ├── CombinedDrawable.kt
│ │ │ │ │ ├── ConcurrencyHelpers.kt
│ │ │ │ │ ├── Constants.kt
│ │ │ │ │ ├── CookieUtils.kt
│ │ │ │ │ ├── CoroutineUtils.kt
│ │ │ │ │ ├── CubicInterpolation.kt
│ │ │ │ │ ├── DMUtils.java
│ │ │ │ │ ├── DateUtils.kt
│ │ │ │ │ ├── Debouncer.java
│ │ │ │ │ ├── DeepLinkParser.kt
│ │ │ │ │ ├── DirectItemFactory.kt
│ │ │ │ │ ├── DownloadUtils.kt
│ │ │ │ │ ├── Event.kt
│ │ │ │ │ ├── ExoplayerUtils.kt
│ │ │ │ │ ├── ExportImportUtils.java
│ │ │ │ │ ├── FlavorTown.java
│ │ │ │ │ ├── IntentUtils.kt
│ │ │ │ │ ├── KeywordsFilterUtils.kt
│ │ │ │ │ ├── LocaleUtils.kt
│ │ │ │ │ ├── MediaUploadHelper.kt
│ │ │ │ │ ├── MediaUploader.kt
│ │ │ │ │ ├── MediaUtils.java
│ │ │ │ │ ├── NavigationExtensions.java
│ │ │ │ │ ├── NavigationHelper.kt
│ │ │ │ │ ├── NetworkUtils.java
│ │ │ │ │ ├── NullSafePair.kt
│ │ │ │ │ ├── NumberUtils.kt
│ │ │ │ │ ├── PasswordUtils.kt
│ │ │ │ │ ├── PermissionUtils.kt
│ │ │ │ │ ├── ProcessPhoenix.java
│ │ │ │ │ ├── RankedRecipientsCache.kt
│ │ │ │ │ ├── ResponseBodyUtils.java
│ │ │ │ │ ├── SerializablePair.kt
│ │ │ │ │ ├── SettingsHelper.kt
│ │ │ │ │ ├── SingleLiveEvent.kt
│ │ │ │ │ ├── SingletonHolder.kt
│ │ │ │ │ ├── TextUtils.kt
│ │ │ │ │ ├── ThemeUtils.kt
│ │ │ │ │ ├── UpdateCheckCommon.kt
│ │ │ │ │ ├── UserAgentUtils.kt
│ │ │ │ │ ├── Utils.java
│ │ │ │ │ ├── ViewUtils.kt
│ │ │ │ │ ├── VoiceRecorder.java
│ │ │ │ │ ├── emoji/
│ │ │ │ │ │ ├── EmojiCategoryDeserializer.kt
│ │ │ │ │ │ ├── EmojiDeserializer.kt
│ │ │ │ │ │ └── EmojiParser.kt
│ │ │ │ │ └── extensions/
│ │ │ │ │ ├── AnyExtensions.kt
│ │ │ │ │ ├── StringExtensions.kt
│ │ │ │ │ └── UserExtensions.kt
│ │ │ │ ├── viewmodels/
│ │ │ │ │ ├── AppStateViewModel.java
│ │ │ │ │ ├── ArchivesViewModel.java
│ │ │ │ │ ├── CommentsViewerViewModel.java
│ │ │ │ │ ├── DirectInboxViewModel.kt
│ │ │ │ │ ├── DirectPendingInboxViewModel.kt
│ │ │ │ │ ├── DirectSettingsViewModel.kt
│ │ │ │ │ ├── DirectThreadViewModel.kt
│ │ │ │ │ ├── DirectorySelectActivityViewModel.kt
│ │ │ │ │ ├── FavoritesViewModel.kt
│ │ │ │ │ ├── FeedStoriesViewModel.java
│ │ │ │ │ ├── FileListViewModel.java
│ │ │ │ │ ├── FiltersFragmentViewModel.java
│ │ │ │ │ ├── FollowViewModel.kt
│ │ │ │ │ ├── GifPickerViewModel.java
│ │ │ │ │ ├── ImageEditViewModel.java
│ │ │ │ │ ├── MediaViewModel.java
│ │ │ │ │ ├── NotificationViewModel.java
│ │ │ │ │ ├── PostViewV2ViewModel.kt
│ │ │ │ │ ├── ProfileFragmentViewModel.kt
│ │ │ │ │ ├── SavedCollectionsViewModel.java
│ │ │ │ │ ├── SearchFragmentViewModel.kt
│ │ │ │ │ ├── StoryFragmentViewModel.kt
│ │ │ │ │ ├── TopicClusterViewModel.java
│ │ │ │ │ ├── UserSearchViewModel.java
│ │ │ │ │ └── factories/
│ │ │ │ │ ├── DirectSettingsViewModelFactory.java
│ │ │ │ │ └── DirectThreadViewModelFactory.java
│ │ │ │ ├── webservices/
│ │ │ │ │ ├── CollectionService.java
│ │ │ │ │ ├── CommentService.java
│ │ │ │ │ ├── DirectMessagesRepository.kt
│ │ │ │ │ ├── DiscoverService.java
│ │ │ │ │ ├── FeedService.java
│ │ │ │ │ ├── FriendshipRepository.kt
│ │ │ │ │ ├── GifService.java
│ │ │ │ │ ├── GraphQLRepository.kt
│ │ │ │ │ ├── LocationService.java
│ │ │ │ │ ├── MediaRepository.kt
│ │ │ │ │ ├── NewsService.java
│ │ │ │ │ ├── ProfileRepository.kt
│ │ │ │ │ ├── RetrofitFactory.kt
│ │ │ │ │ ├── SearchRepository.kt
│ │ │ │ │ ├── ServiceCallback.java
│ │ │ │ │ ├── StoriesRepository.kt
│ │ │ │ │ ├── TagsService.java
│ │ │ │ │ ├── UserRepository.kt
│ │ │ │ │ └── interceptors/
│ │ │ │ │ ├── AddCookiesInterceptor.java
│ │ │ │ │ ├── IgErrorsInterceptor.java
│ │ │ │ │ └── LoggingInterceptor.java
│ │ │ │ └── workers/
│ │ │ │ └── DownloadWorker.kt
│ │ │ ├── awaisomereport/
│ │ │ │ ├── CrashReporter.kt
│ │ │ │ ├── CrashReporterHelper.kt
│ │ │ │ ├── ErrorReporterActivity.kt
│ │ │ │ └── ICrashHandler.kt
│ │ │ └── thoughtbot/
│ │ │ └── expandableadapter/
│ │ │ ├── ExpandableGroup.java
│ │ │ ├── ExpandableList.java
│ │ │ ├── ExpandableListPosition.java
│ │ │ └── GroupViewHolder.java
│ │ └── res/
│ │ ├── anim/
│ │ │ ├── dialog_anim_in.xml
│ │ │ ├── dialog_anim_out.xml
│ │ │ ├── slide_in_right.xml
│ │ │ ├── slide_left.xml
│ │ │ ├── slide_out_left.xml
│ │ │ └── slide_right.xml
│ │ ├── animator/
│ │ │ ├── basket_path.xml
│ │ │ └── delete_mic_animation.xml
│ │ ├── color/
│ │ │ ├── emoji_picker_tab_color.xml
│ │ │ ├── filter_name_color.xml
│ │ │ ├── ic_circle_check_tint.xml
│ │ │ ├── ic_read_button_tint.xml
│ │ │ └── image_edit_tab_tint.xml
│ │ ├── drawable/
│ │ │ ├── avd_mic_to_send_anim.xml
│ │ │ ├── avd_send_to_mic_anim.xml
│ │ │ ├── background_grey_ripple.xml
│ │ │ ├── bg_dm_date_header.xml
│ │ │ ├── bg_dm_time.xml
│ │ │ ├── bg_indicator.xml
│ │ │ ├── bg_input.xml
│ │ │ ├── bg_media_share_bottom.xml
│ │ │ ├── bg_media_share_top_incoming.xml
│ │ │ ├── bg_media_share_top_outgoing.xml
│ │ │ ├── bg_quote_line.xml
│ │ │ ├── bg_reply_text.xml
│ │ │ ├── bg_rounded_corner.xml
│ │ │ ├── bg_speech_bubble_incoming.xml
│ │ │ ├── bg_speech_bubble_outgoing.xml
│ │ │ ├── bg_user_search_input.xml
│ │ │ ├── ic_account_clock_24.xml
│ │ │ ├── ic_account_multiple_remove_24.xml
│ │ │ ├── ic_add.xml
│ │ │ ├── ic_archive.xml
│ │ │ ├── ic_arrow_drop_down_24.xml
│ │ │ ├── ic_arrow_upward_24.xml
│ │ │ ├── ic_baseline_check_circle_24.xml
│ │ │ ├── ic_block_24.xml
│ │ │ ├── ic_bookmark.xml
│ │ │ ├── ic_border_style_flipped_24.xml
│ │ │ ├── ic_camera_24.xml
│ │ │ ├── ic_cancel.xml
│ │ │ ├── ic_check_24.xml
│ │ │ ├── ic_check_all_24.xml
│ │ │ ├── ic_checkbox_multiple_blank.xml
│ │ │ ├── ic_checkbox_multiple_blank_stroke.xml
│ │ │ ├── ic_circle_check.xml
│ │ │ ├── ic_class_24.xml
│ │ │ ├── ic_clock_alert_outline_24.xml
│ │ │ ├── ic_close_24.xml
│ │ │ ├── ic_cloud_download_24.xml
│ │ │ ├── ic_dashboard_24.xml
│ │ │ ├── ic_delete.xml
│ │ │ ├── ic_download.xml
│ │ │ ├── ic_download_circle_24.xml
│ │ │ ├── ic_explore_24.xml
│ │ │ ├── ic_face_24.xml
│ │ │ ├── ic_file_24.xml
│ │ │ ├── ic_folder_24.xml
│ │ │ ├── ic_forward_5_24.xml
│ │ │ ├── ic_forward_5_24_a50.xml
│ │ │ ├── ic_forward_5_24_states.xml
│ │ │ ├── ic_highlight_off_24.xml
│ │ │ ├── ic_home_24.xml
│ │ │ ├── ic_image_24.xml
│ │ │ ├── ic_keyboard_24.xml
│ │ │ ├── ic_keyboard_arrow_down_24.xml
│ │ │ ├── ic_keyboard_arrow_up_24.xml
│ │ │ ├── ic_launcher_background.xml
│ │ │ ├── ic_like.xml
│ │ │ ├── ic_logout_24.xml
│ │ │ ├── ic_message_24.xml
│ │ │ ├── ic_more_horiz_24.xml
│ │ │ ├── ic_more_vert_24.xml
│ │ │ ├── ic_not_liked.xml
│ │ │ ├── ic_notes_24.xml
│ │ │ ├── ic_notif.xml
│ │ │ ├── ic_open_in_new_24.xml
│ │ │ ├── ic_outline_class_24.xml
│ │ │ ├── ic_outline_comments_24.xml
│ │ │ ├── ic_outline_info_24.xml
│ │ │ ├── ic_outline_map_24.xml
│ │ │ ├── ic_outline_person_add_24.xml
│ │ │ ├── ic_outline_person_add_disabled_24.xml
│ │ │ ├── ic_outline_person_pin_24.xml
│ │ │ ├── ic_outline_settings_24.xml
│ │ │ ├── ic_outline_star_plus_24.xml
│ │ │ ├── ic_outline_views_24.xml
│ │ │ ├── ic_pause_24.xml
│ │ │ ├── ic_person_24.xml
│ │ │ ├── ic_photo_filter.xml
│ │ │ ├── ic_play_arrow_24.xml
│ │ │ ├── ic_play_arrow_24_a50.xml
│ │ │ ├── ic_play_circle_outline_24.xml
│ │ │ ├── ic_play_states.xml
│ │ │ ├── ic_profile_24.xml
│ │ │ ├── ic_profile_40.xml
│ │ │ ├── ic_profile_48.xml
│ │ │ ├── ic_radio_button_unchecked_24.xml
│ │ │ ├── ic_refresh_24.xml
│ │ │ ├── ic_replay_5_24.xml
│ │ │ ├── ic_replay_5_24_a50.xml
│ │ │ ├── ic_replay_5_24_states.xml
│ │ │ ├── ic_round_add_circle_24.xml
│ │ │ ├── ic_round_arrow_back_24.xml
│ │ │ ├── ic_round_attach_file_rot45_24.xml
│ │ │ ├── ic_round_backspace_24.xml
│ │ │ ├── ic_round_bookmark_border_24.xml
│ │ │ ├── ic_round_check_circle_24.xml
│ │ │ ├── ic_round_crop_24.xml
│ │ │ ├── ic_round_drag_handle_24.xml
│ │ │ ├── ic_round_edit_24.xml
│ │ │ ├── ic_round_emoji_emotions_24.xml
│ │ │ ├── ic_round_emoji_events_24.xml
│ │ │ ├── ic_round_emoji_flags_24.xml
│ │ │ ├── ic_round_emoji_food_beverage_24.xml
│ │ │ ├── ic_round_emoji_nature_24.xml
│ │ │ ├── ic_round_emoji_objects_24.xml
│ │ │ ├── ic_round_emoji_symbols_24.xml
│ │ │ ├── ic_round_emoji_transportation_24.xml
│ │ │ ├── ic_round_flip_camera_24.xml
│ │ │ ├── ic_round_gif_24.xml
│ │ │ ├── ic_round_location_on_24.xml
│ │ │ ├── ic_round_mode_comment_24.xml
│ │ │ ├── ic_round_pause_24.xml
│ │ │ ├── ic_round_play_arrow_24.xml
│ │ │ ├── ic_round_remove_circle_24.xml
│ │ │ ├── ic_round_reply_24.xml
│ │ │ ├── ic_round_send_24.xml
│ │ │ ├── ic_round_tune_24.xml
│ │ │ ├── ic_round_unknown_24.xml
│ │ │ ├── ic_rounded_corner_24.xml
│ │ │ ├── ic_search_24.xml
│ │ │ ├── ic_settings_backup_restore_24.xml
│ │ │ ├── ic_shutter.xml
│ │ │ ├── ic_shutter_focused.xml
│ │ │ ├── ic_shutter_normal.xml
│ │ │ ├── ic_shutter_pressed.xml
│ │ │ ├── ic_slider_24.xml
│ │ │ ├── ic_star_24.xml
│ │ │ ├── ic_star_check_24.xml
│ │ │ ├── ic_sticker_curved_outlines.xml
│ │ │ ├── ic_story_list.xml
│ │ │ ├── ic_story_viewer_list.xml
│ │ │ ├── ic_submit.xml
│ │ │ ├── ic_suggested_users.xml
│ │ │ ├── ic_unread_indicator_24.xml
│ │ │ ├── ic_video_24.xml
│ │ │ ├── ic_view_agenda_24.xml
│ │ │ ├── ic_view_grid_24.xml
│ │ │ ├── ic_volume_off_24.xml
│ │ │ ├── ic_volume_off_24_a50.xml
│ │ │ ├── ic_volume_off_24_states.xml
│ │ │ ├── ic_volume_up_24.xml
│ │ │ ├── ic_volume_up_24_a50.xml
│ │ │ ├── ic_volume_up_24_states.xml
│ │ │ ├── ic_warning.xml
│ │ │ ├── launch.xml
│ │ │ ├── launch_dark.xml
│ │ │ ├── launch_screen.xml
│ │ │ ├── lock.xml
│ │ │ ├── popup_background_exoplayer.xml
│ │ │ ├── pref_list_divider_material.xml
│ │ │ ├── recv_basket_animated.xml
│ │ │ ├── recv_ic_arrow.xml
│ │ │ ├── recv_ic_delete.xml
│ │ │ ├── recv_ic_mic.xml
│ │ │ ├── rounder_corner_bg.xml
│ │ │ ├── rounder_corner_semi_black_bg.xml
│ │ │ ├── shape_oval_light.xml
│ │ │ ├── sl_favourite_24.xml
│ │ │ └── speed_text_color_states.xml
│ │ ├── layout/
│ │ │ ├── activity_camera.xml
│ │ │ ├── activity_crash_error.xml
│ │ │ ├── activity_directory_select.xml
│ │ │ ├── activity_login.xml
│ │ │ ├── activity_main.xml
│ │ │ ├── dialog_account_switcher.xml
│ │ │ ├── dialog_create_backup.xml
│ │ │ ├── dialog_keywords_filter.xml
│ │ │ ├── dialog_opening_post.xml
│ │ │ ├── dialog_post_layout_preferences.xml
│ │ │ ├── dialog_post_view.xml
│ │ │ ├── dialog_profilepic.xml
│ │ │ ├── dialog_restore_backup.xml
│ │ │ ├── dialog_time_settings.xml
│ │ │ ├── fragment_collection_posts.xml
│ │ │ ├── fragment_comments.xml
│ │ │ ├── fragment_direct_messages_inbox.xml
│ │ │ ├── fragment_direct_messages_settings.xml
│ │ │ ├── fragment_direct_messages_thread.xml
│ │ │ ├── fragment_direct_pending_inbox.xml
│ │ │ ├── fragment_discover.xml
│ │ │ ├── fragment_favorites.xml
│ │ │ ├── fragment_feed.xml
│ │ │ ├── fragment_filters.xml
│ │ │ ├── fragment_followers_viewer.xml
│ │ │ ├── fragment_hashtag.xml
│ │ │ ├── fragment_image_edit.xml
│ │ │ ├── fragment_likes.xml
│ │ │ ├── fragment_location.xml
│ │ │ ├── fragment_notifications_viewer.xml
│ │ │ ├── fragment_profile.xml
│ │ │ ├── fragment_saved.xml
│ │ │ ├── fragment_saved_collections.xml
│ │ │ ├── fragment_search.xml
│ │ │ ├── fragment_story_list_viewer.xml
│ │ │ ├── fragment_story_viewer.xml
│ │ │ ├── fragment_topic_posts.xml
│ │ │ ├── fragment_user_search.xml
│ │ │ ├── header_follow.xml
│ │ │ ├── item_comment.xml
│ │ │ ├── item_dir_list.xml
│ │ │ ├── item_discover_topic.xml
│ │ │ ├── item_emoji_grid.xml
│ │ │ ├── item_fav_section_header.xml
│ │ │ ├── item_feed_grid.xml
│ │ │ ├── item_feed_photo.xml
│ │ │ ├── item_feed_slider.xml
│ │ │ ├── item_feed_top.xml
│ │ │ ├── item_feed_video.xml
│ │ │ ├── item_filter.xml
│ │ │ ├── item_follow.xml
│ │ │ ├── item_highlight.xml
│ │ │ ├── item_keyword.xml
│ │ │ ├── item_media.xml
│ │ │ ├── item_notification.xml
│ │ │ ├── item_post.xml
│ │ │ ├── item_pref_divider.xml
│ │ │ ├── item_search_result.xml
│ │ │ ├── item_slider_photo.xml
│ │ │ ├── item_story.xml
│ │ │ ├── item_tab_order_pref.xml
│ │ │ ├── layout_controls.xml
│ │ │ ├── layout_direct_item_options.xml
│ │ │ ├── layout_directory_chooser.xml
│ │ │ ├── layout_dm_action_log.xml
│ │ │ ├── layout_dm_animated_media.xml
│ │ │ ├── layout_dm_base.xml
│ │ │ ├── layout_dm_header.xml
│ │ │ ├── layout_dm_inbox_item.xml
│ │ │ ├── layout_dm_like.xml
│ │ │ ├── layout_dm_link.xml
│ │ │ ├── layout_dm_media.xml
│ │ │ ├── layout_dm_media_share.xml
│ │ │ ├── layout_dm_pending_user_item.xml
│ │ │ ├── layout_dm_profile.xml
│ │ │ ├── layout_dm_raven_media.xml
│ │ │ ├── layout_dm_reel_share.xml
│ │ │ ├── layout_dm_story_share.xml
│ │ │ ├── layout_dm_text.xml
│ │ │ ├── layout_dm_user_item.xml
│ │ │ ├── layout_dm_voice_media.xml
│ │ │ ├── layout_emoji_variant_popup.xml
│ │ │ ├── layout_exo_custom_controls.xml
│ │ │ ├── layout_gif_picker.xml
│ │ │ ├── layout_hashtag_details.xml
│ │ │ ├── layout_include_custom_format_info.xml
│ │ │ ├── layout_include_toolbar.xml
│ │ │ ├── layout_location_details.xml
│ │ │ ├── layout_post_view_bottom.xml
│ │ │ ├── layout_profile_details.xml
│ │ │ ├── layout_searchview.xml
│ │ │ ├── layout_video_player_with_thumbnail.xml
│ │ │ ├── pref_account_switcher.xml
│ │ │ ├── pref_auto_refresh_dm_freq.xml
│ │ │ ├── pref_more_header.xml
│ │ │ └── record_view_layout.xml
│ │ ├── layout-land/
│ │ │ └── activity_camera.xml
│ │ ├── menu/
│ │ │ ├── bottom_nav_menu.xml
│ │ │ ├── collection_posts_menu.xml
│ │ │ ├── comment_options_menu.xml
│ │ │ ├── dm_inbox_menu.xml
│ │ │ ├── dm_thread_menu.xml
│ │ │ ├── feed_menu.xml
│ │ │ ├── follow.xml
│ │ │ ├── hashtag_menu.xml
│ │ │ ├── location_menu.xml
│ │ │ ├── main_menu.xml
│ │ │ ├── menu.xml
│ │ │ ├── multi_select_download_menu.xml
│ │ │ ├── post_view_menu.xml
│ │ │ ├── profile_menu.xml
│ │ │ ├── saved.xml
│ │ │ ├── saved_collection_menu.xml
│ │ │ ├── saved_collection_select_menu.xml
│ │ │ ├── saved_viewer_menu.xml
│ │ │ ├── search.xml
│ │ │ ├── speed_menu.xml
│ │ │ ├── story_menu.xml
│ │ │ └── topic_posts_menu.xml
│ │ ├── mipmap-anydpi-v26/
│ │ │ ├── ic_launcher.xml
│ │ │ └── ic_launcher_round.xml
│ │ ├── navigation/
│ │ │ ├── direct_messages_nav_graph.xml
│ │ │ ├── discover_nav_graph.xml
│ │ │ ├── favorites_nav_graph.xml
│ │ │ ├── feed_nav_graph.xml
│ │ │ ├── more_nav_graph.xml
│ │ │ ├── notification_viewer_nav_graph.xml
│ │ │ ├── profile_nav_graph.xml
│ │ │ ├── root_nav_graph.xml
│ │ │ └── settings_nav_graph.xml
│ │ ├── raw/
│ │ │ └── emojis.json
│ │ ├── values/
│ │ │ ├── arrays.xml
│ │ │ ├── attrs.xml
│ │ │ ├── bool.xml
│ │ │ ├── color.xml
│ │ │ ├── dimens.xml
│ │ │ ├── drawables.xml
│ │ │ ├── font_certs.xml
│ │ │ ├── ids.xml
│ │ │ ├── strings.xml
│ │ │ ├── styles.xml
│ │ │ └── themes.xml
│ │ ├── values-ar/
│ │ │ ├── arrays.xml
│ │ │ └── strings.xml
│ │ ├── values-ca/
│ │ │ ├── arrays.xml
│ │ │ └── strings.xml
│ │ ├── values-cs/
│ │ │ ├── arrays.xml
│ │ │ └── strings.xml
│ │ ├── values-de/
│ │ │ ├── arrays.xml
│ │ │ └── strings.xml
│ │ ├── values-el/
│ │ │ ├── arrays.xml
│ │ │ └── strings.xml
│ │ ├── values-es/
│ │ │ ├── arrays.xml
│ │ │ └── strings.xml
│ │ ├── values-eu/
│ │ │ ├── arrays.xml
│ │ │ └── strings.xml
│ │ ├── values-fa/
│ │ │ ├── arrays.xml
│ │ │ └── strings.xml
│ │ ├── values-fr/
│ │ │ ├── arrays.xml
│ │ │ └── strings.xml
│ │ ├── values-hi/
│ │ │ ├── arrays.xml
│ │ │ └── strings.xml
│ │ ├── values-in/
│ │ │ ├── arrays.xml
│ │ │ └── strings.xml
│ │ ├── values-it/
│ │ │ ├── arrays.xml
│ │ │ └── strings.xml
│ │ ├── values-ja/
│ │ │ ├── arrays.xml
│ │ │ └── strings.xml
│ │ ├── values-kn/
│ │ │ └── arrays.xml
│ │ ├── values-ko/
│ │ │ ├── arrays.xml
│ │ │ └── strings.xml
│ │ ├── values-land/
│ │ │ └── dimens.xml
│ │ ├── values-mk/
│ │ │ ├── arrays.xml
│ │ │ └── strings.xml
│ │ ├── values-night/
│ │ │ ├── bool.xml
│ │ │ ├── color.xml
│ │ │ └── styles.xml
│ │ ├── values-nl/
│ │ │ ├── arrays.xml
│ │ │ └── strings.xml
│ │ ├── values-or/
│ │ │ ├── arrays.xml
│ │ │ └── strings.xml
│ │ ├── values-pl/
│ │ │ ├── arrays.xml
│ │ │ └── strings.xml
│ │ ├── values-pt/
│ │ │ ├── arrays.xml
│ │ │ └── strings.xml
│ │ ├── values-ru/
│ │ │ ├── arrays.xml
│ │ │ └── strings.xml
│ │ ├── values-sk/
│ │ │ ├── arrays.xml
│ │ │ └── strings.xml
│ │ ├── values-sv/
│ │ │ ├── arrays.xml
│ │ │ └── strings.xml
│ │ ├── values-tr/
│ │ │ ├── arrays.xml
│ │ │ └── strings.xml
│ │ ├── values-vi/
│ │ │ ├── arrays.xml
│ │ │ └── strings.xml
│ │ ├── values-zh-rCN/
│ │ │ ├── arrays.xml
│ │ │ └── strings.xml
│ │ ├── values-zh-rTW/
│ │ │ ├── arrays.xml
│ │ │ └── strings.xml
│ │ └── xml/
│ │ ├── backup_descriptor.xml
│ │ └── provider_paths.xml
│ └── test/
│ └── java/
│ └── awais/
│ └── instagrabber/
│ ├── LiveDataTestUtil.kt
│ ├── MainCoroutineScopeRule.kt
│ ├── common/
│ │ └── Adapters.kt
│ ├── utils/
│ │ ├── CubicInterpolationTest.java
│ │ ├── DownloadUtilsTest.java
│ │ ├── IntentUtilsTest.java
│ │ └── TextUtilsTest.java
│ └── viewmodels/
│ └── ProfileFragmentViewModelTest.kt
├── build.gradle
├── crowdin.yml
├── fastlane/
│ └── metadata/
│ └── android/
│ ├── en-US/
│ │ ├── changelogs/
│ │ │ ├── 32.txt
│ │ │ ├── 33.txt
│ │ │ ├── 36.txt
│ │ │ ├── 37.txt
│ │ │ ├── 38.txt
│ │ │ ├── 39.txt
│ │ │ ├── 40.txt
│ │ │ ├── 41.txt
│ │ │ ├── 42.txt
│ │ │ ├── 43.txt
│ │ │ ├── 44.txt
│ │ │ ├── 45.txt
│ │ │ ├── 46.txt
│ │ │ ├── 47.txt
│ │ │ ├── 48.txt
│ │ │ ├── 49.txt
│ │ │ ├── 52.txt
│ │ │ ├── 53.txt
│ │ │ ├── 54.txt
│ │ │ ├── 55.txt
│ │ │ ├── 56.txt
│ │ │ ├── 57.txt
│ │ │ ├── 60.txt
│ │ │ ├── 61.txt
│ │ │ ├── 62.txt
│ │ │ ├── 63.txt
│ │ │ ├── 64.txt
│ │ │ └── 65.txt
│ │ ├── full_description.txt
│ │ └── short_description.txt
│ └── fr-FR/
│ ├── full_description.txt
│ └── short_description.txt
├── gradle/
│ └── wrapper/
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── gradle.properties
├── gradlew
├── gradlew.bat
├── renovate.json
└── settings.gradle
================================================
FILE CONTENTS
================================================
================================================
FILE: .all-contributorsrc
================================================
{
"files": [
"README.md"
],
"imageSize": 100,
"commit": false,
"badgeTemplate": "[](#contributors)",
"contributors": [
{
"login": "austinhuang0131",
"name": "Austin Huang",
"avatar_url": "https://avatars1.githubusercontent.com/u/16656689",
"profile": "https://austinhuang.me",
"contributions": [
"code",
"doc",
"question",
"translation",
"ideas"
]
},
{
"login": "ammargitham",
"name": "Ammar Githam",
"avatar_url": "https://avatars0.githubusercontent.com/u/8017365",
"profile": "https://github.com/ammargitham",
"contributions": [
"code",
"design",
"ideas",
"maintenance",
"question"
]
},
{
"login": "zerrium",
"name": "Zerrium",
"avatar_url": "https://avatars.githubusercontent.com/u/58355441?v=4",
"profile": "https://github.com/zerrium",
"contributions": [
"code"
]
},
{
"login": "junhuicoding",
"name": "Chua Jun Hui",
"avatar_url": "https://avatars.githubusercontent.com/u/54289027?v=4",
"profile": "https://github.com/junhuicoding",
"contributions": [
"code"
]
},
{
"login": "andersonvom",
"name": "Anderson Mesquita",
"avatar_url": "https://avatars3.githubusercontent.com/u/69922?v=4",
"profile": "https://github.com/andersonvom",
"contributions": [
"code",
"bug"
]
},
{
"login": "MeLlamoPablo",
"name": "Pablo Rodríguez",
"avatar_url": "https://avatars.githubusercontent.com/u/11708035?v=4",
"profile": "https://github.com/MeLlamoPablo",
"contributions": [
"code"
]
},
{
"login": "tcely",
"name": "tcely",
"avatar_url": "https://avatars.githubusercontent.com/u/138864?v=4",
"profile": "https://github.com/tcely",
"contributions": [
"code"
]
},
{
"login": "Vonter",
"name": "Vonter",
"avatar_url": "https://avatars.githubusercontent.com/u/25414711?v=4",
"profile": "https://github.com/Vonter",
"contributions": [
"code"
]
},
{
"login": "raniapl",
"name": "Rania Pilioura",
"avatar_url": "https://avatars.githubusercontent.com/u/56370534?v=4",
"profile": "https://github.com/raniapl",
"contributions": [
"code"
]
},
{
"login": "stamatiap",
"name": "Stamatia Papageorgiou",
"avatar_url": "https://avatars.githubusercontent.com/u/57223967?v=4",
"profile": "https://github.com/stamatiap",
"contributions": [
"code",
"translation"
]
},
{
"login": "Zopieux",
"name": "Alexandre Macabies",
"avatar_url": "https://avatars.githubusercontent.com/u/81353?v=4",
"profile": "https://github.com/Zopieux",
"contributions": [
"code"
]
},
{
"login": "vojta-horanek",
"name": "Vojtěch Hořánek",
"avatar_url": "https://avatars.githubusercontent.com/u/12630566?v=4",
"profile": "https://vojtechh.eu/",
"contributions": [
"code",
"translation"
]
},
{
"login": "The-EDev",
"name": "Farook Al-Sammarraie",
"avatar_url": "https://avatars.githubusercontent.com/u/60552923?v=4",
"profile": "https://github.com/The-EDev",
"contributions": [
"code"
]
},
{
"login": "snajdovski",
"name": "Stefan Najdovski",
"avatar_url": "https://avatars2.githubusercontent.com/u/42580385?v=4",
"profile": "https://snajdovski.github.io",
"contributions": [
"design",
"translation"
]
},
{
"login": "CrazyMarvin",
"name": "CrazyMarvin",
"avatar_url": "https://avatars3.githubusercontent.com/u/15004217?v=4",
"profile": "https://github.com/CrazyMarvin",
"contributions": [
"financial"
]
},
{
"login": "KevinNThomas",
"name": "Kevin Thomas",
"avatar_url": "https://avatars2.githubusercontent.com/u/15370181",
"profile": "http://kevinthomas.dev",
"contributions": [
"financial"
]
},
{
"login": "Martin5001",
"name": "Martin Krejčí",
"avatar_url": "https://avatars.githubusercontent.com/u/35201200?v=4",
"profile": "https://github.com/Martin5001",
"contributions": [
"bug",
"ideas",
"translation"
]
},
{
"login": "Shadowspear123",
"name": "Shadowspear123",
"avatar_url": "https://avatars1.githubusercontent.com/u/50462281",
"profile": "https://github.com/Shadowspear123",
"contributions": [
"blog",
"bug",
"ideas",
"question"
]
},
{
"login": "RickyM7",
"name": "Ricardo",
"avatar_url": "https://avatars3.githubusercontent.com/u/24703825?v=4",
"profile": "https://github.com/RickyM7",
"contributions": [
"bug",
"translation"
]
},
{
"login": "Akrai",
"name": "Akrai",
"avatar_url": "https://avatars1.githubusercontent.com/u/5624597?v=4",
"profile": "https://github.com/Akrai",
"contributions": [
"ideas",
"translation"
]
},
{
"login": "avtkal",
"name": "avtkal",
"avatar_url": "https://avatars.githubusercontent.com/u/63205014?v=4",
"profile": "https://github.com/avtkal",
"contributions": [
"translation"
]
},
{
"login": "cizordj",
"name": "Cézar Augusto",
"avatar_url": "https://avatars2.githubusercontent.com/u/32869222?v=4",
"profile": "https://github.com/cizordj",
"contributions": [
"translation"
]
},
{
"login": "dimitrist19",
"name": "Dimitris T",
"avatar_url": "https://avatars.githubusercontent.com/u/56406468?v=4",
"profile": "https://github.com/dimitrist19",
"contributions": [
"translation"
]
},
{
"login": "farzadx",
"name": "farzadx",
"avatar_url": "https://avatars2.githubusercontent.com/u/70059397?v=4",
"profile": "https://github.com/farzadx",
"contributions": [
"translation"
]
},
{
"login": "faydin",
"name": "Fatih Aydın",
"avatar_url": "https://avatars2.githubusercontent.com/u/22706676?v=4",
"profile": "https://github.com/faydin",
"contributions": [
"translation"
]
},
{
"login": "fouze555",
"name": "fouze555",
"avatar_url": "https://avatars3.githubusercontent.com/u/71935341?v=4",
"profile": "https://github.com/fouze555",
"contributions": [
"translation"
]
},
{
"login": "Galang23",
"name": "Galang23",
"avatar_url": "https://avatars3.githubusercontent.com/u/13700948",
"profile": "https://github.com/Galang23",
"contributions": [
"translation"
]
},
{
"login": "initdebugs",
"name": "Initdebugs",
"avatar_url": "https://avatars0.githubusercontent.com/u/75781464?v=4",
"profile": "https://github.com/initdebugs",
"contributions": [
"translation"
]
},
{
"login": "CrafterSvK",
"name": "Jakub Janek",
"avatar_url": "https://avatars3.githubusercontent.com/u/8365659?v=4",
"profile": "https://janek.xyz/",
"contributions": [
"translation"
]
},
{
"login": "GenosseFlosse",
"name": "GenosseFlosse",
"avatar_url": "https://avatars.githubusercontent.com/u/59205524?v=4",
"profile": "https://github.com/GenosseFlosse",
"contributions": [
"translation"
]
},
{
"login": "kernoeb",
"name": "kernoeb",
"avatar_url": "https://avatars3.githubusercontent.com/u/24623168",
"profile": "https://becauseofprog.fr/",
"contributions": [
"translation"
]
},
{
"login": "Lego8486",
"name": "Ten_Lego",
"avatar_url": "https://avatars1.githubusercontent.com/u/47414485",
"profile": "https://github.com/Lego8486",
"contributions": [
"translation"
]
},
{
"login": "MoaufmKlo",
"name": "MoaufmKlo",
"avatar_url": "https://avatars1.githubusercontent.com/u/45636897",
"profile": "https://github.com/MoaufmKlo",
"contributions": [
"translation"
]
},
{
"login": "nalinalini",
"name": "nalinalini",
"avatar_url": "https://avatars0.githubusercontent.com/u/65640431?v=4",
"profile": "https://github.com/nalinalini",
"contributions": [
"translation"
]
},
{
"login": "peterge1998",
"name": "peterge1998",
"avatar_url": "https://avatars2.githubusercontent.com/u/47355238",
"profile": "https://github.com/peterge1998",
"contributions": [
"translation"
]
},
{
"login": "PierreM0",
"name": "PierreM0",
"avatar_url": "https://avatars3.githubusercontent.com/u/71077853?v=4",
"profile": "https://github.com/PierreM0",
"contributions": [
"translation"
]
},
{
"login": "Pyrobauve",
"name": "Pyrobauve",
"avatar_url": "https://avatars.githubusercontent.com/u/48654473?v=4",
"profile": "https://github.com/Pyrobauve",
"contributions": [
"translation"
]
},
{
"login": "RAMAR-RAR",
"name": "RAMAR-RAR",
"avatar_url": "https://avatars3.githubusercontent.com/u/47423745",
"profile": "https://github.com/RAMAR-RAR",
"contributions": [
"translation"
]
},
{
"login": "rohang02",
"name": "rohang02",
"avatar_url": "https://avatars3.githubusercontent.com/u/47921164?v=4",
"profile": "https://github.com/rohang02",
"contributions": [
"translation"
]
},
{
"login": "retiolus",
"name": "retiolus",
"avatar_url": "https://avatars1.githubusercontent.com/u/65604466?v=4",
"profile": "https://github.com/retiolus",
"contributions": [
"translation"
]
},
{
"login": "rex07",
"name": "Rex_sa",
"avatar_url": "https://avatars.githubusercontent.com/u/13156001?v=4",
"profile": "https://github.com/rex07",
"contributions": [
"translation"
]
},
{
"login": "rikishi0071",
"name": "rikishi0071",
"avatar_url": "https://avatars3.githubusercontent.com/u/18183855?v=4",
"profile": "https://github.com/rikishi0071",
"contributions": [
"translation"
]
},
{
"login": "sandboiii",
"name": "Alexey Peschany",
"avatar_url": "https://avatars.githubusercontent.com/u/17468894?v=4",
"profile": "https://gitlab.com/sandboiii",
"contributions": [
"translation"
]
},
{
"login": "Sitavi",
"name": "Sitavi",
"avatar_url": "https://avatars.githubusercontent.com/u/80586127?v=4",
"profile": "https://github.com/Sitavi",
"contributions": [
"translation"
]
},
{
"login": "Still34",
"name": "Still Hsu",
"avatar_url": "https://avatars2.githubusercontent.com/u/5843208?v=4",
"profile": "https://stillu.cc/",
"contributions": [
"translation"
]
},
{
"login": "Umeaboy",
"name": "Kristoffer Grundström",
"avatar_url": "https://avatars.githubusercontent.com/u/714473?v=4",
"profile": "https://github.com/Umeaboy",
"contributions": [
"translation"
]
},
{
"login": "wagnim",
"name": "wagnim",
"avatar_url": "https://avatars0.githubusercontent.com/u/30241419",
"profile": "https://github.com/wagnim",
"contributions": [
"translation"
]
},
{
"login": "wokija",
"name": "wokija",
"avatar_url": "https://avatars.githubusercontent.com/u/14982166?v=4",
"profile": "https://github.com/wokija",
"contributions": [
"translation"
]
},
{
"login": "ysakamoto",
"name": "ysakamoto",
"avatar_url": "https://avatars3.githubusercontent.com/u/1331642?v=4",
"profile": "https://github.com/ysakamoto",
"contributions": [
"translation"
]
},
{
"login": "ZDVokoun",
"name": "ZDVokoun",
"avatar_url": "https://avatars.githubusercontent.com/u/76393152?v=4",
"profile": "https://github.com/ZDVokoun",
"contributions": [
"translation"
]
},
{
"login": "2hot2exist",
"name": "2hot2exist",
"avatar_url": "https://avatars.githubusercontent.com/u/84233003?v=4",
"profile": "https://github.com/2hot2exist",
"contributions": [
"translation"
]
}
],
"contributorsPerLine": 6,
"projectName": "barinsta",
"projectOwner": "austinhuang0131",
"repoType": "github",
"repoHost": "https://github.com",
"skipCi": true,
"types": {
"translation": {
"symbol": "🌍",
"description": "Translation",
"link": "https://crowdin.com/project/instagrabber"
}
},
"commitConvention": "none"
}
================================================
FILE: .codebeatsettings
================================================
{
"JAVA": {
"TOO_MANY_IVARS": [8, 10, 20, 30]
}
}
================================================
FILE: .github/CODE_OF_CONDUCT.md
================================================
# Contributor Code of Conduct
This project adheres to No Code of Conduct. We are all adults. We accept anyone's contributions. Nothing else matters.
For more information please visit the [No Code of Conduct](https://github.com/domgetter/NCoC) homepage.
================================================
FILE: .github/CONTRIBUTING.md
================================================
## WARNING
* All forks must respect [GPLv3](https://www.gnu.org/licenses/gpl-3.0.html). Please report violations in Issues or [confidentially](https://austinhuang.me/#hey-you-look-cool).
* Some people have asked me about publishing a "commercial" fork that serves ads. However, if you do properly comply with GPLv3, users would realize that the original non-commercial version exists and, in turn, abandon your fork. And if you don't comply, you get copystriked.
* Although publishing a fork is allowed by license, it is strongly discouraged to do so as it divides the effort and creates confusion (as well as for the reason above). It is, therefore, recommended to send a pull request back to us, so that the larger community can enjoy your improvement. (This does not apply if you're adapting this app for a different platform other than Instagram.)
## Contributing
Thank you for your interest in Barinsta!
Our vision is an open source true alternative of the official Instagram app. It is Austin's pursuit of a libre life that lead him to this app during its abandonment, and it was one unresolved bug that made him have the enthusiasm in implementing numerous features for this app, despite having 0 knowledge of Java beforehand.
As we grow in popularity, it becomes apparent that we are short on hands. Every contribution counts!
## I want to help coding it!
Great!
Generally, we want to imitate features in the actual Instagram app. There are many Instagram private API repositories on GitHub for you to refer to. Note that you should minimize POST: If a job should be done with GET, then there has to be a GET endpoint. (Indeed, sometimes you need multiple repositories for reference.)
As long as you have tested your version (please indicate device and API version) and make sure it works, then you can submit a PR! Large UI changes have to be voted on by the community, so it would be helpful to upload some screenshots.
Check errors are for reference only. Try to minimize them, but usually they don't make a big difference.
**NEVER touch the l10n-master branch.** It's automatically managed by Crowdin.
The legacy branch is no longer maintained.
### I can't code Java, but I want to!
Fun fact: Austin took over this project and learned Java on the fly (I'm not joking, I only do JavaScript before taking this over).
Even though Java is quite annoying, it is still possible to learn it by trying to understand what these code do (Easier if you have coding experience in other languages).
If you have questions, don't be afraid to ask for help from any current maintainer!
## I found a bug!
**Please read [FAQ](https://barinsta.austinhuang.me/en/latest/faq.html) first.**
Bugs are inevitable during active development, as nobody can cover all the possible test cases.
You can either email your crash dump to `barinsta@austinhuang.me` (The crash reporter will fill in this address for you) or create a GitHub issue. If you're on GitHub, please follow the template. If you're reporting by email, your email address will be published in the GitHub issue. You can contact me [privately](https://austinhuang.me/#hey-you-look-cool) or [through support channels](https://barinsta.austinhuang.me/en/latest/#contact-us) to remove it.
Generally, reporting bugs directly in support channels is not recommended, as they can be difficult to find.
### I want to help... in some other way.
You can...
* translate it [](https://crowdin.com/project/instagrabber)
* promote it (reddit [r/AndroidApps](https://www.reddit.com/r/androidapps/comments/i30tpp/instagrabber_an_open_source_instagram_client/), YouTube [HowToMen](https://www.youtube.com/watch?v=1Um2ZJG_mB4), [Ekşi Sözlük](https://eksisozluk.com/instagrabber--6643143))
* star it [](https://github.com/austinhuang0131/barinsta/stargazers)
Happy contributing!
================================================
FILE: .github/FUNDING.yml
================================================
# These are supported funding model platforms
github: austinhuang0131
patreon: # Replace with a single Patreon username
open_collective: # Replace with a single Open Collective username
ko_fi: austinhuang
tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
liberapay: austinhuang
issuehunt: # Replace with a single IssueHunt username
otechie: # Replace with a single Otechie username
custom: ["https://austinhuang.me/donate"]
================================================
FILE: .github/ISSUE_TEMPLATE/ban_report.md
================================================
---
name: Ban report
about: If you suspect a ban by Instagram due to your usage of this app, you MUST report it.
title: "[BAN]"
labels: BAN REPORT
assignees: 'austinhuang0131'
---
<!-- Write "x" in the brackets to check -->
## Answer honestly. All boxes must be checked for this report to be considered.
- [ ] My app is on the latest version available on GitHub or F-Droid. I understand that any other version is not supported.
- [ ] I certify that all actions I have performed on the app constitute human behaviour. I am using the app responsibly and in a way identical to using the official app. Specifically, I did not perform botting or automated key clicks.
- [ ] I have considered other possible reasons for my ban, and I cannot find any substantial claim other than the usage of this app.
- [ ] Instagram has indicated that this is a permanent ban, not a required password change or a temporary lock.
## Answer honestly. Check accordingly to your situation.
- [ ] I had prior rule violations on Instagram, specifically:
- [ ] I have admitted the use of Barinsta on Instagram.
- [ ] I have admitted the use of Barinsta to a friend who uses Instagram.
- [ ] I have modified the source code of the app that I use, other than what is present in this repo. Specifically:
## Describe your case, including your usage pattern, but without private information.
## Provide your communication with Instagram, without private information of you.
================================================
FILE: .github/ISSUE_TEMPLATE/bug_report.md
================================================
---
name: Bug report
about: App crashing? You seeing a confusing error message? Report them here!
title: "[BUG]"
labels: bug
assignees: ''
---
<!-- Frequent reporters can ignore this template as long as it's clear and concise. -->
- [ ] My app is *at least* at the current release version. I understand that any versions before that is not supported.
- [ ] I have read [the FAQ](https://barinsta.austinhuang.me/en/latest/faq.html).
<!--
Describe the bug here. Don't stress too much, but do include the key points.
-->
## Steps
<!--
1. ...
2. ...
3. See error...
-->
## Environment
- Device:
- Android version:
## Additional info
<!-- If you have a crash dump, paste it here. -->
================================================
FILE: .github/ISSUE_TEMPLATE/config.yml
================================================
blank_issues_enabled: true
contact_links:
- name: Community Chatrooms
url: https://barinsta.austinhuang.me/en/latest/chat.html
about: Chat with developers and users alike!
- name: /r/Barinsta
url: https://reddit.com/r/barinsta
about: Start a discussion on our subreddit!
- name: Repository Discussions
url: https://github.com/austinhuang0131/barinsta/discussions
about: Start a discussion in this repo!
================================================
FILE: .github/ISSUE_TEMPLATE/feature_request.md
================================================
---
name: Feature request
about: Want new features? Ask them here!
title: "[FTR]"
labels: enhancement
assignees: ''
---
<!--
Large features will either take a lot of time or another maintainer
Just remember to be patient, and if you have skills, try DIY
Also write title after [FTR]
-->
**Is your feature request related to a problem? Please describe.**
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
**Describe the solution you'd like**
A clear and concise description of what you want to happen.
**Additional context**
Add any other context or screenshots about the feature request here.
================================================
FILE: .github/issue_label_bot.yaml
================================================
label-alias:
bug: 'bug'
feature_request: 'enhancement'
question: 'question'
================================================
FILE: .github/workflows/github_nightly_release.yml
================================================
name: Github nightly
on:
schedule:
# * is a special character in YAML so you have to quote this string
- cron: '27 10 * * *' # Everyday at 10:27:00
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v2
- name: set up JDK 1.8
uses: actions/setup-java@v2
with:
distribution: 'zulu'
java-version: '8'
- name: Grant execute permission for gradlew
run: chmod +x gradlew
- name: Build Github unsigned apk
run: ./gradlew assembleGithubRelease --stacktrace --project-prop pre --project-prop split
- name: Sign APK
uses: ammargitham/sign-android-release@v1.1.1
# ID used to access action output
id: sign_app
with:
releaseDirectory: app/build/outputs/apk/github/release
signingKeyBase64: ${{ secrets.SIGNING_KEY }}
alias: ${{ secrets.ALIAS }}
keyStorePassword: ${{ secrets.KEY_STORE_PASSWORD }}
keyPassword: ${{ secrets.KEY_PASSWORD }}
- name: Get current date and time
id: date
run: echo "::set-output name=date::$(date +'%Y%m%d_%H%M%S')"
# Create artifact
- name: Create apk artifact
uses: actions/upload-artifact@v2
with:
name: barinsta_nightly_${{ steps.date.outputs.date }}
# path: ${{steps.sign_app.outputs.signedReleaseFile}}
path: app/build/outputs/apk/github/release/*-signed.apk
# Send success notification
- name: Send success Telegram notification
if: ${{ success() }}
uses: appleboy/telegram-action@master
with:
to: ${{ secrets.TELEGRAM_BUILDS_CHANNEL_TO }}
token: ${{ secrets.TELEGRAM_BUILDS_BOT_TOKEN }}
message: "${{ github.workflow }} ${{ github.job }} #${{ github.run_number }} completed successfully.\nhttps://github.com/${{github.repository}}/actions/runs/${{github.run_id}}"
# document: ${{steps.sign_app.outputs.signedReleaseFile}}
document: app/build/outputs/apk/github/release/*-signed.apk
# Send failure notification
- name: Send failure Telegram notification
if: ${{ failure() }}
uses: appleboy/telegram-action@master
with:
to: ${{ secrets.TELEGRAM_BUILDS_CHANNEL_TO }}
token: ${{ secrets.TELEGRAM_BUILDS_BOT_TOKEN }}
message: "${{ github.workflow }} ${{ github.job }} #${{ github.run_number }} failed.\nhttps://github.com/${{github.repository}}/actions/runs/${{github.run_id}}"
================================================
FILE: .github/workflows/github_pre_release.yml
================================================
name: Github pre-release
on: workflow_dispatch
# push:
# branches: [ master ]
# pull_request:
# branches: [ master ]
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v2
- name: set up JDK 1.8
uses: actions/setup-java@v2
with:
distribution: 'zulu'
java-version: '8'
- name: Grant execute permission for gradlew
run: chmod +x gradlew
- name: Build Github unsigned pre-release apk
run: ./gradlew assembleGithubRelease --stacktrace --project-prop pre --project-prop split
- name: Sign APK
uses: ammargitham/sign-android-release@v1.1.1
# ID used to access action output
id: sign_app
with:
releaseDirectory: app/build/outputs/apk/github/release
signingKeyBase64: ${{ secrets.SIGNING_KEY }}
alias: ${{ secrets.ALIAS }}
keyStorePassword: ${{ secrets.KEY_STORE_PASSWORD }}
keyPassword: ${{ secrets.KEY_PASSWORD }}
- name: Get current date and time
id: date
run: echo "::set-output name=date::$(date +'%Y%m%d_%H%M%S')"
# Create artifact
- name: Create apk artifact
uses: actions/upload-artifact@v2
with:
name: barinsta_pre-release_${{ steps.date.outputs.date }}
# path: ${{steps.sign_app.outputs.signedReleaseFile}}
path: app/build/outputs/apk/github/release/*-signed.apk
# Send success notification
- name: Send success Telegram notification
if: ${{ success() }}
uses: appleboy/telegram-action@master
with:
to: ${{ secrets.TELEGRAM_BUILDS_CHANNEL_TO }}
token: ${{ secrets.TELEGRAM_BUILDS_BOT_TOKEN }}
message: "${{ github.workflow }} ${{ github.job }} #${{ github.run_number }} completed successfully.\nURL: https://github.com/${{github.repository}}/actions/runs/${{github.run_id}}"
# document: ${{steps.sign_app.outputs.signedReleaseFile}}
document: app/build/outputs/apk/github/release/*-signed.apk
# Send failure notification
- name: Send failure Telegram notification
if: ${{ failure() }}
uses: appleboy/telegram-action@master
with:
to: ${{ secrets.TELEGRAM_BUILDS_CHANNEL_TO }}
token: ${{ secrets.TELEGRAM_BUILDS_BOT_TOKEN }}
message: "${{ github.workflow }} ${{ github.job }} #${{ github.run_number }} failed.\nURL: https://github.com/${{github.repository}}/actions/runs/${{github.run_id}}"
================================================
FILE: .github/workflows/label-bugs.yml
================================================
name: Label bugs
on:
issues:
types: [opened]
jobs:
add-labels:
runs-on: ubuntu-latest
if: contains(github.event.issue.body, 'New Trace collected:') == true
steps:
- name: Add labels
uses: actions-cool/issues-helper@v2.2.1
with:
actions: 'add-labels'
token: ${{ secrets.GITHUB_TOKEN }}
issue-number: ${{ github.event.issue.number }}
labels: 'bug'
- name: Remove runs
uses: GongT/cancel-previous-workflows@master
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
DELETE: 'yes'
================================================
FILE: .github/workflows/label-duplicates.yml
================================================
name: Label duplicates
on:
issue_comment:
types: [created]
jobs:
add-labels:
runs-on: ubuntu-latest
if: contains(github.event.comment.body, 'Duplicate of') == true
steps:
- name: Add labels
uses: actions-cool/issues-helper@v2.2.1
with:
actions: 'add-labels'
token: ${{ secrets.GITHUB_TOKEN }}
issue-number: ${{ github.event.issue.number }}
labels: 'duplicate'
- name: Remove runs
uses: GongT/cancel-previous-workflows@master
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
DELETE: 'yes'
================================================
FILE: .gitignore
================================================
*.iml
.gradle
/local.properties
/.idea/caches
/.idea/libraries
/.idea/modules.xml
/.idea/markdown-navigator.xml
/.idea/markdown-navigator-enh.xml
/.idea/workspace.xml
/.idea/navEditor.xml
/.idea/assetWizardSettings.xml
/.idea/git_toolbox_prj.xml
/.idea/dbnavigator.xml
.DS_Store
/build
/captures
.externalNativeBuild
.cxx
app/release
/sentry.properties
/app/fdroid/
/app/github/
/repo
/.fdroid.yml
================================================
FILE: .idea/.gitignore
================================================
# Default ignored files
/shelf/
/dictionaries/
================================================
FILE: .idea/.name
================================================
Barinsta
================================================
FILE: .idea/codeStyles
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectCodeStyleConfiguration">
<code_scheme name="Project" version="173">
<codeStyleSettings language="XML">
<indentOptions>
<option name="CONTINUATION_INDENT_SIZE" value="4" />
</indentOptions>
<arrangement>
<rules>
<section>
<rule>
<match>
<AND>
<NAME>xmlns:android</NAME>
<XML_ATTRIBUTE />
<XML_NAMESPACE>^$</XML_NAMESPACE>
</AND>
</match>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>xmlns:.*</NAME>
<XML_ATTRIBUTE />
<XML_NAMESPACE>^$</XML_NAMESPACE>
</AND>
</match>
<order>BY_NAME</order>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>.*:id</NAME>
<XML_ATTRIBUTE />
<XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
</AND>
</match>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>.*:name</NAME>
<XML_ATTRIBUTE />
<XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
</AND>
</match>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>name</NAME>
<XML_ATTRIBUTE />
<XML_NAMESPACE>^$</XML_NAMESPACE>
</AND>
</match>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>style</NAME>
<XML_ATTRIBUTE />
<XML_NAMESPACE>^$</XML_NAMESPACE>
</AND>
</match>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>.*</NAME>
<XML_ATTRIBUTE />
<XML_NAMESPACE>^$</XML_NAMESPACE>
</AND>
</match>
<order>BY_NAME</order>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>.*</NAME>
<XML_ATTRIBUTE />
<XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
</AND>
</match>
<order>ANDROID_ATTRIBUTE_ORDER</order>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>.*</NAME>
<XML_ATTRIBUTE />
<XML_NAMESPACE>.*</XML_NAMESPACE>
</AND>
</match>
<order>BY_NAME</order>
</rule>
</section>
</rules>
</arrangement>
</codeStyleSettings>
</code_scheme>
</component>
</project>
================================================
FILE: .idea/compiler.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="CompilerConfiguration">
<bytecodeTargetLevel target="11" />
</component>
</project>
================================================
FILE: .idea/gradle.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="GradleMigrationSettings" migrationVersion="1" />
<component name="GradleSettings">
<option name="linkedExternalProjectsSettings">
<GradleProjectSettings>
<option name="testRunner" value="PLATFORM" />
<option name="distributionType" value="DEFAULT_WRAPPED" />
<option name="externalProjectPath" value="$PROJECT_DIR$" />
<option name="modules">
<set>
<option value="$PROJECT_DIR$" />
<option value="$PROJECT_DIR$/app" />
</set>
</option>
<option name="resolveModulePerSourceSet" value="false" />
<option name="useQualifiedModuleNames" value="true" />
</GradleProjectSettings>
</option>
</component>
</project>
================================================
FILE: .idea/inspectionProfiles/profiles_settings.xml
================================================
<component name="InspectionProjectProfileManager">
<settings>
<option name="PROJECT_PROFILE" value="Default" />
<option name="USE_PROJECT_PROFILE" value="false" />
<version value="1.0" />
</settings>
</component>
================================================
FILE: .idea/jarRepositories.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="RemoteRepositoriesConfiguration">
<remote-repository>
<option name="id" value="central" />
<option name="name" value="Maven Central repository" />
<option name="url" value="https://repo1.maven.org/maven2" />
</remote-repository>
<remote-repository>
<option name="id" value="jboss.community" />
<option name="name" value="JBoss Community repository" />
<option name="url" value="https://repository.jboss.org/nexus/content/repositories/public/" />
</remote-repository>
<remote-repository>
<option name="id" value="MavenRepo" />
<option name="name" value="MavenRepo" />
<option name="url" value="https://repo.maven.apache.org/maven2/" />
</remote-repository>
<remote-repository>
<option name="id" value="BintrayJCenter" />
<option name="name" value="BintrayJCenter" />
<option name="url" value="https://jcenter.bintray.com/" />
</remote-repository>
<remote-repository>
<option name="id" value="maven" />
<option name="name" value="maven" />
<option name="url" value="https://jitpack.io" />
</remote-repository>
<remote-repository>
<option name="id" value="Google" />
<option name="name" value="Google" />
<option name="url" value="https://dl.google.com/dl/android/maven2/" />
</remote-repository>
<remote-repository>
<option name="id" value="maven" />
<option name="name" value="maven" />
<option name="url" value="http://maven.geotoolkit.org/" />
</remote-repository>
<remote-repository>
<option name="id" value="maven" />
<option name="name" value="maven" />
<option name="url" value="https://www.jitpack.io" />
</remote-repository>
</component>
</project>
================================================
FILE: .idea/misc.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ExternalStorageConfigurationManager" enabled="true" />
<component name="NullableNotNullManager">
<option name="myDefaultNullable" value="androidx.annotation.Nullable" />
<option name="myDefaultNotNull" value="androidx.annotation.NonNull" />
<option name="myNullables">
<value>
<list size="12">
<item index="0" class="java.lang.String" itemvalue="org.jetbrains.annotations.Nullable" />
<item index="1" class="java.lang.String" itemvalue="javax.annotation.Nullable" />
<item index="2" class="java.lang.String" itemvalue="javax.annotation.CheckForNull" />
<item index="3" class="java.lang.String" itemvalue="edu.umd.cs.findbugs.annotations.Nullable" />
<item index="4" class="java.lang.String" itemvalue="android.support.annotation.Nullable" />
<item index="5" class="java.lang.String" itemvalue="androidx.annotation.Nullable" />
<item index="6" class="java.lang.String" itemvalue="android.annotation.Nullable" />
<item index="7" class="java.lang.String" itemvalue="androidx.annotation.RecentlyNullable" />
<item index="8" class="java.lang.String" itemvalue="org.checkerframework.checker.nullness.qual.Nullable" />
<item index="9" class="java.lang.String" itemvalue="org.checkerframework.checker.nullness.compatqual.NullableDecl" />
<item index="10" class="java.lang.String" itemvalue="org.checkerframework.checker.nullness.compatqual.NullableType" />
<item index="11" class="java.lang.String" itemvalue="com.android.annotations.Nullable" />
</list>
</value>
</option>
<option name="myNotNulls">
<value>
<list size="11">
<item index="0" class="java.lang.String" itemvalue="org.jetbrains.annotations.NotNull" />
<item index="1" class="java.lang.String" itemvalue="javax.annotation.Nonnull" />
<item index="2" class="java.lang.String" itemvalue="edu.umd.cs.findbugs.annotations.NonNull" />
<item index="3" class="java.lang.String" itemvalue="android.support.annotation.NonNull" />
<item index="4" class="java.lang.String" itemvalue="androidx.annotation.NonNull" />
<item index="5" class="java.lang.String" itemvalue="android.annotation.NonNull" />
<item index="6" class="java.lang.String" itemvalue="androidx.annotation.RecentlyNonNull" />
<item index="7" class="java.lang.String" itemvalue="org.checkerframework.checker.nullness.qual.NonNull" />
<item index="8" class="java.lang.String" itemvalue="org.checkerframework.checker.nullness.compatqual.NonNullDecl" />
<item index="9" class="java.lang.String" itemvalue="org.checkerframework.checker.nullness.compatqual.NonNullType" />
<item index="10" class="java.lang.String" itemvalue="com.android.annotations.NonNull" />
</list>
</value>
</option>
</component>
<component name="ProjectRootManager" version="2" languageLevel="JDK_11" default="true" project-jdk-name="1.8" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/build/classes" />
</component>
<component name="ProjectType">
<option name="id" value="Android" />
</component>
</project>
================================================
FILE: .idea/render.experimental.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="RenderSettings">
<option name="showDecorations" value="true" />
</component>
</project>
================================================
FILE: .idea/runConfigurations/app.xml
================================================
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="app" type="AndroidRunConfigurationType" factoryName="Android App" activateToolWindowBeforeRun="false">
<module name="InstaGrabber.app" />
<option name="DEPLOY" value="true" />
<option name="DEPLOY_APK_FROM_BUNDLE" value="false" />
<option name="DEPLOY_AS_INSTANT" value="false" />
<option name="ARTIFACT_NAME" value="" />
<option name="PM_INSTALL_OPTIONS" value="" />
<option name="ALL_USERS" value="false" />
<option name="DYNAMIC_FEATURES_DISABLED_LIST" value="" />
<option name="ACTIVITY_EXTRA_FLAGS" value="" />
<option name="MODE" value="default_activity" />
<option name="CLEAR_LOGCAT" value="false" />
<option name="SHOW_LOGCAT_AUTOMATICALLY" value="false" />
<option name="SKIP_NOOP_APK_INSTALLATIONS" value="true" />
<option name="FORCE_STOP_RUNNING_APP" value="true" />
<option name="TARGET_SELECTION_MODE" value="DEVICE_AND_SNAPSHOT_COMBO_BOX" />
<option name="SELECTED_CLOUD_MATRIX_CONFIGURATION_ID" value="-1" />
<option name="SELECTED_CLOUD_MATRIX_PROJECT_ID" value="" />
<option name="DEBUGGER_TYPE" value="Auto" />
<Auto>
<option name="USE_JAVA_AWARE_DEBUGGER" value="false" />
<option name="SHOW_STATIC_VARS" value="true" />
<option name="WORKING_DIR" value="" />
<option name="TARGET_LOGGING_CHANNELS" value="lldb process:gdb-remote packets" />
<option name="SHOW_OPTIMIZED_WARNING" value="true" />
</Auto>
<Hybrid>
<option name="USE_JAVA_AWARE_DEBUGGER" value="false" />
<option name="SHOW_STATIC_VARS" value="true" />
<option name="WORKING_DIR" value="" />
<option name="TARGET_LOGGING_CHANNELS" value="lldb process:gdb-remote packets" />
<option name="SHOW_OPTIMIZED_WARNING" value="true" />
</Hybrid>
<Java />
<Native>
<option name="USE_JAVA_AWARE_DEBUGGER" value="false" />
<option name="SHOW_STATIC_VARS" value="true" />
<option name="WORKING_DIR" value="" />
<option name="TARGET_LOGGING_CHANNELS" value="lldb process:gdb-remote packets" />
<option name="SHOW_OPTIMIZED_WARNING" value="true" />
</Native>
<Profilers>
<option name="ADVANCED_PROFILING_ENABLED" value="false" />
<option name="STARTUP_PROFILING_ENABLED" value="false" />
<option name="STARTUP_CPU_PROFILING_ENABLED" value="false" />
<option name="STARTUP_CPU_PROFILING_CONFIGURATION_NAME" value="Sample Java Methods" />
<option name="STARTUP_NATIVE_MEMORY_PROFILING_ENABLED" value="false" />
<option name="NATIVE_MEMORY_SAMPLE_RATE_BYTES" value="2048" />
</Profilers>
<option name="DEEP_LINK" value="" />
<option name="ACTIVITY_CLASS" value="awais.instagrabber.activities.MainActivity" />
<option name="SEARCH_ACTIVITY_IN_GLOBAL_SCOPE" value="false" />
<option name="SKIP_ACTIVITY_VALIDATION" value="false" />
<method v="2">
<option name="Android.Gradle.BeforeRunTask" enabled="true" />
</method>
</configuration>
</component>
================================================
FILE: .idea/runConfigurations.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="RunConfigurationProducerService">
<option name="ignoredProducers">
<set>
<option value="com.android.tools.idea.compose.preview.runconfiguration.ComposePreviewRunConfigurationProducer" />
<option value="org.jetbrains.plugins.gradle.execution.test.runner.AllInPackageGradleConfigurationProducer" />
<option value="org.jetbrains.plugins.gradle.execution.test.runner.TestClassGradleConfigurationProducer" />
<option value="org.jetbrains.plugins.gradle.execution.test.runner.TestMethodGradleConfigurationProducer" />
</set>
</option>
</component>
</project>
================================================
FILE: .idea/vcs.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="" vcs="Git" />
</component>
</project>
================================================
FILE: .project
================================================
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>Barinsta</name>
<comment>Project instagrabber created by Buildship.</comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.buildship.core.gradleprojectbuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.buildship.core.gradleprojectnature</nature>
</natures>
<filteredResources>
<filter>
<id>0</id>
<name></name>
<type>30</type>
<matcher>
<id>org.eclipse.core.resources.regexFilterMatcher</id>
<arguments>node_modules|.git|__CREATED_BY_JAVA_LANGUAGE_SERVER__</arguments>
</matcher>
</filter>
</filteredResources>
</projectDescription>
================================================
FILE: .settings/org.eclipse.buildship.core.prefs
================================================
arguments=
auto.sync=false
build.scans.enabled=false
connection.gradle.distribution=GRADLE_DISTRIBUTION(WRAPPER)
connection.project.dir=
eclipse.preferences.version=1
gradle.user.home=
java.home=/Library/Java/JavaVirtualMachines/jdk-12.0.1.jdk/Contents/Home
jvm.arguments=
offline.mode=false
override.workspace.settings=true
show.console.view=true
show.executions.view=true
================================================
FILE: CHANGELOG
================================================
v15.9 to v16.5: https://gitlab.com/AwaisKing/instagrabber/-/releases
From v16.6: https://github.com/austinhuang0131/barinsta/releases
v15.9
note: there will be no F-Droid updates from this version (v15.9) and onward, download updates from repo's Releases page.
+ added user stories in Feed
+ added frame to currently showing slider item
+ removed tap to pause/resume from Post viewer, replaced with controller
+ fixed swipe not working when posts are opened from stories
+ fixed comments not showing for slider items
v15.8
+ added user's website in profile
+ fixed caption mentions length (@kernoeb)
+ fixed some translations (@kernoeb)
+ fixd feed captions merging with "... more"
v15.4
+ ADDED FRENCH AND SPANISH!!!
+-> Huge thanks to @kernoeb (Telegram) for French translation and @sguinetti (GitLab) for Spanish translation!!
+ added custom post time format support!
+ fixed flickering after changing settings
+ fixed posts not showing after searching from a private profile
+ fixed stories and profile pictures not downloading in user folders even when option was enabled
+ fixed issues with feed, discover and post viewer
+ fixed search suggestions crashes
v15.2
+ fixed feed video not pausing when opened in post viewer
+ added 1 new profile picture view mode
+ added fields in LogCollector to better understand how things went wrong
+ better comments, story, feed, discover and suggestion fetchers
v15.0
+ added support for Instagram.com urls! (:
+ added "Downloaded" check on posts if they've already been downloaded (as per suggestion)
+ fixed highlights scrolling issues
+ fixed comments issues
+ fixed posts weren't showing after searching anything from a private account
+ fixed suggestions not showing sometimes
+ fixed Stories viewer swipe issues
+ fixed Import/Export dialog not showing on old phones
+ added user's name in suggestions search list
+ added comment likes in Comments viewer
+ sending logs won't add empty logs to archive anymore!
+ fixed no new line in logs
+ handled Login WebView lifecycles
+ a better way of handling highlight swipes
+ removed useless code parts
v14.5
+ added changelog after update
+ added swipe support in both Discover/Explore and Feed pages
+ added Send Logs button in Settings to send logs when something doesn't work
+ added clickable user profile in Post Viewer
+ fixed weirdly collapsing toolbar when toolbar is shown at the top
v14.0
+ added theme selection support
+ added import/export settings, favorites and logins functionality (thanks to Airikr [@edgren] on Telegram)
+ added support for downloading slider items from User Feed page
+ added support for usernames and hashtags in user's biography/about text
+ added multiple selection in Discover/Explore page
+ added post date for feed items
+ added some more date formats
+ copyable feed item caption (long tap)
+ fixed late refresh indicator in Followers/Following comparison mode
+ changed feed item size to squares
+ fixed some caption text issues having mentions and hashtags
+ removed clipboard listener (stopped working after some changes)
+ added log collector for different crash scenarios
v13.7
+ fixed custom download folder selection issues
v13.3
+ added discover/explore page (only for logged in users)
+ added function to remove IPTC tracking data from downloaded pictures (thanks to Airikr [@edgren] on Telegram)
+ added multiple accounts support (quick access) and favorites (a suggestion from Saurabh on Telegram)
+ added custom download folder option, you can select where to download posts (a suggestion from Airikr)
+ added desktop mode toggle in Login activity (a suggestion from Eymen on Telegram)
+ added post date in post viewer (a suggestion from W on Telegram)
+ added post time format settings [ Settings > Post Time Settings ]
+ fixed some icons and layouts
+ removed color from slider items in feed
+ removed useless methods and properties
+ better way of handling multiple stories and posts (sliders) in post viewer
+ tried to make notifications grouped together.. hope they work
+ some other fixes and additions which i probably forgot, cause i'm a human ffs
v13.0
+ fixed crash when searching hashtags
+ added lazy loading for hashtags
+ added Show Feed option in Settings (feed may crash app on some phones)
+ added null check in Download async
+ better/adapatable icon
+ fixed sheet dialog themes
v12.7
+ (probably) fixed inflating issue in some devices
v12.5
+ some small performance improvements
v12.0
+ added feed!! (only for logged in users)
+ fixed multiple hashtags with no spaces between them
+ stopped activity from recreating when nothing changed
+ changed highlights to RecyclerView instead of HorizontalScrollView
+ changed some numbers and precisions cause she left me on read
v11.0
+ added crash reporting library
+ added mute/unmute for session
+ better profile picture viewer + profile picture info
+ better swipe gesture
+ fixed mention and hashtag issues
v10.0
NOTE: YOU MAY NEED TO LOGIN TO VIEW PROFILES CAUSE OF INSTAGRAM CHANGES.
+ added direct download multiple posts dialog
+ fixed notification problems
+ fixed some direct download problems
+ fixed batch download and username folder not creating in some activities
+ fixed update checker
v9.0
+ added search in comments viewer
+ added settings to auto or lazy load posts
+ added user & hashtag stack when back pressed
+ added loading icon when loading posts
+ profile info bar sticks to top
+ fixed highlights and profile picture size in portrait and landscape mode
+ fixed posts loading from other user when restarting app
+ fixed posts size changing when scrolled
+ users & hashtag search shows only users or hashtag when first char is @ or #
+ scrolls to top when back pressed
v8.0
+ added pull-to-refresh layout in main posts, followers/following viewer
+ added search in followers/following viewer
+ added video views in post viewer
+ added animation when showing highlights (if available)
+ fixed long usernames not animating (marquee)
+ fixed padding and size in portrait and landscape modes
+ fixed accounts showing personal followers/following when account has 0 followers/following
+ fixed double ripple when tapped on profile picture
+ smaller story border around profile picture
v7.0
+ added comments viewer!!
+ added highest quality post fetcher
+ added loading indicator where it was missing before
+ fixed highlight name alignment
+ fixed swiping on posts opened via Share or link
v6.0
+ added story highlights!! (issue #5)
+ added button to view posts posted in stories
+ added verified badge for accounts
+ fixed posts & story swiping issues
+ fixed slow loading and stuff
+ fixed different margins and sizes
+ fixed activity not recreating after settings dialogs closed
v5.0
+ added followers / following checker
+ added search view suggestions for usernames & hashtags
+ added sliding profile container
+ fixed batch download permission issue (issue #4)
+ fixed some small screen panning issues
+ fixed search view width
+ fixed update checker
v4.0
+ fixed Login and Visit project page button codes.
v3.0
+ fixed posts merged from different accounts when searched while posts are loading!
+ view stories (only if you're logged in)
+ directly download posts
+ choose between two pfp (profile picture) viewer methods
+ fixed search box not showing up when toolbar is at bottom
+ automatically checks for updates
v2.0
+ fixed Login crashes
v1.0
+ first ever changelog
+ basic stuff like downloading profile pics, posts and copying captions and bio.
+ batch download posts
================================================
FILE: LICENSE
================================================
GNU GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The GNU General Public License is a free, copyleft license for
software and other kinds of works.
The licenses for most software and other practical works are designed
to take away your freedom to share and change the works. By contrast,
the GNU General Public License is intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users. We, the Free Software Foundation, use the
GNU General Public License for most of our software; it applies also to
any other work released this way by its authors. You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.
To protect your rights, we need to prevent others from denying you
these rights or asking you to surrender the rights. Therefore, you have
certain responsibilities if you distribute copies of the software, or if
you modify it: responsibilities to respect the freedom of others.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must pass on to the recipients the same
freedoms that you received. You must make sure that they, too, receive
or can get the source code. And you must show them these terms so they
know their rights.
Developers that use the GNU GPL protect your rights with two steps:
(1) assert copyright on the software, and (2) offer you this License
giving you legal permission to copy, distribute and/or modify it.
For the developers' and authors' protection, the GPL clearly explains
that there is no warranty for this free software. For both users' and
authors' sake, the GPL requires that modified versions be marked as
changed, so that their problems will not be attributed erroneously to
authors of previous versions.
Some devices are designed to deny users access to install or run
modified versions of the software inside them, although the manufacturer
can do so. This is fundamentally incompatible with the aim of
protecting users' freedom to change the software. The systematic
pattern of such abuse occurs in the area of products for individuals to
use, which is precisely where it is most unacceptable. Therefore, we
have designed this version of the GPL to prohibit the practice for those
products. If such problems arise substantially in other domains, we
stand ready to extend this provision to those domains in future versions
of the GPL, as needed to protect the freedom of users.
Finally, every program is threatened constantly by software patents.
States should not allow patents to restrict development and use of
software on general-purpose computers, but in those that do, we wish to
avoid the special danger that patents applied to a free program could
make it effectively proprietary. To prevent this, the GPL assures that
patents cannot be used to render the program non-free.
The precise terms and conditions for copying, distribution and
modification follow.
TERMS AND CONDITIONS
0. Definitions.
"This License" refers to version 3 of the GNU General Public License.
"Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.
"The Program" refers to any copyrightable work licensed under this
License. Each licensee is addressed as "you". "Licensees" and
"recipients" may be individuals or organizations.
To "modify" a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
exact copy. The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work.
A "covered work" means either the unmodified Program or a work based
on the Program.
To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy. Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.
To "convey" a work means any kind of propagation that enables other
parties to make or receive copies. Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.
An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License. If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.
1. Source Code.
The "source code" for a work means the preferred form of the work
for making modifications to it. "Object code" means any non-source
form of a work.
A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.
The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form. A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.
The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities. However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work. For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.
The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.
The Corresponding Source for a work in source code form is that
same work.
2. Basic Permissions.
All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met. This License explicitly affirms your unlimited
permission to run the unmodified Program. The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work. This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.
You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force. You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright. Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.
Conveying under any other circumstances is permitted solely under
the conditions stated below. Sublicensing is not allowed; section 10
makes it unnecessary.
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.
When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.
4. Conveying Verbatim Copies.
You may convey verbatim copies of the Program's source code as you
receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.
You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.
5. Conveying Modified Source Versions.
You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:
a) The work must carry prominent notices stating that you modified
it, and giving a relevant date.
b) The work must carry prominent notices stating that it is
released under this License and any conditions added under section
7. This requirement modifies the requirement in section 4 to
"keep intact all notices".
c) You must license the entire work, as a whole, under this
License to anyone who comes into possession of a copy. This
License will therefore apply, along with any applicable section 7
additional terms, to the whole of the work, and all its parts,
regardless of how they are packaged. This License gives no
permission to license the work in any other way, but it does not
invalidate such permission if you have separately received it.
d) If the work has interactive user interfaces, each must display
Appropriate Legal Notices; however, if the Program has interactive
interfaces that do not display Appropriate Legal Notices, your
work need not make them do so.
A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit. Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.
6. Conveying Non-Source Forms.
You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:
a) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by the
Corresponding Source fixed on a durable physical medium
customarily used for software interchange.
b) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by a
written offer, valid for at least three years and valid for as
long as you offer spare parts or customer support for that product
model, to give anyone who possesses the object code either (1) a
copy of the Corresponding Source for all the software in the
product that is covered by this License, on a durable physical
medium customarily used for software interchange, for a price no
more than your reasonable cost of physically performing this
conveying of source, or (2) access to copy the
Corresponding Source from a network server at no charge.
c) Convey individual copies of the object code with a copy of the
written offer to provide the Corresponding Source. This
alternative is allowed only occasionally and noncommercially, and
only if you received the object code with such an offer, in accord
with subsection 6b.
d) Convey the object code by offering access from a designated
place (gratis or for a charge), and offer equivalent access to the
Corresponding Source in the same way through the same place at no
further charge. You need not require recipients to copy the
Corresponding Source along with the object code. If the place to
copy the object code is a network server, the Corresponding Source
may be on a different server (operated by you or a third party)
that supports equivalent copying facilities, provided you maintain
clear directions next to the object code saying where to find the
Corresponding Source. Regardless of what server hosts the
Corresponding Source, you remain obligated to ensure that it is
available for as long as needed to satisfy these requirements.
e) Convey the object code using peer-to-peer transmission, provided
you inform other peers where the object code and Corresponding
Source of the work are being offered to the general public at no
charge under subsection 6d.
A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.
A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling. In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage. For a particular
product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
actually uses, or expects or is expected to use, the product. A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.
"Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source. The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.
If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
by the Installation Information. But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).
The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed. Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.
Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.
7. Additional Terms.
"Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
that they are valid under applicable law. If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.
When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it. (Additional permissions may be written to require their own
removal in certain cases when you modify the work.) You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.
Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:
a) Disclaiming warranty or limiting liability differently from the
terms of sections 15 and 16 of this License; or
b) Requiring preservation of specified reasonable legal notices or
author attributions in that material or in the Appropriate Legal
Notices displayed by works containing it; or
c) Prohibiting misrepresentation of the origin of that material, or
requiring that modified versions of such material be marked in
reasonable ways as different from the original version; or
d) Limiting the use for publicity purposes of names of licensors or
authors of the material; or
e) Declining to grant rights under trademark law for use of some
trade names, trademarks, or service marks; or
f) Requiring indemnification of licensors and authors of that
material by anyone who conveys the material (or modified versions of
it) with contractual assumptions of liability to the recipient, for
any liability that these contractual assumptions directly impose on
those licensors and authors.
All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10. If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
restriction, you may remove that term. If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.
If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.
Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.
8. Termination.
You may not propagate or modify a covered work except as expressly
provided under this License. Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).
However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.
Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.
Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License. If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.
9. Acceptance Not Required for Having Copies.
You are not required to accept this License in order to receive or
run a copy of the Program. Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance. However,
nothing other than this License grants you permission to propagate or
modify any covered work. These actions infringe copyright if you do
not accept this License. Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.
10. Automatic Licensing of Downstream Recipients.
Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License. You are not responsible
for enforcing compliance by third parties with this License.
An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations. If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.
You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License. For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.
11. Patents.
A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based. The
work thus licensed is called the contributor's "contributor version".
A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
consequence of further modification of the contributor version. For
purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.
Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.
In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement). To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.
If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
license to downstream recipients. "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.
If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.
A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License. You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.
Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.
12. No Surrender of Others' Freedom.
If conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
not convey it at all. For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.
13. Use with the GNU Affero General Public License.
Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU Affero General Public License into a single
combined work, and to convey the resulting work. The terms of this
License will continue to apply to the part which is the covered work,
but the special requirements of the GNU Affero General Public License,
section 13, concerning interaction through a network will apply to the
combination as such.
14. Revised Versions of this License.
The Free Software Foundation may publish revised and/or new versions of
the GNU General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the
Program specifies that a certain numbered version of the GNU General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation. If the Program does not specify a version number of the
GNU General Public License, you may choose any version ever published
by the Free Software Foundation.
If the Program specifies that a proxy can decide which future
versions of the GNU General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.
Later license versions may give you additional or different
permissions. However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.
15. Disclaimer of Warranty.
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. Limitation of Liability.
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES.
17. Interpretation of Sections 15 and 16.
If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.
END OF TERMS AND CONDITIONS
================================================
FILE: README.md
================================================
### THERE ARE CURRENTLY NO OFFICIAL GOOGLE PLAY RELEASES. PLEASE REPORT ANY OCCURRENCES TO US.
<img src="./app/src/main/ic_launcher-round.png" alt="Barinsta logo" align="right" width="20%"/>
# Barinsta
[](https://github.com/humanetech-community/awesome-humane-tech)
[](https://github.com/ellerbrock/open-source-badges/)
[](https://makeapullrequest.com)
[](./LICENSE)
[](https://GitHub.com/austinhuang0131/barinsta/stargazers/)<!-- ALL-CONTRIBUTORS-BADGE:START - Do not remove or modify this section -->
[](#contributors)
<!-- ALL-CONTRIBUTORS-BADGE:END -->
Instagram client; previously known as InstaGrabber.
For documentation, visit [Barinsta.AustinHuang.me](https://barinsta.austinhuang.me).
## Download
**By installing, you indicate your acceptance of [Terms of Service](https://barinsta.austinhuang.me/en/latest/tos.html) and [Privacy Policy](https://barinsta.austinhuang.me/en/latest/privacy.html).**
<a href="https://f-droid.org/en/packages/me.austinhuang.instagrabber/"><img src="https://fdroid.gitlab.io/artwork/badge/get-it-on.png" height="75"></a>
<a href="https://github.com/austinhuang0131/barinsta/releases/latest"><img src="https://raw.githubusercontent.com/andOTP/andOTP/master/assets/badges/get-it-on-github.png" height="75"></a>
Version status:  vs. 
## Screenshots
<a href="https://github.com/austinhuang0131/instagrabber/blob/master/fastlane/metadata/android/en-US/images/phoneScreenshots/1.png"><img src="./fastlane/metadata/android/en-US/images/phoneScreenshots/1.png" alt="Profile" width="15%"/></a>
<a href="https://github.com/austinhuang0131/instagrabber/blob/master/fastlane/metadata/android/en-US/images/phoneScreenshots/2.png"><img src="./fastlane/metadata/android/en-US/images/phoneScreenshots/2.png" alt="Post" width="15%"/></a>
<a href="https://github.com/austinhuang0131/instagrabber/blob/master/fastlane/metadata/android/en-US/images/phoneScreenshots/3.png"><img src="./fastlane/metadata/android/en-US/images/phoneScreenshots/3.png" alt="Comments" width="15%"/></a>
<a href="https://github.com/austinhuang0131/instagrabber/blob/master/fastlane/metadata/android/en-US/images/phoneScreenshots/4.png"><img src="./fastlane/metadata/android/en-US/images/phoneScreenshots/4.png" alt="Story" width="15%"/></a>
<a href="https://github.com/austinhuang0131/instagrabber/blob/master/fastlane/metadata/android/en-US/images/phoneScreenshots/5.png"><img src="./fastlane/metadata/android/en-US/images/phoneScreenshots/5.png" alt="Hashtag" width="15%"/></a>
<a href="https://github.com/austinhuang0131/instagrabber/blob/master/fastlane/metadata/android/en-US/images/phoneScreenshots/6.png"><img src="./fastlane/metadata/android/en-US/images/phoneScreenshots/6.png" alt="Discover Topics" width="15%"/></a>
## We need maintainers!
To speed up development, we need more hands on deck. If you are proficient in Java and Android development, and are willing to perform such a public service, please [contact us](https://t.me/austinhuang).
## Contact us
* Use [GitHub issues](https://github.com/austinhuang0131/instagrabber/issues) when possible.
* Email: [Barinsta@AustinHuang.me](mailto:barinsta@austinhuang.me?body=Please%20note%20that%20your%20email%20address%20and%20the%20entire%20content%20will%20be%20published%20onto%20GitHub%20issues.%20If%20you%20do%20not%20wish%20to%20do%20that%2C%20use%20other%20contact%20methods%20instead.) (Synced to GitHub issues)
* Reddit: [](https://reddit.com/r/barinsta)
* Chat (Bridged to each other): [](https://matrix.to/#/#barinsta:matrix.org) [](https://t.me/barinsta_app) [](https://discord.gg/YtEDzN2)
## Contributors
Prominent contributors are listed here in the [all-contributors](https://allcontributors.org/) specifications, see [emoji key](https://allcontributors.org/docs/en/emoji-key). [Want to contribute to Barinsta?](https://github.com/austinhuang0131/barinsta/blob/master/.github/CONTRIBUTING.md)
<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->
<!-- prettier-ignore-start -->
<!-- markdownlint-disable -->
<table>
<tr>
<td align="center"><a href="https://austinhuang.me"><img src="https://avatars1.githubusercontent.com/u/16656689?s=100" width="100px;" alt=""/><br /><sub><b>Austin Huang</b></sub></a><br /><a href="https://github.com/austinhuang0131/barinsta/commits?author=austinhuang0131" title="Code">💻</a> <a href="https://github.com/austinhuang0131/barinsta/commits?author=austinhuang0131" title="Documentation">📖</a> <a href="#question-austinhuang0131" title="Answering Questions">💬</a> <a href="https://crowdin.com/project/instagrabber" title="Translation">🌍</a> <a href="#ideas-austinhuang0131" title="Ideas, Planning, & Feedback">🤔</a></td>
<td align="center"><a href="https://github.com/ammargitham"><img src="https://avatars0.githubusercontent.com/u/8017365?s=100" width="100px;" alt=""/><br /><sub><b>Ammar Githam</b></sub></a><br /><a href="https://github.com/austinhuang0131/barinsta/commits?author=ammargitham" title="Code">💻</a> <a href="#design-ammargitham" title="Design">🎨</a> <a href="#ideas-ammargitham" title="Ideas, Planning, & Feedback">🤔</a> <a href="#maintenance-ammargitham" title="Maintenance">🚧</a> <a href="#question-ammargitham" title="Answering Questions">💬</a></td>
<td align="center"><a href="https://github.com/zerrium"><img src="https://avatars.githubusercontent.com/u/58355441?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Zerrium</b></sub></a><br /><a href="https://github.com/austinhuang0131/barinsta/commits?author=zerrium" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/junhuicoding"><img src="https://avatars.githubusercontent.com/u/54289027?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Chua Jun Hui</b></sub></a><br /><a href="https://github.com/austinhuang0131/barinsta/commits?author=junhuicoding" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/andersonvom"><img src="https://avatars3.githubusercontent.com/u/69922?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Anderson Mesquita</b></sub></a><br /><a href="https://github.com/austinhuang0131/barinsta/commits?author=andersonvom" title="Code">💻</a> <a href="https://github.com/austinhuang0131/barinsta/issues?q=author%3Aandersonvom" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://github.com/MeLlamoPablo"><img src="https://avatars.githubusercontent.com/u/11708035?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Pablo Rodríguez</b></sub></a><br /><a href="https://github.com/austinhuang0131/barinsta/commits?author=MeLlamoPablo" title="Code">💻</a></td>
</tr>
<tr>
<td align="center"><a href="https://github.com/tcely"><img src="https://avatars.githubusercontent.com/u/138864?v=4?s=100" width="100px;" alt=""/><br /><sub><b>tcely</b></sub></a><br /><a href="https://github.com/austinhuang0131/barinsta/commits?author=tcely" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/Vonter"><img src="https://avatars.githubusercontent.com/u/25414711?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Vonter</b></sub></a><br /><a href="https://github.com/austinhuang0131/barinsta/commits?author=Vonter" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/raniapl"><img src="https://avatars.githubusercontent.com/u/56370534?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Rania Pilioura</b></sub></a><br /><a href="https://github.com/austinhuang0131/barinsta/commits?author=raniapl" title="Code">💻</a></td>
<td align="center"><a href="https://github.com/stamatiap"><img src="https://avatars.githubusercontent.com/u/57223967?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Stamatia Papageorgiou</b></sub></a><br /><a href="https://github.com/austinhuang0131/barinsta/commits?author=stamatiap" title="Code">💻</a> <a href="https://crowdin.com/project/instagrabber" title="Translation">🌍</a></td>
<td align="center"><a href="https://github.com/Zopieux"><img src="https://avatars.githubusercontent.com/u/81353?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Alexandre Macabies</b></sub></a><br /><a href="https://github.com/austinhuang0131/barinsta/commits?author=Zopieux" title="Code">💻</a></td>
<td align="center"><a href="https://vojtechh.eu/"><img src="https://avatars.githubusercontent.com/u/12630566?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Vojtěch Hořánek</b></sub></a><br /><a href="https://github.com/austinhuang0131/barinsta/commits?author=vojta-horanek" title="Code">💻</a> <a href="https://crowdin.com/project/instagrabber" title="Translation">🌍</a></td>
</tr>
<tr>
<td align="center"><a href="https://github.com/The-EDev"><img src="https://avatars.githubusercontent.com/u/60552923?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Farook Al-Sammarraie</b></sub></a><br /><a href="https://github.com/austinhuang0131/barinsta/commits?author=The-EDev" title="Code">💻</a></td>
<td align="center"><a href="https://snajdovski.github.io"><img src="https://avatars2.githubusercontent.com/u/42580385?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Stefan Najdovski</b></sub></a><br /><a href="#design-snajdovski" title="Design">🎨</a> <a href="https://crowdin.com/project/instagrabber" title="Translation">🌍</a></td>
<td align="center"><a href="https://github.com/CrazyMarvin"><img src="https://avatars3.githubusercontent.com/u/15004217?v=4?s=100" width="100px;" alt=""/><br /><sub><b>CrazyMarvin</b></sub></a><br /><a href="#financial-CrazyMarvin" title="Financial">💵</a></td>
<td align="center"><a href="http://kevinthomas.dev"><img src="https://avatars2.githubusercontent.com/u/15370181?s=100" width="100px;" alt=""/><br /><sub><b>Kevin Thomas</b></sub></a><br /><a href="#financial-KevinNThomas" title="Financial">💵</a></td>
<td align="center"><a href="https://github.com/Martin5001"><img src="https://avatars.githubusercontent.com/u/35201200?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Martin Krejčí</b></sub></a><br /><a href="https://github.com/austinhuang0131/barinsta/issues?q=author%3AMartin5001" title="Bug reports">🐛</a> <a href="#ideas-Martin5001" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://crowdin.com/project/instagrabber" title="Translation">🌍</a></td>
<td align="center"><a href="https://github.com/Shadowspear123"><img src="https://avatars1.githubusercontent.com/u/50462281?s=100" width="100px;" alt=""/><br /><sub><b>Shadowspear123</b></sub></a><br /><a href="#blog-Shadowspear123" title="Blogposts">📝</a> <a href="https://github.com/austinhuang0131/barinsta/issues?q=author%3AShadowspear123" title="Bug reports">🐛</a> <a href="#ideas-Shadowspear123" title="Ideas, Planning, & Feedback">🤔</a> <a href="#question-Shadowspear123" title="Answering Questions">💬</a></td>
</tr>
<tr>
<td align="center"><a href="https://github.com/RickyM7"><img src="https://avatars3.githubusercontent.com/u/24703825?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Ricardo</b></sub></a><br /><a href="https://github.com/austinhuang0131/barinsta/issues?q=author%3ARickyM7" title="Bug reports">🐛</a> <a href="https://crowdin.com/project/instagrabber" title="Translation">🌍</a></td>
<td align="center"><a href="https://github.com/Akrai"><img src="https://avatars1.githubusercontent.com/u/5624597?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Akrai</b></sub></a><br /><a href="#ideas-Akrai" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://crowdin.com/project/instagrabber" title="Translation">🌍</a></td>
<td align="center"><a href="https://github.com/avtkal"><img src="https://avatars.githubusercontent.com/u/63205014?v=4?s=100" width="100px;" alt=""/><br /><sub><b>avtkal</b></sub></a><br /><a href="https://crowdin.com/project/instagrabber" title="Translation">🌍</a></td>
<td align="center"><a href="https://github.com/cizordj"><img src="https://avatars2.githubusercontent.com/u/32869222?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Cézar Augusto</b></sub></a><br /><a href="https://crowdin.com/project/instagrabber" title="Translation">🌍</a></td>
<td align="center"><a href="https://github.com/dimitrist19"><img src="https://avatars.githubusercontent.com/u/56406468?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Dimitris T</b></sub></a><br /><a href="https://crowdin.com/project/instagrabber" title="Translation">🌍</a></td>
<td align="center"><a href="https://github.com/farzadx"><img src="https://avatars2.githubusercontent.com/u/70059397?v=4?s=100" width="100px;" alt=""/><br /><sub><b>farzadx</b></sub></a><br /><a href="https://crowdin.com/project/instagrabber" title="Translation">🌍</a></td>
</tr>
<tr>
<td align="center"><a href="https://github.com/faydin"><img src="https://avatars2.githubusercontent.com/u/22706676?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Fatih Aydın</b></sub></a><br /><a href="https://crowdin.com/project/instagrabber" title="Translation">🌍</a></td>
<td align="center"><a href="https://github.com/fouze555"><img src="https://avatars3.githubusercontent.com/u/71935341?v=4?s=100" width="100px;" alt=""/><br /><sub><b>fouze555</b></sub></a><br /><a href="https://crowdin.com/project/instagrabber" title="Translation">🌍</a></td>
<td align="center"><a href="https://github.com/Galang23"><img src="https://avatars3.githubusercontent.com/u/13700948?s=100" width="100px;" alt=""/><br /><sub><b>Galang23</b></sub></a><br /><a href="https://crowdin.com/project/instagrabber" title="Translation">🌍</a></td>
<td align="center"><a href="https://github.com/initdebugs"><img src="https://avatars0.githubusercontent.com/u/75781464?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Initdebugs</b></sub></a><br /><a href="https://crowdin.com/project/instagrabber" title="Translation">🌍</a></td>
<td align="center"><a href="https://janek.xyz/"><img src="https://avatars3.githubusercontent.com/u/8365659?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Jakub Janek</b></sub></a><br /><a href="https://crowdin.com/project/instagrabber" title="Translation">🌍</a></td>
<td align="center"><a href="https://github.com/GenosseFlosse"><img src="https://avatars.githubusercontent.com/u/59205524?v=4?s=100" width="100px;" alt=""/><br /><sub><b>GenosseFlosse</b></sub></a><br /><a href="https://crowdin.com/project/instagrabber" title="Translation">🌍</a></td>
</tr>
<tr>
<td align="center"><a href="https://becauseofprog.fr/"><img src="https://avatars3.githubusercontent.com/u/24623168?s=100" width="100px;" alt=""/><br /><sub><b>kernoeb</b></sub></a><br /><a href="https://crowdin.com/project/instagrabber" title="Translation">🌍</a></td>
<td align="center"><a href="https://github.com/Lego8486"><img src="https://avatars1.githubusercontent.com/u/47414485?s=100" width="100px;" alt=""/><br /><sub><b>Ten_Lego</b></sub></a><br /><a href="https://crowdin.com/project/instagrabber" title="Translation">🌍</a></td>
<td align="center"><a href="https://github.com/MoaufmKlo"><img src="https://avatars1.githubusercontent.com/u/45636897?s=100" width="100px;" alt=""/><br /><sub><b>MoaufmKlo</b></sub></a><br /><a href="https://crowdin.com/project/instagrabber" title="Translation">🌍</a></td>
<td align="center"><a href="https://github.com/nalinalini"><img src="https://avatars0.githubusercontent.com/u/65640431?v=4?s=100" width="100px;" alt=""/><br /><sub><b>nalinalini</b></sub></a><br /><a href="https://crowdin.com/project/instagrabber" title="Translation">🌍</a></td>
<td align="center"><a href="https://github.com/peterge1998"><img src="https://avatars2.githubusercontent.com/u/47355238?s=100" width="100px;" alt=""/><br /><sub><b>peterge1998</b></sub></a><br /><a href="https://crowdin.com/project/instagrabber" title="Translation">🌍</a></td>
<td align="center"><a href="https://github.com/PierreM0"><img src="https://avatars3.githubusercontent.com/u/71077853?v=4?s=100" width="100px;" alt=""/><br /><sub><b>PierreM0</b></sub></a><br /><a href="https://crowdin.com/project/instagrabber" title="Translation">🌍</a></td>
</tr>
<tr>
<td align="center"><a href="https://github.com/Pyrobauve"><img src="https://avatars.githubusercontent.com/u/48654473?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Pyrobauve</b></sub></a><br /><a href="https://crowdin.com/project/instagrabber" title="Translation">🌍</a></td>
<td align="center"><a href="https://github.com/RAMAR-RAR"><img src="https://avatars3.githubusercontent.com/u/47423745?s=100" width="100px;" alt=""/><br /><sub><b>RAMAR-RAR</b></sub></a><br /><a href="https://crowdin.com/project/instagrabber" title="Translation">🌍</a></td>
<td align="center"><a href="https://github.com/rohang02"><img src="https://avatars3.githubusercontent.com/u/47921164?v=4?s=100" width="100px;" alt=""/><br /><sub><b>rohang02</b></sub></a><br /><a href="https://crowdin.com/project/instagrabber" title="Translation">🌍</a></td>
<td align="center"><a href="https://github.com/retiolus"><img src="https://avatars1.githubusercontent.com/u/65604466?v=4?s=100" width="100px;" alt=""/><br /><sub><b>retiolus</b></sub></a><br /><a href="https://crowdin.com/project/instagrabber" title="Translation">🌍</a></td>
<td align="center"><a href="https://github.com/rex07"><img src="https://avatars.githubusercontent.com/u/13156001?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Rex_sa</b></sub></a><br /><a href="https://crowdin.com/project/instagrabber" title="Translation">🌍</a></td>
<td align="center"><a href="https://github.com/rikishi0071"><img src="https://avatars3.githubusercontent.com/u/18183855?v=4?s=100" width="100px;" alt=""/><br /><sub><b>rikishi0071</b></sub></a><br /><a href="https://crowdin.com/project/instagrabber" title="Translation">🌍</a></td>
</tr>
<tr>
<td align="center"><a href="https://gitlab.com/sandboiii"><img src="https://avatars.githubusercontent.com/u/17468894?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Alexey Peschany</b></sub></a><br /><a href="https://crowdin.com/project/instagrabber" title="Translation">🌍</a></td>
<td align="center"><a href="https://github.com/Sitavi"><img src="https://avatars.githubusercontent.com/u/80586127?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Sitavi</b></sub></a><br /><a href="https://crowdin.com/project/instagrabber" title="Translation">🌍</a></td>
<td align="center"><a href="https://stillu.cc/"><img src="https://avatars2.githubusercontent.com/u/5843208?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Still Hsu</b></sub></a><br /><a href="https://crowdin.com/project/instagrabber" title="Translation">🌍</a></td>
<td align="center"><a href="https://github.com/Umeaboy"><img src="https://avatars.githubusercontent.com/u/714473?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Kristoffer Grundström</b></sub></a><br /><a href="https://crowdin.com/project/instagrabber" title="Translation">🌍</a></td>
<td align="center"><a href="https://github.com/wagnim"><img src="https://avatars0.githubusercontent.com/u/30241419?s=100" width="100px;" alt=""/><br /><sub><b>wagnim</b></sub></a><br /><a href="https://crowdin.com/project/instagrabber" title="Translation">🌍</a></td>
<td align="center"><a href="https://github.com/wokija"><img src="https://avatars.githubusercontent.com/u/14982166?v=4?s=100" width="100px;" alt=""/><br /><sub><b>wokija</b></sub></a><br /><a href="https://crowdin.com/project/instagrabber" title="Translation">🌍</a></td>
</tr>
<tr>
<td align="center"><a href="https://github.com/ysakamoto"><img src="https://avatars3.githubusercontent.com/u/1331642?v=4?s=100" width="100px;" alt=""/><br /><sub><b>ysakamoto</b></sub></a><br /><a href="https://crowdin.com/project/instagrabber" title="Translation">🌍</a></td>
<td align="center"><a href="https://github.com/ZDVokoun"><img src="https://avatars.githubusercontent.com/u/76393152?v=4?s=100" width="100px;" alt=""/><br /><sub><b>ZDVokoun</b></sub></a><br /><a href="https://crowdin.com/project/instagrabber" title="Translation">🌍</a></td>
<td align="center"><a href="https://github.com/2hot2exist"><img src="https://avatars.githubusercontent.com/u/84233003?v=4?s=100" width="100px;" alt=""/><br /><sub><b>2hot2exist</b></sub></a><br /><a href="https://crowdin.com/project/instagrabber" title="Translation">🌍</a></td>
</tr>
</table>
<!-- markdownlint-restore -->
<!-- prettier-ignore-end -->
<!-- ALL-CONTRIBUTORS-LIST:END -->
## License
This app's predecessor, InstaGrabber, was originally made by [@AwaisKing](https://github.com/AwaisKing) on [GitLab](https://gitlab.com/AwaisKing/instagrabber).
Barinsta
Copyright (C) 2020-2021 Austin Huang <im@austinhuang.me>
Ammar Githam <ammar.githam@outlook.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
Logo by [Stefan Najdovski](https://snajdovski.github.io/). Used under license.
[](https://snyk.io/test/github/austinhuang0131/barinsta)
[](https://lgtm.com/projects/g/austinhuang0131/barinsta)
[](https://lgtm.com/projects/g/austinhuang0131/barinsta)
[](https://www.codefactor.io/repository/github/austinhuang0131/barinsta)
[](https://www.codacy.com/manual/austinhuang0131/instagrabber)
[](https://crowdin.com/project/instagrabber)
[](https://forthebadge.com)[](https://forthebadge.com) [](https://www.gnu.org/licenses/gpl-3.0.html)
================================================
FILE: SECURITY.md
================================================
If there is a security issue with the latest version, please let me know using GitHub issues (bug), or email `im [at] austinhuang [dot] me` if confidential. Use [this PGP key](https://github.com/austinhuang0131/austinhuang0131.github.io/blob/master/assets/key.asc) if you know how to.
================================================
FILE: app/.classpath
================================================
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-12/"/>
<classpathentry kind="con" path="org.eclipse.buildship.core.gradleclasspathcontainer"/>
<classpathentry kind="output" path="bin/default"/>
</classpath>
================================================
FILE: app/.gitignore
================================================
/build
================================================
FILE: app/.project
================================================
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>app</name>
<comment>Project app created by Buildship.</comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.jdt.core.javabuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.buildship.core.gradleprojectbuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.jdt.core.javanature</nature>
<nature>org.eclipse.buildship.core.gradleprojectnature</nature>
</natures>
<filteredResources>
<filter>
<id>1600117114944</id>
<name></name>
<type>30</type>
<matcher>
<id>org.eclipse.core.resources.regexFilterMatcher</id>
<arguments>node_modules|.git|__CREATED_BY_JAVA_LANGUAGE_SERVER__</arguments>
</matcher>
</filter>
</filteredResources>
</projectDescription>
================================================
FILE: app/.settings/org.eclipse.buildship.core.prefs
================================================
connection.project.dir=..
eclipse.preferences.version=1
================================================
FILE: app/build.gradle
================================================
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: "androidx.navigation.safeargs"
apply plugin: 'kotlin-kapt'
apply from: 'sentry.gradle'
def getGitHash = { ->
def stdout = new ByteArrayOutputStream()
exec {
commandLine 'git', 'rev-parse', '--short', 'HEAD'
standardOutput = stdout
}
return stdout.toString().trim()
}
android {
compileSdkVersion 30
defaultConfig {
applicationId 'me.austinhuang.instagrabber'
minSdkVersion 21
targetSdkVersion 30
versionCode 65
versionName '19.2.4'
multiDexEnabled true
vectorDrawables.useSupportLibrary = true
vectorDrawables.generatedDensities = []
javaCompileOptions {
annotationProcessorOptions {
arguments = ["room.schemaLocation": "$projectDir/schemas".toString()]
}
}
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
sourceSets {
androidTest.assets.srcDirs += files("$projectDir/schemas".toString())
}
compileOptions {
// Flag to enable support for the new language APIs
coreLibraryDesugaringEnabled true
targetCompatibility JavaVersion.VERSION_1_8
sourceCompatibility JavaVersion.VERSION_1_8
}
buildFeatures { viewBinding true }
aaptOptions { additionalParameters '--no-version-vectors' }
buildTypes {
debug {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
flavorDimensions "repo"
productFlavors {
github {
dimension "repo"
// versionNameSuffix "-github" // appended in assemble task
buildConfigField("String", "dsn", SENTRY_DSN)
buildConfigField("boolean", "isPre", "false")
}
fdroid {
dimension "repo"
versionNameSuffix "-fdroid"
buildConfigField("boolean", "isPre", "false")
}
}
splits {
// Configures multiple APKs based on ABI.
abi {
// Enables building multiple APKs per ABI.
enable project.hasProperty("split") && !gradle.startParameter.taskNames.isEmpty() && gradle.startParameter.taskNames.get(0).contains('Release')
// By default all ABIs are included, so use reset() and include to specify that we only
// want APKs for x86 and x86_64.
// Resets the list of ABIs that Gradle should create APKs for to none.
reset()
// Specifies a list of ABIs that Gradle should create APKs for.
include "x86", "x86_64", "arm64-v8a", "armeabi-v7a"
// Specifies that we want to also generate a universal APK that includes all ABIs.
universalApk true
}
}
android.applicationVariants.all { variant ->
if (variant.flavorName != "github") return
variant.outputs.all { output ->
def builtType = variant.buildType.name
def versionName = variant.versionName
// def versionCode = variant.versionCode
def flavor = variant.flavorName
def flavorBuiltType = "${flavor}_${builtType}"
def suffix
// For x86 and x86_64, the versionNames are already overridden
if (versionName.contains(flavorBuiltType)) {
suffix = "${versionName}"
} else {
suffix = "${versionName}-${flavorBuiltType}" // eg. 19.1.0-github_debug or release
}
if (builtType.toString() == 'release' && project.hasProperty("pre")) {
buildConfigField("boolean", "isPre", "true")
flavorBuiltType = "${getGitHash()}-${flavor}"
// For x86 and x86_64, the versionNames are already overridden
if (versionName.contains(flavorBuiltType)) {
suffix = "${versionName}"
} else {
// append latest commit short hash for pre-release
suffix = "${versionName}.${flavorBuiltType}" // eg. 19.1.0.b123456-github
}
}
output.versionNameOverride = suffix
def abi = output.getFilter(com.android.build.OutputFile.ABI)
// println(abi + ", " + versionName + ", " + flavor + ", " + builtType + ", " + suffix)
outputFileName = abi == null ? "barinsta_${suffix}.apk" : "barinsta_${suffix}_${abi}.apk"
}
}
packagingOptions {
// Exclude file to avoid
// Error: Duplicate files during packaging of APK
exclude 'META-INF/LICENSE.md'
exclude 'META-INF/LICENSE-notice.md'
exclude 'META-INF/atomicfu.kotlin_module'
exclude 'META-INF/AL2.0'
exclude 'META-INF/LGPL2.1'
}
testOptions.unitTests {
includeAndroidResources = true
}
}
configurations.all {
resolutionStrategy.cacheChangingModulesFor 0, 'seconds'
}
dependencies {
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.5'
def exoplayer_version = '2.14.1'
implementation 'com.google.android.material:material:1.4.0'
implementation "com.google.android.exoplayer:exoplayer-core:$exoplayer_version"
implementation "com.google.android.exoplayer:exoplayer-dash:$exoplayer_version"
implementation "com.google.android.exoplayer:exoplayer-ui:$exoplayer_version"
implementation "androidx.recyclerview:recyclerview:1.2.1"
implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0'
implementation "androidx.viewpager2:viewpager2:1.0.0"
implementation "androidx.constraintlayout:constraintlayout:2.0.4"
implementation "androidx.preference:preference:1.1.1"
implementation 'androidx.palette:palette:1.0.0'
implementation 'androidx.documentfile:documentfile:1.0.1'
implementation 'com.google.guava:guava:27.0.1-android'
def core_version = "1.6.0"
implementation "androidx.core:core:$core_version"
// Fragment
implementation "androidx.fragment:fragment-ktx:1.3.5"
// Lifecycle
implementation "androidx.lifecycle:lifecycle-extensions:2.2.0"
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1"
implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.3.1"
// Navigation
implementation "androidx.navigation:navigation-fragment-ktx:$rootProject.nav_version"
implementation "androidx.navigation:navigation-ui-ktx:$rootProject.nav_version"
// Room
def room_version = "2.3.0"
implementation "androidx.room:room-runtime:$room_version"
implementation "androidx.room:room-guava:$room_version"
implementation "androidx.room:room-ktx:$room_version"
kapt "androidx.room:room-compiler:$room_version"
annotationProcessor "androidx.room:room-compiler:$room_version"
// CameraX
def camerax_version = "1.1.0-alpha07"
implementation "androidx.camera:camera-camera2:$camerax_version"
implementation "androidx.camera:camera-lifecycle:$camerax_version"
implementation "androidx.camera:camera-view:1.0.0-alpha27"
// EmojiCompat
def emoji_compat_version = "1.1.0"
implementation "androidx.emoji:emoji:$emoji_compat_version"
implementation "androidx.emoji:emoji-appcompat:$emoji_compat_version"
// Work
def work_version = '2.5.0'
implementation "androidx.work:work-runtime:$work_version"
implementation "androidx.work:work-runtime-ktx:$work_version"
implementation "ru.gildor.coroutines:kotlin-coroutines-okhttp:1.0"
implementation 'com.facebook.fresco:fresco:2.5.0'
implementation 'com.facebook.fresco:animated-webp:2.5.0'
implementation 'com.facebook.fresco:webpsupport:2.5.0'
implementation 'com.squareup.retrofit2:retrofit:2.9.0'
implementation 'com.squareup.retrofit2:converter-scalars:2.9.0'
implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
implementation 'org.apache.commons:commons-imaging:1.0-alpha2'
implementation 'com.github.skydoves:balloon:1.3.5'
implementation 'com.github.ammargitham:AutoLinkTextViewV2:3.2.0'
implementation 'com.github.ammargitham:uCrop:2.3-non-native'
implementation 'com.github.ammargitham:android-gpuimage:2.1.1-beta4'
debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.7'
githubImplementation 'io.sentry:sentry-android:5.0.1'
testImplementation 'org.junit.jupiter:junit-jupiter:5.7.2'
testImplementation "androidx.test.ext:junit-ktx:1.1.3"
testImplementation "androidx.test:core-ktx:1.4.0"
testImplementation "androidx.arch.core:core-testing:2.1.0"
testImplementation "org.robolectric:robolectric:4.5.1"
testImplementation 'org.jetbrains.kotlinx:kotlinx-coroutines-test:1.5.0'
androidTestImplementation 'org.junit.jupiter:junit-jupiter:5.7.2'
androidTestImplementation 'androidx.test:core:1.4.0'
androidTestImplementation 'com.android.support:support-annotations:28.0.0'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation "androidx.room:room-testing:2.3.0"
androidTestImplementation "androidx.arch.core:core-testing:2.1.0"
androidTestImplementation 'org.jetbrains.kotlinx:kotlinx-coroutines-test:1.5.0'
}
================================================
FILE: app/lint.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<lint>
<issue id="IconColors">
<ignore path="src/main/res/drawable-night/download.png" />
</issue>
<issue id="IconLocation">
<ignore path="src/main/res/drawable/adm.png" />
<ignore path="src/main/res/drawable/check.png" />
<ignore path="src/main/res/drawable/collapse.png" />
<ignore path="src/main/res/drawable/comments.png" />
<ignore path="src/main/res/drawable/download.png" />
<ignore path="src/main/res/drawable/expand.png" />
<ignore path="src/main/res/drawable/lock.png" />
<ignore path="src/main/res/drawable/lw.png" />
<ignore path="src/main/res/drawable/ms.png" />
<ignore path="src/main/res/drawable/mute.png" />
<ignore path="src/main/res/drawable/qdb.png" />
<ignore path="src/main/res/drawable/rev.png" />
<ignore path="src/main/res/drawable/revl.png" />
<ignore path="src/main/res/drawable/settings.png" />
<ignore path="src/main/res/drawable/slider.png" />
<ignore path="src/main/res/drawable/tesv.png" />
<ignore path="src/main/res/drawable/vdz.png" />
<ignore path="src/main/res/drawable/verified.png" />
<ignore path="src/main/res/drawable/video.png" />
<ignore path="src/main/res/drawable/video_views.png" />
<ignore path="src/main/res/drawable/vol.png" />
</issue>
</lint>
================================================
FILE: app/proguard-rules.pro
================================================
# Add project specific ProGuard rules here.
# You can control the set of applied configuration files using the
# proguardFiles setting in build.gradle.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}
# Uncomment this to preserve the line number information for
# debugging stack traces.
#-keepattributes SourceFile,LineNumberTable
# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile
#noinspection ShrinkerUnresolvedReference
#-keep class !com.google.android.exoplayer2.**, ** { *; }
-dontobfuscate
# prevent shrinking retrofit response entities
-keep class awais.instagrabber.repositories.responses.** { *; }
================================================
FILE: app/schemas/awais.instagrabber.db.AppDatabase/4.json
================================================
{
"formatVersion": 1,
"database": {
"version": 4,
"identityHash": "538d64adaeb8c3a98db9204955932e59",
"entities": [
{
"tableName": "accounts",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `uid` TEXT, `username` TEXT, `cookie` TEXT, `full_name` TEXT, `profile_pic` TEXT)",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "uid",
"columnName": "uid",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "username",
"columnName": "username",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "cookie",
"columnName": "cookie",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "fullName",
"columnName": "full_name",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "profilePic",
"columnName": "profile_pic",
"affinity": "TEXT",
"notNull": false
}
],
"primaryKey": {
"columnNames": [
"id"
],
"autoGenerate": true
},
"indices": [],
"foreignKeys": []
},
{
"tableName": "favorites",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `query_text` TEXT, `type` TEXT, `display_name` TEXT, `pic_url` TEXT, `date_added` INTEGER)",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "query",
"columnName": "query_text",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "type",
"columnName": "type",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "displayName",
"columnName": "display_name",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "picUrl",
"columnName": "pic_url",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "dateAdded",
"columnName": "date_added",
"affinity": "INTEGER",
"notNull": false
}
],
"primaryKey": {
"columnNames": [
"id"
],
"autoGenerate": true
},
"indices": [],
"foreignKeys": []
}
],
"views": [],
"setupQueries": [
"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '538d64adaeb8c3a98db9204955932e59')"
]
}
}
================================================
FILE: app/schemas/awais.instagrabber.db.AppDatabase/5.json
================================================
{
"formatVersion": 1,
"database": {
"version": 5,
"identityHash": "0b38e12b76bb081ec837191c5ef5b54e",
"entities": [
{
"tableName": "accounts",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `uid` TEXT, `username` TEXT, `cookie` TEXT, `full_name` TEXT, `profile_pic` TEXT)",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "uid",
"columnName": "uid",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "username",
"columnName": "username",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "cookie",
"columnName": "cookie",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "fullName",
"columnName": "full_name",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "profilePic",
"columnName": "profile_pic",
"affinity": "TEXT",
"notNull": false
}
],
"primaryKey": {
"columnNames": [
"id"
],
"autoGenerate": true
},
"indices": [],
"foreignKeys": []
},
{
"tableName": "favorites",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `query_text` TEXT, `type` TEXT, `display_name` TEXT, `pic_url` TEXT, `date_added` INTEGER)",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "query",
"columnName": "query_text",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "type",
"columnName": "type",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "displayName",
"columnName": "display_name",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "picUrl",
"columnName": "pic_url",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "dateAdded",
"columnName": "date_added",
"affinity": "INTEGER",
"notNull": false
}
],
"primaryKey": {
"columnNames": [
"id"
],
"autoGenerate": true
},
"indices": [],
"foreignKeys": []
},
{
"tableName": "dm_last_notified",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `thread_id` TEXT, `last_notified_msg_ts` INTEGER, `last_notified_at` INTEGER)",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "threadId",
"columnName": "thread_id",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "lastNotifiedMsgTs",
"columnName": "last_notified_msg_ts",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "lastNotifiedAt",
"columnName": "last_notified_at",
"affinity": "INTEGER",
"notNull": false
}
],
"primaryKey": {
"columnNames": [
"id"
],
"autoGenerate": true
},
"indices": [
{
"name": "index_dm_last_notified_thread_id",
"unique": true,
"columnNames": [
"thread_id"
],
"createSql": "CREATE UNIQUE INDEX IF NOT EXISTS `index_dm_last_notified_thread_id` ON `${TABLE_NAME}` (`thread_id`)"
}
],
"foreignKeys": []
}
],
"views": [],
"setupQueries": [
"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '0b38e12b76bb081ec837191c5ef5b54e')"
]
}
}
================================================
FILE: app/schemas/awais.instagrabber.db.AppDatabase/6.json
================================================
{
"formatVersion": 1,
"database": {
"version": 6,
"identityHash": "232e618b3bfcb4661336b359d036c455",
"entities": [
{
"tableName": "accounts",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `uid` TEXT, `username` TEXT, `cookie` TEXT, `full_name` TEXT, `profile_pic` TEXT)",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "uid",
"columnName": "uid",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "username",
"columnName": "username",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "cookie",
"columnName": "cookie",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "fullName",
"columnName": "full_name",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "profilePic",
"columnName": "profile_pic",
"affinity": "TEXT",
"notNull": false
}
],
"primaryKey": {
"columnNames": [
"id"
],
"autoGenerate": true
},
"indices": [],
"foreignKeys": []
},
{
"tableName": "favorites",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `query_text` TEXT, `type` TEXT, `display_name` TEXT, `pic_url` TEXT, `date_added` INTEGER)",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "query",
"columnName": "query_text",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "type",
"columnName": "type",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "displayName",
"columnName": "display_name",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "picUrl",
"columnName": "pic_url",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "dateAdded",
"columnName": "date_added",
"affinity": "INTEGER",
"notNull": false
}
],
"primaryKey": {
"columnNames": [
"id"
],
"autoGenerate": true
},
"indices": [],
"foreignKeys": []
},
{
"tableName": "dm_last_notified",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `thread_id` TEXT, `last_notified_msg_ts` INTEGER, `last_notified_at` INTEGER)",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "threadId",
"columnName": "thread_id",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "lastNotifiedMsgTs",
"columnName": "last_notified_msg_ts",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "lastNotifiedAt",
"columnName": "last_notified_at",
"affinity": "INTEGER",
"notNull": false
}
],
"primaryKey": {
"columnNames": [
"id"
],
"autoGenerate": true
},
"indices": [
{
"name": "index_dm_last_notified_thread_id",
"unique": true,
"columnNames": [
"thread_id"
],
"createSql": "CREATE UNIQUE INDEX IF NOT EXISTS `index_dm_last_notified_thread_id` ON `${TABLE_NAME}` (`thread_id`)"
}
],
"foreignKeys": []
},
{
"tableName": "recent_searches",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `ig_id` TEXT NOT NULL, `name` TEXT NOT NULL, `username` TEXT, `pic_url` TEXT, `type` TEXT NOT NULL, `last_searched_on` INTEGER NOT NULL)",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "igId",
"columnName": "ig_id",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "name",
"columnName": "name",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "username",
"columnName": "username",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "picUrl",
"columnName": "pic_url",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "type",
"columnName": "type",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "lastSearchedOn",
"columnName": "last_searched_on",
"affinity": "INTEGER",
"notNull": true
}
],
"primaryKey": {
"columnNames": [
"id"
],
"autoGenerate": true
},
"indices": [
{
"name": "index_recent_searches_ig_id_type",
"unique": true,
"columnNames": [
"ig_id",
"type"
],
"createSql": "CREATE UNIQUE INDEX IF NOT EXISTS `index_recent_searches_ig_id_type` ON `${TABLE_NAME}` (`ig_id`, `type`)"
}
],
"foreignKeys": []
}
],
"views": [],
"setupQueries": [
"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '232e618b3bfcb4661336b359d036c455')"
]
}
}
================================================
FILE: app/sentry.gradle
================================================
def dsnKey = 'DSN'
def defaultDsn = '\"\"'
final Properties properties = new Properties()
File propertiesFile = rootProject.file('sentry.properties')
if (!propertiesFile.exists()) {
propertiesFile.createNewFile()
}
properties.load(new FileInputStream(propertiesFile))
ext{
SENTRY_DSN = properties.getProperty(dsnKey, defaultDsn)
}
================================================
FILE: app/src/androidTest/java/awais/instagrabber/db/MigrationTest.java
================================================
package awais.instagrabber.db;
import androidx.room.Room;
import androidx.room.migration.Migration;
import androidx.room.testing.MigrationTestHelper;
import androidx.sqlite.db.SupportSQLiteDatabase;
import androidx.sqlite.db.framework.FrameworkSQLiteOpenHelperFactory;
import androidx.test.platform.app.InstrumentationRegistry;
import androidx.test.runner.AndroidJUnit4;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import java.io.IOException;
import static awais.instagrabber.db.AppDatabase.MIGRATION_4_5;
import static awais.instagrabber.db.AppDatabase.MIGRATION_5_6;
@RunWith(AndroidJUnit4.class)
public class MigrationTest {
private static final String TEST_DB = "migration-test";
private static final Migration[] ALL_MIGRATIONS = new Migration[]{MIGRATION_4_5, MIGRATION_5_6};
@Rule
public MigrationTestHelper helper;
public MigrationTest() {
final String canonicalName = AppDatabase.class.getCanonicalName();
helper = new MigrationTestHelper(InstrumentationRegistry.getInstrumentation(),
canonicalName,
new FrameworkSQLiteOpenHelperFactory());
}
@Test
public void migrateAll() throws IOException {
// Create earliest version of the database. Have to start with 4 since that is the version we migrated to Room.
SupportSQLiteDatabase db = helper.createDatabase(TEST_DB, 4);
db.close();
// Open latest version of the database. Room will validate the schema
// once all migrations execute.
AppDatabase appDb = Room.databaseBuilder(InstrumentationRegistry.getInstrumentation().getTargetContext(),
AppDatabase.class,
TEST_DB)
.addMigrations(ALL_MIGRATIONS).build();
appDb.getOpenHelper().getWritableDatabase();
appDb.close();
}
}
================================================
FILE: app/src/androidTest/java/awais/instagrabber/db/dao/RecentSearchDaoTest.kt
================================================
package awais.instagrabber.db.dao
import android.content.Context
import androidx.arch.core.executor.testing.InstantTaskExecutorRule
import androidx.room.Room
import androidx.test.core.app.ApplicationProvider
import androidx.test.runner.AndroidJUnit4
import awais.instagrabber.db.AppDatabase
import awais.instagrabber.db.entities.RecentSearch
import awais.instagrabber.models.enums.FavoriteType
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.runBlocking
import kotlinx.coroutines.test.runBlockingTest
import org.junit.After
import org.junit.Before
import org.junit.Rule
import org.junit.Test
import org.junit.jupiter.api.Assertions
import org.junit.runner.RunWith
import java.time.LocalDateTime
@RunWith(AndroidJUnit4::class)
class RecentSearchDaoTest {
private lateinit var db: AppDatabase
private lateinit var dao: RecentSearchDao
@get:Rule
var instantExecutorRule = InstantTaskExecutorRule()
@Before
fun createDb() {
val context = ApplicationProvider.getApplicationContext<Context>()
db = Room.inMemoryDatabaseBuilder(context, AppDatabase::class.java).build()
dao = db.recentSearchDao()
}
@After
fun closeDb() {
db.close()
}
@ExperimentalCoroutinesApi
@Test
fun writeQueryDelete() = runBlockingTest {
val recentSearch = insertRecentSearch(1, "1", "test1", FavoriteType.HASHTAG)
val byIgIdAndType = dao.getRecentSearchByIgIdAndType("1", FavoriteType.HASHTAG)
Assertions.assertNotNull(byIgIdAndType)
Assertions.assertEquals(recentSearch, byIgIdAndType)
dao.deleteRecentSearch(byIgIdAndType ?: throw NullPointerException())
val deleted = dao.getRecentSearchByIgIdAndType("1", FavoriteType.HASHTAG)
Assertions.assertNull(deleted)
}
@ExperimentalCoroutinesApi
@Test
fun queryAllOrdered() = runBlockingTest {
val insertListReversed: List<RecentSearch> = listOf(
insertRecentSearch(1, "1", "test1", FavoriteType.HASHTAG),
insertRecentSearch(2, "2", "test2", FavoriteType.LOCATION),
insertRecentSearch(3, "3", "test3", FavoriteType.USER),
insertRecentSearch(4, "4", "test4", FavoriteType.USER),
insertRecentSearch(5, "5", "test5", FavoriteType.USER)
).asReversed() // important
val fromDb: List<RecentSearch?> = dao.getAllRecentSearches()
Assertions.assertIterableEquals(insertListReversed, fromDb)
}
private fun insertRecentSearch(id: Int, igId: String, name: String, type: FavoriteType): RecentSearch {
val recentSearch = RecentSearch(
id,
igId,
name,
null,
null,
type,
LocalDateTime.now()
)
runBlocking { dao.insertRecentSearch(recentSearch) }
return recentSearch
}
}
================================================
FILE: app/src/androidTest/java/awaisomereport/CrashReporterHelperTest.kt
================================================
package awaisomereport
import androidx.test.runner.AndroidJUnit4
import org.junit.Test
import org.junit.runner.RunWith
@RunWith(AndroidJUnit4::class)
internal class CrashReporterHelperTest {
@Test
fun getErrorContent() {
val errorContent = CrashReporterHelper.getReportContent(Exception())
print(errorContent)
}
}
================================================
FILE: app/src/fdroid/java/awais/instagrabber/fragments/settings/FlavorSettings.java
================================================
package awais.instagrabber.fragments.settings;
import android.content.Context;
import androidx.annotation.NonNull;
import androidx.fragment.app.FragmentManager;
import androidx.preference.Preference;
import java.util.Collections;
import java.util.List;
import awais.instagrabber.fragments.settings.IFlavorSettings;
import awais.instagrabber.fragments.settings.SettingCategory;
public final class FlavorSettings implements IFlavorSettings {
private static FlavorSettings instance;
private FlavorSettings() {
}
public static FlavorSettings getInstance() {
if (instance == null) {
instance = new FlavorSettings();
}
return instance;
}
@NonNull
@Override
public List<Preference> getPreferences(@NonNull final Context context,
@NonNull final FragmentManager fragmentManager,
@NonNull final SettingCategory settingCategory) {
// switch (settingCategory) {
// default:
// break;
// }
return Collections.emptyList();
}
}
================================================
FILE: app/src/fdroid/java/awais/instagrabber/utils/UpdateChecker.java
================================================
package awais.instagrabber.utils;
import android.util.Log;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import org.json.JSONObject;
import java.net.HttpURLConnection;
import java.net.URL;
public class UpdateChecker {
private static final Object LOCK = new Object();
private static final String TAG = UpdateChecker.class.getSimpleName();
private static UpdateChecker instance;
public static UpdateChecker getInstance() {
if (instance == null) {
synchronized (LOCK) {
if (instance == null) {
instance = new UpdateChecker();
}
}
}
return instance;
}
/**
* Needs to be called asynchronously
*
* @return the latest version from f-droid
*/
@Nullable
public String getLatestVersion() {
HttpURLConnection conn = null;
try {
conn = (HttpURLConnection) new URL("https://f-droid.org/api/v1/packages/me.austinhuang.instagrabber").openConnection();
conn.setUseCaches(false);
conn.setRequestProperty("User-Agent", "https://Barinsta.AustinHuang.me / mailto:Barinsta@AustinHuang.me");
conn.connect();
final int responseCode = conn.getResponseCode();
if (responseCode == HttpURLConnection.HTTP_OK) {
final JSONObject data = new JSONObject(NetworkUtils.readFromConnection(conn));
return "v" + data.getJSONArray("packages").getJSONObject(0).getString("versionName");
// if (BuildConfig.VERSION_CODE < data.getInt("suggestedVersionCode")) {
// }
}
} catch (final Exception e) {
Log.e(TAG, "", e);
} finally {
if (conn != null) {
conn.disconnect();
}
}
return null;
}
public void onDownload(@NonNull final AppCompatActivity context) {
Utils.openURL(context, "https://f-droid.org/packages/me.austinhuang.instagrabber/");
}
}
================================================
FILE: app/src/fdroid/java/awaisomereport/CrashHandler.kt
================================================
package awaisomereport
import android.app.Application
class CrashHandler(private val application: Application) : ICrashHandler {
override fun uncaughtException(
t: Thread,
exception: Throwable,
defaultExceptionHandler: Thread.UncaughtExceptionHandler
) {
CrashReporterHelper.startErrorReporterActivity(application, exception)
defaultExceptionHandler.uncaughtException(t, exception)
}
}
================================================
FILE: app/src/github/AndroidManifest.xml
================================================
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="awais.instagrabber">
<application>
<meta-data
android:name="io.sentry.auto-init"
android:value="false" />
</application>
</manifest>
================================================
FILE: app/src/github/java/awais/instagrabber/fragments/settings/FlavorSettings.java
================================================
package awais.instagrabber.fragments.settings;
import android.content.Context;
import androidx.annotation.NonNull;
import androidx.fragment.app.FragmentManager;
import androidx.preference.Preference;
import com.google.common.collect.ImmutableList;
import java.util.Collections;
import java.util.List;
import awais.instagrabber.R;
import awais.instagrabber.dialogs.ConfirmDialogFragment;
import static awais.instagrabber.fragments.settings.PreferenceKeys.PREF_ENABLE_SENTRY;
import static awais.instagrabber.utils.Utils.settingsHelper;
public final class FlavorSettings implements IFlavorSettings {
private static FlavorSettings instance;
private FlavorSettings() {
}
public static FlavorSettings getInstance() {
if (instance == null) {
instance = new FlavorSettings();
}
return instance;
}
@NonNull
@Override
public List<Preference> getPreferences(@NonNull final Context context,
@NonNull final FragmentManager fragmentManager,
@NonNull final SettingCategory settingCategory) {
switch (settingCategory) {
case GENERAL:
return getGeneralPrefs(context, fragmentManager);
default:
break;
}
return Collections.emptyList();
}
private List<Preference> getGeneralPrefs(@NonNull final Context context,
@NonNull final FragmentManager fragmentManager) {
return ImmutableList.of(
getSentryPreference(context, fragmentManager)
);
}
private Preference getSentryPreference(@NonNull final Context context,
@NonNull final FragmentManager fragmentManager) {
if (!settingsHelper.hasPreference(PREF_ENABLE_SENTRY)) {
// disabled by default
settingsHelper.putBoolean(PREF_ENABLE_SENTRY, false);
}
return PreferenceHelper.getSwitchPreference(
context,
PREF_ENABLE_SENTRY,
R.string.enable_sentry,
R.string.sentry_summary,
false,
(preference, newValue) -> {
if (!(newValue instanceof Boolean)) return true;
final boolean enabled = (Boolean) newValue;
if (enabled) {
final ConfirmDialogFragment dialogFragment = ConfirmDialogFragment.newInstance(
111,
0,
R.string.sentry_start_next_launch,
R.string.ok,
0,
0);
dialogFragment.show(fragmentManager, "sentry_dialog");
}
return true;
});
}
}
================================================
FILE: app/src/github/java/awais/instagrabber/utils/UpdateChecker.java
================================================
package awais.instagrabber.utils;
import android.content.Context;
import android.util.Log;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import java.net.HttpURLConnection;
import java.net.URL;
public class UpdateChecker {
private static final Object LOCK = new Object();
private static final String TAG = UpdateChecker.class.getSimpleName();
private static UpdateChecker instance;
public static UpdateChecker getInstance() {
if (instance == null) {
synchronized (LOCK) {
if (instance == null) {
instance = new UpdateChecker();
}
}
}
return instance;
}
/**
* Needs to be called asynchronously
*
* @return the latest version from Github
*/
@Nullable
public String getLatestVersion() {
HttpURLConnection conn = null;
try {
conn = (HttpURLConnection) new URL("https://github.com/austinhuang0131/barinsta/releases/latest").openConnection();
conn.setInstanceFollowRedirects(false);
conn.setUseCaches(false);
conn.setRequestProperty("User-Agent", "https://Barinsta.AustinHuang.me / mailto:Barinsta@AustinHuang.me");
conn.connect();
final int responseCode = conn.getResponseCode();
if (responseCode == HttpURLConnection.HTTP_MOVED_TEMP) {
return "v" + conn.getHeaderField("Location").split("/v")[1];
// return !version.equals(BuildConfig.VERSION_NAME);
}
} catch (final Exception e) {
Log.e(TAG, "", e);
} finally {
if (conn != null) {
conn.disconnect();
}
}
return null;
}
public void onDownload(@NonNull final Context context) {
Utils.openURL(context, "https://github.com/austinhuang0131/instagrabber/releases/latest");
}
}
================================================
FILE: app/src/github/java/awaisomereport/CrashHandler.kt
================================================
package awaisomereport
import android.app.Application
import awais.instagrabber.BuildConfig
import awais.instagrabber.fragments.settings.PreferenceKeys
import awais.instagrabber.utils.Utils
import io.sentry.SentryEvent
import io.sentry.SentryLevel
import io.sentry.SentryOptions.BeforeSendCallback
import io.sentry.android.core.SentryAndroid
import io.sentry.android.core.SentryAndroidOptions
class CrashHandler(private val application: Application) : ICrashHandler {
private var enabled = false
init {
enabled = if (!Utils.settingsHelper.hasPreference(PreferenceKeys.PREF_ENABLE_SENTRY)) {
// disabled by default (change to true if we need enabled by default)
false
} else {
Utils.settingsHelper.getBoolean(PreferenceKeys.PREF_ENABLE_SENTRY)
}
if (enabled) {
SentryAndroid.init(application) { options: SentryAndroidOptions ->
options.dsn = BuildConfig.dsn
options.setDiagnosticLevel(SentryLevel.ERROR)
options.beforeSend = BeforeSendCallback { event: SentryEvent, _: Any? ->
// Removing unneeded info from event
event.contexts.device?.apply {
name = null
timezone = null
isCharging = null
bootTime = null
freeStorage = null
batteryTemperature = null
}
event
}
}
}
}
override fun uncaughtException(
t: Thread,
exception: Throwable,
defaultExceptionHandler: Thread.UncaughtExceptionHandler
) {
// When enabled, Sentry auto captures unhandled exceptions
if (!enabled) {
CrashReporterHelper.startErrorReporterActivity(application, exception)
}
defaultExceptionHandler.uncaughtException(t, exception)
}
}
================================================
FILE: app/src/github/res/values/strings.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="enable_sentry">Enable Sentry</string>
<string name="sentry_summary">Sentry is a listener/handler for errors that asynchronously sends out the error/event to Sentry.io</string>
<string name="sentry_start_next_launch">Sentry will start on next launch</string>
</resources>
================================================
FILE: app/src/github/res/values-ar/strings.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="enable_sentry">تمكين الحراسة</string>
<string name="sentry_summary">الحراسة هي مستمع/معالج للأخطاء الذي يرسل الخطأ/الاحداث إلى Sentry.io</string>
<string name="sentry_start_next_launch">ستبدأ الحراسة عند التشغيل التالي</string>
</resources>
================================================
FILE: app/src/github/res/values-ca/strings.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="enable_sentry">Habilita el Sentry</string>
<string name="sentry_summary">Sentry és un oient/intèrpret d\'error que envia asíncronament l\'error/esdeveniment a Sentry.io</string>
<string name="sentry_start_next_launch">Sentry s\'iniciarà al pròxim llançament</string>
</resources>
================================================
FILE: app/src/github/res/values-cs/strings.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="enable_sentry">Povolit Sentry</string>
<string name="sentry_summary">Sentry je listener/handler, který zaznamenává chyby a asynchronně je posílá na Sentry.io</string>
<string name="sentry_start_next_launch">Sentry se spustí při příštím spuštění</string>
</resources>
================================================
FILE: app/src/github/res/values-de/strings.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="enable_sentry">Aktiviere Sentry</string>
<string name="sentry_summary">Sentry ist ein Listener/Handler für Fehler, der den Fehler/das Ereignis asynchron an Sentry.io sendet</string>
<string name="sentry_start_next_launch">Sentry startet beim nächsten Start</string>
</resources>
================================================
FILE: app/src/github/res/values-el/strings.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="enable_sentry">Ενεργοποίηση Sentry</string>
<string name="sentry_summary">Το Sentry είναι διαχειριστής σφαλμάτων ασύγχρονης αποστολής του σφάλματος/συμβάντος στο Sentry.io</string>
<string name="sentry_start_next_launch">Το Sentry θα ξεκινήσει στην επόμενη εκκίνηση</string>
</resources>
================================================
FILE: app/src/github/res/values-es/strings.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="enable_sentry">Activar Sentry</string>
<string name="sentry_summary">Sentry es un oyente/manejador de errores que asincrónicamente envía el error/evento a Sentry.io</string>
<string name="sentry_start_next_launch">Sentry comenzará en el próximo inicio</string>
</resources>
================================================
FILE: app/src/github/res/values-eu/strings.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="enable_sentry">Enable Sentry</string>
<string name="sentry_summary">Sentry is a listener/handler for errors that asynchronously sends out the error/event to Sentry.io</string>
<string name="sentry_start_next_launch">Sentry will start on next launch</string>
</resources>
================================================
FILE: app/src/github/res/values-fa/strings.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="enable_sentry">فعالسازی Sentry</string>
<string name="sentry_summary">Sentry is a listener/handler for errors that asynchronously sends out the error/event to Sentry.io</string>
<string name="sentry_start_next_launch">Sentry در اجرای بعدی، شروع خواهد شد</string>
</resources>
================================================
FILE: app/src/github/res/values-fr/strings.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="enable_sentry">Activer Sentry</string>
<string name="sentry_summary">Sentry est un écouteur/gestionnaire d\'erreurs qui envoie de manière asynchrone l\'erreur/l\'événement à Sentry.io</string>
<string name="sentry_start_next_launch">Sentry commencera au prochain lancement</string>
</resources>
================================================
FILE: app/src/github/res/values-hi/strings.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="enable_sentry">Enable Sentry</string>
<string name="sentry_summary">Sentry is a listener/handler for errors that asynchronously sends out the error/event to Sentry.io</string>
<string name="sentry_start_next_launch">Sentry will start on next launch</string>
</resources>
================================================
FILE: app/src/github/res/values-in/strings.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="enable_sentry">Hidupkan Sentry</string>
<string name="sentry_summary">Sentry adalah sebuah pendengar/penanganan eror yang secara asinkronis mengirimkan eror/kejadian ke Sentry.io</string>
<string name="sentry_start_next_launch">Sentry akan dihidupkan pada peluncuran berikutnya</string>
</resources>
================================================
FILE: app/src/github/res/values-it/strings.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="enable_sentry">Abilita Sentry</string>
<string name="sentry_summary">Sentry è un ascoltatore/gestore di errori che invia asincronicamente l\'errore/evento a Sentry.io</string>
<string name="sentry_start_next_launch">Sentry comincerà al prossimo lancio</string>
</resources>
================================================
FILE: app/src/github/res/values-ja/strings.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="enable_sentry">Enable Sentry</string>
<string name="sentry_summary">Sentry is a listener/handler for errors that asynchronously sends out the error/event to Sentry.io</string>
<string name="sentry_start_next_launch">Sentry will start on next launch</string>
</resources>
================================================
FILE: app/src/github/res/values-ko/strings.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="enable_sentry">Sentry 활성화</string>
<string name="sentry_summary">Sentry는 Sentry.io에 오류를 비동기적으로 보내는 오류 처리기입니다</string>
<string name="sentry_start_next_launch">Sentry는 다음 출시에 시작됩니다</string>
</resources>
================================================
FILE: app/src/github/res/values-mk/strings.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="enable_sentry">Овозможи Sentry</string>
<string name="sentry_summary">Sentry е слушач на грешки кој асинхроно ги испраќа на Sentry.io страната</string>
<string name="sentry_start_next_launch">Sentry ќе биде овозможен на следно отварање</string>
</resources>
================================================
FILE: app/src/github/res/values-nl/strings.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="enable_sentry">Sentry inschakelen</string>
<string name="sentry_summary">Sentry is een luister/handler voor fouten die asynchroon de fout/gebeurtenis versturen naar Sentry.io</string>
<string name="sentry_start_next_launch">Sentry zal starten bij de volgende lancering</string>
</resources>
================================================
FILE: app/src/github/res/values-or/strings.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="enable_sentry">Sentryକୁ ସକ୍ଷମ କରନ୍ତୁ</string>
<string name="sentry_summary">ତ୍ରୁଟି ପାଇଁ ସେଣ୍ଟ୍ରି ହେଉଛି ଏକ ଶ୍ରୋତା ଯାହା ତ୍ରୁଟି / ଘଟଣାକୁ Sentry.io କୁ ପଠାଏ |</string>
<string name="sentry_start_next_launch">ପରବର୍ତ୍ତୀ ଲଞ୍ଚଠାରୁ ସେଣ୍ଟ୍ରି ଆରମ୍ଭ ହେବ |</string>
</resources>
================================================
FILE: app/src/github/res/values-pl/strings.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="enable_sentry">Włącz Sentry</string>
<string name="sentry_summary">Sentry jest słuchaczem/obsługą błędów, które asynchronicznie wysyłają błąd/zdarzenie do Sentry.io</string>
<string name="sentry_start_next_launch">Sentry rozpocznie się przy następnym uruchomieniu</string>
</resources>
================================================
FILE: app/src/github/res/values-pt/strings.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="enable_sentry">Ativar Sentry</string>
<string name="sentry_summary">Sentry é um ouvinte/gestor de erros que assincronicamente envia o erro/evento para Sentry.io</string>
<string name="sentry_start_next_launch">Sentry começará no próximo início</string>
</resources>
================================================
FILE: app/src/github/res/values-ru/strings.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="enable_sentry">Включить Sentry</string>
<string name="sentry_summary">Sentry - это обработчик событий, который асинхронно отправляет сообщения об ошибках/поломках на Sentry.io</string>
<string name="sentry_start_next_launch">Sentry включится при следующем запуске приложения</string>
</resources>
================================================
FILE: app/src/github/res/values-sk/strings.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="enable_sentry">Enable Sentry</string>
<string name="sentry_summary">Sentry is a listener/handler for errors that asynchronously sends out the error/event to Sentry.io</string>
<string name="sentry_start_next_launch">Sentry will start on next launch</string>
</resources>
================================================
FILE: app/src/github/res/values-sv/strings.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="enable_sentry">Enable Sentry</string>
<string name="sentry_summary">Sentry is a listener/handler for errors that asynchronously sends out the error/event to Sentry.io</string>
<string name="sentry_start_next_launch">Sentry will start on next launch</string>
</resources>
================================================
FILE: app/src/github/res/values-tr/strings.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="enable_sentry">Enable Sentry</string>
<string name="sentry_summary">Sentry is a listener/handler for errors that asynchronously sends out the error/event to Sentry.io</string>
<string name="sentry_start_next_launch">Sentry will start on next launch</string>
</resources>
================================================
FILE: app/src/github/res/values-vi/strings.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="enable_sentry">Bật Sentry</string>
<string name="sentry_summary">Sentry là một thiết bị nghe/giải quyết cho những lỗi mà gửi những lỗi/sự kiện đến Sentry.io một cách tách biệt</string>
<string name="sentry_start_next_launch">Sentry sẽ được bật vào lần khởi động kế tiếp</string>
</resources>
================================================
FILE: app/src/github/res/values-zh-rCN/strings.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="enable_sentry">启用 Sentry</string>
<string name="sentry_summary">Sentry 会将错误报告发送至 Sentry.io</string>
<string name="sentry_start_next_launch">启用 Sentry 将在下次启动应用时生效</string>
</resources>
================================================
FILE: app/src/github/res/values-zh-rTW/strings.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="enable_sentry">啟用 Sentry</string>
<string name="sentry_summary">Sentry 會將錯誤報告發送至 Sentry.io</string>
<string name="sentry_start_next_launch">下次啟用應用程式時將會開啟 Sentry</string>
</resources>
================================================
FILE: app/src/main/AndroidManifest.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="awais.instagrabber">
<uses-permission android:name="android.permission.INTERNET" />
<!--<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />-->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.CAMERA" />
<!--<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />-->
<uses-feature
android:name="android.hardware.camera.any"
android:required="false" />
<application
android:name=".InstaGrabberApplication"
android:allowBackup="true"
android:backupAgent=".backup.BarinstaBackupAgent"
android:fullBackupContent="@xml/backup_descriptor"
android:fullBackupOnly="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme.Launcher"
tools:ignore="UnusedAttribute">
<activity
android:name=".activities.MainActivity"
android:launchMode="singleTop"
android:taskAffinity=".Main">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.SEND" />
<!-- <action android:name="android.intent.action.SEARCH" /> -->
<!-- <action android:name="android.intent.action.WEB_SEARCH" /> -->
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:mimeType="text/plain" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="http" />
<data android:scheme="https" />
<data android:host="instagr.am" />
<data android:host="www.instagr.am" />
<data android:host="instagram.com" />
<data android:host="www.instagram.com" />
<data android:pathPrefix="/" />
<data android:pathPrefix="/p" />
<data android:pathPrefix="/explore/tags" />
<data android:pathPrefix="/explore/locations" />
</intent-filter>
</activity>
<activity
android:name="awaisomereport.ErrorReporterActivity"
android:allowEmbedded="false"
android:allowTaskReparenting="false"
android:autoRemoveFromRecents="true"
android:clearTaskOnLaunch="true"
android:configChanges="keyboard|keyboardHidden|orientation|screenSize"
android:documentLaunchMode="never"
android:excludeFromRecents="true"
android:finishOnTaskLaunch="true"
android:launchMode="singleTask"
android:lockTaskMode="never"
android:noHistory="false"
android:screenOrientation="portrait"
android:taskAffinity="awais.instagrabber.errorreport"
android:theme="@android:style/Theme.DeviceDefault.Dialog" />
<activity
android:name=".activities.Login"
android:label="@string/login"
android:parentActivityName=".activities.MainActivity"
android:theme="@style/AppTheme.Light.White">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value=".activities.MainActivity" />
</activity>
<activity
android:name=".activities.CameraActivity"
android:label="Camera"
android:parentActivityName=".activities.MainActivity"
android:theme="@style/AppTheme.Light.White">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value=".activities.MainActivity" />
</activity>
<activity
android:name=".utils.ProcessPhoenix"
android:theme="@style/Theme.AppCompat.Translucent" />
<activity android:name=".activities.DirectorySelectActivity" />
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="${applicationId}.provider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/provider_paths" />
</provider>
<service
android:name=".services.ActivityCheckerService"
android:exported="false" />
<service
android:name=".services.DeleteImageIntentService"
android:exported="false" />
<service
android:name=".services.DMSyncService"
android:exported="false" />
<receiver
android:name=".services.DMSyncAlarmReceiver"
android:enabled="true"
android:exported="false" />
<!--<receiver android:name=".services.BootCompletedReceiver" >-->
<!-- <intent-filter>-->
<!-- <action android:name="android.intent.action.BOOT_COMPLETED" />-->
<!-- </intent-filter>-->
<!--</receiver>-->
<uses-library
android:name="org.apache.http.legacy"
android:required="false" />
<meta-data
android:name="fontProviderRequests"
android:value="Noto Color Emoji Compat" />
</application>
</manifest>
================================================
FILE: app/src/main/java/awais/instagrabber/InstaGrabberApplication.kt
================================================
package awais.instagrabber
import android.app.Application
import android.content.ClipboardManager
import android.util.Log
import awais.instagrabber.fragments.settings.PreferenceKeys.CUSTOM_DATE_TIME_FORMAT
import awais.instagrabber.fragments.settings.PreferenceKeys.CUSTOM_DATE_TIME_FORMAT_ENABLED
import awais.instagrabber.fragments.settings.PreferenceKeys.DATE_TIME_FORMAT
import awais.instagrabber.utils.*
import awais.instagrabber.utils.LocaleUtils.currentLocale
import awais.instagrabber.utils.Utils.settingsHelper
import awais.instagrabber.utils.extensions.TAG
import awaisomereport.CrashReporter
import com.facebook.drawee.backends.pipeline.Fresco
import com.facebook.imagepipeline.core.ImagePipelineConfig
import java.net.CookieHandler
import java.time.format.DateTimeFormatter
import java.util.*
@Suppress("unused")
class InstaGrabberApplication : Application() {
override fun onCreate() {
super.onCreate()
CookieHandler.setDefault(NET_COOKIE_MANAGER)
settingsHelper = SettingsHelper(this)
setupCrashReporter()
setupCloseGuard()
setupFresco()
Utils.cacheDir = cacheDir.absolutePath
Utils.clipboardManager = getSystemService(CLIPBOARD_SERVICE) as ClipboardManager
LocaleUtils.setLocale(baseContext)
val pattern = if (settingsHelper.getBoolean(CUSTOM_DATE_TIME_FORMAT_ENABLED)) {
settingsHelper.getString(CUSTOM_DATE_TIME_FORMAT)
} else {
settingsHelper.getString(DATE_TIME_FORMAT)
}
TextUtils.setFormatter(DateTimeFormatter.ofPattern(pattern, currentLocale))
if (TextUtils.isEmpty(settingsHelper.getString(Constants.DEVICE_UUID))) {
settingsHelper.putString(Constants.DEVICE_UUID, UUID.randomUUID().toString())
}
}
private fun setupCrashReporter() {
if (BuildConfig.DEBUG) return
CrashReporter.getInstance(this).start()
}
private fun setupCloseGuard() {
if (!BuildConfig.DEBUG) return
try {
Class.forName("dalvik.system.CloseGuard")
.getMethod("setEnabled", Boolean::class.javaPrimitiveType)
.invoke(null, true)
} catch (e: Exception) {
Log.e(TAG, "Error", e)
}
}
private fun setupFresco() {
// final Set<RequestListener> requestListeners = new HashSet<>();
// requestListeners.add(new RequestLoggingListener());
val imagePipelineConfig = ImagePipelineConfig
.newBuilder(this) // .setMainDiskCacheConfig(diskCacheConfig)
// .setRequestListeners(requestListeners)
.setDownsampleEnabled(true)
.build()
Fresco.initialize(this, imagePipelineConfig)
// FLog.setMinimumLoggingLevel(FLog.VERBOSE);
}
}
================================================
FILE: app/src/main/java/awais/instagrabber/activities/BaseLanguageActivity.kt
================================================
package awais.instagrabber.activities
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import awais.instagrabber.utils.LocaleUtils
import awais.instagrabber.utils.ThemeUtils
abstract class BaseLanguageActivity protected constructor() : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
ThemeUtils.changeTheme(this)
super.onCreate(savedInstanceState)
}
init {
@Suppress("LeakingThis")
LocaleUtils.updateConfig(this)
}
}
================================================
FILE: app/src/main/java/awais/instagrabber/activities/CameraActivity.kt
================================================
package awais.instagrabber.activities
import android.content.Intent
import android.content.res.Configuration
import android.hardware.display.DisplayManager
import android.hardware.display.DisplayManager.DisplayListener
import android.os.Bundle
import android.util.Log
import android.view.LayoutInflater
import androidx.camera.core.*
import androidx.camera.lifecycle.ProcessCameraProvider
import androidx.core.content.ContextCompat
import androidx.documentfile.provider.DocumentFile
import awais.instagrabber.databinding.ActivityCameraBinding
import awais.instagrabber.utils.DownloadUtils
import awais.instagrabber.utils.PermissionUtils
import awais.instagrabber.utils.Utils
import awais.instagrabber.utils.extensions.TAG
import java.io.IOException
import java.text.SimpleDateFormat
import java.util.*
import java.util.concurrent.ExecutionException
import java.util.concurrent.ExecutorService
import java.util.concurrent.Executors
class CameraActivity : BaseLanguageActivity() {
private lateinit var binding: ActivityCameraBinding
private lateinit var displayManager: DisplayManager
private lateinit var cameraExecutor: ExecutorService
private var outputDirectory: DocumentFile? = null
private var imageCapture: ImageCapture? = null
private var displayId = -1
private var cameraProvider: ProcessCameraProvider? = null
private var lensFacing = 0
private val cameraRequestCode = 100
private val simpleDateFormat = SimpleDateFormat("yyyy-MM-dd-HH-mm-ss-SSS", Locale.US)
private val displayListener: DisplayListener = object : DisplayListener {
override fun onDisplayAdded(displayId: Int) {}
override fun onDisplayRemoved(displayId: Int) {}
override fun onDisplayChanged(displayId: Int) {
if (displayId == this@CameraActivity.displayId) {
imageCapture?.targetRotation = binding.root.display.rotation
}
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityCameraBinding.inflate(LayoutInflater.from(baseContext))
setContentView(binding.root)
Utils.transparentStatusBar(this, true, false)
displayManager = getSystemService(DISPLAY_SERVICE) as DisplayManager
outputDirectory = DownloadUtils.cameraDir
cameraExecutor = Executors.newSingleThreadExecutor()
displayManager.registerDisplayListener(displayListener, null)
binding.viewFinder.post {
displayId = binding.viewFinder.display.displayId
updateUi()
checkPermissionsAndSetupCamera()
}
}
override fun onResume() {
super.onResume()
// Make sure that all permissions are still present, since the
// user could have removed them while the app was in paused state.
if (!PermissionUtils.hasCameraPerms(this)) {
PermissionUtils.requestCameraPerms(this, cameraRequestCode)
}
}
override fun onConfigurationChanged(newConfig: Configuration) {
super.onConfigurationChanged(newConfig)
// Redraw the camera UI controls
updateUi()
// Enable or disable switching between cameras
updateCameraSwitchButton()
}
override fun onDestroy() {
super.onDestroy()
Utils.transparentStatusBar(this, false, false)
cameraExecutor.shutdown()
displayManager.unregisterDisplayListener(displayListener)
}
private fun updateUi() {
binding.cameraCaptureButton.setOnClickListener { takePhoto() }
// Disable the button until the camera is set up
binding.switchCamera.isEnabled = false
// Listener for button used to switch cameras. Only called if the button is enabled
binding.switchCamera.setOnClickListener {
lensFacing = if (CameraSelector.LENS_FACING_FRONT == lensFacing) CameraSelector.LENS_FACING_BACK else CameraSelector.LENS_FACING_FRONT
// Re-bind use cases to update selected camera
bindCameraUseCases()
}
binding.close.setOnClickListener {
setResult(RESULT_CANCELED)
finish()
}
}
private fun checkPermissionsAndSetupCamera() {
if (PermissionUtils.hasCameraPerms(this)) {
setupCamera()
return
}
PermissionUtils.requestCameraPerms(this, cameraRequestCode)
}
override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<String>, grantResults: IntArray) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
if (requestCode == cameraRequestCode) {
if (PermissionUtils.hasCameraPerms(this)) {
setupCamera()
}
}
}
private fun setupCamera() {
val cameraProviderFuture = ProcessCameraProvider.getInstance(this)
cameraProviderFuture.addListener({
try {
cameraProvider = cameraProviderFuture.get()
// Select lensFacing depending on the available cameras
lensFacing = -1
if (hasBackCamera()) {
lensFacing = CameraSelector.LENS_FACING_BACK
} else if (hasFrontCamera()) {
lensFacing = CameraSelector.LENS_FACING_FRONT
}
check(lensFacing != -1) { "Back and front camera are unavailable" }
// Enable or disable switching between cameras
updateCameraSwitchButton()
// Build and bind the camera use cases
bindCameraUseCases()
} catch (e: ExecutionException) {
Log.e(TAG, "setupCamera: ", e)
} catch (e: InterruptedException) {
Log.e(TAG, "setupCamera: ", e)
} catch (e: CameraInfoUnavailableException) {
Log.e(TAG, "setupCamera: ", e)
}
}, ContextCompat.getMainExecutor(this))
}
private fun bindCameraUseCases() {
val rotation = binding.viewFinder.display.rotation
// CameraSelector
val cameraSelector = CameraSelector.Builder()
.requireLensFacing(lensFacing)
.build()
// Preview
val preview = Preview.Builder() // Set initial target rotation
.setTargetRotation(rotation)
.build()
// ImageCapture
imageCapture = ImageCapture.Builder()
.setCaptureMode(ImageCapture.CAPTURE_MODE_MINIMIZE_LATENCY) // Set initial target rotation, we will have to call this again if rotation changes
// during the lifecycle of this use case
.setTargetRotation(rotation)
.build()
cameraProvider?.unbindAll()
cameraProvider?.bindToLifecycle(this, cameraSelector, preview, imageCapture)
preview.setSurfaceProvider(binding.viewFinder.surfaceProvider)
}
private fun takePhoto() {
if (imageCapture == null) return
val fileName = simpleDateFormat.format(System.currentTimeMillis()) + ".jpg"
val mimeType = "image/jpg"
val photoFile = outputDirectory?.createFile(mimeType, fileName)?.let { it } ?: return
val outputStream = contentResolver.openOutputStream(photoFile.uri)?.let { it } ?: return
val outputFileOptions = ImageCapture.OutputFileOptions.Builder(outputStream).build()
imageCapture?.takePicture(
outputFileOptions,
cameraExecutor,
object : ImageCapture.OnImageSavedCallback {
@Suppress("UnstableApiUsage")
override fun onImageSaved(outputFileResults: ImageCapture.OutputFileResults) {
try { outputStream.close() } catch (ignored: IOException) {}
val intent = Intent()
intent.data = photoFile.uri
setResult(RESULT_OK, intent)
finish()
Log.d(TAG, "onImageSaved: " + photoFile.uri)
}
override fun onError(exception: ImageCaptureException) {
Log.e(TAG, "onError: ", exception)
try { outputStream.close() } catch (ignored: IOException) {}
}
}
)
// We can only change the foreground Drawable using API level 23+ API
// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
// // Display flash animation to indicate that photo was captured
// final ConstraintLayout container = binding.getRoot();
// container.postDelayed(() -> {
// container.setForeground(new ColorDrawable(Color.WHITE));
// container.postDelayed(() -> container.setForeground(null), 50);
// }, 100);
// }
}
/**
* Enabled or disabled a button to switch cameras depending on the available cameras
*/
private fun updateCameraSwitchButton() {
try {
binding.switchCamera.isEnabled = hasBackCamera() && hasFrontCamera()
} catch (e: CameraInfoUnavailableException) {
binding.switchCamera.isEnabled = false
}
}
/**
* Returns true if the device has an available back camera. False otherwise
*/
@Throws(CameraInfoUnavailableException::class)
private fun hasBackCamera(): Boolean {
return if (cameraProvider == null) false else cameraProvider?.hasCamera(CameraSelector.DEFAULT_BACK_CAMERA) ?: false
}
/**
* Returns true if the device has an available front camera. False otherwise
*/
@Throws(CameraInfoUnavailableException::class)
private fun hasFrontCamera(): Boolean {
return if (cameraProvider == null) {
false
} else cameraProvider?.hasCamera(CameraSelector.DEFAULT_FRONT_CAMERA) ?: false
}
}
================================================
FILE: app/src/main/java/awais/instagrabber/activities/DirectorySelectActivity.kt
================================================
package awais.instagrabber.activities
import android.annotation.SuppressLint
import android.content.ActivityNotFoundException
import android.content.Intent
import android.net.Uri
import android.os.Build
import android.os.Bundle
import android.provider.DocumentsContract
import android.util.Log
import android.view.View
import androidx.activity.viewModels
import awais.instagrabber.R
import awais.instagrabber.databinding.ActivityDirectorySelectBinding
import awais.instagrabber.dialogs.ConfirmDialogFragment
import awais.instagrabber.utils.AppExecutors.mainThread
import awais.instagrabber.utils.Constants
import awais.instagrabber.utils.extensions.TAG
import awais.instagrabber.viewmodels.DirectorySelectActivityViewModel
import java.io.IOException
import java.io.PrintWriter
import java.io.StringWriter
class DirectorySelectActivity : BaseLanguageActivity() {
private var initialUri: Uri? = null
private lateinit var binding: ActivityDirectorySelectBinding
private val viewModel: DirectorySelectActivityViewModel by viewModels()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityDirectorySelectBinding.inflate(layoutInflater)
setContentView(binding.root)
val intent = intent
viewModel.setInitialUri(intent)
setupObservers()
binding.selectDir.setOnClickListener { openDirectoryChooser() }
initialUri = intent.getParcelableExtra(Constants.EXTRA_INITIAL_URI)
}
private fun setupObservers() {
viewModel.message.observe(this, { message: String? -> binding.message.text = message })
viewModel.prevUri.observe(this, { prevUri: String? ->
if (prevUri == null) {
binding.prevUri.visibility = View.GONE
binding.message2.visibility = View.GONE
return@observe
}
binding.prevUri.text = prevUri
binding.prevUri.visibility = View.VISIBLE
binding.message2.visibility = View.VISIBLE
})
viewModel.dirSuccess.observe(this, { success: Boolean -> binding.selectDir.visibility = if (success) View.GONE else View.VISIBLE })
viewModel.loading.observe(this, { loading: Boolean ->
binding.message.visibility = if (loading) View.GONE else View.VISIBLE
binding.loadingIndicator.visibility = if (loading) View.VISIBLE else View.GONE
})
}
private fun openDirectoryChooser() {
val intent = Intent(Intent.ACTION_OPEN_DOCUMENT_TREE)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O && initialUri != null) {
intent.putExtra(DocumentsContract.EXTRA_INITIAL_URI, initialUri)
}
try {
startActivityForResult(intent, SELECT_DIR_REQUEST_CODE)
} catch (e: ActivityNotFoundException) {
Log.e(TAG, "openDirectoryChooser: ", e)
showErrorDialog(getString(R.string.no_directory_picker_activity))
} catch (e: Exception) {
Log.e(TAG, "openDirectoryChooser: ", e)
}
}
@SuppressLint("StringFormatInvalid")
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (requestCode != SELECT_DIR_REQUEST_CODE) return
if (resultCode != RESULT_OK) {
showErrorDialog(getString(R.string.select_a_folder))
return
}
if (data == null || data.data == null) {
showErrorDialog(getString(R.string.select_a_folder))
return
}
val authority = data.data?.authority
if ("com.android.externalstorage.documents" != authority) {
showErrorDialog(getString(R.string.dir_select_no_download_folder, authority))
return
}
mainThread.execute({
try {
viewModel.setupSelectedDir(data)
val intent = Intent(this, MainActivity::class.java)
startActivity(intent)
finish()
} catch (e: Exception) {
// Should not come to this point.
// If it does, we have to show this error to the user so that they can report it.
try {
StringWriter().use { sw ->
PrintWriter(sw).use { pw ->
e.printStackTrace(pw)
showErrorDialog("Please report this error to the developers:\n\n$sw")
}
}
} catch (ioException: IOException) {
Log.e(TAG, "onActivityResult: ", ioException)
}
}
}, 500)
}
private fun showErrorDialog(message: String) {
val dialogFragment = ConfirmDialogFragment.newInstance(
ERROR_REQUEST_CODE,
R.string.error,
message,
R.string.ok,
0,
0
)
dialogFragment.show(supportFragmentManager, ConfirmDialogFragment::class.java.simpleName)
}
companion object {
const val SELECT_DIR_REQUEST_CODE = 0x01
private const val ERROR_REQUEST_CODE = 0x02
}
}
================================================
FILE: app/src/main/java/awais/instagrabber/activities/Login.kt
================================================
package awais.instagrabber.activities
import android.annotation.SuppressLint
import android.content.Intent
import android.graphics.Bitmap
import android.os.Build
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.webkit.*
import android.widget.Toast
import awais.instagrabber.R
import awais.instagrabber.databinding.ActivityLoginBinding
import awais.instagrabber.utils.Constants
import awais.instagrabber.utils.getCookie
class Login : BaseLanguageActivity(), View.OnClickListener {
private var webViewUrl: String? = null
private var ready = false
private lateinit var loginBinding: ActivityLoginBinding
private val webChromeClient = WebChromeClient()
private val webViewClient: WebViewClient = object : WebViewClient() {
override fun onPageStarted(view: WebView, url: String, favicon: Bitmap?) {
webViewUrl = url
}
override fun onPageFinished(view: WebView, url: String) {
webViewUrl = url
val mainCookie = getCookie(url)
if (mainCookie.isNullOrBlank() || !mainCookie.contains("; ds_user_id=")) {
ready = true
return
}
if (mainCookie.contains("; ds_user_id=") && ready) {
returnCookieResult(mainCookie)
}
}
}
private fun returnCookieResult(mainCookie: String?) {
val intent = Intent()
intent.putExtra("cookie", mainCookie)
setResult(Constants.LOGIN_RESULT_CODE, intent)
finish()
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
loginBinding = ActivityLoginBinding.inflate(LayoutInflater.from(applicationContext))
setContentView(loginBinding.root)
initWebView()
loginBinding.cookies.setOnClickListener(this)
loginBinding.refresh.setOnClickListener(this)
}
override fun onClick(v: View) {
if (v === loginBinding.refresh) {
loginBinding.webView.loadUrl("https://instagram.com/")
return
}
if (v === loginBinding.cookies) {
val mainCookie = getCookie(webViewUrl)
if (mainCookie.isNullOrBlank() || !mainCookie.c
gitextract_v9zl8srd/ ├── .all-contributorsrc ├── .codebeatsettings ├── .github/ │ ├── CODE_OF_CONDUCT.md │ ├── CONTRIBUTING.md │ ├── FUNDING.yml │ ├── ISSUE_TEMPLATE/ │ │ ├── ban_report.md │ │ ├── bug_report.md │ │ ├── config.yml │ │ └── feature_request.md │ ├── issue_label_bot.yaml │ └── workflows/ │ ├── github_nightly_release.yml │ ├── github_pre_release.yml │ ├── label-bugs.yml │ └── label-duplicates.yml ├── .gitignore ├── .idea/ │ ├── .gitignore │ ├── .name │ ├── codeStyles │ ├── compiler.xml │ ├── gradle.xml │ ├── inspectionProfiles/ │ │ └── profiles_settings.xml │ ├── jarRepositories.xml │ ├── misc.xml │ ├── render.experimental.xml │ ├── runConfigurations/ │ │ └── app.xml │ ├── runConfigurations.xml │ └── vcs.xml ├── .project ├── .settings/ │ └── org.eclipse.buildship.core.prefs ├── CHANGELOG ├── LICENSE ├── README.md ├── SECURITY.md ├── app/ │ ├── .classpath │ ├── .gitignore │ ├── .project │ ├── .settings/ │ │ └── org.eclipse.buildship.core.prefs │ ├── build.gradle │ ├── lint.xml │ ├── proguard-rules.pro │ ├── schemas/ │ │ └── awais.instagrabber.db.AppDatabase/ │ │ ├── 4.json │ │ ├── 5.json │ │ └── 6.json │ ├── sentry.gradle │ └── src/ │ ├── androidTest/ │ │ └── java/ │ │ ├── awais/ │ │ │ └── instagrabber/ │ │ │ └── db/ │ │ │ ├── MigrationTest.java │ │ │ └── dao/ │ │ │ └── RecentSearchDaoTest.kt │ │ └── awaisomereport/ │ │ └── CrashReporterHelperTest.kt │ ├── fdroid/ │ │ └── java/ │ │ ├── awais/ │ │ │ └── instagrabber/ │ │ │ ├── fragments/ │ │ │ │ └── settings/ │ │ │ │ └── FlavorSettings.java │ │ │ └── utils/ │ │ │ └── UpdateChecker.java │ │ └── awaisomereport/ │ │ └── CrashHandler.kt │ ├── github/ │ │ ├── AndroidManifest.xml │ │ ├── java/ │ │ │ ├── awais/ │ │ │ │ └── instagrabber/ │ │ │ │ ├── fragments/ │ │ │ │ │ └── settings/ │ │ │ │ │ └── FlavorSettings.java │ │ │ │ └── utils/ │ │ │ │ └── UpdateChecker.java │ │ │ └── awaisomereport/ │ │ │ └── CrashHandler.kt │ │ └── res/ │ │ ├── values/ │ │ │ └── strings.xml │ │ ├── values-ar/ │ │ │ └── strings.xml │ │ ├── values-ca/ │ │ │ └── strings.xml │ │ ├── values-cs/ │ │ │ └── strings.xml │ │ ├── values-de/ │ │ │ └── strings.xml │ │ ├── values-el/ │ │ │ └── strings.xml │ │ ├── values-es/ │ │ │ └── strings.xml │ │ ├── values-eu/ │ │ │ └── strings.xml │ │ ├── values-fa/ │ │ │ └── strings.xml │ │ ├── values-fr/ │ │ │ └── strings.xml │ │ ├── values-hi/ │ │ │ └── strings.xml │ │ ├── values-in/ │ │ │ └── strings.xml │ │ ├── values-it/ │ │ │ └── strings.xml │ │ ├── values-ja/ │ │ │ └── strings.xml │ │ ├── values-ko/ │ │ │ └── strings.xml │ │ ├── values-mk/ │ │ │ └── strings.xml │ │ ├── values-nl/ │ │ │ └── strings.xml │ │ ├── values-or/ │ │ │ └── strings.xml │ │ ├── values-pl/ │ │ │ └── strings.xml │ │ ├── values-pt/ │ │ │ └── strings.xml │ │ ├── values-ru/ │ │ │ └── strings.xml │ │ ├── values-sk/ │ │ │ └── strings.xml │ │ ├── values-sv/ │ │ │ └── strings.xml │ │ ├── values-tr/ │ │ │ └── strings.xml │ │ ├── values-vi/ │ │ │ └── strings.xml │ │ ├── values-zh-rCN/ │ │ │ └── strings.xml │ │ └── values-zh-rTW/ │ │ └── strings.xml │ ├── main/ │ │ ├── AndroidManifest.xml │ │ ├── java/ │ │ │ ├── awais/ │ │ │ │ └── instagrabber/ │ │ │ │ ├── InstaGrabberApplication.kt │ │ │ │ ├── activities/ │ │ │ │ │ ├── BaseLanguageActivity.kt │ │ │ │ │ ├── CameraActivity.kt │ │ │ │ │ ├── DirectorySelectActivity.kt │ │ │ │ │ ├── Login.kt │ │ │ │ │ └── MainActivity.kt │ │ │ │ ├── adapters/ │ │ │ │ │ ├── AccountSwitcherAdapter.java │ │ │ │ │ ├── CommentsAdapter.java │ │ │ │ │ ├── DirectItemsAdapter.java │ │ │ │ │ ├── DirectMessageInboxAdapter.java │ │ │ │ │ ├── DirectPendingUsersAdapter.java │ │ │ │ │ ├── DirectReactionsAdapter.java │ │ │ │ │ ├── DirectUsersAdapter.java │ │ │ │ │ ├── DirectoryFilesAdapter.java │ │ │ │ │ ├── DiscoverTopicsAdapter.java │ │ │ │ │ ├── FavoritesAdapter.java │ │ │ │ │ ├── FeedAdapterV2.java │ │ │ │ │ ├── FeedItemCallbackAdapter.java │ │ │ │ │ ├── FeedStoriesAdapter.java │ │ │ │ │ ├── FeedStoriesListAdapter.java │ │ │ │ │ ├── FiltersAdapter.java │ │ │ │ │ ├── FollowAdapter.java │ │ │ │ │ ├── GifItemsAdapter.java │ │ │ │ │ ├── HighlightStoriesListAdapter.java │ │ │ │ │ ├── HighlightsAdapter.java │ │ │ │ │ ├── KeywordsFilterAdapter.java │ │ │ │ │ ├── LikesAdapter.java │ │ │ │ │ ├── NotificationsAdapter.java │ │ │ │ │ ├── SavedCollectionsAdapter.java │ │ │ │ │ ├── SearchCategoryAdapter.java │ │ │ │ │ ├── SearchItemsAdapter.java │ │ │ │ │ ├── SliderCallbackAdapter.java │ │ │ │ │ ├── SliderItemsAdapter.java │ │ │ │ │ ├── StoriesAdapter.java │ │ │ │ │ ├── TabsAdapter.java │ │ │ │ │ ├── UserSearchResultsAdapter.java │ │ │ │ │ └── viewholder/ │ │ │ │ │ ├── CommentViewHolder.java │ │ │ │ │ ├── DiscoverViewHolder.java │ │ │ │ │ ├── FavoriteViewHolder.java │ │ │ │ │ ├── FeedGridItemViewHolder.java │ │ │ │ │ ├── FeedStoryViewHolder.java │ │ │ │ │ ├── FilterViewHolder.java │ │ │ │ │ ├── FollowsViewHolder.java │ │ │ │ │ ├── HighlightViewHolder.java │ │ │ │ │ ├── NotificationViewHolder.java │ │ │ │ │ ├── SearchItemViewHolder.java │ │ │ │ │ ├── SliderItemViewHolder.java │ │ │ │ │ ├── SliderPhotoViewHolder.java │ │ │ │ │ ├── SliderVideoViewHolder.java │ │ │ │ │ ├── StoryListViewHolder.java │ │ │ │ │ ├── TabViewHolder.java │ │ │ │ │ ├── TopicClusterViewHolder.java │ │ │ │ │ ├── dialogs/ │ │ │ │ │ │ └── KeywordsFilterDialogViewHolder.java │ │ │ │ │ ├── directmessages/ │ │ │ │ │ │ ├── DirectInboxItemViewHolder.java │ │ │ │ │ │ ├── DirectItemActionLogViewHolder.java │ │ │ │ │ │ ├── DirectItemAnimatedMediaViewHolder.java │ │ │ │ │ │ ├── DirectItemDefaultViewHolder.java │ │ │ │ │ │ ├── DirectItemLikeViewHolder.java │ │ │ │ │ │ ├── DirectItemLinkViewHolder.java │ │ │ │ │ │ ├── DirectItemMediaShareViewHolder.java │ │ │ │ │ │ ├── DirectItemMediaViewHolder.java │ │ │ │ │ │ ├── DirectItemPlaceholderViewHolder.java │ │ │ │ │ │ ├── DirectItemProfileViewHolder.java │ │ │ │ │ │ ├── DirectItemRavenMediaViewHolder.java │ │ │ │ │ │ ├── DirectItemReelShareViewHolder.java │ │ │ │ │ │ ├── DirectItemStoryShareViewHolder.java │ │ │ │ │ │ ├── DirectItemTextViewHolder.java │ │ │ │ │ │ ├── DirectItemVideoCallEventViewHolder.java │ │ │ │ │ │ ├── DirectItemViewHolder.java │ │ │ │ │ │ ├── DirectItemVoiceMediaViewHolder.java │ │ │ │ │ │ ├── DirectItemXmaViewHolder.java │ │ │ │ │ │ ├── DirectPendingUserViewHolder.java │ │ │ │ │ │ ├── DirectReactionViewHolder.java │ │ │ │ │ │ ├── DirectUserViewHolder.java │ │ │ │ │ │ └── RecipientThreadViewHolder.java │ │ │ │ │ └── feed/ │ │ │ │ │ ├── FeedItemViewHolder.java │ │ │ │ │ ├── FeedPhotoViewHolder.java │ │ │ │ │ ├── FeedSliderViewHolder.java │ │ │ │ │ └── FeedVideoViewHolder.java │ │ │ │ ├── animations/ │ │ │ │ │ ├── CubicBezierInterpolator.java │ │ │ │ │ ├── FabAnimation.java │ │ │ │ │ ├── ResizeAnimation.java │ │ │ │ │ ├── RevealOutlineAnimation.java │ │ │ │ │ ├── RoundedRectRevealOutlineProvider.java │ │ │ │ │ └── ScaleAnimation.java │ │ │ │ ├── asyncs/ │ │ │ │ │ ├── DiscoverPostFetchService.java │ │ │ │ │ ├── FeedPostFetchService.java │ │ │ │ │ ├── HashtagPostFetchService.java │ │ │ │ │ ├── LocationPostFetchService.java │ │ │ │ │ ├── ProfilePostFetchService.java │ │ │ │ │ └── SavedPostFetchService.java │ │ │ │ ├── backup/ │ │ │ │ │ └── BarinstaBackupAgent.kt │ │ │ │ ├── broadcasts/ │ │ │ │ │ └── DMRefreshBroadcastReceiver.java │ │ │ │ ├── customviews/ │ │ │ │ │ ├── BarinstaFragmentNavigator.kt │ │ │ │ │ ├── BarinstaNavHostFragment.kt │ │ │ │ │ ├── ChatMessageLayout.java │ │ │ │ │ ├── CircularImageView.java │ │ │ │ │ ├── CommentMentionClickSpan.java │ │ │ │ │ ├── DirectItemContextMenu.java │ │ │ │ │ ├── DirectItemFrameLayout.java │ │ │ │ │ ├── FixedImageView.java │ │ │ │ │ ├── FormattedNumberTextView.java │ │ │ │ │ ├── InsetsAnimationLinearLayout.java │ │ │ │ │ ├── InsetsNotifyingCoordinatorLayout.java │ │ │ │ │ ├── InsetsNotifyingLinearLayout.java │ │ │ │ │ ├── KeyNotifyingEmojiEditText.java │ │ │ │ │ ├── MouseDrawer.java │ │ │ │ │ ├── PostsRecyclerView.java │ │ │ │ │ ├── PrimaryActionModeCallback.java │ │ │ │ │ ├── ProfilePicView.java │ │ │ │ │ ├── RamboTextViewV2.java │ │ │ │ │ ├── ReactionEmojiTextView.java │ │ │ │ │ ├── RecordButton.java │ │ │ │ │ ├── RecordView.java │ │ │ │ │ ├── SharedElementTransitionDialogFragment.java │ │ │ │ │ ├── SquareImageView.java │ │ │ │ │ ├── TextViewDrawableSize.java │ │ │ │ │ ├── Tooltip.java │ │ │ │ │ ├── UsernameTextView.java │ │ │ │ │ ├── VerticalDragHelper.java │ │ │ │ │ ├── VerticalImageSpan.java │ │ │ │ │ ├── VideoPlayerCallbackAdapter.java │ │ │ │ │ ├── VideoPlayerViewHelper.java │ │ │ │ │ ├── drawee/ │ │ │ │ │ │ ├── AbstractAnimatedZoomableController.java │ │ │ │ │ │ ├── AnimatedZoomableController.java │ │ │ │ │ │ ├── DefaultZoomableController.java │ │ │ │ │ │ ├── DoubleTapGestureListener.java │ │ │ │ │ │ ├── DraggableZoomableDraweeView.java │ │ │ │ │ │ ├── GestureListenerWrapper.java │ │ │ │ │ │ ├── MultiGestureListener.java │ │ │ │ │ │ ├── MultiPointerGestureDetector.java │ │ │ │ │ │ ├── MultiZoomableControllerListener.java │ │ │ │ │ │ ├── TransformGestureDetector.java │ │ │ │ │ │ ├── ZoomableController.java │ │ │ │ │ │ └── ZoomableDraweeView.java │ │ │ │ │ ├── emoji/ │ │ │ │ │ │ ├── Emoji.java │ │ │ │ │ │ ├── EmojiBottomSheetDialog.java │ │ │ │ │ │ ├── EmojiCategory.java │ │ │ │ │ │ ├── EmojiCategoryPageViewHolder.java │ │ │ │ │ │ ├── EmojiCategoryType.java │ │ │ │ │ │ ├── EmojiGridAdapter.java │ │ │ │ │ │ ├── EmojiPicker.java │ │ │ │ │ │ ├── EmojiPickerPageAdapter.java │ │ │ │ │ │ ├── EmojiVariantManager.java │ │ │ │ │ │ ├── EmojiVariantPopup.java │ │ │ │ │ │ ├── GoogleCompatEmojiDrawable.java │ │ │ │ │ │ └── ReactionsManager.java │ │ │ │ │ ├── helpers/ │ │ │ │ │ │ ├── ChangeText.java │ │ │ │ │ │ ├── ControlFocusInsetsAnimationCallback.java │ │ │ │ │ │ ├── CustomHideBottomViewOnScrollBehavior.java │ │ │ │ │ │ ├── EmojiPickerInsetsAnimationCallback.java │ │ │ │ │ │ ├── GridAutofitLayoutManager.java │ │ │ │ │ │ ├── GridSpacingItemDecoration.java │ │ │ │ │ │ ├── HeaderItemDecoration.java │ │ │ │ │ │ ├── HeightProvider.java │ │ │ │ │ │ ├── ImageResizingControllerListener.java │ │ │ │ │ │ ├── NestedCoordinatorLayout.java │ │ │ │ │ │ ├── NestedScrollableHost.java │ │ │ │ │ │ ├── PostFetcher.java │ │ │ │ │ │ ├── RecordViewAnimationHelper.java │ │ │ │ │ │ ├── RecyclerLazyLoader.java │ │ │ │ │ │ ├── RecyclerLazyLoaderAtEdge.java │ │ │ │ │ │ ├── RootViewDeferringInsetsCallback.java │ │ │ │ │ │ ├── SimpleImeAnimationController.java │ │ │ │ │ │ ├── SwipeAndRestoreItemTouchHelperCallback.java │ │ │ │ │ │ ├── SwipeGestureListener.java │ │ │ │ │ │ ├── TextWatcherAdapter.java │ │ │ │ │ │ ├── TranslateDeferringInsetsAnimationCallback.java │ │ │ │ │ │ ├── VerticalSpaceItemDecoration.java │ │ │ │ │ │ └── VideoAwareRecyclerScroller.java │ │ │ │ │ └── masoudss_waveform/ │ │ │ │ │ ├── SoundParser.java │ │ │ │ │ ├── WaveFormProgressChangeListener.java │ │ │ │ │ ├── WaveGravity.java │ │ │ │ │ └── WaveformSeekBar.java │ │ │ │ ├── db/ │ │ │ │ │ ├── AppDatabase.kt │ │ │ │ │ ├── Converters.kt │ │ │ │ │ ├── dao/ │ │ │ │ │ │ ├── AccountDao.kt │ │ │ │ │ │ ├── DMLastNotifiedDao.kt │ │ │ │ │ │ ├── FavoriteDao.kt │ │ │ │ │ │ └── RecentSearchDao.kt │ │ │ │ │ ├── datasources/ │ │ │ │ │ │ ├── AccountDataSource.kt │ │ │ │ │ │ ├── DMLastNotifiedDataSource.kt │ │ │ │ │ │ ├── FavoriteDataSource.kt │ │ │ │ │ │ └── RecentSearchDataSource.kt │ │ │ │ │ ├── entities/ │ │ │ │ │ │ ├── Account.kt │ │ │ │ │ │ ├── DMLastNotified.kt │ │ │ │ │ │ ├── Favorite.kt │ │ │ │ │ │ └── RecentSearch.kt │ │ │ │ │ └── repositories/ │ │ │ │ │ ├── AccountRepository.kt │ │ │ │ │ ├── DMLastNotifiedRepository.kt │ │ │ │ │ ├── FavoriteRepository.kt │ │ │ │ │ └── RecentSearchRepository.kt │ │ │ │ ├── dialogs/ │ │ │ │ │ ├── AccountSwitcherDialogFragment.java │ │ │ │ │ ├── ConfirmDialogFragment.java │ │ │ │ │ ├── CreateBackupDialogFragment.java │ │ │ │ │ ├── DirectItemReactionDialogFragment.java │ │ │ │ │ ├── EditTextDialogFragment.java │ │ │ │ │ ├── GifPickerBottomDialogFragment.java │ │ │ │ │ ├── KeywordsFilterDialog.java │ │ │ │ │ ├── MultiOptionDialogFragment.java │ │ │ │ │ ├── PostLoadingDialogFragment.kt │ │ │ │ │ ├── PostsLayoutPreferencesDialogFragment.kt │ │ │ │ │ ├── ProfilePicDialogFragment.java │ │ │ │ │ ├── RestoreBackupDialogFragment.java │ │ │ │ │ ├── TabOrderPreferenceDialogFragment.java │ │ │ │ │ └── TimeSettingsDialog.java │ │ │ │ ├── fragments/ │ │ │ │ │ ├── CollectionPostsFragment.java │ │ │ │ │ ├── FavoritesFragment.kt │ │ │ │ │ ├── FollowViewerFragment.kt │ │ │ │ │ ├── HashTagFragment.java │ │ │ │ │ ├── LikesViewerFragment.java │ │ │ │ │ ├── LocationFragment.java │ │ │ │ │ ├── NotificationsViewerFragment.java │ │ │ │ │ ├── PostViewV2Fragment.java │ │ │ │ │ ├── SavedCollectionsFragment.java │ │ │ │ │ ├── SavedViewerFragment.java │ │ │ │ │ ├── StoryListViewerFragment.java │ │ │ │ │ ├── StoryViewerFragment.kt │ │ │ │ │ ├── UserSearchFragment.kt │ │ │ │ │ ├── UserSearchMode.kt │ │ │ │ │ ├── comments/ │ │ │ │ │ │ ├── CommentsViewerFragment.java │ │ │ │ │ │ ├── Helper.java │ │ │ │ │ │ └── RepliesFragment.java │ │ │ │ │ ├── directmessages/ │ │ │ │ │ │ ├── DirectMessageInboxFragment.kt │ │ │ │ │ │ ├── DirectMessageSettingsFragment.kt │ │ │ │ │ │ ├── DirectMessageThreadFragment.java │ │ │ │ │ │ └── DirectPendingInboxFragment.kt │ │ │ │ │ ├── imageedit/ │ │ │ │ │ │ ├── FiltersFragment.java │ │ │ │ │ │ ├── ImageEditFragment.java │ │ │ │ │ │ └── filters/ │ │ │ │ │ │ ├── FiltersHelper.java │ │ │ │ │ │ ├── custom/ │ │ │ │ │ │ │ ├── GPUImage1977Filter.java │ │ │ │ │ │ │ ├── GPUImageAdenFilter.java │ │ │ │ │ │ │ └── GPUImageClarendonFilter.java │ │ │ │ │ │ ├── filters/ │ │ │ │ │ │ │ ├── AdenFilter.java │ │ │ │ │ │ │ ├── BilateralBlurFilter.java │ │ │ │ │ │ │ ├── BoxBlurFilter.java │ │ │ │ │ │ │ ├── BrightnessFilter.java │ │ │ │ │ │ │ ├── ClarendonFilter.java │ │ │ │ │ │ │ ├── ContrastFilter.java │ │ │ │ │ │ │ ├── ExposureFilter.java │ │ │ │ │ │ │ ├── Filter.java │ │ │ │ │ │ │ ├── FilterFactory.java │ │ │ │ │ │ │ ├── NormalFilter.java │ │ │ │ │ │ │ ├── One977Filter.java │ │ │ │ │ │ │ ├── SaturationFilter.java │ │ │ │ │ │ │ ├── SepiaToneFilter.java │ │ │ │ │ │ │ ├── SharpenFilter.java │ │ │ │ │ │ │ ├── VibranceFilter.java │ │ │ │ │ │ │ └── VignetteFilter.java │ │ │ │ │ │ └── properties/ │ │ │ │ │ │ ├── ColorProperty.java │ │ │ │ │ │ ├── FloatProperty.java │ │ │ │ │ │ ├── PointFProperty.java │ │ │ │ │ │ └── Property.java │ │ │ │ │ ├── main/ │ │ │ │ │ │ ├── DiscoverFragment.java │ │ │ │ │ │ ├── FeedFragment.java │ │ │ │ │ │ └── ProfileFragment.kt │ │ │ │ │ ├── search/ │ │ │ │ │ │ ├── SearchCategoryFragment.java │ │ │ │ │ │ └── SearchFragment.java │ │ │ │ │ └── settings/ │ │ │ │ │ ├── AboutFragment.java │ │ │ │ │ ├── BackupPreferencesFragment.java │ │ │ │ │ ├── BasePreferencesFragment.java │ │ │ │ │ ├── DMPreferencesFragment.java │ │ │ │ │ ├── DownloadsPreferencesFragment.java │ │ │ │ │ ├── GeneralPreferencesFragment.java │ │ │ │ │ ├── IFlavorSettings.java │ │ │ │ │ ├── LocalePreferencesFragment.java │ │ │ │ │ ├── MorePreferencesFragment.java │ │ │ │ │ ├── NotificationsPreferencesFragment.java │ │ │ │ │ ├── PostPreferencesFragment.java │ │ │ │ │ ├── PreferenceHelper.java │ │ │ │ │ ├── PreferenceKeys.kt │ │ │ │ │ ├── SettingCategory.java │ │ │ │ │ ├── SettingsPreferencesFragment.java │ │ │ │ │ ├── StoriesPreferencesFragment.java │ │ │ │ │ └── ThemePreferencesFragment.java │ │ │ │ ├── interfaces/ │ │ │ │ │ ├── FetchListener.java │ │ │ │ │ ├── LazyLoadListener.java │ │ │ │ │ ├── OnGroupClickListener.java │ │ │ │ │ └── SwipeEvent.java │ │ │ │ ├── managers/ │ │ │ │ │ ├── DirectMessagesManager.kt │ │ │ │ │ ├── InboxManager.kt │ │ │ │ │ └── ThreadManager.kt │ │ │ │ ├── models/ │ │ │ │ │ ├── Comment.kt │ │ │ │ │ ├── IntentModel.kt │ │ │ │ │ ├── PostsLayoutPreferences.java │ │ │ │ │ ├── Resource.kt │ │ │ │ │ ├── SavedImageEditState.kt │ │ │ │ │ ├── Tab.kt │ │ │ │ │ ├── UploadPhotoOptions.kt │ │ │ │ │ ├── UploadVideoOptions.kt │ │ │ │ │ └── enums/ │ │ │ │ │ ├── BroadcastItemType.kt │ │ │ │ │ ├── DirectItemType.kt │ │ │ │ │ ├── FavoriteType.kt │ │ │ │ │ ├── FollowingType.kt │ │ │ │ │ ├── IntentModelType.kt │ │ │ │ │ ├── MediaItemType.kt │ │ │ │ │ ├── NotificationType.kt │ │ │ │ │ ├── PostItemType.kt │ │ │ │ │ ├── RavenMediaViewMode.kt │ │ │ │ │ └── StoryPaginationType.kt │ │ │ │ ├── repositories/ │ │ │ │ │ ├── CollectionRepository.java │ │ │ │ │ ├── CommentRepository.java │ │ │ │ │ ├── DirectMessagesService.kt │ │ │ │ │ ├── DiscoverRepository.java │ │ │ │ │ ├── FeedRepository.java │ │ │ │ │ ├── FriendshipService.kt │ │ │ │ │ ├── GifRepository.java │ │ │ │ │ ├── GraphQLService.kt │ │ │ │ │ ├── LocationRepository.java │ │ │ │ │ ├── MediaService.kt │ │ │ │ │ ├── NewsRepository.java │ │ │ │ │ ├── ProfileService.kt │ │ │ │ │ ├── SearchService.kt │ │ │ │ │ ├── StoriesService.kt │ │ │ │ │ ├── TagsRepository.java │ │ │ │ │ ├── UserService.kt │ │ │ │ │ ├── requests/ │ │ │ │ │ │ ├── StoryViewerOptions.java │ │ │ │ │ │ ├── UploadFinishOptions.kt │ │ │ │ │ │ └── directmessages/ │ │ │ │ │ │ ├── AnimatedMediaBroadcastOptions.kt │ │ │ │ │ │ ├── BroadcastOptions.kt │ │ │ │ │ │ ├── LinkBroadcastOptions.kt │ │ │ │ │ │ ├── MediaShareBroadcastOptions.kt │ │ │ │ │ │ ├── PhotoBroadcastOptions.kt │ │ │ │ │ │ ├── ProfileBroadcastOptions.kt │ │ │ │ │ │ ├── ReactionBroadcastOptions.kt │ │ │ │ │ │ ├── StoryBroadcastOptions.kt │ │ │ │ │ │ ├── StoryReplyBroadcastOptions.kt │ │ │ │ │ │ ├── TextBroadcastOptions.kt │ │ │ │ │ │ ├── ThreadIdsOrUserIds.kt │ │ │ │ │ │ ├── VideoBroadcastOptions.kt │ │ │ │ │ │ └── VoiceBroadcastOptions.kt │ │ │ │ │ ├── responses/ │ │ │ │ │ │ ├── AnimatedMediaFixedHeight.kt │ │ │ │ │ │ ├── AnimatedMediaImages.kt │ │ │ │ │ │ ├── Audio.kt │ │ │ │ │ │ ├── AymlResponse.kt │ │ │ │ │ │ ├── Caption.kt │ │ │ │ │ │ ├── ChildCommentsFetchResponse.kt │ │ │ │ │ │ ├── CommentsFetchResponse.kt │ │ │ │ │ │ ├── FriendshipChangeResponse.kt │ │ │ │ │ │ ├── FriendshipListFetchResponse.kt │ │ │ │ │ │ ├── FriendshipRestrictResponse.kt │ │ │ │ │ │ ├── FriendshipStatus.kt │ │ │ │ │ │ ├── GraphQLUserListFetchResponse.java │ │ │ │ │ │ ├── Hashtag.kt │ │ │ │ │ │ ├── ImageUrl.kt │ │ │ │ │ │ ├── ImageVersions2.kt │ │ │ │ │ │ ├── LikersResponse.kt │ │ │ │ │ │ ├── Location.java │ │ │ │ │ │ ├── LocationFeedResponse.kt │ │ │ │ │ │ ├── Media.kt │ │ │ │ │ │ ├── MediaCandidate.kt │ │ │ │ │ │ ├── MediaInfoResponse.kt │ │ │ │ │ │ ├── NewsInboxResponse.kt │ │ │ │ │ │ ├── Place.kt │ │ │ │ │ │ ├── PostsFetchResponse.kt │ │ │ │ │ │ ├── TagFeedResponse.kt │ │ │ │ │ │ ├── User.kt │ │ │ │ │ │ ├── UserFeedResponse.kt │ │ │ │ │ │ ├── UserProfileContextLink.kt │ │ │ │ │ │ ├── UserSearchResponse.kt │ │ │ │ │ │ ├── UsertagIn.java │ │ │ │ │ │ ├── Usertags.java │ │ │ │ │ │ ├── WrappedFeedResponse.java │ │ │ │ │ │ ├── WrappedMedia.kt │ │ │ │ │ │ ├── WrappedUser.kt │ │ │ │ │ │ ├── directmessages/ │ │ │ │ │ │ │ ├── DirectBadgeCount.kt │ │ │ │ │ │ │ ├── DirectInbox.kt │ │ │ │ │ │ │ ├── DirectInboxResponse.kt │ │ │ │ │ │ │ ├── DirectItem.kt │ │ │ │ │ │ │ ├── DirectItemActionLog.kt │ │ │ │ │ │ │ ├── DirectItemAnimatedMedia.kt │ │ │ │ │ │ │ ├── DirectItemClip.kt │ │ │ │ │ │ │ ├── DirectItemEmojiReaction.kt │ │ │ │ │ │ │ ├── DirectItemFelixShare.kt │ │ │ │ │ │ │ ├── DirectItemLink.kt │ │ │ │ │ │ │ ├── DirectItemLinkContext.kt │ │ │ │ │ │ │ ├── DirectItemPlaceholder.kt │ │ │ │ │ │ │ ├── DirectItemReactions.kt │ │ │ │ │ │ │ ├── DirectItemReelShare.kt │ │ │ │ │ │ │ ├── DirectItemReelShareReactionInfo.kt │ │ │ │ │ │ │ ├── DirectItemSeenResponse.kt │ │ │ │ │ │ │ ├── DirectItemSeenResponsePayload.kt │ │ │ │ │ │ │ ├── DirectItemStoryShare.kt │ │ │ │ │ │ │ ├── DirectItemVideoCallEvent.kt │ │ │ │ │ │ │ ├── DirectItemVisualMedia.kt │ │ │ │ │ │ │ ├── DirectItemVoiceMedia.kt │ │ │ │ │ │ │ ├── DirectItemXma.kt │ │ │ │ │ │ │ ├── DirectThread.kt │ │ │ │ │ │ │ ├── DirectThreadBroadcastResponse.kt │ │ │ │ │ │ │ ├── DirectThreadBroadcastResponseMessageMetadata.kt │ │ │ │ │ │ │ ├── DirectThreadBroadcastResponsePayload.kt │ │ │ │ │ │ │ ├── DirectThreadDetailsChangeResponse.kt │ │ │ │ │ │ │ ├── DirectThreadDirectStory.kt │ │ │ │ │ │ │ ├── DirectThreadFeedResponse.kt │ │ │ │ │ │ │ ├── DirectThreadLastSeenAt.kt │ │ │ │ │ │ │ ├── DirectThreadParticipantRequestsResponse.kt │ │ │ │ │ │ │ ├── RankedRecipient.kt │ │ │ │ │ │ │ ├── RankedRecipientsResponse.kt │ │ │ │ │ │ │ ├── RavenExpiringMediaActionSummary.kt │ │ │ │ │ │ │ ├── TextRange.kt │ │ │ │ │ │ │ └── ThreadContext.kt │ │ │ │ │ │ ├── discover/ │ │ │ │ │ │ │ ├── TopicCluster.kt │ │ │ │ │ │ │ └── TopicalExploreFeedResponse.kt │ │ │ │ │ │ ├── feed/ │ │ │ │ │ │ │ ├── EndOfFeedDemarcator.java │ │ │ │ │ │ │ ├── EndOfFeedGroup.java │ │ │ │ │ │ │ ├── EndOfFeedGroupSet.java │ │ │ │ │ │ │ └── FeedFetchResponse.java │ │ │ │ │ │ ├── giphy/ │ │ │ │ │ │ │ ├── GiphyGif.java │ │ │ │ │ │ │ ├── GiphyGifImage.java │ │ │ │ │ │ │ ├── GiphyGifImages.java │ │ │ │ │ │ │ ├── GiphyGifResponse.java │ │ │ │ │ │ │ └── GiphyGifResults.java │ │ │ │ │ │ ├── notification/ │ │ │ │ │ │ │ ├── Notification.kt │ │ │ │ │ │ │ ├── NotificationArgs.java │ │ │ │ │ │ │ ├── NotificationCounts.kt │ │ │ │ │ │ │ └── NotificationImage.kt │ │ │ │ │ │ ├── saved/ │ │ │ │ │ │ │ ├── CollectionsListResponse.kt │ │ │ │ │ │ │ └── SavedCollection.kt │ │ │ │ │ │ ├── search/ │ │ │ │ │ │ │ ├── SearchItem.java │ │ │ │ │ │ │ └── SearchResponse.kt │ │ │ │ │ │ └── stories/ │ │ │ │ │ │ ├── ArchiveResponse.kt │ │ │ │ │ │ ├── Broadcast.kt │ │ │ │ │ │ ├── CoverMedia.kt │ │ │ │ │ │ ├── PollSticker.kt │ │ │ │ │ │ ├── QuestionSticker.kt │ │ │ │ │ │ ├── QuizSticker.kt │ │ │ │ │ │ ├── ReelsMediaResponse.kt │ │ │ │ │ │ ├── ReelsResponse.kt │ │ │ │ │ │ ├── ReelsTrayResponse.kt │ │ │ │ │ │ ├── SliderSticker.kt │ │ │ │ │ │ ├── Story.kt │ │ │ │ │ │ ├── StoryAppAttribution.kt │ │ │ │ │ │ ├── StoryCta.kt │ │ │ │ │ │ ├── StoryMedia.kt │ │ │ │ │ │ ├── StoryMediaResponse.kt │ │ │ │ │ │ ├── StorySticker.kt │ │ │ │ │ │ ├── StoryStickerResponse.kt │ │ │ │ │ │ └── Tally.kt │ │ │ │ │ └── serializers/ │ │ │ │ │ └── CaptionDeserializer.java │ │ │ │ ├── services/ │ │ │ │ │ ├── ActivityCheckerService.java │ │ │ │ │ ├── BootCompletedReceiver.java │ │ │ │ │ ├── DMSyncAlarmReceiver.java │ │ │ │ │ ├── DMSyncService.java │ │ │ │ │ └── DeleteImageIntentService.java │ │ │ │ ├── utils/ │ │ │ │ │ ├── AppExecutors.kt │ │ │ │ │ ├── BarinstaDeepLinkHelper.kt │ │ │ │ │ ├── BitmapUtils.kt │ │ │ │ │ ├── CombinedDrawable.kt │ │ │ │ │ ├── ConcurrencyHelpers.kt │ │ │ │ │ ├── Constants.kt │ │ │ │ │ ├── CookieUtils.kt │ │ │ │ │ ├── CoroutineUtils.kt │ │ │ │ │ ├── CubicInterpolation.kt │ │ │ │ │ ├── DMUtils.java │ │ │ │ │ ├── DateUtils.kt │ │ │ │ │ ├── Debouncer.java │ │ │ │ │ ├── DeepLinkParser.kt │ │ │ │ │ ├── DirectItemFactory.kt │ │ │ │ │ ├── DownloadUtils.kt │ │ │ │ │ ├── Event.kt │ │ │ │ │ ├── ExoplayerUtils.kt │ │ │ │ │ ├── ExportImportUtils.java │ │ │ │ │ ├── FlavorTown.java │ │ │ │ │ ├── IntentUtils.kt │ │ │ │ │ ├── KeywordsFilterUtils.kt │ │ │ │ │ ├── LocaleUtils.kt │ │ │ │ │ ├── MediaUploadHelper.kt │ │ │ │ │ ├── MediaUploader.kt │ │ │ │ │ ├── MediaUtils.java │ │ │ │ │ ├── NavigationExtensions.java │ │ │ │ │ ├── NavigationHelper.kt │ │ │ │ │ ├── NetworkUtils.java │ │ │ │ │ ├── NullSafePair.kt │ │ │ │ │ ├── NumberUtils.kt │ │ │ │ │ ├── PasswordUtils.kt │ │ │ │ │ ├── PermissionUtils.kt │ │ │ │ │ ├── ProcessPhoenix.java │ │ │ │ │ ├── RankedRecipientsCache.kt │ │ │ │ │ ├── ResponseBodyUtils.java │ │ │ │ │ ├── SerializablePair.kt │ │ │ │ │ ├── SettingsHelper.kt │ │ │ │ │ ├── SingleLiveEvent.kt │ │ │ │ │ ├── SingletonHolder.kt │ │ │ │ │ ├── TextUtils.kt │ │ │ │ │ ├── ThemeUtils.kt │ │ │ │ │ ├── UpdateCheckCommon.kt │ │ │ │ │ ├── UserAgentUtils.kt │ │ │ │ │ ├── Utils.java │ │ │ │ │ ├── ViewUtils.kt │ │ │ │ │ ├── VoiceRecorder.java │ │ │ │ │ ├── emoji/ │ │ │ │ │ │ ├── EmojiCategoryDeserializer.kt │ │ │ │ │ │ ├── EmojiDeserializer.kt │ │ │ │ │ │ └── EmojiParser.kt │ │ │ │ │ └── extensions/ │ │ │ │ │ ├── AnyExtensions.kt │ │ │ │ │ ├── StringExtensions.kt │ │ │ │ │ └── UserExtensions.kt │ │ │ │ ├── viewmodels/ │ │ │ │ │ ├── AppStateViewModel.java │ │ │ │ │ ├── ArchivesViewModel.java │ │ │ │ │ ├── CommentsViewerViewModel.java │ │ │ │ │ ├── DirectInboxViewModel.kt │ │ │ │ │ ├── DirectPendingInboxViewModel.kt │ │ │ │ │ ├── DirectSettingsViewModel.kt │ │ │ │ │ ├── DirectThreadViewModel.kt │ │ │ │ │ ├── DirectorySelectActivityViewModel.kt │ │ │ │ │ ├── FavoritesViewModel.kt │ │ │ │ │ ├── FeedStoriesViewModel.java │ │ │ │ │ ├── FileListViewModel.java │ │ │ │ │ ├── FiltersFragmentViewModel.java │ │ │ │ │ ├── FollowViewModel.kt │ │ │ │ │ ├── GifPickerViewModel.java │ │ │ │ │ ├── ImageEditViewModel.java │ │ │ │ │ ├── MediaViewModel.java │ │ │ │ │ ├── NotificationViewModel.java │ │ │ │ │ ├── PostViewV2ViewModel.kt │ │ │ │ │ ├── ProfileFragmentViewModel.kt │ │ │ │ │ ├── SavedCollectionsViewModel.java │ │ │ │ │ ├── SearchFragmentViewModel.kt │ │ │ │ │ ├── StoryFragmentViewModel.kt │ │ │ │ │ ├── TopicClusterViewModel.java │ │ │ │ │ ├── UserSearchViewModel.java │ │ │ │ │ └── factories/ │ │ │ │ │ ├── DirectSettingsViewModelFactory.java │ │ │ │ │ └── DirectThreadViewModelFactory.java │ │ │ │ ├── webservices/ │ │ │ │ │ ├── CollectionService.java │ │ │ │ │ ├── CommentService.java │ │ │ │ │ ├── DirectMessagesRepository.kt │ │ │ │ │ ├── DiscoverService.java │ │ │ │ │ ├── FeedService.java │ │ │ │ │ ├── FriendshipRepository.kt │ │ │ │ │ ├── GifService.java │ │ │ │ │ ├── GraphQLRepository.kt │ │ │ │ │ ├── LocationService.java │ │ │ │ │ ├── MediaRepository.kt │ │ │ │ │ ├── NewsService.java │ │ │ │ │ ├── ProfileRepository.kt │ │ │ │ │ ├── RetrofitFactory.kt │ │ │ │ │ ├── SearchRepository.kt │ │ │ │ │ ├── ServiceCallback.java │ │ │ │ │ ├── StoriesRepository.kt │ │ │ │ │ ├── TagsService.java │ │ │ │ │ ├── UserRepository.kt │ │ │ │ │ └── interceptors/ │ │ │ │ │ ├── AddCookiesInterceptor.java │ │ │ │ │ ├── IgErrorsInterceptor.java │ │ │ │ │ └── LoggingInterceptor.java │ │ │ │ └── workers/ │ │ │ │ └── DownloadWorker.kt │ │ │ ├── awaisomereport/ │ │ │ │ ├── CrashReporter.kt │ │ │ │ ├── CrashReporterHelper.kt │ │ │ │ ├── ErrorReporterActivity.kt │ │ │ │ └── ICrashHandler.kt │ │ │ └── thoughtbot/ │ │ │ └── expandableadapter/ │ │ │ ├── ExpandableGroup.java │ │ │ ├── ExpandableList.java │ │ │ ├── ExpandableListPosition.java │ │ │ └── GroupViewHolder.java │ │ └── res/ │ │ ├── anim/ │ │ │ ├── dialog_anim_in.xml │ │ │ ├── dialog_anim_out.xml │ │ │ ├── slide_in_right.xml │ │ │ ├── slide_left.xml │ │ │ ├── slide_out_left.xml │ │ │ └── slide_right.xml │ │ ├── animator/ │ │ │ ├── basket_path.xml │ │ │ └── delete_mic_animation.xml │ │ ├── color/ │ │ │ ├── emoji_picker_tab_color.xml │ │ │ ├── filter_name_color.xml │ │ │ ├── ic_circle_check_tint.xml │ │ │ ├── ic_read_button_tint.xml │ │ │ └── image_edit_tab_tint.xml │ │ ├── drawable/ │ │ │ ├── avd_mic_to_send_anim.xml │ │ │ ├── avd_send_to_mic_anim.xml │ │ │ ├── background_grey_ripple.xml │ │ │ ├── bg_dm_date_header.xml │ │ │ ├── bg_dm_time.xml │ │ │ ├── bg_indicator.xml │ │ │ ├── bg_input.xml │ │ │ ├── bg_media_share_bottom.xml │ │ │ ├── bg_media_share_top_incoming.xml │ │ │ ├── bg_media_share_top_outgoing.xml │ │ │ ├── bg_quote_line.xml │ │ │ ├── bg_reply_text.xml │ │ │ ├── bg_rounded_corner.xml │ │ │ ├── bg_speech_bubble_incoming.xml │ │ │ ├── bg_speech_bubble_outgoing.xml │ │ │ ├── bg_user_search_input.xml │ │ │ ├── ic_account_clock_24.xml │ │ │ ├── ic_account_multiple_remove_24.xml │ │ │ ├── ic_add.xml │ │ │ ├── ic_archive.xml │ │ │ ├── ic_arrow_drop_down_24.xml │ │ │ ├── ic_arrow_upward_24.xml │ │ │ ├── ic_baseline_check_circle_24.xml │ │ │ ├── ic_block_24.xml │ │ │ ├── ic_bookmark.xml │ │ │ ├── ic_border_style_flipped_24.xml │ │ │ ├── ic_camera_24.xml │ │ │ ├── ic_cancel.xml │ │ │ ├── ic_check_24.xml │ │ │ ├── ic_check_all_24.xml │ │ │ ├── ic_checkbox_multiple_blank.xml │ │ │ ├── ic_checkbox_multiple_blank_stroke.xml │ │ │ ├── ic_circle_check.xml │ │ │ ├── ic_class_24.xml │ │ │ ├── ic_clock_alert_outline_24.xml │ │ │ ├── ic_close_24.xml │ │ │ ├── ic_cloud_download_24.xml │ │ │ ├── ic_dashboard_24.xml │ │ │ ├── ic_delete.xml │ │ │ ├── ic_download.xml │ │ │ ├── ic_download_circle_24.xml │ │ │ ├── ic_explore_24.xml │ │ │ ├── ic_face_24.xml │ │ │ ├── ic_file_24.xml │ │ │ ├── ic_folder_24.xml │ │ │ ├── ic_forward_5_24.xml │ │ │ ├── ic_forward_5_24_a50.xml │ │ │ ├── ic_forward_5_24_states.xml │ │ │ ├── ic_highlight_off_24.xml │ │ │ ├── ic_home_24.xml │ │ │ ├── ic_image_24.xml │ │ │ ├── ic_keyboard_24.xml │ │ │ ├── ic_keyboard_arrow_down_24.xml │ │ │ ├── ic_keyboard_arrow_up_24.xml │ │ │ ├── ic_launcher_background.xml │ │ │ ├── ic_like.xml │ │ │ ├── ic_logout_24.xml │ │ │ ├── ic_message_24.xml │ │ │ ├── ic_more_horiz_24.xml │ │ │ ├── ic_more_vert_24.xml │ │ │ ├── ic_not_liked.xml │ │ │ ├── ic_notes_24.xml │ │ │ ├── ic_notif.xml │ │ │ ├── ic_open_in_new_24.xml │ │ │ ├── ic_outline_class_24.xml │ │ │ ├── ic_outline_comments_24.xml │ │ │ ├── ic_outline_info_24.xml │ │ │ ├── ic_outline_map_24.xml │ │ │ ├── ic_outline_person_add_24.xml │ │ │ ├── ic_outline_person_add_disabled_24.xml │ │ │ ├── ic_outline_person_pin_24.xml │ │ │ ├── ic_outline_settings_24.xml │ │ │ ├── ic_outline_star_plus_24.xml │ │ │ ├── ic_outline_views_24.xml │ │ │ ├── ic_pause_24.xml │ │ │ ├── ic_person_24.xml │ │ │ ├── ic_photo_filter.xml │ │ │ ├── ic_play_arrow_24.xml │ │ │ ├── ic_play_arrow_24_a50.xml │ │ │ ├── ic_play_circle_outline_24.xml │ │ │ ├── ic_play_states.xml │ │ │ ├── ic_profile_24.xml │ │ │ ├── ic_profile_40.xml │ │ │ ├── ic_profile_48.xml │ │ │ ├── ic_radio_button_unchecked_24.xml │ │ │ ├── ic_refresh_24.xml │ │ │ ├── ic_replay_5_24.xml │ │ │ ├── ic_replay_5_24_a50.xml │ │ │ ├── ic_replay_5_24_states.xml │ │ │ ├── ic_round_add_circle_24.xml │ │ │ ├── ic_round_arrow_back_24.xml │ │ │ ├── ic_round_attach_file_rot45_24.xml │ │ │ ├── ic_round_backspace_24.xml │ │ │ ├── ic_round_bookmark_border_24.xml │ │ │ ├── ic_round_check_circle_24.xml │ │ │ ├── ic_round_crop_24.xml │ │ │ ├── ic_round_drag_handle_24.xml │ │ │ ├── ic_round_edit_24.xml │ │ │ ├── ic_round_emoji_emotions_24.xml │ │ │ ├── ic_round_emoji_events_24.xml │ │ │ ├── ic_round_emoji_flags_24.xml │ │ │ ├── ic_round_emoji_food_beverage_24.xml │ │ │ ├── ic_round_emoji_nature_24.xml │ │ │ ├── ic_round_emoji_objects_24.xml │ │ │ ├── ic_round_emoji_symbols_24.xml │ │ │ ├── ic_round_emoji_transportation_24.xml │ │ │ ├── ic_round_flip_camera_24.xml │ │ │ ├── ic_round_gif_24.xml │ │ │ ├── ic_round_location_on_24.xml │ │ │ ├── ic_round_mode_comment_24.xml │ │ │ ├── ic_round_pause_24.xml │ │ │ ├── ic_round_play_arrow_24.xml │ │ │ ├── ic_round_remove_circle_24.xml │ │ │ ├── ic_round_reply_24.xml │ │ │ ├── ic_round_send_24.xml │ │ │ ├── ic_round_tune_24.xml │ │ │ ├── ic_round_unknown_24.xml │ │ │ ├── ic_rounded_corner_24.xml │ │ │ ├── ic_search_24.xml │ │ │ ├── ic_settings_backup_restore_24.xml │ │ │ ├── ic_shutter.xml │ │ │ ├── ic_shutter_focused.xml │ │ │ ├── ic_shutter_normal.xml │ │ │ ├── ic_shutter_pressed.xml │ │ │ ├── ic_slider_24.xml │ │ │ ├── ic_star_24.xml │ │ │ ├── ic_star_check_24.xml │ │ │ ├── ic_sticker_curved_outlines.xml │ │ │ ├── ic_story_list.xml │ │ │ ├── ic_story_viewer_list.xml │ │ │ ├── ic_submit.xml │ │ │ ├── ic_suggested_users.xml │ │ │ ├── ic_unread_indicator_24.xml │ │ │ ├── ic_video_24.xml │ │ │ ├── ic_view_agenda_24.xml │ │ │ ├── ic_view_grid_24.xml │ │ │ ├── ic_volume_off_24.xml │ │ │ ├── ic_volume_off_24_a50.xml │ │ │ ├── ic_volume_off_24_states.xml │ │ │ ├── ic_volume_up_24.xml │ │ │ ├── ic_volume_up_24_a50.xml │ │ │ ├── ic_volume_up_24_states.xml │ │ │ ├── ic_warning.xml │ │ │ ├── launch.xml │ │ │ ├── launch_dark.xml │ │ │ ├── launch_screen.xml │ │ │ ├── lock.xml │ │ │ ├── popup_background_exoplayer.xml │ │ │ ├── pref_list_divider_material.xml │ │ │ ├── recv_basket_animated.xml │ │ │ ├── recv_ic_arrow.xml │ │ │ ├── recv_ic_delete.xml │ │ │ ├── recv_ic_mic.xml │ │ │ ├── rounder_corner_bg.xml │ │ │ ├── rounder_corner_semi_black_bg.xml │ │ │ ├── shape_oval_light.xml │ │ │ ├── sl_favourite_24.xml │ │ │ └── speed_text_color_states.xml │ │ ├── layout/ │ │ │ ├── activity_camera.xml │ │ │ ├── activity_crash_error.xml │ │ │ ├── activity_directory_select.xml │ │ │ ├── activity_login.xml │ │ │ ├── activity_main.xml │ │ │ ├── dialog_account_switcher.xml │ │ │ ├── dialog_create_backup.xml │ │ │ ├── dialog_keywords_filter.xml │ │ │ ├── dialog_opening_post.xml │ │ │ ├── dialog_post_layout_preferences.xml │ │ │ ├── dialog_post_view.xml │ │ │ ├── dialog_profilepic.xml │ │ │ ├── dialog_restore_backup.xml │ │ │ ├── dialog_time_settings.xml │ │ │ ├── fragment_collection_posts.xml │ │ │ ├── fragment_comments.xml │ │ │ ├── fragment_direct_messages_inbox.xml │ │ │ ├── fragment_direct_messages_settings.xml │ │ │ ├── fragment_direct_messages_thread.xml │ │ │ ├── fragment_direct_pending_inbox.xml │ │ │ ├── fragment_discover.xml │ │ │ ├── fragment_favorites.xml │ │ │ ├── fragment_feed.xml │ │ │ ├── fragment_filters.xml │ │ │ ├── fragment_followers_viewer.xml │ │ │ ├── fragment_hashtag.xml │ │ │ ├── fragment_image_edit.xml │ │ │ ├── fragment_likes.xml │ │ │ ├── fragment_location.xml │ │ │ ├── fragment_notifications_viewer.xml │ │ │ ├── fragment_profile.xml │ │ │ ├── fragment_saved.xml │ │ │ ├── fragment_saved_collections.xml │ │ │ ├── fragment_search.xml │ │ │ ├── fragment_story_list_viewer.xml │ │ │ ├── fragment_story_viewer.xml │ │ │ ├── fragment_topic_posts.xml │ │ │ ├── fragment_user_search.xml │ │ │ ├── header_follow.xml │ │ │ ├── item_comment.xml │ │ │ ├── item_dir_list.xml │ │ │ ├── item_discover_topic.xml │ │ │ ├── item_emoji_grid.xml │ │ │ ├── item_fav_section_header.xml │ │ │ ├── item_feed_grid.xml │ │ │ ├── item_feed_photo.xml │ │ │ ├── item_feed_slider.xml │ │ │ ├── item_feed_top.xml │ │ │ ├── item_feed_video.xml │ │ │ ├── item_filter.xml │ │ │ ├── item_follow.xml │ │ │ ├── item_highlight.xml │ │ │ ├── item_keyword.xml │ │ │ ├── item_media.xml │ │ │ ├── item_notification.xml │ │ │ ├── item_post.xml │ │ │ ├── item_pref_divider.xml │ │ │ ├── item_search_result.xml │ │ │ ├── item_slider_photo.xml │ │ │ ├── item_story.xml │ │ │ ├── item_tab_order_pref.xml │ │ │ ├── layout_controls.xml │ │ │ ├── layout_direct_item_options.xml │ │ │ ├── layout_directory_chooser.xml │ │ │ ├── layout_dm_action_log.xml │ │ │ ├── layout_dm_animated_media.xml │ │ │ ├── layout_dm_base.xml │ │ │ ├── layout_dm_header.xml │ │ │ ├── layout_dm_inbox_item.xml │ │ │ ├── layout_dm_like.xml │ │ │ ├── layout_dm_link.xml │ │ │ ├── layout_dm_media.xml │ │ │ ├── layout_dm_media_share.xml │ │ │ ├── layout_dm_pending_user_item.xml │ │ │ ├── layout_dm_profile.xml │ │ │ ├── layout_dm_raven_media.xml │ │ │ ├── layout_dm_reel_share.xml │ │ │ ├── layout_dm_story_share.xml │ │ │ ├── layout_dm_text.xml │ │ │ ├── layout_dm_user_item.xml │ │ │ ├── layout_dm_voice_media.xml │ │ │ ├── layout_emoji_variant_popup.xml │ │ │ ├── layout_exo_custom_controls.xml │ │ │ ├── layout_gif_picker.xml │ │ │ ├── layout_hashtag_details.xml │ │ │ ├── layout_include_custom_format_info.xml │ │ │ ├── layout_include_toolbar.xml │ │ │ ├── layout_location_details.xml │ │ │ ├── layout_post_view_bottom.xml │ │ │ ├── layout_profile_details.xml │ │ │ ├── layout_searchview.xml │ │ │ ├── layout_video_player_with_thumbnail.xml │ │ │ ├── pref_account_switcher.xml │ │ │ ├── pref_auto_refresh_dm_freq.xml │ │ │ ├── pref_more_header.xml │ │ │ └── record_view_layout.xml │ │ ├── layout-land/ │ │ │ └── activity_camera.xml │ │ ├── menu/ │ │ │ ├── bottom_nav_menu.xml │ │ │ ├── collection_posts_menu.xml │ │ │ ├── comment_options_menu.xml │ │ │ ├── dm_inbox_menu.xml │ │ │ ├── dm_thread_menu.xml │ │ │ ├── feed_menu.xml │ │ │ ├── follow.xml │ │ │ ├── hashtag_menu.xml │ │ │ ├── location_menu.xml │ │ │ ├── main_menu.xml │ │ │ ├── menu.xml │ │ │ ├── multi_select_download_menu.xml │ │ │ ├── post_view_menu.xml │ │ │ ├── profile_menu.xml │ │ │ ├── saved.xml │ │ │ ├── saved_collection_menu.xml │ │ │ ├── saved_collection_select_menu.xml │ │ │ ├── saved_viewer_menu.xml │ │ │ ├── search.xml │ │ │ ├── speed_menu.xml │ │ │ ├── story_menu.xml │ │ │ └── topic_posts_menu.xml │ │ ├── mipmap-anydpi-v26/ │ │ │ ├── ic_launcher.xml │ │ │ └── ic_launcher_round.xml │ │ ├── navigation/ │ │ │ ├── direct_messages_nav_graph.xml │ │ │ ├── discover_nav_graph.xml │ │ │ ├── favorites_nav_graph.xml │ │ │ ├── feed_nav_graph.xml │ │ │ ├── more_nav_graph.xml │ │ │ ├── notification_viewer_nav_graph.xml │ │ │ ├── profile_nav_graph.xml │ │ │ ├── root_nav_graph.xml │ │ │ └── settings_nav_graph.xml │ │ ├── raw/ │ │ │ └── emojis.json │ │ ├── values/ │ │ │ ├── arrays.xml │ │ │ ├── attrs.xml │ │ │ ├── bool.xml │ │ │ ├── color.xml │ │ │ ├── dimens.xml │ │ │ ├── drawables.xml │ │ │ ├── font_certs.xml │ │ │ ├── ids.xml │ │ │ ├── strings.xml │ │ │ ├── styles.xml │ │ │ └── themes.xml │ │ ├── values-ar/ │ │ │ ├── arrays.xml │ │ │ └── strings.xml │ │ ├── values-ca/ │ │ │ ├── arrays.xml │ │ │ └── strings.xml │ │ ├── values-cs/ │ │ │ ├── arrays.xml │ │ │ └── strings.xml │ │ ├── values-de/ │ │ │ ├── arrays.xml │ │ │ └── strings.xml │ │ ├── values-el/ │ │ │ ├── arrays.xml │ │ │ └── strings.xml │ │ ├── values-es/ │ │ │ ├── arrays.xml │ │ │ └── strings.xml │ │ ├── values-eu/ │ │ │ ├── arrays.xml │ │ │ └── strings.xml │ │ ├── values-fa/ │ │ │ ├── arrays.xml │ │ │ └── strings.xml │ │ ├── values-fr/ │ │ │ ├── arrays.xml │ │ │ └── strings.xml │ │ ├── values-hi/ │ │ │ ├── arrays.xml │ │ │ └── strings.xml │ │ ├── values-in/ │ │ │ ├── arrays.xml │ │ │ └── strings.xml │ │ ├── values-it/ │ │ │ ├── arrays.xml │ │ │ └── strings.xml │ │ ├── values-ja/ │ │ │ ├── arrays.xml │ │ │ └── strings.xml │ │ ├── values-kn/ │ │ │ └── arrays.xml │ │ ├── values-ko/ │ │ │ ├── arrays.xml │ │ │ └── strings.xml │ │ ├── values-land/ │ │ │ └── dimens.xml │ │ ├── values-mk/ │ │ │ ├── arrays.xml │ │ │ └── strings.xml │ │ ├── values-night/ │ │ │ ├── bool.xml │ │ │ ├── color.xml │ │ │ └── styles.xml │ │ ├── values-nl/ │ │ │ ├── arrays.xml │ │ │ └── strings.xml │ │ ├── values-or/ │ │ │ ├── arrays.xml │ │ │ └── strings.xml │ │ ├── values-pl/ │ │ │ ├── arrays.xml │ │ │ └── strings.xml │ │ ├── values-pt/ │ │ │ ├── arrays.xml │ │ │ └── strings.xml │ │ ├── values-ru/ │ │ │ ├── arrays.xml │ │ │ └── strings.xml │ │ ├── values-sk/ │ │ │ ├── arrays.xml │ │ │ └── strings.xml │ │ ├── values-sv/ │ │ │ ├── arrays.xml │ │ │ └── strings.xml │ │ ├── values-tr/ │ │ │ ├── arrays.xml │ │ │ └── strings.xml │ │ ├── values-vi/ │ │ │ ├── arrays.xml │ │ │ └── strings.xml │ │ ├── values-zh-rCN/ │ │ │ ├── arrays.xml │ │ │ └── strings.xml │ │ ├── values-zh-rTW/ │ │ │ ├── arrays.xml │ │ │ └── strings.xml │ │ └── xml/ │ │ ├── backup_descriptor.xml │ │ └── provider_paths.xml │ └── test/ │ └── java/ │ └── awais/ │ └── instagrabber/ │ ├── LiveDataTestUtil.kt │ ├── MainCoroutineScopeRule.kt │ ├── common/ │ │ └── Adapters.kt │ ├── utils/ │ │ ├── CubicInterpolationTest.java │ │ ├── DownloadUtilsTest.java │ │ ├── IntentUtilsTest.java │ │ └── TextUtilsTest.java │ └── viewmodels/ │ └── ProfileFragmentViewModelTest.kt ├── build.gradle ├── crowdin.yml ├── fastlane/ │ └── metadata/ │ └── android/ │ ├── en-US/ │ │ ├── changelogs/ │ │ │ ├── 32.txt │ │ │ ├── 33.txt │ │ │ ├── 36.txt │ │ │ ├── 37.txt │ │ │ ├── 38.txt │ │ │ ├── 39.txt │ │ │ ├── 40.txt │ │ │ ├── 41.txt │ │ │ ├── 42.txt │ │ │ ├── 43.txt │ │ │ ├── 44.txt │ │ │ ├── 45.txt │ │ │ ├── 46.txt │ │ │ ├── 47.txt │ │ │ ├── 48.txt │ │ │ ├── 49.txt │ │ │ ├── 52.txt │ │ │ ├── 53.txt │ │ │ ├── 54.txt │ │ │ ├── 55.txt │ │ │ ├── 56.txt │ │ │ ├── 57.txt │ │ │ ├── 60.txt │ │ │ ├── 61.txt │ │ │ ├── 62.txt │ │ │ ├── 63.txt │ │ │ ├── 64.txt │ │ │ └── 65.txt │ │ ├── full_description.txt │ │ └── short_description.txt │ └── fr-FR/ │ ├── full_description.txt │ └── short_description.txt ├── gradle/ │ └── wrapper/ │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradle.properties ├── gradlew ├── gradlew.bat ├── renovate.json └── settings.gradle
Showing preview only (284K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (3305 symbols across 319 files)
FILE: app/src/androidTest/java/awais/instagrabber/db/MigrationTest.java
class MigrationTest (line 20) | @RunWith(AndroidJUnit4.class)
method MigrationTest (line 28) | public MigrationTest() {
method migrateAll (line 35) | @Test
FILE: app/src/fdroid/java/awais/instagrabber/fragments/settings/FlavorSettings.java
class FlavorSettings (line 15) | public final class FlavorSettings implements IFlavorSettings {
method FlavorSettings (line 19) | private FlavorSettings() {
method getInstance (line 22) | public static FlavorSettings getInstance() {
method getPreferences (line 29) | @NonNull
FILE: app/src/fdroid/java/awais/instagrabber/utils/UpdateChecker.java
class UpdateChecker (line 14) | public class UpdateChecker {
method getInstance (line 20) | public static UpdateChecker getInstance() {
method getLatestVersion (line 36) | @Nullable
method onDownload (line 61) | public void onDownload(@NonNull final AppCompatActivity context) {
FILE: app/src/github/java/awais/instagrabber/fragments/settings/FlavorSettings.java
class FlavorSettings (line 20) | public final class FlavorSettings implements IFlavorSettings {
method FlavorSettings (line 24) | private FlavorSettings() {
method getInstance (line 27) | public static FlavorSettings getInstance() {
method getPreferences (line 34) | @NonNull
method getGeneralPrefs (line 48) | private List<Preference> getGeneralPrefs(@NonNull final Context context,
method getSentryPreference (line 55) | private Preference getSentryPreference(@NonNull final Context context,
FILE: app/src/github/java/awais/instagrabber/utils/UpdateChecker.java
class UpdateChecker (line 12) | public class UpdateChecker {
method getInstance (line 18) | public static UpdateChecker getInstance() {
method getLatestVersion (line 34) | @Nullable
method onDownload (line 58) | public void onDownload(@NonNull final Context context) {
FILE: app/src/main/java/awais/instagrabber/adapters/AccountSwitcherAdapter.java
class AccountSwitcherAdapter (line 22) | public class AccountSwitcherAdapter extends ListAdapter<Account, Account...
method areItemsTheSame (line 25) | @Override
method areContentsTheSame (line 30) | @Override
method AccountSwitcherAdapter (line 39) | public AccountSwitcherAdapter(final OnAccountClickListener clickListener,
method onCreateViewHolder (line 46) | @NonNull
method onBindViewHolder (line 54) | @Override
type OnAccountClickListener (line 63) | public interface OnAccountClickListener {
method onAccountClick (line 64) | void onAccountClick(final Account model, final boolean isCurrent);
type OnAccountLongClickListener (line 67) | public interface OnAccountLongClickListener {
method onAccountLongClick (line 68) | boolean onAccountLongClick(final Account model, final boolean isCurr...
class ViewHolder (line 71) | public static class ViewHolder extends RecyclerView.ViewHolder {
method ViewHolder (line 74) | public ViewHolder(final PrefAccountSwitcherBinding binding) {
method bind (line 80) | @SuppressLint("SetTextI18n")
FILE: app/src/main/java/awais/instagrabber/adapters/CommentsAdapter.java
class CommentsAdapter (line 16) | public final class CommentsAdapter extends ListAdapter<Comment, CommentV...
method areItemsTheSame (line 18) | @Override
method areContentsTheSame (line 23) | @Override
method CommentsAdapter (line 33) | public CommentsAdapter(final long currentUserId,
method onCreateViewHolder (line 42) | @NonNull
method onBindViewHolder (line 50) | @Override
type CommentCallback (line 56) | public interface CommentCallback {
method onClick (line 57) | void onClick(final Comment comment);
method onHashtagClick (line 59) | void onHashtagClick(final String hashtag);
method onMentionClick (line 61) | void onMentionClick(final String mention);
method onURLClick (line 63) | void onURLClick(final String url);
method onEmailClick (line 65) | void onEmailClick(final String emailAddress);
method onLikeClick (line 67) | void onLikeClick(final Comment comment, boolean liked, final boolean...
method onRepliesClick (line 69) | void onRepliesClick(final Comment comment);
method onViewLikes (line 71) | void onViewLikes(Comment comment);
method onTranslate (line 73) | void onTranslate(Comment comment);
method onDelete (line 75) | void onDelete(Comment comment, boolean isReply);
FILE: app/src/main/java/awais/instagrabber/adapters/DirectItemsAdapter.java
class DirectItemsAdapter (line 62) | public final class DirectItemsAdapter extends RecyclerView.Adapter<Recyc...
method areItemsTheSame (line 75) | @Override
method areContentsTheSame (line 98) | @Override
method DirectItemsAdapter (line 114) | public DirectItemsAdapter(@NonNull final User currentUser,
method onCreateViewHolder (line 133) | @NonNull
method getItemViewHolder (line 148) | @NonNull
method onBindViewHolder (line 224) | @Override
method getItem (line 235) | protected DirectItemOrHeader getItem(int position) {
method getItemCount (line 239) | @Override
method getItemViewType (line 244) | @Override
method getItemId (line 257) | @Override
method setThread (line 269) | public void setThread(final DirectThread thread) {
method submitList (line 275) | public void submitList(@Nullable final List<DirectItem> list) {
method submitList (line 284) | public void submitList(@Nullable final List<DirectItem> list, @Nullabl...
method sectionAndSort (line 293) | private List<DirectItemOrHeader> sectionAndSort(final List<DirectItem>...
method getList (line 331) | public List<DirectItemOrHeader> getList() {
method getItems (line 335) | public List<DirectItem> getItems() {
method onViewRecycled (line 339) | @Override
method onViewDetachedFromWindow (line 346) | @Override
method getThread (line 353) | public DirectThread getThread() {
class DirectItemOrHeader (line 357) | public static class DirectItemOrHeader {
method isHeader (line 361) | public boolean isHeader() {
method toString (line 365) | @NonNull
class HeaderViewHolder (line 375) | public static class HeaderViewHolder extends RecyclerView.ViewHolder {
method HeaderViewHolder (line 378) | public HeaderViewHolder(@NonNull final LayoutDmHeaderBinding binding) {
method bind (line 383) | public void bind(final LocalDate date) {
type DirectItemCallback (line 393) | public interface DirectItemCallback {
method onHashtagClick (line 394) | void onHashtagClick(String hashtag);
method onMentionClick (line 396) | void onMentionClick(String mention);
method onLocationClick (line 398) | void onLocationClick(long locationId);
method onURLClick (line 400) | void onURLClick(String url);
method onEmailClick (line 402) | void onEmailClick(String email);
method onMediaClick (line 404) | void onMediaClick(Media media, int index);
method onStoryClick (line 406) | void onStoryClick(DirectItemStoryShare storyShare);
method onReaction (line 408) | void onReaction(DirectItem item, Emoji emoji);
method onReactionClick (line 410) | void onReactionClick(DirectItem item, int position);
method onOptionSelect (line 412) | void onOptionSelect(DirectItem item, @IdRes int itemId, final Functi...
method onAddReactionListener (line 414) | void onAddReactionListener(DirectItem item);
type DirectItemInternalLongClickListener (line 417) | public interface DirectItemInternalLongClickListener {
method onLongClick (line 418) | void onLongClick(int position, DirectItemViewHolder viewHolder);
type DirectItemLongClickListener (line 421) | public interface DirectItemLongClickListener {
method onLongClick (line 422) | void onLongClick(int position);
FILE: app/src/main/java/awais/instagrabber/adapters/DirectMessageInboxAdapter.java
class DirectMessageInboxAdapter (line 19) | public final class DirectMessageInboxAdapter extends ListAdapter<DirectT...
method areItemsTheSame (line 23) | @Override
method areContentsTheSame (line 28) | @Override
method DirectMessageInboxAdapter (line 48) | public DirectMessageInboxAdapter(final OnItemClickListener onClickList...
method onCreateViewHolder (line 53) | @NonNull
method onBindViewHolder (line 61) | @Override
method getItemId (line 67) | @Override
type OnItemClickListener (line 72) | public interface OnItemClickListener {
method onItemClick (line 73) | void onItemClick(final DirectThread thread);
FILE: app/src/main/java/awais/instagrabber/adapters/DirectPendingUsersAdapter.java
class DirectPendingUsersAdapter (line 21) | public final class DirectPendingUsersAdapter extends ListAdapter<DirectP...
method areItemsTheSame (line 24) | @Override
method areContentsTheSame (line 29) | @Override
method DirectPendingUsersAdapter (line 39) | public DirectPendingUsersAdapter(final PendingUserCallback callback) {
method submitPendingRequests (line 45) | public void submitPendingRequests(final DirectThreadParticipantRequest...
method parse (line 53) | private List<PendingUser> parse(final DirectThreadParticipantRequestsR...
method onCreateViewHolder (line 61) | @NonNull
method onBindViewHolder (line 69) | @Override
method getItemId (line 75) | @Override
class PendingUser (line 81) | public static class PendingUser {
method PendingUser (line 87) | public PendingUser(final User user, final String requester) {
method getUser (line 92) | public User getUser() {
method getRequester (line 96) | public String getRequester() {
method isInProgress (line 100) | public boolean isInProgress() {
method setInProgress (line 104) | public PendingUser setInProgress(final boolean inProgress) {
type PendingUserCallback (line 110) | public interface PendingUserCallback {
method onClick (line 111) | void onClick(int position, PendingUser pendingUser);
method onApprove (line 113) | void onApprove(int position, PendingUser pendingUser);
method onDeny (line 115) | void onDeny(int position, PendingUser pendingUser);
FILE: app/src/main/java/awais/instagrabber/adapters/DirectReactionsAdapter.java
class DirectReactionsAdapter (line 18) | public final class DirectReactionsAdapter extends ListAdapter<DirectItem...
method areItemsTheSame (line 21) | @Override
method areContentsTheSame (line 26) | @Override
method DirectReactionsAdapter (line 37) | public DirectReactionsAdapter(final long viewerId,
method onCreateViewHolder (line 49) | @NonNull
method onBindViewHolder (line 58) | @Override
method getItemId (line 65) | @Override
method getUser (line 70) | @Nullable
type OnReactionClickListener (line 78) | public interface OnReactionClickListener {
method onReactionClick (line 79) | void onReactionClick(String itemId, DirectItemEmojiReaction reaction);
FILE: app/src/main/java/awais/instagrabber/adapters/DirectUsersAdapter.java
class DirectUsersAdapter (line 22) | public final class DirectUsersAdapter extends ListAdapter<DirectUsersAda...
method areItemsTheSame (line 27) | @Override
method areContentsTheSame (line 42) | @Override
method DirectUsersAdapter (line 64) | public DirectUsersAdapter(final long inviterId,
method submitUsers (line 74) | public void submitUsers(final List<User> users, final List<User> leftU...
method combineLists (line 80) | private List<DirectUserOrHeader> combineLists(final List<User> users, ...
method onCreateViewHolder (line 97) | @NonNull
method onBindViewHolder (line 112) | @Override
method getItemViewType (line 129) | @Override
method getItemId (line 135) | @Override
method setAdminUserIds (line 141) | public void setAdminUserIds(final List<Long> adminUserIds) {
class DirectUserOrHeader (line 146) | public static class DirectUserOrHeader {
method DirectUserOrHeader (line 150) | public DirectUserOrHeader(final int headerTitle) {
method DirectUserOrHeader (line 154) | public DirectUserOrHeader(final User user) {
method isHeader (line 158) | boolean isHeader() {
class HeaderViewHolder (line 163) | public static class HeaderViewHolder extends RecyclerView.ViewHolder {
method HeaderViewHolder (line 166) | public HeaderViewHolder(@NonNull final ItemFavSectionHeaderBinding b...
method bind (line 171) | public void bind(@StringRes final int headerTitle) {
type OnDirectUserClickListener (line 176) | public interface OnDirectUserClickListener {
method onClick (line 177) | void onClick(int position, User user, boolean selected);
type OnDirectUserLongClickListener (line 180) | public interface OnDirectUserLongClickListener {
method onLongClick (line 181) | boolean onLongClick(int position, User user);
FILE: app/src/main/java/awais/instagrabber/adapters/DirectoryFilesAdapter.java
class DirectoryFilesAdapter (line 16) | public final class DirectoryFilesAdapter extends ListAdapter<File, Direc...
method areItemsTheSame (line 20) | @Override
method areContentsTheSame (line 25) | @Override
method DirectoryFilesAdapter (line 31) | public DirectoryFilesAdapter(final OnFileClickListener onFileClickList...
method onCreateViewHolder (line 36) | @NonNull
method onBindViewHolder (line 44) | @Override
type OnFileClickListener (line 50) | public interface OnFileClickListener {
method onFileClick (line 51) | void onFileClick(File file);
class ViewHolder (line 54) | static final class ViewHolder extends RecyclerView.ViewHolder {
method ViewHolder (line 57) | private ViewHolder(final ItemDirListBinding binding) {
method bind (line 62) | public void bind(final File file, final OnFileClickListener onFileCl...
FILE: app/src/main/java/awais/instagrabber/adapters/DiscoverTopicsAdapter.java
class DiscoverTopicsAdapter (line 17) | public class DiscoverTopicsAdapter extends ListAdapter<TopicCluster, Top...
method areItemsTheSame (line 19) | @Override
method areContentsTheSame (line 24) | @Override
method DiscoverTopicsAdapter (line 34) | public DiscoverTopicsAdapter(final OnTopicClickListener onTopicClickLi...
method onCreateViewHolder (line 39) | @NonNull
method onBindViewHolder (line 47) | @Override
type OnTopicClickListener (line 53) | public interface OnTopicClickListener {
method onTopicClick (line 54) | void onTopicClick(TopicCluster topicCluster, View cover, int titleCo...
method onTopicLongClick (line 56) | void onTopicLongClick(Media coverMedia);
FILE: app/src/main/java/awais/instagrabber/adapters/FavoritesAdapter.java
class FavoritesAdapter (line 26) | public class FavoritesAdapter extends RecyclerView.Adapter<RecyclerView....
method areItemsTheSame (line 33) | @Override
method areContentsTheSame (line 48) | @Override
method FavoritesAdapter (line 61) | public FavoritesAdapter(final OnFavoriteClickListener clickListener, f...
method onCreateViewHolder (line 68) | @NonNull
method onBindViewHolder (line 80) | @Override
method getItem (line 91) | protected FavoriteModelOrHeader getItem(int position) {
method getItemCount (line 95) | @Override
method getItemViewType (line 100) | @Override
method submitList (line 105) | public void submitList(@Nullable final List<Favorite> list) {
method submitList (line 113) | public void submitList(@Nullable final List<Favorite> list, @Nullable ...
method sectionAndSort (line 121) | @NonNull
class FavoriteModelOrHeader (line 157) | private static class FavoriteModelOrHeader {
method isHeader (line 161) | boolean isHeader() {
type OnFavoriteClickListener (line 166) | public interface OnFavoriteClickListener {
method onClick (line 167) | void onClick(final Favorite model);
type OnFavoriteLongClickListener (line 170) | public interface OnFavoriteLongClickListener {
method onLongClick (line 171) | boolean onLongClick(final Favorite model);
class FavSectionViewHolder (line 174) | public static class FavSectionViewHolder extends RecyclerView.ViewHold...
method FavSectionViewHolder (line 177) | public FavSectionViewHolder(@NonNull final ItemFavSectionHeaderBindi...
method bind (line 182) | public void bind(final FavoriteType header) {
FILE: app/src/main/java/awais/instagrabber/adapters/FeedAdapterV2.java
class FeedAdapterV2 (line 31) | public final class FeedAdapterV2 extends ListAdapter<Media, RecyclerView...
method areItemsTheSame (line 44) | @Override
method areContentsTheSame (line 49) | @Override
method getCaptionText (line 57) | private String getCaptionText(final Caption caption) {
method onPostLongClick (line 63) | @Override
method onPostClick (line 81) | @Override
method FeedAdapterV2 (line 105) | public FeedAdapterV2(@NonNull final PostsLayoutPreferences layoutPrefe...
method onCreateViewHolder (line 114) | @NonNull
method getLinearViewHolder (line 130) | @NonNull
method onBindViewHolder (line 151) | @Override
method getItemViewType (line 172) | @Override
method setLayoutPreferences (line 177) | public void setLayoutPreferences(@NonNull final PostsLayoutPreferences...
method endSelection (line 181) | public void endSelection() {
type FeedItemCallback (line 210) | public interface FeedItemCallback {
method onPostClick (line 211) | void onPostClick(final Media feedModel);
method onProfilePicClick (line 213) | void onProfilePicClick(final Media feedModel);
method onNameClick (line 215) | void onNameClick(final Media feedModel);
method onLocationClick (line 217) | void onLocationClick(final Media feedModel);
method onMentionClick (line 219) | void onMentionClick(final String mention);
method onHashtagClick (line 221) | void onHashtagClick(final String hashtag);
method onCommentsClick (line 223) | void onCommentsClick(final Media feedModel);
method onDownloadClick (line 225) | void onDownloadClick(final Media feedModel, final int childPosition,...
method onEmailClick (line 227) | void onEmailClick(final String emailId);
method onURLClick (line 229) | void onURLClick(final String url);
method onSliderClick (line 231) | void onSliderClick(Media feedModel, int position);
type AdapterSelectionCallback (line 234) | public interface AdapterSelectionCallback {
method onPostLongClick (line 235) | boolean onPostLongClick(final int position, Media feedModel);
method onPostClick (line 237) | void onPostClick(final int position, Media feedModel);
type SelectionModeCallback (line 240) | public interface SelectionModeCallback {
method onSelectionStart (line 241) | void onSelectionStart();
method onSelectionChange (line 243) | void onSelectionChange(final Set<Media> selectedFeedModels);
method onSelectionEnd (line 245) | void onSelectionEnd();
FILE: app/src/main/java/awais/instagrabber/adapters/FeedItemCallbackAdapter.java
class FeedItemCallbackAdapter (line 8) | public class FeedItemCallbackAdapter implements FeedAdapterV2.FeedItemCa...
method onPostClick (line 9) | @Override
method onProfilePicClick (line 12) | @Override
method onNameClick (line 15) | @Override
method onLocationClick (line 18) | @Override
method onMentionClick (line 21) | @Override
method onHashtagClick (line 24) | @Override
method onCommentsClick (line 27) | @Override
method onDownloadClick (line 30) | @Override
method onEmailClick (line 33) | @Override
method onURLClick (line 36) | @Override
method onSliderClick (line 39) | @Override
FILE: app/src/main/java/awais/instagrabber/adapters/FeedStoriesAdapter.java
class FeedStoriesAdapter (line 14) | public final class FeedStoriesAdapter extends ListAdapter<Story, FeedSto...
method areItemsTheSame (line 18) | @Override
method areContentsTheSame (line 23) | @Override
method FeedStoriesAdapter (line 29) | public FeedStoriesAdapter(final OnFeedStoryClickListener listener) {
method onCreateViewHolder (line 34) | @NonNull
method onBindViewHolder (line 42) | @Override
type OnFeedStoryClickListener (line 48) | public interface OnFeedStoryClickListener {
method onFeedStoryClick (line 49) | void onFeedStoryClick(Story model, int position);
method onFeedStoryLongClick (line 51) | void onFeedStoryLongClick(Story model, int position);
FILE: app/src/main/java/awais/instagrabber/adapters/FeedStoriesListAdapter.java
class FeedStoriesListAdapter (line 21) | public final class FeedStoriesListAdapter extends ListAdapter<Story, Sto...
method performFiltering (line 26) | @NonNull
method publishResults (line 45) | @Override
method areItemsTheSame (line 53) | @Override
method areContentsTheSame (line 58) | @Override
method FeedStoriesListAdapter (line 64) | public FeedStoriesListAdapter(final OnFeedStoryClickListener listener) {
method getFilter (line 69) | @Override
method submitList (line 74) | private void submitList(@Nullable final List<Story> list, final boolea...
method submitList (line 81) | @Override
method onCreateViewHolder (line 86) | @NonNull
method onBindViewHolder (line 94) | @Override
type OnFeedStoryClickListener (line 100) | public interface OnFeedStoryClickListener {
method onFeedStoryClick (line 101) | void onFeedStoryClick(final Story model);
method onProfileClick (line 103) | void onProfileClick(final String username);
FILE: app/src/main/java/awais/instagrabber/adapters/FiltersAdapter.java
class FiltersAdapter (line 19) | public class FiltersAdapter extends ListAdapter<Filter<?>, FilterViewHol...
method areItemsTheSame (line 22) | @Override
method areContentsTheSame (line 27) | @Override
method FiltersAdapter (line 39) | public FiltersAdapter(final Collection<GPUImageFilter> filters,
method onCreateViewHolder (line 51) | @NonNull
method onBindViewHolder (line 59) | @Override
method getItemId (line 64) | @Override
method setSelected (line 69) | public void setSelected(final int position) {
method setSelectedFilter (line 76) | public void setSelectedFilter(final GPUImageFilter instance) {
type OnFilterClickListener (line 91) | public interface OnFilterClickListener {
method onClick (line 92) | void onClick(int position, Filter<?> filter);
FILE: app/src/main/java/awais/instagrabber/adapters/FollowAdapter.java
class FollowAdapter (line 30) | public final class FollowAdapter extends RecyclerView.Adapter<RecyclerVi...
method performFiltering (line 37) | @Nullable
method hasKey (line 60) | private boolean hasKey(final String key, final String username, final ...
method publishResults (line 67) | @Override
method FollowAdapter (line 80) | public FollowAdapter(final View.OnClickListener onClickListener, @NonN...
method getFilter (line 87) | @Override
method onCreateViewHolder (line 92) | @NonNull
method onBindViewHolder (line 107) | @Override
method getItemCount (line 122) | @Override
method getItemViewType (line 127) | @Override
method toggleGroup (line 132) | @Override
method isGroupExpanded (line 149) | public boolean isGroupExpanded(final ExpandableGroup group) {
FILE: app/src/main/java/awais/instagrabber/adapters/GifItemsAdapter.java
class GifItemsAdapter (line 30) | public class GifItemsAdapter extends ListAdapter<GiphyGif, GifItemsAdapt...
method areItemsTheSame (line 33) | @Override
method areContentsTheSame (line 38) | @Override
method GifItemsAdapter (line 46) | public GifItemsAdapter(final OnItemClickListener onItemClickListener) {
method onCreateViewHolder (line 51) | @NonNull
method onBindViewHolder (line 59) | @Override
class GifViewHolder (line 64) | public static class GifViewHolder extends RecyclerView.ViewHolder {
method GifViewHolder (line 71) | public GifViewHolder(@NonNull final ItemMediaBinding binding,
method bind (line 82) | public void bind(final GiphyGif item) {
type OnItemClickListener (line 104) | public interface OnItemClickListener {
method onItemClick (line 105) | void onItemClick(GiphyGif giphyGif);
FILE: app/src/main/java/awais/instagrabber/adapters/HighlightStoriesListAdapter.java
class HighlightStoriesListAdapter (line 14) | public final class HighlightStoriesListAdapter extends ListAdapter<Story...
method areItemsTheSame (line 18) | @Override
method areContentsTheSame (line 23) | @Override
method HighlightStoriesListAdapter (line 29) | public HighlightStoriesListAdapter(final OnHighlightStoryClickListener...
method onCreateViewHolder (line 34) | @NonNull
method onBindViewHolder (line 42) | @Override
type OnHighlightStoryClickListener (line 48) | public interface OnHighlightStoryClickListener {
method onHighlightClick (line 49) | void onHighlightClick(final Story model, final int position);
method onProfileClick (line 51) | void onProfileClick(final String username);
FILE: app/src/main/java/awais/instagrabber/adapters/HighlightsAdapter.java
class HighlightsAdapter (line 14) | public final class HighlightsAdapter extends ListAdapter<Story, Highligh...
method areItemsTheSame (line 19) | @Override
method areContentsTheSame (line 24) | @Override
method HighlightsAdapter (line 30) | public HighlightsAdapter(final OnHighlightClickListener clickListener) {
method onCreateViewHolder (line 35) | @NonNull
method onBindViewHolder (line 43) | @Override
type OnHighlightClickListener (line 52) | public interface OnHighlightClickListener {
method onHighlightClick (line 53) | void onHighlightClick(final Story model, final int position);
FILE: app/src/main/java/awais/instagrabber/adapters/KeywordsFilterAdapter.java
class KeywordsFilterAdapter (line 16) | public class KeywordsFilterAdapter extends RecyclerView.Adapter<Keywords...
method KeywordsFilterAdapter (line 21) | public KeywordsFilterAdapter(Context context, ArrayList<String> items){
method onCreateViewHolder (line 26) | @NonNull
method onBindViewHolder (line 33) | @Override
method getItemCount (line 38) | @Override
FILE: app/src/main/java/awais/instagrabber/adapters/LikesAdapter.java
class LikesAdapter (line 16) | public final class LikesAdapter extends RecyclerView.Adapter<FollowsView...
method LikesAdapter (line 20) | public LikesAdapter(final List<User> profileModels,
method onCreateViewHolder (line 26) | @NonNull
method onBindViewHolder (line 34) | @Override
method getItemCount (line 40) | @Override
FILE: app/src/main/java/awais/instagrabber/adapters/NotificationsAdapter.java
class NotificationsAdapter (line 22) | public final class NotificationsAdapter extends ListAdapter<Notification...
method areItemsTheSame (line 26) | @Override
method areContentsTheSame (line 31) | @Override
method NotificationsAdapter (line 37) | public NotificationsAdapter(final OnNotificationClickListener notifica...
method onCreateViewHolder (line 42) | @NonNull
method onBindViewHolder (line 50) | @Override
method submitList (line 56) | @Override
method submitList (line 65) | @Override
method sort (line 74) | private List<Notification> sort(final List<Notification> list) {
type OnNotificationClickListener (line 91) | public interface OnNotificationClickListener {
method onNotificationClick (line 92) | void onNotificationClick(final Notification model);
method onProfileClick (line 94) | void onProfileClick(final String username);
method onPreviewClick (line 96) | void onPreviewClick(final Notification model);
FILE: app/src/main/java/awais/instagrabber/adapters/SavedCollectionsAdapter.java
class SavedCollectionsAdapter (line 17) | public class SavedCollectionsAdapter extends ListAdapter<SavedCollection...
method areItemsTheSame (line 19) | @Override
method areContentsTheSame (line 24) | @Override
method SavedCollectionsAdapter (line 39) | public SavedCollectionsAdapter(final OnCollectionClickListener onColle...
method onCreateViewHolder (line 44) | @NonNull
method onBindViewHolder (line 52) | @Override
type OnCollectionClickListener (line 58) | public interface OnCollectionClickListener {
method onCollectionClick (line 59) | void onCollectionClick(SavedCollection savedCollection, View root, V...
FILE: app/src/main/java/awais/instagrabber/adapters/SearchCategoryAdapter.java
class SearchCategoryAdapter (line 12) | public class SearchCategoryAdapter extends FragmentStateAdapter {
method SearchCategoryAdapter (line 16) | public SearchCategoryAdapter(@NonNull final Fragment fragment,
method createFragment (line 23) | @NonNull
method getItemCount (line 29) | @Override
FILE: app/src/main/java/awais/instagrabber/adapters/SearchItemsAdapter.java
class SearchItemsAdapter (line 28) | public final class SearchItemsAdapter extends RecyclerView.Adapter<Recyc...
method areItemsTheSame (line 31) | @Override
method areContentsTheSame (line 36) | @Override
method SearchItemsAdapter (line 49) | public SearchItemsAdapter(final OnSearchItemClickListener onSearchItem...
method onCreateViewHolder (line 55) | @NonNull
method onBindViewHolder (line 66) | @Override
method getItem (line 77) | protected SearchItemOrHeader getItem(int position) {
method getItemCount (line 81) | @Override
method getItemViewType (line 86) | @Override
method submitList (line 91) | public void submitList(@Nullable final List<SearchItem> list) {
method submitList (line 99) | public void submitList(@Nullable final List<SearchItem> list, @Nullabl...
method sectionAndSort (line 107) | @NonNull
class SearchItemOrHeader (line 159) | private static class SearchItemOrHeader {
method SearchItemOrHeader (line 163) | public SearchItemOrHeader(final SearchItem searchItem) {
method SearchItemOrHeader (line 167) | public SearchItemOrHeader(final String header) {
method isHeader (line 171) | boolean isHeader() {
method equals (line 175) | @Override
method hashCode (line 184) | @Override
class HeaderViewHolder (line 190) | public static class HeaderViewHolder extends RecyclerView.ViewHolder {
method HeaderViewHolder (line 193) | public HeaderViewHolder(@NonNull final ItemFavSectionHeaderBinding b...
method bind (line 198) | public void bind(final String header) {
FILE: app/src/main/java/awais/instagrabber/adapters/SliderCallbackAdapter.java
class SliderCallbackAdapter (line 9) | public class SliderCallbackAdapter implements SliderItemsAdapter.SliderC...
method onThumbnailLoaded (line 10) | @Override
method onItemClicked (line 13) | @Override
method onPlayerPlay (line 16) | @Override
method onPlayerPause (line 19) | @Override
method onPlayerRelease (line 22) | @Override
method onFullScreenModeChanged (line 25) | @Override
method isInFullScreen (line 28) | @Override
FILE: app/src/main/java/awais/instagrabber/adapters/SliderItemsAdapter.java
class SliderItemsAdapter (line 21) | public final class SliderItemsAdapter extends ListAdapter<Media, SliderI...
method areItemsTheSame (line 27) | @Override
method areContentsTheSame (line 32) | @Override
method SliderItemsAdapter (line 38) | public SliderItemsAdapter(final boolean loadVideoOnItemClick,
method onCreateViewHolder (line 45) | @NonNull
method onBindViewHolder (line 62) | @Override
method getItemViewType (line 68) | @Override
type SliderCallback (line 138) | public interface SliderCallback {
method onThumbnailLoaded (line 139) | void onThumbnailLoaded(int position);
method onItemClicked (line 141) | void onItemClicked(int position, final Media media, final View view);
method onPlayerPlay (line 143) | void onPlayerPlay(int position);
method onPlayerPause (line 145) | void onPlayerPause(int position);
method onPlayerRelease (line 147) | void onPlayerRelease(int position);
method onFullScreenModeChanged (line 149) | void onFullScreenModeChanged(boolean isFullScreen, final StyledPlaye...
method isInFullScreen (line 151) | boolean isInFullScreen();
FILE: app/src/main/java/awais/instagrabber/adapters/StoriesAdapter.java
class StoriesAdapter (line 18) | public final class StoriesAdapter extends ListAdapter<StoryMedia, Storie...
method areItemsTheSame (line 22) | @Override
method areContentsTheSame (line 27) | @Override
method StoriesAdapter (line 33) | public StoriesAdapter(final OnItemClickListener onItemClickListener) {
method onCreateViewHolder (line 38) | @NonNull
method onBindViewHolder (line 46) | @Override
class StoryViewHolder (line 52) | public final static class StoryViewHolder extends RecyclerView.ViewHol...
method StoryViewHolder (line 55) | public StoryViewHolder(final ItemStoryBinding binding) {
method bind (line 60) | public void bind(final StoryMedia model,
method paginate (line 77) | public void paginate(final int newIndex) {
type OnItemClickListener (line 87) | public interface OnItemClickListener {
method onItemClick (line 88) | void onItemClick(StoryMedia storyModel, int position);
FILE: app/src/main/java/awais/instagrabber/adapters/TabsAdapter.java
class TabsAdapter (line 26) | public class TabsAdapter extends ListAdapter<TabsAdapter.TabOrHeader, Re...
method areItemsTheSame (line 28) | @Override
method areContentsTheSame (line 42) | @Override
method TabsAdapter (line 62) | public TabsAdapter(@NonNull final TabAdapterCallback tabAdapterCallbac...
method onCreateViewHolder (line 67) | @NonNull
method onBindViewHolder (line 79) | @Override
method getItemViewType (line 91) | @Override
method submitList (line 96) | public void submitList(final List<Tab> current, final List<Tab> others...
method submitList (line 115) | public void submitList(final List<Tab> current, final List<Tab> others) {
method moveItem (line 119) | public void moveItem(final int from, final int to) {
method getCurrentCount (line 126) | public int getCurrentCount() {
class TabOrHeader (line 130) | public static class TabOrHeader {
method TabOrHeader (line 134) | public TabOrHeader(final Tab tab) {
method TabOrHeader (line 138) | public TabOrHeader(@StringRes final int header) {
method isHeader (line 142) | boolean isHeader() {
type TabAdapterCallback (line 147) | public interface TabAdapterCallback {
method onStartDrag (line 148) | void onStartDrag(TabViewHolder viewHolder);
method onOrderChange (line 150) | void onOrderChange(List<Tab> newOrderTabs);
method onAdd (line 152) | void onAdd(Tab tab);
method onRemove (line 154) | void onRemove(Tab tab);
FILE: app/src/main/java/awais/instagrabber/adapters/UserSearchResultsAdapter.java
class UserSearchResultsAdapter (line 22) | public final class UserSearchResultsAdapter extends ListAdapter<RankedRe...
method areItemsTheSame (line 26) | @Override
method areContentsTheSame (line 38) | @Override
method UserSearchResultsAdapter (line 54) | public UserSearchResultsAdapter(final boolean showSelection,
method onCreateViewHolder (line 68) | @NonNull
method onBindViewHolder (line 79) | @Override
method getItemId (line 102) | @Override
method getItemViewType (line 114) | @Override
method setSelectedRecipient (line 120) | public void setSelectedRecipient(final RankedRecipient recipient, fina...
type OnRecipientClickListener (line 148) | public interface OnRecipientClickListener {
method onClick (line 149) | void onClick(int position, RankedRecipient recipient, final boolean ...
FILE: app/src/main/java/awais/instagrabber/adapters/viewholder/CommentViewHolder.java
class CommentViewHolder (line 24) | public final class CommentViewHolder extends RecyclerView.ViewHolder {
method CommentViewHolder (line 33) | public CommentViewHolder(@NonNull final ItemCommentBinding binding,
method bind (line 51) | public void bind(final Comment comment, final boolean isReplyParent, f...
method setupCommentText (line 71) | private void setupCommentText(@NonNull final Comment comment, final bo...
method setUser (line 106) | private void setUser(@NonNull final Comment comment, final boolean isR...
method setLikes (line 124) | private void setLikes(@NonNull final Comment comment, final boolean is...
method setReplies (line 148) | private void setReplies(@NonNull final Comment comment, final boolean ...
method setupOptions (line 159) | private void setupOptions(final Comment comment, final boolean isReply) {
method createOptionsPopupMenu (line 169) | private void createOptionsPopupMenu(final Comment comment, final boole...
FILE: app/src/main/java/awais/instagrabber/adapters/viewholder/FavoriteViewHolder.java
class FavoriteViewHolder (line 14) | public class FavoriteViewHolder extends RecyclerView.ViewHolder {
method FavoriteViewHolder (line 19) | public FavoriteViewHolder(@NonNull final ItemSearchResultBinding bindi...
method bind (line 25) | public void bind(final Favorite model,
FILE: app/src/main/java/awais/instagrabber/adapters/viewholder/FeedGridItemViewHolder.java
class FeedGridItemViewHolder (line 35) | public class FeedGridItemViewHolder extends RecyclerView.ViewHolder {
method FeedGridItemViewHolder (line 38) | public FeedGridItemViewHolder(@NonNull final ItemFeedGridBinding bindi...
method bind (line 43) | public void bind(final int position,
method setThumbImage (line 143) | private void setThumbImage(final String thumbnailUrl) {
method setUserDetails (line 160) | private void setUserDetails(@NonNull final Media media,
FILE: app/src/main/java/awais/instagrabber/adapters/viewholder/FeedStoryViewHolder.java
class FeedStoryViewHolder (line 10) | public final class FeedStoryViewHolder extends RecyclerView.ViewHolder {
method FeedStoryViewHolder (line 14) | public FeedStoryViewHolder(final ItemHighlightBinding binding) {
method bind (line 19) | public void bind(final Story model,
FILE: app/src/main/java/awais/instagrabber/adapters/viewholder/FilterViewHolder.java
class FilterViewHolder (line 21) | public class FilterViewHolder extends RecyclerView.ViewHolder {
method FilterViewHolder (line 29) | public FilterViewHolder(@NonNull final ItemFilterBinding binding,
method bind (line 39) | public void bind(final int position, final String originalKey, final B...
FILE: app/src/main/java/awais/instagrabber/adapters/viewholder/FollowsViewHolder.java
class FollowsViewHolder (line 11) | public final class FollowsViewHolder extends RecyclerView.ViewHolder {
method FollowsViewHolder (line 15) | public FollowsViewHolder(@NonNull final ItemFollowBinding binding) {
method bind (line 20) | public void bind(final User model,
FILE: app/src/main/java/awais/instagrabber/adapters/viewholder/HighlightViewHolder.java
class HighlightViewHolder (line 8) | public final class HighlightViewHolder extends RecyclerView.ViewHolder {
method HighlightViewHolder (line 12) | public HighlightViewHolder(final ItemHighlightBinding binding) {
method bind (line 17) | public void bind(final Story model) {
FILE: app/src/main/java/awais/instagrabber/adapters/viewholder/NotificationViewHolder.java
class NotificationViewHolder (line 15) | public final class NotificationViewHolder extends RecyclerView.ViewHolder {
method NotificationViewHolder (line 18) | public NotificationViewHolder(final ItemNotificationBinding binding) {
method bind (line 23) | public void bind(final Notification model,
FILE: app/src/main/java/awais/instagrabber/adapters/viewholder/SearchItemViewHolder.java
class SearchItemViewHolder (line 17) | public class SearchItemViewHolder extends RecyclerView.ViewHolder {
method SearchItemViewHolder (line 22) | public SearchItemViewHolder(@NonNull final ItemSearchResultBinding bin...
method bind (line 29) | public void bind(final SearchItem searchItem) {
FILE: app/src/main/java/awais/instagrabber/adapters/viewholder/SliderItemViewHolder.java
class SliderItemViewHolder (line 11) | public abstract class SliderItemViewHolder extends RecyclerView.ViewHold...
method SliderItemViewHolder (line 14) | public SliderItemViewHolder(@NonNull final View itemView) {
method bind (line 18) | public abstract void bind(final Media media,
FILE: app/src/main/java/awais/instagrabber/adapters/viewholder/SliderPhotoViewHolder.java
class SliderPhotoViewHolder (line 22) | public class SliderPhotoViewHolder extends SliderItemViewHolder {
method SliderPhotoViewHolder (line 27) | public SliderPhotoViewHolder(@NonNull final ItemSliderPhotoBinding bin...
method bind (line 32) | public void bind(@NonNull final Media model,
FILE: app/src/main/java/awais/instagrabber/adapters/viewholder/SliderVideoViewHolder.java
class SliderVideoViewHolder (line 27) | public class SliderVideoViewHolder extends SliderItemViewHolder {
method SliderVideoViewHolder (line 35) | @SuppressLint("ClickableViewAccessibility")
method bind (line 55) | public void bind(@NonNull final Media media,
method pause (line 148) | public void pause() {
method releasePlayer (line 153) | public void releasePlayer() {
FILE: app/src/main/java/awais/instagrabber/adapters/viewholder/StoryListViewHolder.java
class StoryListViewHolder (line 14) | public final class StoryListViewHolder extends RecyclerView.ViewHolder {
method StoryListViewHolder (line 17) | public StoryListViewHolder(final ItemNotificationBinding binding) {
method bind (line 22) | public void bind(final Story model,
method bind (line 60) | public void bind(final Story model,
FILE: app/src/main/java/awais/instagrabber/adapters/viewholder/TabViewHolder.java
class TabViewHolder (line 21) | public class TabViewHolder extends RecyclerView.ViewHolder {
method TabViewHolder (line 29) | @SuppressLint("ClickableViewAccessibility")
method bind (line 45) | public void bind(@NonNull final Tab tab,
method isDraggable (line 72) | public boolean isDraggable() {
method setDragging (line 76) | public void setDragging(final boolean isDragging) {
FILE: app/src/main/java/awais/instagrabber/adapters/viewholder/TopicClusterViewHolder.java
class TopicClusterViewHolder (line 35) | public class TopicClusterViewHolder extends RecyclerView.ViewHolder {
method TopicClusterViewHolder (line 40) | public TopicClusterViewHolder(@NonNull final ItemDiscoverTopicBinding ...
method bind (line 49) | public void bind(final TopicCluster topicCluster) {
method bind (line 116) | public void bind(final SavedCollection topicCluster) {
FILE: app/src/main/java/awais/instagrabber/adapters/viewholder/dialogs/KeywordsFilterDialogViewHolder.java
class KeywordsFilterDialogViewHolder (line 20) | public class KeywordsFilterDialogViewHolder extends RecyclerView.ViewHol...
method KeywordsFilterDialogViewHolder (line 25) | public KeywordsFilterDialogViewHolder(@NonNull View itemView) {
method bind (line 31) | public void bind(ArrayList<String> items, int position, Context contex...
method getDeleteButton (line 44) | public Button getDeleteButton(){
method getTextView (line 48) | public TextView getTextView(){
FILE: app/src/main/java/awais/instagrabber/adapters/viewholder/directmessages/DirectInboxItemViewHolder.java
class DirectInboxItemViewHolder (line 26) | public final class DirectInboxItemViewHolder extends RecyclerView.ViewHo...
method DirectInboxItemViewHolder (line 34) | public DirectInboxItemViewHolder(@NonNull final LayoutDmInboxItemBindi...
method bind (line 48) | public void bind(final DirectThread thread) {
method setProfilePics (line 64) | private void setProfilePics(@NonNull final DirectThread thread) {
method updateConstraints (line 94) | private void updateConstraints(final SimpleDraweeView view, final int ...
method setChildSize (line 106) | private void setChildSize(final SimpleDraweeView view, final int lengt...
method setTitle (line 112) | private void setTitle(@NonNull final DirectThread thread) {
method setSubtitle (line 117) | private void setSubtitle(@NonNull final DirectThread thread) {
method setDateTime (line 135) | private void setDateTime(@NonNull final DirectItem item) {
method setReadState (line 141) | private void setReadState(@NonNull final DirectThread thread) {
FILE: app/src/main/java/awais/instagrabber/adapters/viewholder/directmessages/DirectItemActionLogViewHolder.java
class DirectItemActionLogViewHolder (line 28) | public class DirectItemActionLogViewHolder extends DirectItemViewHolder {
method DirectItemActionLogViewHolder (line 33) | public DirectItemActionLogViewHolder(@NonNull final LayoutDmBaseBindin...
method bindItem (line 44) | @Override
method allowMessageDirectionGravity (line 77) | @Override
method showUserDetailsInGroup (line 82) | @Override
method showMessageInfo (line 87) | @Override
method allowLongClick (line 92) | @Override
method getSwipeDirection (line 97) | @Override
FILE: app/src/main/java/awais/instagrabber/adapters/viewholder/directmessages/DirectItemAnimatedMediaViewHolder.java
class DirectItemAnimatedMediaViewHolder (line 29) | public class DirectItemAnimatedMediaViewHolder extends DirectItemViewHol...
method DirectItemAnimatedMediaViewHolder (line 33) | public DirectItemAnimatedMediaViewHolder(@NonNull final LayoutDmBaseBi...
method bindItem (line 43) | @Override
method getSwipeDirection (line 70) | @Override
method getLongClickOptions (line 75) | @Override
FILE: app/src/main/java/awais/instagrabber/adapters/viewholder/directmessages/DirectItemDefaultViewHolder.java
class DirectItemDefaultViewHolder (line 16) | public class DirectItemDefaultViewHolder extends DirectItemViewHolder {
method DirectItemDefaultViewHolder (line 20) | public DirectItemDefaultViewHolder(@NonNull final LayoutDmBaseBinding ...
method bindItem (line 30) | @Override
method showBackground (line 36) | @Override
method allowLongClick (line 41) | @Override
method getSwipeDirection (line 46) | @Override
FILE: app/src/main/java/awais/instagrabber/adapters/viewholder/directmessages/DirectItemLikeViewHolder.java
class DirectItemLikeViewHolder (line 13) | public class DirectItemLikeViewHolder extends DirectItemViewHolder {
method DirectItemLikeViewHolder (line 15) | public DirectItemLikeViewHolder(@NonNull final LayoutDmBaseBinding bas...
method bindItem (line 24) | @Override
method canForward (line 27) | @Override
method getSwipeDirection (line 32) | @Override
FILE: app/src/main/java/awais/instagrabber/adapters/viewholder/directmessages/DirectItemLinkViewHolder.java
class DirectItemLinkViewHolder (line 25) | public class DirectItemLinkViewHolder extends DirectItemViewHolder {
method DirectItemLinkViewHolder (line 29) | public DirectItemLinkViewHolder(@NonNull final LayoutDmBaseBinding bas...
method bindItem (line 43) | @Override
method setupListeners (line 78) | private void setupListeners(final DirectItemLinkContext linkContext) {
method showBackground (line 88) | @Override
method getLongClickOptions (line 93) | @Override
FILE: app/src/main/java/awais/instagrabber/adapters/viewholder/directmessages/DirectItemMediaShareViewHolder.java
class DirectItemMediaShareViewHolder (line 38) | public class DirectItemMediaShareViewHolder extends DirectItemViewHolder {
method DirectItemMediaShareViewHolder (line 47) | public DirectItemMediaShareViewHolder(@NonNull final LayoutDmBaseBindi...
method bindItem (line 59) | @Override
method setupTypeIndicator (line 93) | private void setupTypeIndicator(final MediaItemType mediaType) {
method setupPreview (line 105) | private void setupPreview(@NonNull final Media media,
method setupCaption (line 130) | private void setupCaption(@NonNull final Media media) {
method setupUser (line 142) | private void setupUser(@NonNull final Media media) {
method getMedia (line 155) | @Nullable
method getReactionsTranslationY (line 173) | @Override
method getSwipeDirection (line 178) | @Override
method getLongClickOptions (line 186) | @Override
FILE: app/src/main/java/awais/instagrabber/adapters/viewholder/directmessages/DirectItemMediaViewHolder.java
class DirectItemMediaViewHolder (line 24) | public class DirectItemMediaViewHolder extends DirectItemViewHolder {
method DirectItemMediaViewHolder (line 30) | public DirectItemMediaViewHolder(@NonNull final LayoutDmBaseBinding ba...
method bindItem (line 42) | @Override
FILE: app/src/main/java/awais/instagrabber/adapters/viewholder/directmessages/DirectItemPlaceholderViewHolder.java
class DirectItemPlaceholderViewHolder (line 15) | public class DirectItemPlaceholderViewHolder extends DirectItemViewHolder {
method DirectItemPlaceholderViewHolder (line 19) | public DirectItemPlaceholderViewHolder(@NonNull final LayoutDmBaseBind...
method bindItem (line 29) | @Override
method allowLongClick (line 38) | @Override
method getSwipeDirection (line 43) | @Override
FILE: app/src/main/java/awais/instagrabber/adapters/viewholder/directmessages/DirectItemProfileViewHolder.java
class DirectItemProfileViewHolder (line 29) | public class DirectItemProfileViewHolder extends DirectItemViewHolder {
method DirectItemProfileViewHolder (line 34) | public DirectItemProfileViewHolder(@NonNull final LayoutDmBaseBinding ...
method bindItem (line 52) | @Override
method setProfile (line 102) | private void setProfile(@NonNull final DirectItem item) {
method setLocation (line 118) | private void setLocation(@NonNull final DirectItem item) {
method getSwipeDirection (line 134) | @Override
FILE: app/src/main/java/awais/instagrabber/adapters/viewholder/directmessages/DirectItemRavenMediaViewHolder.java
class DirectItemRavenMediaViewHolder (line 28) | public class DirectItemRavenMediaViewHolder extends DirectItemViewHolder {
method DirectItemRavenMediaViewHolder (line 33) | public DirectItemRavenMediaViewHolder(@NonNull final LayoutDmBaseBindi...
method bindItem (line 44) | @Override
method setExpiryInfo (line 116) | private void setExpiryInfo(final DirectItemVisualMedia visualMedia) {
method setPreview (line 153) | private void setPreview(final DirectItemVisualMedia visualMedia,
method allowLongClick (line 187) | @Override
FILE: app/src/main/java/awais/instagrabber/adapters/viewholder/directmessages/DirectItemReelShareViewHolder.java
class DirectItemReelShareViewHolder (line 30) | public class DirectItemReelShareViewHolder extends DirectItemViewHolder {
method DirectItemReelShareViewHolder (line 35) | public DirectItemReelShareViewHolder(@NonNull final LayoutDmBaseBindin...
method bindItem (line 45) | @Override
method setGravity (line 83) | private void setGravity(final MessageDirection messageDirection, final...
method setReply (line 112) | private void setReply(final MessageDirection messageDirection,
method setReaction (line 126) | private void setReaction(final MessageDirection messageDirection,
method setMention (line 146) | private void setMention(final boolean isSelf) {
method setMessage (line 153) | private void setMessage(final MessageDirection messageDirection, final...
method setPreview (line 161) | private void setPreview(final Media media) {
method canForward (line 174) | @Override
method getLongClickOptions (line 179) | @Override
FILE: app/src/main/java/awais/instagrabber/adapters/viewholder/directmessages/DirectItemStoryShareViewHolder.java
class DirectItemStoryShareViewHolder (line 29) | public class DirectItemStoryShareViewHolder extends DirectItemViewHolder {
method DirectItemStoryShareViewHolder (line 33) | public DirectItemStoryShareViewHolder(@NonNull final LayoutDmBaseBindi...
method bindItem (line 43) | @Override
method setupPreview (line 68) | private void setupPreview(final MessageDirection messageDirection, fin...
method setText (line 92) | private void setText(final DirectItemStoryShare storyShare) {
method setExpiredStoryInfo (line 102) | private void setExpiredStoryInfo(final DirectItem item) {
method canForward (line 110) | @Override
method getSwipeDirection (line 115) | @Override
FILE: app/src/main/java/awais/instagrabber/adapters/viewholder/directmessages/DirectItemTextViewHolder.java
class DirectItemTextViewHolder (line 20) | public class DirectItemTextViewHolder extends DirectItemViewHolder {
method DirectItemTextViewHolder (line 24) | public DirectItemTextViewHolder(@NonNull final LayoutDmBaseBinding bas...
method bindItem (line 34) | @Override
method showBackground (line 42) | @Override
method getLongClickOptions (line 47) | @Override
FILE: app/src/main/java/awais/instagrabber/adapters/viewholder/directmessages/DirectItemVideoCallEventViewHolder.java
class DirectItemVideoCallEventViewHolder (line 25) | public class DirectItemVideoCallEventViewHolder extends DirectItemViewHo...
method DirectItemVideoCallEventViewHolder (line 29) | public DirectItemVideoCallEventViewHolder(@NonNull final LayoutDmBaseB...
method bindItem (line 39) | @Override
method allowMessageDirectionGravity (line 66) | @Override
method showUserDetailsInGroup (line 71) | @Override
method showMessageInfo (line 76) | @Override
method allowLongClick (line 81) | @Override
method getSwipeDirection (line 86) | @Override
FILE: app/src/main/java/awais/instagrabber/adapters/viewholder/directmessages/DirectItemViewHolder.java
class DirectItemViewHolder (line 54) | public abstract class DirectItemViewHolder extends RecyclerView.ViewHold...
method DirectItemViewHolder (line 84) | public DirectItemViewHolder(@NonNull final LayoutDmBaseBinding binding,
method bind (line 116) | public void bind(final int position, final DirectItem item) {
method bindBase (line 129) | private void bindBase(@NonNull final DirectItem item, final MessageDir...
method setBackground (line 158) | private void setBackground(final MessageDirection messageDirection) {
method setGroupUserDetails (line 167) | private void setGroupUserDetails(final DirectItem item, final MessageD...
method setMessageDirectionGravity (line 189) | private void setMessageDirectionGravity(final MessageDirection message...
method setMessageInfo (line 200) | private void setMessageInfo(@NonNull final DirectItem item, final Mess...
method setupReply (line 228) | private void setupReply(final DirectItem item, final MessageDirection ...
method setReply (line 240) | private void setReply(final DirectItem item,
method setReplyInfo (line 325) | private String setReplyInfo(final DirectItem item,
method setForwardInfo (line 351) | private void setForwardInfo(final MessageDirection direction) {
method setReplyGravity (line 356) | private void setReplyGravity(final MessageDirection messageDirection) {
method setReactions (line 374) | private void setReactions(final DirectItem item, final int position) {
method isSelf (line 419) | protected boolean isSelf(final DirectItem directItem) {
method setItemView (line 423) | public void setItemView(final View view) {
method bindItem (line 427) | public abstract void bindItem(final DirectItem directItemModel, final ...
method getUser (line 429) | @Nullable
method allowMessageDirectionGravity (line 442) | protected boolean allowMessageDirectionGravity() {
method showUserDetailsInGroup (line 446) | protected boolean showUserDetailsInGroup() {
method showBackground (line 450) | protected boolean showBackground() {
method showMessageInfo (line 454) | protected boolean showMessageInfo() {
method allowLongClick (line 458) | protected boolean allowLongClick() {
method allowReaction (line 462) | protected boolean allowReaction() {
method canForward (line 466) | protected boolean canForward() {
method getLongClickOptions (line 470) | protected List<DirectItemContextMenu.MenuItem> getLongClickOptions() {
method getReactionsTranslationY (line 474) | protected int getReactionsTranslationY() {
method cleanup (line 478) | @CallSuper
method setupRamboTextListeners (line 485) | protected void setupRamboTextListeners(@NonNull final RamboTextViewV2 ...
method openProfile (line 492) | protected void openProfile(final String username) {
method openLocation (line 496) | protected void openLocation(final long locationId) {
method openURL (line 500) | protected void openURL(final String url) {
method openMedia (line 504) | protected void openMedia(final Media media, final int index) {
method openStory (line 508) | protected void openStory(final DirectItemStoryShare storyShare) {
method handleDeepLink (line 512) | protected void handleDeepLink(final String deepLinkText) {
method setupLongClickListener (line 523) | @SuppressLint("ClickableViewAccessibility")
method showLongClickOptions (line 548) | private void showLongClickOptions(final Point location, final MessageD...
method setLongClickListener (line 574) | public void setLongClickListener(final DirectItemInternalLongClickList...
method setSelected (line 578) | public void setSelected(final boolean selected) {
method shrink (line 582) | private void shrink() {
method grow (line 594) | private void grow() {
method getSwipeDirection (line 607) | @Override
type MessageDirection (line 613) | public enum MessageDirection {
FILE: app/src/main/java/awais/instagrabber/adapters/viewholder/directmessages/DirectItemVoiceMediaViewHolder.java
class DirectItemVoiceMediaViewHolder (line 35) | public class DirectItemVoiceMediaViewHolder extends DirectItemViewHolder {
method DirectItemVoiceMediaViewHolder (line 45) | public DirectItemVoiceMediaViewHolder(@NonNull final LayoutDmBaseBindi...
method bindItem (line 57) | @Override
method cleanup (line 157) | @Override
method canForward (line 174) | @Override
method getLongClickOptions (line 179) | @Override
class AudioItemState (line 186) | private static class AudioItemState {
method AudioItemState (line 189) | private AudioItemState() {}
method isPrepared (line 191) | public boolean isPrepared() {
method setPrepared (line 195) | public void setPrepared(final boolean prepared) {
FILE: app/src/main/java/awais/instagrabber/adapters/viewholder/directmessages/DirectItemXmaViewHolder.java
class DirectItemXmaViewHolder (line 22) | public class DirectItemXmaViewHolder extends DirectItemViewHolder {
method DirectItemXmaViewHolder (line 26) | public DirectItemXmaViewHolder(@NonNull final LayoutDmBaseBinding base...
method bindItem (line 36) | @Override
method getSwipeDirection (line 66) | @Override
FILE: app/src/main/java/awais/instagrabber/adapters/viewholder/directmessages/DirectPendingUserViewHolder.java
class DirectPendingUserViewHolder (line 21) | public class DirectPendingUserViewHolder extends RecyclerView.ViewHolder {
method DirectPendingUserViewHolder (line 30) | public DirectPendingUserViewHolder(@NonNull final LayoutDmPendingUserI...
method bind (line 38) | public void bind(final int position, final PendingUser pendingUser) {
method setUsername (line 66) | private void setUsername(final PendingUser pendingUser) {
FILE: app/src/main/java/awais/instagrabber/adapters/viewholder/directmessages/DirectReactionViewHolder.java
class DirectReactionViewHolder (line 16) | public class DirectReactionViewHolder extends RecyclerView.ViewHolder {
method DirectReactionViewHolder (line 23) | public DirectReactionViewHolder(final LayoutDmUserItemBinding binding,
method bind (line 37) | public void bind(final DirectItemEmojiReaction reaction,
method setReaction (line 47) | private void setReaction(final DirectItemEmojiReaction reaction) {
method setUser (line 56) | private void setUser(final User user) {
FILE: app/src/main/java/awais/instagrabber/adapters/viewholder/directmessages/DirectUserViewHolder.java
class DirectUserViewHolder (line 21) | public class DirectUserViewHolder extends RecyclerView.ViewHolder {
method DirectUserViewHolder (line 31) | public DirectUserViewHolder(@NonNull final LayoutDmUserItemBinding bin...
method bind (line 41) | public void bind(final int position,
method setFullName (line 63) | private void setFullName(final User user) {
method setInfo (line 86) | private void setInfo(final boolean isAdmin, final boolean isInviter) {
method setSelection (line 98) | private void setSelection(final boolean showSelection, final boolean i...
FILE: app/src/main/java/awais/instagrabber/adapters/viewholder/directmessages/RecipientThreadViewHolder.java
class RecipientThreadViewHolder (line 18) | public class RecipientThreadViewHolder extends RecyclerView.ViewHolder {
method RecipientThreadViewHolder (line 25) | public RecipientThreadViewHolder(@NonNull final LayoutDmUserItemBindin...
method bind (line 36) | public void bind(final int position,
method setProfilePic (line 51) | private void setProfilePic(final DirectThread thread) {
method setUsername (line 75) | private void setUsername(final DirectThread thread) {
method setSelection (line 85) | private void setSelection(final boolean showSelection, final boolean i...
FILE: app/src/main/java/awais/instagrabber/adapters/viewholder/feed/FeedItemViewHolder.java
class FeedItemViewHolder (line 30) | public abstract class FeedItemViewHolder extends RecyclerView.ViewHolder {
method FeedItemViewHolder (line 37) | public FeedItemViewHolder(@NonNull final ViewGroup root,
method bind (line 46) | public void bind(final Media media) {
method setupComments (line 64) | private void setupComments(@NonNull final Media feedModel) {
method setupProfilePic (line 70) | private void setupProfilePic(@NonNull final Media media) {
method setupTitle (line 83) | private void setupTitle(@NonNull final Media media) {
method setupCaption (line 101) | private void setupCaption(final Media media) {
method setupLocation (line 134) | private void setupLocation(@NonNull final Media media) {
method setupActions (line 150) | private void setupActions(@NonNull final Media media) {
method setUsername (line 158) | private void setUsername(final User user) {
method bindItem (line 181) | public abstract void bindItem(final Media media);
FILE: app/src/main/java/awais/instagrabber/adapters/viewholder/feed/FeedPhotoViewHolder.java
class FeedPhotoViewHolder (line 24) | public class FeedPhotoViewHolder extends FeedItemViewHolder {
method FeedPhotoViewHolder (line 30) | public FeedPhotoViewHolder(@NonNull final ItemFeedPhotoBinding binding,
method bindItem (line 45) | @Override
method setDimensions (line 75) | private void setDimensions(final Media feedModel) {
FILE: app/src/main/java/awais/instagrabber/adapters/viewholder/feed/FeedSliderViewHolder.java
class FeedSliderViewHolder (line 21) | public class FeedSliderViewHolder extends FeedItemViewHolder {
method FeedSliderViewHolder (line 29) | public FeedSliderViewHolder(@NonNull final ItemFeedSliderBinding binding,
method bindItem (line 43) | @Override
method setDimensions (line 77) | private void setDimensions(final View view, final Media model) {
method setLayoutParamDimens (line 95) | private void setLayoutParamDimens(final View view, final Media model) {
FILE: app/src/main/java/awais/instagrabber/adapters/viewholder/feed/FeedVideoViewHolder.java
class FeedVideoViewHolder (line 36) | public class FeedVideoViewHolder extends FeedItemViewHolder {
method FeedVideoViewHolder (line 55) | public FeedVideoViewHolder(@NonNull final ItemFeedVideoBinding binding,
method bindItem (line 71) | @Override
method getCurrentFeedModel (line 131) | public Media getCurrentFeedModel() {
FILE: app/src/main/java/awais/instagrabber/animations/CubicBezierInterpolator.java
class CubicBezierInterpolator (line 6) | public class CubicBezierInterpolator implements Interpolator {
method CubicBezierInterpolator (line 20) | public CubicBezierInterpolator(PointF start, PointF end) throws Illega...
method CubicBezierInterpolator (line 31) | public CubicBezierInterpolator(float startX, float startY, float endX,...
method CubicBezierInterpolator (line 35) | public CubicBezierInterpolator(double startX, double startY, double en...
method getInterpolation (line 39) | @Override
method getBezierCoordinateY (line 44) | protected float getBezierCoordinateY(float time) {
method getXForTime (line 51) | protected float getXForTime(float time) {
method getXDerivate (line 64) | private float getXDerivate(float t) {
method getBezierCoordinateX (line 68) | private float getBezierCoordinateX(float time) {
FILE: app/src/main/java/awais/instagrabber/animations/FabAnimation.java
class FabAnimation (line 9) | public class FabAnimation {
method rotateFab (line 10) | public static boolean rotateFab(final View v, boolean rotate) {
method showIn (line 22) | public static void showIn(final View v) {
method showOut (line 39) | public static void showOut(final View v) {
method init (line 56) | public static void init(final View v) {
FILE: app/src/main/java/awais/instagrabber/animations/ResizeAnimation.java
class ResizeAnimation (line 7) | public class ResizeAnimation extends Animation {
method ResizeAnimation (line 16) | public ResizeAnimation(final View view,
method applyTransformation (line 28) | @Override
method initialize (line 36) | @Override
method willChangeBounds (line 41) | @Override
FILE: app/src/main/java/awais/instagrabber/animations/RevealOutlineAnimation.java
class RevealOutlineAnimation (line 16) | public abstract class RevealOutlineAnimation extends ViewOutlineProvider {
method RevealOutlineAnimation (line 20) | public RevealOutlineAnimation() {
method shouldRemoveElevationDuringAnimation (line 27) | abstract boolean shouldRemoveElevationDuringAnimation();
method setProgress (line 32) | abstract void setProgress(float progress);
method createRevealAnimator (line 34) | public ValueAnimator createRevealAnimator(final View revealView, boole...
method getOutline (line 72) | @Override
method getRadius (line 77) | public float getRadius() {
method getOutline (line 81) | public void getOutline(Rect out) {
FILE: app/src/main/java/awais/instagrabber/animations/RoundedRectRevealOutlineProvider.java
class RoundedRectRevealOutlineProvider (line 28) | public class RoundedRectRevealOutlineProvider extends RevealOutlineAnima...
method RoundedRectRevealOutlineProvider (line 35) | public RoundedRectRevealOutlineProvider(float startRadius, float endRa...
method shouldRemoveElevationDuringAnimation (line 42) | @Override
method setProgress (line 47) | @Override
FILE: app/src/main/java/awais/instagrabber/animations/ScaleAnimation.java
class ScaleAnimation (line 8) | public class ScaleAnimation {
method ScaleAnimation (line 12) | public ScaleAnimation(View view) {
method start (line 17) | public void start() {
method stop (line 28) | public void stop() {
FILE: app/src/main/java/awais/instagrabber/asyncs/DiscoverPostFetchService.java
class DiscoverPostFetchService (line 16) | public class DiscoverPostFetchService implements PostFetcher.PostFetchSe...
method DiscoverPostFetchService (line 22) | public DiscoverPostFetchService(final DiscoverService.TopicalExploreRe...
method fetch (line 27) | @Override
method reset (line 62) | @Override
method hasNextPage (line 67) | @Override
FILE: app/src/main/java/awais/instagrabber/asyncs/FeedPostFetchService.java
class FeedPostFetchService (line 17) | public class FeedPostFetchService implements PostFetcher.PostFetchService {
method FeedPostFetchService (line 23) | public FeedPostFetchService() {
method fetch (line 27) | @Override
method reset (line 65) | @Override
method hasNextPage (line 70) | @Override
FILE: app/src/main/java/awais/instagrabber/asyncs/HashtagPostFetchService.java
class HashtagPostFetchService (line 16) | public class HashtagPostFetchService implements PostFetcher.PostFetchSer...
method HashtagPostFetchService (line 24) | public HashtagPostFetchService(final Hashtag hashtagModel, final boole...
method fetch (line 31) | @Override
method reset (line 66) | @Override
method hasNextPage (line 71) | @Override
FILE: app/src/main/java/awais/instagrabber/asyncs/LocationPostFetchService.java
class LocationPostFetchService (line 16) | public class LocationPostFetchService implements PostFetcher.PostFetchSe...
method LocationPostFetchService (line 24) | public LocationPostFetchService(final Location locationModel, final bo...
method fetch (line 31) | @Override
method reset (line 66) | @Override
method hasNextPage (line 71) | @Override
FILE: app/src/main/java/awais/instagrabber/asyncs/ProfilePostFetchService.java
class ProfilePostFetchService (line 17) | public class ProfilePostFetchService implements PostFetcher.PostFetchSer...
method ProfilePostFetchService (line 26) | public ProfilePostFetchService(final User profileModel, final boolean ...
method fetch (line 33) | @Override
method reset (line 59) | @Override
method hasNextPage (line 64) | @Override
FILE: app/src/main/java/awais/instagrabber/asyncs/SavedPostFetchService.java
class SavedPostFetchService (line 16) | public class SavedPostFetchService implements PostFetcher.PostFetchServi...
method SavedPostFetchService (line 27) | public SavedPostFetchService(final long profileId, final PostItemType ...
method fetch (line 36) | @Override
method reset (line 72) | @Override
method hasNextPage (line 77) | @Override
FILE: app/src/main/java/awais/instagrabber/broadcasts/DMRefreshBroadcastReceiver.java
class DMRefreshBroadcastReceiver (line 7) | public class DMRefreshBroadcastReceiver extends BroadcastReceiver {
method DMRefreshBroadcastReceiver (line 11) | public DMRefreshBroadcastReceiver(final OnDMRefreshCallback callback) {
method onReceive (line 15) | @Override
type OnDMRefreshCallback (line 24) | public interface OnDMRefreshCallback {
method onReceive (line 25) | void onReceive();
FILE: app/src/main/java/awais/instagrabber/customviews/ChatMessageLayout.java
class ChatMessageLayout (line 15) | public class ChatMessageLayout extends FrameLayout {
method ChatMessageLayout (line 26) | public ChatMessageLayout(@NonNull final Context context) {
method ChatMessageLayout (line 30) | public ChatMessageLayout(@NonNull final Context context, @Nullable fin...
method ChatMessageLayout (line 35) | public ChatMessageLayout(@NonNull final Context context, @Nullable fin...
method ChatMessageLayout (line 40) | public ChatMessageLayout(@NonNull final Context context, @Nullable fin...
method onAttachedToWindow (line 49) | @Override
method onMeasure (line 61) | @Override
method onLayout (line 146) | @Override
FILE: app/src/main/java/awais/instagrabber/customviews/CircularImageView.java
class CircularImageView (line 19) | public class CircularImageView extends SimpleDraweeView {
method CircularImageView (line 20) | public CircularImageView(Context context, GenericDraweeHierarchy hiera...
method CircularImageView (line 25) | public CircularImageView(final Context context) {
method CircularImageView (line 30) | public CircularImageView(final Context context, final AttributeSet att...
method CircularImageView (line 35) | public CircularImageView(final Context context, final AttributeSet att...
method inflateHierarchy (line 40) | protected void inflateHierarchy(Context context, @Nullable AttributeSe...
method setStoriesBorder (line 53) | public void setStoriesBorder(final int type) {
FILE: app/src/main/java/awais/instagrabber/customviews/CommentMentionClickSpan.java
class CommentMentionClickSpan (line 9) | public final class CommentMentionClickSpan extends ClickableSpan {
method onClick (line 10) | @Override
method updateDrawState (line 13) | @Override
FILE: app/src/main/java/awais/instagrabber/customviews/DirectItemContextMenu.java
class DirectItemContextMenu (line 43) | public class DirectItemContextMenu extends PopupWindow {
method DirectItemContextMenu (line 75) | public DirectItemContextMenu(@NonNull final Context context, final boo...
method show (line 108) | public void show(@NonNull View rootView, @NonNull final Point location) {
method setup (line 120) | private void setup(final View content) {
method setOnOptionSelectListener (line 129) | public void setOnOptionSelectListener(final OnOptionSelectListener onO...
method setOnReactionClickListener (line 133) | public void setOnReactionClickListener(final OnReactionClickListener o...
method setOnAddReactionListener (line 137) | public void setOnAddReactionListener(final OnAddReactionClickListener ...
method animateOpen (line 141) | private void animateOpen() {
method animateClose (line 174) | protected void animateClose() {
method createOpenCloseOutlineProvider (line 200) | private RoundedRectRevealOutlineProvider createOpenCloseOutlineProvide...
method dismiss (line 215) | public void dismiss() {
method createContentView (line 219) | private View createContentView() {
method addReactions (line 244) | private Pair<View, View> addReactions(final LayoutInflater layoutInfla...
method getEmojiImageView (line 305) | @NonNull
method addOptions (line 316) | private void addOptions(final LayoutInflater layoutInflater,
method getTextView (line 359) | private AppCompatTextView getTextView() {
method addDivider (line 372) | private View addDivider(final ConstraintLayout container,
method locationOnScreen (line 389) | @NonNull
class MenuItem (line 396) | public static class MenuItem {
method MenuItem (line 407) | public MenuItem(@IdRes final int itemId, @StringRes final int titleR...
method MenuItem (line 411) | public MenuItem(@IdRes final int itemId, @StringRes final int titleR...
method getItemId (line 417) | public int getItemId() {
method getTitleRes (line 421) | public int getTitleRes() {
method getCallback (line 425) | public Function<DirectItem, Void> getCallback() {
type OnOptionSelectListener (line 430) | public interface OnOptionSelectListener {
method onSelect (line 431) | void onSelect(int itemId, @Nullable Function<DirectItem, Void> callb...
type OnReactionClickListener (line 434) | public interface OnReactionClickListener {
method onClick (line 435) | void onClick(Emoji emoji);
type OnAddReactionClickListener (line 438) | public interface OnAddReactionClickListener {
method onAdd (line 439) | void onAdd();
FILE: app/src/main/java/awais/instagrabber/customviews/DirectItemFrameLayout.java
class DirectItemFrameLayout (line 14) | public class DirectItemFrameLayout extends FrameLayout {
method DirectItemFrameLayout (line 36) | public DirectItemFrameLayout(@NonNull final Context context) {
method DirectItemFrameLayout (line 41) | public DirectItemFrameLayout(@NonNull final Context context, @Nullable...
method DirectItemFrameLayout (line 46) | public DirectItemFrameLayout(@NonNull final Context context, @Nullable...
method DirectItemFrameLayout (line 51) | public DirectItemFrameLayout(@NonNull final Context context, @Nullable...
method init (line 56) | private void init(final Context context) {
method setOnItemLongClickListener (line 61) | public void setOnItemLongClickListener(final OnItemLongClickListener o...
method dispatchTouchEvent (line 65) | @Override
type OnItemLongClickListener (line 117) | public interface OnItemLongClickListener {
method onLongClickStart (line 118) | void onLongClickStart(View view);
method onLongClickCancel (line 120) | void onLongClickCancel(View view);
method onLongClick (line 122) | void onLongClick(View view, float x, float y);
FILE: app/src/main/java/awais/instagrabber/customviews/FixedImageView.java
class FixedImageView (line 8) | public final class FixedImageView extends AppCompatImageView {
method FixedImageView (line 9) | public FixedImageView(final Context context) {
method FixedImageView (line 13) | public FixedImageView(final Context context, final AttributeSet attrs) {
method FixedImageView (line 17) | public FixedImageView(final Context context, final AttributeSet attrs,...
method onMeasure (line 21) | @Override
FILE: app/src/main/java/awais/instagrabber/customviews/FormattedNumberTextView.java
class FormattedNumberTextView (line 21) | public class FormattedNumberTextView extends AppCompatTextView {
method FormattedNumberTextView (line 41) | public FormattedNumberTextView(@NonNull final Context context) {
method FormattedNumberTextView (line 46) | public FormattedNumberTextView(@NonNull final Context context, @Nullab...
method FormattedNumberTextView (line 51) | public FormattedNumberTextView(@NonNull final Context context, @Nullab...
method init (line 56) | private void init() {
method setupClickToggle (line 62) | private void setupClickToggle() {
method getWrappedClickListener (line 66) | private OnClickListener getWrappedClickListener(@Nullable final OnClic...
method setNumber (line 78) | public void setNumber(final long number) {
method clearNumber (line 84) | public void clearNumber() {
method setShowAbbreviation (line 90) | public void setShowAbbreviation(final boolean showAbbreviation) {
method isShowAbbreviation (line 96) | public boolean isShowAbbreviation() {
method toggleAbbreviation (line 100) | private void toggleAbbreviation() {
method setToggleOnClick (line 105) | public void setToggleOnClick(final boolean toggleOnClick) {
method isToggleOnClick (line 109) | public boolean isToggleOnClick() {
method setAutoToggleToAbbreviation (line 113) | public void setAutoToggleToAbbreviation(final boolean autoToggleToAbbr...
method isAutoToggleToAbbreviation (line 117) | public boolean isAutoToggleToAbbreviation() {
method setAutoToggleTimeoutMs (line 121) | public void setAutoToggleTimeoutMs(final long autoToggleTimeoutMs) {
method getAutoToggleTimeoutMs (line 125) | public long getAutoToggleTimeoutMs() {
method setAnimateChanges (line 129) | public void setAnimateChanges(final boolean animateChanges) {
method isAnimateChanges (line 133) | public boolean isAnimateChanges() {
method setOnClickListener (line 137) | @Override
method format (line 142) | private void format() {
FILE: app/src/main/java/awais/instagrabber/customviews/InsetsAnimationLinearLayout.java
class InsetsAnimationLinearLayout (line 24) | public final class InsetsAnimationLinearLayout extends LinearLayout impl...
method InsetsAnimationLinearLayout (line 37) | public InsetsAnimationLinearLayout(final Context context, @Nullable fi...
method InsetsAnimationLinearLayout (line 41) | public InsetsAnimationLinearLayout(@NonNull Context context, @Nullable...
method getScrollImeOffScreenWhenVisible (line 45) | public final boolean getScrollImeOffScreenWhenVisible() {
method setScrollImeOffScreenWhenVisible (line 49) | public final void setScrollImeOffScreenWhenVisible(boolean scrollImeOf...
method getScrollImeOnScreenWhenNotVisible (line 53) | public final boolean getScrollImeOnScreenWhenNotVisible() {
method setScrollImeOnScreenWhenNotVisible (line 57) | public final void setScrollImeOnScreenWhenNotVisible(boolean scrollIme...
method getScrollImeOffScreenWhenVisibleOnFling (line 61) | public boolean getScrollImeOffScreenWhenVisibleOnFling() {
method setScrollImeOffScreenWhenVisibleOnFling (line 65) | public void setScrollImeOffScreenWhenVisibleOnFling(final boolean scro...
method getScrollImeOnScreenWhenNotVisibleOnFling (line 69) | public boolean getScrollImeOnScreenWhenNotVisibleOnFling() {
method setScrollImeOnScreenWhenNotVisibleOnFling (line 73) | public void setScrollImeOnScreenWhenNotVisibleOnFling(final boolean sc...
method getImeAnimController (line 77) | public SimpleImeAnimationController getImeAnimController() {
method onStartNestedScroll (line 81) | @Override
method onNestedScrollAccepted (line 89) | @Override
method onNestedPreScroll (line 98) | @Override
method onNestedScroll (line 132) | @Override
method onNestedFling (line 156) | @Override
method onStopNestedScroll (line 182) | @Override
method dispatchWindowInsetsAnimationPrepare (line 191) | @Override
method startControlRequest (line 197) | private void startControlRequest() {
method onControllerReady (line 208) | private void onControllerReady() {
method reset (line 218) | private void reset() {
method onNestedScrollAccepted (line 224) | @Override
method onNestedScroll (line 231) | @Override
method onStopNestedScroll (line 241) | @Override
FILE: app/src/main/java/awais/instagrabber/customviews/InsetsNotifyingCoordinatorLayout.java
class InsetsNotifyingCoordinatorLayout (line 11) | public class InsetsNotifyingCoordinatorLayout extends CoordinatorLayout {
method InsetsNotifyingCoordinatorLayout (line 13) | public InsetsNotifyingCoordinatorLayout(@NonNull final Context context) {
method InsetsNotifyingCoordinatorLayout (line 17) | public InsetsNotifyingCoordinatorLayout(@NonNull final Context context...
method InsetsNotifyingCoordinatorLayout (line 21) | public InsetsNotifyingCoordinatorLayout(@NonNull final Context context...
method onApplyWindowInsets (line 25) | @Override
FILE: app/src/main/java/awais/instagrabber/customviews/InsetsNotifyingLinearLayout.java
class InsetsNotifyingLinearLayout (line 10) | public class InsetsNotifyingLinearLayout extends LinearLayout {
method InsetsNotifyingLinearLayout (line 11) | public InsetsNotifyingLinearLayout(final Context context) {
method InsetsNotifyingLinearLayout (line 15) | public InsetsNotifyingLinearLayout(final Context context, @Nullable fi...
method InsetsNotifyingLinearLayout (line 19) | public InsetsNotifyingLinearLayout(final Context context, @Nullable fi...
method InsetsNotifyingLinearLayout (line 23) | public InsetsNotifyingLinearLayout(final Context context, final Attrib...
method onApplyWindowInsets (line 27) | @Override
FILE: app/src/main/java/awais/instagrabber/customviews/KeyNotifyingEmojiEditText.java
class KeyNotifyingEmojiEditText (line 9) | public class KeyNotifyingEmojiEditText extends EmojiEditText {
method KeyNotifyingEmojiEditText (line 12) | public KeyNotifyingEmojiEditText(final Context context) {
method KeyNotifyingEmojiEditText (line 16) | public KeyNotifyingEmojiEditText(final Context context, final Attribut...
method KeyNotifyingEmojiEditText (line 20) | public KeyNotifyingEmojiEditText(final Context context, final Attribut...
method KeyNotifyingEmojiEditText (line 24) | public KeyNotifyingEmojiEditText(final Context context, final Attribut...
method onKeyPreIme (line 28) | @Override
method setOnKeyEventListener (line 37) | public void setOnKeyEventListener(final OnKeyEventListener onKeyEventL...
type OnKeyEventListener (line 41) | public interface OnKeyEventListener {
method onKeyPreIme (line 42) | boolean onKeyPreIme(int keyCode, KeyEvent keyEvent);
FILE: app/src/main/java/awais/instagrabber/customviews/MouseDrawer.java
class MouseDrawer (line 40) | @SuppressLint("RtlHardcoded")
type DrawerListener (line 62) | public interface DrawerListener {
method onDrawerSlide (line 63) | void onDrawerSlide(final View drawerView, @EdgeGravity final int gra...
method onDrawerOpened (line 64) | default void onDrawerOpened(final View drawerView, @EdgeGravity fina...
method onDrawerClosed (line 65) | default void onDrawerClosed(final View drawerView, @EdgeGravity fina...
method onDrawerStateChanged (line 66) | default void onDrawerStateChanged() {}
method MouseDrawer (line 69) | public MouseDrawer(@NonNull final Context context) {
method MouseDrawer (line 73) | public MouseDrawer(@NonNull final Context context, @Nullable final Att...
method MouseDrawer (line 77) | public MouseDrawer(@NonNull final Context context, @Nullable final Att...
method setDrawerElevation (line 114) | public void setDrawerElevation(final float elevation) {
method getDrawerElevation (line 122) | public float getDrawerElevation() {
method addDrawerListener (line 126) | public void addDrawerListener(@NonNull final DrawerListener listener) {
method isInBoundsOfChild (line 131) | private boolean isInBoundsOfChild(final float x, final float y, final ...
method dispatchTransformedGenericPointerEvent (line 137) | private boolean dispatchTransformedGenericPointerEvent(final MotionEve...
method getTransformedMotionEvent (line 154) | @NonNull
method updateDrawerState (line 169) | void updateDrawerState(@State final int activeState, final View active...
method dispatchOnDrawerClosed (line 196) | void dispatchOnDrawerClosed(@NonNull final View drawerView) {
method dispatchOnDrawerOpened (line 208) | void dispatchOnDrawerOpened(@NonNull final View drawerView) {
method setDrawerViewOffset (line 219) | void setDrawerViewOffset(@NonNull final View drawerView, final float s...
method getDrawerViewOffset (line 232) | float getDrawerViewOffset(@NonNull final View drawerView) {
method getDrawerViewAbsoluteGravity (line 236) | int getDrawerViewAbsoluteGravity(@NonNull final View drawerView) {
method checkDrawerViewAbsoluteGravity (line 241) | boolean checkDrawerViewAbsoluteGravity(final View drawerView, final in...
method moveDrawerToOffset (line 246) | void moveDrawerToOffset(final View drawerView, final float slideOffset) {
method findOpenDrawer (line 257) | public View findOpenDrawer() {
method findDrawerWithGravity (line 267) | public View findDrawerWithGravity(final int gravity) {
method gravityToString (line 278) | @NonNull
method onDetachedFromWindow (line 285) | @Override
method onAttachedToWindow (line 291) | @Override
method onMeasure (line 297) | @SuppressLint("WrongConstant")
method onLayout (line 343) | @Override
method requestLayout (line 412) | @Override
method computeScroll (line 417) | @Override
method hasOpaqueBackground (line 424) | private static boolean hasOpaqueBackground(@NonNull final View v) {
method drawChild (line 430) | @Override
method isContentView (line 460) | boolean isContentView(@NonNull final View child) {
method isDrawerView (line 464) | boolean isDrawerView(@NonNull final View child) {
method onInterceptTouchEvent (line 470) | @Override
method dispatchGenericMotionEvent (line 495) | @Override
method onTouchEvent (line 516) | @SuppressLint("ClickableViewAccessibility")
method requestDisallowInterceptTouchEvent (line 556) | @Override
method closeDrawers (line 563) | public void closeDrawers() {
method closeDrawers (line 567) | void closeDrawers(final boolean peekingOnly) {
method openDrawer (line 589) | public void openDrawer(@NonNull final View drawerView, final boolean a...
method openDrawer (line 615) | public void openDrawer(@NonNull final View drawerView) {
method closeDrawer (line 629) | public void closeDrawer(@NonNull final View drawerView) {
method closeDrawer (line 633) | public void closeDrawer(@NonNull final View drawerView, final boolean ...
method isDrawerOpen (line 665) | public boolean isDrawerOpen(@NonNull final View drawer) {
method isDrawerVisible (line 675) | public boolean isDrawerVisible(@NonNull final View drawer) {
method hasPeekingDrawer (line 685) | private boolean hasPeekingDrawer() {
method generateDefaultLayoutParams (line 694) | @Override
method generateLayoutParams (line 699) | @Override
method checkLayoutParams (line 705) | @Override
method generateLayoutParams (line 710) | @Override
method addFocusables (line 715) | @Override
method hasVisibleDrawer (line 741) | private boolean hasVisibleDrawer() {
method findVisibleDrawer (line 745) | @Nullable
method onKeyDown (line 755) | @Override
method onKeyUp (line 764) | @Override
method onRestoreInstanceState (line 774) | @Override
method onSaveInstanceState (line 787) | @Override
method addView (line 811) | @Override
class SavedState (line 818) | protected static class SavedState extends AbsSavedState {
method createFromParcel (line 820) | @NonNull
method createFromParcel (line 826) | @NonNull
method newArray (line 832) | @NonNull
method SavedState (line 840) | public SavedState(@NonNull final Parcelable superState) {
method SavedState (line 844) | public SavedState(@NonNull final Parcel in, @Nullable final ClassLoa...
method writeToParcel (line 849) | @Override
class ViewDragCallback (line 856) | private class ViewDragCallback extends ViewDragHelper.Callback {
method ViewDragCallback (line 860) | ViewDragCallback(final int gravity) {
method setDragger (line 864) | public void setDragger(final ViewDragHelper dragger) {
method tryCaptureView (line 868) | @Override
method onViewDragStateChanged (line 873) | @Override
method onViewPositionChanged (line 878) | @Override
method onViewCaptured (line 891) | @Override
method closeOtherDrawer (line 898) | private void closeOtherDrawer() {
method onViewReleased (line 904) | @Override
method onEdgeDragStarted (line 921) | @Override
method getViewHorizontalDragRange (line 931) | @Override
method clampViewPositionHorizontal (line 936) | @Override
method clampViewPositionVertical (line 943) | @Override
class LayoutParams (line 949) | public static class LayoutParams extends ViewGroup.MarginLayoutParams {
method LayoutParams (line 959) | public LayoutParams(@NonNull final Context c, @Nullable final Attrib...
method LayoutParams (line 969) | public LayoutParams(final int width, final int height) {
method LayoutParams (line 973) | public LayoutParams(@NonNull final LayoutParams source) {
method LayoutParams (line 978) | public LayoutParams(@NonNull final ViewGroup.LayoutParams source) {
method LayoutParams (line 982) | public LayoutParams(@NonNull final ViewGroup.MarginLayoutParams sour...
FILE: app/src/main/java/awais/instagrabber/customviews/PostsRecyclerView.java
class PostsRecyclerView (line 41) | public class PostsRecyclerView extends RecyclerView {
method getVerticalSnapPreference (line 62) | @Override
method PostsRecyclerView (line 68) | public PostsRecyclerView(@NonNull final Context context) {
method PostsRecyclerView (line 72) | public PostsRecyclerView(@NonNull final Context context, @Nullable fin...
method PostsRecyclerView (line 76) | public PostsRecyclerView(@NonNull final Context context, @Nullable fin...
method setViewModelStoreOwner (line 80) | public PostsRecyclerView setViewModelStoreOwner(final ViewModelStoreOw...
method setLifeCycleOwner (line 88) | public PostsRecyclerView setLifeCycleOwner(final LifecycleOwner lifeCy...
method setPostFetchService (line 96) | public PostsRecyclerView setPostFetchService(final PostFetcher.PostFet...
method setFeedItemCallback (line 104) | public PostsRecyclerView setFeedItemCallback(@NonNull final FeedAdapte...
method setSelectionModeCallback (line 109) | public PostsRecyclerView setSelectionModeCallback(@NonNull final FeedA...
method setLayoutPreferences (line 114) | public PostsRecyclerView setLayoutPreferences(final PostsLayoutPrefere...
method init (line 124) | public void init() {
method initTransition (line 145) | private void initTransition() {
method initLayoutManager (line 150) | private void initLayoutManager() {
method initAdapter (line 155) | private void initAdapter() {
method initSelf (line 161) | private void initSelf() {
method fetchMoreIfPossible (line 198) | private void fetchMoreIfPossible() {
method initDownloadWorkerListener (line 212) | private void initDownloadWorkerListener() {
method getDisplayUrl (line 236) | private List<String> getDisplayUrl(final Media feedModel) {
method updateLayout (line 259) | private void updateLayout() {
method refresh (line 290) | public void refresh() {
method isFetching (line 301) | public boolean isFetching() {
method addFetchStatusChangeListener (line 305) | public PostsRecyclerView addFetchStatusChangeListener(final FetchStatu...
method removeFetchStatusListener (line 311) | public void removeFetchStatusListener(final FetchStatusChangeListener ...
method dispatchFetchStatus (line 316) | private void dispatchFetchStatus() {
method getLayoutPreferences (line 322) | public PostsLayoutPreferences getLayoutPreferences() {
method endSelection (line 326) | public void endSelection() {
type FetchStatusChangeListener (line 330) | public interface FetchStatusChangeListener {
method onFetchStatusChange (line 331) | void onFetchStatusChange(boolean fetching);
method onDetachedFromWindow (line 334) | @Override
method smoothScrollToPosition (line 341) | @Override
FILE: app/src/main/java/awais/instagrabber/customviews/PrimaryActionModeCallback.java
class PrimaryActionModeCallback (line 7) | public class PrimaryActionModeCallback implements ActionMode.Callback {
method PrimaryActionModeCallback (line 12) | public PrimaryActionModeCallback(final int menuRes, final Callbacks ca...
method onCreateActionMode (line 17) | @Override
method onPrepareActionMode (line 27) | @Override
method onActionItemClicked (line 32) | @Override
method onDestroyActionMode (line 40) | @Override
class CallbacksHelper (line 48) | public abstract static class CallbacksHelper implements Callbacks {
method onCreate (line 49) | public void onCreate(final ActionMode mode, final Menu menu) {
method onDestroy (line 53) | @Override
method onActionItemClicked (line 58) | @Override
type Callbacks (line 64) | public interface Callbacks {
method onCreate (line 65) | void onCreate(final ActionMode mode, final Menu menu);
method onDestroy (line 67) | void onDestroy(final ActionMode mode);
method onActionItemClicked (line 69) | boolean onActionItemClicked(final ActionMode mode, final MenuItem it...
FILE: app/src/main/java/awais/instagrabber/customviews/ProfilePicView.java
class ProfilePicView (line 20) | public final class ProfilePicView extends CircularImageView {
method ProfilePicView (line 26) | public ProfilePicView(Context context, GenericDraweeHierarchy hierarch...
method ProfilePicView (line 33) | public ProfilePicView(final Context context) {
method ProfilePicView (line 39) | public ProfilePicView(final Context context, final AttributeSet attrs) {
method ProfilePicView (line 45) | public ProfilePicView(final Context context,
method parseAttrs (line 53) | private void parseAttrs(final Context context, final AttributeSet attr...
method updateLayout (line 67) | private void updateLayout() {
method setSize (line 99) | public void setSize(final Size size) {
method setStoriesBorder (line 104) | public void setStoriesBorder() {
type Size (line 115) | public enum Size {
method Size (line 131) | Size(final int value) {
method valueOf (line 135) | @NonNull
method getValue (line 141) | public int getValue() {
method onMeasure (line 146) | @Override
FILE: app/src/main/java/awais/instagrabber/customviews/RamboTextViewV2.java
class RamboTextViewV2 (line 22) | public class RamboTextViewV2 extends AutoLinkTextView {
method RamboTextViewV2 (line 30) | public RamboTextViewV2(@NonNull final Context context,
method init (line 36) | private void init() {
method setFilters (line 68) | @Override
method setAllCaps (line 73) | @Override
method getEmojiTextViewHelper (line 80) | private EmojiTextViewHelper getEmojiTextViewHelper() {
method addOnMentionClickListener (line 87) | public void addOnMentionClickListener(final OnMentionClickListener onM...
method removeOnMentionClickListener (line 94) | public void removeOnMentionClickListener(final OnMentionClickListener ...
method clearOnMentionClickListeners (line 101) | public void clearOnMentionClickListeners() {
method addOnHashtagListener (line 105) | public void addOnHashtagListener(final OnHashtagClickListener onHashta...
method removeOnHashtagListener (line 112) | public void removeOnHashtagListener(final OnHashtagClickListener onHas...
method clearOnHashtagClickListeners (line 119) | public void clearOnHashtagClickListeners() {
method addOnURLClickListener (line 123) | public void addOnURLClickListener(final OnURLClickListener onURLClickL...
method removeOnURLClickListener (line 130) | public void removeOnURLClickListener(final OnURLClickListener onURLCli...
method clearOnURLClickListeners (line 137) | public void clearOnURLClickListeners() {
method addOnEmailClickListener (line 141) | public void addOnEmailClickListener(final OnEmailClickListener onEmail...
method removeOnEmailClickListener (line 148) | public void removeOnEmailClickListener(final OnEmailClickListener onEm...
method clearOnEmailClickListeners (line 155) | public void clearOnEmailClickListeners() {
method clearAllAutoLinkListeners (line 159) | public void clearAllAutoLinkListeners() {
type OnMentionClickListener (line 166) | public interface OnMentionClickListener {
method onMentionClick (line 167) | void onMentionClick(final AutoLinkItem autoLinkItem);
type OnHashtagClickListener (line 170) | public interface OnHashtagClickListener {
method onHashtagClick (line 171) | void onHashtagClick(final AutoLinkItem autoLinkItem);
type OnURLClickListener (line 174) | public interface OnURLClickListener {
method onURLClick (line 175) | void onURLClick(final AutoLinkItem autoLinkItem);
type OnEmailClickListener (line 178) | public interface OnEmailClickListener {
method onEmailClick (line 179) | void onEmailClick(final AutoLinkItem autoLinkItem);
FILE: app/src/main/java/awais/instagrabber/customviews/ReactionEmojiTextView.java
class ReactionEmojiTextView (line 16) | public class ReactionEmojiTextView extends EmojiAppCompatTextView {
method ReactionEmojiTextView (line 25) | public ReactionEmojiTextView(final Context context) {
method ReactionEmojiTextView (line 30) | public ReactionEmojiTextView(final Context context, final AttributeSet...
method ReactionEmojiTextView (line 35) | public ReactionEmojiTextView(final Context context, final AttributeSet...
method init (line 40) | private void init() {
method setEmojis (line 44) | @SuppressLint("SetTextI18n")
method onMeasure (line 54) | @Override
method getDefaultEllipsis (line 78) | private char getDefaultEllipsis() {
FILE: app/src/main/java/awais/instagrabber/customviews/RecordButton.java
class RecordButton (line 17) | public class RecordButton extends MaterialButton implements View.OnTouch...
method RecordButton (line 25) | public RecordButton(Context context) {
method RecordButton (line 30) | public RecordButton(Context context, AttributeSet attrs) {
method RecordButton (line 35) | public RecordButton(Context context, AttributeSet attrs, int defStyleA...
method init (line 40) | @SuppressLint("ClickableViewAccessibility")
method setRecordView (line 48) | public void setRecordView(RecordView recordView) {
method onTouch (line 52) | @Override
method startScale (line 70) | protected void startScale() {
method stopScale (line 74) | public void stopScale() {
method setListenForRecord (line 78) | public void setListenForRecord(boolean listenForRecord) {
method isListenForRecord (line 82) | public boolean isListenForRecord() {
method setOnRecordClickListener (line 86) | public void setOnRecordClickListener(OnRecordClickListener onRecordCli...
method setOnRecordLongClickListener (line 90) | public void setOnRecordLongClickListener(OnRecordLongClickListener onR...
method onClick (line 94) | @Override
method onLongClick (line 101) | @Override
type OnRecordClickListener (line 109) | public interface OnRecordClickListener {
method onClick (line 110) | void onClick(View v);
type OnRecordLongClickListener (line 113) | public interface OnRecordLongClickListener {
method onLongClick (line 114) | boolean onLongClick(View v);
FILE: app/src/main/java/awais/instagrabber/customviews/RecordView.java
class RecordView (line 33) | public class RecordView extends RelativeLayout {
method RecordView (line 60) | public RecordView(Context context) {
method RecordView (line 67) | public RecordView(Context context, @Nullable AttributeSet attrs) {
method RecordView (line 73) | public RecordView(Context context, @Nullable AttributeSet attrs, int d...
method init (line 79) | private void init(Context context, AttributeSet attrs, int defStyleAtt...
method hideViews (line 116) | private void hideViews(boolean hideSmallMic) {
method showViews (line 125) | private void showViews() {
method isLessThanMin (line 131) | private boolean isLessThanMin(long time) {
method playSound (line 135) | private void playSound(int soundRes) {
method onActionDown (line 153) | protected void onActionDown(RecordButton recordBtn, MotionEvent motion...
method onActionMove (line 175) | protected void onActionMove(RecordButton recordBtn, MotionEvent motion...
method onActionUp (line 217) | protected void onActionUp(RecordButton recordBtn) {
method setMarginRight (line 244) | private void setMarginRight(int marginRight, boolean convertToDp) {
method setSlideArrowDrawable (line 254) | private void setSlideArrowDrawable(@DrawableRes final int slideArrowRe...
method setOnRecordListener (line 262) | public void setOnRecordListener(OnRecordListener onRecordListener) {
method setOnBasketAnimationEndListener (line 266) | public void setOnBasketAnimationEndListener(OnBasketAnimationEnd onBas...
method setSoundEnabled (line 270) | public void setSoundEnabled(boolean isEnabled) {
method setLessThanMinAllowed (line 274) | public void setLessThanMinAllowed(boolean isAllowed) {
method setSlideToCancelText (line 278) | public void setSlideToCancelText(String text) {
method setSlideToCancelTextColor (line 282) | public void setSlideToCancelTextColor(int color) {
method setSmallMicColor (line 286) | public void setSmallMicColor(int color) {
method setSmallMicIcon (line 290) | public void setSmallMicIcon(int icon) {
method setSlideMarginRight (line 294) | public void setSlideMarginRight(int marginRight) {
method setCustomSounds (line 298) | public void setCustomSounds(int startSound, int finishedSound, int err...
method getCancelBounds (line 305) | public float getCancelBounds() {
method setCancelBounds (line 309) | public void setCancelBounds(float cancelBounds) {
method setCounterTimeColor (line 314) | public void setCounterTimeColor(@ColorInt int color) {
method setSlideToCancelArrowColor (line 318) | public void setSlideToCancelArrowColor(@ColorInt int color) {
method setCancelBounds (line 325) | private void setCancelBounds(float cancelBounds, boolean convertDpToPi...
method setMinMillis (line 329) | public void setMinMillis(final int minMillis) {
method cancelRecording (line 333) | public void cancelRecording(final RecordButton recordBtn) {
type OnBasketAnimationEnd (line 337) | public interface OnBasketAnimationEnd {
method onAnimationEnd (line 338) | void onAnimationEnd();
type OnRecordListener (line 341) | public interface OnRecordListener {
method onStart (line 342) | void onStart();
method onCancel (line 344) | void onCancel();
method onFinish (line 346) | void onFinish(long recordTime);
method onLessThanMin (line 348) | void onLessThanMin();
FILE: app/src/main/java/awais/instagrabber/customviews/SharedElementTransitionDialogFragment.java
class SharedElementTransitionDialogFragment (line 28) | public abstract class SharedElementTransitionDialogFragment extends Dial...
method getAnimationDuration (line 42) | protected int getAnimationDuration() {
method addSharedElement (line 46) | public void addSharedElement(@NonNull final View startView, @NonNull f...
method startPostponedEnterTransition (line 56) | public void startPostponedEnterTransition() {
method setDestBounds (line 101) | private void setDestBounds(final int key) {
method onBeforeSharedElementAnimation (line 118) | protected void onBeforeSharedElementAnimation(@NonNull final View star...
method onEndSharedElementAnimation (line 122) | protected void onEndSharedElementAnimation(@NonNull final View startView,
method setupInitialBounds (line 126) | private void setupInitialBounds(@NonNull final View startView, @NonNul...
method getViewBounds (line 154) | private void getViewBounds(@NonNull final View startView,
method addAnimator (line 235) | protected void addAnimator(@NonNull final Animator animator) {
class ViewBounds (line 239) | protected static class ViewBounds {
method ViewBounds (line 247) | public ViewBounds() {}
method getDestY (line 249) | public float getDestY() {
method setDestY (line 253) | public void setDestY(final float destY) {
method getDestX (line 257) | public float getDestX() {
method setDestX (line 261) | public void setDestX(final float destX) {
method getDestHeight (line 265) | public int getDestHeight() {
method setDestHeight (line 269) | public void setDestHeight(final int destHeight) {
method getDestWidth (line 273) | public int getDestWidth() {
method setDestWidth (line 277) | public void setDestWidth(final int destWidth) {
method getStartBounds (line 281) | public Rect getStartBounds() {
method setStartBounds (line 285) | public void setStartBounds(final Rect startBounds) {
method getDestBounds (line 289) | public Rect getDestBounds() {
method setDestBounds (line 293) | public void setDestBounds(final Rect destBounds) {
method onDestroyView (line 298) | @Override
FILE: app/src/main/java/awais/instagrabber/customviews/SquareImageView.java
class SquareImageView (line 8) | public class SquareImageView extends AppCompatImageView {
method SquareImageView (line 9) | public SquareImageView(final Context context) {
method SquareImageView (line 13) | public SquareImageView(final Context context, final AttributeSet attrs) {
method SquareImageView (line 17) | public SquareImageView(final Context context, final AttributeSet attrs...
method onMeasure (line 21) | @Override
FILE: app/src/main/java/awais/instagrabber/customviews/TextViewDrawableSize.java
class TextViewDrawableSize (line 18) | public class TextViewDrawableSize extends EmojiAppCompatTextView {
method TextViewDrawableSize (line 24) | public TextViewDrawableSize(final Context context) {
method TextViewDrawableSize (line 28) | public TextViewDrawableSize(final Context context, final AttributeSet ...
method TextViewDrawableSize (line 32) | public TextViewDrawableSize(final Context context, final AttributeSet ...
method init (line 37) | private void init(@NonNull final Context context, final AttributeSet a...
method initCompoundDrawableSize (line 52) | private void initCompoundDrawableSize() {
method setCompoundDrawablesRelativeWithSize (line 88) | public void setCompoundDrawablesRelativeWithSize(@Nullable final Drawa...
FILE: app/src/main/java/awais/instagrabber/customviews/Tooltip.java
class Tooltip (line 21) | public class Tooltip extends AppCompatTextView {
method onAnimationEnd (line 30) | @Override
method Tooltip (line 38) | public Tooltip(@NonNull Context context, @NonNull ViewGroup parentView...
method onLayout (line 49) | @Override
method updateTooltipPosition (line 55) | private void updateTooltipPosition() {
method show (line 82) | public void show(View anchor) {
method hide (line 105) | public void hide() {
FILE: app/src/main/java/awais/instagrabber/customviews/UsernameTextView.java
class UsernameTextView (line 18) | public class UsernameTextView extends AppCompatTextView {
method UsernameTextView (line 26) | public UsernameTextView(@NonNull final Context context) {
method UsernameTextView (line 30) | public UsernameTextView(@NonNull final Context context, @Nullable fina...
method UsernameTextView (line 34) | public UsernameTextView(@NonNull final Context context, @Nullable fina...
method init (line 39) | private void init() {
method setUsername (line 50) | public void setUsername(final CharSequence username) {
method setUsername (line 54) | public void setUsername(final CharSequence username, final boolean ver...
method isVerified (line 70) | public boolean isVerified() {
method setVerified (line 74) | public void setVerified(final boolean verified) {
FILE: app/src/main/java/awais/instagrabber/customviews/VerticalDragHelper.java
class VerticalDragHelper (line 11) | public class VerticalDragHelper {
method onSingleTapConfirmed (line 24) | @Override
method onFling (line 30) | @Override
method VerticalDragHelper (line 47) | public VerticalDragHelper(@NonNull final View view) {
method setOnVerticalDragListener (line 55) | public void setOnVerticalDragListener(@NonNull final OnVerticalDragLis...
method init (line 59) | protected void init() {
method onDragTouch (line 63) | public boolean onDragTouch(final MotionEvent event) {
method isDragging (line 122) | public boolean isDragging() {
method onGestureTouchEvent (line 126) | public boolean onGestureTouchEvent(final MotionEvent event) {
type OnVerticalDragListener (line 130) | public interface OnVerticalDragListener {
method onDrag (line 131) | void onDrag(final float dY);
method onDragEnd (line 133) | void onDragEnd();
method onFling (line 135) | void onFling(final double flingVelocity);
FILE: app/src/main/java/awais/instagrabber/customviews/VerticalImageSpan.java
class VerticalImageSpan (line 11) | public class VerticalImageSpan extends ImageSpan {
method VerticalImageSpan (line 13) | public VerticalImageSpan(final Drawable drawable) {
method getSize (line 20) | @Override
method draw (line 55) | @Override
FILE: app/src/main/java/awais/instagrabber/customviews/VideoPlayerCallbackAdapter.java
class VideoPlayerCallbackAdapter (line 5) | public class VideoPlayerCallbackAdapter implements VideoPlayerViewHelper...
method onThumbnailLoaded (line 6) | @Override
method onThumbnailClick (line 9) | @Override
method onPlayerViewLoaded (line 12) | @Override
method onPlay (line 15) | @Override
method onPause (line 18) | @Override
method onRelease (line 21) | @Override
method onFullScreenModeChanged (line 24) | @Override
method isInFullScreen (line 27) | @Override
FILE: app/src/main/java/awais/instagrabber/customviews/VideoPlayerViewHelper.java
class VideoPlayerViewHelper (line 45) | public class VideoPlayerViewHelper implements Player.EventListener {
method onVolumeChanged (line 61) | @Override
method VideoPlayerViewHelper (line 69) | public VideoPlayerViewHelper(@NonNull final Context context,
method bind (line 89) | private void bind() {
method setThumbnail (line 101) | private void setThumbnail() {
method loadPlayer (line 132) | private void loadPlayer() {
method setupControllerView (line 172) | private void setupControllerView() {
method setControlViewLayoutManager (line 205) | @Nullable
method setControllerViewToFullScreenMode (line 213) | private void setControllerViewToFullScreenMode(@NonNull final StyledPl...
method getStyledPlayerControlView (line 230) | @Nullable
method onTracksChanged (line 237) | @Override
method setHasAudio (line 256) | private void setHasAudio(final boolean hasAudio) {
method updateMuteIcon (line 263) | private void updateMuteIcon(final float volume) {
method onPlayWhenReadyChanged (line 272) | @Override
method onPlayerError (line 282) | @Override
method toggleMute (line 287) | private void toggleMute() {
method releasePlayer (line 301) | public void releasePlayer() {
method pause (line 311) | public void pause() {
type VideoPlayerCallback (line 317) | public interface VideoPlayerCallback {
method onThumbnailLoaded (line 318) | void onThumbnailLoaded();
method onThumbnailClick (line 320) | void onThumbnailClick();
method onPlayerViewLoaded (line 322) | void onPlayerViewLoaded();
method onPlay (line 324) | void onPlay();
method onPause (line 326) | void onPause();
method onRelease (line 328) | void onRelease();
method onFullScreenModeChanged (line 330) | void onFullScreenModeChanged(boolean isFullScreen, final StyledPlaye...
method isInFullScreen (line 332) | boolean isInFullScreen();
FILE: app/src/main/java/awais/instagrabber/customviews/drawee/AbstractAnimatedZoomableController.java
class AbstractAnimatedZoomableController (line 21) | public abstract class AbstractAnimatedZoomableController extends Default...
method AbstractAnimatedZoomableController (line 30) | public AbstractAnimatedZoomableController(TransformGestureDetector tra...
method reset (line 34) | @Override
method isIdentity (line 46) | @Override
method zoomToPoint (line 62) | @Override
method zoomToPoint (line 81) | public void zoomToPoint(
method setTransform (line 103) | public void setTransform(
method setTransformImmediate (line 113) | private void setTransformImmediate(final Matrix newTransform) {
method isAnimating (line 121) | protected boolean isAnimating() {
method setAnimating (line 125) | protected void setAnimating(boolean isAnimating) {
method getStartValues (line 129) | protected float[] getStartValues() {
method getStopValues (line 133) | protected float[] getStopValues() {
method getWorkingTransform (line 137) | protected Matrix getWorkingTransform() {
method onGestureBegin (line 141) | @Override
method onGestureUpdate (line 148) | @Override
method calculateInterpolation (line 157) | protected void calculateInterpolation(Matrix outMatrix, float fraction) {
method setTransformAnimated (line 164) | public abstract void setTransformAnimated(
method stopAnimation (line 167) | protected abstract void stopAnimation();
method getLogTag (line 169) | protected abstract Class<?> getLogTag();
FILE: app/src/main/java/awais/instagrabber/customviews/drawee/AnimatedZoomableController.java
class AnimatedZoomableController (line 27) | public class AnimatedZoomableController extends AbstractAnimatedZoomable...
method newInstance (line 33) | public static AnimatedZoomableController newInstance() {
method AnimatedZoomableController (line 37) | @SuppressLint("NewApi")
method setTransformAnimated (line 44) | @SuppressLint("NewApi")
method stopAnimation (line 89) | @SuppressLint("NewApi")
method getLogTag (line 101) | @Override
FILE: app/src/main/java/awais/instagrabber/customviews/drawee/DefaultZoomableController.java
class DefaultZoomableController (line 26) | public class DefaultZoomableController
type ImageBoundsListener (line 32) | public interface ImageBoundsListener {
method onImageBoundsSet (line 33) | void onImageBoundsSet(RectF imageBounds);
method newInstance (line 85) | public static DefaultZoomableController newInstance() {
method DefaultZoomableController (line 89) | public DefaultZoomableController(TransformGestureDetector gestureDetec...
method reset (line 97) | public void reset() {
method setListener (line 108) | @Override
method setEnabled (line 116) | @Override
method isEnabled (line 127) | @Override
method setRotationEnabled (line 135) | public void setRotationEnabled(boolean enabled) {
method isRotationEnabled (line 142) | public boolean isRotationEnabled() {
method setScaleEnabled (line 149) | public void setScaleEnabled(boolean enabled) {
method isScaleEnabled (line 156) | public boolean isScaleEnabled() {
method setTranslationEnabled (line 163) | public void setTranslationEnabled(boolean enabled) {
method isTranslationEnabled (line 170) | public boolean isTranslationEnabled() {
method setMinScaleFactor (line 179) | public void setMinScaleFactor(float minScaleFactor) {
method getMinScaleFactor (line 186) | public float getMinScaleFactor() {
method setMaxScaleFactor (line 195) | public void setMaxScaleFactor(float maxScaleFactor) {
method getMaxScaleFactor (line 202) | public float getMaxScaleFactor() {
method setGestureZoomEnabled (line 209) | public void setGestureZoomEnabled(boolean isGestureZoomEnabled) {
method isGestureZoomEnabled (line 216) | public boolean isGestureZoomEnabled() {
method getScaleFactor (line 223) | @Override
method setImageBounds (line 231) | @Override
method getImageBounds (line 245) | public RectF getImageBounds() {
method getTransformedImageBounds (line 252) | private RectF getTransformedImageBounds() {
method setViewBounds (line 259) | @Override
method getViewBounds (line 267) | public RectF getViewBounds() {
method setImageBoundsListener (line 274) | public void setImageBoundsListener(@Nullable ImageBoundsListener image...
method getImageBoundsListener (line 281) | public @Nullable
method isIdentity (line 289) | @Override
method wasTransformCorrected (line 300) | @Override
method getTransform (line 311) | @Override
method getImageRelativeToViewAbsoluteTransform (line 320) | public void getImageRelativeToViewAbsoluteTransform(Matrix outMatrix) {
method mapViewToImage (line 328) | public PointF mapViewToImage(PointF viewPoint) {
method mapImageToView (line 342) | public PointF mapImageToView(PointF imagePoint) {
method mapAbsoluteToRelative (line 360) | private void mapAbsoluteToRelative(float[] destPoints, float[] srcPoin...
method mapRelativeToAbsolute (line 376) | private void mapRelativeToAbsolute(float[] destPoints, float[] srcPoin...
method zoomToPoint (line 391) | public void zoomToPoint(float scale, PointF imagePoint, PointF viewPoi...
method calculateZoomToPointTransform (line 408) | protected boolean calculateZoomToPointTransform(
method setTransform (line 431) | public void setTransform(Matrix newTransform) {
method getDetector (line 440) | protected TransformGestureDetector getDetector() {
method onTouchEvent (line 447) | @Override
method onGestureBegin (line 458) | @Override
method onGestureUpdate (line 470) | @Override
method onGestureEnd (line 482) | @Override
method calculateGestureTransform (line 495) | protected boolean calculateGestureTransform(Matrix outTransform, @Limi...
method onTransformBegin (line 516) | private void onTransformBegin() {
method onTransformChanged (line 522) | private void onTransformChanged() {
method onTransformEnd (line 529) | private void onTransformEnd() {
method limitScale (line 543) | private boolean limitScale(
method limitTranslation (line 568) | private boolean limitTranslation(Matrix transform, @LimitFlag int limi...
method shouldLimit (line 602) | private static boolean shouldLimit(@LimitFlag int limits, @LimitFlag i...
method getOffset (line 611) | private float getOffset(
method limit (line 640) | private float limit(float value, float min, float max) {
method getMatrixScaleFactor (line 648) | private float getMatrixScaleFactor(Matrix transform) {
method isMatrixIdentity (line 656) | private boolean isMatrixIdentity(Matrix transform, float eps) {
method canScrollInAllDirection (line 680) | private boolean canScrollInAllDirection() {
method computeHorizontalScrollRange (line 687) | @Override
method computeHorizontalScrollOffset (line 692) | @Override
method computeHorizontalScrollExtent (line 697) | @Override
method computeVerticalScrollRange (line 702) | @Override
method computeVerticalScrollOffset (line 707) | @Override
method computeVerticalScrollExtent (line 712) | @Override
method getListener (line 717) | public Listener getListener() {
FILE: app/src/main/java/awais/instagrabber/customviews/drawee/DoubleTapGestureListener.java
class DoubleTapGestureListener (line 19) | public class DoubleTapGestureListener extends GestureDetector.SimpleOnGe...
method DoubleTapGestureListener (line 29) | public DoubleTapGestureListener(ZoomableDraweeView zoomableDraweeView) {
method onDoubleTapEvent (line 33) | @Override
method shouldStartDoubleTapScroll (line 73) | private boolean shouldStartDoubleTapScroll(PointF viewPoint) {
method calcScale (line 79) | private float calcScale(PointF currentViewPoint) {
FILE: app/src/main/java/awais/instagrabber/customviews/drawee/DraggableZoomableDraweeView.java
class DraggableZoomableDraweeView (line 20) | public class DraggableZoomableDraweeView extends ZoomableDraweeView {
method DraggableZoomableDraweeView (line 25) | public DraggableZoomableDraweeView(final Context context, final Generi...
method DraggableZoomableDraweeView (line 30) | public DraggableZoomableDraweeView(final Context context) {
method DraggableZoomableDraweeView (line 35) | public DraggableZoomableDraweeView(final Context context, final Attrib...
method DraggableZoomableDraweeView (line 40) | public DraggableZoomableDraweeView(final Context context, final Attrib...
method setOnVerticalDragListener (line 45) | public void setOnVerticalDragListener(@NonNull final OnVerticalDragLis...
FILE: app/src/main/java/awais/instagrabber/customviews/drawee/GestureListenerWrapper.java
class GestureListenerWrapper (line 16) | public class GestureListenerWrapper extends GestureDetector.SimpleOnGest...
method GestureListenerWrapper (line 20) | public GestureListenerWrapper() {
method setListener (line 24) | public void setListener(GestureDetector.SimpleOnGestureListener listen...
method onLongPress (line 28) | @Override
method onScroll (line 33) | @Override
method onFling (line 38) | @Override
method onShowPress (line 43) | @Override
method onDown (line 48) | @Override
method onDoubleTap (line 53) | @Override
method onDoubleTapEvent (line 58) | @Override
method onSingleTapConfirmed (line 63) | @Override
method onSingleTapUp (line 68) | @Override
FILE: app/src/main/java/awais/instagrabber/customviews/drawee/MultiGestureListener.java
class MultiGestureListener (line 25) | public class MultiGestureListener extends GestureDetector.SimpleOnGestur...
method addListener (line 36) | public synchronized void addListener(GestureDetector.SimpleOnGestureLi...
method removeListener (line 47) | public synchronized void removeListener(GestureDetector.SimpleOnGestur...
method onSingleTapUp (line 51) | @Override
method onLongPress (line 62) | @Override
method onScroll (line 70) | @Override
method onFling (line 82) | @Override
method onShowPress (line 94) | @Override
method onDown (line 102) | @Override
method onDoubleTap (line 113) | @Override
method onDoubleTapEvent (line 124) | @Override
method onSingleTapConfirmed (line 135) | @Override
method onContextClick (line 146) | @Override
FILE: app/src/main/java/awais/instagrabber/customviews/drawee/MultiPointerGestureDetector.java
class MultiPointerGestureDetector (line 19) | public class MultiPointerGestureDetector {
type Listener (line 24) | public interface Listener {
method onGestureBegin (line 28) | public void onGestureBegin(MultiPointerGestureDetector detector);
method onGestureUpdate (line 33) | public void onGestureUpdate(MultiPointerGestureDetector detector);
method onGestureEnd (line 38) | public void onGestureEnd(MultiPointerGestureDetector detector);
method MultiPointerGestureDetector (line 54) | public MultiPointerGestureDetector() {
method newInstance (line 61) | public static MultiPointerGestureDetector newInstance() {
method setListener (line 70) | public void setListener(Listener listener) {
method reset (line 77) | public void reset() {
method shouldStartGesture (line 90) | protected boolean shouldStartGesture() {
method startGesture (line 97) | private void startGesture() {
method stopGesture (line 109) | private void stopGesture() {
method getPressedPointerIndex (line 124) | private int getPressedPointerIndex(MotionEvent event, int i) {
method getPressedPointerCount (line 139) | private static int getPressedPointerCount(MotionEvent event) {
method updatePointersOnTap (line 148) | private void updatePointersOnTap(MotionEvent event) {
method updatePointersOnMove (line 163) | private void updatePointersOnMove(MotionEvent event) {
method onTouchEvent (line 179) | public boolean onTouchEvent(final MotionEvent event) {
method restartGesture (line 222) | public void restartGesture() {
method isGestureInProgress (line 237) | public boolean isGestureInProgress() {
method getNewPointerCount (line 244) | public int getNewPointerCount() {
method getPointerCount (line 251) | public int getPointerCount() {
method getStartX (line 259) | public float[] getStartX() {
method getStartY (line 267) | public float[] getStartY() {
method getCurrentX (line 275) | public float[] getCurrentX() {
method getCurrentY (line 283) | public float[] getCurrentY() {
FILE: app/src/main/java/awais/instagrabber/customviews/drawee/MultiZoomableControllerListener.java
class MultiZoomableControllerListener (line 19) | public class MultiZoomableControllerListener implements ZoomableControll...
method onTransformBegin (line 23) | @Override
method onTransformChanged (line 30) | @Override
method onTransformEnd (line 37) | @Override
method onTranslationLimited (line 44) | @Override
method addListener (line 51) | public synchronized void addListener(ZoomableController.Listener liste...
method removeListener (line 55) | public synchronized void removeListener(ZoomableController.Listener li...
FILE: app/src/main/java/awais/instagrabber/customviews/drawee/TransformGestureDetector.java
class TransformGestureDetector (line 19) | public class TransformGestureDetector implements MultiPointerGestureDete...
type Listener (line 24) | public interface Listener {
method onGestureBegin (line 28) | public void onGestureBegin(TransformGestureDetector detector);
method onGestureUpdate (line 33) | public void onGestureUpdate(TransformGestureDetector detector);
method onGestureEnd (line 38) | public void onGestureEnd(TransformGestureDetector detector);
method TransformGestureDetector (line 45) | public TransformGestureDetector(MultiPointerGestureDetector multiPoint...
method newInstance (line 53) | public static TransformGestureDetector newInstance() {
method setListener (line 62) | public void setListener(Listener listener) {
method reset (line 69) | public void reset() {
method onTouchEvent (line 79) | public boolean onTouchEvent(final MotionEvent event) {
method onGestureBegin (line 83) | @Override
method onGestureUpdate (line 90) | @Override
method onGestureEnd (line 97) | @Override
method calcAverage (line 104) | private float calcAverage(float[] arr, int len) {
method restartGesture (line 115) | public void restartGesture() {
method isGestureInProgress (line 122) | public boolean isGestureInProgress() {
method getNewPointerCount (line 129) | public int getNewPointerCount() {
method getPointerCount (line 136) | public int getPointerCount() {
method getPivotX (line 143) | public float getPivotX() {
method getPivotY (line 150) | public float getPivotY() {
method getTranslationX (line 157) | public float getTranslationX() {
method getTranslationY (line 165) | public float getTranslationY() {
method getScale (line 173) | public float getScale() {
method getRotation (line 190) | public float getRotation() {
FILE: app/src/main/java/awais/instagrabber/customviews/drawee/ZoomableController.java
type ZoomableController (line 18) | public interface ZoomableController {
type Listener (line 23) | interface Listener {
method onTransformBegin (line 30) | void onTransformBegin(Matrix transform);
method onTransformChanged (line 37) | void onTransformChanged(Matrix transform);
method onTransformEnd (line 44) | void onTransformEnd(Matrix transform);
method onTranslationLimited (line 46) | void onTranslationLimited(float offsetLeft, float offsetTop);
method setEnabled (line 54) | void setEnabled(boolean enabled);
method isEnabled (line 62) | boolean isEnabled();
method setListener (line 69) | void setListener(Listener listener);
method getScaleFactor (line 77) | float getScaleFactor();
method isIdentity (line 82) | boolean isIdentity();
method wasTransformCorrected (line 90) | boolean wasTransformCorrected();
method computeHorizontalScrollRange (line 95) | int computeHorizontalScrollRange();
method computeHorizontalScrollOffset (line 97) | int computeHorizontalScrollOffset();
method computeHorizontalScrollExtent (line 99) | int computeHorizontalScrollExtent();
method computeVerticalScrollRange (line 101) | int computeVerticalScrollRange();
method computeVerticalScrollOffset (line 103) | int computeVerticalScrollOffset();
method computeVerticalScrollExtent (line 105) | int computeVerticalScrollExtent();
method getTransform (line 112) | Matrix getTransform();
method setImageBounds (line 120) | void setImageBounds(RectF imageBounds);
method setViewBounds (line 127) | void setViewBounds(RectF viewBounds);
method onTouchEvent (line 135) | boolean onTouchEvent(MotionEvent event);
FILE: app/src/main/java/awais/instagrabber/customviews/drawee/ZoomableDraweeView.java
class ZoomableDraweeView (line 42) | public class ZoomableDraweeView extends DraweeView<GenericDraweeHierarchy>
method onFinalImageSet (line 62) | @Override
method onRelease (line 68) | @Override
method onTransformBegin (line 76) | @Override
method onTransformChanged (line 81) | @Override
method onTransformEnd (line 86) | @Override
method onTranslationLimited (line 91) | @Override
method ZoomableDraweeView (line 99) | public ZoomableDraweeView(Context context, GenericDraweeHierarchy hier...
method ZoomableDraweeView (line 105) | public ZoomableDraweeView(Context context) {
method ZoomableDraweeView (line 111) | public ZoomableDraweeView(Context context, AttributeSet attrs) {
method ZoomableDraweeView (line 117) | public ZoomableDraweeView(Context context, AttributeSet attrs, int def...
method inflateHierarchy (line 123) | protected void inflateHierarchy(Context context, @Nullable AttributeSe...
method init (line 133) | private void init() {
method setIsDialtoneEnabled (line 139) | public void setIsDialtoneEnabled(boolean isDialtoneEnabled) {
method getImageBounds (line 156) | protected void getImageBounds(RectF outBounds) {
method getLimitBounds (line 170) | protected void getLimitBounds(RectF outBounds) {
method setZoomableController (line 177) | public void setZoomableController(ZoomableController zoomableControlle...
method getZoomableController (line 190) | public ZoomableController getZoomableController() {
method allowsTouchInterceptionWhileZoomed (line 200) | public boolean allowsTouchInterceptionWhileZoomed() {
method setAllowTouchInterceptionWhileZoomed (line 210) | public void setAllowTouchInterceptionWhileZoomed(boolean allowTouchInt...
method setTapListener (line 217) | public void setTapListener(GestureDetector.SimpleOnGestureListener tap...
method setIsLongpressEnabled (line 225) | public void setIsLongpressEnabled(boolean enabled) {
method setZoomingEnabled (line 229) | public void setZoomingEnabled(boolean zoomingEnabled) {
method setController (line 237) | @Override
method setControllers (line 253) | public void setControllers(
method setControllersInternal (line 260) | private void setControllersInternal(
method maybeSetHugeImageController (line 268) | private void maybeSetHugeImageController() {
method removeControllerListener (line 275) | private void removeControllerListener(DraweeController controller) {
method addControllerListener (line 281) | private void addControllerListener(DraweeController controller) {
method onDraw (line 287) | @Override
method onTouchEvent (line 307) | @Override
method computeHorizontalScrollRange (line 348) | @Override
method computeHorizontalScrollOffset (line 353) | @Override
method computeHorizontalScrollExtent (line 358) | @Override
method computeVerticalScrollRange (line 363) | @Override
method computeVerticalScrollOffset (line 368) | @Override
method computeVerticalScrollExtent (line 373) | @Override
method onLayout (line 378) | @Override
method onFinalImageSet (line 385) | private void onFinalImageSet() {
method onRelease (line 393) | private void onRelease() {
method onTransformBegin (line 398) | protected void onTransformBegin(final Matrix transform) {}
method onTransformChanged (line 400) | protected void onTransformChanged(Matrix transform) {
method onTransformEnd (line 406) | protected void onTransformEnd(final Matrix transform) {}
method onTranslationLimited (line 408) | protected void onTranslationLimited(final float offsetLeft, final floa...
method updateZoomableControllerBounds (line 410) | protected void updateZoomableControllerBounds() {
method getLogTag (line 423) | protected Class<?> getLogTag() {
method createZoomableController (line 427) | protected ZoomableController createZoomableController() {
FILE: app/src/main/java/awais/instagrabber/customviews/emoji/Emoji.java
class Emoji (line 8) | public class Emoji {
method Emoji (line 14) | public Emoji(final String unicode,
method getUnicode (line 22) | public String getUnicode() {
method addVariant (line 26) | public void addVariant(final Emoji emoji) {
method getName (line 30) | public String getName() {
method getVariants (line 34) | public List<Emoji> getVariants() {
method getDrawable (line 38) | public GoogleCompatEmojiDrawable getDrawable() {
method equals (line 45) | @Override
method hashCode (line 53) | @Override
method toString (line 58) | @NonNull
FILE: app/src/main/java/awais/instagrabber/customviews/emoji/EmojiBottomSheetDialog.java
class EmojiBottomSheetDialog (line 25) | public class EmojiBottomSheetDialog extends BottomSheetDialogFragment {
method newInstance (line 31) | @NonNull
method onCreate (line 38) | @Override
method onCreateView (line 44) | @Nullable
method onViewCreated (line 53) | @Override
method onStart (line 58) | @Override
method onAttach (line 70) | @Override
method onDestroyView (line 79) | @Override
method init (line 85) | private void init() {
FILE: app/src/main/java/awais/instagrabber/customviews/emoji/EmojiCategory.java
class EmojiCategory (line 11) | public class EmojiCategory {
method EmojiCategory (line 17) | public EmojiCategory(final EmojiCategoryType type, final Map<String, E...
method getType (line 22) | public EmojiCategoryType getType() {
method getEmojis (line 26) | public Map<String, Emoji> getEmojis() {
method getDrawableRes (line 30) | public int getDrawableRes() {
method equals (line 65) | @Override
method hashCode (line 73) | @Override
method toString (line 78) | @NonNull
FILE: app/src/main/java/awais/instagrabber/customviews/emoji/EmojiCategoryPageViewHolder.java
class EmojiCategoryPageViewHolder (line 11) | public class EmojiCategoryPageViewHolder extends RecyclerView.ViewHolder {
method EmojiCategoryPageViewHolder (line 18) | public EmojiCategoryPageViewHolder(@NonNull final View rootView,
method bind (line 26) | public void bind(final EmojiCategory emojiCategory) {
FILE: app/src/main/java/awais/instagrabber/customviews/emoji/EmojiCategoryType.java
type EmojiCategoryType (line 6) | public enum EmojiCategoryType {
method EmojiCategoryType (line 28) | EmojiCategoryType(final String name) {
method valueOfName (line 32) | public static EmojiCategoryType valueOfName(final String name) {
method getName (line 40) | public String getName() {
FILE: app/src/main/java/awais/instagrabber/customviews/emoji/EmojiGridAdapter.java
class EmojiGridAdapter (line 25) | public class EmojiGridAdapter extends RecyclerView.Adapter<EmojiGridAdap...
method areItemsTheSame (line 29) | @Override
method areContentsTheSame (line 34) | @Override
method EmojiGridAdapter (line 46) | public EmojiGridAdapter(@NonNull final EmojiParser emojiParser,
method onCreateViewHolder (line 71) | @NonNull
method onBindViewHolder (line 79) | @Override
method getItemId (line 97) | @Override
method getItemViewType (line 102) | @Override
method getItemCount (line 107) | @Override
class EmojiViewHolder (line 112) | public static class EmojiViewHolder extends RecyclerView.ViewHolder {
method EmojiViewHolder (line 118) | public EmojiViewHolder(@NonNull final ItemEmojiGridBinding binding,
method bind (line 127) | public void bind(final int position, final Emoji emoji, final Emoji ...
type OnEmojiLongClickListener (line 145) | public interface OnEmojiLongClickListener {
method onLongClick (line 146) | boolean onLongClick(int position, View view, Emoji emoji);
FILE: app/src/main/java/awais/instagrabber/customviews/emoji/EmojiPicker.java
class EmojiPicker (line 30) | public class EmojiPicker extends LinearLayout {
method EmojiPicker (line 33) | public EmojiPicker(final Context context) {
method EmojiPicker (line 38) | public EmojiPicker(final Context context, @Nullable final AttributeSet...
method EmojiPicker (line 43) | public EmojiPicker(final Context context, @Nullable final AttributeSet...
method setup (line 48) | private void setup() {
method init (line 53) | public void init(@NonNull final View rootView,
method getImageView (line 104) | @NonNull
type OnEmojiClickListener (line 113) | public interface OnEmojiClickListener {
method onClick (line 114) | void onClick(View view, Emoji emoji);
type OnBackspaceClickListener (line 117) | public interface OnBackspaceClickListener {
method onClick (line 118) | void onClick();
FILE: app/src/main/java/awais/instagrabber/customviews/emoji/EmojiPickerPageAdapter.java
class EmojiPickerPageAdapter (line 22) | public class EmojiPickerPageAdapter extends RecyclerView.Adapter<EmojiCa...
method areItemsTheSame (line 25) | @Override
method areContentsTheSame (line 30) | @Override
method EmojiPickerPageAdapter (line 40) | public EmojiPickerPageAdapter(@NonNull final View rootView,
method onCreateViewHolder (line 51) | @NonNull
method onBindViewHolder (line 64) | @Override
method getItemId (line 70) | @Override
method getItemCount (line 75) | @Override
FILE: app/src/main/java/awais/instagrabber/customviews/emoji/EmojiVariantManager.java
class EmojiVariantManager (line 20) | public class EmojiVariantManager {
method getInstance (line 29) | public static EmojiVariantManager getInstance() {
method EmojiVariantManager (line 40) | private EmojiVariantManager() {
method getVariant (line 52) | @Nullable
method setVariant (line 57) | public void setVariant(final String parent, final String variant) {
FILE: app/src/main/java/awais/instagrabber/customviews/emoji/EmojiVariantPopup.java
class EmojiVariantPopup (line 44) | public final class EmojiVariantPopup {
method EmojiVariantPopup (line 55) | public EmojiVariantPopup(@NonNull final View rootView,
method show (line 63) | public void show(@NonNull final View view, @NonNull final Emoji emoji) {
method dismiss (line 89) | public void dismiss() {
method initView (line 98) | private View initView(@NonNull final Context context, @NonNull final E...
method locationOnScreen (line 124) | @NonNull
method fixPopupLocation (line 131) | private void fixPopupLocation(@NonNull final PopupWindow popupWindow, ...
FILE: app/src/main/java/awais/instagrabber/customviews/emoji/GoogleCompatEmojiDrawable.java
class GoogleCompatEmojiDrawable (line 36) | final class GoogleCompatEmojiDrawable extends Drawable {
method GoogleCompatEmojiDrawable (line 46) | GoogleCompatEmojiDrawable(@NonNull final String unicode) {
method process (line 53) | private void process() {
method draw (line 63) | @Override
method setAlpha (line 83) | @Override
method setColorFilter (line 88) | @Override
method getOpacity (line 93) | @Override
FILE: app/src/main/java/awais/instagrabber/customviews/emoji/ReactionsManager.java
class ReactionsManager (line 23) | public class ReactionsManager {
method getInstance (line 32) | public static ReactionsManager getInstance(@NonNull final Context cont...
method ReactionsManager (line 43) | private ReactionsManager(@NonNull final Context context) {
method getReactions (line 65) | public List<Emoji> getReactions() {
FILE: app/src/main/java/awais/instagrabber/customviews/helpers/ChangeText.java
class ChangeText (line 46) | public class ChangeText extends Transition {
method setChangeBehavior (line 108) | public ChangeText setChangeBehavior(int changeBehavior) {
method setCrossFade (line 115) | public ChangeText setCrossFade(final boolean crossFade) {
method getTransitionProperties (line 120) | @Override
method getChangeBehavior (line 131) | public int getChangeBehavior() {
method captureValues (line 135) | private void captureValues(TransitionValues transitionValues) {
method captureStartValues (line 151) | @Override
method captureEndValues (line 156) | @Override
method createAnimator (line 161) | @Override
method setSelection (line 315) | private void setSelection(EditText editText, int start, int end) {
FILE: app/src/main/java/awais/instagrabber/customviews/helpers/ControlFocusInsetsAnimationCallback.java
class ControlFocusInsetsAnimationCallback (line 36) | public class ControlFocusInsetsAnimationCallback extends WindowInsetsAni...
method ControlFocusInsetsAnimationCallback (line 40) | public ControlFocusInsetsAnimationCallback(@NonNull final View view) {
method ControlFocusInsetsAnimationCallback (line 49) | public ControlFocusInsetsAnimationCallback(@NonNull final View view, f...
method onProgress (line 54) | @NonNull
method onEnd (line 62) | @Override
method checkFocus (line 72) | private void checkFocus() {
FILE: app/src/main/java/awais/instagrabber/customviews/helpers/CustomHideBottomViewOnScrollBehavior.java
class CustomHideBottomViewOnScrollBehavior (line 14) | public class CustomHideBottomViewOnScrollBehavior extends HideBottomView...
method CustomHideBottomViewOnScrollBehavior (line 17) | public CustomHideBottomViewOnScrollBehavior() {
method CustomHideBottomViewOnScrollBehavior (line 20) | public CustomHideBottomViewOnScrollBehavior(final Context context, fin...
method onStartNestedScroll (line 24) | @Override
method onNestedPreScroll (line 34) | @Override
FILE: app/src/main/java/awais/instagrabber/customviews/helpers/EmojiPickerInsetsAnimationCallback.java
class EmojiPickerInsetsAnimationCallback (line 17) | public class EmojiPickerInsetsAnimationCallback extends WindowInsetsAnim...
method EmojiPickerInsetsAnimationCallback (line 28) | public EmojiPickerInsetsAnimationCallback(final View view,
method EmojiPickerInsetsAnimationCallback (line 34) | public EmojiPickerInsetsAnimationCallback(final View view,
method onProgress (line 48) | @NonNull
method onEnd (line 72) | @Override
method setShouldTranslate (line 106) | public void setShouldTranslate(final boolean shouldTranslate) {
method setKbVisibilityListener (line 110) | public void setKbVisibilityListener(final onKbVisibilityChangeListener...
type onKbVisibilityChangeListener (line 114) | public interface onKbVisibilityChangeListener {
method onChange (line 115) | void onChange(boolean isVisible);
FILE: app/src/main/java/awais/instagrabber/customviews/helpers/GridAutofitLayoutManager.java
class GridAutofitLayoutManager (line 10) | public class GridAutofitLayoutManager extends GridLayoutManager {
method GridAutofitLayoutManager (line 14) | public GridAutofitLayoutManager(Context context, int columnWidth) {
method onLayoutChildren (line 23) | @Override
FILE: app/src/main/java/awais/instagrabber/customviews/helpers/GridSpacingItemDecoration.java
class GridSpacingItemDecoration (line 9) | public class GridSpacingItemDecoration extends RecyclerView.ItemDecorati...
method GridSpacingItemDecoration (line 14) | public GridSpacingItemDecoration(int spacing) {
method getItemOffsets (line 18) | @Override
method setHasHeader (line 36) | public void setHasHeader(final boolean hasHeader) {
FILE: app/src/main/java/awais/instagrabber/customviews/helpers/HeaderItemDecoration.java
class HeaderItemDecoration (line 19) | public class HeaderItemDecoration extends RecyclerView.ItemDecoration {
method HeaderItemDecoration (line 27) | public HeaderItemDecoration(@NonNull RecyclerView parent,
method onDrawOver (line 65) | @Override
method drawHeader (line 92) | private void drawHeader(@NonNull final Canvas c, @NonNull final View h...
method moveHeader (line 99) | private void moveHeader(@NonNull final Canvas c, @NonNull final View c...
method getChildInContact (line 106) | @Nullable
method getHeaderViewForItem (line 125) | @Nullable
method getHeaderPositionForItem (line 151) | @SuppressWarnings("rawtypes")
method fixLayoutSize (line 170) | private void fixLayoutSize(@NonNull final ViewGroup parent, @NonNull f...
method getCurrentHeader (line 192) | public View getCurrentHeader() {
type HeaderItemDecorationCallback (line 196) | public interface HeaderItemDecorationCallback {
method isHeader (line 197) | boolean isHeader(int itemPosition);
FILE: app/src/main/java/awais/instagrabber/customviews/helpers/HeightProvider.java
class HeightProvider (line 12) | public class HeightProvider extends PopupWindow implements OnGlobalLayou...
method HeightProvider (line 18) | public HeightProvider(Activity activity) {
method init (line 35) | public HeightProvider init() {
method setHeightListener (line 43) | public HeightProvider setHeightListener(HeightListener listener) {
method onGlobalLayout (line 48) | @Override
type HeightListener (line 62) | public interface HeightListener {
method onHeightChanged (line 63) | void onHeightChanged(int height);
FILE: app/src/main/java/awais/instagrabber/customviews/helpers/ImageResizingControllerListener.java
class ImageResizingControllerListener (line 13) | public class ImageResizingControllerListener<T extends DraweeView<Generi...
method ImageResizingControllerListener (line 19) | public ImageResizingControllerListener(final T imageView, final int re...
method onIntermediateImageSet (line 24) | @Override
method onFinalImageSet (line 29) | public void onFinalImageSet(String id, ImageInfo imageInfo, Animatable...
FILE: app/src/main/java/awais/instagrabber/customviews/helpers/NestedCoordinatorLayout.java
class NestedCoordinatorLayout (line 11) | public class NestedCoordinatorLayout extends CoordinatorLayout implement...
method NestedCoordinatorLayout (line 15) | public NestedCoordinatorLayout(Context context) {
method NestedCoordinatorLayout (line 21) | public NestedCoordinatorLayout(Context context, AttributeSet attrs) {
method NestedCoordinatorLayout (line 27) | public NestedCoordinatorLayout(Context context, AttributeSet attrs, in...
method onNestedPreScroll (line 33) | @Override
method onNestedScroll (line 42) | @Override
method onStopNestedScroll (line 48) | @Override
method onStartNestedScroll (line 56) | @Override
method onStartNestedScroll (line 64) | @Override
method onStopNestedScroll (line 72) | @Override
method onNestedPreScroll (line 80) | @Override
method onNestedScroll (line 89) | @Override
method onNestedPreFling (line 96) | @Override
method onNestedFling (line 102) | @Override
method isNestedScrollingEnabled (line 108) | @Override
method setNestedScrollingEnabled (line 113) | @Override
method startNestedScroll (line 118) | @Override
method stopNestedScroll (line 123) | @Override
method hasNestedScrollingParent (line 128) | @Override
method dispatchNestedScroll (line 133) | @Override
method dispatchNestedPreScroll (line 140) | @Override
method dispatchNestedFling (line 145) | @Override
method dispatchNestedPreFling (line 150) | @Override
FILE: app/src/main/java/awais/instagrabber/customviews/helpers/NestedScrollableHost.java
class NestedScrollableHost (line 16) | public class NestedScrollableHost extends FrameLayout {
method NestedScrollableHost (line 22) | public NestedScrollableHost(@NonNull final Context context) {
method NestedScrollableHost (line 26) | public NestedScrollableHost(@NonNull final Context context, @Nullable ...
method onInterceptTouchEvent (line 31) | @Override
method handleInterceptTouchEvent (line 37) | private void handleInterceptTouchEvent(final MotionEvent e) {
method canChildScroll (line 74) | private boolean canChildScroll(final int orientation, final float delt...
method getParentViewPager (line 101) | public ViewPager2 getParentViewPager() {
method getChild (line 109) | public View getChild() {
FILE: app/src/main/java/awais/instagrabber/customviews/helpers/PostFetcher.java
class PostFetcher (line 10) | public class PostFetcher {
method PostFetcher (line 17) | public PostFetcher(final PostFetchService postFetchService,
method fetch (line 23) | public void fetch() {
method reset (line 40) | public void reset() {
method isFetching (line 44) | public boolean isFetching() {
method hasMore (line 48) | public boolean hasMore() {
type PostFetchService (line 52) | public interface PostFetchService {
method fetch (line 53) | void fetch(FetchListener<List<Media>> fetchListener);
method reset (line 55) | void reset();
method hasNextPage (line 57) | boolean hasNextPage();
FILE: app/src/main/java/awais/instagrabber/customviews/helpers/RecordViewAnimationHelper.java
class RecordViewAnimationHelper (line 26) | public class RecordViewAnimationHelper {
method RecordViewAnimationHelper (line 42) | public RecordViewAnimationHelper(Context context, AppCompatImageView b...
method animateBasket (line 49) | @SuppressLint("RestrictedApi")
method resetBasketAnimation (line 120) | public void resetBasketAnimation() {
method clearAlphaAnimation (line 143) | public void clearAlphaAnimation(boolean hideView) {
method animateSmallMicAlpha (line 154) | public void animateSmallMicAlpha() {
method moveRecordButtonAndSlideToCancelBack (line 162) | public void moveRecordButtonAndSlideToCancelBack(final RecordButton re...
method resetSmallMic (line 183) | public void resetSmallMic() {
method setOnBasketAnimationEndListener (line 189) | public void setOnBasketAnimationEndListener(OnBasketAnimationEnd onBas...
method onAnimationEnd (line 194) | public void onAnimationEnd() {
method setStartRecorded (line 201) | public void setStartRecorded(boolean startRecorded) {
FILE: app/src/main/java/awais/instagrabber/customviews/helpers/RecyclerLazyLoader.java
class RecyclerLazyLoader (line 16) | public final class RecyclerLazyLoader extends RecyclerView.OnScrollListe...
method RecyclerLazyLoader (line 36) | public RecyclerLazyLoader(@NonNull final RecyclerView.LayoutManager la...
method RecyclerLazyLoader (line 56) | public RecyclerLazyLoader(@NonNull final RecyclerView.LayoutManager la...
method onScrolled (line 61) | @Override
method getCurrentPage (line 103) | public int getCurrentPage() {
method resetState (line 107) | public void resetState() {
FILE: app/src/main/java/awais/instagrabber/customviews/helpers/RecyclerLazyLoaderAtEdge.java
class RecyclerLazyLoaderAtEdge (line 8) | public final class RecyclerLazyLoaderAtEdge extends RecyclerView.OnScrol...
method RecyclerLazyLoaderAtEdge (line 17) | public RecyclerLazyLoaderAtEdge(@NonNull final RecyclerView.LayoutMana...
method RecyclerLazyLoaderAtEdge (line 24) | public RecyclerLazyLoaderAtEdge(@NonNull final RecyclerView.LayoutMana...
method onScrollStateChanged (line 32) | @Override
method getCurrentPage (line 48) | public int getCurrentPage() {
method resetState (line 52) | public void resetState() {
type LazyLoadListener (line 58) | public interface LazyLoadListener {
method onLoadMore (line 59) | void onLoadMore(final int page);
FILE: app/src/main/java/awais/instagrabber/customviews/helpers/RootViewDeferringInsetsCallback.java
class RootViewDeferringInsetsCallback (line 57) | public class RootViewDeferringInsetsCallback extends WindowInsetsAnimati...
method RootViewDeferringInsetsCallback (line 73) | public RootViewDeferringInsetsCallback(final int persistentInsetTypes,...
method onApplyWindowInsets (line 83) | @Override
method onPrepare (line 105) | @Override
method onProgress (line 115) | @NonNull
method onEnd (line 123) | @Override
FILE: app/src/main/java/awais/instagrabber/customviews/helpers/SimpleImeAnimationController.java
class SimpleImeAnimationController (line 44) | public class SimpleImeAnimationController {
method onReady (line 77) | @Override
method onFinished (line 88) | @Override
method onCancelled (line 99) | @Override
method startControlRequest (line 116) | public void startControlRequest(@NonNull final View view,
method startAndFling (line 167) | public void startAndFling(@NonNull final View view, final float veloci...
method insetBy (line 180) | public int insetBy(final int dy) {
method insetTo (line 199) | public int insetTo(final int inset) {
method isInsetAnimationInProgress (line 235) | public boolean isInsetAnimationInProgress() {
method isInsetAnimationFinishing (line 242) | public boolean isInsetAnimationFinishing() {
method isInsetAnimationRequestPending (line 249) | public boolean isInsetAnimationRequestPending() {
method cancel (line 257) | public void cancel() {
method finish (line 274) | public void finish() {
method animateToFinish (line 313) | public void animateToFinish(@Nullable final Float velocityY) {
method onRequestReady (line 349) | private void onRequestReady(@NonNull final WindowInsetsAnimationContro...
method reset (line 365) | private void reset() {
method animateImeToVisibility (line 385) | private void animateImeToVisibility(final boolean visible, @Nullable f...
method coerceIn (line 426) | private int coerceIn(final int v, final int min, final int max) {
method setAnimationControlListener (line 436) | public void setAnimationControlListener(final WindowInsetsAnimationCon...
type OnRequestReadyListener (line 440) | public interface OnRequestReadyListener {
method onRequestReady (line 441) | void onRequestReady(WindowInsetsAnimationControllerCompat windowInse...
FILE: app/src/main/java/awais/instagrabber/customviews/helpers/SwipeAndRestoreItemTouchHelperCallback.java
class SwipeAndRestoreItemTouchHelperCallback (line 24) | public class SwipeAndRestoreItemTouchHelperCallback extends ItemTouchHel...
method SwipeAndRestoreItemTouchHelperCallback (line 41) | public SwipeAndRestoreItemTouchHelperCallback(final Context context, f...
method getMovementFlags (line 57) | @Override
method onMove (line 65) | @Override
method onSwiped (line 72) | @Override
method convertToAbsoluteDirection (line 75) | @Override
method onChildDraw (line 84) | @Override
method setTouchListener (line 99) | @SuppressLint("ClickableViewAccessibility")
type SwipeableViewHolder (line 128) | public interface SwipeableViewHolder {
method getSwipeDirection (line 129) | int getSwipeDirection();
type OnSwipeListener (line 132) | public interface OnSwipeListener {
method onSwipe (line 133) | void onSwipe(final int adapterPosition, final RecyclerView.ViewHolde...
method drawReplyButton (line 136) | private void drawReplyButton(Canvas canvas, final RecyclerView.ViewHol...
FILE: app/src/main/java/awais/instagrabber/customviews/helpers/SwipeGestureListener.java
class SwipeGestureListener (line 9) | public final class SwipeGestureListener extends GestureDetector.SimpleOn...
method SwipeGestureListener (line 14) | public SwipeGestureListener(final SwipeEvent swipeEvent) {
method onFling (line 18) | @Override
FILE: app/src/main/java/awais/instagrabber/customviews/helpers/TextWatcherAdapter.java
class TextWatcherAdapter (line 6) | public class TextWatcherAdapter implements TextWatcher {
method beforeTextChanged (line 7) | @Override
method onTextChanged (line 10) | @Override
method afterTextChanged (line 13) | @Override
FILE: app/src/main/java/awais/instagrabber/customviews/helpers/TranslateDeferringInsetsAnimationCallback.java
class TranslateDeferringInsetsAnimationCallback (line 38) | public class TranslateDeferringInsetsAnimationCallback extends WindowIns...
method TranslateDeferringInsetsAnimationCallback (line 46) | public TranslateDeferringInsetsAnimationCallback(final View view,
method TranslateDeferringInsetsAnimationCallback (line 61) | public TranslateDeferringInsetsAnimationCallback(final View view,
method onProgress (line 75) | @NonNull
method onEnd (line 99) | @Override
method setShouldTranslate (line 125) | public void setShouldTranslate(final boolean shouldTranslate) {
FILE: app/src/main/java/awais/instagrabber/customviews/helpers/VerticalSpaceItemDecoration.java
class VerticalSpaceItemDecoration (line 9) | public class VerticalSpaceItemDecoration extends RecyclerView.ItemDecora...
method VerticalSpaceItemDecoration (line 12) | public VerticalSpaceItemDecoration(int verticalSpaceHeight) {
method getItemOffsets (line 16) | @Override
FILE: app/src/main/java/awais/instagrabber/customviews/helpers/VideoAwareRecyclerScroller.java
class VideoAwareRecyclerScroller (line 20) | public class VideoAwareRecyclerScroller extends RecyclerView.OnScrollLis...
method onScrollStateChanged (line 31) | @Override
method onScrolled (line 42) | @Override
method getFirstVideoHolder (line 193) | private FeedVideoViewHolder getFirstVideoHolder(final RecyclerView rec...
method startPlaying (line 219) | public void startPlaying() {
method stopPlaying (line 226) | public void stopPlaying() {
type VideoChangeCallback (line 331) | public interface VideoChangeCallback {
method playerChanged (line 332) | void playerChanged(final int itemPos, final SimpleExoPlayer player);
FILE: app/src/main/java/awais/instagrabber/customviews/masoudss_waveform/SoundParser.java
class SoundParser (line 21) | final class SoundParser {
method addCustomExtension (line 28) | static void addCustomExtension(final String extension) {
method removeCustomExtension (line 32) | static void removeCustomExtension(final String extension) {
method addCustomExtensions (line 36) | static void addCustomExtensions(final List<String> extensions) {
method removeCustomExtensions (line 40) | static void removeCustomExtensions(final List<String> extensions) {
method isFilenameSupported (line 44) | private static boolean isFilenameSupported(final String filename) {
method create (line 52) | @NonNull
method setProgressListener (line 66) | public void setProgressListener(final ProgressListener progressListene...
method readFile (line 70) | @SuppressWarnings("deprecation")
type ProgressListener (line 249) | private interface ProgressListener {
method reportProgress (line 250) | boolean reportProgress(final double fractionComplete);
FILE: app/src/main/java/awais/instagrabber/customviews/masoudss_waveform/WaveFormProgressChangeListener.java
type WaveFormProgressChangeListener (line 3) | public interface WaveFormProgressChangeListener {
method onProgressChanged (line 4) | void onProgressChanged(final WaveformSeekBar waveformSeekBar, final in...
FILE: app/src/main/java/awais/instagrabber/customviews/masoudss_waveform/WaveGravity.java
type WaveGravity (line 3) | public enum WaveGravity {
FILE: app/src/main/java/awais/instagrabber/customviews/masoudss_waveform/WaveformSeekBar.java
class WaveformSeekBar (line 23) | public final class WaveformSeekBar extends View {
method WaveformSeekBar (line 44) | public WaveformSeekBar(final Context context) {
method WaveformSeekBar (line 48) | public WaveformSeekBar(final Context context, @Nullable final Attribut...
method WaveformSeekBar (line 52) | public WaveformSeekBar(final Context context, @Nullable final Attribut...
method getSampleMax (line 71) | private float getSampleMax() {
method onDraw (line 81) | @Override
method onTouchEvent (line 146) | @Override
method onLayout (line 171) | @Override
method calculateWaveDimensions (line 179) | private void calculateWaveDimensions() {
method performClick (line 193) | @Override
method isParentScrolling (line 199) | private boolean isParentScrolling() {
method updateProgress (line 214) | private void updateProgress(@NonNull final MotionEvent event) {
method getAvailableWidth (line 222) | private int getAvailableWidth() {
method getAvailableHeight (line 226) | private int getAvailableHeight() {
method setProgress (line 230) | public void setProgress(final int progress) {
method setProgressChangeListener (line 235) | public void setProgressChangeListener(final WaveFormProgressChangeList...
method setSample (line 239) | public void setSample(final float[] sample) {
FILE: app/src/main/java/awais/instagrabber/dialogs/AccountSwitcherDialogFragment.java
class AccountSwitcherDialogFragment (line 38) | public class AccountSwitcherDialogFragment extends DialogFragment {
method AccountSwitcherDialogFragment (line 46) | public AccountSwitcherDialogFragment() {}
method AccountSwitcherDialogFragment (line 48) | public AccountSwitcherDialogFragment(final OnAddAccountClickListener o...
method onCreateView (line 99) | @Override
method onViewCreated (line 108) | @Override
method onAttach (line 114) | @Override
method onStart (line 120) | @Override
method init (line 132) | private void init() {
method sortUserList (line 167) | private void sortUserList(final String cookie, final List<Account> all...
type OnAddAccountClickListener (line 188) | public interface OnAddAccountClickListener {
method onAddAccountClick (line 189) | void onAddAccountClick(final AccountSwitcherDialogFragment dialogFra...
FILE: app/src/main/java/awais/instagrabber/dialogs/ConfirmDialogFragment.java
class ConfirmDialogFragment (line 20) | public class ConfirmDialogFragment extends DialogFragment {
method newInstance (line 27) | @NonNull
method newInstance (line 37) | @NonNull
method newInstance (line 47) | @NonNull
method ConfirmDialogFragment (line 80) | public ConfirmDialogFragment() {}
method onAttach (line 82) | @Override
method onCreateDialog (line 97) | @NonNull
method onStart (line 149) | @Override
type ConfirmDialogFragmentCallback (line 158) | public interface ConfirmDialogFragmentCallback {
method onPositiveButtonClicked (line 159) | void onPositiveButtonClicked(int requestCode);
method onNegativeButtonClicked (line 161) | void onNegativeButtonClicked(int requestCode);
method onNeutralButtonClicked (line 163) | void onNeutralButtonClicked(int requestCode);
FILE: app/src/main/java/awais/instagrabber/dialogs/CreateBackupDialogFragment.java
class CreateBackupDialogFragment (line 33) | public class CreateBackupDialogFragment extends DialogFragment {
method CreateBackupDialogFragment (line 43) | public CreateBackupDialogFragment(final OnResultListener onResultListe...
method onCreateView (line 47) | @Override
method onCreateDialog (line 55) | @NonNull
method onStart (line 63) | @Override
method onViewCreated (line 75) | @Override
method init (line 81) | private void init() {
method onActivityResult (line 121) | @Override
method createFile (line 151) | private void createFile() {
type OnResultListener (line 168) | public interface OnResultListener {
method onResult (line 169) | void onResult(boolean result);
FILE: app/src/main/java/awais/instagrabber/dialogs/DirectItemReactionDialogFragment.java
class DirectItemReactionDialogFragment (line 30) | public class DirectItemReactionDialogFragment extends BottomSheetDialogF...
method newInstance (line 40) | public static DirectItemReactionDialogFragment newInstance(final long ...
method DirectItemReactionDialogFragment (line 54) | public DirectItemReactionDialogFragment() {}
method onCreate (line 56) | @Override
method onCreateView (line 62) | @Nullable
method onViewCreated (line 74) | @Override
method onAttach (line 79) | @Override
method onStart (line 89) | @Override
method init (line 101) | private void init() {
FILE: app/src/main/java/awais/instagrabber/dialogs/EditTextDialogFragment.java
class EditTextDialogFragment (line 21) | public class EditTextDialogFragment extends DialogFragment {
method newInstance (line 29) | public static EditTextDialogFragment newInstance(@StringRes final int ...
method EditTextDialogFragment (line 43) | public EditTextDialogFragment() {
method onAttach (line 48) | @Override
method onCreateDialog (line 59) | @NonNull
type EditTextDialogFragmentCallback (line 104) | public interface EditTextDialogFragmentCallback {
method onPositiveButtonClicked (line 105) | void onPositiveButtonClicked(String text);
method onNegativeButtonClicked (line 107) | void onNegativeButtonClicked();
FILE: app/src/main/java/awais/instagrabber/dialogs/GifPickerBottomDialogFragment.java
class GifPickerBottomDialogFragment (line 31) | public class GifPickerBottomDialogFragment extends BottomSheetDialogFrag...
method newInstance (line 42) | public static GifPickerBottomDialogFragment newInstance() {
method onCreate (line 49) | @Override
method onCreateView (line 72) | @Nullable
method onViewCreated (line 80) | @Override
method onStart (line 85) | @Override
method init (line 97) | private void init() {
method setupList (line 103) | private void setupList() {
method setupInput (line 115) | private void setupInput() {
method setupObservers (line 124) | private void setupObservers() {
method setOnSelectListener (line 146) | public void setOnSelectListener(final OnSelectListener onSelectListene...
type OnSelectListener (line 150) | public interface OnSelectListener {
method onSelect (line 151) | void onSelect(GiphyGif giphyGif);
FILE: app/src/main/java/awais/instagrabber/dialogs/KeywordsFilterDialog.java
class KeywordsFilterDialog (line 29) | public final class KeywordsFilterDialog extends DialogFragment {
method onStart (line 31) | @Override
method onCreateView (line 43) | @Override
method init (line 51) | private void init(DialogKeywordsFilterBinding dialogKeywordsFilterBind...
FILE: app/src/main/java/awais/instagrabber/dialogs/MultiOptionDialogFragment.java
class MultiOptionDialogFragment (line 25) | public class MultiOptionDialogFragment<T extends Serializable> extends D...
type Type (line 28) | public enum Type {
method newInstance (line 40) | @NonNull
method newInstance (line 47) | @NonNull
method onAttach (line 66) | @SuppressWarnings({"rawtypes", "unchecked"})
method onCreateDialog (line 90) | @NonNull
method setCallback (line 208) | public void setCallback(final MultiOptionDialogCallback<T> callback) {
method setSingleCallback (line 213) | public void setSingleCallback(final MultiOptionDialogSingleCallback<T>...
type MultiOptionDialogCallback (line 218) | public interface MultiOptionDialogCallback<T> {
method onSelect (line 219) | void onSelect(int requestCode, T result);
method onMultipleSelect (line 221) | void onMultipleSelect(int requestCode, List<T> result);
method onCheckChange (line 223) | void onCheckChange(int requestCode, T item, boolean isChecked);
method onCancel (line 225) | void onCancel(int requestCode);
type MultiOptionDialogSingleCallback (line 228) | public interface MultiOptionDialogSingleCallback<T> {
method onSelect (line 229) | void onSelect(int requestCode, T result);
method onCancel (line 231) | void onCancel(int requestCode);
class Option (line 234) | public static class Option<T extends Serializable> {
method Option (line 239) | public Option(final String label, final T value) {
method Option (line 245) | public Option(final String label, final T value, final boolean check...
method getLabel (line 251) | public String getLabel() {
method getValue (line 255) | public T getValue() {
method isChecked (line 259) | public boolean isChecked() {
FILE: app/src/main/java/awais/instagrabber/dialogs/ProfilePicDialogFragment.java
class ProfilePicDialogFragment (line 44) | public class ProfilePicDialogFragment extends DialogFragment {
method getInstance (line 55) | public static ProfilePicDialogFragment getInstance(final long id, fina...
method ProfilePicDialogFragment (line 65) | public ProfilePicDialogFragment() {}
method onCreateView (line 67) | @Override
method onCreateDialog (line 77) | @NonNull
method onStart (line 85) | @Override
method onViewCreated (line 98) | @Override
method init (line 105) | private void init() {
method onRequestPermissionsResult (line 125) | @Override
method fetchAvatar (line 133) | private void fetchAvatar() {
method setupPhoto (line 161) | private void setupPhoto(final String result) {
method downloadProfilePicture (line 196) | private void downloadProfilePicture() {
FILE: app/src/main/java/awais/instagrabber/dialogs/RestoreBackupDialogFragment.java
class RestoreBackupDialogFragment (line 35) | public class RestoreBackupDialogFragment extends DialogFragment {
method RestoreBackupDialogFragment (line 46) | public RestoreBackupDialogFragment() {}
method RestoreBackupDialogFragment (line 48) | public RestoreBackupDialogFragment(final OnResultListener onResultList...
method onCreateView (line 52) | @Override
method onCreateDialog (line 60) | @NonNull
method onStart (line 68) | @Override
method onViewCreated (line 80) | @Override
method onRequestPermissionsResult (line 86) | @Override
method onActivityResult (line 91) | @Override
method init (line 136) | private void init() {
type OnResultListener (line 190) | public interface OnResultListener {
method onResult (line 191) | void onResult(boolean result);
FILE: app/src/main/java/awais/instagrabber/dialogs/TabOrderPreferenceDialogFragment.java
class TabOrderPreferenceDialogFragment (line 38) | public class TabOrderPreferenceDialogFragment extends DialogFragment {
method onStartDrag (line 48) | @Override
method onOrderChange (line 54) | @Override
method onAdd (line 61) | @Override
method onRemove (line 80) | @Override
method setSaveButtonState (line 107) | private void setSaveButtonState(final List<Tab> newOrderTabs) {
method getMovementFlags (line 115) | @Override
method onChildDraw (line 122) | @Override
method onMove (line 154) | @Override
method onSwiped (line 171) | @Override
method onSelectedChanged (line 174) | @Override
method clearView (line 187) | @Override
method newInstance (line 198) | public static TabOrderPreferenceDialogFragment newInstance() {
method TabOrderPreferenceDialogFragment (line 205) | public TabOrderPreferenceDialogFragment() {}
method onAttach (line 207) | @Override
method onCreateDialog (line 218) | @NonNull
method saveNewOrder (line 238) | private void saveNewOrder() {
method onStart (line 246) | @Override
method createView (line 255) | @NonNull
type Callback (line 272) | public interface Callback {
method onSave (line 273) | void onSave(final boolean orderHasChanged);
method onCancel (line 275) | void onCancel();
FILE: app/src/main/java/awais/instagrabber/dialogs/TimeSettingsDialog.java
class TimeSettingsDialog (line 30) | public final class TimeSettingsDialog extends DialogFragment implements ...
method TimeSettingsDialog (line 42) | public TimeSettingsDialog(final boolean customDateTimeFormatEnabled,
method onCreateView (line 58) | @Override
method refreshTimeFormat (line 87) | private void refreshTimeFormat() {
method onItemSelected (line 124) | @Override
method onCheckedChanged (line 129) | @Override
method onTextChanged (line 143) | @Override
method onClick (line 148) | @Override
type OnConfirmListener (line 169) | public interface OnConfirmListener {
method onConfirm (line 170) | void onConfirm(boolean isCustomFormat,
method onNothingSelected (line 178) | @Override
method beforeTextChanged (line 181) | @Override
method afterTextChanged (line 184) | @Override
method onResume (line 187) | @Override
FILE: app/src/main/java/awais/instagrabber/fragments/CollectionPostsFragment.java
class CollectionPostsFragment (line 68) | public class CollectionPostsFragment extends Fragment implements SwipeRe...
method handleOnBackPressed (line 82) | @Override
method onDestroy (line 89) | @Override
method onActionItemClicked (line 94) | @Override
method onPostClick (line 108) | @Override
method onSliderClick (line 113) | @Override
method onCommentsClick (line 118) | @Override
method onDownloadClick (line 134) | @Override
method onHashtagClick (line 141) | @Override
method onLocationClick (line 151) | @Override
method onMentionClick (line 163) | @Override
method onNameClick (line 168) | @Override
method onProfilePicClick (line 175) | @Override
method onURLClick (line 182) | @Override
method onEmailClick (line 187) | @Override
method openPostDialog (line 192) | private void openPostDialog(final Media feedModel, final int position) {
method onSelectionStart (line 203) | @Override
method onSelectionChange (line 215) | @Override
method onSelectionEnd (line 224) | @Override
method onCreate (line 237) | @Override
method onCreateView (line 257) | @Nullable
method onViewCreated (line 271) | @Override
method onCreateOptionsMenu (line 279) | @Override
method onOptionsItemSelected (line 290) | @Override
method onResume (line 355) | @Override
method onRefresh (line 361) | @Override
method onStop (line 366) | @Override
method init (line 372) | private void init() {
method setupToolbar (line 380) | private void setupToolbar(final int titleColor, final int backgroundCo...
method setupCover (line 417) | private void setupCover() {
method setupPosts (line 445) | private void setupPosts() {
method updateSwipeRefreshState (line 456) | private void updateSwipeRefreshState() {
method navigateToProfile (line 462) | private void navigateToProfile(final String username) {
method showPostsLayoutPreferences (line 471) | private void showPostsLayoutPreferences() {
FILE: app/src/main/java/awais/instagrabber/fragments/HashTagFragment.java
class HashTagFragment (line 70) | public class HashTagFragment extends Fragment implements SwipeRefreshLay...
method handleOnBackPressed (line 91) | @Override
method onDestroy (line 99) | @Override
method onActionItemClicked (line 104) | @Override
method onPostClick (line 118) | @Override
method onSliderClick (line 123) | @Override
method onCommentsClick (line 128) | @Override
method onDownloadClick (line 144) | @Override
method onHashtagClick (line 151) | @Override
method onLocationClick (line 161) | @Override
method onMentionClick (line 173) | @Override
method onNameClick (line 178) | @Override
method onProfilePicClick (line 185) | @Override
method onURLClick (line 192) | @Override
method onEmailClick (line 197) | @Override
method openPostDialog (line 202) | private void openPostDialog(@NonNull final Media feedModel, final int ...
method onSelectionStart (line 234) | @Override
method onSelectionChange (line 246) | @Override
method onSelectionEnd (line 255) | @Override
method onSuccess (line 268) | @Override
method onFailure (line 275) | @Override
method onCreate (line 281) | @Override
method onCreateView (line 293) | @Nullable
method onViewCreated (line 306) | @Override
method onRefresh (line 314) | @Override
method onResume (line 320) | @Override
method onCreateOptionsMenu (line 327) | @Override
method onOptionsItemSelected (line 332) | @Override
method onStop (line 341) | @Override
method init (line 347) | private void init() {
method fetchHashtagModel (line 355) | private void fetchHashtagModel() {
method setupPosts (line 367) | private void setupPosts() {
method setHashtagDetails (line 389) | private void setHashtagDetails() {
method showSnackbar (line 551) | private void showSnackbar(final String message) {
method setTitle (line 559) | private void setTitle() {
method updateSwipeRefreshState (line 566) | private void updateSwipeRefreshState() {
method navigateToProfile (line 572) | private void navigateToProfile(final String username) {
method showPostsLayoutPreferences (line 581) | private void showPostsLayoutPreferences() {
FILE: app/src/main/java/awais/instagrabber/fragments/LikesViewerFragment.java
class LikesViewerFragment (line 40) | public final class LikesViewerFragment extends BottomSheetDialogFragment...
method onSuccess (line 52) | @Override
method onFailure (line 74) | @Override
method onSuccess (line 85) | @Override
method onFailure (line 104) | @Override
method onCreate (line 114) | @Override
method onCreateView (line 128) | @NonNull
method onViewCreated (line 137) | @Override
method onRefresh (line 142) | @Override
method init (line 173) | private void init() {
FILE: app/src/main/java/awais/instagrabber/fragments/LocationFragment.java
class LocationFragment (line 67) | public class LocationFragment extends Fragment implements SwipeRefreshLa...
method handleOnBackPressed (line 86) | @Override
method onDestroy (line 93) | @Override
method onActionItemClicked (line 98) | @Override
method onPostClick (line 113) | @Override
method onSliderClick (line 118) | @Override
method onCommentsClick (line 123) | @Override
method onDownloadClick (line 139) | @Override
method onHashtagClick (line 146) | @Override
method onLocationClick (line 156) | @Override
method onMentionClick (line 164) | @Override
method onNameClick (line 169) | @Override
method onProfilePicClick (line 176) | @Override
method onURLClick (line 183) | @Override
method onEmailClick (line 188) | @Override
method openPostDialog (line 193) | private void openPostDialog(@NonNull final Media feedModel, final int ...
method onSelectionStart (line 227) | @Override
method onSelectionChange (line 239) | @Override
method onSelectionEnd (line 248) | @Override
method onSuccess (line 261) | @Override
method onFailure (line 268) | @Override
method onCreate (line 274) | @Override
method onCreateView (line 286) | @Nullable
method onViewCreated (line 301) | @Override
method onRefresh (line 309) | @Override
method onResume (line 314) | @Override
method onCreateOptionsMenu (line 321) | @Override
method onOptionsItemSelected (line 326) | @Override
method onStop (line 335) | @Override
method init (line 341) | private void init() {
method setupPosts (line 351) | private void setupPosts() {
method fetchLocationModel (line 373) | private void fetchLocationModel() {
method setupLocationDetails (line 388) | private void setupLocationDetails() {
method showSnackbar (line 545) | private void showSnackbar(final String message) {
method setTitle (line 553) | private void setTitle() {
method updateSwipeRefreshState (line 560) | private void updateSwipeRefreshState() {
method navigateToProfile (line 564) | private void navigateToProfile(final String username) {
method showPostsLayoutPreferences (line 573) | private void showPostsLayoutPreferences() {
FILE: app/src/main/java/awais/instagrabber/fragments/NotificationsViewerFragment.java
class NotificationsViewerFragment (line 52) | public final class NotificationsViewerFragment extends Fragment implemen...
method onSuccess (line 70) | @Override
method onFailure (line 76) | @Override
method onProfileClick (line 86) | @Override
method onPreviewClick (line 91) | @Override
method onNotificationClick (line 133) | @Override
method onCreate (line 217) | @Override
method onCreateView (line 236) | @NonNull
method onViewCreated (line 248) | @Override
method init (line 255) | private void init() {
method onRefresh (line 270) | @Override
method openProfile (line 290) | private void openProfile(final String username) {
FILE: app/src/main/java/awais/instagrabber/fragments/PostViewV2Fragment.java
class PostViewV2Fragment (line 108) | public class PostViewV2Fragment extends Fragment implements EditTextDial...
method setOnDeleteListener (line 171) | public void setOnDeleteListener(final OnDeleteListener onDeleteListene...
type OnDeleteListener (line 176) | public interface OnDeleteListener {
method onDelete (line 177) | void onDelete();
method PostViewV2Fragment (line 181) | public PostViewV2Fragment() {}
method onCreate (line 183) | @Override
method onCreateView (line 189) | @Nullable
method onViewCreated (line 202) | @Override
method onAttach (line 208) | @Override
method onPause (line 214) | @Override
method onResume (line 235) | @Override
method onDestroyView (line 248) | @Override
method onSaveInstanceState (line 268) | @Override
method onPrimaryNavigationFragmentChanged (line 277) | @Override
method init (line 296) | private void init() {
method setObservers (line 326) | private void setObservers() {
method showCountTooltip (line 382) | private void showCountTooltip() {
method getSafeCount (line 421) | @NonNull
method setupCommonActions (line 430) | private void setupCommonActions() {
method setupComment (line 438) | private void setupComment() {
method setupDownload (line 461) | private void setupDownload() {
method setupLike (line 466) | private void setupLike() {
method handleLikeUnlikeResourceLiveData (line 497) | private void handleLikeUnlikeResourceLiveData(@NonNull final LiveData<...
method unsuccessfulLike (line 515) | private void unsuccessfulLike() {
method setLikedResources (line 530) | private void setLikedResources(final boolean liked) {
method setupSave (line 549) | private void setupSave() {
method handleSaveUnsaveResourceLiveData (line 571) | private void handleSaveUnsaveResourceLiveData(@NonNull final LiveData<...
method unsuccessfulSave (line 589) | private void unsuccessfulSave() {
method setSavedResources (line 604) | private void setSavedResources(final boolean saved) {
method setupProfilePic (line 623) | private void setupProfilePic(final User user) {
method setupTitles (line 637) | private void setupTitles(final User user) {
method setUsername (line 655) | private void setUsername(final User user) {
method setupCaption (line 680) | private void setupCaption(final Caption caption) {
method handleTranslateCaptionResource (line 712) | private void handleTranslateCaptionResource(@NonNull final LiveData<Re...
method setupLocation (line 737) | private void setupLocation(final Location location) {
method setupShare (line 758) | private void setupShare() {
method shareLink (line 808) | private void shareLink(@NonNull final Media media, final boolean isPri...
method setupPostTypeLayout (line 821) | private void setupPostTypeLayout(final MediaItemType type) {
method setupPostImage (line 836) | private void setupPostImage() {
method setupSlider (line 887) | private void setupSlider() {
method pauseSliderPlayer (line 1044) | private void pauseSliderPlayer() {
method releaseAllSliderPlayers (line 1054) | private void releaseAllSliderPlayers() {
method setupVideo (line 1066) | private void setupVideo() {
method setupOptions (line 1171) | private void setupOptions(final Boolean show) {
method createOptionsPopupMenu (line 1183) | private void createOptionsPopupMenu() {
method handleDeleteResource (line 1216) | private void handleDeleteResource(final LiveData<Resource<Object>> res...
method showCaptionEditDialog (line 1252) | private void showCaptionEditDialog() {
method onPositiveButtonClicked (line 1260) | @Override
method handleEditCaptionResource (line 1268) | private void handleEditCaptionResource(final LiveData<Resource<Object>...
method onNegativeButtonClicked (line 1295) | @Override
method toggleDetails (line 1302) | private void toggleDetails() {
method hideSystemUI (line 1420) | private void hideSystemUI() {
method showSystemUI (line 1443) | private void showSystemUI() {
method navigateToProfile (line 1468) | private void navigateToProfile(final String username) {
method getNavController (line 1475) | @Nullable
method wasDeleted (line 1486) | public boolean wasDeleted() {
FILE: app/src/main/java/awais/instagrabber/fragments/SavedCollectionsFragment.java
class SavedCollectionsFragment (line 45) | public class SavedCollectionsFragment extends Fragment implements SwipeR...
method onCreate (line 58) | @Override
method onCreateView (line 67) | @Override
method onViewCreated (line 80) | @Override
method onCreateOptionsMenu (line 89) | @Override
method onResume (line 94) | @Override
method onOptionsItemSelected (line 100) | @Override
method init (line 132) | private void init() {
method onRefresh (line 139) | @Override
method setupTopics (line 144) | public void setupTopics() {
method setupObservers (line 166) | private void setupObservers() {
method fetchTopics (line 173) | private void fetchTopics(final String maxId) {
method setNavControllerResult (line 187) | private void setNavControllerResult(@NonNull final NavController navCo...
FILE: app/src/main/java/awais/instagrabber/fragments/SavedViewerFragment.java
class SavedViewerFragment (line 51) | public final class SavedViewerFragment extends Fragment implements Swipe...
method handleOnBackPressed (line 66) | @Override
method onDestroy (line 74) | @Override
method onActionItemClicked (line 79) | @Override
method onPostClick (line 92) | @Override
method onSliderClick (line 97) | @Override
method onCommentsClick (line 102) | @Override
method onDownloadClick (line 118) | @Override
method onHashtagClick (line 125) | @Override
method onLocationClick (line 135) | @Override
method onMentionClick (line 147) | @Override
method onNameClick (line 152) | @Override
method onProfilePicClick (line 157) | @Override
method onURLClick (line 164) | @Override
method onEmailClick (line 169) | @Override
method openPostDialog (line 174) | private void openPostDialog(final Media feedModel, final int position) {
method onSelectionStart (line 185) | @Override
method onSelectionChange (line 197) | @Override
method onSelectionEnd (line 206) | @Override
method onCreate (line 219) | @Override
method onCreateView (line 226) | @Override
method onViewCreated (line 239) | @Override
method onCreateOptionsMenu (line 247) | @Override
method onOptionsItemSelected (line 252) | @Override
method onResume (line 261) | @Override
method onRefresh (line 267) | @Override
method init (line 272) | private void init() {
method setupPosts (line 283) | private void setupPosts() {
method getPostsLayoutPreferenceKey (line 295) | @NonNull
method setTitle (line 308) | private void setTitle() {
method updateSwipeRefreshState (line 328) | private void updateSwipeRefreshState() {
method navigateToProfile (line 334) | private void navigateToProfile(final String username) {
method showPostsLayoutPreferences (line 343) | private void showPostsLayoutPreferences() {
FILE: app/src/main/java/awais/instagrabber/fragments/StoryListViewerFragment.java
class StoryListViewerFragment (line 52) | public final class StoryListViewerFragment extends Fragment implements S...
method onFeedStoryClick (line 69) | @Override
method onProfileClick (line 84) | @Override
method onHighlightClick (line 91) | @Override
method onProfileClick (line 102) | @Override
method onSuccess (line 109) | @Override
method onFailure (line 126) | @Override
method onCreate (line 136) | @Override
method onCreateView (line 150) | @NonNull
method onViewCreated (line 162) | @Override
method onCreateOptionsMenu (line 169) | @Override
method onResume (line 192) | @Override
method onDestroy (line 199) | @Override
method init (line 205) | private void init() {
method onRefresh (line 239) | @Override
method openProfile (line 278) | private void openProfile(final String username) {
FILE: app/src/main/java/awais/instagrabber/fragments/comments/CommentsViewerFragment.java
class CommentsViewerFragment (line 46) | public final class CommentsViewerFragment extends BottomSheetDialogFragm...
method onStart (line 57) | @Override
method onCreate (line 72) | @Override
method onCreateDialog (line 81) | @NonNull
method onCreateView (line 97) | @NonNull
method onViewCreated (line 131) | @Override
method init (line 138) | private void init() {
method setupObservers (line 144) | private void setupObservers() {
method setupToolbar (line 210) | private void setupToolbar() {
method setupAdapter (line 214) | private void setupAdapter(final long currentUserId) {
method setupList (line 241) | private void setupList() {
method getNavController (line 249) | @Nullable
FILE: app/src/main/java/awais/instagrabber/fragments/comments/Helper.java
class Helper (line 39) | public final class Helper {
method setupList (line 42) | public static void setupList(@NonNull final Context context,
method getCommentCallback (line 56) | @NonNull
method openProfile (line 190) | private static void openProfile(final NavController navController,
method setupCommentInput (line 201) | public static void setupCommentInput(@NonNull final TextInputLayout co...
method handleCommentResource (line 231) | public static void handleCommentResource(@NonNull final Context context,
FILE: app/src/main/java/awais/instagrabber/fragments/comments/RepliesFragment.java
class RepliesFragment (line 39) | public class RepliesFragment extends Fragment {
method newInstance (line 48) | @NonNull
method onCreate (line 59) | @Override
method onCreateView (line 72) | @Nullable
method onViewCreated (line 81) | @Override
method onCreateAnimation (line 86) | @Override
method onDestroyView (line 113) | @Override
method onDestroy (line 119) | @Override
method setupObservers (line 127) | private void setupObservers() {
method setupToolbar (line 188) | private void setupToolbar() {
method setupAdapter (line 197) | private void setupAdapter(final long currentUserId) {
method setupList (line 222) | private void setupList() {
method getNavController (line 232) | @Nullable
FILE: app/src/main/java/awais/instagrabber/fragments/directmessages/DirectMessageThreadFragment.java
class DirectMessageThreadFragment (line 124) | public class DirectMessageThreadFragment extends Fragment implements Dir...
method onAnimationEnd (line 174) | @Override
method onAnimationEnd (line 181) | @Override
method onHashtagClick (line 188) | @Override
method onMentionClick (line 198) | @Override
method onLocationClick (line 203) | @Override
method onURLClick (line 213) | @Override
method onEmailClick (line 220) | @Override
method onMediaClick (line 227) | @Override
method onStoryClick (line 252) | @Override
method onReaction (line 270) | @Override
method onReactionClick (line 277) | @Override
method onOptionSelect (line 282) | @Override
method onAddReactionListener (line 309) | @Override
method handleOnBackPressed (line 348) | @Override
method onCreate (line 354) | @Override
method onCreateView (line 377) | @Override
method onViewCreated (line 397) | @Override
method onCreateOptionsMenu (line 406) | @Override
method onOptionsItemSelected (line 419) | @Override
method handleMarkAsSeen (line 441) | private void handleMarkAsSeen(@NonNull final MenuItem item) {
method onActivityResult (line 475) | @Override
method onRequestPermissionsResult (line 506) | @Override
method onPause (line 520) | @Override
method onResume (line 534) | @Override
method onDestroyView (line 548) | @Override
method onDestroy (line 554) | @Override
method cleanup (line 560) | @SuppressLint("UnsafeOptInUsageError")
method init (line 583) | private void init() {
method setupList (line 591) | private void setupList() {
method setObservers (line 618) | private void setObservers() {
method setupTouchHelper (line 749) | private void setupTouchHelper() {
method removeObservers (line 765) | private void removeObservers() {
method hidePendingOptions (line 779) | private void hidePendingOptions() {
method showPendingOptions (line 785) | private void showPendingOptions() {
method handlePendingChangeResource (line 799) | private void handlePendingChangeResource(final LiveData<Resource<Objec...
method hideInput (line 832) | private void hideInput() {
method showInput (line 846) | private void showInput() {
method attachPendingRequestsBadge (line 860) | @SuppressLint("UnsafeOptInUsageError")
method showExtraInputOption (line 885) | private void showExtraInputOption(final boolean show) {
method getDirectItemPreviewText (line 905) | private String getDirectItemPreviewText(@NonNull final DirectItem item) {
method getMediaPreviewTextString (line 939) | @NonNull
method getDirectItemPreviewImageUrl (line 953) | @Nullable
method setupBackStackResultObserver (line 981) | private void setupBackStackResultObserver() {
method submitItemsToAdapter (line 990) | private void submitItemsToAdapter(final List<DirectItem> items) {
method setupItemsAdapter (line 1018) | private void setupItemsAdapter(final DirectThread thread) {
method registerDataObserver (line 1040) | private void registerDataObserver() {
method setupInput (line 1056) | private void setupInput(@Nullable final Integer inputMode) {
method setupInsetsCallback (line 1174) | private void setupInsetsCallback() {
method onKbVisibilityChange (line 1224) | private void onKbVisibilityChange(final boolean kbVisible) {
method startIconAnimation (line 1241) | private void startIconAnimation() {
method navigateToImageEditFragment (line 1252) | private void navigateToImageEditFragment(final String path) {
method navigateToImageEditFragment (line 1256) | private void navigateToImageEditFragment(final Uri uri) {
method handleSentMessage (line 1265) | private void handleSentMessage(final LiveData<Resource<Object>> resour...
method setupEmojiPicker (line 1287) | private void setupEmojiPicker() {
method showKeyboard (line 1373) | public void showKeyboard() {
method hideKeyboard (line 1387) | public void hideKeyboard() {
method setSendToMicIcon (line 1395) | private void setSendToMicIcon() {
method setMicToSendIcon (line 1405) | private void setMicToSendIcon() {
method setTitle (line 1415) | private void setTitle(final String title) {
method downloadItem (line 1425) | private void downloadItem(final DirectItem item) {
method downloadItem (line 1441) | private void downloadItem(@NonNull final Context context, final Media ...
method animatePan (line 1451) | private void animatePan(final int height,
method showReactionsDialog (line 1491) | private void showReactionsDialog(final DirectItem item) {
method onReactionClick (line 1515) | @Override
method navigateToUser (line 1532) | private void navigateToUser(@NonNull final String username) {
method onClick (line 1541) | @Override
FILE: app/src/main/java/awais/instagrabber/fragments/imageedit/FiltersFragment.java
class FiltersFragment (line 60) | public class FiltersFragment extends Fragment {
method newInstance (line 85) | @NonNull
method newInstance (line 92) | @NonNull
method FiltersFragment (line 113) | public FiltersFragment() {
method onCreate (line 118) | @Override
method onCreateView (line 125) | @Nullable
method onViewCreated (line 132) | @Override
method onSaveInstanceState (line 137) | @Override
method onPause (line 146) | @Override
method onResume (line 152) | @Override
method onDestroyView (line 158) | @Override
method init (line 168) | private void init(final Bundle savedInstanceState) {
method getAppliedTunings (line 247) | @NonNull
method resetSliders (line 269) | private void resetSliders() {
method setPreviewBounds (line 282) | private void setPreviewBounds() {
method setupObservers (line 313) | private void setupObservers() {
method setupTuning (line 331) | private void setupTuning() {
method initTuningControls (line 337) | private void initTuningControls() {
method addInitialFilter (line 431) | private void addInitialFilter() {
method setupFilters (line 439) | private void setupFilters() {
method addTuneFilters (line 496) | private void addTuneFilters() {
method addFilterToGroup (line 505) | private void addFilterToGroup(@NonNull final Filter<?> tuneFilter, fin...
method setCurrentTab (line 515) | public void setCurrentTab(final ImageEditViewModel.Tab tab) {
method setCallback (line 519) | public void setCallback(final FilterCallback callback) {
type FilterCallback (line 524) | public interface FilterCallback {
method onApply (line 525) | void onApply(final Uri uri, List<Filter<?>> tuningFilters, Filter<?>...
method onCancel (line 527) | void onCancel();
FILE: app/src/main/java/awais/instagrabber/fragments/imageedit/ImageEditFragment.java
class ImageEditFragment (line 48) | public class ImageEditFragment extends Fragment {
method handleOnBackPressed (line 59) | @Override
method newInstance (line 79) | public static ImageEditFragment newInstance(final Uri uri) {
method ImageEditFragment (line 87) | public ImageEditFragment() {}
method onCreate (line 89) | @Override
method onCreateView (line 96)
Condensed preview — 1055 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (4,807K chars).
[
{
"path": ".all-contributorsrc",
"chars": 13479,
"preview": "{\n \"files\": [\n \"README.md\"\n ],\n \"imageSize\": 100,\n \"commit\": false,\n \"badgeTemplate\": \"[. Please report violations in Iss"
},
{
"path": ".github/FUNDING.yml",
"chars": 553,
"preview": "# These are supported funding model platforms\n\ngithub: austinhuang0131\npatreon: # Replace with a single Patreon username"
},
{
"path": ".github/ISSUE_TEMPLATE/ban_report.md",
"chars": 1449,
"preview": "---\nname: Ban report\nabout: If you suspect a ban by Instagram due to your usage of this app, you MUST report it.\ntitle: "
},
{
"path": ".github/ISSUE_TEMPLATE/bug_report.md",
"chars": 691,
"preview": "---\nname: Bug report\nabout: App crashing? You seeing a confusing error message? Report them here!\ntitle: \"[BUG]\"\nlabels:"
},
{
"path": ".github/ISSUE_TEMPLATE/config.yml",
"chars": 433,
"preview": "blank_issues_enabled: true\ncontact_links:\n - name: Community Chatrooms\n url: https://barinsta.austinhuang.me/en/late"
},
{
"path": ".github/ISSUE_TEMPLATE/feature_request.md",
"chars": 641,
"preview": "---\nname: Feature request\nabout: Want new features? Ask them here!\ntitle: \"[FTR]\"\nlabels: enhancement\nassignees: ''\n\n---"
},
{
"path": ".github/issue_label_bot.yaml",
"chars": 82,
"preview": "label-alias:\n bug: 'bug'\n feature_request: 'enhancement'\n question: 'question'\n"
},
{
"path": ".github/workflows/github_nightly_release.yml",
"chars": 2504,
"preview": "name: Github nightly\n\non:\n schedule:\n # * is a special character in YAML so you have to quote this string\n - cron"
},
{
"path": ".github/workflows/github_pre_release.yml",
"chars": 2462,
"preview": "name: Github pre-release\n\non: workflow_dispatch\n# push:\n# branches: [ master ]\n# pull_request:\n# branches: ["
},
{
"path": ".github/workflows/label-bugs.yml",
"chars": 598,
"preview": "name: Label bugs\n\non:\n issues:\n types: [opened]\n\njobs:\n add-labels:\n runs-on: ubuntu-latest\n if: contains(git"
},
{
"path": ".github/workflows/label-duplicates.yml",
"chars": 612,
"preview": "name: Label duplicates\n\non:\n issue_comment:\n types: [created]\n\njobs:\n add-labels:\n runs-on: ubuntu-latest\n if"
},
{
"path": ".gitignore",
"chars": 398,
"preview": "*.iml\n.gradle\n/local.properties\n/.idea/caches\n/.idea/libraries\n/.idea/modules.xml\n/.idea/markdown-navigator.xml\n/.idea/m"
},
{
"path": ".idea/.gitignore",
"chars": 47,
"preview": "# Default ignored files\n/shelf/\n/dictionaries/\n"
},
{
"path": ".idea/.name",
"chars": 8,
"preview": "Barinsta"
},
{
"path": ".idea/codeStyles",
"chars": 3613,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n <component name=\"ProjectCodeStyleConfiguration\">\n <cod"
},
{
"path": ".idea/compiler.xml",
"chars": 169,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n <component name=\"CompilerConfiguration\">\n <bytecodeTar"
},
{
"path": ".idea/gradle.xml",
"chars": 811,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n <component name=\"GradleMigrationSettings\" migrationVersio"
},
{
"path": ".idea/inspectionProfiles/profiles_settings.xml",
"chars": 228,
"preview": "<component name=\"InspectionProjectProfileManager\">\n <settings>\n <option name=\"PROJECT_PROFILE\" value=\"Default\" />\n "
},
{
"path": ".idea/jarRepositories.xml",
"chars": 1845,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n <component name=\"RemoteRepositoriesConfiguration\">\n <r"
},
{
"path": ".idea/misc.xml",
"chars": 3309,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n <component name=\"ExternalStorageConfigurationManager\" ena"
},
{
"path": ".idea/render.experimental.xml",
"chars": 173,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n <component name=\"RenderSettings\">\n <option name=\"showD"
},
{
"path": ".idea/runConfigurations/app.xml",
"chars": 3069,
"preview": "<component name=\"ProjectRunConfigurationManager\">\n <configuration default=\"false\" name=\"app\" type=\"AndroidRunConfigurat"
},
{
"path": ".idea/runConfigurations.xml",
"chars": 686,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n <component name=\"RunConfigurationProducerService\">\n <o"
},
{
"path": ".idea/vcs.xml",
"chars": 167,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n <component name=\"VcsDirectoryMappings\">\n <mapping dire"
},
{
"path": ".project",
"chars": 722,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<projectDescription>\n\t<name>Barinsta</name>\n\t<comment>Project instagrabber create"
},
{
"path": ".settings/org.eclipse.buildship.core.prefs",
"chars": 374,
"preview": "arguments=\nauto.sync=false\nbuild.scans.enabled=false\nconnection.gradle.distribution=GRADLE_DISTRIBUTION(WRAPPER)\nconnect"
},
{
"path": "CHANGELOG",
"chars": 7540,
"preview": "v15.9 to v16.5: https://gitlab.com/AwaisKing/instagrabber/-/releases\nFrom v16.6: https://github.com/austinhuang0131/bari"
},
{
"path": "LICENSE",
"chars": 32471,
"preview": " GNU GENERAL PUBLIC LICENSE\n Version 3, 29 June 2007\n\n Copyright (C) 2007 Free "
},
{
"path": "README.md",
"chars": 23566,
"preview": "### THERE ARE CURRENTLY NO OFFICIAL GOOGLE PLAY RELEASES. PLEASE REPORT ANY OCCURRENCES TO US.\n\n<img src=\"./app/src/main"
},
{
"path": "SECURITY.md",
"chars": 285,
"preview": "If there is a security issue with the latest version, please let me know using GitHub issues (bug), or email `im [at] au"
},
{
"path": "app/.classpath",
"chars": 351,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<classpath>\n\t<classpathentry kind=\"con\" path=\"org.eclipse.jdt.launching.JRE_CONTA"
},
{
"path": "app/.gitignore",
"chars": 7,
"preview": "/build\n"
},
{
"path": "app/.project",
"chars": 886,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<projectDescription>\n\t<name>app</name>\n\t<comment>Project app created by Buildship"
},
{
"path": "app/.settings/org.eclipse.buildship.core.prefs",
"chars": 56,
"preview": "connection.project.dir=..\neclipse.preferences.version=1\n"
},
{
"path": "app/build.gradle",
"chars": 9501,
"preview": "apply plugin: 'com.android.application'\napply plugin: 'kotlin-android'\napply plugin: \"androidx.navigation.safeargs\"\nappl"
},
{
"path": "app/lint.xml",
"chars": 1426,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<lint>\n <issue id=\"IconColors\">\n <ignore path=\"src/main/res/drawable-ni"
},
{
"path": "app/proguard-rules.pro",
"chars": 979,
"preview": "# Add project specific ProGuard rules here.\n# You can control the set of applied configuration files using the\n# proguar"
},
{
"path": "app/schemas/awais.instagrabber.db.AppDatabase/4.json",
"chars": 3218,
"preview": "{\n \"formatVersion\": 1,\n \"database\": {\n \"version\": 4,\n \"identityHash\": \"538d64adaeb8c3a98db9204955932e59\",\n \"e"
},
{
"path": "app/schemas/awais.instagrabber.db.AppDatabase/5.json",
"chars": 4665,
"preview": "{\n \"formatVersion\": 1,\n \"database\": {\n \"version\": 5,\n \"identityHash\": \"0b38e12b76bb081ec837191c5ef5b54e\",\n \"e"
},
{
"path": "app/schemas/awais.instagrabber.db.AppDatabase/6.json",
"chars": 6620,
"preview": "{\n \"formatVersion\": 1,\n \"database\": {\n \"version\": 6,\n \"identityHash\": \"232e618b3bfcb4661336b359d036c455\",\n \"e"
},
{
"path": "app/sentry.gradle",
"chars": 340,
"preview": "def dsnKey = 'DSN'\ndef defaultDsn = '\\\"\\\"'\n\nfinal Properties properties = new Properties()\nFile propertiesFile = rootPro"
},
{
"path": "app/src/androidTest/java/awais/instagrabber/db/MigrationTest.java",
"chars": 2001,
"preview": "package awais.instagrabber.db;\n\nimport androidx.room.Room;\nimport androidx.room.migration.Migration;\nimport androidx.roo"
},
{
"path": "app/src/androidTest/java/awais/instagrabber/db/dao/RecentSearchDaoTest.kt",
"chars": 2879,
"preview": "package awais.instagrabber.db.dao\n\nimport android.content.Context\nimport androidx.arch.core.executor.testing.InstantTask"
},
{
"path": "app/src/androidTest/java/awaisomereport/CrashReporterHelperTest.kt",
"chars": 344,
"preview": "package awaisomereport\n\nimport androidx.test.runner.AndroidJUnit4\nimport org.junit.Test\nimport org.junit.runner.RunWith\n"
},
{
"path": "app/src/fdroid/java/awais/instagrabber/fragments/settings/FlavorSettings.java",
"chars": 1132,
"preview": "package awais.instagrabber.fragments.settings;\n\nimport android.content.Context;\n\nimport androidx.annotation.NonNull;\nimp"
},
{
"path": "app/src/fdroid/java/awais/instagrabber/utils/UpdateChecker.java",
"chars": 2109,
"preview": "package awais.instagrabber.utils;\n\nimport android.util.Log;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotat"
},
{
"path": "app/src/fdroid/java/awaisomereport/CrashHandler.kt",
"chars": 439,
"preview": "package awaisomereport\n\nimport android.app.Application\n\nclass CrashHandler(private val application: Application) : ICras"
},
{
"path": "app/src/github/AndroidManifest.xml",
"chars": 256,
"preview": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n package=\"awais.instagrabber\">\n\n <application"
},
{
"path": "app/src/github/java/awais/instagrabber/fragments/settings/FlavorSettings.java",
"chars": 2951,
"preview": "package awais.instagrabber.fragments.settings;\n\nimport android.content.Context;\n\nimport androidx.annotation.NonNull;\nimp"
},
{
"path": "app/src/github/java/awais/instagrabber/utils/UpdateChecker.java",
"chars": 1953,
"preview": "package awais.instagrabber.utils;\n\nimport android.content.Context;\nimport android.util.Log;\n\nimport androidx.annotation."
},
{
"path": "app/src/github/java/awaisomereport/CrashHandler.kt",
"chars": 1984,
"preview": "package awaisomereport\n\nimport android.app.Application\nimport awais.instagrabber.BuildConfig\nimport awais.instagrabber.f"
},
{
"path": "app/src/github/res/values/strings.xml",
"chars": 347,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n <string name=\"enable_sentry\">Enable Sentry</string>\n <string n"
},
{
"path": "app/src/github/res/values-ar/strings.xml",
"chars": 318,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n <string name=\"enable_sentry\">تمكين الحراسة</string>\n <string n"
},
{
"path": "app/src/github/res/values-ca/strings.xml",
"chars": 357,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n <string name=\"enable_sentry\">Habilita el Sentry</string>\n <str"
},
{
"path": "app/src/github/res/values-cs/strings.xml",
"chars": 344,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n <string name=\"enable_sentry\">Povolit Sentry</string>\n <string "
},
{
"path": "app/src/github/res/values-de/strings.xml",
"chars": 356,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n <string name=\"enable_sentry\">Aktiviere Sentry</string>\n <strin"
},
{
"path": "app/src/github/res/values-el/strings.xml",
"chars": 365,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n <string name=\"enable_sentry\">Ενεργοποίηση Sentry</string>\n <st"
},
{
"path": "app/src/github/res/values-es/strings.xml",
"chars": 351,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n <string name=\"enable_sentry\">Activar Sentry</string>\n <string "
},
{
"path": "app/src/github/res/values-eu/strings.xml",
"chars": 348,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n <string name=\"enable_sentry\">Enable Sentry</string>\n <string n"
},
{
"path": "app/src/github/res/values-fa/strings.xml",
"chars": 353,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n <string name=\"enable_sentry\">فعالسازی Sentry</string>\n <string"
},
{
"path": "app/src/github/res/values-fr/strings.xml",
"chars": 372,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n <string name=\"enable_sentry\">Activer Sentry</string>\n <string "
},
{
"path": "app/src/github/res/values-hi/strings.xml",
"chars": 348,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n <string name=\"enable_sentry\">Enable Sentry</string>\n <string n"
},
{
"path": "app/src/github/res/values-in/strings.xml",
"chars": 377,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n <string name=\"enable_sentry\">Hidupkan Sentry</string>\n <string"
},
{
"path": "app/src/github/res/values-it/strings.xml",
"chars": 351,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n <string name=\"enable_sentry\">Abilita Sentry</string>\n <string "
},
{
"path": "app/src/github/res/values-ja/strings.xml",
"chars": 348,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n <string name=\"enable_sentry\">Enable Sentry</string>\n <string n"
},
{
"path": "app/src/github/res/values-ko/strings.xml",
"chars": 278,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n <string name=\"enable_sentry\">Sentry 활성화</string>\n <string name"
},
{
"path": "app/src/github/res/values-mk/strings.xml",
"chars": 335,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n <string name=\"enable_sentry\">Овозможи Sentry</string>\n <string"
},
{
"path": "app/src/github/res/values-nl/strings.xml",
"chars": 368,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n <string name=\"enable_sentry\">Sentry inschakelen</string>\n <str"
},
{
"path": "app/src/github/res/values-or/strings.xml",
"chars": 342,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n <string name=\"enable_sentry\">Sentryକୁ ସକ୍ଷମ କରନ୍ତୁ</string>\n <"
},
{
"path": "app/src/github/res/values-pl/strings.xml",
"chars": 363,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n <string name=\"enable_sentry\">Włącz Sentry</string>\n <string na"
},
{
"path": "app/src/github/res/values-pt/strings.xml",
"chars": 343,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n <string name=\"enable_sentry\">Ativar Sentry</string>\n <string n"
},
{
"path": "app/src/github/res/values-ru/strings.xml",
"chars": 374,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n <string name=\"enable_sentry\">Включить Sentry</string>\n <string"
},
{
"path": "app/src/github/res/values-sk/strings.xml",
"chars": 348,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n <string name=\"enable_sentry\">Enable Sentry</string>\n <string n"
},
{
"path": "app/src/github/res/values-sv/strings.xml",
"chars": 348,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n <string name=\"enable_sentry\">Enable Sentry</string>\n <string n"
},
{
"path": "app/src/github/res/values-tr/strings.xml",
"chars": 348,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n <string name=\"enable_sentry\">Enable Sentry</string>\n <string n"
},
{
"path": "app/src/github/res/values-vi/strings.xml",
"chars": 369,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n <string name=\"enable_sentry\">Bật Sentry</string>\n <string name"
},
{
"path": "app/src/github/res/values-zh-rCN/strings.xml",
"chars": 261,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n <string name=\"enable_sentry\">启用 Sentry</string>\n <string name="
},
{
"path": "app/src/github/res/values-zh-rTW/strings.xml",
"chars": 260,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n <string name=\"enable_sentry\">啟用 Sentry</string>\n <string name="
},
{
"path": "app/src/main/AndroidManifest.xml",
"chars": 6199,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n xmlns:to"
},
{
"path": "app/src/main/java/awais/instagrabber/InstaGrabberApplication.kt",
"chars": 2787,
"preview": "package awais.instagrabber\n\nimport android.app.Application\nimport android.content.ClipboardManager\nimport android.util.L"
},
{
"path": "app/src/main/java/awais/instagrabber/activities/BaseLanguageActivity.kt",
"chars": 518,
"preview": "package awais.instagrabber.activities\n\nimport android.os.Bundle\nimport androidx.appcompat.app.AppCompatActivity\nimport a"
},
{
"path": "app/src/main/java/awais/instagrabber/activities/CameraActivity.kt",
"chars": 9857,
"preview": "package awais.instagrabber.activities\n\nimport android.content.Intent\nimport android.content.res.Configuration\nimport and"
},
{
"path": "app/src/main/java/awais/instagrabber/activities/DirectorySelectActivity.kt",
"chars": 5238,
"preview": "package awais.instagrabber.activities\n\nimport android.annotation.SuppressLint\nimport android.content.ActivityNotFoundExc"
},
{
"path": "app/src/main/java/awais/instagrabber/activities/Login.kt",
"chars": 4351,
"preview": "package awais.instagrabber.activities\n\nimport android.annotation.SuppressLint\nimport android.content.Intent\nimport andro"
},
{
"path": "app/src/main/java/awais/instagrabber/activities/MainActivity.kt",
"chars": 28080,
"preview": "package awais.instagrabber.activities\n\nimport android.animation.LayoutTransition\nimport android.app.NotificationChannel\n"
},
{
"path": "app/src/main/java/awais/instagrabber/adapters/AccountSwitcherAdapter.java",
"chars": 4673,
"preview": "package awais.instagrabber.adapters;\n\nimport android.annotation.SuppressLint;\nimport android.graphics.Typeface;\nimport a"
},
{
"path": "app/src/main/java/awais/instagrabber/adapters/CommentsAdapter.java",
"chars": 2759,
"preview": "package awais.instagrabber.adapters;\n\nimport android.view.LayoutInflater;\nimport android.view.ViewGroup;\n\nimport android"
},
{
"path": "app/src/main/java/awais/instagrabber/adapters/DirectItemsAdapter.java",
"chars": 19672,
"preview": "package awais.instagrabber.adapters;\n\nimport android.view.LayoutInflater;\nimport android.view.ViewGroup;\n\nimport android"
},
{
"path": "app/src/main/java/awais/instagrabber/adapters/DirectMessageInboxAdapter.java",
"chars": 3433,
"preview": "package awais.instagrabber.adapters;\n\nimport android.view.LayoutInflater;\nimport android.view.ViewGroup;\n\nimport android"
},
{
"path": "app/src/main/java/awais/instagrabber/adapters/DirectPendingUsersAdapter.java",
"chars": 4229,
"preview": "package awais.instagrabber.adapters;\n\nimport android.view.LayoutInflater;\nimport android.view.ViewGroup;\n\nimport android"
},
{
"path": "app/src/main/java/awais/instagrabber/adapters/DirectReactionsAdapter.java",
"chars": 3184,
"preview": "package awais.instagrabber.adapters;\n\nimport android.view.LayoutInflater;\nimport android.view.ViewGroup;\n\nimport android"
},
{
"path": "app/src/main/java/awais/instagrabber/adapters/DirectUsersAdapter.java",
"chars": 7461,
"preview": "package awais.instagrabber.adapters;\n\nimport android.view.LayoutInflater;\nimport android.view.ViewGroup;\n\nimport android"
},
{
"path": "app/src/main/java/awais/instagrabber/adapters/DirectoryFilesAdapter.java",
"chars": 2733,
"preview": "package awais.instagrabber.adapters;\n\nimport android.view.LayoutInflater;\nimport android.view.ViewGroup;\n\nimport android"
},
{
"path": "app/src/main/java/awais/instagrabber/adapters/DiscoverTopicsAdapter.java",
"chars": 2522,
"preview": "package awais.instagrabber.adapters;\n\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view."
},
{
"path": "app/src/main/java/awais/instagrabber/adapters/FavoritesAdapter.java",
"chars": 7858,
"preview": "package awais.instagrabber.adapters;\n\nimport android.view.LayoutInflater;\nimport android.view.ViewGroup;\n\nimport android"
},
{
"path": "app/src/main/java/awais/instagrabber/adapters/FeedAdapterV2.java",
"chars": 10089,
"preview": "package awais.instagrabber.adapters;\n\nimport android.content.Context;\nimport android.view.LayoutInflater;\nimport android"
},
{
"path": "app/src/main/java/awais/instagrabber/adapters/FeedItemCallbackAdapter.java",
"chars": 1025,
"preview": "package awais.instagrabber.adapters;\n\nimport android.view.View;\n\nimport awais.instagrabber.repositories.responses.Media;"
},
{
"path": "app/src/main/java/awais/instagrabber/adapters/FeedStoriesAdapter.java",
"chars": 2026,
"preview": "package awais.instagrabber.adapters;\n\nimport android.view.LayoutInflater;\nimport android.view.ViewGroup;\n\nimport android"
},
{
"path": "app/src/main/java/awais/instagrabber/adapters/FeedStoriesListAdapter.java",
"chars": 3969,
"preview": "package awais.instagrabber.adapters;\n\nimport android.view.LayoutInflater;\nimport android.view.ViewGroup;\nimport android."
},
{
"path": "app/src/main/java/awais/instagrabber/adapters/FiltersAdapter.java",
"chars": 3493,
"preview": "package awais.instagrabber.adapters;\n\nimport android.graphics.Bitmap;\nimport android.view.LayoutInflater;\nimport android"
},
{
"path": "app/src/main/java/awais/instagrabber/adapters/FollowAdapter.java",
"chars": 6624,
"preview": "package awais.instagrabber.adapters;\n\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view."
},
{
"path": "app/src/main/java/awais/instagrabber/adapters/GifItemsAdapter.java",
"chars": 4765,
"preview": "package awais.instagrabber.adapters;\n\nimport android.net.Uri;\nimport android.util.Log;\nimport android.view.LayoutInflate"
},
{
"path": "app/src/main/java/awais/instagrabber/adapters/HighlightStoriesListAdapter.java",
"chars": 2028,
"preview": "package awais.instagrabber.adapters;\n\nimport android.view.LayoutInflater;\nimport android.view.ViewGroup;\n\nimport android"
},
{
"path": "app/src/main/java/awais/instagrabber/adapters/HighlightsAdapter.java",
"chars": 2108,
"preview": "package awais.instagrabber.adapters;\n\nimport android.view.LayoutInflater;\nimport android.view.ViewGroup;\n\nimport android"
},
{
"path": "app/src/main/java/awais/instagrabber/adapters/KeywordsFilterAdapter.java",
"chars": 1274,
"preview": "package awais.instagrabber.adapters;\n\nimport android.content.Context;\nimport android.view.LayoutInflater;\nimport android"
},
{
"path": "app/src/main/java/awais/instagrabber/adapters/LikesAdapter.java",
"chars": 1509,
"preview": "package awais.instagrabber.adapters;\n\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view."
},
{
"path": "app/src/main/java/awais/instagrabber/adapters/NotificationsAdapter.java",
"chars": 3983,
"preview": "package awais.instagrabber.adapters;\n\nimport android.view.LayoutInflater;\nimport android.view.ViewGroup;\n\nimport android"
},
{
"path": "app/src/main/java/awais/instagrabber/adapters/SavedCollectionsAdapter.java",
"chars": 2795,
"preview": "package awais.instagrabber.adapters;\n\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view."
},
{
"path": "app/src/main/java/awais/instagrabber/adapters/SearchCategoryAdapter.java",
"chars": 908,
"preview": "package awais.instagrabber.adapters;\n\nimport androidx.annotation.NonNull;\nimport androidx.fragment.app.Fragment;\nimport "
},
{
"path": "app/src/main/java/awais/instagrabber/adapters/SearchItemsAdapter.java",
"chars": 8716,
"preview": "package awais.instagrabber.adapters;\n\nimport android.view.LayoutInflater;\nimport android.view.ViewGroup;\n\nimport android"
},
{
"path": "app/src/main/java/awais/instagrabber/adapters/SliderCallbackAdapter.java",
"chars": 847,
"preview": "package awais.instagrabber.adapters;\n\nimport android.view.View;\n\nimport com.google.android.exoplayer2.ui.StyledPlayerVie"
},
{
"path": "app/src/main/java/awais/instagrabber/adapters/SliderItemsAdapter.java",
"chars": 7060,
"preview": "package awais.instagrabber.adapters;\n\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view."
},
{
"path": "app/src/main/java/awais/instagrabber/adapters/StoriesAdapter.java",
"chars": 3381,
"preview": "package awais.instagrabber.adapters;\n\nimport java.util.List;\n\nimport android.view.LayoutInflater;\nimport android.view.Vi"
},
{
"path": "app/src/main/java/awais/instagrabber/adapters/TabsAdapter.java",
"chars": 5831,
"preview": "package awais.instagrabber.adapters;\n\nimport android.view.LayoutInflater;\nimport android.view.ViewGroup;\n\nimport android"
},
{
"path": "app/src/main/java/awais/instagrabber/adapters/UserSearchResultsAdapter.java",
"chars": 7097,
"preview": "package awais.instagrabber.adapters;\n\nimport android.view.LayoutInflater;\nimport android.view.ViewGroup;\n\nimport android"
},
{
"path": "app/src/main/java/awais/instagrabber/adapters/viewholder/CommentViewHolder.java",
"chars": 8966,
"preview": "package awais.instagrabber.adapters.viewholder;\n\nimport android.content.Context;\nimport android.content.res.Resources;\ni"
},
{
"path": "app/src/main/java/awais/instagrabber/adapters/viewholder/DiscoverViewHolder.java",
"chars": 902,
"preview": "//package awais.instagrabber.adapters.viewholder;\n//\n//import android.view.View;\n//import android.widget.ImageView;\n//\n/"
},
{
"path": "app/src/main/java/awais/instagrabber/adapters/viewholder/FavoriteViewHolder.java",
"chars": 2203,
"preview": "package awais.instagrabber.adapters.viewholder;\n\nimport android.view.View;\n\nimport androidx.annotation.NonNull;\nimport a"
},
{
"path": "app/src/main/java/awais/instagrabber/adapters/viewholder/FeedGridItemViewHolder.java",
"chars": 9984,
"preview": "package awais.instagrabber.adapters.viewholder;\n\nimport android.content.Context;\nimport android.content.res.ColorStateLi"
},
{
"path": "app/src/main/java/awais/instagrabber/adapters/viewholder/FeedStoryViewHolder.java",
"chars": 1795,
"preview": "package awais.instagrabber.adapters.viewholder;\n\nimport androidx.recyclerview.widget.RecyclerView;\n\nimport awais.instagr"
},
{
"path": "app/src/main/java/awais/instagrabber/adapters/viewholder/FilterViewHolder.java",
"chars": 3255,
"preview": "package awais.instagrabber.adapters.viewholder;\n\nimport android.graphics.Bitmap;\nimport android.view.View;\n\nimport andro"
},
{
"path": "app/src/main/java/awais/instagrabber/adapters/viewholder/FollowsViewHolder.java",
"chars": 980,
"preview": "package awais.instagrabber.adapters.viewholder;\n\nimport android.view.View;\n\nimport androidx.annotation.NonNull;\nimport a"
},
{
"path": "app/src/main/java/awais/instagrabber/adapters/viewholder/HighlightViewHolder.java",
"chars": 1230,
"preview": "package awais.instagrabber.adapters.viewholder;\n\nimport androidx.recyclerview.widget.RecyclerView;\n\nimport awais.instagr"
},
{
"path": "app/src/main/java/awais/instagrabber/adapters/viewholder/NotificationViewHolder.java",
"chars": 4119,
"preview": "package awais.instagrabber.adapters.viewholder;\n\nimport android.text.TextUtils;\nimport android.view.View;\n\nimport androi"
},
{
"path": "app/src/main/java/awais/instagrabber/adapters/viewholder/SearchItemViewHolder.java",
"chars": 3224,
"preview": "package awais.instagrabber.adapters.viewholder;\n\nimport android.view.View;\n\nimport androidx.annotation.NonNull;\nimport a"
},
{
"path": "app/src/main/java/awais/instagrabber/adapters/viewholder/SliderItemViewHolder.java",
"chars": 703,
"preview": "package awais.instagrabber.adapters.viewholder;\n\nimport android.view.View;\n\nimport androidx.annotation.NonNull;\nimport a"
},
{
"path": "app/src/main/java/awais/instagrabber/adapters/viewholder/SliderPhotoViewHolder.java",
"chars": 3811,
"preview": "package awais.instagrabber.adapters.viewholder;\n\nimport android.graphics.drawable.Animatable;\nimport android.net.Uri;\nim"
},
{
"path": "app/src/main/java/awais/instagrabber/adapters/viewholder/SliderVideoViewHolder.java",
"chars": 6455,
"preview": "package awais.instagrabber.adapters.viewholder;\n\nimport android.annotation.SuppressLint;\nimport android.view.GestureDete"
},
{
"path": "app/src/main/java/awais/instagrabber/adapters/viewholder/StoryListViewHolder.java",
"chars": 3438,
"preview": "package awais.instagrabber.adapters.viewholder;\n\nimport android.view.View;\n\nimport androidx.recyclerview.widget.Recycler"
},
{
"path": "app/src/main/java/awais/instagrabber/adapters/viewholder/TabViewHolder.java",
"chars": 3432,
"preview": "package awais.instagrabber.adapters.viewholder;\n\nimport android.annotation.SuppressLint;\nimport android.content.res.Colo"
},
{
"path": "app/src/main/java/awais/instagrabber/adapters/viewholder/TopicClusterViewHolder.java",
"chars": 9025,
"preview": "package awais.instagrabber.adapters.viewholder;\n\nimport android.content.res.Resources;\nimport android.graphics.Bitmap;\ni"
},
{
"path": "app/src/main/java/awais/instagrabber/adapters/viewholder/dialogs/KeywordsFilterDialogViewHolder.java",
"chars": 1735,
"preview": "package awais.instagrabber.adapters.viewholder.dialogs;\n\nimport android.content.Context;\nimport android.view.View;\nimpor"
},
{
"path": "app/src/main/java/awais/instagrabber/adapters/viewholder/directmessages/DirectInboxItemViewHolder.java",
"chars": 6646,
"preview": "package awais.instagrabber.adapters.viewholder.directmessages;\n\nimport android.content.res.Resources;\nimport android.gra"
},
{
"path": "app/src/main/java/awais/instagrabber/adapters/viewholder/directmessages/DirectItemActionLogViewHolder.java",
"chars": 4282,
"preview": "package awais.instagrabber.adapters.viewholder.directmessages;\n\nimport android.graphics.Typeface;\nimport android.text.Sp"
},
{
"path": "app/src/main/java/awais/instagrabber/adapters/viewholder/directmessages/DirectItemAnimatedMediaViewHolder.java",
"chars": 3820,
"preview": "package awais.instagrabber.adapters.viewholder.directmessages;\n\nimport android.view.View;\nimport android.view.ViewGroup;"
},
{
"path": "app/src/main/java/awais/instagrabber/adapters/viewholder/directmessages/DirectItemDefaultViewHolder.java",
"chars": 1800,
"preview": "package awais.instagrabber.adapters.viewholder.directmessages;\n\nimport android.content.Context;\n\nimport androidx.annotat"
},
{
"path": "app/src/main/java/awais/instagrabber/adapters/viewholder/directmessages/DirectItemLikeViewHolder.java",
"chars": 1399,
"preview": "package awais.instagrabber.adapters.viewholder.directmessages;\n\nimport androidx.annotation.NonNull;\nimport androidx.recy"
},
{
"path": "app/src/main/java/awais/instagrabber/adapters/viewholder/directmessages/DirectItemLinkViewHolder.java",
"chars": 4419,
"preview": "package awais.instagrabber.adapters.viewholder.directmessages;\n\nimport android.view.View;\nimport android.view.ViewGroup;"
},
{
"path": "app/src/main/java/awais/instagrabber/adapters/viewholder/directmessages/DirectItemMediaShareViewHolder.java",
"chars": 8823,
"preview": "package awais.instagrabber.adapters.viewholder.directmessages;\n\nimport android.text.TextUtils;\nimport android.view.View;"
},
{
"path": "app/src/main/java/awais/instagrabber/adapters/viewholder/directmessages/DirectItemMediaViewHolder.java",
"chars": 3746,
"preview": "package awais.instagrabber.adapters.viewholder.directmessages;\n\nimport android.view.View;\nimport android.view.ViewGroup;"
},
{
"path": "app/src/main/java/awais/instagrabber/adapters/viewholder/directmessages/DirectItemPlaceholderViewHolder.java",
"chars": 1881,
"preview": "package awais.instagrabber.adapters.viewholder.directmessages;\n\nimport android.view.View;\n\nimport androidx.annotation.No"
},
{
"path": "app/src/main/java/awais/instagrabber/adapters/viewholder/directmessages/DirectItemProfileViewHolder.java",
"chars": 6147,
"preview": "package awais.instagrabber.adapters.viewholder.directmessages;\n\nimport android.content.res.Resources;\nimport android.vie"
},
{
"path": "app/src/main/java/awais/instagrabber/adapters/viewholder/directmessages/DirectItemRavenMediaViewHolder.java",
"chars": 9543,
"preview": "package awais.instagrabber.adapters.viewholder.directmessages;\n\nimport android.view.View;\nimport android.view.ViewGroup;"
},
{
"path": "app/src/main/java/awais/instagrabber/adapters/viewholder/directmessages/DirectItemReelShareViewHolder.java",
"chars": 9263,
"preview": "package awais.instagrabber.adapters.viewholder.directmessages;\n\nimport android.view.Gravity;\nimport android.view.View;\n\n"
},
{
"path": "app/src/main/java/awais/instagrabber/adapters/viewholder/directmessages/DirectItemStoryShareViewHolder.java",
"chars": 5583,
"preview": "package awais.instagrabber.adapters.viewholder.directmessages;\n\nimport android.content.res.Resources;\nimport android.vie"
},
{
"path": "app/src/main/java/awais/instagrabber/adapters/viewholder/directmessages/DirectItemTextViewHolder.java",
"chars": 2188,
"preview": "package awais.instagrabber.adapters.viewholder.directmessages;\n\nimport androidx.annotation.NonNull;\n\nimport com.google.c"
},
{
"path": "app/src/main/java/awais/instagrabber/adapters/viewholder/directmessages/DirectItemVideoCallEventViewHolder.java",
"chars": 3645,
"preview": "package awais.instagrabber.adapters.viewholder.directmessages;\n\nimport android.text.Spannable;\nimport android.text.Spann"
},
{
"path": "app/src/main/java/awais/instagrabber/adapters/viewholder/directmessages/DirectItemViewHolder.java",
"chars": 29834,
"preview": "package awais.instagrabber.adapters.viewholder.directmessages;\n\nimport android.annotation.SuppressLint;\nimport android.c"
},
{
"path": "app/src/main/java/awais/instagrabber/adapters/viewholder/directmessages/DirectItemVoiceMediaViewHolder.java",
"chars": 8546,
"preview": "package awais.instagrabber.adapters.viewholder.directmessages;\n\nimport android.os.Handler;\nimport android.util.Log;\nimpo"
},
{
"path": "app/src/main/java/awais/instagrabber/adapters/viewholder/directmessages/DirectItemXmaViewHolder.java",
"chars": 3176,
"preview": "package awais.instagrabber.adapters.viewholder.directmessages;\n\nimport android.view.View;\nimport android.view.ViewGroup;"
},
{
"path": "app/src/main/java/awais/instagrabber/adapters/viewholder/directmessages/DirectPendingUserViewHolder.java",
"chars": 3747,
"preview": "package awais.instagrabber.adapters.viewholder.directmessages;\n\nimport android.graphics.drawable.Drawable;\nimport androi"
},
{
"path": "app/src/main/java/awais/instagrabber/adapters/viewholder/directmessages/DirectReactionViewHolder.java",
"chars": 2822,
"preview": "package awais.instagrabber.adapters.viewholder.directmessages;\n\nimport android.view.View;\n\nimport androidx.annotation.Nu"
},
{
"path": "app/src/main/java/awais/instagrabber/adapters/viewholder/directmessages/DirectUserViewHolder.java",
"chars": 4175,
"preview": "package awais.instagrabber.adapters.viewholder.directmessages;\n\nimport android.graphics.drawable.Drawable;\nimport androi"
},
{
"path": "app/src/main/java/awais/instagrabber/adapters/viewholder/directmessages/RecipientThreadViewHolder.java",
"chars": 3967,
"preview": "package awais.instagrabber.adapters.viewholder.directmessages;\n\nimport android.content.res.Resources;\nimport android.vie"
},
{
"path": "app/src/main/java/awais/instagrabber/adapters/viewholder/feed/FeedItemViewHolder.java",
"chars": 8194,
"preview": "package awais.instagrabber.adapters.viewholder.feed;\n\nimport android.graphics.drawable.Drawable;\nimport android.text.Spa"
},
{
"path": "app/src/main/java/awais/instagrabber/adapters/viewholder/feed/FeedPhotoViewHolder.java",
"chars": 3903,
"preview": "package awais.instagrabber.adapters.viewholder.feed;\n\nimport android.net.Uri;\nimport android.view.GestureDetector;\nimpor"
},
{
"path": "app/src/main/java/awais/instagrabber/adapters/viewholder/feed/FeedSliderViewHolder.java",
"chars": 7842,
"preview": "package awais.instagrabber.adapters.viewholder.feed;\n\nimport android.view.View;\nimport android.view.ViewGroup;\nimport an"
},
{
"path": "app/src/main/java/awais/instagrabber/adapters/viewholder/feed/FeedVideoViewHolder.java",
"chars": 7391,
"preview": "package awais.instagrabber.adapters.viewholder.feed;\n\nimport android.content.Context;\nimport android.os.Handler;\nimport "
},
{
"path": "app/src/main/java/awais/instagrabber/animations/CubicBezierInterpolator.java",
"chars": 2632,
"preview": "package awais.instagrabber.animations;\n\nimport android.graphics.PointF;\nimport android.view.animation.Interpolator;\n\npub"
},
{
"path": "app/src/main/java/awais/instagrabber/animations/FabAnimation.java",
"chars": 2015,
"preview": "package awais.instagrabber.animations;\n\nimport android.animation.Animator;\nimport android.animation.AnimatorListenerAdap"
},
{
"path": "app/src/main/java/awais/instagrabber/animations/ResizeAnimation.java",
"chars": 1562,
"preview": "package awais.instagrabber.animations;\n\nimport android.view.View;\nimport android.view.animation.Animation;\nimport androi"
},
{
"path": "app/src/main/java/awais/instagrabber/animations/RevealOutlineAnimation.java",
"chars": 2794,
"preview": "package awais.instagrabber.animations;\n\nimport android.animation.Animator;\nimport android.animation.AnimatorListenerAdap"
},
{
"path": "app/src/main/java/awais/instagrabber/animations/RoundedRectRevealOutlineProvider.java",
"chars": 2045,
"preview": "/*\n * Copyright (C) 2017 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"Lice"
},
{
"path": "app/src/main/java/awais/instagrabber/animations/ScaleAnimation.java",
"chars": 1371,
"preview": "package awais.instagrabber.animations;\n\nimport android.animation.AnimatorSet;\nimport android.animation.ObjectAnimator;\ni"
},
{
"path": "app/src/main/java/awais/instagrabber/asyncs/DiscoverPostFetchService.java",
"chars": 2712,
"preview": "package awais.instagrabber.asyncs;\n\nimport java.util.Collections;\nimport java.util.List;\nimport java.util.Objects;\nimpor"
},
{
"path": "app/src/main/java/awais/instagrabber/asyncs/FeedPostFetchService.java",
"chars": 2665,
"preview": "package awais.instagrabber.asyncs;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\nimport awais.instagrabber.custom"
},
{
"path": "app/src/main/java/awais/instagrabber/asyncs/HashtagPostFetchService.java",
"chars": 2841,
"preview": "package awais.instagrabber.asyncs;\n\nimport java.util.List;\n\nimport awais.instagrabber.customviews.helpers.PostFetcher;\ni"
},
{
"path": "app/src/main/java/awais/instagrabber/asyncs/LocationPostFetchService.java",
"chars": 2845,
"preview": "package awais.instagrabber.asyncs;\n\nimport java.util.List;\n\nimport awais.instagrabber.customviews.helpers.PostFetcher;\ni"
},
{
"path": "app/src/main/java/awais/instagrabber/asyncs/ProfilePostFetchService.java",
"chars": 2513,
"preview": "package awais.instagrabber.asyncs;\n\nimport java.util.List;\n\nimport awais.instagrabber.customviews.helpers.PostFetcher;\ni"
},
{
"path": "app/src/main/java/awais/instagrabber/asyncs/SavedPostFetchService.java",
"chars": 2947,
"preview": "package awais.instagrabber.asyncs;\n\nimport java.util.List;\n\nimport awais.instagrabber.customviews.helpers.PostFetcher;\ni"
},
{
"path": "app/src/main/java/awais/instagrabber/backup/BarinstaBackupAgent.kt",
"chars": 894,
"preview": "package awais.instagrabber.backup\n\nimport android.app.backup.BackupAgent\nimport android.app.backup.BackupDataInput\nimpor"
},
{
"path": "app/src/main/java/awais/instagrabber/broadcasts/DMRefreshBroadcastReceiver.java",
"chars": 831,
"preview": "package awais.instagrabber.broadcasts;\n\nimport android.content.BroadcastReceiver;\nimport android.content.Context;\nimport"
},
{
"path": "app/src/main/java/awais/instagrabber/customviews/BarinstaFragmentNavigator.kt",
"chars": 3778,
"preview": "package awais.instagrabber.customviews\n\nimport android.content.Context\nimport androidx.fragment.app.FragmentManager\nimpo"
},
{
"path": "app/src/main/java/awais/instagrabber/customviews/BarinstaNavHostFragment.kt",
"chars": 536,
"preview": "package awais.instagrabber.customviews\n\nimport androidx.navigation.NavHostController\nimport androidx.navigation.fragment"
},
{
"path": "app/src/main/java/awais/instagrabber/customviews/ChatMessageLayout.java",
"chars": 8048,
"preview": "package awais.instagrabber.customviews;\n\nimport android.content.Context;\nimport android.content.res.TypedArray;\nimport a"
},
{
"path": "app/src/main/java/awais/instagrabber/customviews/CircularImageView.java",
"chars": 2555,
"preview": "package awais.instagrabber.customviews;\n\nimport android.content.Context;\nimport android.content.res.Resources;\nimport an"
},
{
"path": "app/src/main/java/awais/instagrabber/customviews/CommentMentionClickSpan.java",
"chars": 434,
"preview": "package awais.instagrabber.customviews;\n\nimport android.text.TextPaint;\nimport android.text.style.ClickableSpan;\nimport "
},
{
"path": "app/src/main/java/awais/instagrabber/customviews/DirectItemContextMenu.java",
"chars": 22258,
"preview": "package awais.instagrabber.customviews;\n\nimport android.animation.Animator;\nimport android.animation.AnimatorListenerAda"
},
{
"path": "app/src/main/java/awais/instagrabber/customviews/DirectItemFrameLayout.java",
"chars": 4689,
"preview": "package awais.instagrabber.customviews;\n\nimport android.content.Context;\nimport android.os.Handler;\nimport android.util."
},
{
"path": "app/src/main/java/awais/instagrabber/customviews/FixedImageView.java",
"chars": 712,
"preview": "package awais.instagrabber.customviews;\n\nimport android.content.Context;\nimport android.util.AttributeSet;\n\nimport andro"
},
{
"path": "app/src/main/java/awais/instagrabber/customviews/FormattedNumberTextView.java",
"chars": 4935,
"preview": "package awais.instagrabber.customviews;\n\nimport android.content.Context;\nimport android.util.AttributeSet;\nimport androi"
},
{
"path": "app/src/main/java/awais/instagrabber/customviews/InsetsAnimationLinearLayout.java",
"chars": 9850,
"preview": "package awais.instagrabber.customviews;\n\nimport android.content.Context;\nimport android.os.Build;\nimport android.util.At"
},
{
"path": "app/src/main/java/awais/instagrabber/customviews/InsetsNotifyingCoordinatorLayout.java",
"chars": 1090,
"preview": "package awais.instagrabber.customviews;\n\nimport android.content.Context;\nimport android.util.AttributeSet;\nimport androi"
},
{
"path": "app/src/main/java/awais/instagrabber/customviews/InsetsNotifyingLinearLayout.java",
"chars": 1179,
"preview": "package awais.instagrabber.customviews;\n\nimport android.content.Context;\nimport android.util.AttributeSet;\nimport androi"
},
{
"path": "app/src/main/java/awais/instagrabber/customviews/KeyNotifyingEmojiEditText.java",
"chars": 1471,
"preview": "package awais.instagrabber.customviews;\n\nimport android.content.Context;\nimport android.util.AttributeSet;\nimport androi"
},
{
"path": "app/src/main/java/awais/instagrabber/customviews/MouseDrawer.java",
"chars": 41160,
"preview": "package awais.instagrabber.customviews;\n\nimport android.annotation.SuppressLint;\nimport android.content.Context;\nimport "
},
{
"path": "app/src/main/java/awais/instagrabber/customviews/PostsRecyclerView.java",
"chars": 13729,
"preview": "package awais.instagrabber.customviews;\n\nimport android.content.Context;\nimport android.util.AttributeSet;\nimport androi"
},
{
"path": "app/src/main/java/awais/instagrabber/customviews/PrimaryActionModeCallback.java",
"chars": 1917,
"preview": "package awais.instagrabber.customviews;\n\nimport android.view.ActionMode;\nimport android.view.Menu;\nimport android.view.M"
},
{
"path": "app/src/main/java/awais/instagrabber/customviews/ProfilePicView.java",
"chars": 4543,
"preview": "package awais.instagrabber.customviews;\n\nimport android.content.Context;\nimport android.content.res.TypedArray;\nimport a"
},
{
"path": "app/src/main/java/awais/instagrabber/customviews/RamboTextViewV2.java",
"chars": 6150,
"preview": "package awais.instagrabber.customviews;\n\nimport android.content.Context;\nimport android.text.InputFilter;\nimport android"
},
{
"path": "app/src/main/java/awais/instagrabber/customviews/ReactionEmojiTextView.java",
"chars": 3476,
"preview": "package awais.instagrabber.customviews;\n\nimport android.annotation.SuppressLint;\nimport android.content.Context;\nimport "
},
{
"path": "app/src/main/java/awais/instagrabber/customviews/RecordButton.java",
"chars": 3376,
"preview": "package awais.instagrabber.customviews;\n\nimport android.annotation.SuppressLint;\nimport android.content.Context;\nimport "
},
{
"path": "app/src/main/java/awais/instagrabber/customviews/RecordView.java",
"chars": 13633,
"preview": "package awais.instagrabber.customviews;\n\nimport android.content.Context;\nimport android.content.res.AssetFileDescriptor;"
},
{
"path": "app/src/main/java/awais/instagrabber/customviews/SharedElementTransitionDialogFragment.java",
"chars": 12034,
"preview": "package awais.instagrabber.customviews;\n\nimport android.animation.Animator;\nimport android.graphics.Rect;\nimport android"
},
{
"path": "app/src/main/java/awais/instagrabber/customviews/SquareImageView.java",
"chars": 778,
"preview": "package awais.instagrabber.customviews;\n\nimport android.content.Context;\nimport android.util.AttributeSet;\n\nimport andro"
},
{
"path": "app/src/main/java/awais/instagrabber/customviews/TextViewDrawableSize.java",
"chars": 3545,
"preview": "package awais.instagrabber.customviews;\n\nimport android.content.Context;\nimport android.content.res.TypedArray;\nimport a"
},
{
"path": "app/src/main/java/awais/instagrabber/customviews/Tooltip.java",
"chars": 3849,
"preview": "package awais.instagrabber.customviews;\n\nimport android.animation.Animator;\nimport android.animation.AnimatorListenerAda"
}
]
// ... and 855 more files (download for full content)
About this extraction
This page contains the full source code of the Android-Builds/barinsta GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 1055 files (4.2 MB), approximately 1.2M tokens, and a symbol index with 3305 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.