mirror of
				https://github.com/KokaKiwi/BarInsta
				synced 2025-11-04 05:25:35 +00:00 
			
		
		
		
	Convert Post view to a regular fragment instead of dialog.
Added global fragment animations too
This commit is contained in:
		
							parent
							
								
									3bbafc654c
								
							
						
					
					
						commit
						96da16ff84
					
				@ -651,7 +651,11 @@ public class MainActivity extends BaseLanguageActivity implements FragmentManage
 | 
			
		||||
        if (navController == null) return;
 | 
			
		||||
        final Bundle bundle = new Bundle();
 | 
			
		||||
        bundle.putString("username", "@" + username);
 | 
			
		||||
        navController.navigate(R.id.action_global_profileFragment, bundle);
 | 
			
		||||
        try {
 | 
			
		||||
            navController.navigate(R.id.action_global_profileFragment, bundle);
 | 
			
		||||
        } catch (Exception e) {
 | 
			
		||||
            Log.e(TAG, "showProfileView: ", e);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void showPostView(@NonNull final IntentModel intentModel) {
 | 
			
		||||
@ -664,11 +668,16 @@ public class MainActivity extends BaseLanguageActivity implements FragmentManage
 | 
			
		||||
        alertDialog.show();
 | 
			
		||||
        new PostFetcher(shortCode, feedModel -> {
 | 
			
		||||
            if (feedModel != null) {
 | 
			
		||||
                final PostViewV2Fragment fragment = PostViewV2Fragment
 | 
			
		||||
                        .builder(feedModel)
 | 
			
		||||
                        .build();
 | 
			
		||||
                fragment.setOnShowListener(dialog -> alertDialog.dismiss());
 | 
			
		||||
                fragment.show(getSupportFragmentManager(), "post_view");
 | 
			
		||||
                if (currentNavControllerLiveData == null) return;
 | 
			
		||||
                final NavController navController = currentNavControllerLiveData.getValue();
 | 
			
		||||
                if (navController == null) return;
 | 
			
		||||
                final Bundle bundle = new Bundle();
 | 
			
		||||
                bundle.putSerializable(PostViewV2Fragment.ARG_MEDIA, feedModel);
 | 
			
		||||
                try {
 | 
			
		||||
                    navController.navigate(R.id.action_global_post_view, bundle);
 | 
			
		||||
                } catch (Exception e) {
 | 
			
		||||
                    Log.e(TAG, "showPostView: ", e);
 | 
			
		||||
                }
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
            Toast.makeText(getApplicationContext(), R.string.post_not_found, Toast.LENGTH_SHORT).show();
 | 
			
		||||
@ -724,11 +733,19 @@ public class MainActivity extends BaseLanguageActivity implements FragmentManage
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setCollapsingView(@NonNull final View view) {
 | 
			
		||||
        binding.collapsingToolbarLayout.addView(view, 0);
 | 
			
		||||
        try {
 | 
			
		||||
            binding.collapsingToolbarLayout.addView(view, 0);
 | 
			
		||||
        } catch (Exception e) {
 | 
			
		||||
            Log.e(TAG, "setCollapsingView: ", e);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void removeCollapsingView(@NonNull final View view) {
 | 
			
		||||
        binding.collapsingToolbarLayout.removeView(view);
 | 
			
		||||
        try {
 | 
			
		||||
            binding.collapsingToolbarLayout.removeView(view);
 | 
			
		||||
        } catch (Exception e) {
 | 
			
		||||
            Log.e(TAG, "removeCollapsingView: ", e);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setToolbar(final Toolbar toolbar) {
 | 
			
		||||
 | 
			
		||||
@ -0,0 +1,75 @@
 | 
			
		||||
package awais.instagrabber.customviews;
 | 
			
		||||
 | 
			
		||||
import android.content.Context;
 | 
			
		||||
import android.os.Bundle;
 | 
			
		||||
 | 
			
		||||
import androidx.annotation.NonNull;
 | 
			
		||||
import androidx.annotation.Nullable;
 | 
			
		||||
import androidx.fragment.app.FragmentManager;
 | 
			
		||||
import androidx.navigation.NavDestination;
 | 
			
		||||
import androidx.navigation.NavOptions;
 | 
			
		||||
import androidx.navigation.Navigator;
 | 
			
		||||
import androidx.navigation.fragment.FragmentNavigator;
 | 
			
		||||
 | 
			
		||||
import awais.instagrabber.R;
 | 
			
		||||
 | 
			
		||||
@Navigator.Name("fragment")
 | 
			
		||||
public class FragmentNavigatorWithDefaultAnimations extends FragmentNavigator {
 | 
			
		||||
 | 
			
		||||
    private final NavOptions emptyNavOptions = new NavOptions.Builder().build();
 | 
			
		||||
    // private final NavOptions defaultNavOptions = new NavOptions.Builder()
 | 
			
		||||
    //         .setEnterAnim(R.animator.nav_default_enter_anim)
 | 
			
		||||
    //         .setExitAnim(R.animator.nav_default_exit_anim)
 | 
			
		||||
    //         .setPopEnterAnim(R.animator.nav_default_pop_enter_anim)
 | 
			
		||||
    //         .setPopExitAnim(R.animator.nav_default_pop_exit_anim)
 | 
			
		||||
    //         .build();
 | 
			
		||||
 | 
			
		||||
    private final NavOptions defaultNavOptions = new NavOptions.Builder()
 | 
			
		||||
            .setEnterAnim(R.anim.slide_in_right)
 | 
			
		||||
            .setExitAnim(R.anim.slide_out_left)
 | 
			
		||||
            .setPopEnterAnim(android.R.anim.slide_in_left)
 | 
			
		||||
            .setPopExitAnim(android.R.anim.slide_out_right)
 | 
			
		||||
            .build();
 | 
			
		||||
 | 
			
		||||
    public FragmentNavigatorWithDefaultAnimations(@NonNull final Context context,
 | 
			
		||||
                                                  @NonNull final FragmentManager manager,
 | 
			
		||||
                                                  final int containerId) {
 | 
			
		||||
        super(context, manager, containerId);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Nullable
 | 
			
		||||
    @Override
 | 
			
		||||
    public NavDestination navigate(@NonNull final Destination destination,
 | 
			
		||||
                                   @Nullable final Bundle args,
 | 
			
		||||
                                   @Nullable final NavOptions navOptions,
 | 
			
		||||
                                   @Nullable final Navigator.Extras navigatorExtras) {
 | 
			
		||||
        // this will try to fill in empty animations with defaults when no shared element transitions are set
 | 
			
		||||
        // https://developer.android.com/guide/navigation/navigation-animate-transitions#shared-element
 | 
			
		||||
        final boolean shouldUseTransitionsInstead = navigatorExtras != null;
 | 
			
		||||
        final NavOptions navOptions1 = shouldUseTransitionsInstead ? navOptions : fillEmptyAnimationsWithDefaults(navOptions);
 | 
			
		||||
        return super.navigate(destination, args, navOptions1, navigatorExtras);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private NavOptions fillEmptyAnimationsWithDefaults(@Nullable final NavOptions navOptions) {
 | 
			
		||||
        if (navOptions == null) {
 | 
			
		||||
            return defaultNavOptions;
 | 
			
		||||
        }
 | 
			
		||||
        return copyNavOptionsWithDefaultAnimations(navOptions);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @NonNull
 | 
			
		||||
    private NavOptions copyNavOptionsWithDefaultAnimations(@NonNull final NavOptions navOptions) {
 | 
			
		||||
        return new NavOptions.Builder()
 | 
			
		||||
                .setLaunchSingleTop(navOptions.shouldLaunchSingleTop())
 | 
			
		||||
                .setPopUpTo(navOptions.getPopUpTo(), navOptions.isPopUpToInclusive())
 | 
			
		||||
                .setEnterAnim(navOptions.getEnterAnim() == emptyNavOptions.getEnterAnim()
 | 
			
		||||
                              ? defaultNavOptions.getEnterAnim() : navOptions.getEnterAnim())
 | 
			
		||||
                .setExitAnim(navOptions.getExitAnim() == emptyNavOptions.getExitAnim()
 | 
			
		||||
                             ? defaultNavOptions.getExitAnim() : navOptions.getExitAnim())
 | 
			
		||||
                .setPopEnterAnim(navOptions.getPopEnterAnim() == emptyNavOptions.getPopEnterAnim()
 | 
			
		||||
                                 ? defaultNavOptions.getPopEnterAnim() : navOptions.getPopEnterAnim())
 | 
			
		||||
                .setPopExitAnim(navOptions.getPopExitAnim() == emptyNavOptions.getPopExitAnim()
 | 
			
		||||
                                ? defaultNavOptions.getPopExitAnim() : navOptions.getPopExitAnim())
 | 
			
		||||
                .build();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@ -0,0 +1,60 @@
 | 
			
		||||
package awais.instagrabber.customviews;
 | 
			
		||||
 | 
			
		||||
import android.os.Bundle;
 | 
			
		||||
 | 
			
		||||
import androidx.annotation.NavigationRes;
 | 
			
		||||
import androidx.annotation.NonNull;
 | 
			
		||||
import androidx.annotation.Nullable;
 | 
			
		||||
import androidx.navigation.NavController;
 | 
			
		||||
import androidx.navigation.Navigator;
 | 
			
		||||
import androidx.navigation.fragment.FragmentNavigator;
 | 
			
		||||
import androidx.navigation.fragment.NavHostFragment;
 | 
			
		||||
 | 
			
		||||
public class NavHostFragmentWithDefaultAnimations extends NavHostFragment {
 | 
			
		||||
    private static final String KEY_GRAPH_ID = "android-support-nav:fragment:graphId";
 | 
			
		||||
    private static final String KEY_START_DESTINATION_ARGS =
 | 
			
		||||
            "android-support-nav:fragment:startDestinationArgs";
 | 
			
		||||
    private static final String KEY_NAV_CONTROLLER_STATE =
 | 
			
		||||
            "android-support-nav:fragment:navControllerState";
 | 
			
		||||
    private static final String KEY_DEFAULT_NAV_HOST = "android-support-nav:fragment:defaultHost";
 | 
			
		||||
 | 
			
		||||
    @NonNull
 | 
			
		||||
    public static NavHostFragment create(@NavigationRes int graphResId) {
 | 
			
		||||
        return create(graphResId, null);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @NonNull
 | 
			
		||||
    public static NavHostFragment create(@NavigationRes int graphResId,
 | 
			
		||||
                                         @Nullable Bundle startDestinationArgs) {
 | 
			
		||||
        Bundle b = null;
 | 
			
		||||
        if (graphResId != 0) {
 | 
			
		||||
            b = new Bundle();
 | 
			
		||||
            b.putInt(KEY_GRAPH_ID, graphResId);
 | 
			
		||||
        }
 | 
			
		||||
        if (startDestinationArgs != null) {
 | 
			
		||||
            if (b == null) {
 | 
			
		||||
                b = new Bundle();
 | 
			
		||||
            }
 | 
			
		||||
            b.putBundle(KEY_START_DESTINATION_ARGS, startDestinationArgs);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        final NavHostFragmentWithDefaultAnimations result = new NavHostFragmentWithDefaultAnimations();
 | 
			
		||||
        if (b != null) {
 | 
			
		||||
            result.setArguments(b);
 | 
			
		||||
        }
 | 
			
		||||
        return result;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @NonNull
 | 
			
		||||
    @Override
 | 
			
		||||
    protected Navigator<? extends FragmentNavigator.Destination> createFragmentNavigator() {
 | 
			
		||||
        return new FragmentNavigatorWithDefaultAnimations(requireContext(), getChildFragmentManager(), getId());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    protected void onCreateNavController(@NonNull final NavController navController) {
 | 
			
		||||
        super.onCreateNavController(navController);
 | 
			
		||||
        navController.getNavigatorProvider()
 | 
			
		||||
                     .addNavigator(new FragmentNavigatorWithDefaultAnimations(requireContext(), getChildFragmentManager(), getId()));
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@ -3,6 +3,8 @@ package awais.instagrabber.customviews;
 | 
			
		||||
import android.content.Context;
 | 
			
		||||
import android.util.AttributeSet;
 | 
			
		||||
import android.util.Log;
 | 
			
		||||
import android.view.View;
 | 
			
		||||
import android.view.ViewGroup;
 | 
			
		||||
 | 
			
		||||
import androidx.annotation.NonNull;
 | 
			
		||||
import androidx.annotation.Nullable;
 | 
			
		||||
@ -25,6 +27,7 @@ import java.util.ArrayList;
 | 
			
		||||
import java.util.Arrays;
 | 
			
		||||
import java.util.Collections;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.function.Function;
 | 
			
		||||
 | 
			
		||||
import awais.instagrabber.adapters.FeedAdapterV2;
 | 
			
		||||
import awais.instagrabber.customviews.helpers.GridSpacingItemDecoration;
 | 
			
		||||
@ -60,14 +63,17 @@ public class PostsRecyclerView extends RecyclerView {
 | 
			
		||||
    private FeedAdapterV2.FeedItemCallback feedItemCallback;
 | 
			
		||||
    private boolean shouldScrollToTop;
 | 
			
		||||
    private FeedAdapterV2.SelectionModeCallback selectionModeCallback;
 | 
			
		||||
    private Function<ViewGroup, View> headerViewCreator;
 | 
			
		||||
    private Function<View, Void> headerBinder;
 | 
			
		||||
    private boolean refresh = true;
 | 
			
		||||
 | 
			
		||||
    private final List<FetchStatusChangeListener> fetchStatusChangeListeners = new ArrayList<>();
 | 
			
		||||
 | 
			
		||||
    private final FetchListener<List<Media>> fetchListener = new FetchListener<List<Media>>() {
 | 
			
		||||
        @Override
 | 
			
		||||
        public void onResult(final List<Media> result) {
 | 
			
		||||
            final int currentPage = lazyLoader.getCurrentPage();
 | 
			
		||||
            if (currentPage == 0) {
 | 
			
		||||
            if (refresh) {
 | 
			
		||||
                refresh = false;
 | 
			
		||||
                mediaViewModel.getList().postValue(result);
 | 
			
		||||
                shouldScrollToTop = true;
 | 
			
		||||
                dispatchFetchStatus();
 | 
			
		||||
@ -198,21 +204,19 @@ public class PostsRecyclerView extends RecyclerView {
 | 
			
		||||
            Log.e(TAG, "initSelf: ", e);
 | 
			
		||||
        }
 | 
			
		||||
        if (mediaViewModel == null) return;
 | 
			
		||||
        mediaViewModel.getList().observe(lifeCycleOwner, list -> {
 | 
			
		||||
            if (list.size() <= 0) return;
 | 
			
		||||
            feedAdapter.submitList(list, () -> {
 | 
			
		||||
                // postDelayed(this::fetchMoreIfPossible, 1000);
 | 
			
		||||
                if (!shouldScrollToTop) return;
 | 
			
		||||
                smoothScrollToPosition(0);
 | 
			
		||||
                shouldScrollToTop = false;
 | 
			
		||||
            });
 | 
			
		||||
        });
 | 
			
		||||
        mediaViewModel.getList().observe(lifeCycleOwner, list -> feedAdapter.submitList(list, () -> {
 | 
			
		||||
            // postDelayed(this::fetchMoreIfPossible, 1000);
 | 
			
		||||
            if (!shouldScrollToTop) return;
 | 
			
		||||
            shouldScrollToTop = false;
 | 
			
		||||
            post(() -> smoothScrollToPosition(0));
 | 
			
		||||
        }));
 | 
			
		||||
        postFetcher = new PostFetcher(postFetchService, fetchListener);
 | 
			
		||||
        if (layoutPreferences.getHasGap()) {
 | 
			
		||||
            addItemDecoration(gridSpacingItemDecoration);
 | 
			
		||||
        }
 | 
			
		||||
        setHasFixedSize(true);
 | 
			
		||||
        setNestedScrollingEnabled(true);
 | 
			
		||||
        setItemAnimator(null);
 | 
			
		||||
        lazyLoader = new RecyclerLazyLoaderAtEdge(layoutManager, (page) -> {
 | 
			
		||||
            if (postFetcher.hasMore()) {
 | 
			
		||||
                postFetcher.fetch();
 | 
			
		||||
@ -316,11 +320,12 @@ public class PostsRecyclerView extends RecyclerView {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void refresh() {
 | 
			
		||||
        refresh = true;
 | 
			
		||||
        if (lazyLoader != null) {
 | 
			
		||||
            lazyLoader.resetState();
 | 
			
		||||
        }
 | 
			
		||||
        if (postFetcher != null) {
 | 
			
		||||
            mediaViewModel.getList().postValue(Collections.emptyList());
 | 
			
		||||
            // mediaViewModel.getList().postValue(Collections.emptyList());
 | 
			
		||||
            postFetcher.reset();
 | 
			
		||||
            postFetcher.fetch();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@ -228,7 +228,7 @@ public class ZoomableDraweeView extends DraweeView<GenericDraweeHierarchy>
 | 
			
		||||
 | 
			
		||||
    public void setZoomingEnabled(boolean zoomingEnabled) {
 | 
			
		||||
        mZoomingEnabled = zoomingEnabled;
 | 
			
		||||
        mZoomableController.setEnabled(false);
 | 
			
		||||
        mZoomableController.setEnabled(zoomingEnabled);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
 | 
			
		||||
@ -7,17 +7,24 @@ import androidx.annotation.NonNull;
 | 
			
		||||
import androidx.recyclerview.widget.RecyclerView;
 | 
			
		||||
 | 
			
		||||
public class GridSpacingItemDecoration extends RecyclerView.ItemDecoration {
 | 
			
		||||
    private final int spacing;
 | 
			
		||||
    private final int halfSpace;
 | 
			
		||||
 | 
			
		||||
    private boolean hasHeader;
 | 
			
		||||
 | 
			
		||||
    public GridSpacingItemDecoration(int spacing) {
 | 
			
		||||
        this.spacing = spacing;
 | 
			
		||||
        halfSpace = spacing / 2;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void getItemOffsets(@NonNull Rect outRect, @NonNull View view, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) {
 | 
			
		||||
        final int halfSpace = spacing / 2;
 | 
			
		||||
        if (hasHeader && parent.getChildAdapterPosition(view) == 0) {
 | 
			
		||||
            outRect.bottom = halfSpace;
 | 
			
		||||
            outRect.left = -halfSpace;
 | 
			
		||||
            outRect.right = -halfSpace;
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
        if (parent.getPaddingLeft() != halfSpace) {
 | 
			
		||||
            parent.setPadding(halfSpace, halfSpace, halfSpace, halfSpace);
 | 
			
		||||
            parent.setPadding(halfSpace, hasHeader ? 0 : halfSpace, halfSpace, halfSpace);
 | 
			
		||||
            parent.setClipToPadding(false);
 | 
			
		||||
        }
 | 
			
		||||
        outRect.top = halfSpace;
 | 
			
		||||
@ -25,4 +32,8 @@ public class GridSpacingItemDecoration extends RecyclerView.ItemDecoration {
 | 
			
		||||
        outRect.left = halfSpace;
 | 
			
		||||
        outRect.right = halfSpace;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setHasHeader(final boolean hasHeader) {
 | 
			
		||||
        this.hasHeader = hasHeader;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@ -190,16 +190,15 @@ public class CollectionPostsFragment extends Fragment implements SwipeRefreshLay
 | 
			
		||||
                                    final View profilePicView,
 | 
			
		||||
                                    final View mainPostImage,
 | 
			
		||||
                                    final int position) {
 | 
			
		||||
            final PostViewV2Fragment.Builder builder = PostViewV2Fragment
 | 
			
		||||
                    .builder(feedModel);
 | 
			
		||||
            if (position >= 0) {
 | 
			
		||||
                builder.setPosition(position);
 | 
			
		||||
            final NavController navController = NavHostFragment.findNavController(CollectionPostsFragment.this);
 | 
			
		||||
            final Bundle bundle = new Bundle();
 | 
			
		||||
            bundle.putSerializable(PostViewV2Fragment.ARG_MEDIA, feedModel);
 | 
			
		||||
            bundle.putInt(PostViewV2Fragment.ARG_SLIDER_POSITION, position);
 | 
			
		||||
            try {
 | 
			
		||||
                navController.navigate(R.id.action_global_post_view, bundle);
 | 
			
		||||
            } catch (Exception e) {
 | 
			
		||||
                Log.e(TAG, "openPostDialog: ", e);
 | 
			
		||||
            }
 | 
			
		||||
            if (!layoutPreferences.isAnimationDisabled()) {
 | 
			
		||||
                builder.setSharedProfilePicElement(profilePicView)
 | 
			
		||||
                       .setSharedMainPostElement(mainPostImage);
 | 
			
		||||
            }
 | 
			
		||||
            builder.build().show(getChildFragmentManager(), "post_view");
 | 
			
		||||
        }
 | 
			
		||||
    };
 | 
			
		||||
    private final FeedAdapterV2.SelectionModeCallback selectionModeCallback = new FeedAdapterV2.SelectionModeCallback() {
 | 
			
		||||
@ -243,8 +242,10 @@ public class CollectionPostsFragment extends Fragment implements SwipeRefreshLay
 | 
			
		||||
        super.onCreate(savedInstanceState);
 | 
			
		||||
        fragmentActivity = (MainActivity) requireActivity();
 | 
			
		||||
        final TransitionSet transitionSet = new TransitionSet();
 | 
			
		||||
        final Context context = getContext();
 | 
			
		||||
        if (context == null) return;
 | 
			
		||||
        transitionSet.addTransition(new ChangeBounds())
 | 
			
		||||
                     .addTransition(TransitionInflater.from(getContext()).inflateTransition(android.R.transition.move))
 | 
			
		||||
                     .addTransition(TransitionInflater.from(context).inflateTransition(android.R.transition.move))
 | 
			
		||||
                     .setDuration(200);
 | 
			
		||||
        setSharedElementEnterTransition(transitionSet);
 | 
			
		||||
        postponeEnterTransition();
 | 
			
		||||
@ -280,7 +281,8 @@ public class CollectionPostsFragment extends Fragment implements SwipeRefreshLay
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void onCreateOptionsMenu(@NonNull final Menu menu, @NonNull final MenuInflater inflater) {
 | 
			
		||||
        inflater.inflate(R.menu.collection_posts_menu, menu);
 | 
			
		||||
        // delaying to make toolbar resume animation smooth, otherwise lags
 | 
			
		||||
        binding.getRoot().postDelayed(() -> inflater.inflate(R.menu.collection_posts_menu, menu), 500);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
@ -288,62 +290,60 @@ public class CollectionPostsFragment extends Fragment implements SwipeRefreshLay
 | 
			
		||||
        if (item.getItemId() == R.id.layout) {
 | 
			
		||||
            showPostsLayoutPreferences();
 | 
			
		||||
            return true;
 | 
			
		||||
        }
 | 
			
		||||
        else if (item.getItemId() == R.id.delete) {
 | 
			
		||||
        } else if (item.getItemId() == R.id.delete) {
 | 
			
		||||
            final Context context = getContext();
 | 
			
		||||
            if (context == null) return false;
 | 
			
		||||
            new AlertDialog.Builder(context)
 | 
			
		||||
                    .setTitle(R.string.delete_collection)
 | 
			
		||||
                    .setMessage(R.string.delete_collection_note)
 | 
			
		||||
                    .setPositiveButton(R.string.confirm, (d, w) -> {
 | 
			
		||||
                        collectionService.deleteCollection(
 | 
			
		||||
                                savedCollection.getId(),
 | 
			
		||||
                                new ServiceCallback<String>() {
 | 
			
		||||
                                    @Override
 | 
			
		||||
                                    public void onSuccess(final String result) {
 | 
			
		||||
                                        SavedCollectionsFragment.pleaseRefresh = true;
 | 
			
		||||
                                        NavHostFragment.findNavController(CollectionPostsFragment.this).navigateUp();
 | 
			
		||||
                                    }
 | 
			
		||||
                    .setPositiveButton(R.string.confirm, (d, w) -> collectionService.deleteCollection(
 | 
			
		||||
                            savedCollection.getId(),
 | 
			
		||||
                            new ServiceCallback<String>() {
 | 
			
		||||
                                @Override
 | 
			
		||||
                                public void onSuccess(final String result) {
 | 
			
		||||
                                    SavedCollectionsFragment.pleaseRefresh = true;
 | 
			
		||||
                                    NavHostFragment.findNavController(CollectionPostsFragment.this).navigateUp();
 | 
			
		||||
                                }
 | 
			
		||||
 | 
			
		||||
                                    @Override
 | 
			
		||||
                                    public void onFailure(final Throwable t) {
 | 
			
		||||
                                        Log.e(TAG, "Error deleting collection", t);
 | 
			
		||||
                                        try {
 | 
			
		||||
                                            Toast.makeText(context, t.getMessage(), Toast.LENGTH_SHORT).show();
 | 
			
		||||
                                        }
 | 
			
		||||
                                        catch(final Throwable e) {}
 | 
			
		||||
                                    }
 | 
			
		||||
                                });
 | 
			
		||||
                    })
 | 
			
		||||
                                @Override
 | 
			
		||||
                                public void onFailure(final Throwable t) {
 | 
			
		||||
                                    Log.e(TAG, "Error deleting collection", t);
 | 
			
		||||
                                    try {
 | 
			
		||||
                                        final Context context = getContext();
 | 
			
		||||
                                        if (context == null) return;
 | 
			
		||||
                                        Toast.makeText(context, t.getMessage(), Toast.LENGTH_SHORT).show();
 | 
			
		||||
                                    } catch (final Throwable ignored) {}
 | 
			
		||||
                                }
 | 
			
		||||
                            }))
 | 
			
		||||
                    .setNegativeButton(R.string.cancel, null)
 | 
			
		||||
                    .show();
 | 
			
		||||
        }
 | 
			
		||||
        else if (item.getItemId() == R.id.edit) {
 | 
			
		||||
        } else if (item.getItemId() == R.id.edit) {
 | 
			
		||||
            final Context context = getContext();
 | 
			
		||||
            if (context == null) return false;
 | 
			
		||||
            final EditText input = new EditText(context);
 | 
			
		||||
            new AlertDialog.Builder(context)
 | 
			
		||||
                    .setTitle(R.string.edit_collection)
 | 
			
		||||
                    .setView(input)
 | 
			
		||||
                    .setPositiveButton(R.string.confirm, (d, w) -> {
 | 
			
		||||
                        collectionService.editCollectionName(
 | 
			
		||||
                                savedCollection.getId(),
 | 
			
		||||
                                input.getText().toString(),
 | 
			
		||||
                                new ServiceCallback<String>() {
 | 
			
		||||
                                    @Override
 | 
			
		||||
                                    public void onSuccess(final String result) {
 | 
			
		||||
                                        binding.collapsingToolbarLayout.setTitle(input.getText().toString());
 | 
			
		||||
                                        SavedCollectionsFragment.pleaseRefresh = true;
 | 
			
		||||
                                    }
 | 
			
		||||
                    .setPositiveButton(R.string.confirm, (d, w) -> collectionService.editCollectionName(
 | 
			
		||||
                            savedCollection.getId(),
 | 
			
		||||
                            input.getText().toString(),
 | 
			
		||||
                            new ServiceCallback<String>() {
 | 
			
		||||
                                @Override
 | 
			
		||||
                                public void onSuccess(final String result) {
 | 
			
		||||
                                    binding.collapsingToolbarLayout.setTitle(input.getText().toString());
 | 
			
		||||
                                    SavedCollectionsFragment.pleaseRefresh = true;
 | 
			
		||||
                                }
 | 
			
		||||
 | 
			
		||||
                                    @Override
 | 
			
		||||
                                    public void onFailure(final Throwable t) {
 | 
			
		||||
                                        Log.e(TAG, "Error editing collection", t);
 | 
			
		||||
                                        try {
 | 
			
		||||
                                            Toast.makeText(context, t.getMessage(), Toast.LENGTH_SHORT).show();
 | 
			
		||||
                                        }
 | 
			
		||||
                                        catch(final Throwable e) {}
 | 
			
		||||
                                    }
 | 
			
		||||
                                });
 | 
			
		||||
                    })
 | 
			
		||||
                                @Override
 | 
			
		||||
                                public void onFailure(final Throwable t) {
 | 
			
		||||
                                    Log.e(TAG, "Error editing collection", t);
 | 
			
		||||
                                    try {
 | 
			
		||||
                                        final Context context = getContext();
 | 
			
		||||
                                        if (context == null) return;
 | 
			
		||||
                                        Toast.makeText(context, t.getMessage(), Toast.LENGTH_SHORT).show();
 | 
			
		||||
                                    } catch (final Throwable ignored) {}
 | 
			
		||||
                                }
 | 
			
		||||
                            }))
 | 
			
		||||
                    .setNegativeButton(R.string.cancel, null)
 | 
			
		||||
                    .show();
 | 
			
		||||
        }
 | 
			
		||||
@ -443,8 +443,8 @@ public class CollectionPostsFragment extends Fragment implements SwipeRefreshLay
 | 
			
		||||
 | 
			
		||||
    private void setupCover() {
 | 
			
		||||
        final String coverUrl = ResponseBodyUtils.getImageUrl(savedCollection.getCoverMedias() == null
 | 
			
		||||
                ? savedCollection.getCoverMedia()
 | 
			
		||||
                : savedCollection.getCoverMedias().get(0));
 | 
			
		||||
                                                              ? savedCollection.getCoverMedia()
 | 
			
		||||
                                                              : savedCollection.getCoverMedias().get(0));
 | 
			
		||||
        final DraweeController controller = Fresco
 | 
			
		||||
                .newDraweeControllerBuilder()
 | 
			
		||||
                .setOldController(binding.cover.getController())
 | 
			
		||||
 | 
			
		||||
@ -1,5 +1,6 @@
 | 
			
		||||
package awais.instagrabber.fragments;
 | 
			
		||||
 | 
			
		||||
import android.annotation.SuppressLint;
 | 
			
		||||
import android.content.Context;
 | 
			
		||||
import android.content.pm.PackageManager;
 | 
			
		||||
import android.graphics.Typeface;
 | 
			
		||||
@ -23,13 +24,14 @@ import androidx.activity.OnBackPressedDispatcher;
 | 
			
		||||
import androidx.annotation.NonNull;
 | 
			
		||||
import androidx.annotation.Nullable;
 | 
			
		||||
import androidx.appcompat.app.ActionBar;
 | 
			
		||||
import androidx.coordinatorlayout.widget.CoordinatorLayout;
 | 
			
		||||
import androidx.constraintlayout.motion.widget.MotionLayout;
 | 
			
		||||
import androidx.constraintlayout.motion.widget.MotionScene;
 | 
			
		||||
import androidx.core.content.PermissionChecker;
 | 
			
		||||
import androidx.fragment.app.Fragment;
 | 
			
		||||
import androidx.fragment.app.FragmentManager;
 | 
			
		||||
import androidx.navigation.NavController;
 | 
			
		||||
import androidx.navigation.NavDirections;
 | 
			
		||||
import androidx.navigation.fragment.NavHostFragment;
 | 
			
		||||
import androidx.recyclerview.widget.RecyclerView;
 | 
			
		||||
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
 | 
			
		||||
 | 
			
		||||
import com.google.android.material.snackbar.BaseTransientBottomBar;
 | 
			
		||||
@ -76,9 +78,6 @@ import static androidx.core.content.PermissionChecker.checkSelfPermission;
 | 
			
		||||
import static awais.instagrabber.utils.DownloadUtils.WRITE_PERMISSION;
 | 
			
		||||
import static awais.instagrabber.utils.Utils.settingsHelper;
 | 
			
		||||
 | 
			
		||||
//import awaisomereport.LogCollector;
 | 
			
		||||
//import static awais.instagrabber.utils.Utils.logCollector;
 | 
			
		||||
 | 
			
		||||
public class HashTagFragment extends Fragment implements SwipeRefreshLayout.OnRefreshListener {
 | 
			
		||||
    private static final String TAG = "HashTagFragment";
 | 
			
		||||
    private static final int STORAGE_PERM_REQUEST_CODE = 8020;
 | 
			
		||||
@ -88,7 +87,7 @@ public class HashTagFragment extends Fragment implements SwipeRefreshLayout.OnRe
 | 
			
		||||
 | 
			
		||||
    private MainActivity fragmentActivity;
 | 
			
		||||
    private FragmentHashtagBinding binding;
 | 
			
		||||
    private CoordinatorLayout root;
 | 
			
		||||
    private MotionLayout root;
 | 
			
		||||
    private boolean shouldRefresh = true;
 | 
			
		||||
    private boolean hasStories = false;
 | 
			
		||||
    private boolean opening = false;
 | 
			
		||||
@ -227,17 +226,15 @@ public class HashTagFragment extends Fragment implements SwipeRefreshLayout.OnRe
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
            opening = true;
 | 
			
		||||
            final PostViewV2Fragment.Builder builder = PostViewV2Fragment.builder(feedModel);
 | 
			
		||||
            if (position >= 0) {
 | 
			
		||||
                builder.setPosition(position);
 | 
			
		||||
            final NavController navController = NavHostFragment.findNavController(HashTagFragment.this);
 | 
			
		||||
            final Bundle bundle = new Bundle();
 | 
			
		||||
            bundle.putSerializable(PostViewV2Fragment.ARG_MEDIA, feedModel);
 | 
			
		||||
            bundle.putInt(PostViewV2Fragment.ARG_SLIDER_POSITION, position);
 | 
			
		||||
            try {
 | 
			
		||||
                navController.navigate(R.id.action_global_post_view, bundle);
 | 
			
		||||
            } catch (Exception e) {
 | 
			
		||||
                Log.e(TAG, "openPostDialog: ", e);
 | 
			
		||||
            }
 | 
			
		||||
            if (!layoutPreferences.isAnimationDisabled()) {
 | 
			
		||||
                builder.setSharedProfilePicElement(profilePicView)
 | 
			
		||||
                       .setSharedMainPostElement(mainPostImage);
 | 
			
		||||
            }
 | 
			
		||||
            final FragmentManager fragmentManager = getChildFragmentManager();
 | 
			
		||||
            if (fragmentManager.isDestroyed()) return;
 | 
			
		||||
            builder.build().show(fragmentManager, "post_view");
 | 
			
		||||
            opening = false;
 | 
			
		||||
        }
 | 
			
		||||
    };
 | 
			
		||||
@ -307,13 +304,11 @@ public class HashTagFragment extends Fragment implements SwipeRefreshLayout.OnRe
 | 
			
		||||
    public View onCreateView(@NonNull final LayoutInflater inflater, @Nullable final ViewGroup container, @Nullable final Bundle savedInstanceState) {
 | 
			
		||||
        if (root != null) {
 | 
			
		||||
            shouldRefresh = false;
 | 
			
		||||
            fragmentActivity.setCollapsingView(hashtagDetailsBinding.getRoot());
 | 
			
		||||
            return root;
 | 
			
		||||
        }
 | 
			
		||||
        binding = FragmentHashtagBinding.inflate(inflater, container, false);
 | 
			
		||||
        root = binding.getRoot();
 | 
			
		||||
        hashtagDetailsBinding = LayoutHashtagDetailsBinding.inflate(inflater, fragmentActivity.getCollapsingToolbarView(), false);
 | 
			
		||||
        fragmentActivity.setCollapsingView(hashtagDetailsBinding.getRoot());
 | 
			
		||||
        hashtagDetailsBinding = binding.header;
 | 
			
		||||
        return root;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@ -370,14 +365,6 @@ public class HashTagFragment extends Fragment implements SwipeRefreshLayout.OnRe
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void onDestroyView() {
 | 
			
		||||
        super.onDestroyView();
 | 
			
		||||
        if (hashtagDetailsBinding != null) {
 | 
			
		||||
            fragmentActivity.removeCollapsingView(hashtagDetailsBinding.getRoot());
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void init() {
 | 
			
		||||
        if (getArguments() == null) return;
 | 
			
		||||
        final HashTagFragmentArgs fragmentArgs = HashTagFragmentArgs.fromBundle(getArguments());
 | 
			
		||||
@ -402,6 +389,17 @@ public class HashTagFragment extends Fragment implements SwipeRefreshLayout.OnRe
 | 
			
		||||
                     .setSelectionModeCallback(selectionModeCallback)
 | 
			
		||||
                     .init();
 | 
			
		||||
        binding.swipeRefreshLayout.setRefreshing(true);
 | 
			
		||||
        binding.posts.addOnScrollListener(new RecyclerView.OnScrollListener() {
 | 
			
		||||
            @Override
 | 
			
		||||
            public void onScrolled(@NonNull final RecyclerView recyclerView, final int dx, final int dy) {
 | 
			
		||||
                super.onScrolled(recyclerView, dx, dy);
 | 
			
		||||
                final boolean canScrollVertically = recyclerView.canScrollVertically(-1);
 | 
			
		||||
                final MotionScene.Transition transition = root.getTransition(R.id.transition);
 | 
			
		||||
                if (transition != null) {
 | 
			
		||||
                    transition.setEnable(!canScrollVertically);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void setHashtagDetails() {
 | 
			
		||||
@ -428,47 +426,49 @@ public class HashTagFragment extends Fragment implements SwipeRefreshLayout.OnRe
 | 
			
		||||
                final String csrfToken = CookieUtils.getCsrfTokenFromCookie(cookie);
 | 
			
		||||
                final long userId = CookieUtils.getUserIdFromCookie(cookie);
 | 
			
		||||
                final String deviceUuid = Utils.settingsHelper.getString(Constants.DEVICE_UUID);
 | 
			
		||||
                if (csrfToken != null && userId != 0 && deviceUuid != null) {
 | 
			
		||||
                if (csrfToken != null && userId != 0) {
 | 
			
		||||
                    hashtagDetailsBinding.btnFollowTag.setClickable(false);
 | 
			
		||||
                    tagsService.changeFollow(hashtagModel.getFollowing() == FollowingType.FOLLOWING ? "unfollow" : "follow",
 | 
			
		||||
                                             hashtag,
 | 
			
		||||
                                             csrfToken,
 | 
			
		||||
                                             userId,
 | 
			
		||||
                                             deviceUuid,
 | 
			
		||||
                                             new ServiceCallback<Boolean>() {
 | 
			
		||||
                        @Override
 | 
			
		||||
                        public void onSuccess(final Boolean result) {
 | 
			
		||||
                            hashtagDetailsBinding.btnFollowTag.setClickable(true);
 | 
			
		||||
                            if (!result) {
 | 
			
		||||
                                Log.e(TAG, "onSuccess: result is false");
 | 
			
		||||
                                Snackbar.make(root, R.string.downloader_unknown_error, BaseTransientBottomBar.LENGTH_LONG)
 | 
			
		||||
                                        .show();
 | 
			
		||||
                                return;
 | 
			
		||||
                            }
 | 
			
		||||
                            hashtagDetailsBinding.btnFollowTag.setText(R.string.unfollow);
 | 
			
		||||
                            hashtagDetailsBinding.btnFollowTag.setChipIconResource(R.drawable.ic_outline_person_add_disabled_24);
 | 
			
		||||
                        }
 | 
			
		||||
                    tagsService.changeFollow(
 | 
			
		||||
                            hashtagModel.getFollowing() == FollowingType.FOLLOWING ? "unfollow" : "follow",
 | 
			
		||||
                            hashtag,
 | 
			
		||||
                            csrfToken,
 | 
			
		||||
                            userId,
 | 
			
		||||
                            deviceUuid,
 | 
			
		||||
                            new ServiceCallback<Boolean>() {
 | 
			
		||||
                                @Override
 | 
			
		||||
                                public void onSuccess(final Boolean result) {
 | 
			
		||||
                                    hashtagDetailsBinding.btnFollowTag.setClickable(true);
 | 
			
		||||
                                    if (!result) {
 | 
			
		||||
                                        Log.e(TAG, "onSuccess: result is false");
 | 
			
		||||
                                        Snackbar.make(root, R.string.downloader_unknown_error, BaseTransientBottomBar.LENGTH_LONG)
 | 
			
		||||
                                                .show();
 | 
			
		||||
                                        return;
 | 
			
		||||
                                    }
 | 
			
		||||
                                    hashtagDetailsBinding.btnFollowTag.setText(R.string.unfollow);
 | 
			
		||||
                                    hashtagDetailsBinding.btnFollowTag.setChipIconResource(R.drawable.ic_outline_person_add_disabled_24);
 | 
			
		||||
                                }
 | 
			
		||||
 | 
			
		||||
                        @Override
 | 
			
		||||
                        public void onFailure(@NonNull final Throwable t) {
 | 
			
		||||
                            hashtagDetailsBinding.btnFollowTag.setClickable(true);
 | 
			
		||||
                            Log.e(TAG, "onFailure: ", t);
 | 
			
		||||
                            final String message = t.getMessage();
 | 
			
		||||
                            Snackbar.make(root,
 | 
			
		||||
                                          message != null ? message
 | 
			
		||||
                                                          : getString(R.string.downloader_unknown_error),
 | 
			
		||||
                                          BaseTransientBottomBar.LENGTH_LONG)
 | 
			
		||||
                                    .show();
 | 
			
		||||
                        }
 | 
			
		||||
                    });
 | 
			
		||||
                    return;
 | 
			
		||||
                                @Override
 | 
			
		||||
                                public void onFailure(@NonNull final Throwable t) {
 | 
			
		||||
                                    hashtagDetailsBinding.btnFollowTag.setClickable(true);
 | 
			
		||||
                                    Log.e(TAG, "onFailure: ", t);
 | 
			
		||||
                                    final String message = t.getMessage();
 | 
			
		||||
                                    Snackbar.make(
 | 
			
		||||
                                            root,
 | 
			
		||||
                                            message != null ? message : getString(R.string.downloader_unknown_error),
 | 
			
		||||
                                            BaseTransientBottomBar.LENGTH_LONG)
 | 
			
		||||
                                            .show();
 | 
			
		||||
                                }
 | 
			
		||||
                            });
 | 
			
		||||
                }
 | 
			
		||||
            });
 | 
			
		||||
        } else {
 | 
			
		||||
            hashtagDetailsBinding.btnFollowTag.setVisibility(View.GONE);
 | 
			
		||||
        }
 | 
			
		||||
        hashtagDetailsBinding.favChip.setVisibility(View.VISIBLE);
 | 
			
		||||
        final FavoriteRepository favoriteRepository = FavoriteRepository.getInstance(FavoriteDataSource.getInstance(getContext()));
 | 
			
		||||
        final Context context = getContext();
 | 
			
		||||
        if (context == null) return;
 | 
			
		||||
        final FavoriteRepository favoriteRepository = FavoriteRepository.getInstance(FavoriteDataSource.getInstance(context));
 | 
			
		||||
        favoriteRepository.getFavorite(hashtag, FavoriteType.HASHTAG, new RepositoryCallback<Favorite>() {
 | 
			
		||||
            @Override
 | 
			
		||||
            public void onSuccess(final Favorite result) {
 | 
			
		||||
@ -557,7 +557,7 @@ public class HashTagFragment extends Fragment implements SwipeRefreshLayout.OnRe
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void showSnackbar(final String message) {
 | 
			
		||||
        final Snackbar snackbar = Snackbar.make(root, message, BaseTransientBottomBar.LENGTH_LONG);
 | 
			
		||||
        @SuppressLint("ShowToast") final Snackbar snackbar = Snackbar.make(root, message, BaseTransientBottomBar.LENGTH_LONG);
 | 
			
		||||
        snackbar.setAction(R.string.ok, v1 -> snackbar.dismiss())
 | 
			
		||||
                .setAnimationMode(BaseTransientBottomBar.ANIMATION_MODE_SLIDE)
 | 
			
		||||
                .setAnchorView(fragmentActivity.getBottomNavView())
 | 
			
		||||
 | 
			
		||||
@ -22,13 +22,14 @@ import androidx.activity.OnBackPressedDispatcher;
 | 
			
		||||
import androidx.annotation.NonNull;
 | 
			
		||||
import androidx.annotation.Nullable;
 | 
			
		||||
import androidx.appcompat.app.ActionBar;
 | 
			
		||||
import androidx.coordinatorlayout.widget.CoordinatorLayout;
 | 
			
		||||
import androidx.constraintlayout.motion.widget.MotionLayout;
 | 
			
		||||
import androidx.constraintlayout.motion.widget.MotionScene;
 | 
			
		||||
import androidx.core.content.PermissionChecker;
 | 
			
		||||
import androidx.fragment.app.Fragment;
 | 
			
		||||
import androidx.fragment.app.FragmentManager;
 | 
			
		||||
import androidx.navigation.NavController;
 | 
			
		||||
import androidx.navigation.NavDirections;
 | 
			
		||||
import androidx.navigation.fragment.NavHostFragment;
 | 
			
		||||
import androidx.recyclerview.widget.RecyclerView;
 | 
			
		||||
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
 | 
			
		||||
 | 
			
		||||
import com.google.android.material.snackbar.BaseTransientBottomBar;
 | 
			
		||||
@ -73,9 +74,6 @@ import static androidx.core.content.PermissionChecker.checkSelfPermission;
 | 
			
		||||
import static awais.instagrabber.utils.DownloadUtils.WRITE_PERMISSION;
 | 
			
		||||
import static awais.instagrabber.utils.Utils.settingsHelper;
 | 
			
		||||
 | 
			
		||||
//import awaisomereport.LogCollector;
 | 
			
		||||
//import static awais.instagrabber.utils.Utils.logCollector;
 | 
			
		||||
 | 
			
		||||
public class LocationFragment extends Fragment implements SwipeRefreshLayout.OnRefreshListener {
 | 
			
		||||
    private static final String TAG = "LocationFragment";
 | 
			
		||||
    private static final int STORAGE_PERM_REQUEST_CODE = 8020;
 | 
			
		||||
@ -83,7 +81,7 @@ public class LocationFragment extends Fragment implements SwipeRefreshLayout.OnR
 | 
			
		||||
 | 
			
		||||
    private MainActivity fragmentActivity;
 | 
			
		||||
    private FragmentLocationBinding binding;
 | 
			
		||||
    private CoordinatorLayout root;
 | 
			
		||||
    private MotionLayout root;
 | 
			
		||||
    private boolean shouldRefresh = true;
 | 
			
		||||
    private boolean hasStories = false;
 | 
			
		||||
    private boolean opening = false;
 | 
			
		||||
@ -219,18 +217,15 @@ public class LocationFragment extends Fragment implements SwipeRefreshLayout.OnR
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
            opening = true;
 | 
			
		||||
            final PostViewV2Fragment.Builder builder = PostViewV2Fragment
 | 
			
		||||
                    .builder(feedModel);
 | 
			
		||||
            if (position >= 0) {
 | 
			
		||||
                builder.setPosition(position);
 | 
			
		||||
            final NavController navController = NavHostFragment.findNavController(LocationFragment.this);
 | 
			
		||||
            final Bundle bundle = new Bundle();
 | 
			
		||||
            bundle.putSerializable(PostViewV2Fragment.ARG_MEDIA, feedModel);
 | 
			
		||||
            bundle.putInt(PostViewV2Fragment.ARG_SLIDER_POSITION, position);
 | 
			
		||||
            try {
 | 
			
		||||
                navController.navigate(R.id.action_global_post_view, bundle);
 | 
			
		||||
            } catch (Exception e) {
 | 
			
		||||
                Log.e(TAG, "openPostDialog: ", e);
 | 
			
		||||
            }
 | 
			
		||||
            if (!layoutPreferences.isAnimationDisabled()) {
 | 
			
		||||
                builder.setSharedProfilePicElement(profilePicView)
 | 
			
		||||
                       .setSharedMainPostElement(mainPostImage);
 | 
			
		||||
            }
 | 
			
		||||
            final FragmentManager fragmentManager = getChildFragmentManager();
 | 
			
		||||
            if (fragmentManager.isDestroyed()) return;
 | 
			
		||||
            builder.build().show(fragmentManager, "post_view");
 | 
			
		||||
            opening = false;
 | 
			
		||||
        }
 | 
			
		||||
    };
 | 
			
		||||
@ -302,13 +297,11 @@ public class LocationFragment extends Fragment implements SwipeRefreshLayout.OnR
 | 
			
		||||
                             @Nullable final Bundle savedInstanceState) {
 | 
			
		||||
        if (root != null) {
 | 
			
		||||
            shouldRefresh = false;
 | 
			
		||||
            fragmentActivity.setCollapsingView(locationDetailsBinding.getRoot());
 | 
			
		||||
            return root;
 | 
			
		||||
        }
 | 
			
		||||
        binding = FragmentLocationBinding.inflate(inflater, container, false);
 | 
			
		||||
        root = binding.getRoot();
 | 
			
		||||
        locationDetailsBinding = LayoutLocationDetailsBinding.inflate(inflater, fragmentActivity.getCollapsingToolbarView(), false);
 | 
			
		||||
        fragmentActivity.setCollapsingView(locationDetailsBinding.getRoot());
 | 
			
		||||
        locationDetailsBinding = binding.header;
 | 
			
		||||
        return root;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@ -365,14 +358,6 @@ public class LocationFragment extends Fragment implements SwipeRefreshLayout.OnR
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void onDestroyView() {
 | 
			
		||||
        super.onDestroyView();
 | 
			
		||||
        if (locationDetailsBinding != null) {
 | 
			
		||||
            fragmentActivity.removeCollapsingView(locationDetailsBinding.getRoot());
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void init() {
 | 
			
		||||
        if (getArguments() == null) return;
 | 
			
		||||
        final LocationFragmentArgs fragmentArgs = LocationFragmentArgs.fromBundle(getArguments());
 | 
			
		||||
@ -393,6 +378,17 @@ public class LocationFragment extends Fragment implements SwipeRefreshLayout.OnR
 | 
			
		||||
                     .setSelectionModeCallback(selectionModeCallback)
 | 
			
		||||
                     .init();
 | 
			
		||||
        binding.swipeRefreshLayout.setRefreshing(true);
 | 
			
		||||
        binding.posts.addOnScrollListener(new RecyclerView.OnScrollListener() {
 | 
			
		||||
            @Override
 | 
			
		||||
            public void onScrolled(@NonNull final RecyclerView recyclerView, final int dx, final int dy) {
 | 
			
		||||
                super.onScrolled(recyclerView, dx, dy);
 | 
			
		||||
                final boolean canScrollVertically = recyclerView.canScrollVertically(-1);
 | 
			
		||||
                final MotionScene.Transition transition = root.getTransition(R.id.transition);
 | 
			
		||||
                if (transition != null) {
 | 
			
		||||
                    transition.setEnable(!canScrollVertically);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void fetchLocationModel() {
 | 
			
		||||
 | 
			
		||||
@ -20,6 +20,7 @@ import androidx.appcompat.app.AppCompatActivity;
 | 
			
		||||
import androidx.core.app.NotificationManagerCompat;
 | 
			
		||||
import androidx.fragment.app.Fragment;
 | 
			
		||||
import androidx.lifecycle.ViewModelProvider;
 | 
			
		||||
import androidx.navigation.NavController;
 | 
			
		||||
import androidx.navigation.NavDirections;
 | 
			
		||||
import androidx.navigation.fragment.NavHostFragment;
 | 
			
		||||
import androidx.recyclerview.widget.LinearLayoutManager;
 | 
			
		||||
@ -94,8 +95,8 @@ public final class NotificationsViewerFragment extends Fragment implements Swipe
 | 
			
		||||
            final long mediaId = Long.parseLong(notificationImage.getId().split("_")[0]);
 | 
			
		||||
            if (model.getType() == NotificationType.RESPONDED_STORY) {
 | 
			
		||||
                final StoryViewerOptions options = StoryViewerOptions.forStory(
 | 
			
		||||
                                        mediaId,
 | 
			
		||||
                                        model.getArgs().getUsername());
 | 
			
		||||
                        mediaId,
 | 
			
		||||
                        model.getArgs().getUsername());
 | 
			
		||||
                final Bundle bundle = new Bundle();
 | 
			
		||||
                bundle.putSerializable("options", options);
 | 
			
		||||
                NavHostFragment.findNavController(NotificationsViewerFragment.this).navigate(R.id.action_notifications_to_story, bundle);
 | 
			
		||||
@ -108,11 +109,14 @@ public final class NotificationsViewerFragment extends Fragment implements Swipe
 | 
			
		||||
                mediaService.fetch(mediaId, new ServiceCallback<Media>() {
 | 
			
		||||
                    @Override
 | 
			
		||||
                    public void onSuccess(final Media feedModel) {
 | 
			
		||||
                        final PostViewV2Fragment fragment = PostViewV2Fragment
 | 
			
		||||
                                .builder(feedModel)
 | 
			
		||||
                                .build();
 | 
			
		||||
                        fragment.setOnShowListener(dialog -> alertDialog.dismiss());
 | 
			
		||||
                        fragment.show(getChildFragmentManager(), "post_view");
 | 
			
		||||
                        final NavController navController = NavHostFragment.findNavController(NotificationsViewerFragment.this);
 | 
			
		||||
                        final Bundle bundle = new Bundle();
 | 
			
		||||
                        bundle.putSerializable(PostViewV2Fragment.ARG_MEDIA, feedModel);
 | 
			
		||||
                        try {
 | 
			
		||||
                            navController.navigate(R.id.action_global_post_view, bundle);
 | 
			
		||||
                        } catch (Exception e) {
 | 
			
		||||
                            Log.e(TAG, "onSuccess: ", e);
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
                    @Override
 | 
			
		||||
 | 
			
		||||
@ -1,50 +1,34 @@
 | 
			
		||||
package awais.instagrabber.fragments;
 | 
			
		||||
 | 
			
		||||
import android.animation.Animator;
 | 
			
		||||
import android.animation.AnimatorListenerAdapter;
 | 
			
		||||
import android.animation.ObjectAnimator;
 | 
			
		||||
import android.animation.PropertyValuesHolder;
 | 
			
		||||
import android.animation.ValueAnimator;
 | 
			
		||||
import android.annotation.SuppressLint;
 | 
			
		||||
import android.app.Dialog;
 | 
			
		||||
import android.content.Context;
 | 
			
		||||
import android.content.DialogInterface;
 | 
			
		||||
import android.content.Intent;
 | 
			
		||||
import android.content.pm.PackageManager;
 | 
			
		||||
import android.graphics.Color;
 | 
			
		||||
import android.graphics.drawable.Animatable;
 | 
			
		||||
import android.graphics.drawable.ColorDrawable;
 | 
			
		||||
import android.content.res.ColorStateList;
 | 
			
		||||
import android.content.res.Resources;
 | 
			
		||||
import android.graphics.drawable.Drawable;
 | 
			
		||||
import android.net.Uri;
 | 
			
		||||
import android.os.Bundle;
 | 
			
		||||
import android.os.Handler;
 | 
			
		||||
import android.text.SpannableStringBuilder;
 | 
			
		||||
import android.text.Spanned;
 | 
			
		||||
import android.util.Log;
 | 
			
		||||
import android.view.GestureDetector;
 | 
			
		||||
import android.view.Gravity;
 | 
			
		||||
import android.view.LayoutInflater;
 | 
			
		||||
import android.view.MenuItem;
 | 
			
		||||
import android.view.MotionEvent;
 | 
			
		||||
import android.view.View;
 | 
			
		||||
import android.view.ViewGroup;
 | 
			
		||||
import android.view.ViewTreeObserver;
 | 
			
		||||
import android.view.Window;
 | 
			
		||||
import android.view.WindowManager;
 | 
			
		||||
import android.widget.FrameLayout;
 | 
			
		||||
import android.widget.ScrollView;
 | 
			
		||||
import android.widget.Toast;
 | 
			
		||||
import android.widget.ViewSwitcher;
 | 
			
		||||
 | 
			
		||||
import androidx.annotation.NonNull;
 | 
			
		||||
import androidx.annotation.Nullable;
 | 
			
		||||
import androidx.appcompat.content.res.AppCompatResources;
 | 
			
		||||
import androidx.appcompat.view.ContextThemeWrapper;
 | 
			
		||||
import androidx.appcompat.widget.PopupMenu;
 | 
			
		||||
import androidx.constraintlayout.widget.ConstraintLayout;
 | 
			
		||||
import androidx.core.content.PermissionChecker;
 | 
			
		||||
import androidx.core.util.Pair;
 | 
			
		||||
import androidx.core.widget.NestedScrollView;
 | 
			
		||||
import androidx.fragment.app.DialogFragment;
 | 
			
		||||
import androidx.fragment.app.Fragment;
 | 
			
		||||
import androidx.fragment.app.FragmentActivity;
 | 
			
		||||
import androidx.lifecycle.LiveData;
 | 
			
		||||
import androidx.lifecycle.MutableLiveData;
 | 
			
		||||
@ -58,11 +42,7 @@ import androidx.transition.TransitionManager;
 | 
			
		||||
import androidx.viewpager2.widget.ViewPager2;
 | 
			
		||||
 | 
			
		||||
import com.facebook.drawee.backends.pipeline.Fresco;
 | 
			
		||||
import com.facebook.drawee.controller.BaseControllerListener;
 | 
			
		||||
import com.facebook.drawee.drawable.ScalingUtils;
 | 
			
		||||
import com.facebook.drawee.generic.GenericDraweeHierarchy;
 | 
			
		||||
import com.facebook.drawee.interfaces.DraweeController;
 | 
			
		||||
import com.facebook.imagepipeline.image.ImageInfo;
 | 
			
		||||
import com.facebook.imagepipeline.request.ImageRequest;
 | 
			
		||||
import com.facebook.imagepipeline.request.ImageRequestBuilder;
 | 
			
		||||
import com.google.android.material.bottomsheet.BottomSheetBehavior;
 | 
			
		||||
@ -76,7 +56,6 @@ import awais.instagrabber.R;
 | 
			
		||||
import awais.instagrabber.adapters.SliderCallbackAdapter;
 | 
			
		||||
import awais.instagrabber.adapters.SliderItemsAdapter;
 | 
			
		||||
import awais.instagrabber.adapters.viewholder.SliderVideoViewHolder;
 | 
			
		||||
import awais.instagrabber.customviews.SharedElementTransitionDialogFragment;
 | 
			
		||||
import awais.instagrabber.customviews.VerticalImageSpan;
 | 
			
		||||
import awais.instagrabber.customviews.VideoPlayerCallbackAdapter;
 | 
			
		||||
import awais.instagrabber.customviews.VideoPlayerViewHelper;
 | 
			
		||||
@ -101,31 +80,28 @@ import awais.instagrabber.viewmodels.PostViewV2ViewModel;
 | 
			
		||||
import static androidx.core.content.PermissionChecker.checkSelfPermission;
 | 
			
		||||
import static awais.instagrabber.fragments.HashTagFragment.ARG_HASHTAG;
 | 
			
		||||
import static awais.instagrabber.utils.DownloadUtils.WRITE_PERMISSION;
 | 
			
		||||
import static awais.instagrabber.utils.Utils.getAttrValue;
 | 
			
		||||
import static awais.instagrabber.utils.Utils.settingsHelper;
 | 
			
		||||
 | 
			
		||||
public class PostViewV2Fragment extends SharedElementTransitionDialogFragment implements EditTextDialogFragment.EditTextDialogFragmentCallback {
 | 
			
		||||
public class PostViewV2Fragment extends Fragment implements EditTextDialogFragment.EditTextDialogFragmentCallback {
 | 
			
		||||
    private static final String TAG = "PostViewV2Fragment";
 | 
			
		||||
    private static final int DETAILS_HIDE_DELAY_MILLIS = 2000;
 | 
			
		||||
    private static final String ARG_MEDIA = "media";
 | 
			
		||||
    private static final String ARG_SLIDER_POSITION = "position";
 | 
			
		||||
    public static final String ARG_MEDIA = "media";
 | 
			
		||||
    public static final String ARG_SLIDER_POSITION = "position";
 | 
			
		||||
    private static final int STORAGE_PERM_REQUEST_CODE = 8020;
 | 
			
		||||
 | 
			
		||||
    // private Media media;
 | 
			
		||||
    private View sharedProfilePicElement;
 | 
			
		||||
    private View sharedMainPostElement;
 | 
			
		||||
    private DialogPostViewBinding binding;
 | 
			
		||||
    // private MediaService mediaService;
 | 
			
		||||
    private Context context;
 | 
			
		||||
    // private Context context;
 | 
			
		||||
    private BottomSheetBehavior<NestedScrollView> bottomSheetBehavior;
 | 
			
		||||
    private boolean detailsVisible = true;
 | 
			
		||||
    private boolean video;
 | 
			
		||||
    private VideoPlayerViewHelper videoPlayerViewHelper;
 | 
			
		||||
    private SliderItemsAdapter sliderItemsAdapter;
 | 
			
		||||
    // private boolean wasControlsVisible;
 | 
			
		||||
    private boolean wasPaused;
 | 
			
		||||
    private int captionState = BottomSheetBehavior.STATE_HIDDEN;
 | 
			
		||||
    private int sliderPosition = -1;
 | 
			
		||||
    private DialogInterface.OnShowListener onShowListener;
 | 
			
		||||
    private boolean hasBeenToggled = false;
 | 
			
		||||
    private PostViewV2ViewModel viewModel;
 | 
			
		||||
    private PopupMenu optionsPopup;
 | 
			
		||||
@ -151,51 +127,6 @@ public class PostViewV2Fragment extends SharedElementTransitionDialogFragment im
 | 
			
		||||
        }
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    // private final VerticalDragHelper.OnVerticalDragListener onVerticalDragListener = new VerticalDragHelper.OnVerticalDragListener() {
 | 
			
		||||
    //
 | 
			
		||||
    //     @Override
 | 
			
		||||
    //     public void onDrag(final float dY) {
 | 
			
		||||
    //         // allow the view to be draggable
 | 
			
		||||
    //         final ConstraintLayout v = binding.getRoot();
 | 
			
		||||
    //         final float finalY = v.getY() + dY;
 | 
			
		||||
    //         animateY(v, finalY, 0, null);
 | 
			
		||||
    //     }
 | 
			
		||||
    //
 | 
			
		||||
    //     @Override
 | 
			
		||||
    //     public void onDragEnd() {
 | 
			
		||||
    //         // animate and dismiss if user drags the view more that 30% of the view
 | 
			
		||||
    //         if (Math.abs(binding.getRoot().getY()) > Utils.displayMetrics.heightPixels * 0.25) {
 | 
			
		||||
    //             animateAndDismiss(binding.getRoot().getY() < 0 ? 1 : -1);
 | 
			
		||||
    //             return;
 | 
			
		||||
    //         }
 | 
			
		||||
    //         // animate back the view to proper position
 | 
			
		||||
    //         animateY(binding.getRoot(), 0, 200, null);
 | 
			
		||||
    //     }
 | 
			
		||||
    //
 | 
			
		||||
    //     @Override
 | 
			
		||||
    //     public void onFling(final double flingVelocity) {
 | 
			
		||||
    //         // animate and dismiss if user flings up/down
 | 
			
		||||
    //         animateAndDismiss(flingVelocity > 0 ? 1 : -1);
 | 
			
		||||
    //     }
 | 
			
		||||
    //
 | 
			
		||||
    //     private void animateAndDismiss(final int direction) {
 | 
			
		||||
    //         final int height = binding.getRoot().getHeight();
 | 
			
		||||
    //         final int finalYDist = height + Utils.getStatusBarHeight(context);
 | 
			
		||||
    //         // less than 0 means up direction, else down
 | 
			
		||||
    //         final int finalY = direction > 0 ? -finalYDist : finalYDist;
 | 
			
		||||
    //         animateY(binding.getRoot(), finalY, 200, new AnimatorListenerAdapter() {
 | 
			
		||||
    //             @Override
 | 
			
		||||
    //             public void onAnimationEnd(final Animator animation) {
 | 
			
		||||
    //                 dismiss();
 | 
			
		||||
    //             }
 | 
			
		||||
    //         });
 | 
			
		||||
    //     }
 | 
			
		||||
    // };
 | 
			
		||||
 | 
			
		||||
    public void setOnShowListener(final DialogInterface.OnShowListener onShowListener) {
 | 
			
		||||
        this.onShowListener = onShowListener;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setOnDeleteListener(final OnDeleteListener onDeleteListener) {
 | 
			
		||||
        if (onDeleteListener == null) return;
 | 
			
		||||
        this.onDeleteListener = onDeleteListener;
 | 
			
		||||
@ -205,68 +136,12 @@ public class PostViewV2Fragment extends SharedElementTransitionDialogFragment im
 | 
			
		||||
        void onDelete();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static class Builder {
 | 
			
		||||
        private final Media feedModel;
 | 
			
		||||
        private View profilePicElement;
 | 
			
		||||
        private View mainPostElement;
 | 
			
		||||
        private int position;
 | 
			
		||||
 | 
			
		||||
        public Builder setSharedProfilePicElement(final View profilePicElement) {
 | 
			
		||||
            this.profilePicElement = profilePicElement;
 | 
			
		||||
            return this;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        @SuppressWarnings("UnusedReturnValue")
 | 
			
		||||
        public Builder setSharedMainPostElement(final View mainPostElement) {
 | 
			
		||||
            this.mainPostElement = mainPostElement;
 | 
			
		||||
            return this;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public Builder setPosition(final int position) {
 | 
			
		||||
            this.position = position;
 | 
			
		||||
            return this;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public PostViewV2Fragment build() {
 | 
			
		||||
            return PostViewV2Fragment.newInstance(feedModel, profilePicElement, mainPostElement, position);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public Builder(final Media feedModel) {
 | 
			
		||||
            this.feedModel = feedModel;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private static PostViewV2Fragment newInstance(final Media feedModel,
 | 
			
		||||
                                                  final View profilePicElement,
 | 
			
		||||
                                                  final View mainPostElement,
 | 
			
		||||
                                                  final int position) {
 | 
			
		||||
        final PostViewV2Fragment f = new PostViewV2Fragment(profilePicElement, mainPostElement);
 | 
			
		||||
        final Bundle args = new Bundle();
 | 
			
		||||
        args.putSerializable(ARG_MEDIA, feedModel);
 | 
			
		||||
        if (position >= 0) {
 | 
			
		||||
            args.putInt(ARG_SLIDER_POSITION, position);
 | 
			
		||||
        }
 | 
			
		||||
        f.setArguments(args);
 | 
			
		||||
        return f;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static Builder builder(final Media feedModel) {
 | 
			
		||||
        return new Builder(feedModel);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // default constructor for fragment manager
 | 
			
		||||
    public PostViewV2Fragment() {}
 | 
			
		||||
 | 
			
		||||
    private PostViewV2Fragment(final View sharedProfilePicElement,
 | 
			
		||||
                               final View sharedMainPostElement) {
 | 
			
		||||
        this.sharedProfilePicElement = sharedProfilePicElement;
 | 
			
		||||
        this.sharedMainPostElement = sharedMainPostElement;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void onCreate(@Nullable final Bundle savedInstanceState) {
 | 
			
		||||
        super.onCreate(savedInstanceState);
 | 
			
		||||
        setStyle(DialogFragment.STYLE_NO_FRAME, R.style.PostViewV2Style);
 | 
			
		||||
        viewModel = new ViewModelProvider(this).get(PostViewV2ViewModel.class);
 | 
			
		||||
        captionState = settingsHelper.getBoolean(Constants.SHOW_CAPTIONS) ?
 | 
			
		||||
                       BottomSheetBehavior.STATE_COLLAPSED : BottomSheetBehavior.STATE_HIDDEN;
 | 
			
		||||
@ -278,58 +153,19 @@ public class PostViewV2Fragment extends SharedElementTransitionDialogFragment im
 | 
			
		||||
                             @Nullable final ViewGroup container,
 | 
			
		||||
                             @Nullable final Bundle savedInstanceState) {
 | 
			
		||||
        binding = DialogPostViewBinding.inflate(inflater, container, false);
 | 
			
		||||
        final ConstraintLayout root = binding.getRoot();
 | 
			
		||||
        final ViewTreeObserver.OnPreDrawListener preDrawListener = new ViewTreeObserver.OnPreDrawListener() {
 | 
			
		||||
            @Override
 | 
			
		||||
            public boolean onPreDraw() {
 | 
			
		||||
                root.getViewTreeObserver().removeOnPreDrawListener(this);
 | 
			
		||||
                return false;
 | 
			
		||||
            }
 | 
			
		||||
        };
 | 
			
		||||
        root.getViewTreeObserver().addOnPreDrawListener(preDrawListener);
 | 
			
		||||
        return root;
 | 
			
		||||
        return binding.getRoot();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void onViewCreated(@NonNull final View view, @Nullable final Bundle savedInstanceState) {
 | 
			
		||||
        // postponeEnterTransition();
 | 
			
		||||
        init();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void onAttach(@NonNull final Context context) {
 | 
			
		||||
        super.onAttach(context);
 | 
			
		||||
        this.context = context;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void onStart() {
 | 
			
		||||
        super.onStart();
 | 
			
		||||
        final Dialog dialog = getDialog();
 | 
			
		||||
        if (dialog == null) return;
 | 
			
		||||
        final Window window = dialog.getWindow();
 | 
			
		||||
        if (window == null) return;
 | 
			
		||||
        window.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
 | 
			
		||||
        window.clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
 | 
			
		||||
        window.setDimAmount(0);
 | 
			
		||||
        int width = ViewGroup.LayoutParams.MATCH_PARENT;
 | 
			
		||||
        int height = ViewGroup.LayoutParams.MATCH_PARENT;
 | 
			
		||||
        window.setLayout(width, height);
 | 
			
		||||
        if (!wasPaused && (sharedProfilePicElement != null || sharedMainPostElement != null)) {
 | 
			
		||||
            final ObjectAnimator animator = ObjectAnimator.ofPropertyValuesHolder(
 | 
			
		||||
                    binding.getRoot().getBackground().mutate(),
 | 
			
		||||
                    PropertyValuesHolder.ofInt("alpha", 0, 255)
 | 
			
		||||
            );
 | 
			
		||||
            addAnimator(animator);
 | 
			
		||||
        }
 | 
			
		||||
        if (onShowListener != null) {
 | 
			
		||||
            onShowListener.onShow(dialog);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void onPause() {
 | 
			
		||||
        super.onPause();
 | 
			
		||||
        wasPaused = true;
 | 
			
		||||
        // wasPaused = true;
 | 
			
		||||
        if (bottomSheetBehavior != null) {
 | 
			
		||||
            captionState = bottomSheetBehavior.getState();
 | 
			
		||||
        }
 | 
			
		||||
@ -390,85 +226,12 @@ public class PostViewV2Fragment extends SharedElementTransitionDialogFragment im
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    protected void onBeforeSharedElementAnimation(@NonNull final View startView,
 | 
			
		||||
                                                  @NonNull final View destView,
 | 
			
		||||
                                                  @NonNull final SharedElementTransitionDialogFragment.ViewBounds viewBounds) {
 | 
			
		||||
        GenericDraweeHierarchy hierarchy = null;
 | 
			
		||||
        if (destView == binding.postImage) {
 | 
			
		||||
            hierarchy = binding.postImage.getHierarchy();
 | 
			
		||||
        } else if (destView == binding.videoPost.thumbnailParent) {
 | 
			
		||||
            hierarchy = binding.videoPost.thumbnail.getHierarchy();
 | 
			
		||||
        }
 | 
			
		||||
        if (hierarchy != null) {
 | 
			
		||||
            final ScalingUtils.ScaleType scaleTypeTo = ScalingUtils.ScaleType.FIT_CENTER;
 | 
			
		||||
            final ScalingUtils.InterpolatingScaleType scaleType = new ScalingUtils.InterpolatingScaleType(
 | 
			
		||||
                    ScalingUtils.ScaleType.CENTER_CROP,
 | 
			
		||||
                    scaleTypeTo,
 | 
			
		||||
                    viewBounds.getStartBounds(),
 | 
			
		||||
                    viewBounds.getDestBounds()
 | 
			
		||||
            );
 | 
			
		||||
            hierarchy.setActualImageScaleType(scaleType);
 | 
			
		||||
            final ValueAnimator animator = ValueAnimator.ofFloat(0, 1);
 | 
			
		||||
            animator.setDuration(getAnimationDuration());
 | 
			
		||||
            animator.addUpdateListener(animation -> {
 | 
			
		||||
                float fraction = (float) animation.getAnimatedValue();
 | 
			
		||||
                scaleType.setValue(fraction);
 | 
			
		||||
            });
 | 
			
		||||
            final GenericDraweeHierarchy finalHierarchy = hierarchy;
 | 
			
		||||
            animator.addListener(new AnimatorListenerAdapter() {
 | 
			
		||||
                @Override
 | 
			
		||||
                public void onAnimationEnd(Animator animation) {
 | 
			
		||||
                    finalHierarchy.setActualImageScaleType(scaleTypeTo);
 | 
			
		||||
                    destView.requestLayout();
 | 
			
		||||
                }
 | 
			
		||||
            });
 | 
			
		||||
            addAnimator(animator);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    protected void onEndSharedElementAnimation(@NonNull final View startView,
 | 
			
		||||
                                               @NonNull final View destView,
 | 
			
		||||
                                               @NonNull final ViewBounds viewBounds) {
 | 
			
		||||
        if (destView == binding.postImage) {
 | 
			
		||||
            binding.postImage.setTranslationX(0);
 | 
			
		||||
            binding.postImage.setTranslationY(0);
 | 
			
		||||
            binding.postImage.setX(0);
 | 
			
		||||
            binding.postImage.setY(0);
 | 
			
		||||
            binding.postImage.setLayoutParams(new ConstraintLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
 | 
			
		||||
                                                                                ViewGroup.LayoutParams.MATCH_PARENT));
 | 
			
		||||
            binding.postImage.requestLayout();
 | 
			
		||||
            if (bottomSheetBehavior != null) {
 | 
			
		||||
                bottomSheetBehavior.setState(captionState);
 | 
			
		||||
            }
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
        if (destView == binding.sliderParent) {
 | 
			
		||||
            binding.sliderParent.setLayoutParams(new ConstraintLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
 | 
			
		||||
                                                                                   ViewGroup.LayoutParams.MATCH_PARENT));
 | 
			
		||||
            binding.sliderParent.requestLayout();
 | 
			
		||||
            if (bottomSheetBehavior != null) {
 | 
			
		||||
                bottomSheetBehavior.setState(captionState);
 | 
			
		||||
            }
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
        if (destView == binding.videoPost.thumbnailParent) {
 | 
			
		||||
            final FrameLayout.LayoutParams params = new ViewSwitcher.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
 | 
			
		||||
                                                                                  ViewGroup.LayoutParams.WRAP_CONTENT);
 | 
			
		||||
            params.gravity = Gravity.CENTER;
 | 
			
		||||
            binding.videoPost.thumbnailParent.setLayoutParams(params);
 | 
			
		||||
            binding.videoPost.thumbnailParent.requestLayout();
 | 
			
		||||
            if (bottomSheetBehavior != null) {
 | 
			
		||||
                bottomSheetBehavior.setState(captionState);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void onRequestPermissionsResult(final int requestCode, @NonNull final String[] permissions, @NonNull final int[] grantResults) {
 | 
			
		||||
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
 | 
			
		||||
        if (requestCode == STORAGE_PERM_REQUEST_CODE && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
 | 
			
		||||
            final Context context = getContext();
 | 
			
		||||
            if (context == null) return;
 | 
			
		||||
            DownloadUtils.showDownloadDialog(context, viewModel.getMedia(), sliderPosition);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
@ -476,17 +239,17 @@ public class PostViewV2Fragment extends SharedElementTransitionDialogFragment im
 | 
			
		||||
    private void init() {
 | 
			
		||||
        final Bundle arguments = getArguments();
 | 
			
		||||
        if (arguments == null) {
 | 
			
		||||
            dismiss();
 | 
			
		||||
            // dismiss();
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
        final Serializable feedModelSerializable = arguments.getSerializable(ARG_MEDIA);
 | 
			
		||||
        if (feedModelSerializable == null) {
 | 
			
		||||
            Log.e(TAG, "onCreate: feedModelSerializable is null");
 | 
			
		||||
            dismiss();
 | 
			
		||||
            // dismiss();
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
        if (!(feedModelSerializable instanceof Media)) {
 | 
			
		||||
            dismiss();
 | 
			
		||||
            // dismiss();
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
        final Media media = (Media) feedModelSerializable;
 | 
			
		||||
@ -494,11 +257,11 @@ public class PostViewV2Fragment extends SharedElementTransitionDialogFragment im
 | 
			
		||||
            sliderPosition = arguments.getInt(ARG_SLIDER_POSITION, 0);
 | 
			
		||||
        }
 | 
			
		||||
        viewModel.setMedia(media);
 | 
			
		||||
        if (!wasPaused && (sharedProfilePicElement != null || sharedMainPostElement != null)) {
 | 
			
		||||
            binding.getRoot().getBackground().mutate().setAlpha(0);
 | 
			
		||||
        }
 | 
			
		||||
        setProfilePicSharedElement();
 | 
			
		||||
        setupCaptionBottomSheet();
 | 
			
		||||
        // if (!wasPaused && (sharedProfilePicElement != null || sharedMainPostElement != null)) {
 | 
			
		||||
        //     binding.getRoot().getBackground().mutate().setAlpha(0);
 | 
			
		||||
        // }
 | 
			
		||||
        // setProfilePicSharedElement();
 | 
			
		||||
        // setupCaptionBottomSheet();
 | 
			
		||||
        setupCommonActions();
 | 
			
		||||
        setObservers();
 | 
			
		||||
    }
 | 
			
		||||
@ -506,10 +269,14 @@ public class PostViewV2Fragment extends SharedElementTransitionDialogFragment im
 | 
			
		||||
    private void setObservers() {
 | 
			
		||||
        viewModel.getUser().observe(getViewLifecycleOwner(), user -> {
 | 
			
		||||
            if (user == null) {
 | 
			
		||||
                binding.userDetailsGroup.setVisibility(View.GONE);
 | 
			
		||||
                binding.profilePic.setVisibility(View.GONE);
 | 
			
		||||
                binding.title.setVisibility(View.GONE);
 | 
			
		||||
                binding.subtitle.setVisibility(View.GONE);
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
            binding.userDetailsGroup.setVisibility(View.VISIBLE);
 | 
			
		||||
            binding.profilePic.setVisibility(View.VISIBLE);
 | 
			
		||||
            binding.title.setVisibility(View.VISIBLE);
 | 
			
		||||
            binding.subtitle.setVisibility(View.VISIBLE);
 | 
			
		||||
            binding.getRoot().post(() -> setupProfilePic(user));
 | 
			
		||||
            binding.getRoot().post(() -> setupTitles(user));
 | 
			
		||||
        });
 | 
			
		||||
@ -563,30 +330,6 @@ public class PostViewV2Fragment extends SharedElementTransitionDialogFragment im
 | 
			
		||||
        return safeCount;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void setupCaptionBottomSheet() {
 | 
			
		||||
        bottomSheetBehavior = BottomSheetBehavior.from(binding.captionParent);
 | 
			
		||||
        bottomSheetBehavior.setState(captionState);
 | 
			
		||||
        bottomSheetBehavior.addBottomSheetCallback(new BottomSheetBehavior.BottomSheetCallback() {
 | 
			
		||||
            @Override
 | 
			
		||||
            public void onStateChanged(@NonNull final View bottomSheet, final int newState) {}
 | 
			
		||||
 | 
			
		||||
            @Override
 | 
			
		||||
            public void onSlide(@NonNull final View bottomSheet, final float slideOffset) {
 | 
			
		||||
                binding.captionParent.getBackground().mutate().setAlpha((int) (128 + (128 * (slideOffset < 0 ? 0 : slideOffset))));
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
        if (sharedProfilePicElement == null || sharedMainPostElement == null) {
 | 
			
		||||
            binding.getRoot().getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
 | 
			
		||||
                @Override
 | 
			
		||||
                public void onGlobalLayout() {
 | 
			
		||||
                    binding.getRoot().getViewTreeObserver().removeOnGlobalLayoutListener(this);
 | 
			
		||||
                    if (bottomSheetBehavior == null) return;
 | 
			
		||||
                    bottomSheetBehavior.setState(BottomSheetBehavior.STATE_COLLAPSED);
 | 
			
		||||
                }
 | 
			
		||||
            });
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void setupCommonActions() {
 | 
			
		||||
        setupLike();
 | 
			
		||||
        setupSave();
 | 
			
		||||
@ -619,6 +362,8 @@ public class PostViewV2Fragment extends SharedElementTransitionDialogFragment im
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
        binding.comment.setOnLongClickListener(v -> {
 | 
			
		||||
            final Context context = getContext();
 | 
			
		||||
            if (context == null) return false;
 | 
			
		||||
            Utils.displayToastAboveView(context, v, getString(R.string.comment));
 | 
			
		||||
            return true;
 | 
			
		||||
        });
 | 
			
		||||
@ -626,6 +371,8 @@ public class PostViewV2Fragment extends SharedElementTransitionDialogFragment im
 | 
			
		||||
 | 
			
		||||
    private void setupDownload() {
 | 
			
		||||
        binding.download.setOnClickListener(v -> {
 | 
			
		||||
            final Context context = getContext();
 | 
			
		||||
            if (context == null) return;
 | 
			
		||||
            if (checkSelfPermission(context, WRITE_PERMISSION) == PermissionChecker.PERMISSION_GRANTED) {
 | 
			
		||||
                DownloadUtils.showDownloadDialog(context, viewModel.getMedia(), sliderPosition);
 | 
			
		||||
                return;
 | 
			
		||||
@ -633,6 +380,8 @@ public class PostViewV2Fragment extends SharedElementTransitionDialogFragment im
 | 
			
		||||
            requestPermissions(DownloadUtils.PERMS, STORAGE_PERM_REQUEST_CODE);
 | 
			
		||||
        });
 | 
			
		||||
        binding.download.setOnLongClickListener(v -> {
 | 
			
		||||
            final Context context = getContext();
 | 
			
		||||
            if (context == null) return false;
 | 
			
		||||
            Utils.displayToastAboveView(context, v, getString(R.string.action_download));
 | 
			
		||||
            return true;
 | 
			
		||||
        });
 | 
			
		||||
@ -702,17 +451,21 @@ public class PostViewV2Fragment extends SharedElementTransitionDialogFragment im
 | 
			
		||||
    private void setLikedResources(final boolean liked) {
 | 
			
		||||
        final int iconResource;
 | 
			
		||||
        final int tintResource;
 | 
			
		||||
        final Context context = getContext();
 | 
			
		||||
        if (context == null) return;
 | 
			
		||||
        final Resources resources = context.getResources();
 | 
			
		||||
        if (resources == null) return;
 | 
			
		||||
        if (liked) {
 | 
			
		||||
            iconResource = R.drawable.ic_like;
 | 
			
		||||
            tintResource = R.color.red_600;
 | 
			
		||||
            tintResource = resources.getColor(R.color.red_600);
 | 
			
		||||
            // textResId = R.string.unlike_without_count;
 | 
			
		||||
        } else {
 | 
			
		||||
            iconResource = R.drawable.ic_not_liked;
 | 
			
		||||
            tintResource = R.color.white;
 | 
			
		||||
            tintResource = getAttrValue(context, R.attr.colorPrimary);
 | 
			
		||||
            // textResId = R.string.like_without_count;
 | 
			
		||||
        }
 | 
			
		||||
        binding.like.setIconResource(iconResource);
 | 
			
		||||
        binding.like.setIconTintResource(tintResource);
 | 
			
		||||
        binding.like.setIconTint(ColorStateList.valueOf(tintResource));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void setupSave() {
 | 
			
		||||
@ -769,23 +522,21 @@ public class PostViewV2Fragment extends SharedElementTransitionDialogFragment im
 | 
			
		||||
    private void setSavedResources(final boolean saved) {
 | 
			
		||||
        final int iconResource;
 | 
			
		||||
        final int tintResource;
 | 
			
		||||
        final Context context = getContext();
 | 
			
		||||
        if (context == null) return;
 | 
			
		||||
        final Resources resources = context.getResources();
 | 
			
		||||
        if (resources == null) return;
 | 
			
		||||
        if (saved) {
 | 
			
		||||
            iconResource = R.drawable.ic_class_24;
 | 
			
		||||
            tintResource = R.color.blue_700;
 | 
			
		||||
            tintResource = resources.getColor(R.color.blue_700);
 | 
			
		||||
            // textResId = R.string.saved;
 | 
			
		||||
        } else {
 | 
			
		||||
            iconResource = R.drawable.ic_outline_class_24;
 | 
			
		||||
            tintResource = R.color.white;
 | 
			
		||||
            tintResource = getAttrValue(context, R.attr.colorPrimary);
 | 
			
		||||
            // textResId = R.string.save;
 | 
			
		||||
        }
 | 
			
		||||
        binding.save.setIconResource(iconResource);
 | 
			
		||||
        binding.save.setIconTintResource(tintResource);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void setProfilePicSharedElement() {
 | 
			
		||||
        if (!wasPaused && sharedProfilePicElement != null) {
 | 
			
		||||
            addSharedElement(sharedProfilePicElement, binding.profilePic);
 | 
			
		||||
        }
 | 
			
		||||
        binding.save.setIconTint(ColorStateList.valueOf(tintResource));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void setupProfilePic(final User user) {
 | 
			
		||||
@ -797,19 +548,6 @@ public class PostViewV2Fragment extends SharedElementTransitionDialogFragment im
 | 
			
		||||
        final DraweeController controller = Fresco
 | 
			
		||||
                .newDraweeControllerBuilder()
 | 
			
		||||
                .setUri(uri)
 | 
			
		||||
                .setControllerListener(new BaseControllerListener<ImageInfo>() {
 | 
			
		||||
                    @Override
 | 
			
		||||
                    public void onFailure(final String id, final Throwable throwable) {
 | 
			
		||||
                        startPostponedEnterTransition();
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
                    @Override
 | 
			
		||||
                    public void onFinalImageSet(final String id,
 | 
			
		||||
                                                final ImageInfo imageInfo,
 | 
			
		||||
                                                final Animatable animatable) {
 | 
			
		||||
                        startPostponedEnterTransition();
 | 
			
		||||
                    }
 | 
			
		||||
                })
 | 
			
		||||
                .build();
 | 
			
		||||
        binding.profilePic.setController(controller);
 | 
			
		||||
        binding.profilePic.setOnClickListener(v -> navigateToProfile("@" + user.getUsername()));
 | 
			
		||||
@ -821,7 +559,13 @@ public class PostViewV2Fragment extends SharedElementTransitionDialogFragment im
 | 
			
		||||
            binding.subtitle.setVisibility(View.GONE);
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
        binding.subtitle.setText(user.getFullName());
 | 
			
		||||
        final String fullName = user.getFullName();
 | 
			
		||||
        if (TextUtils.isEmpty(fullName)) {
 | 
			
		||||
            binding.subtitle.setVisibility(View.GONE);
 | 
			
		||||
        } else {
 | 
			
		||||
            binding.subtitle.setVisibility(View.VISIBLE);
 | 
			
		||||
            binding.subtitle.setText(fullName);
 | 
			
		||||
        }
 | 
			
		||||
        setUsername(user);
 | 
			
		||||
        binding.title.setOnClickListener(v -> navigateToProfile("@" + user.getUsername()));
 | 
			
		||||
        binding.subtitle.setOnClickListener(v -> navigateToProfile("@" + user.getUsername()));
 | 
			
		||||
@ -831,6 +575,8 @@ public class PostViewV2Fragment extends SharedElementTransitionDialogFragment im
 | 
			
		||||
        final SpannableStringBuilder sb = new SpannableStringBuilder(user.getUsername());
 | 
			
		||||
        final int drawableSize = Utils.convertDpToPx(24);
 | 
			
		||||
        if (user.isVerified()) {
 | 
			
		||||
            final Context context = getContext();
 | 
			
		||||
            if (context == null) return;
 | 
			
		||||
            final Drawable verifiedDrawable = AppCompatResources.getDrawable(context, R.drawable.verified);
 | 
			
		||||
            VerticalImageSpan verifiedSpan = null;
 | 
			
		||||
            if (verifiedDrawable != null) {
 | 
			
		||||
@ -854,7 +600,6 @@ public class PostViewV2Fragment extends SharedElementTransitionDialogFragment im
 | 
			
		||||
        if (caption == null || TextUtils.isEmpty(caption.getText())) {
 | 
			
		||||
            binding.caption.setVisibility(View.GONE);
 | 
			
		||||
            binding.translate.setVisibility(View.GONE);
 | 
			
		||||
            binding.captionToggle.setVisibility(View.GONE);
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
        final String postCaption = caption.getText();
 | 
			
		||||
@ -872,35 +617,13 @@ public class PostViewV2Fragment extends SharedElementTransitionDialogFragment im
 | 
			
		||||
        binding.caption.addOnEmailClickListener(autoLinkItem -> Utils.openEmailAddress(getContext(), autoLinkItem.getOriginalText().trim()));
 | 
			
		||||
        binding.caption.addOnURLClickListener(autoLinkItem -> Utils.openURL(getContext(), autoLinkItem.getOriginalText().trim()));
 | 
			
		||||
        binding.caption.setOnLongClickListener(v -> {
 | 
			
		||||
            final Context context = getContext();
 | 
			
		||||
            if (context == null) return false;
 | 
			
		||||
            Utils.copyText(context, postCaption);
 | 
			
		||||
            return true;
 | 
			
		||||
        });
 | 
			
		||||
        binding.caption.setText(postCaption);
 | 
			
		||||
        binding.translate.setOnClickListener(v -> handleTranslateCaptionResource(viewModel.translateCaption()));
 | 
			
		||||
        binding.captionToggle.setOnClickListener(v -> {
 | 
			
		||||
            if (bottomSheetBehavior == null) return;
 | 
			
		||||
            switch (bottomSheetBehavior.getState()) {
 | 
			
		||||
                case BottomSheetBehavior.STATE_HIDDEN:
 | 
			
		||||
                    binding.captionParent.fullScroll(ScrollView.FOCUS_UP); // reset scroll position
 | 
			
		||||
                    // if (binding.playerControls.getRoot().getVisibility() == View.VISIBLE) {
 | 
			
		||||
                    //     hidePlayerControls();
 | 
			
		||||
                    // }
 | 
			
		||||
                    bottomSheetBehavior.setState(BottomSheetBehavior.STATE_COLLAPSED);
 | 
			
		||||
                    return;
 | 
			
		||||
                case BottomSheetBehavior.STATE_COLLAPSED:
 | 
			
		||||
                case BottomSheetBehavior.STATE_EXPANDED:
 | 
			
		||||
                    bottomSheetBehavior.setState(BottomSheetBehavior.STATE_HIDDEN);
 | 
			
		||||
                    return;
 | 
			
		||||
                case BottomSheetBehavior.STATE_DRAGGING:
 | 
			
		||||
                case BottomSheetBehavior.STATE_HALF_EXPANDED:
 | 
			
		||||
                case BottomSheetBehavior.STATE_SETTLING:
 | 
			
		||||
                default:
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
        binding.captionToggle.setOnLongClickListener(v -> {
 | 
			
		||||
            Utils.displayToastAboveView(context, v, getString(R.string.caption));
 | 
			
		||||
            return true;
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void handleTranslateCaptionResource(@NonNull final LiveData<Resource<String>> data) {
 | 
			
		||||
@ -953,6 +676,8 @@ public class PostViewV2Fragment extends SharedElementTransitionDialogFragment im
 | 
			
		||||
        }
 | 
			
		||||
        binding.share.setVisibility(View.VISIBLE);
 | 
			
		||||
        binding.share.setOnLongClickListener(v -> {
 | 
			
		||||
            final Context context = getContext();
 | 
			
		||||
            if (context == null) return false;
 | 
			
		||||
            Utils.displayToastAboveView(context, v, getString(R.string.share));
 | 
			
		||||
            return true;
 | 
			
		||||
        });
 | 
			
		||||
@ -962,6 +687,8 @@ public class PostViewV2Fragment extends SharedElementTransitionDialogFragment im
 | 
			
		||||
            if (profileModel == null) return;
 | 
			
		||||
            final boolean isPrivate = profileModel.isPrivate();
 | 
			
		||||
            if (isPrivate) {
 | 
			
		||||
                final Context context = getContext();
 | 
			
		||||
                if (context == null) return;
 | 
			
		||||
                // is this necessary?
 | 
			
		||||
                Toast.makeText(context, R.string.share_private_post, Toast.LENGTH_LONG).show();
 | 
			
		||||
            }
 | 
			
		||||
@ -996,15 +723,15 @@ public class PostViewV2Fragment extends SharedElementTransitionDialogFragment im
 | 
			
		||||
        // binding.playerControls.getRoot().setVisibility(View.GONE);
 | 
			
		||||
        binding.mediaCounter.setVisibility(View.GONE);
 | 
			
		||||
        binding.postImage.setVisibility(View.VISIBLE);
 | 
			
		||||
        if (!wasPaused && sharedMainPostElement != null) {
 | 
			
		||||
            binding.postImage.getHierarchy().setActualImageScaleType(ScalingUtils.ScaleType.CENTER_CROP);
 | 
			
		||||
            addSharedElement(sharedMainPostElement, binding.postImage);
 | 
			
		||||
        }
 | 
			
		||||
        final Media media = viewModel.getMedia();
 | 
			
		||||
        final String imageUrl = ResponseBodyUtils.getImageUrl(media);
 | 
			
		||||
        if (TextUtils.isEmpty(imageUrl)) {
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
        if (TextUtils.isEmpty(imageUrl)) return;
 | 
			
		||||
        final ViewGroup.LayoutParams layoutParams = binding.postImage.getLayoutParams();
 | 
			
		||||
        final Pair<Integer, Integer> widthHeight = NumberUtils.calculateWidthHeight(media.getOriginalHeight(),
 | 
			
		||||
                                                                                    media.getOriginalWidth(),
 | 
			
		||||
                                                                                    (int) (Utils.displayMetrics.heightPixels * 0.8),
 | 
			
		||||
                                                                                    Utils.displayMetrics.widthPixels);
 | 
			
		||||
        layoutParams.height = widthHeight.second;
 | 
			
		||||
        final ImageRequest requestBuilder = ImageRequestBuilder.newBuilderWithSource(Uri.parse(imageUrl))
 | 
			
		||||
                                                               .setLocalThumbnailPreviewsEnabled(true)
 | 
			
		||||
                                                               .build();
 | 
			
		||||
@ -1012,35 +739,22 @@ public class PostViewV2Fragment extends SharedElementTransitionDialogFragment im
 | 
			
		||||
                .newDraweeControllerBuilder()
 | 
			
		||||
                .setLowResImageRequest(ImageRequest.fromUri(ResponseBodyUtils.getThumbUrl(media)))
 | 
			
		||||
                .setImageRequest(requestBuilder)
 | 
			
		||||
                .setControllerListener(new BaseControllerListener<ImageInfo>() {
 | 
			
		||||
                    @Override
 | 
			
		||||
                    public void onFailure(final String id, final Throwable throwable) {
 | 
			
		||||
                        startPostponedEnterTransition();
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
                    @Override
 | 
			
		||||
                    public void onFinalImageSet(final String id,
 | 
			
		||||
                                                final ImageInfo imageInfo,
 | 
			
		||||
                                                final Animatable animatable) {
 | 
			
		||||
                        startPostponedEnterTransition();
 | 
			
		||||
                    }
 | 
			
		||||
                })
 | 
			
		||||
                .build();
 | 
			
		||||
        binding.postImage.setController(controller);
 | 
			
		||||
        // binding.postImage.setOnClickListener(v -> toggleDetails());
 | 
			
		||||
        final AnimatedZoomableController zoomableController = AnimatedZoomableController.newInstance();
 | 
			
		||||
        final AnimatedZoomableController zoomableController = (AnimatedZoomableController) binding.postImage.getZoomableController();
 | 
			
		||||
        zoomableController.setMaxScaleFactor(3f);
 | 
			
		||||
        zoomableController.setGestureZoomEnabled(true);
 | 
			
		||||
        zoomableController.setEnabled(true);
 | 
			
		||||
        binding.postImage.setZoomableController(zoomableController);
 | 
			
		||||
        binding.postImage.setZoomingEnabled(true);
 | 
			
		||||
        binding.postImage.setTapListener(new GestureDetector.SimpleOnGestureListener() {
 | 
			
		||||
            @Override
 | 
			
		||||
            public boolean onSingleTapUp(final MotionEvent e) {
 | 
			
		||||
                toggleDetails();
 | 
			
		||||
                // toggleDetails();
 | 
			
		||||
                return true;
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
        binding.postImage.setAllowTouchInterceptionWhileZoomed(true);
 | 
			
		||||
        // binding.postImage.setAllowTouchInterceptionWhileZoomed(true);
 | 
			
		||||
        // binding.postImage.setOnVerticalDragListener(onVerticalDragListener);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@ -1052,9 +766,26 @@ public class PostViewV2Fragment extends SharedElementTransitionDialogFragment im
 | 
			
		||||
        // binding.playerControls.getRoot().setVisibility(View.GONE);
 | 
			
		||||
        binding.sliderParent.setVisibility(View.VISIBLE);
 | 
			
		||||
        binding.mediaCounter.setVisibility(View.VISIBLE);
 | 
			
		||||
        if (!wasPaused && sharedMainPostElement != null) {
 | 
			
		||||
            addSharedElement(sharedMainPostElement, binding.sliderParent);
 | 
			
		||||
        }
 | 
			
		||||
        final Pair<Integer, Integer> maxHW = media
 | 
			
		||||
                .getCarouselMedia()
 | 
			
		||||
                .stream()
 | 
			
		||||
                .reduce(new Pair<>(0, 0),
 | 
			
		||||
                        (prev, m) -> {
 | 
			
		||||
                            final int height = m.getOriginalHeight() > prev.first ? m.getOriginalHeight() : prev.first;
 | 
			
		||||
                            final int width = m.getOriginalWidth() > prev.second ? m.getOriginalWidth() : prev.second;
 | 
			
		||||
                            return new Pair<>(height, width);
 | 
			
		||||
                        },
 | 
			
		||||
                        (p1, p2) -> {
 | 
			
		||||
                            final int height = p1.first > p2.first ? p1.first : p2.first;
 | 
			
		||||
                            final int width = p1.second > p2.second ? p1.second : p2.second;
 | 
			
		||||
                            return new Pair<>(height, width);
 | 
			
		||||
                        });
 | 
			
		||||
        final ViewGroup.LayoutParams layoutParams = binding.sliderParent.getLayoutParams();
 | 
			
		||||
        final Pair<Integer, Integer> widthHeight = NumberUtils.calculateWidthHeight(maxHW.first,
 | 
			
		||||
                                                                                    maxHW.second,
 | 
			
		||||
                                                                                    (int) (Utils.displayMetrics.heightPixels * 0.8),
 | 
			
		||||
                                                                                    Utils.displayMetrics.widthPixels);
 | 
			
		||||
        layoutParams.height = widthHeight.second;
 | 
			
		||||
        final boolean hasVideo = media.getCarouselMedia()
 | 
			
		||||
                                      .stream()
 | 
			
		||||
                                      .anyMatch(postChild -> postChild.getMediaType() == MediaItemType.MEDIA_TYPE_VIDEO);
 | 
			
		||||
@ -1078,7 +809,7 @@ public class PostViewV2Fragment extends SharedElementTransitionDialogFragment im
 | 
			
		||||
 | 
			
		||||
            @Override
 | 
			
		||||
            public void onItemClicked(final int position) {
 | 
			
		||||
                toggleDetails();
 | 
			
		||||
                // toggleDetails();
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            @Override
 | 
			
		||||
@ -1095,8 +826,8 @@ public class PostViewV2Fragment extends SharedElementTransitionDialogFragment im
 | 
			
		||||
                final FragmentActivity activity = getActivity();
 | 
			
		||||
                if (activity == null) return;
 | 
			
		||||
                Utils.disableKeepScreenOn(activity);
 | 
			
		||||
                if (detailsVisible || hasBeenToggled) return;
 | 
			
		||||
                toggleDetails();
 | 
			
		||||
                // if (detailsVisible || hasBeenToggled) return;
 | 
			
		||||
                // toggleDetails();
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            @Override
 | 
			
		||||
@ -1135,7 +866,7 @@ public class PostViewV2Fragment extends SharedElementTransitionDialogFragment im
 | 
			
		||||
                final String text = (position + 1) + "/" + size;
 | 
			
		||||
                binding.mediaCounter.setText(text);
 | 
			
		||||
                final Media childMedia = media.getCarouselMedia().get(position);
 | 
			
		||||
                final View view = binding.sliderParent.getChildAt(0);
 | 
			
		||||
                // final View view = binding.sliderParent.getChildAt(0);
 | 
			
		||||
                // if (prevPosition != -1) {
 | 
			
		||||
                // if (view instanceof RecyclerView) {
 | 
			
		||||
                // final RecyclerView.ViewHolder viewHolder = ((RecyclerView) view).findViewHolderForAdapterPosition(prevPosition);
 | 
			
		||||
@ -1203,32 +934,17 @@ public class PostViewV2Fragment extends SharedElementTransitionDialogFragment im
 | 
			
		||||
        binding.sliderParent.setVisibility(View.GONE);
 | 
			
		||||
        binding.mediaCounter.setVisibility(View.GONE);
 | 
			
		||||
        // binding.playerControls.getRoot().setVisibility(View.VISIBLE);
 | 
			
		||||
        if (!wasPaused && sharedMainPostElement != null) {
 | 
			
		||||
            final GenericDraweeHierarchy hierarchy = binding.videoPost.thumbnail.getHierarchy();
 | 
			
		||||
            hierarchy.setActualImageScaleType(ScalingUtils.ScaleType.CENTER_CROP);
 | 
			
		||||
            addSharedElement(sharedMainPostElement, binding.videoPost.thumbnailParent);
 | 
			
		||||
        }
 | 
			
		||||
        final ViewGroup.LayoutParams layoutParams = binding.videoPost.root.getLayoutParams();
 | 
			
		||||
        final Pair<Integer, Integer> widthHeight = NumberUtils.calculateWidthHeight(media.getOriginalHeight(),
 | 
			
		||||
                                                                                    media.getOriginalWidth(),
 | 
			
		||||
                                                                                    (int) (Utils.displayMetrics.heightPixels * 0.8),
 | 
			
		||||
                                                                                    Utils.displayMetrics.widthPixels);
 | 
			
		||||
        layoutParams.height = widthHeight.second;
 | 
			
		||||
        binding.videoPost.root.setVisibility(View.VISIBLE);
 | 
			
		||||
        // final VerticalDragHelper thumbnailVerticalDragHelper = new VerticalDragHelper(binding.videoPost.thumbnailParent);
 | 
			
		||||
        // final VerticalDragHelper playerVerticalDragHelper = new VerticalDragHelper(binding.videoPost.playerView);
 | 
			
		||||
        // thumbnailVerticalDragHelper.setOnVerticalDragListener(onVerticalDragListener);
 | 
			
		||||
        // playerVerticalDragHelper.setOnVerticalDragListener(onVerticalDragListener);
 | 
			
		||||
        // enablePlayerControls(true);
 | 
			
		||||
        // binding.videoPost.thumbnailParent.setOnTouchListener((v, event) -> {
 | 
			
		||||
        //     final boolean onDragTouch = thumbnailVerticalDragHelper.onDragTouch(event);
 | 
			
		||||
        //     if (onDragTouch) {
 | 
			
		||||
        //         return true;
 | 
			
		||||
        //     }
 | 
			
		||||
        //     return thumbnailVerticalDragHelper.onGestureTouchEvent(event);
 | 
			
		||||
        // });
 | 
			
		||||
        // binding.videoPost.playerView.setOnTouchListener((v, event) -> {
 | 
			
		||||
        //     final boolean onDragTouch = playerVerticalDragHelper.onDragTouch(event);
 | 
			
		||||
        //     if (onDragTouch) {
 | 
			
		||||
        //         return true;
 | 
			
		||||
        //     }
 | 
			
		||||
        //     return playerVerticalDragHelper.onGestureTouchEvent(event);
 | 
			
		||||
        // });
 | 
			
		||||
        binding.videoPost.playerView.setOnClickListener(v -> toggleDetails());
 | 
			
		||||
        // binding.videoPost.playerView.setOnClickListener(v -> toggleDetails());
 | 
			
		||||
        final Context context = getContext();
 | 
			
		||||
        if (context == null) return;
 | 
			
		||||
        final GestureDetector gestureDetector = new GestureDetector(context, videoPlayerViewGestureListener);
 | 
			
		||||
        binding.videoPost.playerView.setOnTouchListener((v, event) -> {
 | 
			
		||||
            gestureDetector.onTouchEvent(event);
 | 
			
		||||
@ -1258,9 +974,9 @@ public class PostViewV2Fragment extends SharedElementTransitionDialogFragment im
 | 
			
		||||
                final FragmentActivity activity = getActivity();
 | 
			
		||||
                if (activity == null) return;
 | 
			
		||||
                Utils.enabledKeepScreenOn(activity);
 | 
			
		||||
                if (detailsVisible) {
 | 
			
		||||
                    new Handler().postDelayed(() -> toggleDetails(), DETAILS_HIDE_DELAY_MILLIS);
 | 
			
		||||
                }
 | 
			
		||||
                // if (detailsVisible) {
 | 
			
		||||
                //     new Handler().postDelayed(() -> toggleDetails(), DETAILS_HIDE_DELAY_MILLIS);
 | 
			
		||||
                // }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            @Override
 | 
			
		||||
@ -1318,10 +1034,10 @@ public class PostViewV2Fragment extends SharedElementTransitionDialogFragment im
 | 
			
		||||
    //     hidePlayerControls();
 | 
			
		||||
    // }
 | 
			
		||||
 | 
			
		||||
    private void hideCaption() {
 | 
			
		||||
        if (bottomSheetBehavior == null) return;
 | 
			
		||||
        bottomSheetBehavior.setState(BottomSheetBehavior.STATE_HIDDEN);
 | 
			
		||||
    }
 | 
			
		||||
    // private void hideCaption() {
 | 
			
		||||
    //     if (bottomSheetBehavior == null) return;
 | 
			
		||||
    //     bottomSheetBehavior.setState(BottomSheetBehavior.STATE_HIDDEN);
 | 
			
		||||
    // }
 | 
			
		||||
 | 
			
		||||
    // private void showPlayerControls() {
 | 
			
		||||
    //     hideCaption();
 | 
			
		||||
@ -1400,6 +1116,8 @@ public class PostViewV2Fragment extends SharedElementTransitionDialogFragment im
 | 
			
		||||
 | 
			
		||||
    private void createOptionsPopupMenu() {
 | 
			
		||||
        if (optionsPopup == null) {
 | 
			
		||||
            final Context context = getContext();
 | 
			
		||||
            if (context == null) return;
 | 
			
		||||
            final ContextThemeWrapper themeWrapper = new ContextThemeWrapper(context, R.style.popupMenuStyle);
 | 
			
		||||
            optionsPopup = new PopupMenu(themeWrapper, binding.options);
 | 
			
		||||
        } else {
 | 
			
		||||
@ -1526,18 +1244,18 @@ public class PostViewV2Fragment extends SharedElementTransitionDialogFragment im
 | 
			
		||||
                    binding.profilePic.setVisibility(View.GONE);
 | 
			
		||||
                    binding.title.setVisibility(View.GONE);
 | 
			
		||||
                    binding.subtitle.setVisibility(View.GONE);
 | 
			
		||||
                    binding.topBg.setVisibility(View.GONE);
 | 
			
		||||
                    // binding.topBg.setVisibility(View.GONE);
 | 
			
		||||
                }
 | 
			
		||||
                if (media.getLocation() != null) {
 | 
			
		||||
                    binding.location.setVisibility(View.GONE);
 | 
			
		||||
                }
 | 
			
		||||
                binding.captionParent.setVisibility(View.GONE);
 | 
			
		||||
                // binding.captionParent.setVisibility(View.GONE);
 | 
			
		||||
                binding.bottomBg.setVisibility(View.GONE);
 | 
			
		||||
                binding.likesCount.setVisibility(View.GONE);
 | 
			
		||||
                binding.commentsCount.setVisibility(View.GONE);
 | 
			
		||||
                binding.date.setVisibility(View.GONE);
 | 
			
		||||
                binding.comment.setVisibility(View.GONE);
 | 
			
		||||
                binding.captionToggle.setVisibility(View.GONE);
 | 
			
		||||
                // binding.captionToggle.setVisibility(View.GONE);
 | 
			
		||||
                // binding.playerControlsToggle.setVisibility(View.GONE);
 | 
			
		||||
                binding.like.setVisibility(View.GONE);
 | 
			
		||||
                binding.save.setVisibility(View.GONE);
 | 
			
		||||
@ -1559,7 +1277,7 @@ public class PostViewV2Fragment extends SharedElementTransitionDialogFragment im
 | 
			
		||||
                binding.profilePic.setVisibility(View.VISIBLE);
 | 
			
		||||
                binding.title.setVisibility(View.VISIBLE);
 | 
			
		||||
                binding.subtitle.setVisibility(View.VISIBLE);
 | 
			
		||||
                binding.topBg.setVisibility(View.VISIBLE);
 | 
			
		||||
                // binding.topBg.setVisibility(View.VISIBLE);
 | 
			
		||||
            }
 | 
			
		||||
            if (media.getLocation() != null) {
 | 
			
		||||
                binding.location.setVisibility(View.VISIBLE);
 | 
			
		||||
@ -1568,8 +1286,8 @@ public class PostViewV2Fragment extends SharedElementTransitionDialogFragment im
 | 
			
		||||
            if (viewModel.hasPk()) {
 | 
			
		||||
                binding.likesCount.setVisibility(View.VISIBLE);
 | 
			
		||||
                binding.date.setVisibility(View.VISIBLE);
 | 
			
		||||
                binding.captionParent.setVisibility(View.VISIBLE);
 | 
			
		||||
                binding.captionToggle.setVisibility(View.VISIBLE);
 | 
			
		||||
                // binding.captionParent.setVisibility(View.VISIBLE);
 | 
			
		||||
                // binding.captionToggle.setVisibility(View.VISIBLE);
 | 
			
		||||
                binding.share.setVisibility(View.VISIBLE);
 | 
			
		||||
            }
 | 
			
		||||
            if (viewModel.hasPk() && !viewModel.getMedia().isCommentsDisabled()) {
 | 
			
		||||
@ -1599,16 +1317,6 @@ public class PostViewV2Fragment extends SharedElementTransitionDialogFragment im
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // private void animateY(final View v,
 | 
			
		||||
    //                       final float finalY,
 | 
			
		||||
    //                       final int duration,
 | 
			
		||||
    //                       final AnimatorListenerAdapter listener) {
 | 
			
		||||
    //     v.animate()
 | 
			
		||||
    //      .y(finalY)
 | 
			
		||||
    //      .setDuration(duration)
 | 
			
		||||
    //      .setListener(listener).start();
 | 
			
		||||
    // }
 | 
			
		||||
 | 
			
		||||
    private void navigateToProfile(final String username) {
 | 
			
		||||
        final NavController navController = getNavController();
 | 
			
		||||
        if (navController == null) return;
 | 
			
		||||
 | 
			
		||||
@ -4,6 +4,7 @@ import android.content.Context;
 | 
			
		||||
import android.content.pm.PackageManager;
 | 
			
		||||
import android.os.Bundle;
 | 
			
		||||
import android.os.Handler;
 | 
			
		||||
import android.util.Log;
 | 
			
		||||
import android.view.ActionMode;
 | 
			
		||||
import android.view.LayoutInflater;
 | 
			
		||||
import android.view.Menu;
 | 
			
		||||
@ -50,6 +51,7 @@ import static awais.instagrabber.utils.DownloadUtils.WRITE_PERMISSION;
 | 
			
		||||
import static awais.instagrabber.utils.Utils.settingsHelper;
 | 
			
		||||
 | 
			
		||||
public final class SavedViewerFragment extends Fragment implements SwipeRefreshLayout.OnRefreshListener {
 | 
			
		||||
    private static final String TAG = SavedViewerFragment.class.getSimpleName();
 | 
			
		||||
    private static final int STORAGE_PERM_REQUEST_CODE = 8020;
 | 
			
		||||
    private static final int STORAGE_PERM_REQUEST_CODE_FOR_SELECTION = 8030;
 | 
			
		||||
 | 
			
		||||
@ -171,16 +173,15 @@ public final class SavedViewerFragment extends Fragment implements SwipeRefreshL
 | 
			
		||||
                                    final View profilePicView,
 | 
			
		||||
                                    final View mainPostImage,
 | 
			
		||||
                                    final int position) {
 | 
			
		||||
            final PostViewV2Fragment.Builder builder = PostViewV2Fragment
 | 
			
		||||
                    .builder(feedModel);
 | 
			
		||||
            if (position >= 0) {
 | 
			
		||||
                builder.setPosition(position);
 | 
			
		||||
            final NavController navController = NavHostFragment.findNavController(SavedViewerFragment.this);
 | 
			
		||||
            final Bundle bundle = new Bundle();
 | 
			
		||||
            bundle.putSerializable(PostViewV2Fragment.ARG_MEDIA, feedModel);
 | 
			
		||||
            bundle.putInt(PostViewV2Fragment.ARG_SLIDER_POSITION, position);
 | 
			
		||||
            try {
 | 
			
		||||
                navController.navigate(R.id.action_global_post_view, bundle);
 | 
			
		||||
            } catch (Exception e) {
 | 
			
		||||
                Log.e(TAG, "openPostDialog: ", e);
 | 
			
		||||
            }
 | 
			
		||||
            if (!layoutPreferences.isAnimationDisabled()) {
 | 
			
		||||
                builder.setSharedProfilePicElement(profilePicView)
 | 
			
		||||
                       .setSharedMainPostElement(mainPostImage);
 | 
			
		||||
            }
 | 
			
		||||
            builder.build().show(getChildFragmentManager(), "post_view");
 | 
			
		||||
        }
 | 
			
		||||
    };
 | 
			
		||||
    private final FeedAdapterV2.SelectionModeCallback selectionModeCallback = new FeedAdapterV2.SelectionModeCallback() {
 | 
			
		||||
 | 
			
		||||
@ -35,6 +35,7 @@ import androidx.core.view.GestureDetectorCompat;
 | 
			
		||||
import androidx.fragment.app.Fragment;
 | 
			
		||||
import androidx.lifecycle.ViewModel;
 | 
			
		||||
import androidx.lifecycle.ViewModelProvider;
 | 
			
		||||
import androidx.navigation.NavController;
 | 
			
		||||
import androidx.navigation.NavDirections;
 | 
			
		||||
import androidx.navigation.fragment.NavHostFragment;
 | 
			
		||||
import androidx.recyclerview.widget.LinearLayoutManager;
 | 
			
		||||
@ -459,11 +460,14 @@ public class StoryViewerFragment extends Fragment {
 | 
			
		||||
            mediaService.fetch(Long.parseLong(mediaId), new ServiceCallback<Media>() {
 | 
			
		||||
                @Override
 | 
			
		||||
                public void onSuccess(final Media feedModel) {
 | 
			
		||||
                    final PostViewV2Fragment fragment = PostViewV2Fragment
 | 
			
		||||
                            .builder(feedModel)
 | 
			
		||||
                            .build();
 | 
			
		||||
                    fragment.setOnShowListener(dialog -> alertDialog.dismiss());
 | 
			
		||||
                    fragment.show(getChildFragmentManager(), "post_view");
 | 
			
		||||
                    final NavController navController = NavHostFragment.findNavController(StoryViewerFragment.this);
 | 
			
		||||
                    final Bundle bundle = new Bundle();
 | 
			
		||||
                    bundle.putSerializable(PostViewV2Fragment.ARG_MEDIA, feedModel);
 | 
			
		||||
                    try {
 | 
			
		||||
                        navController.navigate(R.id.action_global_post_view, bundle);
 | 
			
		||||
                    } catch (Exception e) {
 | 
			
		||||
                        Log.e(TAG, "openPostDialog: ", e);
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                @Override
 | 
			
		||||
@ -478,18 +482,18 @@ public class StoryViewerFragment extends Fragment {
 | 
			
		||||
            if (tag instanceof PollModel) {
 | 
			
		||||
                poll = (PollModel) tag;
 | 
			
		||||
                if (poll.getMyChoice() > -1) {
 | 
			
		||||
                    new AlertDialog.Builder(context).setTitle(R.string.voted_story_poll)
 | 
			
		||||
                                                    .setAdapter(new ArrayAdapter<>(context, android.R.layout.simple_list_item_1,
 | 
			
		||||
                                                                                   new String[]{
 | 
			
		||||
                                                                                           (poll.getMyChoice() == 0 ? "√ " : "") + poll
 | 
			
		||||
                                                                                                   .getLeftChoice() + " (" + poll
 | 
			
		||||
                                                                                                   .getLeftCount() + ")",
 | 
			
		||||
                                                                                           (poll.getMyChoice() == 1 ? "√ " : "") + poll
 | 
			
		||||
                                                                                                   .getRightChoice() + " (" + poll
 | 
			
		||||
                                                                                                   .getRightCount() + ")"
 | 
			
		||||
                                                                                   }), null)
 | 
			
		||||
                                                    .setPositiveButton(R.string.ok, null)
 | 
			
		||||
                                                    .show();
 | 
			
		||||
                    new AlertDialog.Builder(context)
 | 
			
		||||
                            .setTitle(R.string.voted_story_poll)
 | 
			
		||||
                            .setAdapter(new ArrayAdapter<>(
 | 
			
		||||
                                                context,
 | 
			
		||||
                                                android.R.layout.simple_list_item_1,
 | 
			
		||||
                                                new String[]{
 | 
			
		||||
                                                        (poll.getMyChoice() == 0 ? "√ " : "") + poll.getLeftChoice() + " (" + poll.getLeftCount() + ")",
 | 
			
		||||
                                                        (poll.getMyChoice() == 1 ? "√ " : "") + poll.getRightChoice() + " (" + poll.getRightCount() + ")"
 | 
			
		||||
                                                }),
 | 
			
		||||
                                        null)
 | 
			
		||||
                            .setPositiveButton(R.string.ok, null)
 | 
			
		||||
                            .show();
 | 
			
		||||
                } else {
 | 
			
		||||
                    new AlertDialog.Builder(context)
 | 
			
		||||
                            .setTitle(poll.getQuestion())
 | 
			
		||||
 | 
			
		||||
@ -10,6 +10,7 @@ import android.graphics.drawable.Drawable;
 | 
			
		||||
import android.graphics.drawable.GradientDrawable;
 | 
			
		||||
import android.os.Bundle;
 | 
			
		||||
import android.os.Handler;
 | 
			
		||||
import android.util.Log;
 | 
			
		||||
import android.view.ActionMode;
 | 
			
		||||
import android.view.LayoutInflater;
 | 
			
		||||
import android.view.Menu;
 | 
			
		||||
@ -51,8 +52,8 @@ import awais.instagrabber.databinding.FragmentTopicPostsBinding;
 | 
			
		||||
import awais.instagrabber.dialogs.PostsLayoutPreferencesDialogFragment;
 | 
			
		||||
import awais.instagrabber.fragments.main.DiscoverFragmentDirections;
 | 
			
		||||
import awais.instagrabber.models.PostsLayoutPreferences;
 | 
			
		||||
import awais.instagrabber.repositories.responses.discover.TopicCluster;
 | 
			
		||||
import awais.instagrabber.repositories.responses.Media;
 | 
			
		||||
import awais.instagrabber.repositories.responses.discover.TopicCluster;
 | 
			
		||||
import awais.instagrabber.utils.Constants;
 | 
			
		||||
import awais.instagrabber.utils.DownloadUtils;
 | 
			
		||||
import awais.instagrabber.utils.ResponseBodyUtils;
 | 
			
		||||
@ -63,6 +64,7 @@ import static androidx.core.content.PermissionChecker.checkSelfPermission;
 | 
			
		||||
import static awais.instagrabber.utils.DownloadUtils.WRITE_PERMISSION;
 | 
			
		||||
 | 
			
		||||
public class TopicPostsFragment extends Fragment implements SwipeRefreshLayout.OnRefreshListener {
 | 
			
		||||
    private static final String TAG = TopicPostsFragment.class.getSimpleName();
 | 
			
		||||
    private static final int STORAGE_PERM_REQUEST_CODE = 8020;
 | 
			
		||||
    private static final int STORAGE_PERM_REQUEST_CODE_FOR_SELECTION = 8030;
 | 
			
		||||
 | 
			
		||||
@ -182,16 +184,15 @@ public class TopicPostsFragment extends Fragment implements SwipeRefreshLayout.O
 | 
			
		||||
                                    final View profilePicView,
 | 
			
		||||
                                    final View mainPostImage,
 | 
			
		||||
                                    final int position) {
 | 
			
		||||
            final PostViewV2Fragment.Builder builder = PostViewV2Fragment
 | 
			
		||||
                    .builder(feedModel);
 | 
			
		||||
            if (position >= 0) {
 | 
			
		||||
                builder.setPosition(position);
 | 
			
		||||
            final NavController navController = NavHostFragment.findNavController(TopicPostsFragment.this);
 | 
			
		||||
            final Bundle bundle = new Bundle();
 | 
			
		||||
            bundle.putSerializable(PostViewV2Fragment.ARG_MEDIA, feedModel);
 | 
			
		||||
            bundle.putInt(PostViewV2Fragment.ARG_SLIDER_POSITION, position);
 | 
			
		||||
            try {
 | 
			
		||||
                navController.navigate(R.id.action_global_post_view, bundle);
 | 
			
		||||
            } catch (Exception e) {
 | 
			
		||||
                Log.e(TAG, "openPostDialog: ", e);
 | 
			
		||||
            }
 | 
			
		||||
            if (!layoutPreferences.isAnimationDisabled()) {
 | 
			
		||||
                builder.setSharedProfilePicElement(profilePicView)
 | 
			
		||||
                       .setSharedMainPostElement(mainPostImage);
 | 
			
		||||
            }
 | 
			
		||||
            builder.build().show(getChildFragmentManager(), "post_view");
 | 
			
		||||
        }
 | 
			
		||||
    };
 | 
			
		||||
    private final FeedAdapterV2.SelectionModeCallback selectionModeCallback = new FeedAdapterV2.SelectionModeCallback() {
 | 
			
		||||
 | 
			
		||||
@ -224,8 +224,14 @@ public class DirectMessageThreadFragment extends Fragment implements DirectReact
 | 
			
		||||
                }
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
            final PostViewV2Fragment.Builder builder = PostViewV2Fragment.builder(media);
 | 
			
		||||
            builder.build().show(getChildFragmentManager(), "post_view");
 | 
			
		||||
            final NavController navController = NavHostFragment.findNavController(DirectMessageThreadFragment.this);
 | 
			
		||||
            final Bundle bundle = new Bundle();
 | 
			
		||||
            bundle.putSerializable(PostViewV2Fragment.ARG_MEDIA, media);
 | 
			
		||||
            try {
 | 
			
		||||
                navController.navigate(R.id.action_global_post_view, bundle);
 | 
			
		||||
            } catch (Exception e) {
 | 
			
		||||
                Log.e(TAG, "openPostDialog: ", e);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        @Override
 | 
			
		||||
@ -327,11 +333,13 @@ public class DirectMessageThreadFragment extends Fragment implements DirectReact
 | 
			
		||||
        final Bundle arguments = getArguments();
 | 
			
		||||
        if (arguments == null) return;
 | 
			
		||||
        final DirectMessageThreadFragmentArgs fragmentArgs = DirectMessageThreadFragmentArgs.fromBundle(arguments);
 | 
			
		||||
        final User currentUser = appStateViewModel.getCurrentUser();
 | 
			
		||||
        if (currentUser == null) return;
 | 
			
		||||
        final DirectThreadViewModelFactory viewModelFactory = new DirectThreadViewModelFactory(
 | 
			
		||||
                fragmentActivity.getApplication(),
 | 
			
		||||
                fragmentArgs.getThreadId(),
 | 
			
		||||
                fragmentArgs.getPending(),
 | 
			
		||||
                appStateViewModel.getCurrentUser()
 | 
			
		||||
                currentUser
 | 
			
		||||
        );
 | 
			
		||||
        viewModel = new ViewModelProvider(this, viewModelFactory).get(DirectThreadViewModel.class);
 | 
			
		||||
        setHasOptionsMenu(true);
 | 
			
		||||
@ -386,7 +394,7 @@ public class DirectMessageThreadFragment extends Fragment implements DirectReact
 | 
			
		||||
            final DirectMessageThreadFragmentDirections.ActionThreadToSettings directions = DirectMessageThreadFragmentDirections
 | 
			
		||||
                    .actionThreadToSettings(viewModel.getThreadId(), null);
 | 
			
		||||
            final Boolean pending = viewModel.isPending().getValue();
 | 
			
		||||
            directions.setPending(pending == null ? false : pending);
 | 
			
		||||
            directions.setPending(pending != null && pending);
 | 
			
		||||
            NavHostFragment.findNavController(this).navigate(directions);
 | 
			
		||||
            return true;
 | 
			
		||||
        }
 | 
			
		||||
@ -414,14 +422,10 @@ public class DirectMessageThreadFragment extends Fragment implements DirectReact
 | 
			
		||||
                        case SUCCESS:
 | 
			
		||||
                            Toast.makeText(context, R.string.marked_as_seen, Toast.LENGTH_SHORT).show();
 | 
			
		||||
                        case LOADING:
 | 
			
		||||
                            if (item != null) {
 | 
			
		||||
                                item.setEnabled(false);
 | 
			
		||||
                            }
 | 
			
		||||
                            item.setEnabled(false);
 | 
			
		||||
                            break;
 | 
			
		||||
                        case ERROR:
 | 
			
		||||
                            if (item != null) {
 | 
			
		||||
                                item.setEnabled(true);
 | 
			
		||||
                            }
 | 
			
		||||
                            item.setEnabled(true);
 | 
			
		||||
                            if (resource.message != null) {
 | 
			
		||||
                                Snackbar.make(context, binding.getRoot(), resource.message, Snackbar.LENGTH_LONG).show();
 | 
			
		||||
                                return;
 | 
			
		||||
@ -1352,7 +1356,7 @@ public class DirectMessageThreadFragment extends Fragment implements DirectReact
 | 
			
		||||
        requestPermissions(DownloadUtils.PERMS, STORAGE_PERM_REQUEST_CODE);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @NonNull
 | 
			
		||||
    @Nullable
 | 
			
		||||
    private User getUser(final long userId) {
 | 
			
		||||
        for (final User user : users) {
 | 
			
		||||
            if (userId != user.getPk()) continue;
 | 
			
		||||
 | 
			
		||||
@ -18,7 +18,8 @@ import androidx.activity.OnBackPressedCallback;
 | 
			
		||||
import androidx.activity.OnBackPressedDispatcher;
 | 
			
		||||
import androidx.annotation.NonNull;
 | 
			
		||||
import androidx.annotation.Nullable;
 | 
			
		||||
import androidx.coordinatorlayout.widget.CoordinatorLayout;
 | 
			
		||||
import androidx.constraintlayout.motion.widget.MotionLayout;
 | 
			
		||||
import androidx.constraintlayout.motion.widget.MotionScene;
 | 
			
		||||
import androidx.core.content.PermissionChecker;
 | 
			
		||||
import androidx.fragment.app.Fragment;
 | 
			
		||||
import androidx.lifecycle.ViewModelProvider;
 | 
			
		||||
@ -29,7 +30,6 @@ import androidx.recyclerview.widget.LinearLayoutManager;
 | 
			
		||||
import androidx.recyclerview.widget.RecyclerView;
 | 
			
		||||
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
 | 
			
		||||
 | 
			
		||||
import com.google.android.material.appbar.CollapsingToolbarLayout;
 | 
			
		||||
import com.google.common.collect.ImmutableList;
 | 
			
		||||
 | 
			
		||||
import java.util.List;
 | 
			
		||||
@ -64,7 +64,7 @@ public class FeedFragment extends Fragment implements SwipeRefreshLayout.OnRefre
 | 
			
		||||
    private static final int STORAGE_PERM_REQUEST_CODE_FOR_SELECTION = 8030;
 | 
			
		||||
 | 
			
		||||
    private MainActivity fragmentActivity;
 | 
			
		||||
    private CoordinatorLayout root;
 | 
			
		||||
    private MotionLayout root;
 | 
			
		||||
    private FragmentFeedBinding binding;
 | 
			
		||||
    private StoriesService storiesService;
 | 
			
		||||
    private boolean shouldRefresh = true;
 | 
			
		||||
@ -179,15 +179,21 @@ public class FeedFragment extends Fragment implements SwipeRefreshLayout.OnRefre
 | 
			
		||||
                                    final View profilePicView,
 | 
			
		||||
                                    final View mainPostImage,
 | 
			
		||||
                                    final int position) {
 | 
			
		||||
            final PostViewV2Fragment.Builder builder = PostViewV2Fragment.builder(feedModel);
 | 
			
		||||
            if (position >= 0) {
 | 
			
		||||
                builder.setPosition(position);
 | 
			
		||||
            // ViewCompat.setTransitionName(profilePicView, "profile_pic");
 | 
			
		||||
            // ViewCompat.setTransitionName(mainPostImage, "post_image");
 | 
			
		||||
            // final FragmentNavigator.Extras extras = new FragmentNavigator.Extras.Builder()
 | 
			
		||||
            //         .addSharedElement(profilePicView, "profile_pic")
 | 
			
		||||
            //         .addSharedElement(mainPostImage, "post_image")
 | 
			
		||||
            //         .build();
 | 
			
		||||
            final NavController navController = NavHostFragment.findNavController(FeedFragment.this);
 | 
			
		||||
            final Bundle bundle = new Bundle();
 | 
			
		||||
            bundle.putSerializable(PostViewV2Fragment.ARG_MEDIA, feedModel);
 | 
			
		||||
            bundle.putInt(PostViewV2Fragment.ARG_SLIDER_POSITION, position);
 | 
			
		||||
            try {
 | 
			
		||||
                navController.navigate(R.id.action_global_post_view, bundle);
 | 
			
		||||
            } catch (Exception e) {
 | 
			
		||||
                Log.e(TAG, "openPostDialog: ", e);
 | 
			
		||||
            }
 | 
			
		||||
            if (!layoutPreferences.isAnimationDisabled()) {
 | 
			
		||||
                builder.setSharedProfilePicElement(profilePicView)
 | 
			
		||||
                       .setSharedMainPostElement(mainPostImage);
 | 
			
		||||
            }
 | 
			
		||||
            builder.build().show(getChildFragmentManager(), "post_view");
 | 
			
		||||
        }
 | 
			
		||||
    };
 | 
			
		||||
    private final OnBackPressedCallback onBackPressedCallback = new OnBackPressedCallback(false) {
 | 
			
		||||
@ -278,9 +284,6 @@ public class FeedFragment extends Fragment implements SwipeRefreshLayout.OnRefre
 | 
			
		||||
                             final Bundle savedInstanceState) {
 | 
			
		||||
        if (root != null) {
 | 
			
		||||
            shouldRefresh = false;
 | 
			
		||||
            if (storiesRecyclerView != null) {
 | 
			
		||||
                fragmentActivity.setCollapsingView(storiesRecyclerView);
 | 
			
		||||
            }
 | 
			
		||||
            return root;
 | 
			
		||||
        }
 | 
			
		||||
        binding = FragmentFeedBinding.inflate(inflater, container, false);
 | 
			
		||||
@ -381,6 +384,17 @@ public class FeedFragment extends Fragment implements SwipeRefreshLayout.OnRefre
 | 
			
		||||
                                .setSelectionModeCallback(selectionModeCallback)
 | 
			
		||||
                                .init();
 | 
			
		||||
        binding.feedSwipeRefreshLayout.setRefreshing(true);
 | 
			
		||||
        binding.feedRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
 | 
			
		||||
            @Override
 | 
			
		||||
            public void onScrolled(@NonNull final RecyclerView recyclerView, final int dx, final int dy) {
 | 
			
		||||
                super.onScrolled(recyclerView, dx, dy);
 | 
			
		||||
                final boolean canScrollVertically = recyclerView.canScrollVertically(-1);
 | 
			
		||||
                final MotionScene.Transition transition = root.getTransition(R.id.transition);
 | 
			
		||||
                if (transition != null) {
 | 
			
		||||
                    transition.setEnable(!canScrollVertically);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
        // if (shouldAutoPlay) {
 | 
			
		||||
        //     videoAwareRecyclerScroller = new VideoAwareRecyclerScroller();
 | 
			
		||||
        //     binding.feedRecyclerView.addOnScrollListener(videoAwareRecyclerScroller);
 | 
			
		||||
@ -396,15 +410,9 @@ public class FeedFragment extends Fragment implements SwipeRefreshLayout.OnRefre
 | 
			
		||||
        feedStoriesViewModel = new ViewModelProvider(fragmentActivity).get(FeedStoriesViewModel.class);
 | 
			
		||||
        final Context context = getContext();
 | 
			
		||||
        if (context == null) return;
 | 
			
		||||
        storiesRecyclerView = new RecyclerView(context);
 | 
			
		||||
        final CollapsingToolbarLayout.LayoutParams params = new CollapsingToolbarLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
 | 
			
		||||
                                                                                                     ViewGroup.LayoutParams.WRAP_CONTENT);
 | 
			
		||||
        params.setMargins(0, Utils.getActionBarHeight(context), 0, 0);
 | 
			
		||||
        storiesRecyclerView.setLayoutParams(params);
 | 
			
		||||
        storiesRecyclerView.setClipToPadding(false);
 | 
			
		||||
        storiesRecyclerView = binding.header;
 | 
			
		||||
        storiesRecyclerView.setLayoutManager(new LinearLayoutManager(context, RecyclerView.HORIZONTAL, false));
 | 
			
		||||
        storiesRecyclerView.setAdapter(feedStoriesAdapter);
 | 
			
		||||
        fragmentActivity.setCollapsingView(storiesRecyclerView);
 | 
			
		||||
        feedStoriesViewModel.getList().observe(getViewLifecycleOwner(), feedStoriesAdapter::submitList);
 | 
			
		||||
        fetchStories();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@ -27,7 +27,8 @@ import androidx.annotation.Nullable;
 | 
			
		||||
import androidx.appcompat.app.ActionBar;
 | 
			
		||||
import androidx.appcompat.app.AlertDialog;
 | 
			
		||||
import androidx.appcompat.content.res.AppCompatResources;
 | 
			
		||||
import androidx.coordinatorlayout.widget.CoordinatorLayout;
 | 
			
		||||
import androidx.constraintlayout.motion.widget.MotionLayout;
 | 
			
		||||
import androidx.constraintlayout.motion.widget.MotionScene;
 | 
			
		||||
import androidx.core.content.PermissionChecker;
 | 
			
		||||
import androidx.fragment.app.Fragment;
 | 
			
		||||
import androidx.fragment.app.FragmentManager;
 | 
			
		||||
@ -108,7 +109,7 @@ public class ProfileFragment extends Fragment implements SwipeRefreshLayout.OnRe
 | 
			
		||||
    private static final int STORAGE_PERM_REQUEST_CODE_FOR_SELECTION = 8030;
 | 
			
		||||
 | 
			
		||||
    private MainActivity fragmentActivity;
 | 
			
		||||
    private CoordinatorLayout root;
 | 
			
		||||
    private MotionLayout root;
 | 
			
		||||
    private FragmentProfileBinding binding;
 | 
			
		||||
    private boolean isLoggedIn;
 | 
			
		||||
    private String cookie;
 | 
			
		||||
@ -250,23 +251,15 @@ public class ProfileFragment extends Fragment implements SwipeRefreshLayout.OnRe
 | 
			
		||||
                                    final View profilePicView,
 | 
			
		||||
                                    final View mainPostImage,
 | 
			
		||||
                                    final int position) {
 | 
			
		||||
            final PostViewV2Fragment.Builder builder = PostViewV2Fragment
 | 
			
		||||
                    .builder(feedModel);
 | 
			
		||||
            if (position >= 0) {
 | 
			
		||||
                builder.setPosition(position);
 | 
			
		||||
            final NavController navController = NavHostFragment.findNavController(ProfileFragment.this);
 | 
			
		||||
            final Bundle bundle = new Bundle();
 | 
			
		||||
            bundle.putSerializable(PostViewV2Fragment.ARG_MEDIA, feedModel);
 | 
			
		||||
            bundle.putInt(PostViewV2Fragment.ARG_SLIDER_POSITION, position);
 | 
			
		||||
            try {
 | 
			
		||||
                navController.navigate(R.id.action_global_post_view, bundle);
 | 
			
		||||
            } catch (Exception e) {
 | 
			
		||||
                Log.e(TAG, "openPostDialog: ", e);
 | 
			
		||||
            }
 | 
			
		||||
            if (!layoutPreferences.isAnimationDisabled()) {
 | 
			
		||||
                builder.setSharedProfilePicElement(profilePicView)
 | 
			
		||||
                       .setSharedMainPostElement(mainPostImage);
 | 
			
		||||
            }
 | 
			
		||||
            final PostViewV2Fragment postViewV2Fragment = builder.build();
 | 
			
		||||
            postViewV2Fragment.setOnDeleteListener(() -> {
 | 
			
		||||
                postViewV2Fragment.dismiss();
 | 
			
		||||
                binding.postsRecyclerView.refresh();
 | 
			
		||||
            });
 | 
			
		||||
            final FragmentManager fragmentManager = getChildFragmentManager();
 | 
			
		||||
            if (fragmentManager.isDestroyed() || fragmentManager.isStateSaved()) return;
 | 
			
		||||
            postViewV2Fragment.show(fragmentManager, "post_view");
 | 
			
		||||
        }
 | 
			
		||||
    };
 | 
			
		||||
    private final FeedAdapterV2.SelectionModeCallback selectionModeCallback = new FeedAdapterV2.SelectionModeCallback() {
 | 
			
		||||
@ -345,7 +338,6 @@ public class ProfileFragment extends Fragment implements SwipeRefreshLayout.OnRe
 | 
			
		||||
                    final boolean isSame = ("@" + profileModelUsername).equals(this.username);
 | 
			
		||||
                    if (isSame) {
 | 
			
		||||
                        setUsernameDelayed();
 | 
			
		||||
                        fragmentActivity.setCollapsingView(profileDetailsBinding.getRoot());
 | 
			
		||||
                        shouldRefresh = false;
 | 
			
		||||
                        return root;
 | 
			
		||||
                    }
 | 
			
		||||
@ -357,14 +349,12 @@ public class ProfileFragment extends Fragment implements SwipeRefreshLayout.OnRe
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            setUsernameDelayed();
 | 
			
		||||
            fragmentActivity.setCollapsingView(profileDetailsBinding.getRoot());
 | 
			
		||||
            shouldRefresh = false;
 | 
			
		||||
            return root;
 | 
			
		||||
        }
 | 
			
		||||
        binding = FragmentProfileBinding.inflate(inflater, container, false);
 | 
			
		||||
        root = binding.getRoot();
 | 
			
		||||
        profileDetailsBinding = LayoutProfileDetailsBinding.inflate(inflater, fragmentActivity.getCollapsingToolbarView(), false);
 | 
			
		||||
        fragmentActivity.setCollapsingView(profileDetailsBinding.getRoot());
 | 
			
		||||
        profileDetailsBinding = binding.header;
 | 
			
		||||
        return root;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@ -554,14 +544,6 @@ public class ProfileFragment extends Fragment implements SwipeRefreshLayout.OnRe
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void onDestroyView() {
 | 
			
		||||
        super.onDestroyView();
 | 
			
		||||
        if (profileDetailsBinding != null) {
 | 
			
		||||
            fragmentActivity.removeCollapsingView(profileDetailsBinding.getRoot());
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void onRequestPermissionsResult(final int requestCode, @NonNull final String[] permissions, @NonNull final int[] grantResults) {
 | 
			
		||||
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
 | 
			
		||||
@ -589,7 +571,7 @@ public class ProfileFragment extends Fragment implements SwipeRefreshLayout.OnRe
 | 
			
		||||
            setUsernameDelayed();
 | 
			
		||||
        }
 | 
			
		||||
        if (TextUtils.isEmpty(username) && !isLoggedIn) {
 | 
			
		||||
            profileDetailsBinding.infoContainer.setVisibility(View.GONE);
 | 
			
		||||
            binding.header.getRoot().setVisibility(View.GONE);
 | 
			
		||||
            binding.swipeRefreshLayout.setEnabled(false);
 | 
			
		||||
            binding.privatePage1.setImageResource(R.drawable.ic_outline_info_24);
 | 
			
		||||
            binding.privatePage2.setText(R.string.no_acc);
 | 
			
		||||
@ -1209,6 +1191,17 @@ public class ProfileFragment extends Fragment implements SwipeRefreshLayout.OnRe
 | 
			
		||||
                                 .setFeedItemCallback(feedItemCallback)
 | 
			
		||||
                                 .setSelectionModeCallback(selectionModeCallback)
 | 
			
		||||
                                 .init();
 | 
			
		||||
        binding.postsRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
 | 
			
		||||
            @Override
 | 
			
		||||
            public void onScrolled(@NonNull final RecyclerView recyclerView, final int dx, final int dy) {
 | 
			
		||||
                super.onScrolled(recyclerView, dx, dy);
 | 
			
		||||
                final boolean canScrollVertically = recyclerView.canScrollVertically(-1);
 | 
			
		||||
                final MotionScene.Transition transition = root.getTransition(R.id.transition);
 | 
			
		||||
                if (transition != null) {
 | 
			
		||||
                    transition.setEnable(!canScrollVertically);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
        binding.swipeRefreshLayout.setRefreshing(true);
 | 
			
		||||
        postsSetupDone = true;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@ -21,6 +21,7 @@ import com.google.android.material.bottomnavigation.BottomNavigationView;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
 | 
			
		||||
import awais.instagrabber.R;
 | 
			
		||||
import awais.instagrabber.customviews.NavHostFragmentWithDefaultAnimations;
 | 
			
		||||
import awais.instagrabber.fragments.main.FeedFragment;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@ -139,7 +140,7 @@ public class NavigationExtensions {
 | 
			
		||||
        if (existingFragment != null) {
 | 
			
		||||
            return existingFragment;
 | 
			
		||||
        }
 | 
			
		||||
        final NavHostFragment navHostFragment = NavHostFragment.create(navGraphId);
 | 
			
		||||
        final NavHostFragment navHostFragment = NavHostFragmentWithDefaultAnimations.create(navGraphId);
 | 
			
		||||
        fragmentManager.beginTransaction()
 | 
			
		||||
                       .setReorderingAllowed(true)
 | 
			
		||||
                       .add(containerId, navHostFragment, fragmentTag)
 | 
			
		||||
 | 
			
		||||
@ -288,6 +288,12 @@ public final class Utils {
 | 
			
		||||
        return outValue.data;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static int getAttrValue(@NonNull final Context context, final int attr) {
 | 
			
		||||
        final TypedValue outValue = new TypedValue();
 | 
			
		||||
        context.getTheme().resolveAttribute(attr, outValue, true);
 | 
			
		||||
        return outValue.data;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static void transparentStatusBar(final Activity activity,
 | 
			
		||||
                                            final boolean enable,
 | 
			
		||||
                                            final boolean fullscreen) {
 | 
			
		||||
 | 
			
		||||
@ -65,6 +65,7 @@ public class IgErrorsInterceptor implements Interceptor {
 | 
			
		||||
        if (body == null) return;
 | 
			
		||||
        try {
 | 
			
		||||
            final String bodyString = body.string();
 | 
			
		||||
            Log.d(TAG, "checkError: " + bodyString);
 | 
			
		||||
            final JSONObject jsonObject = new JSONObject(bodyString);
 | 
			
		||||
            String message = jsonObject.optString("message");
 | 
			
		||||
            if (!TextUtils.isEmpty(message)) {
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										11
									
								
								app/src/main/res/anim/slide_in_right.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								app/src/main/res/anim/slide_in_right.xml
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,11 @@
 | 
			
		||||
<?xml version="1.0" encoding="utf-8"?>
 | 
			
		||||
<set xmlns:android="http://schemas.android.com/apk/res/android">
 | 
			
		||||
    <translate
 | 
			
		||||
        android:duration="@android:integer/config_mediumAnimTime"
 | 
			
		||||
        android:fromXDelta="50%p"
 | 
			
		||||
        android:toXDelta="0" />
 | 
			
		||||
    <alpha
 | 
			
		||||
        android:duration="@android:integer/config_mediumAnimTime"
 | 
			
		||||
        android:fromAlpha="0.0"
 | 
			
		||||
        android:toAlpha="1.0" />
 | 
			
		||||
</set>
 | 
			
		||||
@ -1,10 +1,5 @@
 | 
			
		||||
<?xml version="1.0" encoding="utf-8"?>
 | 
			
		||||
<set xmlns:android="http://schemas.android.com/apk/res/android"
 | 
			
		||||
    android:shareInterpolator="false">
 | 
			
		||||
    <translate
 | 
			
		||||
        android:duration="300"
 | 
			
		||||
        android:fromXDelta="100%"
 | 
			
		||||
        android:fromYDelta="0%"
 | 
			
		||||
        android:toXDelta="0%"
 | 
			
		||||
        android:toYDelta="0%" />
 | 
			
		||||
</set>
 | 
			
		||||
<translate xmlns:android="http://schemas.android.com/apk/res/android"
 | 
			
		||||
    android:duration="300"
 | 
			
		||||
    android:fromXDelta="100%"
 | 
			
		||||
    android:toXDelta="0%" />
 | 
			
		||||
							
								
								
									
										11
									
								
								app/src/main/res/anim/slide_out_left.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								app/src/main/res/anim/slide_out_left.xml
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,11 @@
 | 
			
		||||
<?xml version="1.0" encoding="utf-8"?>
 | 
			
		||||
<set xmlns:android="http://schemas.android.com/apk/res/android">
 | 
			
		||||
    <translate
 | 
			
		||||
        android:duration="@android:integer/config_mediumAnimTime"
 | 
			
		||||
        android:fromXDelta="0"
 | 
			
		||||
        android:toXDelta="-50%p" />
 | 
			
		||||
    <alpha
 | 
			
		||||
        android:duration="@android:integer/config_mediumAnimTime"
 | 
			
		||||
        android:fromAlpha="1.0"
 | 
			
		||||
        android:toAlpha="0.0" />
 | 
			
		||||
</set>
 | 
			
		||||
@ -1,10 +1,5 @@
 | 
			
		||||
<?xml version="1.0" encoding="utf-8"?>
 | 
			
		||||
<set xmlns:android="http://schemas.android.com/apk/res/android"
 | 
			
		||||
    android:shareInterpolator="false">
 | 
			
		||||
    <translate
 | 
			
		||||
        android:duration="300"
 | 
			
		||||
        android:fromXDelta="0%"
 | 
			
		||||
        android:fromYDelta="0%"
 | 
			
		||||
        android:toXDelta="100%"
 | 
			
		||||
        android:toYDelta="0%" />
 | 
			
		||||
</set>
 | 
			
		||||
<translate xmlns:android="http://schemas.android.com/apk/res/android"
 | 
			
		||||
    android:duration="300"
 | 
			
		||||
    android:fromXDelta="0%"
 | 
			
		||||
    android:toXDelta="100%" />
 | 
			
		||||
							
								
								
									
										10
									
								
								app/src/main/res/drawable/ic_round_edit_24.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								app/src/main/res/drawable/ic_round_edit_24.xml
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,10 @@
 | 
			
		||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
 | 
			
		||||
    android:width="24dp"
 | 
			
		||||
    android:height="24dp"
 | 
			
		||||
    android:viewportWidth="24"
 | 
			
		||||
    android:viewportHeight="24"
 | 
			
		||||
    android:tint="?attr/colorControlNormal">
 | 
			
		||||
  <path
 | 
			
		||||
      android:fillColor="@android:color/white"
 | 
			
		||||
      android:pathData="M3,17.46v3.04c0,0.28 0.22,0.5 0.5,0.5h3.04c0.13,0 0.26,-0.05 0.35,-0.15L17.81,9.94l-3.75,-3.75L3.15,17.1c-0.1,0.1 -0.15,0.22 -0.15,0.36zM20.71,7.04c0.39,-0.39 0.39,-1.02 0,-1.41l-2.34,-2.34c-0.39,-0.39 -1.02,-0.39 -1.41,0l-1.83,1.83 3.75,3.75 1.83,-1.83z"/>
 | 
			
		||||
</vector>
 | 
			
		||||
@ -1,5 +1,5 @@
 | 
			
		||||
<?xml version="1.0" encoding="utf-8"?>
 | 
			
		||||
<shape xmlns:android="http://schemas.android.com/apk/res/android"
 | 
			
		||||
    android:shape="oval">
 | 
			
		||||
    <solid android:color="@color/black" />
 | 
			
		||||
    <solid android:color="@android:color/transparent" />
 | 
			
		||||
</shape>
 | 
			
		||||
@ -1,477 +1,514 @@
 | 
			
		||||
<?xml version="1.0" encoding="utf-8"?>
 | 
			
		||||
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
 | 
			
		||||
<androidx.core.widget.NestedScrollView xmlns:android="http://schemas.android.com/apk/res/android"
 | 
			
		||||
    xmlns:app="http://schemas.android.com/apk/res-auto"
 | 
			
		||||
    xmlns:tools="http://schemas.android.com/tools"
 | 
			
		||||
    android:layout_width="match_parent"
 | 
			
		||||
    android:layout_height="match_parent"
 | 
			
		||||
    android:background="@color/black_a80">
 | 
			
		||||
    android:layout_height="match_parent">
 | 
			
		||||
 | 
			
		||||
    <awais.instagrabber.customviews.drawee.DraggableZoomableDraweeView
 | 
			
		||||
        android:id="@+id/post_image"
 | 
			
		||||
    <androidx.constraintlayout.widget.ConstraintLayout
 | 
			
		||||
        android:layout_width="match_parent"
 | 
			
		||||
        android:layout_height="match_parent"
 | 
			
		||||
        android:background="@null"
 | 
			
		||||
        android:clickable="true"
 | 
			
		||||
        android:focusable="true"
 | 
			
		||||
        android:transitionName="post_image"
 | 
			
		||||
        app:actualImageScaleType="fitCenter"
 | 
			
		||||
        app:layout_constraintBottom_toBottomOf="parent"
 | 
			
		||||
        app:layout_constraintEnd_toEndOf="parent"
 | 
			
		||||
        app:layout_constraintStart_toStartOf="parent"
 | 
			
		||||
        app:layout_constraintTop_toTopOf="parent"
 | 
			
		||||
        tools:background="@mipmap/ic_launcher"
 | 
			
		||||
        tools:visibility="visible" />
 | 
			
		||||
        android:layout_height="wrap_content">
 | 
			
		||||
 | 
			
		||||
    <include
 | 
			
		||||
        android:id="@+id/video_post"
 | 
			
		||||
        layout="@layout/layout_video_player_with_thumbnail"
 | 
			
		||||
        android:visibility="gone" />
 | 
			
		||||
 | 
			
		||||
    <androidx.viewpager2.widget.ViewPager2
 | 
			
		||||
        android:id="@+id/slider_parent"
 | 
			
		||||
        android:layout_width="match_parent"
 | 
			
		||||
        android:layout_height="match_parent"
 | 
			
		||||
        android:visibility="gone"
 | 
			
		||||
        tools:visibility="visible" />
 | 
			
		||||
 | 
			
		||||
    <View
 | 
			
		||||
        android:id="@+id/top_bg"
 | 
			
		||||
        android:layout_width="0dp"
 | 
			
		||||
        android:layout_height="0dp"
 | 
			
		||||
        android:background="@color/black_a80"
 | 
			
		||||
        app:layout_constraintBottom_toBottomOf="@id/profile_pic"
 | 
			
		||||
        app:layout_constraintEnd_toEndOf="parent"
 | 
			
		||||
        app:layout_constraintStart_toStartOf="parent"
 | 
			
		||||
        app:layout_constraintTop_toTopOf="parent" />
 | 
			
		||||
 | 
			
		||||
    <awais.instagrabber.customviews.ProfilePicView
 | 
			
		||||
        android:id="@+id/profile_pic"
 | 
			
		||||
        android:layout_width="wrap_content"
 | 
			
		||||
        android:layout_height="wrap_content"
 | 
			
		||||
        android:layout_margin="12dp"
 | 
			
		||||
        android:transitionName="profile_pic"
 | 
			
		||||
        app:layout_constraintBottom_toBottomOf="@id/top_bg"
 | 
			
		||||
        app:layout_constraintEnd_toStartOf="@id/title"
 | 
			
		||||
        app:layout_constraintHorizontal_bias="0"
 | 
			
		||||
        app:layout_constraintHorizontal_chainStyle="packed"
 | 
			
		||||
        app:layout_constraintStart_toStartOf="parent"
 | 
			
		||||
        app:layout_constraintTop_toTopOf="@id/top_bg"
 | 
			
		||||
        app:size="regular" />
 | 
			
		||||
 | 
			
		||||
    <androidx.appcompat.widget.AppCompatTextView
 | 
			
		||||
        android:id="@+id/title"
 | 
			
		||||
        android:layout_width="0dp"
 | 
			
		||||
        android:layout_height="wrap_content"
 | 
			
		||||
        android:ellipsize="marquee"
 | 
			
		||||
        android:singleLine="true"
 | 
			
		||||
        android:textAppearance="@style/TextAppearance.MaterialComponents.Headline6"
 | 
			
		||||
        android:textColor="@color/white"
 | 
			
		||||
        app:layout_constrainedWidth="true"
 | 
			
		||||
        app:layout_constraintBottom_toTopOf="@id/subtitle"
 | 
			
		||||
        app:layout_constraintEnd_toStartOf="@id/options"
 | 
			
		||||
        app:layout_constraintStart_toEndOf="@id/profile_pic"
 | 
			
		||||
        app:layout_constraintTop_toTopOf="@id/profile_pic"
 | 
			
		||||
        tools:text="Username Username Username" />
 | 
			
		||||
 | 
			
		||||
    <androidx.appcompat.widget.AppCompatTextView
 | 
			
		||||
        android:id="@+id/subtitle"
 | 
			
		||||
        android:layout_width="0dp"
 | 
			
		||||
        android:layout_height="wrap_content"
 | 
			
		||||
        android:ellipsize="end"
 | 
			
		||||
        android:singleLine="true"
 | 
			
		||||
        android:textAppearance="@style/TextAppearance.MaterialComponents.Subtitle1"
 | 
			
		||||
        android:textColor="@color/white"
 | 
			
		||||
        app:layout_constraintBottom_toBottomOf="@id/profile_pic"
 | 
			
		||||
        app:layout_constraintEnd_toStartOf="@id/options"
 | 
			
		||||
        app:layout_constraintStart_toStartOf="@id/title"
 | 
			
		||||
        app:layout_constraintTop_toBottomOf="@id/title"
 | 
			
		||||
        tools:text="Full name Full name Full name Full name Full name Full name Full name " />
 | 
			
		||||
 | 
			
		||||
    <androidx.appcompat.widget.AppCompatImageView
 | 
			
		||||
        android:id="@+id/options"
 | 
			
		||||
        android:layout_width="wrap_content"
 | 
			
		||||
        android:layout_height="0dp"
 | 
			
		||||
        android:paddingStart="8dp"
 | 
			
		||||
        android:paddingEnd="8dp"
 | 
			
		||||
        android:visibility="gone"
 | 
			
		||||
        app:layout_constraintBottom_toBottomOf="@id/top_bg"
 | 
			
		||||
        app:layout_constraintEnd_toEndOf="parent"
 | 
			
		||||
        app:layout_constraintTop_toTopOf="@id/top_bg"
 | 
			
		||||
        app:srcCompat="@drawable/ic_more_vert_24"
 | 
			
		||||
        app:tint="@color/white"
 | 
			
		||||
        tools:visibility="visible" />
 | 
			
		||||
 | 
			
		||||
    <androidx.constraintlayout.widget.Group
 | 
			
		||||
        android:id="@+id/user_details_group"
 | 
			
		||||
        android:layout_width="0dp"
 | 
			
		||||
        android:layout_height="0dp"
 | 
			
		||||
        app:constraint_referenced_ids="top_bg, profile_pic,title,subtitle,options"
 | 
			
		||||
        tools:visibility="visible" />
 | 
			
		||||
 | 
			
		||||
    <androidx.appcompat.widget.AppCompatTextView
 | 
			
		||||
        android:id="@+id/media_counter"
 | 
			
		||||
        android:layout_width="wrap_content"
 | 
			
		||||
        android:layout_height="wrap_content"
 | 
			
		||||
        android:layout_marginStart="16dp"
 | 
			
		||||
        android:layout_marginTop="16dp"
 | 
			
		||||
        android:background="@drawable/rounder_corner_semi_black_bg"
 | 
			
		||||
        android:gravity="center"
 | 
			
		||||
        android:padding="8dp"
 | 
			
		||||
        android:textAppearance="@style/TextAppearance.AppCompat.Caption"
 | 
			
		||||
        android:textColor="@android:color/white"
 | 
			
		||||
        android:visibility="gone"
 | 
			
		||||
        app:layout_constraintStart_toStartOf="parent"
 | 
			
		||||
        app:layout_constraintTop_toBottomOf="@id/top_bg"
 | 
			
		||||
        tools:text="1/5"
 | 
			
		||||
        tools:visibility="visible" />
 | 
			
		||||
 | 
			
		||||
    <com.google.android.material.button.MaterialButton
 | 
			
		||||
        android:id="@+id/location"
 | 
			
		||||
        style="?borderlessButtonStyle"
 | 
			
		||||
        android:layout_width="wrap_content"
 | 
			
		||||
        android:layout_height="wrap_content"
 | 
			
		||||
        android:layout_marginTop="16dp"
 | 
			
		||||
        android:layout_marginEnd="16dp"
 | 
			
		||||
        android:elevation="0dp"
 | 
			
		||||
        android:ellipsize="end"
 | 
			
		||||
        android:insetTop="0dp"
 | 
			
		||||
        android:insetBottom="0dp"
 | 
			
		||||
        android:maxWidth="200dp"
 | 
			
		||||
        android:maxLines="1"
 | 
			
		||||
        android:minHeight="32dp"
 | 
			
		||||
        android:paddingStart="8dp"
 | 
			
		||||
        android:paddingEnd="8dp"
 | 
			
		||||
        android:textAlignment="viewStart"
 | 
			
		||||
        android:textAllCaps="false"
 | 
			
		||||
        android:textColor="@android:color/white"
 | 
			
		||||
        android:visibility="gone"
 | 
			
		||||
        app:backgroundTint="@color/black_a50"
 | 
			
		||||
        app:elevation="0dp"
 | 
			
		||||
        app:icon="@drawable/ic_round_location_on_24"
 | 
			
		||||
        app:iconSize="16dp"
 | 
			
		||||
        app:iconTint="@color/white"
 | 
			
		||||
        app:layout_constraintEnd_toEndOf="parent"
 | 
			
		||||
        app:layout_constraintTop_toBottomOf="@id/top_bg"
 | 
			
		||||
        app:rippleColor="@color/grey_600"
 | 
			
		||||
        tools:text="Location, Location, Location, Location, "
 | 
			
		||||
        tools:visibility="visible" />
 | 
			
		||||
 | 
			
		||||
    <androidx.coordinatorlayout.widget.CoordinatorLayout
 | 
			
		||||
        android:layout_width="match_parent"
 | 
			
		||||
        android:layout_height="0dp"
 | 
			
		||||
        android:background="@null"
 | 
			
		||||
        app:layout_constraintBottom_toBottomOf="@id/bottom_bg_barrier"
 | 
			
		||||
        app:layout_constraintEnd_toEndOf="parent"
 | 
			
		||||
        app:layout_constraintStart_toStartOf="parent"
 | 
			
		||||
        app:layout_constraintTop_toTopOf="parent"
 | 
			
		||||
        tools:visibility="visible">
 | 
			
		||||
 | 
			
		||||
        <androidx.core.widget.NestedScrollView
 | 
			
		||||
            android:id="@+id/caption_parent"
 | 
			
		||||
        <awais.instagrabber.customviews.drawee.ZoomableDraweeView
 | 
			
		||||
            android:id="@+id/post_image"
 | 
			
		||||
            android:layout_width="match_parent"
 | 
			
		||||
            android:layout_height="wrap_content"
 | 
			
		||||
            android:background="@color/black_a80"
 | 
			
		||||
            app:behavior_hideable="true"
 | 
			
		||||
            app:behavior_peekHeight="100dp"
 | 
			
		||||
            app:layout_behavior="com.google.android.material.bottomsheet.BottomSheetBehavior">
 | 
			
		||||
            android:background="@null"
 | 
			
		||||
            android:clickable="true"
 | 
			
		||||
            android:focusable="true"
 | 
			
		||||
            android:transitionName="post_image"
 | 
			
		||||
            app:actualImageScaleType="fitCenter"
 | 
			
		||||
            app:layout_constraintBottom_toTopOf="@id/bottom_bg_barrier"
 | 
			
		||||
            app:layout_constraintEnd_toEndOf="parent"
 | 
			
		||||
            app:layout_constraintStart_toStartOf="parent"
 | 
			
		||||
            app:layout_constraintTop_toBottomOf="@id/top_barrier"
 | 
			
		||||
            tools:background="@mipmap/ic_launcher"
 | 
			
		||||
            tools:layout_height="400dp"
 | 
			
		||||
            tools:visibility="gone" />
 | 
			
		||||
 | 
			
		||||
            <ScrollView
 | 
			
		||||
                android:id="@+id/bottom_scroll_view"
 | 
			
		||||
                android:layout_width="match_parent"
 | 
			
		||||
                android:layout_height="match_parent"
 | 
			
		||||
                android:background="@null">
 | 
			
		||||
        <include
 | 
			
		||||
            android:id="@+id/video_post"
 | 
			
		||||
            layout="@layout/layout_video_player_with_thumbnail"
 | 
			
		||||
            android:layout_width="match_parent"
 | 
			
		||||
            android:layout_height="0dp"
 | 
			
		||||
            android:visibility="gone"
 | 
			
		||||
            app:layout_constraintBottom_toTopOf="@id/bottom_bg_barrier"
 | 
			
		||||
            app:layout_constraintTop_toBottomOf="@id/top_barrier"
 | 
			
		||||
            tools:layout_height="400dp"
 | 
			
		||||
            tools:visibility="visible" />
 | 
			
		||||
 | 
			
		||||
                <LinearLayout
 | 
			
		||||
                    android:layout_width="match_parent"
 | 
			
		||||
                    android:layout_height="wrap_content"
 | 
			
		||||
                    android:orientation="vertical">
 | 
			
		||||
        <androidx.viewpager2.widget.ViewPager2
 | 
			
		||||
            android:id="@+id/slider_parent"
 | 
			
		||||
            android:layout_width="match_parent"
 | 
			
		||||
            android:layout_height="0dp"
 | 
			
		||||
            android:visibility="gone"
 | 
			
		||||
            app:layout_constraintBottom_toTopOf="@id/bottom_bg_barrier"
 | 
			
		||||
            app:layout_constraintTop_toBottomOf="@id/top_barrier"
 | 
			
		||||
            tools:layout_height="400dp"
 | 
			
		||||
            tools:visibility="gone" />
 | 
			
		||||
 | 
			
		||||
                    <awais.instagrabber.customviews.RamboTextViewV2
 | 
			
		||||
                        android:id="@+id/caption"
 | 
			
		||||
                        android:layout_width="match_parent"
 | 
			
		||||
                        android:layout_height="wrap_content"
 | 
			
		||||
                        android:layout_gravity="bottom"
 | 
			
		||||
                        android:background="@null"
 | 
			
		||||
                        android:clickable="true"
 | 
			
		||||
                        android:focusable="true"
 | 
			
		||||
                        android:padding="16dp"
 | 
			
		||||
                        android:textAppearance="@style/TextAppearance.MaterialComponents.Body1"
 | 
			
		||||
                        android:textColor="@color/white"
 | 
			
		||||
                        tools:text="Text text text" />
 | 
			
		||||
        <!--<View-->
 | 
			
		||||
        <!--    android:id="@+id/top_bg"-->
 | 
			
		||||
        <!--    android:layout_width="0dp"-->
 | 
			
		||||
        <!--    android:layout_height="0dp"-->
 | 
			
		||||
        <!--    app:layout_constraintBottom_toBottomOf="@id/profile_pic"-->
 | 
			
		||||
        <!--    app:layout_constraintEnd_toEndOf="parent"-->
 | 
			
		||||
        <!--    app:layout_constraintStart_toStartOf="parent"-->
 | 
			
		||||
        <!--    app:layout_constraintTop_toTopOf="parent" />-->
 | 
			
		||||
 | 
			
		||||
                    <!--<androidx.appcompat.widget.AppCompatTextView-->
 | 
			
		||||
                    <!--    android:id="@+id/editCaption"-->
 | 
			
		||||
                    <!--    android:layout_width="match_parent"-->
 | 
			
		||||
                    <!--    android:layout_height="wrap_content"-->
 | 
			
		||||
                    <!--    android:layout_marginStart="16dp"-->
 | 
			
		||||
                    <!--    android:layout_marginTop="8dp"-->
 | 
			
		||||
                    <!--    android:background="@null"-->
 | 
			
		||||
                    <!--    android:gravity="center_vertical"-->
 | 
			
		||||
                    <!--    android:text="@string/edit_caption"-->
 | 
			
		||||
                    <!--    android:textColor="?android:textColorSecondary"-->
 | 
			
		||||
                    <!--    android:textSize="16sp"-->
 | 
			
		||||
                    <!--    android:visibility="gone"-->
 | 
			
		||||
                    <!--    app:layout_constraintBottom_toTopOf="@id/translatedCaption"-->
 | 
			
		||||
                    <!--    app:layout_constraintTop_toBottomOf="@id/caption"-->
 | 
			
		||||
                    <!--    tools:visibility="visible" />-->
 | 
			
		||||
        <awais.instagrabber.customviews.ProfilePicView
 | 
			
		||||
            android:id="@+id/profile_pic"
 | 
			
		||||
            android:layout_width="wrap_content"
 | 
			
		||||
            android:layout_height="wrap_content"
 | 
			
		||||
            android:layout_margin="12dp"
 | 
			
		||||
            android:transitionName="profile_pic"
 | 
			
		||||
            app:layout_constraintBottom_toTopOf="@id/top_barrier"
 | 
			
		||||
            app:layout_constraintEnd_toStartOf="@id/title"
 | 
			
		||||
            app:layout_constraintHorizontal_bias="0"
 | 
			
		||||
            app:layout_constraintHorizontal_chainStyle="packed"
 | 
			
		||||
            app:layout_constraintStart_toStartOf="parent"
 | 
			
		||||
            app:layout_constraintTop_toTopOf="parent"
 | 
			
		||||
            app:size="regular" />
 | 
			
		||||
 | 
			
		||||
                    <androidx.appcompat.widget.AppCompatTextView
 | 
			
		||||
                        android:id="@+id/translate"
 | 
			
		||||
                        android:layout_width="match_parent"
 | 
			
		||||
                        android:layout_height="wrap_content"
 | 
			
		||||
                        android:background="@null"
 | 
			
		||||
                        android:gravity="center_vertical"
 | 
			
		||||
                        android:paddingStart="16dp"
 | 
			
		||||
                        android:paddingTop="8dp"
 | 
			
		||||
                        android:paddingEnd="16dp"
 | 
			
		||||
                        android:paddingBottom="8dp"
 | 
			
		||||
                        android:text="@string/translate_caption"
 | 
			
		||||
                        android:textColor="@color/blue_600"
 | 
			
		||||
                        android:textSize="16sp"
 | 
			
		||||
                        android:visibility="visible" />
 | 
			
		||||
        <androidx.appcompat.widget.AppCompatTextView
 | 
			
		||||
            android:id="@+id/title"
 | 
			
		||||
            android:layout_width="0dp"
 | 
			
		||||
            android:layout_height="wrap_content"
 | 
			
		||||
            android:ellipsize="marquee"
 | 
			
		||||
            android:singleLine="true"
 | 
			
		||||
            android:textAppearance="@style/TextAppearance.MaterialComponents.Headline6"
 | 
			
		||||
            app:layout_constrainedWidth="true"
 | 
			
		||||
            app:layout_constraintBottom_toTopOf="@id/subtitle"
 | 
			
		||||
            app:layout_constraintEnd_toStartOf="@id/options"
 | 
			
		||||
            app:layout_constraintStart_toEndOf="@id/profile_pic"
 | 
			
		||||
            app:layout_constraintTop_toTopOf="@id/profile_pic"
 | 
			
		||||
            tools:text="Username Username Username" />
 | 
			
		||||
 | 
			
		||||
                    <!--<awais.instagrabber.customviews.RamboTextViewV2-->
 | 
			
		||||
                    <!--    android:id="@+id/translatedCaption"-->
 | 
			
		||||
                    <!--    android:layout_width="match_parent"-->
 | 
			
		||||
                    <!--    android:layout_height="wrap_content"-->
 | 
			
		||||
                    <!--    android:layout_gravity="bottom"-->
 | 
			
		||||
                    <!--    android:background="@null"-->
 | 
			
		||||
                    <!--    android:clickable="true"-->
 | 
			
		||||
                    <!--    android:focusable="true"-->
 | 
			
		||||
                    <!--    android:padding="16dp"-->
 | 
			
		||||
                    <!--    android:textAppearance="@style/TextAppearance.MaterialComponents.Body1"-->
 | 
			
		||||
                    <!--    android:textColor="@color/white"-->
 | 
			
		||||
                    <!--    android:visibility="gone"-->
 | 
			
		||||
                    <!--    app:layout_constraintBottom_toBottomOf="parent"-->
 | 
			
		||||
                    <!--    app:layout_constraintTop_toBottomOf="@id/translateTitle"-->
 | 
			
		||||
                    <!--    tools:text="Text text text"-->
 | 
			
		||||
                    <!--    tools:visibility="visible" />-->
 | 
			
		||||
                </LinearLayout>
 | 
			
		||||
            </ScrollView>
 | 
			
		||||
        </androidx.core.widget.NestedScrollView>
 | 
			
		||||
    </androidx.coordinatorlayout.widget.CoordinatorLayout>
 | 
			
		||||
        <androidx.appcompat.widget.AppCompatTextView
 | 
			
		||||
            android:id="@+id/subtitle"
 | 
			
		||||
            android:layout_width="0dp"
 | 
			
		||||
            android:layout_height="wrap_content"
 | 
			
		||||
            android:ellipsize="end"
 | 
			
		||||
            android:singleLine="true"
 | 
			
		||||
            android:textAppearance="@style/TextAppearance.MaterialComponents.Subtitle1"
 | 
			
		||||
            app:layout_constraintBottom_toBottomOf="@id/profile_pic"
 | 
			
		||||
            app:layout_constraintEnd_toStartOf="@id/options"
 | 
			
		||||
            app:layout_constraintStart_toStartOf="@id/title"
 | 
			
		||||
            app:layout_constraintTop_toBottomOf="@id/title"
 | 
			
		||||
            tools:text="Full name Full name Full name Full name Full name Full name Full name "
 | 
			
		||||
            tools:visibility="gone" />
 | 
			
		||||
 | 
			
		||||
    <!--<include-->
 | 
			
		||||
    <!--    android:id="@+id/player_controls"-->
 | 
			
		||||
    <!--    layout="@layout/layout_exo_custom_controls"-->
 | 
			
		||||
    <!--    android:layout_width="0dp"-->
 | 
			
		||||
    <!--    android:layout_height="wrap_content"-->
 | 
			
		||||
    <!--    android:visibility="gone"-->
 | 
			
		||||
    <!--    app:layout_constraintBottom_toTopOf="@id/bottom_bg_barrier"-->
 | 
			
		||||
    <!--    app:layout_constraintEnd_toEndOf="parent"-->
 | 
			
		||||
    <!--    app:layout_constraintStart_toStartOf="parent"-->
 | 
			
		||||
    <!--    tools:visibility="gone" />-->
 | 
			
		||||
        <androidx.appcompat.widget.AppCompatImageView
 | 
			
		||||
            android:id="@+id/options"
 | 
			
		||||
            android:layout_width="wrap_content"
 | 
			
		||||
            android:layout_height="0dp"
 | 
			
		||||
            android:paddingStart="8dp"
 | 
			
		||||
            android:paddingEnd="8dp"
 | 
			
		||||
            android:visibility="gone"
 | 
			
		||||
            app:layout_constraintBottom_toBottomOf="@id/profile_pic"
 | 
			
		||||
            app:layout_constraintEnd_toEndOf="parent"
 | 
			
		||||
            app:layout_constraintTop_toTopOf="@id/profile_pic"
 | 
			
		||||
            app:srcCompat="@drawable/ic_more_vert_24"
 | 
			
		||||
            tools:visibility="visible" />
 | 
			
		||||
 | 
			
		||||
    <View
 | 
			
		||||
        android:id="@+id/bottom_bg"
 | 
			
		||||
        android:layout_width="0dp"
 | 
			
		||||
        android:layout_height="0dp"
 | 
			
		||||
        android:background="@color/black_a80"
 | 
			
		||||
        app:layout_constraintBottom_toBottomOf="parent"
 | 
			
		||||
        app:layout_constraintEnd_toEndOf="parent"
 | 
			
		||||
        app:layout_constraintStart_toStartOf="parent"
 | 
			
		||||
        app:layout_constraintTop_toTopOf="@id/bottom_bg_barrier" />
 | 
			
		||||
        <androidx.constraintlayout.widget.Barrier
 | 
			
		||||
            android:id="@+id/top_barrier"
 | 
			
		||||
            android:layout_width="0dp"
 | 
			
		||||
            android:layout_height="0dp"
 | 
			
		||||
            app:barrierAllowsGoneWidgets="true"
 | 
			
		||||
            app:barrierDirection="bottom" />
 | 
			
		||||
 | 
			
		||||
    <androidx.constraintlayout.widget.Barrier
 | 
			
		||||
        android:id="@+id/bottom_bg_barrier"
 | 
			
		||||
        android:layout_width="match_parent"
 | 
			
		||||
        android:layout_height="wrap_content"
 | 
			
		||||
        app:barrierAllowsGoneWidgets="true"
 | 
			
		||||
        app:barrierDirection="top"
 | 
			
		||||
        app:constraint_referenced_ids="likes_count,comments_count,views_count" />
 | 
			
		||||
        <!--<androidx.constraintlayout.widget.Group-->
 | 
			
		||||
        <!--    android:id="@+id/user_details_group"-->
 | 
			
		||||
        <!--    android:layout_width="0dp"-->
 | 
			
		||||
        <!--    android:layout_height="0dp"-->
 | 
			
		||||
        <!--    app:constraint_referenced_ids="profile_pic,title,subtitle,options" />-->
 | 
			
		||||
 | 
			
		||||
    <androidx.appcompat.widget.AppCompatTextView
 | 
			
		||||
        android:id="@+id/likes_count"
 | 
			
		||||
        android:layout_width="wrap_content"
 | 
			
		||||
        android:layout_height="wrap_content"
 | 
			
		||||
        android:padding="8dp"
 | 
			
		||||
        android:textColor="@color/white"
 | 
			
		||||
        app:layout_constraintBottom_toTopOf="@id/counts_barrier"
 | 
			
		||||
        app:layout_constraintEnd_toStartOf="@id/comments_count"
 | 
			
		||||
        app:layout_constraintHorizontal_bias="0"
 | 
			
		||||
        app:layout_constraintStart_toStartOf="parent"
 | 
			
		||||
        app:layout_constraintTop_toBottomOf="@id/bottom_bg_barrier"
 | 
			
		||||
        tools:text="9999999999 likes"
 | 
			
		||||
        tools:visibility="gone" />
 | 
			
		||||
        <androidx.appcompat.widget.AppCompatTextView
 | 
			
		||||
            android:id="@+id/media_counter"
 | 
			
		||||
            android:layout_width="wrap_content"
 | 
			
		||||
            android:layout_height="wrap_content"
 | 
			
		||||
            android:layout_marginStart="16dp"
 | 
			
		||||
            android:layout_marginTop="16dp"
 | 
			
		||||
            android:background="@drawable/rounder_corner_semi_black_bg"
 | 
			
		||||
            android:gravity="center"
 | 
			
		||||
            android:padding="8dp"
 | 
			
		||||
            android:textAppearance="@style/TextAppearance.AppCompat.Caption"
 | 
			
		||||
            android:textColor="@android:color/white"
 | 
			
		||||
            android:visibility="gone"
 | 
			
		||||
            app:layout_constraintStart_toStartOf="parent"
 | 
			
		||||
            app:layout_constraintTop_toBottomOf="@id/profile_pic"
 | 
			
		||||
            tools:text="1/5"
 | 
			
		||||
            tools:visibility="visible" />
 | 
			
		||||
 | 
			
		||||
    <androidx.appcompat.widget.AppCompatTextView
 | 
			
		||||
        android:id="@+id/comments_count"
 | 
			
		||||
        android:layout_width="wrap_content"
 | 
			
		||||
        android:layout_height="wrap_content"
 | 
			
		||||
        android:padding="8dp"
 | 
			
		||||
        android:textColor="@color/white"
 | 
			
		||||
        app:layout_constraintBottom_toTopOf="@id/counts_barrier"
 | 
			
		||||
        app:layout_constraintEnd_toStartOf="@id/views_count"
 | 
			
		||||
        app:layout_constraintHorizontal_bias="0"
 | 
			
		||||
        app:layout_constraintStart_toEndOf="@id/likes_count"
 | 
			
		||||
        app:layout_constraintTop_toBottomOf="@id/bottom_bg_barrier"
 | 
			
		||||
        tools:text="9999999 comments"
 | 
			
		||||
        tools:visibility="gone" />
 | 
			
		||||
        <com.google.android.material.button.MaterialButton
 | 
			
		||||
            android:id="@+id/location"
 | 
			
		||||
            style="?borderlessButtonStyle"
 | 
			
		||||
            android:layout_width="wrap_content"
 | 
			
		||||
            android:layout_height="wrap_content"
 | 
			
		||||
            android:layout_marginTop="16dp"
 | 
			
		||||
            android:layout_marginEnd="16dp"
 | 
			
		||||
            android:elevation="0dp"
 | 
			
		||||
            android:ellipsize="end"
 | 
			
		||||
            android:insetTop="0dp"
 | 
			
		||||
            android:insetBottom="0dp"
 | 
			
		||||
            android:maxWidth="200dp"
 | 
			
		||||
            android:maxLines="1"
 | 
			
		||||
            android:minHeight="32dp"
 | 
			
		||||
            android:paddingStart="8dp"
 | 
			
		||||
            android:paddingEnd="8dp"
 | 
			
		||||
            android:textAlignment="viewStart"
 | 
			
		||||
            android:textAllCaps="false"
 | 
			
		||||
            android:textColor="@android:color/white"
 | 
			
		||||
            android:visibility="gone"
 | 
			
		||||
            app:backgroundTint="@color/black_a50"
 | 
			
		||||
            app:elevation="0dp"
 | 
			
		||||
            app:icon="@drawable/ic_round_location_on_24"
 | 
			
		||||
            app:iconSize="16dp"
 | 
			
		||||
            app:iconTint="@color/white"
 | 
			
		||||
            app:layout_constraintEnd_toEndOf="parent"
 | 
			
		||||
            app:layout_constraintTop_toBottomOf="@id/profile_pic"
 | 
			
		||||
            app:rippleColor="@color/grey_600"
 | 
			
		||||
            tools:text="Location, Location, Location, Location, "
 | 
			
		||||
            tools:visibility="visible" />
 | 
			
		||||
 | 
			
		||||
    <androidx.appcompat.widget.AppCompatTextView
 | 
			
		||||
        android:id="@+id/views_count"
 | 
			
		||||
        android:layout_width="0dp"
 | 
			
		||||
        android:layout_height="wrap_content"
 | 
			
		||||
        android:padding="8dp"
 | 
			
		||||
        android:textColor="@color/white"
 | 
			
		||||
        app:layout_constraintBottom_toTopOf="@id/counts_barrier"
 | 
			
		||||
        app:layout_constraintEnd_toEndOf="parent"
 | 
			
		||||
        app:layout_constraintStart_toEndOf="@id/comments_count"
 | 
			
		||||
        app:layout_constraintTop_toBottomOf="@id/bottom_bg_barrier"
 | 
			
		||||
        tools:text="9999999999 views"
 | 
			
		||||
        tools:visibility="gone" />
 | 
			
		||||
        <!--<androidx.coordinatorlayout.widget.CoordinatorLayout-->
 | 
			
		||||
        <!--    android:layout_width="match_parent"-->
 | 
			
		||||
        <!--    android:layout_height="0dp"-->
 | 
			
		||||
        <!--    android:background="@null"-->
 | 
			
		||||
        <!--    app:layout_constraintBottom_toBottomOf="@id/bottom_bg_barrier"-->
 | 
			
		||||
        <!--    app:layout_constraintEnd_toEndOf="parent"-->
 | 
			
		||||
        <!--    app:layout_constraintStart_toStartOf="parent"-->
 | 
			
		||||
        <!--    app:layout_constraintTop_toTopOf="parent"-->
 | 
			
		||||
        <!--    tools:visibility="gone">-->
 | 
			
		||||
 | 
			
		||||
    <androidx.constraintlayout.widget.Barrier
 | 
			
		||||
        android:id="@+id/counts_barrier"
 | 
			
		||||
        android:layout_width="match_parent"
 | 
			
		||||
        android:layout_height="wrap_content"
 | 
			
		||||
        app:barrierAllowsGoneWidgets="true"
 | 
			
		||||
        app:barrierDirection="top"
 | 
			
		||||
        app:constraint_referenced_ids="date" />
 | 
			
		||||
        <!--    <androidx.core.widget.NestedScrollView-->
 | 
			
		||||
        <!--        android:id="@+id/caption_parent"-->
 | 
			
		||||
        <!--        android:layout_width="match_parent"-->
 | 
			
		||||
        <!--        android:layout_height="wrap_content"-->
 | 
			
		||||
        <!--        android:background="@color/black_a80"-->
 | 
			
		||||
        <!--        app:behavior_hideable="true"-->
 | 
			
		||||
        <!--        app:behavior_peekHeight="100dp"-->
 | 
			
		||||
        <!--        app:layout_behavior="com.google.android.material.bottomsheet.BottomSheetBehavior">-->
 | 
			
		||||
 | 
			
		||||
    <androidx.appcompat.widget.AppCompatTextView
 | 
			
		||||
        android:id="@+id/date"
 | 
			
		||||
        android:layout_width="match_parent"
 | 
			
		||||
        android:layout_height="wrap_content"
 | 
			
		||||
        android:padding="8dp"
 | 
			
		||||
        android:textColor="@color/white"
 | 
			
		||||
        app:layout_constraintBottom_toBottomOf="@id/buttons_barrier"
 | 
			
		||||
        app:layout_constraintTop_toBottomOf="@id/counts_barrier"
 | 
			
		||||
        tools:text="2020-11-07 11:18:55"
 | 
			
		||||
        tools:visibility="visible" />
 | 
			
		||||
        <!--        <ScrollView-->
 | 
			
		||||
        <!--            android:id="@+id/bottom_scroll_view"-->
 | 
			
		||||
        <!--            android:layout_width="match_parent"-->
 | 
			
		||||
        <!--            android:layout_height="match_parent"-->
 | 
			
		||||
        <!--            android:background="@null">-->
 | 
			
		||||
 | 
			
		||||
    <androidx.constraintlayout.widget.Barrier
 | 
			
		||||
        android:id="@+id/buttons_barrier"
 | 
			
		||||
        android:layout_width="wrap_content"
 | 
			
		||||
        android:layout_height="wrap_content"
 | 
			
		||||
        app:barrierAllowsGoneWidgets="true"
 | 
			
		||||
        app:barrierDirection="bottom"
 | 
			
		||||
        app:constraint_referenced_ids="date" />
 | 
			
		||||
        <!--            <LinearLayout-->
 | 
			
		||||
        <!--                android:layout_width="match_parent"-->
 | 
			
		||||
        <!--                android:layout_height="wrap_content"-->
 | 
			
		||||
        <!--                android:orientation="vertical">-->
 | 
			
		||||
 | 
			
		||||
    <com.google.android.material.button.MaterialButton
 | 
			
		||||
        android:id="@+id/caption_toggle"
 | 
			
		||||
        style="@style/Widget.MaterialComponents.Button.TextButton"
 | 
			
		||||
        android:layout_width="0dp"
 | 
			
		||||
        android:layout_height="48dp"
 | 
			
		||||
        android:visibility="visible"
 | 
			
		||||
        app:icon="@drawable/ic_notes_24"
 | 
			
		||||
        app:iconGravity="textStart"
 | 
			
		||||
        app:iconPadding="0dp"
 | 
			
		||||
        app:iconSize="24dp"
 | 
			
		||||
        app:iconTint="@color/white"
 | 
			
		||||
        app:layout_constraintBottom_toBottomOf="parent"
 | 
			
		||||
        app:layout_constraintEnd_toStartOf="@id/like"
 | 
			
		||||
        app:layout_constraintStart_toStartOf="parent"
 | 
			
		||||
        app:layout_constraintTop_toBottomOf="@id/buttons_barrier"
 | 
			
		||||
        app:rippleColor="@color/grey_300"
 | 
			
		||||
        tools:visibility="visible" />
 | 
			
		||||
        <!--                <awais.instagrabber.customviews.RamboTextViewV2-->
 | 
			
		||||
        <!--                    android:id="@+id/caption"-->
 | 
			
		||||
        <!--                    android:layout_width="match_parent"-->
 | 
			
		||||
        <!--                    android:layout_height="wrap_content"-->
 | 
			
		||||
        <!--                    android:layout_gravity="bottom"-->
 | 
			
		||||
        <!--                    android:background="@null"-->
 | 
			
		||||
        <!--                    android:clickable="true"-->
 | 
			
		||||
        <!--                    android:focusable="true"-->
 | 
			
		||||
        <!--                    android:padding="16dp"-->
 | 
			
		||||
        <!--                    android:textAppearance="@style/TextAppearance.MaterialComponents.Body1"-->
 | 
			
		||||
        <!--                    android:textColor="@color/white"-->
 | 
			
		||||
        <!--                    tools:text="Text text text" />-->
 | 
			
		||||
 | 
			
		||||
    <com.google.android.material.button.MaterialButton
 | 
			
		||||
        android:id="@+id/like"
 | 
			
		||||
        style="@style/Widget.MaterialComponents.Button.TextButton"
 | 
			
		||||
        android:layout_width="0dp"
 | 
			
		||||
        android:layout_height="48dp"
 | 
			
		||||
        android:visibility="visible"
 | 
			
		||||
        app:icon="@drawable/ic_not_liked"
 | 
			
		||||
        app:iconGravity="textStart"
 | 
			
		||||
        app:iconPadding="0dp"
 | 
			
		||||
        app:iconSize="24dp"
 | 
			
		||||
        app:iconTint="@color/white"
 | 
			
		||||
        app:layout_constraintBottom_toBottomOf="parent"
 | 
			
		||||
        app:layout_constraintEnd_toStartOf="@id/comment"
 | 
			
		||||
        app:layout_constraintStart_toEndOf="@id/caption_toggle"
 | 
			
		||||
        app:layout_constraintTop_toBottomOf="@id/buttons_barrier"
 | 
			
		||||
        app:rippleColor="@color/grey_300"
 | 
			
		||||
        tools:visibility="visible" />
 | 
			
		||||
        <!--                <!–<androidx.appcompat.widget.AppCompatTextView–>-->
 | 
			
		||||
        <!--                <!–    android:id="@+id/editCaption"–>-->
 | 
			
		||||
        <!--                <!–    android:layout_width="match_parent"–>-->
 | 
			
		||||
        <!--                <!–    android:layout_height="wrap_content"–>-->
 | 
			
		||||
        <!--                <!–    android:layout_marginStart="16dp"–>-->
 | 
			
		||||
        <!--                <!–    android:layout_marginTop="8dp"–>-->
 | 
			
		||||
        <!--                <!–    android:background="@null"–>-->
 | 
			
		||||
        <!--                <!–    android:gravity="center_vertical"–>-->
 | 
			
		||||
        <!--                <!–    android:text="@string/edit_caption"–>-->
 | 
			
		||||
        <!--                <!–    android:textColor="?android:textColorSecondary"–>-->
 | 
			
		||||
        <!--                <!–    android:textSize="16sp"–>-->
 | 
			
		||||
        <!--                <!–    android:visibility="gone"–>-->
 | 
			
		||||
        <!--                <!–    app:layout_constraintBottom_toTopOf="@id/translatedCaption"–>-->
 | 
			
		||||
        <!--                <!–    app:layout_constraintTop_toBottomOf="@id/caption"–>-->
 | 
			
		||||
        <!--                <!–    tools:visibility="visible" />–>-->
 | 
			
		||||
 | 
			
		||||
    <com.google.android.material.button.MaterialButton
 | 
			
		||||
        android:id="@+id/comment"
 | 
			
		||||
        style="@style/Widget.MaterialComponents.Button.TextButton"
 | 
			
		||||
        android:layout_width="0dp"
 | 
			
		||||
        android:layout_height="48dp"
 | 
			
		||||
        android:visibility="visible"
 | 
			
		||||
        app:icon="@drawable/ic_outline_comments_24"
 | 
			
		||||
        app:iconGravity="textStart"
 | 
			
		||||
        app:iconPadding="0dp"
 | 
			
		||||
        app:iconSize="24dp"
 | 
			
		||||
        app:iconTint="@color/white"
 | 
			
		||||
        app:layout_constraintBottom_toBottomOf="parent"
 | 
			
		||||
        app:layout_constraintEnd_toStartOf="@id/save"
 | 
			
		||||
        app:layout_constraintStart_toEndOf="@id/like"
 | 
			
		||||
        app:layout_constraintTop_toBottomOf="@id/buttons_barrier"
 | 
			
		||||
        app:rippleColor="@color/grey_300"
 | 
			
		||||
        tools:visibility="visible" />
 | 
			
		||||
        <!--                <androidx.appcompat.widget.AppCompatTextView-->
 | 
			
		||||
        <!--                    android:id="@+id/translate"-->
 | 
			
		||||
        <!--                    android:layout_width="match_parent"-->
 | 
			
		||||
        <!--                    android:layout_height="wrap_content"-->
 | 
			
		||||
        <!--                    android:background="@null"-->
 | 
			
		||||
        <!--                    android:gravity="center_vertical"-->
 | 
			
		||||
        <!--                    android:paddingStart="16dp"-->
 | 
			
		||||
        <!--                    android:paddingTop="8dp"-->
 | 
			
		||||
        <!--                    android:paddingEnd="16dp"-->
 | 
			
		||||
        <!--                    android:paddingBottom="8dp"-->
 | 
			
		||||
        <!--                    android:text="@string/translate_caption"-->
 | 
			
		||||
        <!--                    android:textColor="@color/blue_600"-->
 | 
			
		||||
        <!--                    android:textSize="16sp"-->
 | 
			
		||||
        <!--                    android:visibility="visible" />-->
 | 
			
		||||
 | 
			
		||||
    <!--<com.google.android.material.button.MaterialButton-->
 | 
			
		||||
    <!--    android:id="@+id/player_controls_toggle"-->
 | 
			
		||||
    <!--    style="@style/Widget.MaterialComponents.Button.TextButton"-->
 | 
			
		||||
    <!--    android:layout_width="0dp"-->
 | 
			
		||||
    <!--    android:layout_height="48dp"-->
 | 
			
		||||
    <!--    android:visibility="gone"-->
 | 
			
		||||
    <!--    app:icon="@drawable/ic_play_circle_outline_24"-->
 | 
			
		||||
    <!--    app:iconGravity="textStart"-->
 | 
			
		||||
    <!--    app:iconPadding="0dp"-->
 | 
			
		||||
    <!--    app:iconSize="24dp"-->
 | 
			
		||||
    <!--    app:iconTint="@color/white"-->
 | 
			
		||||
    <!--    app:layout_constraintBottom_toBottomOf="parent"-->
 | 
			
		||||
    <!--    app:layout_constraintEnd_toStartOf="@id/save"-->
 | 
			
		||||
    <!--    app:layout_constraintStart_toEndOf="@id/comment"-->
 | 
			
		||||
    <!--    app:layout_constraintTop_toBottomOf="@id/buttons_barrier"-->
 | 
			
		||||
    <!--    app:rippleColor="@color/grey_300"-->
 | 
			
		||||
    <!--    tools:visibility="visible" />-->
 | 
			
		||||
        <!--                <!–<awais.instagrabber.customviews.RamboTextViewV2–>-->
 | 
			
		||||
        <!--                <!–    android:id="@+id/translatedCaption"–>-->
 | 
			
		||||
        <!--                <!–    android:layout_width="match_parent"–>-->
 | 
			
		||||
        <!--                <!–    android:layout_height="wrap_content"–>-->
 | 
			
		||||
        <!--                <!–    android:layout_gravity="bottom"–>-->
 | 
			
		||||
        <!--                <!–    android:background="@null"–>-->
 | 
			
		||||
        <!--                <!–    android:clickable="true"–>-->
 | 
			
		||||
        <!--                <!–    android:focusable="true"–>-->
 | 
			
		||||
        <!--                <!–    android:padding="16dp"–>-->
 | 
			
		||||
        <!--                <!–    android:textAppearance="@style/TextAppearance.MaterialComponents.Body1"–>-->
 | 
			
		||||
        <!--                <!–    android:textColor="@color/white"–>-->
 | 
			
		||||
        <!--                <!–    android:visibility="gone"–>-->
 | 
			
		||||
        <!--                <!–    app:layout_constraintBottom_toBottomOf="parent"–>-->
 | 
			
		||||
        <!--                <!–    app:layout_constraintTop_toBottomOf="@id/translateTitle"–>-->
 | 
			
		||||
        <!--                <!–    tools:text="Text text text"–>-->
 | 
			
		||||
        <!--                <!–    tools:visibility="visible" />–>-->
 | 
			
		||||
        <!--            </LinearLayout>-->
 | 
			
		||||
        <!--        </ScrollView>-->
 | 
			
		||||
        <!--    </androidx.core.widget.NestedScrollView>-->
 | 
			
		||||
        <!--</androidx.coordinatorlayout.widget.CoordinatorLayout>-->
 | 
			
		||||
 | 
			
		||||
    <com.google.android.material.button.MaterialButton
 | 
			
		||||
        android:id="@+id/save"
 | 
			
		||||
        style="@style/Widget.MaterialComponents.Button.TextButton"
 | 
			
		||||
        android:layout_width="0dp"
 | 
			
		||||
        android:layout_height="48dp"
 | 
			
		||||
        android:visibility="visible"
 | 
			
		||||
        app:icon="@drawable/ic_outline_class_24"
 | 
			
		||||
        app:iconGravity="textStart"
 | 
			
		||||
        app:iconPadding="0dp"
 | 
			
		||||
        app:iconSize="24dp"
 | 
			
		||||
        app:iconTint="@color/white"
 | 
			
		||||
        app:layout_constraintBottom_toBottomOf="parent"
 | 
			
		||||
        app:layout_constraintEnd_toStartOf="@id/share"
 | 
			
		||||
        app:layout_constraintStart_toEndOf="@id/comment"
 | 
			
		||||
        app:layout_constraintTop_toBottomOf="@id/buttons_barrier"
 | 
			
		||||
        app:rippleColor="@color/grey_300"
 | 
			
		||||
        tools:visibility="visible" />
 | 
			
		||||
        <!--<include-->
 | 
			
		||||
        <!--    android:id="@+id/player_controls"-->
 | 
			
		||||
        <!--    layout="@layout/layout_exo_custom_controls"-->
 | 
			
		||||
        <!--    android:layout_width="0dp"-->
 | 
			
		||||
        <!--    android:layout_height="wrap_content"-->
 | 
			
		||||
        <!--    android:visibility="gone"-->
 | 
			
		||||
        <!--    app:layout_constraintBottom_toTopOf="@id/bottom_bg_barrier"-->
 | 
			
		||||
        <!--    app:layout_constraintEnd_toEndOf="parent"-->
 | 
			
		||||
        <!--    app:layout_constraintStart_toStartOf="parent"-->
 | 
			
		||||
        <!--    tools:visibility="gone" />-->
 | 
			
		||||
 | 
			
		||||
    <com.google.android.material.button.MaterialButton
 | 
			
		||||
        android:id="@+id/share"
 | 
			
		||||
        style="@style/Widget.MaterialComponents.Button.TextButton"
 | 
			
		||||
        android:layout_width="0dp"
 | 
			
		||||
        android:layout_height="48dp"
 | 
			
		||||
        android:visibility="visible"
 | 
			
		||||
        app:icon="?attr/actionModeShareDrawable"
 | 
			
		||||
        app:iconGravity="textStart"
 | 
			
		||||
        app:iconPadding="0dp"
 | 
			
		||||
        app:iconSize="24dp"
 | 
			
		||||
        app:iconTint="@color/white"
 | 
			
		||||
        app:layout_constraintBottom_toBottomOf="parent"
 | 
			
		||||
        app:layout_constraintEnd_toStartOf="@id/download"
 | 
			
		||||
        app:layout_constraintStart_toEndOf="@id/save"
 | 
			
		||||
        app:layout_constraintTop_toBottomOf="@id/buttons_barrier"
 | 
			
		||||
        app:rippleColor="@color/grey_300"
 | 
			
		||||
        tools:visibility="visible" />
 | 
			
		||||
        <View
 | 
			
		||||
            android:id="@+id/bottom_bg"
 | 
			
		||||
            android:layout_width="0dp"
 | 
			
		||||
            android:layout_height="0dp"
 | 
			
		||||
            app:layout_constraintBottom_toBottomOf="parent"
 | 
			
		||||
            app:layout_constraintEnd_toEndOf="parent"
 | 
			
		||||
            app:layout_constraintStart_toStartOf="parent"
 | 
			
		||||
            app:layout_constraintTop_toTopOf="@id/bottom_bg_barrier" />
 | 
			
		||||
 | 
			
		||||
    <com.google.android.material.button.MaterialButton
 | 
			
		||||
        android:id="@+id/download"
 | 
			
		||||
        style="@style/Widget.MaterialComponents.Button.TextButton"
 | 
			
		||||
        android:layout_width="0dp"
 | 
			
		||||
        android:layout_height="48dp"
 | 
			
		||||
        android:visibility="visible"
 | 
			
		||||
        app:icon="@drawable/ic_download"
 | 
			
		||||
        app:iconGravity="textStart"
 | 
			
		||||
        app:iconPadding="0dp"
 | 
			
		||||
        app:iconSize="24dp"
 | 
			
		||||
        app:iconTint="@color/white"
 | 
			
		||||
        app:layout_constraintBottom_toBottomOf="parent"
 | 
			
		||||
        app:layout_constraintEnd_toEndOf="parent"
 | 
			
		||||
        app:layout_constraintStart_toEndOf="@id/share"
 | 
			
		||||
        app:layout_constraintTop_toBottomOf="@id/buttons_barrier"
 | 
			
		||||
        app:rippleColor="@color/grey_300"
 | 
			
		||||
        tools:visibility="visible" />
 | 
			
		||||
        <androidx.constraintlayout.widget.Barrier
 | 
			
		||||
            android:id="@+id/bottom_bg_barrier"
 | 
			
		||||
            android:layout_width="match_parent"
 | 
			
		||||
            android:layout_height="wrap_content"
 | 
			
		||||
            app:barrierAllowsGoneWidgets="true"
 | 
			
		||||
            app:barrierDirection="top"
 | 
			
		||||
            app:constraint_referenced_ids="likes_count,comments_count,views_count" />
 | 
			
		||||
 | 
			
		||||
</androidx.constraintlayout.widget.ConstraintLayout>
 | 
			
		||||
        <androidx.appcompat.widget.AppCompatTextView
 | 
			
		||||
            android:id="@+id/likes_count"
 | 
			
		||||
            android:layout_width="wrap_content"
 | 
			
		||||
            android:layout_height="wrap_content"
 | 
			
		||||
            android:padding="8dp"
 | 
			
		||||
            app:layout_constraintBottom_toTopOf="@id/counts_barrier"
 | 
			
		||||
            app:layout_constraintEnd_toStartOf="@id/comments_count"
 | 
			
		||||
            app:layout_constraintHorizontal_bias="0"
 | 
			
		||||
            app:layout_constraintStart_toStartOf="parent"
 | 
			
		||||
            app:layout_constraintTop_toBottomOf="@id/bottom_bg_barrier"
 | 
			
		||||
            tools:text="9999999999 likes"
 | 
			
		||||
            tools:visibility="gone" />
 | 
			
		||||
 | 
			
		||||
        <androidx.appcompat.widget.AppCompatTextView
 | 
			
		||||
            android:id="@+id/comments_count"
 | 
			
		||||
            android:layout_width="wrap_content"
 | 
			
		||||
            android:layout_height="wrap_content"
 | 
			
		||||
            android:padding="8dp"
 | 
			
		||||
            app:layout_constraintBottom_toTopOf="@id/counts_barrier"
 | 
			
		||||
            app:layout_constraintEnd_toStartOf="@id/views_count"
 | 
			
		||||
            app:layout_constraintHorizontal_bias="0"
 | 
			
		||||
            app:layout_constraintStart_toEndOf="@id/likes_count"
 | 
			
		||||
            app:layout_constraintTop_toBottomOf="@id/bottom_bg_barrier"
 | 
			
		||||
            tools:text="9999999 comments"
 | 
			
		||||
            tools:visibility="gone" />
 | 
			
		||||
 | 
			
		||||
        <androidx.appcompat.widget.AppCompatTextView
 | 
			
		||||
            android:id="@+id/views_count"
 | 
			
		||||
            android:layout_width="0dp"
 | 
			
		||||
            android:layout_height="wrap_content"
 | 
			
		||||
            android:padding="8dp"
 | 
			
		||||
            app:layout_constraintBottom_toTopOf="@id/counts_barrier"
 | 
			
		||||
            app:layout_constraintEnd_toEndOf="parent"
 | 
			
		||||
            app:layout_constraintStart_toEndOf="@id/comments_count"
 | 
			
		||||
            app:layout_constraintTop_toBottomOf="@id/bottom_bg_barrier"
 | 
			
		||||
            tools:text="9999999999 views"
 | 
			
		||||
            tools:visibility="gone" />
 | 
			
		||||
 | 
			
		||||
        <androidx.constraintlayout.widget.Barrier
 | 
			
		||||
            android:id="@+id/counts_barrier"
 | 
			
		||||
            android:layout_width="match_parent"
 | 
			
		||||
            android:layout_height="wrap_content"
 | 
			
		||||
            app:barrierAllowsGoneWidgets="true"
 | 
			
		||||
            app:barrierDirection="top"
 | 
			
		||||
            app:constraint_referenced_ids="date" />
 | 
			
		||||
 | 
			
		||||
        <androidx.appcompat.widget.AppCompatTextView
 | 
			
		||||
            android:id="@+id/date"
 | 
			
		||||
            android:layout_width="match_parent"
 | 
			
		||||
            android:layout_height="wrap_content"
 | 
			
		||||
            android:padding="8dp"
 | 
			
		||||
            app:layout_constraintBottom_toBottomOf="@id/buttons_barrier"
 | 
			
		||||
            app:layout_constraintTop_toBottomOf="@id/counts_barrier"
 | 
			
		||||
            tools:text="2020-11-07 11:18:55"
 | 
			
		||||
            tools:visibility="visible" />
 | 
			
		||||
 | 
			
		||||
        <androidx.constraintlayout.widget.Barrier
 | 
			
		||||
            android:id="@+id/buttons_barrier"
 | 
			
		||||
            android:layout_width="wrap_content"
 | 
			
		||||
            android:layout_height="wrap_content"
 | 
			
		||||
            app:barrierAllowsGoneWidgets="true"
 | 
			
		||||
            app:barrierDirection="bottom"
 | 
			
		||||
            app:constraint_referenced_ids="date" />
 | 
			
		||||
 | 
			
		||||
        <!--<com.google.android.material.button.MaterialButton-->
 | 
			
		||||
        <!--    android:id="@+id/caption_toggle"-->
 | 
			
		||||
        <!--    style="@style/Widget.MaterialComponents.Button.TextButton"-->
 | 
			
		||||
        <!--    android:layout_width="0dp"-->
 | 
			
		||||
        <!--    android:layout_height="48dp"-->
 | 
			
		||||
        <!--    android:visibility="visible"-->
 | 
			
		||||
        <!--    app:icon="@drawable/ic_notes_24"-->
 | 
			
		||||
        <!--    app:iconGravity="textStart"-->
 | 
			
		||||
        <!--    app:iconPadding="0dp"-->
 | 
			
		||||
        <!--    app:iconSize="24dp"-->
 | 
			
		||||
        <!--    app:layout_constraintBottom_toTopOf="@id/caption_barrier"-->
 | 
			
		||||
        <!--    app:layout_constraintEnd_toStartOf="@id/like"-->
 | 
			
		||||
        <!--    app:layout_constraintStart_toStartOf="parent"-->
 | 
			
		||||
        <!--    app:layout_constraintTop_toBottomOf="@id/buttons_barrier"-->
 | 
			
		||||
        <!--    tools:visibility="visible" />-->
 | 
			
		||||
 | 
			
		||||
        <com.google.android.material.button.MaterialButton
 | 
			
		||||
            android:id="@+id/like"
 | 
			
		||||
            style="@style/Widget.MaterialComponents.Button.TextButton"
 | 
			
		||||
            android:layout_width="0dp"
 | 
			
		||||
            android:layout_height="48dp"
 | 
			
		||||
            android:visibility="visible"
 | 
			
		||||
            app:icon="@drawable/ic_not_liked"
 | 
			
		||||
            app:iconGravity="textStart"
 | 
			
		||||
            app:iconPadding="0dp"
 | 
			
		||||
            app:iconSize="24dp"
 | 
			
		||||
            app:layout_constraintBottom_toTopOf="@id/caption_barrier"
 | 
			
		||||
            app:layout_constraintEnd_toStartOf="@id/comment"
 | 
			
		||||
            app:layout_constraintStart_toStartOf="parent"
 | 
			
		||||
            app:layout_constraintTop_toBottomOf="@id/buttons_barrier"
 | 
			
		||||
            tools:visibility="visible" />
 | 
			
		||||
 | 
			
		||||
        <com.google.android.material.button.MaterialButton
 | 
			
		||||
            android:id="@+id/comment"
 | 
			
		||||
            style="@style/Widget.MaterialComponents.Button.TextButton"
 | 
			
		||||
            android:layout_width="0dp"
 | 
			
		||||
            android:layout_height="48dp"
 | 
			
		||||
            android:visibility="visible"
 | 
			
		||||
            app:icon="@drawable/ic_outline_comments_24"
 | 
			
		||||
            app:iconGravity="textStart"
 | 
			
		||||
            app:iconPadding="0dp"
 | 
			
		||||
            app:iconSize="24dp"
 | 
			
		||||
            app:layout_constraintBottom_toTopOf="@id/caption_barrier"
 | 
			
		||||
            app:layout_constraintEnd_toStartOf="@id/save"
 | 
			
		||||
            app:layout_constraintStart_toEndOf="@id/like"
 | 
			
		||||
            app:layout_constraintTop_toBottomOf="@id/buttons_barrier"
 | 
			
		||||
            tools:visibility="visible" />
 | 
			
		||||
 | 
			
		||||
        <!--<com.google.android.material.button.MaterialButton-->
 | 
			
		||||
        <!--    android:id="@+id/player_controls_toggle"-->
 | 
			
		||||
        <!--    style="@style/Widget.MaterialComponents.Button.TextButton"-->
 | 
			
		||||
        <!--    android:layout_width="0dp"-->
 | 
			
		||||
        <!--    android:layout_height="48dp"-->
 | 
			
		||||
        <!--    android:visibility="gone"-->
 | 
			
		||||
        <!--    app:icon="@drawable/ic_play_circle_outline_24"-->
 | 
			
		||||
        <!--    app:iconGravity="textStart"-->
 | 
			
		||||
        <!--    app:iconPadding="0dp"-->
 | 
			
		||||
        <!--    app:iconSize="24dp"-->
 | 
			
		||||
        <!--    app:iconTint="@color/white"-->
 | 
			
		||||
        <!--    app:layout_constraintBottom_toBottomOf="parent"-->
 | 
			
		||||
        <!--    app:layout_constraintEnd_toStartOf="@id/save"-->
 | 
			
		||||
        <!--    app:layout_constraintStart_toEndOf="@id/comment"-->
 | 
			
		||||
        <!--    app:layout_constraintTop_toBottomOf="@id/buttons_barrier"-->
 | 
			
		||||
        <!--    app:rippleColor="@color/grey_300"-->
 | 
			
		||||
        <!--    tools:visibility="visible" />-->
 | 
			
		||||
 | 
			
		||||
        <com.google.android.material.button.MaterialButton
 | 
			
		||||
            android:id="@+id/save"
 | 
			
		||||
            style="@style/Widget.MaterialComponents.Button.TextButton"
 | 
			
		||||
            android:layout_width="0dp"
 | 
			
		||||
            android:layout_height="48dp"
 | 
			
		||||
            android:visibility="visible"
 | 
			
		||||
            app:icon="@drawable/ic_outline_class_24"
 | 
			
		||||
            app:iconGravity="textStart"
 | 
			
		||||
            app:iconPadding="0dp"
 | 
			
		||||
            app:iconSize="24dp"
 | 
			
		||||
            app:layout_constraintBottom_toTopOf="@id/caption_barrier"
 | 
			
		||||
            app:layout_constraintEnd_toStartOf="@id/share"
 | 
			
		||||
            app:layout_constraintStart_toEndOf="@id/comment"
 | 
			
		||||
            app:layout_constraintTop_toBottomOf="@id/buttons_barrier"
 | 
			
		||||
            tools:visibility="visible" />
 | 
			
		||||
 | 
			
		||||
        <com.google.android.material.button.MaterialButton
 | 
			
		||||
            android:id="@+id/share"
 | 
			
		||||
            style="@style/Widget.MaterialComponents.Button.TextButton"
 | 
			
		||||
            android:layout_width="0dp"
 | 
			
		||||
            android:layout_height="48dp"
 | 
			
		||||
            android:visibility="visible"
 | 
			
		||||
            app:icon="?attr/actionModeShareDrawable"
 | 
			
		||||
            app:iconGravity="textStart"
 | 
			
		||||
            app:iconPadding="0dp"
 | 
			
		||||
            app:iconSize="24dp"
 | 
			
		||||
            app:layout_constraintBottom_toTopOf="@id/caption_barrier"
 | 
			
		||||
            app:layout_constraintEnd_toStartOf="@id/download"
 | 
			
		||||
            app:layout_constraintStart_toEndOf="@id/save"
 | 
			
		||||
            app:layout_constraintTop_toBottomOf="@id/buttons_barrier"
 | 
			
		||||
            tools:visibility="visible" />
 | 
			
		||||
 | 
			
		||||
        <com.google.android.material.button.MaterialButton
 | 
			
		||||
            android:id="@+id/download"
 | 
			
		||||
            style="@style/Widget.MaterialComponents.Button.TextButton"
 | 
			
		||||
            android:layout_width="0dp"
 | 
			
		||||
            android:layout_height="48dp"
 | 
			
		||||
            android:visibility="visible"
 | 
			
		||||
            app:icon="@drawable/ic_download"
 | 
			
		||||
            app:iconGravity="textStart"
 | 
			
		||||
            app:iconPadding="0dp"
 | 
			
		||||
            app:iconSize="24dp"
 | 
			
		||||
            app:layout_constraintBottom_toTopOf="@id/caption_barrier"
 | 
			
		||||
            app:layout_constraintEnd_toEndOf="parent"
 | 
			
		||||
            app:layout_constraintStart_toEndOf="@id/share"
 | 
			
		||||
            app:layout_constraintTop_toBottomOf="@id/buttons_barrier"
 | 
			
		||||
            tools:visibility="visible" />
 | 
			
		||||
 | 
			
		||||
        <androidx.constraintlayout.widget.Barrier
 | 
			
		||||
            android:id="@+id/caption_barrier"
 | 
			
		||||
            android:layout_width="0dp"
 | 
			
		||||
            android:layout_height="0dp"
 | 
			
		||||
            app:barrierAllowsGoneWidgets="true"
 | 
			
		||||
            app:barrierDirection="bottom"
 | 
			
		||||
            app:constraint_referenced_ids="like,comment,save,share,download" />
 | 
			
		||||
 | 
			
		||||
        <awais.instagrabber.customviews.RamboTextViewV2
 | 
			
		||||
            android:id="@+id/caption"
 | 
			
		||||
            android:layout_width="match_parent"
 | 
			
		||||
            android:layout_height="wrap_content"
 | 
			
		||||
            android:layout_gravity="bottom"
 | 
			
		||||
            android:background="@null"
 | 
			
		||||
            android:clickable="true"
 | 
			
		||||
            android:focusable="true"
 | 
			
		||||
            android:padding="8dp"
 | 
			
		||||
            android:textAppearance="@style/TextAppearance.MaterialComponents.Body1"
 | 
			
		||||
            app:layout_constraintBottom_toTopOf="@id/translate"
 | 
			
		||||
            app:layout_constraintTop_toBottomOf="@id/caption_barrier"
 | 
			
		||||
            tools:text="Text text text Text text text Text text text Text text text Text text text"
 | 
			
		||||
            tools:visibility="gone" />
 | 
			
		||||
 | 
			
		||||
        <androidx.appcompat.widget.AppCompatTextView
 | 
			
		||||
            android:id="@+id/translate"
 | 
			
		||||
            android:layout_width="match_parent"
 | 
			
		||||
            android:layout_height="wrap_content"
 | 
			
		||||
            android:background="@null"
 | 
			
		||||
            android:gravity="center_vertical"
 | 
			
		||||
            android:padding="8dp"
 | 
			
		||||
            android:text="@string/translate_caption"
 | 
			
		||||
            android:textColor="@color/blue_600"
 | 
			
		||||
            android:textSize="16sp"
 | 
			
		||||
            android:visibility="visible"
 | 
			
		||||
            app:layout_constraintBottom_toBottomOf="parent"
 | 
			
		||||
            app:layout_constraintTop_toBottomOf="@id/caption" />
 | 
			
		||||
 | 
			
		||||
    </androidx.constraintlayout.widget.ConstraintLayout>
 | 
			
		||||
</androidx.core.widget.NestedScrollView>
 | 
			
		||||
@ -1,40 +1,39 @@
 | 
			
		||||
<?xml version="1.0" encoding="utf-8"?>
 | 
			
		||||
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
 | 
			
		||||
<androidx.constraintlayout.motion.widget.MotionLayout xmlns:android="http://schemas.android.com/apk/res/android"
 | 
			
		||||
    xmlns:app="http://schemas.android.com/apk/res-auto"
 | 
			
		||||
    xmlns:tools="http://schemas.android.com/tools"
 | 
			
		||||
    android:layout_width="match_parent"
 | 
			
		||||
    android:layout_height="match_parent"
 | 
			
		||||
    android:background="?attr/colorSurface">
 | 
			
		||||
    android:background="?attr/colorSurface"
 | 
			
		||||
    app:layoutDescription="@xml/header_list_scene">
 | 
			
		||||
 | 
			
		||||
    <!--<com.google.android.material.appbar.AppBarLayout-->
 | 
			
		||||
    <!--    android:id="@+id/stories_container"-->
 | 
			
		||||
    <!--    android:layout_width="match_parent"-->
 | 
			
		||||
    <!--    android:layout_height="wrap_content">-->
 | 
			
		||||
 | 
			
		||||
    <!--    <com.google.android.material.appbar.CollapsingToolbarLayout-->
 | 
			
		||||
    <!--        android:layout_width="match_parent"-->
 | 
			
		||||
    <!--        android:layout_height="wrap_content"-->
 | 
			
		||||
    <!--        app:layout_scrollFlags="scroll|snap">-->
 | 
			
		||||
 | 
			
		||||
    <!--<androidx.recyclerview.widget.RecyclerView-->
 | 
			
		||||
    <!--    android:id="@+id/feed_stories_recycler_view"-->
 | 
			
		||||
    <!--    android:layout_width="match_parent"-->
 | 
			
		||||
    <!--    android:layout_height="wrap_content"-->
 | 
			
		||||
    <!--    android:clipToPadding="false" />-->
 | 
			
		||||
    <!--    </com.google.android.material.appbar.CollapsingToolbarLayout>-->
 | 
			
		||||
    <!--</com.google.android.material.appbar.AppBarLayout>-->
 | 
			
		||||
    <androidx.recyclerview.widget.RecyclerView
 | 
			
		||||
        android:id="@+id/header"
 | 
			
		||||
        android:layout_width="match_parent"
 | 
			
		||||
        android:layout_height="wrap_content"
 | 
			
		||||
        android:background="?attr/toolbarColor"
 | 
			
		||||
        android:clipToPadding="false"
 | 
			
		||||
        android:orientation="horizontal"
 | 
			
		||||
        app:layout_constraintBottom_toTopOf="@id/feed_swipe_refresh_layout"
 | 
			
		||||
        app:layout_constraintTop_toTopOf="parent"
 | 
			
		||||
        tools:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
 | 
			
		||||
        tools:listitem="@layout/item_highlight" />
 | 
			
		||||
 | 
			
		||||
    <androidx.swiperefreshlayout.widget.SwipeRefreshLayout
 | 
			
		||||
        android:id="@+id/feed_swipe_refresh_layout"
 | 
			
		||||
        android:layout_width="match_parent"
 | 
			
		||||
        android:layout_height="match_parent"
 | 
			
		||||
        app:layout_behavior="@string/appbar_scrolling_view_behavior">
 | 
			
		||||
        android:layout_height="0dp"
 | 
			
		||||
        android:clipToPadding="false"
 | 
			
		||||
        app:layout_behavior="@string/appbar_scrolling_view_behavior"
 | 
			
		||||
        app:layout_constraintBottom_toBottomOf="parent"
 | 
			
		||||
        app:layout_constraintTop_toBottomOf="@id/header">
 | 
			
		||||
 | 
			
		||||
        <awais.instagrabber.customviews.PostsRecyclerView
 | 
			
		||||
            android:id="@+id/feed_recycler_view"
 | 
			
		||||
            android:layout_width="match_parent"
 | 
			
		||||
            android:layout_height="match_parent"
 | 
			
		||||
            android:clipToPadding="false"
 | 
			
		||||
            tools:listitem="@layout/item_feed_photo" />
 | 
			
		||||
            android:paddingBottom="?attr/actionBarSize"
 | 
			
		||||
            tools:listitem="@layout/item_feed_grid" />
 | 
			
		||||
    </androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
 | 
			
		||||
</androidx.coordinatorlayout.widget.CoordinatorLayout>
 | 
			
		||||
</androidx.constraintlayout.motion.widget.MotionLayout>
 | 
			
		||||
@ -1,20 +1,32 @@
 | 
			
		||||
<?xml version="1.0" encoding="utf-8"?>
 | 
			
		||||
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
 | 
			
		||||
<androidx.constraintlayout.motion.widget.MotionLayout xmlns:android="http://schemas.android.com/apk/res/android"
 | 
			
		||||
    xmlns:app="http://schemas.android.com/apk/res-auto"
 | 
			
		||||
    android:layout_width="match_parent"
 | 
			
		||||
    android:layout_height="match_parent"
 | 
			
		||||
    android:background="?attr/colorSurface">
 | 
			
		||||
    android:background="?attr/colorSurface"
 | 
			
		||||
    app:layoutDescription="@xml/header_list_scene">
 | 
			
		||||
 | 
			
		||||
    <include
 | 
			
		||||
        android:id="@+id/header"
 | 
			
		||||
        layout="@layout/layout_hashtag_details"
 | 
			
		||||
        android:layout_width="match_parent"
 | 
			
		||||
        android:layout_height="wrap_content"
 | 
			
		||||
        app:layout_constraintBottom_toTopOf="@id/swipe_refresh_layout"
 | 
			
		||||
        app:layout_constraintTop_toTopOf="parent" />
 | 
			
		||||
 | 
			
		||||
    <androidx.swiperefreshlayout.widget.SwipeRefreshLayout
 | 
			
		||||
        android:id="@+id/swipe_refresh_layout"
 | 
			
		||||
        android:layout_width="match_parent"
 | 
			
		||||
        android:layout_height="match_parent"
 | 
			
		||||
        app:layout_behavior="@string/appbar_scrolling_view_behavior">
 | 
			
		||||
        android:layout_height="0dp"
 | 
			
		||||
        app:layout_behavior="@string/appbar_scrolling_view_behavior"
 | 
			
		||||
        app:layout_constraintBottom_toBottomOf="parent"
 | 
			
		||||
        app:layout_constraintTop_toBottomOf="@id/header">
 | 
			
		||||
 | 
			
		||||
        <awais.instagrabber.customviews.PostsRecyclerView
 | 
			
		||||
            android:id="@+id/posts"
 | 
			
		||||
            android:layout_width="match_parent"
 | 
			
		||||
            android:layout_height="match_parent"
 | 
			
		||||
            android:clipToPadding="false" />
 | 
			
		||||
            android:clipToPadding="false"
 | 
			
		||||
            android:paddingBottom="?attr/actionBarSize" />
 | 
			
		||||
    </androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
 | 
			
		||||
</androidx.coordinatorlayout.widget.CoordinatorLayout>
 | 
			
		||||
</androidx.constraintlayout.motion.widget.MotionLayout>
 | 
			
		||||
@ -1,20 +1,32 @@
 | 
			
		||||
<?xml version="1.0" encoding="utf-8"?>
 | 
			
		||||
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
 | 
			
		||||
<androidx.constraintlayout.motion.widget.MotionLayout xmlns:android="http://schemas.android.com/apk/res/android"
 | 
			
		||||
    xmlns:app="http://schemas.android.com/apk/res-auto"
 | 
			
		||||
    android:layout_width="match_parent"
 | 
			
		||||
    android:layout_height="match_parent"
 | 
			
		||||
    android:background="?attr/colorSurface">
 | 
			
		||||
    android:background="?attr/colorSurface"
 | 
			
		||||
    app:layoutDescription="@xml/header_list_scene">
 | 
			
		||||
 | 
			
		||||
    <include
 | 
			
		||||
        android:id="@+id/header"
 | 
			
		||||
        layout="@layout/layout_location_details"
 | 
			
		||||
        android:layout_width="match_parent"
 | 
			
		||||
        android:layout_height="wrap_content"
 | 
			
		||||
        app:layout_constraintBottom_toTopOf="@id/swipe_refresh_layout"
 | 
			
		||||
        app:layout_constraintTop_toTopOf="parent" />
 | 
			
		||||
 | 
			
		||||
    <androidx.swiperefreshlayout.widget.SwipeRefreshLayout
 | 
			
		||||
        android:id="@+id/swipe_refresh_layout"
 | 
			
		||||
        android:layout_width="match_parent"
 | 
			
		||||
        android:layout_height="match_parent"
 | 
			
		||||
        app:layout_behavior="@string/appbar_scrolling_view_behavior">
 | 
			
		||||
        android:layout_height="0dp"
 | 
			
		||||
        app:layout_behavior="@string/appbar_scrolling_view_behavior"
 | 
			
		||||
        app:layout_constraintBottom_toBottomOf="parent"
 | 
			
		||||
        app:layout_constraintTop_toBottomOf="@id/header">
 | 
			
		||||
 | 
			
		||||
        <awais.instagrabber.customviews.PostsRecyclerView
 | 
			
		||||
            android:id="@+id/posts"
 | 
			
		||||
            android:layout_width="match_parent"
 | 
			
		||||
            android:layout_height="match_parent"
 | 
			
		||||
            android:clipToPadding="false" />
 | 
			
		||||
            android:clipToPadding="false"
 | 
			
		||||
            android:paddingBottom="?attr/actionBarSize" />
 | 
			
		||||
    </androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
 | 
			
		||||
</androidx.coordinatorlayout.widget.CoordinatorLayout>
 | 
			
		||||
</androidx.constraintlayout.motion.widget.MotionLayout>
 | 
			
		||||
@ -1,39 +1,34 @@
 | 
			
		||||
<?xml version="1.0" encoding="utf-8"?>
 | 
			
		||||
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
 | 
			
		||||
<androidx.constraintlayout.motion.widget.MotionLayout xmlns:android="http://schemas.android.com/apk/res/android"
 | 
			
		||||
    xmlns:app="http://schemas.android.com/apk/res-auto"
 | 
			
		||||
    xmlns:tools="http://schemas.android.com/tools"
 | 
			
		||||
    android:layout_width="match_parent"
 | 
			
		||||
    android:layout_height="match_parent"
 | 
			
		||||
    android:background="?attr/colorSurface">
 | 
			
		||||
    android:background="?attr/colorSurface"
 | 
			
		||||
    app:layoutDescription="@xml/header_list_scene">
 | 
			
		||||
 | 
			
		||||
    <!--<com.google.android.material.appbar.AppBarLayout-->
 | 
			
		||||
    <!--    android:id="@+id/appBarLayout"-->
 | 
			
		||||
    <!--    android:layout_width="match_parent"-->
 | 
			
		||||
    <!--    android:layout_height="wrap_content"-->
 | 
			
		||||
    <!--    android:background="?attr/colorSurface"-->
 | 
			
		||||
    <!--    app:elevation="0dp"-->
 | 
			
		||||
    <!--    app:layout_scrollFlags="scroll">-->
 | 
			
		||||
 | 
			
		||||
    <!--    <com.google.android.material.appbar.CollapsingToolbarLayout-->
 | 
			
		||||
    <!--        android:layout_width="match_parent"-->
 | 
			
		||||
    <!--        android:layout_height="wrap_content"-->
 | 
			
		||||
    <!--        app:layout_scrollFlags="scroll">-->
 | 
			
		||||
 | 
			
		||||
    <!--        <include layout="@layout/layout_profile_details" />-->
 | 
			
		||||
    <!--    </com.google.android.material.appbar.CollapsingToolbarLayout>-->
 | 
			
		||||
    <!--</com.google.android.material.appbar.AppBarLayout>-->
 | 
			
		||||
    <include
 | 
			
		||||
        android:id="@+id/header"
 | 
			
		||||
        layout="@layout/layout_profile_details"
 | 
			
		||||
        android:layout_width="match_parent"
 | 
			
		||||
        android:layout_height="wrap_content"
 | 
			
		||||
        app:layout_constraintBottom_toTopOf="@id/swipe_refresh_layout"
 | 
			
		||||
        app:layout_constraintTop_toTopOf="parent" />
 | 
			
		||||
 | 
			
		||||
    <androidx.swiperefreshlayout.widget.SwipeRefreshLayout
 | 
			
		||||
        android:id="@+id/swipe_refresh_layout"
 | 
			
		||||
        android:layout_width="match_parent"
 | 
			
		||||
        android:layout_height="match_parent"
 | 
			
		||||
        app:layout_behavior="@string/appbar_scrolling_view_behavior">
 | 
			
		||||
        android:layout_height="0dp"
 | 
			
		||||
        app:layout_behavior="@string/appbar_scrolling_view_behavior"
 | 
			
		||||
        app:layout_constraintBottom_toBottomOf="parent"
 | 
			
		||||
        app:layout_constraintTop_toBottomOf="@id/header">
 | 
			
		||||
 | 
			
		||||
        <awais.instagrabber.customviews.PostsRecyclerView
 | 
			
		||||
            android:id="@+id/posts_recycler_view"
 | 
			
		||||
            android:layout_width="match_parent"
 | 
			
		||||
            android:layout_height="match_parent"
 | 
			
		||||
            android:clipToPadding="false"
 | 
			
		||||
            android:paddingBottom="?attr/actionBarSize"
 | 
			
		||||
            tools:listitem="@layout/item_feed_photo" />
 | 
			
		||||
    </androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
 | 
			
		||||
 | 
			
		||||
@ -62,4 +57,4 @@
 | 
			
		||||
            android:text="@string/priv_acc"
 | 
			
		||||
            android:textAppearance="@style/TextAppearance.AppCompat.Large" />
 | 
			
		||||
    </LinearLayout>
 | 
			
		||||
</androidx.coordinatorlayout.widget.CoordinatorLayout>
 | 
			
		||||
</androidx.constraintlayout.motion.widget.MotionLayout>
 | 
			
		||||
@ -20,6 +20,7 @@
 | 
			
		||||
        android:gravity="center"
 | 
			
		||||
        android:maxLines="1"
 | 
			
		||||
        android:padding="2dp"
 | 
			
		||||
        android:scrollbars="none"
 | 
			
		||||
        android:singleLine="true"
 | 
			
		||||
        android:textColor="?attr/colorOnPrimarySurface"
 | 
			
		||||
        android:textStyle="bold"
 | 
			
		||||
 | 
			
		||||
@ -4,8 +4,6 @@
 | 
			
		||||
    xmlns:tools="http://schemas.android.com/tools"
 | 
			
		||||
    android:layout_width="match_parent"
 | 
			
		||||
    android:layout_height="match_parent">
 | 
			
		||||
    <!-- android:padding="8dp"
 | 
			
		||||
    android:background="@color/black_a80"-->
 | 
			
		||||
 | 
			
		||||
    <View
 | 
			
		||||
        android:layout_width="0dp"
 | 
			
		||||
@ -14,18 +12,13 @@
 | 
			
		||||
        app:layout_constraintBottom_toBottomOf="parent"
 | 
			
		||||
        app:layout_constraintEnd_toEndOf="parent"
 | 
			
		||||
        app:layout_constraintStart_toStartOf="parent"
 | 
			
		||||
        app:layout_constraintTop_toTopOf="parent" />
 | 
			
		||||
 | 
			
		||||
    <!--<androidx.constraintlayout.widget.Barrier-->
 | 
			
		||||
    <!--    android:id="@+id/top_barrier"-->
 | 
			
		||||
    <!--    android:layout_width="0dp"-->
 | 
			
		||||
    <!--    android:layout_height="0dp"-->
 | 
			
		||||
    <!--    app:barrierDirection="top" />-->
 | 
			
		||||
        app:layout_constraintTop_toTopOf="@id/exo_position" />
 | 
			
		||||
 | 
			
		||||
    <androidx.appcompat.widget.AppCompatTextView
 | 
			
		||||
        android:id="@+id/exo_position"
 | 
			
		||||
        android:layout_width="wrap_content"
 | 
			
		||||
        android:layout_height="wrap_content"
 | 
			
		||||
        android:padding="8dp"
 | 
			
		||||
        android:textColor="@color/white"
 | 
			
		||||
        app:layout_constraintBottom_toBottomOf="@id/exo_progress"
 | 
			
		||||
        app:layout_constraintEnd_toStartOf="@id/exo_progress"
 | 
			
		||||
@ -33,24 +26,6 @@
 | 
			
		||||
        app:layout_constraintTop_toTopOf="@id/exo_progress"
 | 
			
		||||
        tools:text="0:00" />
 | 
			
		||||
 | 
			
		||||
    <!--<com.google.android.material.slider.Slider-->
 | 
			
		||||
    <!--    android:id="@+id/timeline"-->
 | 
			
		||||
    <!--    android:layout_width="0dp"-->
 | 
			
		||||
    <!--    android:layout_height="wrap_content"-->
 | 
			
		||||
    <!--    android:contentDescription="@string/player_timeline_desc"-->
 | 
			
		||||
    <!--    android:enabled="false"-->
 | 
			
		||||
    <!--    android:value="0"-->
 | 
			
		||||
    <!--    android:valueFrom="0.0"-->
 | 
			
		||||
    <!--    android:valueTo="1.0"-->
 | 
			
		||||
    <!--    app:labelStyle="@style/Widget.MaterialComponents.Tooltip.ExoPlayer"-->
 | 
			
		||||
    <!--    app:layout_constraintBottom_toTopOf="@id/play_pause"-->
 | 
			
		||||
    <!--    app:layout_constraintEnd_toStartOf="@id/to_time"-->
 | 
			
		||||
    <!--    app:layout_constraintStart_toEndOf="@id/from_time"-->
 | 
			
		||||
    <!--    app:layout_constraintTop_toTopOf="parent"-->
 | 
			
		||||
    <!--    app:thumbColor="@color/white"-->
 | 
			
		||||
    <!--    app:trackColorActive="@color/white"-->
 | 
			
		||||
    <!--    app:trackColorInactive="@color/grey_800" />-->
 | 
			
		||||
 | 
			
		||||
    <com.google.android.exoplayer2.ui.DefaultTimeBar
 | 
			
		||||
        android:id="@+id/exo_progress"
 | 
			
		||||
        android:layout_width="0dp"
 | 
			
		||||
@ -65,6 +40,7 @@
 | 
			
		||||
        android:id="@+id/exo_duration"
 | 
			
		||||
        android:layout_width="wrap_content"
 | 
			
		||||
        android:layout_height="wrap_content"
 | 
			
		||||
        android:padding="8dp"
 | 
			
		||||
        android:textColor="@color/white"
 | 
			
		||||
        app:layout_constraintBottom_toBottomOf="@id/exo_progress"
 | 
			
		||||
        app:layout_constraintEnd_toEndOf="parent"
 | 
			
		||||
@ -87,28 +63,23 @@
 | 
			
		||||
        app:icon="@drawable/ic_replay_5_24_states"
 | 
			
		||||
        app:iconSize="24dp"
 | 
			
		||||
        app:iconTint="@color/white"
 | 
			
		||||
        app:layout_constraintBottom_toTopOf="@id/bottom_barrier"
 | 
			
		||||
        app:layout_constraintBottom_toBottomOf="parent"
 | 
			
		||||
        app:layout_constraintEnd_toStartOf="@id/exo_play_pause"
 | 
			
		||||
        app:layout_constraintStart_toStartOf="parent"
 | 
			
		||||
        app:layout_constraintTop_toBottomOf="@id/progress_barrier"
 | 
			
		||||
        tools:enabled="false"
 | 
			
		||||
        tools:visibility="visible" />
 | 
			
		||||
 | 
			
		||||
    <!--
 | 
			
		||||
        style="@style/Widget.App.MaterialButton.IconOnly.BorderlessRipple"
 | 
			
		||||
        app:icon="@drawable/ic_play_states"
 | 
			
		||||
        app:iconSize="24dp"
 | 
			
		||||
        app:iconTint="@color/white"
 | 
			
		||||
     -->
 | 
			
		||||
    <androidx.appcompat.widget.AppCompatImageView
 | 
			
		||||
    <androidx.appcompat.widget.AppCompatImageButton
 | 
			
		||||
        android:id="@+id/exo_play_pause"
 | 
			
		||||
        android:layout_width="0dp"
 | 
			
		||||
        android:layout_height="wrap_content"
 | 
			
		||||
        android:layout_height="0dp"
 | 
			
		||||
        android:background="@drawable/background_grey_ripple"
 | 
			
		||||
        android:contentDescription="@string/exo_controls_play_description"
 | 
			
		||||
        android:padding="@dimen/exo_icon_padding"
 | 
			
		||||
        android:padding="8dp"
 | 
			
		||||
        android:scaleType="fitCenter"
 | 
			
		||||
        android:src="@drawable/exo_styled_controls_play"
 | 
			
		||||
        app:layout_constraintBottom_toTopOf="@id/bottom_barrier"
 | 
			
		||||
        app:layout_constraintBottom_toBottomOf="parent"
 | 
			
		||||
        app:layout_constraintEnd_toStartOf="@id/exo_ffwd_with_amount"
 | 
			
		||||
        app:layout_constraintStart_toEndOf="@id/exo_rew_with_amount"
 | 
			
		||||
        app:layout_constraintTop_toBottomOf="@id/progress_barrier"
 | 
			
		||||
@ -123,7 +94,7 @@
 | 
			
		||||
        app:icon="@drawable/ic_forward_5_24_states"
 | 
			
		||||
        app:iconSize="24dp"
 | 
			
		||||
        app:iconTint="@color/white"
 | 
			
		||||
        app:layout_constraintBottom_toTopOf="@id/bottom_barrier"
 | 
			
		||||
        app:layout_constraintBottom_toBottomOf="parent"
 | 
			
		||||
        app:layout_constraintEnd_toStartOf="@id/mute"
 | 
			
		||||
        app:layout_constraintStart_toEndOf="@id/exo_play_pause"
 | 
			
		||||
        app:layout_constraintTop_toBottomOf="@id/progress_barrier"
 | 
			
		||||
@ -138,7 +109,7 @@
 | 
			
		||||
        app:icon="@drawable/ic_volume_off_24_states"
 | 
			
		||||
        app:iconSize="24dp"
 | 
			
		||||
        app:iconTint="@color/white"
 | 
			
		||||
        app:layout_constraintBottom_toTopOf="@id/bottom_barrier"
 | 
			
		||||
        app:layout_constraintBottom_toBottomOf="parent"
 | 
			
		||||
        app:layout_constraintEnd_toStartOf="@id/exo_settings"
 | 
			
		||||
        app:layout_constraintStart_toEndOf="@id/exo_ffwd_with_amount"
 | 
			
		||||
        app:layout_constraintTop_toBottomOf="@id/progress_barrier"
 | 
			
		||||
@ -153,32 +124,10 @@
 | 
			
		||||
        app:icon="@drawable/exo_ic_settings"
 | 
			
		||||
        app:iconSize="24dp"
 | 
			
		||||
        app:iconTint="@color/white"
 | 
			
		||||
        app:layout_constraintBottom_toTopOf="@id/bottom_barrier"
 | 
			
		||||
        app:layout_constraintBottom_toBottomOf="parent"
 | 
			
		||||
        app:layout_constraintEnd_toEndOf="parent"
 | 
			
		||||
        app:layout_constraintStart_toEndOf="@id/mute"
 | 
			
		||||
        app:layout_constraintTop_toBottomOf="@id/progress_barrier"
 | 
			
		||||
        tools:enabled="false"
 | 
			
		||||
        tools:visibility="visible" />
 | 
			
		||||
 | 
			
		||||
    <androidx.constraintlayout.widget.Guideline
 | 
			
		||||
        android:id="@+id/bottom_barrier"
 | 
			
		||||
        android:layout_width="0dp"
 | 
			
		||||
        android:layout_height="0dp"
 | 
			
		||||
        android:orientation="horizontal"
 | 
			
		||||
        app:layout_constraintGuide_end="200dp" />
 | 
			
		||||
 | 
			
		||||
    <!--<com.google.android.material.button.MaterialButton-->
 | 
			
		||||
    <!--    android:id="@+id/speed"-->
 | 
			
		||||
    <!--    style="@style/Widget.App.MaterialButton.IconOnly.BorderlessRipple"-->
 | 
			
		||||
    <!--    android:layout_width="0dp"-->
 | 
			
		||||
    <!--    android:layout_height="wrap_content"-->
 | 
			
		||||
    <!--    android:text="@string/one_x"-->
 | 
			
		||||
    <!--    android:textAllCaps="false"-->
 | 
			
		||||
    <!--    android:textColor="@drawable/speed_text_color_states"-->
 | 
			
		||||
    <!--    app:layout_constraintBottom_toBottomOf="parent"-->
 | 
			
		||||
    <!--    app:layout_constraintEnd_toEndOf="parent"-->
 | 
			
		||||
    <!--    app:layout_constraintStart_toEndOf="@id/mute"-->
 | 
			
		||||
    <!--    app:layout_constraintTop_toTopOf="parent"-->
 | 
			
		||||
    <!--    tools:enabled="false"-->
 | 
			
		||||
    <!--    tools:visibility="visible" />-->
 | 
			
		||||
</androidx.constraintlayout.widget.ConstraintLayout>
 | 
			
		||||
@ -2,10 +2,9 @@
 | 
			
		||||
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
 | 
			
		||||
    xmlns:app="http://schemas.android.com/apk/res-auto"
 | 
			
		||||
    xmlns:tools="http://schemas.android.com/tools"
 | 
			
		||||
    android:id="@+id/tagInfoContainer"
 | 
			
		||||
    android:layout_width="match_parent"
 | 
			
		||||
    android:layout_height="wrap_content"
 | 
			
		||||
    android:layout_marginTop="?attr/actionBarSize"
 | 
			
		||||
    android:background="?toolbarColor"
 | 
			
		||||
    android:padding="@dimen/profile_info_container_bottom_space">
 | 
			
		||||
 | 
			
		||||
    <awais.instagrabber.customviews.CircularImageView
 | 
			
		||||
 | 
			
		||||
@ -2,11 +2,10 @@
 | 
			
		||||
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
 | 
			
		||||
    xmlns:app="http://schemas.android.com/apk/res-auto"
 | 
			
		||||
    xmlns:tools="http://schemas.android.com/tools"
 | 
			
		||||
    android:id="@+id/locInfoContainer"
 | 
			
		||||
    android:layout_width="match_parent"
 | 
			
		||||
    android:layout_height="wrap_content"
 | 
			
		||||
    android:layout_marginTop="?attr/actionBarSize"
 | 
			
		||||
    android:animateLayoutChanges="true"
 | 
			
		||||
    android:background="?toolbarColor"
 | 
			
		||||
    android:padding="8dp">
 | 
			
		||||
 | 
			
		||||
    <awais.instagrabber.customviews.CircularImageView
 | 
			
		||||
@ -20,20 +19,20 @@
 | 
			
		||||
        app:layout_constraintTop_toTopOf="parent"
 | 
			
		||||
        tools:background="@mipmap/ic_launcher" />
 | 
			
		||||
 | 
			
		||||
<!--    <androidx.appcompat.widget.AppCompatTextView-->
 | 
			
		||||
<!--        android:id="@+id/mainLocPostCount"-->
 | 
			
		||||
<!--        android:layout_width="0dp"-->
 | 
			
		||||
<!--        android:layout_height="0dp"-->
 | 
			
		||||
<!--        android:gravity="center_vertical"-->
 | 
			
		||||
<!--        android:maxLines="1"-->
 | 
			
		||||
<!--        android:paddingStart="12dp"-->
 | 
			
		||||
<!--        android:paddingEnd="12dp"-->
 | 
			
		||||
<!--        android:textAppearance="@style/TextAppearance.AppCompat"-->
 | 
			
		||||
<!--        app:layout_constraintBottom_toTopOf="@id/btnMap"-->
 | 
			
		||||
<!--        app:layout_constraintEnd_toEndOf="parent"-->
 | 
			
		||||
<!--        app:layout_constraintStart_toEndOf="@id/mainLocationImage"-->
 | 
			
		||||
<!--        app:layout_constraintTop_toTopOf="parent"-->
 | 
			
		||||
<!--        tools:text="35 Posts" />-->
 | 
			
		||||
    <!--    <androidx.appcompat.widget.AppCompatTextView-->
 | 
			
		||||
    <!--        android:id="@+id/mainLocPostCount"-->
 | 
			
		||||
    <!--        android:layout_width="0dp"-->
 | 
			
		||||
    <!--        android:layout_height="0dp"-->
 | 
			
		||||
    <!--        android:gravity="center_vertical"-->
 | 
			
		||||
    <!--        android:maxLines="1"-->
 | 
			
		||||
    <!--        android:paddingStart="12dp"-->
 | 
			
		||||
    <!--        android:paddingEnd="12dp"-->
 | 
			
		||||
    <!--        android:textAppearance="@style/TextAppearance.AppCompat"-->
 | 
			
		||||
    <!--        app:layout_constraintBottom_toTopOf="@id/btnMap"-->
 | 
			
		||||
    <!--        app:layout_constraintEnd_toEndOf="parent"-->
 | 
			
		||||
    <!--        app:layout_constraintStart_toEndOf="@id/mainLocationImage"-->
 | 
			
		||||
    <!--        app:layout_constraintTop_toTopOf="parent"-->
 | 
			
		||||
    <!--        tools:text="35 Posts" />-->
 | 
			
		||||
 | 
			
		||||
    <com.google.android.material.chip.Chip
 | 
			
		||||
        android:id="@+id/btnMap"
 | 
			
		||||
@ -44,8 +43,8 @@
 | 
			
		||||
        app:chipBackgroundColor="@null"
 | 
			
		||||
        app:chipIcon="@drawable/ic_outline_map_24"
 | 
			
		||||
        app:chipIconTint="@color/green_500"
 | 
			
		||||
        app:layout_constraintTop_toTopOf="@id/mainLocationImage"
 | 
			
		||||
        app:layout_constraintStart_toEndOf="@id/mainLocationImage"
 | 
			
		||||
        app:layout_constraintTop_toTopOf="@id/mainLocationImage"
 | 
			
		||||
        app:rippleColor="@color/grey_500"
 | 
			
		||||
        tools:visibility="visible" />
 | 
			
		||||
 | 
			
		||||
@ -86,8 +85,8 @@
 | 
			
		||||
        android:id="@+id/locationBiography"
 | 
			
		||||
        android:layout_width="0dp"
 | 
			
		||||
        android:layout_height="wrap_content"
 | 
			
		||||
        android:padding="8dp"
 | 
			
		||||
        android:background="?android:selectableItemBackground"
 | 
			
		||||
        android:padding="8dp"
 | 
			
		||||
        android:textAppearance="@style/TextAppearance.AppCompat.Body1"
 | 
			
		||||
        app:layout_constraintBottom_toBottomOf="parent"
 | 
			
		||||
        app:layout_constraintEnd_toEndOf="parent"
 | 
			
		||||
 | 
			
		||||
@ -2,10 +2,9 @@
 | 
			
		||||
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
 | 
			
		||||
    xmlns:app="http://schemas.android.com/apk/res-auto"
 | 
			
		||||
    xmlns:tools="http://schemas.android.com/tools"
 | 
			
		||||
    android:id="@+id/infoContainer"
 | 
			
		||||
    android:layout_width="match_parent"
 | 
			
		||||
    android:layout_height="wrap_content"
 | 
			
		||||
    android:layout_marginTop="?attr/actionBarSize">
 | 
			
		||||
    android:background="?toolbarColor">
 | 
			
		||||
 | 
			
		||||
    <awais.instagrabber.customviews.CircularImageView
 | 
			
		||||
        android:id="@+id/mainProfileImage"
 | 
			
		||||
@ -326,9 +325,9 @@
 | 
			
		||||
    <androidx.constraintlayout.widget.Barrier
 | 
			
		||||
        android:id="@+id/highlights_barrier"
 | 
			
		||||
        android:layout_width="wrap_content"
 | 
			
		||||
        app:constraint_referenced_ids="mainPostCount, mainFollowers, mainFollowing"
 | 
			
		||||
        android:layout_height="wrap_content"
 | 
			
		||||
        app:barrierDirection="bottom" />
 | 
			
		||||
        app:barrierDirection="bottom"
 | 
			
		||||
        app:constraint_referenced_ids="mainPostCount, mainFollowers, mainFollowing" />
 | 
			
		||||
 | 
			
		||||
    <androidx.recyclerview.widget.RecyclerView
 | 
			
		||||
        android:id="@+id/highlightsList"
 | 
			
		||||
 | 
			
		||||
@ -25,11 +25,7 @@
 | 
			
		||||
            app:srcCompat="@drawable/ic_video_24" />
 | 
			
		||||
    </FrameLayout>
 | 
			
		||||
 | 
			
		||||
    <FrameLayout
 | 
			
		||||
        android:layout_width="match_parent"
 | 
			
		||||
        android:layout_height="match_parent">
 | 
			
		||||
 | 
			
		||||
        <com.google.android.exoplayer2.ui.StyledPlayerView
 | 
			
		||||
    <com.google.android.exoplayer2.ui.StyledPlayerView
 | 
			
		||||
            android:id="@+id/playerView"
 | 
			
		||||
            android:layout_width="match_parent"
 | 
			
		||||
            android:layout_height="match_parent"
 | 
			
		||||
@ -37,16 +33,6 @@
 | 
			
		||||
            app:animation_enabled="false"
 | 
			
		||||
            app:controller_layout_id="@layout/layout_exo_custom_controls"
 | 
			
		||||
            app:resize_mode="fit"
 | 
			
		||||
            app:show_timeout="1500"
 | 
			
		||||
            app:show_timeout="2000"
 | 
			
		||||
            app:use_controller="true" />
 | 
			
		||||
 | 
			
		||||
        <!--<com.google.android.exoplayer2.ui.StyledPlayerControlView-->
 | 
			
		||||
        <!--    android:id="@+id/controls"-->
 | 
			
		||||
        <!--    android:layout_width="match_parent"-->
 | 
			
		||||
        <!--    android:layout_height="match_parent"-->
 | 
			
		||||
        <!--    app:controller_layout_id="@layout/layout_exo_custom_controls"-->
 | 
			
		||||
        <!--    app:show_fastforward_button="false"-->
 | 
			
		||||
        <!--    app:show_rewind_button="false"-->
 | 
			
		||||
        <!--    app:show_timeout="3000" />-->
 | 
			
		||||
    </FrameLayout>
 | 
			
		||||
</ViewSwitcher>
 | 
			
		||||
@ -4,15 +4,15 @@
 | 
			
		||||
 | 
			
		||||
    <item
 | 
			
		||||
        android:id="@+id/edit"
 | 
			
		||||
        android:icon="@android:drawable/ic_menu_edit"
 | 
			
		||||
        android:icon="@drawable/ic_round_edit_24"
 | 
			
		||||
        android:title="@string/edit_collection"
 | 
			
		||||
        app:showAsAction="always" />
 | 
			
		||||
        app:showAsAction="ifRoom" />
 | 
			
		||||
 | 
			
		||||
    <item
 | 
			
		||||
        android:id="@+id/delete"
 | 
			
		||||
        android:icon="@android:drawable/ic_menu_delete"
 | 
			
		||||
        android:icon="@drawable/ic_delete"
 | 
			
		||||
        android:title="@string/delete_collection"
 | 
			
		||||
        app:showAsAction="always" />
 | 
			
		||||
        app:showAsAction="ifRoom" />
 | 
			
		||||
 | 
			
		||||
    <item
 | 
			
		||||
        android:id="@+id/layout"
 | 
			
		||||
 | 
			
		||||
@ -100,6 +100,18 @@
 | 
			
		||||
        android:id="@+id/action_global_search"
 | 
			
		||||
        app:destination="@id/searchFragment" />
 | 
			
		||||
 | 
			
		||||
    <action
 | 
			
		||||
        android:id="@+id/action_global_post_view"
 | 
			
		||||
        app:destination="@id/postViewFragment">
 | 
			
		||||
        <argument
 | 
			
		||||
            android:name="media"
 | 
			
		||||
            app:argType="awais.instagrabber.repositories.responses.Media"
 | 
			
		||||
            app:nullable="false" />
 | 
			
		||||
        <argument
 | 
			
		||||
            android:name="position"
 | 
			
		||||
            app:argType="integer" />
 | 
			
		||||
    </action>
 | 
			
		||||
 | 
			
		||||
    <fragment
 | 
			
		||||
        android:id="@+id/directMessagesInboxFragment"
 | 
			
		||||
        android:name="awais.instagrabber.fragments.directmessages.DirectMessageInboxFragment"
 | 
			
		||||
@ -191,10 +203,14 @@
 | 
			
		||||
            android:id="@+id/action_pending_inbox_to_thread"
 | 
			
		||||
            app:destination="@id/directMessagesThreadFragment" />
 | 
			
		||||
    </fragment>
 | 
			
		||||
 | 
			
		||||
    <fragment
 | 
			
		||||
        android:id="@+id/searchFragment"
 | 
			
		||||
        android:name="awais.instagrabber.fragments.search.SearchFragment"
 | 
			
		||||
        android:label="@string/search"
 | 
			
		||||
        tools:layout="@layout/fragment_search" />
 | 
			
		||||
    <fragment
 | 
			
		||||
        android:id="@+id/postViewFragment"
 | 
			
		||||
        android:name="awais.instagrabber.fragments.PostViewV2Fragment"
 | 
			
		||||
        android:label="Post"
 | 
			
		||||
        tools:layout="@layout/dialog_post_view" />
 | 
			
		||||
</navigation>
 | 
			
		||||
@ -99,6 +99,18 @@
 | 
			
		||||
        android:id="@+id/action_global_search"
 | 
			
		||||
        app:destination="@id/searchFragment" />
 | 
			
		||||
 | 
			
		||||
    <action
 | 
			
		||||
        android:id="@+id/action_global_post_view"
 | 
			
		||||
        app:destination="@id/postViewFragment">
 | 
			
		||||
        <argument
 | 
			
		||||
            android:name="media"
 | 
			
		||||
            app:argType="awais.instagrabber.repositories.responses.Media"
 | 
			
		||||
            app:nullable="false" />
 | 
			
		||||
        <argument
 | 
			
		||||
            android:name="position"
 | 
			
		||||
            app:argType="integer" />
 | 
			
		||||
    </action>
 | 
			
		||||
 | 
			
		||||
    <fragment
 | 
			
		||||
        android:id="@+id/discoverFragment"
 | 
			
		||||
        android:name="awais.instagrabber.fragments.main.DiscoverFragment"
 | 
			
		||||
@ -129,4 +141,9 @@
 | 
			
		||||
        android:name="awais.instagrabber.fragments.search.SearchFragment"
 | 
			
		||||
        android:label="@string/search"
 | 
			
		||||
        tools:layout="@layout/fragment_search" />
 | 
			
		||||
    <fragment
 | 
			
		||||
        android:id="@+id/postViewFragment"
 | 
			
		||||
        android:name="awais.instagrabber.fragments.PostViewV2Fragment"
 | 
			
		||||
        android:label="Post"
 | 
			
		||||
        tools:layout="@layout/dialog_post_view" />
 | 
			
		||||
</navigation>
 | 
			
		||||
@ -110,6 +110,18 @@
 | 
			
		||||
        android:id="@+id/action_global_search"
 | 
			
		||||
        app:destination="@id/searchFragment" />
 | 
			
		||||
 | 
			
		||||
    <action
 | 
			
		||||
        android:id="@+id/action_global_post_view"
 | 
			
		||||
        app:destination="@id/postViewFragment">
 | 
			
		||||
        <argument
 | 
			
		||||
            android:name="media"
 | 
			
		||||
            app:argType="awais.instagrabber.repositories.responses.Media"
 | 
			
		||||
            app:nullable="false" />
 | 
			
		||||
        <argument
 | 
			
		||||
            android:name="position"
 | 
			
		||||
            app:argType="integer" />
 | 
			
		||||
    </action>
 | 
			
		||||
 | 
			
		||||
    <fragment
 | 
			
		||||
        android:id="@+id/feedFragment"
 | 
			
		||||
        android:name="awais.instagrabber.fragments.main.FeedFragment"
 | 
			
		||||
@ -133,4 +145,9 @@
 | 
			
		||||
        android:name="awais.instagrabber.fragments.search.SearchFragment"
 | 
			
		||||
        android:label="@string/search"
 | 
			
		||||
        tools:layout="@layout/fragment_search" />
 | 
			
		||||
    <fragment
 | 
			
		||||
        android:id="@+id/postViewFragment"
 | 
			
		||||
        android:name="awais.instagrabber.fragments.PostViewV2Fragment"
 | 
			
		||||
        android:label="Post"
 | 
			
		||||
        tools:layout="@layout/dialog_post_view" />
 | 
			
		||||
</navigation>
 | 
			
		||||
@ -69,6 +69,18 @@
 | 
			
		||||
        android:id="@+id/action_global_search"
 | 
			
		||||
        app:destination="@id/searchFragment" />
 | 
			
		||||
 | 
			
		||||
    <action
 | 
			
		||||
        android:id="@+id/action_global_post_view"
 | 
			
		||||
        app:destination="@id/postViewFragment">
 | 
			
		||||
        <argument
 | 
			
		||||
            android:name="media"
 | 
			
		||||
            app:argType="awais.instagrabber.repositories.responses.Media"
 | 
			
		||||
            app:nullable="false" />
 | 
			
		||||
        <argument
 | 
			
		||||
            android:name="position"
 | 
			
		||||
            app:argType="integer" />
 | 
			
		||||
    </action>
 | 
			
		||||
 | 
			
		||||
    <fragment
 | 
			
		||||
        android:id="@+id/hashTagFragment"
 | 
			
		||||
        android:name="awais.instagrabber.fragments.HashTagFragment"
 | 
			
		||||
@ -104,4 +116,9 @@
 | 
			
		||||
            app:argType="string"
 | 
			
		||||
            app:nullable="false" />
 | 
			
		||||
    </action>
 | 
			
		||||
    <fragment
 | 
			
		||||
        android:id="@+id/postViewFragment"
 | 
			
		||||
        android:name="awais.instagrabber.fragments.PostViewV2Fragment"
 | 
			
		||||
        android:label="Post"
 | 
			
		||||
        tools:layout="@layout/dialog_post_view" />
 | 
			
		||||
</navigation>
 | 
			
		||||
@ -70,6 +70,18 @@
 | 
			
		||||
        android:id="@+id/action_global_search"
 | 
			
		||||
        app:destination="@id/searchFragment" />
 | 
			
		||||
 | 
			
		||||
    <action
 | 
			
		||||
        android:id="@+id/action_global_post_view"
 | 
			
		||||
        app:destination="@id/postViewFragment">
 | 
			
		||||
        <argument
 | 
			
		||||
            android:name="media"
 | 
			
		||||
            app:argType="awais.instagrabber.repositories.responses.Media"
 | 
			
		||||
            app:nullable="false" />
 | 
			
		||||
        <argument
 | 
			
		||||
            android:name="position"
 | 
			
		||||
            app:argType="integer" />
 | 
			
		||||
    </action>
 | 
			
		||||
 | 
			
		||||
    <fragment
 | 
			
		||||
        android:id="@+id/locationFragment"
 | 
			
		||||
        android:name="awais.instagrabber.fragments.LocationFragment"
 | 
			
		||||
@ -103,4 +115,9 @@
 | 
			
		||||
        android:name="awais.instagrabber.fragments.search.SearchFragment"
 | 
			
		||||
        android:label="@string/search"
 | 
			
		||||
        tools:layout="@layout/fragment_search" />
 | 
			
		||||
    <fragment
 | 
			
		||||
        android:id="@+id/postViewFragment"
 | 
			
		||||
        android:name="awais.instagrabber.fragments.PostViewV2Fragment"
 | 
			
		||||
        android:label="Post"
 | 
			
		||||
        tools:layout="@layout/dialog_post_view" />
 | 
			
		||||
</navigation>
 | 
			
		||||
@ -72,6 +72,18 @@
 | 
			
		||||
            app:argType="boolean" />
 | 
			
		||||
    </action>
 | 
			
		||||
 | 
			
		||||
    <action
 | 
			
		||||
        android:id="@+id/action_global_post_view"
 | 
			
		||||
        app:destination="@id/postViewFragment">
 | 
			
		||||
        <argument
 | 
			
		||||
            android:name="media"
 | 
			
		||||
            app:argType="awais.instagrabber.repositories.responses.Media"
 | 
			
		||||
            app:nullable="false" />
 | 
			
		||||
        <argument
 | 
			
		||||
            android:name="position"
 | 
			
		||||
            app:argType="integer" />
 | 
			
		||||
    </action>
 | 
			
		||||
 | 
			
		||||
    <fragment
 | 
			
		||||
        android:id="@+id/storyViewerFragment"
 | 
			
		||||
        android:name="awais.instagrabber.fragments.StoryViewerFragment"
 | 
			
		||||
@ -100,4 +112,9 @@
 | 
			
		||||
            android:id="@+id/action_notifications_to_story"
 | 
			
		||||
            app:destination="@id/storyViewerFragment" />
 | 
			
		||||
    </fragment>
 | 
			
		||||
    <fragment
 | 
			
		||||
        android:id="@+id/postViewFragment"
 | 
			
		||||
        android:name="awais.instagrabber.fragments.PostViewV2Fragment"
 | 
			
		||||
        android:label="Post"
 | 
			
		||||
        tools:layout="@layout/dialog_post_view" />
 | 
			
		||||
</navigation>
 | 
			
		||||
@ -86,6 +86,18 @@
 | 
			
		||||
            app:destination="@id/storyViewerFragment" />
 | 
			
		||||
    </action>
 | 
			
		||||
 | 
			
		||||
    <action
 | 
			
		||||
        android:id="@+id/action_global_post_view"
 | 
			
		||||
        app:destination="@id/postViewFragment">
 | 
			
		||||
        <argument
 | 
			
		||||
            android:name="media"
 | 
			
		||||
            app:argType="awais.instagrabber.repositories.responses.Media"
 | 
			
		||||
            app:nullable="false" />
 | 
			
		||||
        <argument
 | 
			
		||||
            android:name="position"
 | 
			
		||||
            app:argType="integer" />
 | 
			
		||||
    </action>
 | 
			
		||||
 | 
			
		||||
    <fragment
 | 
			
		||||
        android:id="@+id/notificationsViewer"
 | 
			
		||||
        android:name="awais.instagrabber.fragments.NotificationsViewerFragment"
 | 
			
		||||
@ -93,9 +105,9 @@
 | 
			
		||||
        tools:layout="@layout/fragment_notifications_viewer">
 | 
			
		||||
        <argument
 | 
			
		||||
            android:name="type"
 | 
			
		||||
            android:defaultValue="notif"
 | 
			
		||||
            app:argType="string"
 | 
			
		||||
            app:nullable="false"
 | 
			
		||||
            android:defaultValue="notif"/>
 | 
			
		||||
            app:nullable="false" />
 | 
			
		||||
        <argument
 | 
			
		||||
            android:name="targetId"
 | 
			
		||||
            android:defaultValue="0L"
 | 
			
		||||
@ -197,4 +209,9 @@
 | 
			
		||||
        android:name="awais.instagrabber.fragments.search.SearchFragment"
 | 
			
		||||
        android:label="@string/search"
 | 
			
		||||
        tools:layout="@layout/fragment_search" />
 | 
			
		||||
    <fragment
 | 
			
		||||
        android:id="@+id/postViewFragment"
 | 
			
		||||
        android:name="awais.instagrabber.fragments.PostViewV2Fragment"
 | 
			
		||||
        android:label="Post"
 | 
			
		||||
        tools:layout="@layout/dialog_post_view" />
 | 
			
		||||
</navigation>
 | 
			
		||||
@ -64,15 +64,27 @@
 | 
			
		||||
            app:nullable="false" />
 | 
			
		||||
    </action>
 | 
			
		||||
 | 
			
		||||
    <action
 | 
			
		||||
        android:id="@+id/action_global_post_view"
 | 
			
		||||
        app:destination="@id/postViewFragment">
 | 
			
		||||
        <argument
 | 
			
		||||
            android:name="media"
 | 
			
		||||
            app:argType="awais.instagrabber.repositories.responses.Media"
 | 
			
		||||
            app:nullable="false" />
 | 
			
		||||
        <argument
 | 
			
		||||
            android:name="position"
 | 
			
		||||
            app:argType="integer" />
 | 
			
		||||
    </action>
 | 
			
		||||
 | 
			
		||||
    <fragment
 | 
			
		||||
        android:id="@+id/savedCollectionsFragment"
 | 
			
		||||
        android:name="awais.instagrabber.fragments.SavedCollectionsFragment"
 | 
			
		||||
        android:label="@string/saved"
 | 
			
		||||
        tools:layout="@layout/fragment_saved_collections" >
 | 
			
		||||
        tools:layout="@layout/fragment_saved_collections">
 | 
			
		||||
        <argument
 | 
			
		||||
            android:name="isSaving"
 | 
			
		||||
            app:argType="boolean"
 | 
			
		||||
            android:defaultValue="false" />
 | 
			
		||||
            android:defaultValue="false"
 | 
			
		||||
            app:argType="boolean" />
 | 
			
		||||
        <action
 | 
			
		||||
            android:id="@+id/action_savedCollectionsFragment_to_collectionPostsFragment"
 | 
			
		||||
            app:destination="@id/collectionPostsFragment" />
 | 
			
		||||
@ -93,4 +105,9 @@
 | 
			
		||||
            android:name="backgroundColor"
 | 
			
		||||
            app:argType="integer" />
 | 
			
		||||
    </fragment>
 | 
			
		||||
    <fragment
 | 
			
		||||
        android:id="@+id/postViewFragment"
 | 
			
		||||
        android:name="awais.instagrabber.fragments.PostViewV2Fragment"
 | 
			
		||||
        android:label="Post"
 | 
			
		||||
        tools:layout="@layout/dialog_post_view" />
 | 
			
		||||
</navigation>
 | 
			
		||||
							
								
								
									
										5
									
								
								app/src/main/res/values/drawables.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								app/src/main/res/values/drawables.xml
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,5 @@
 | 
			
		||||
<?xml version="1.0" encoding="utf-8"?>
 | 
			
		||||
<resources>
 | 
			
		||||
    <drawable name="exo_styled_controls_play">@drawable/ic_play_arrow_24</drawable>
 | 
			
		||||
    <drawable name="exo_styled_controls_pause">@drawable/ic_pause_24</drawable>
 | 
			
		||||
</resources>
 | 
			
		||||
							
								
								
									
										32
									
								
								app/src/main/res/xml/header_list_scene.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								app/src/main/res/xml/header_list_scene.xml
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,32 @@
 | 
			
		||||
<?xml version="1.0" encoding="utf-8"?>
 | 
			
		||||
<MotionScene xmlns:android="http://schemas.android.com/apk/res/android"
 | 
			
		||||
    xmlns:motion="http://schemas.android.com/apk/res-auto">
 | 
			
		||||
    <ConstraintSet android:id="@+id/start">
 | 
			
		||||
        <Constraint
 | 
			
		||||
            android:id="@+id/header"
 | 
			
		||||
            android:layout_width="0dp"
 | 
			
		||||
            android:layout_height="wrap_content"
 | 
			
		||||
            motion:layout_constraintEnd_toEndOf="parent"
 | 
			
		||||
            motion:layout_constraintStart_toStartOf="parent"
 | 
			
		||||
            motion:layout_constraintTop_toTopOf="parent" />
 | 
			
		||||
    </ConstraintSet>
 | 
			
		||||
    <ConstraintSet android:id="@+id/end">
 | 
			
		||||
        <Constraint
 | 
			
		||||
            android:id="@+id/header"
 | 
			
		||||
            android:layout_width="0dp"
 | 
			
		||||
            android:layout_height="wrap_content"
 | 
			
		||||
            motion:layout_constraintBottom_toTopOf="parent"
 | 
			
		||||
            motion:layout_constraintEnd_toEndOf="parent"
 | 
			
		||||
            motion:layout_constraintStart_toStartOf="parent" />
 | 
			
		||||
    </ConstraintSet>
 | 
			
		||||
    <Transition
 | 
			
		||||
        android:id="@+id/transition"
 | 
			
		||||
        motion:constraintSetEnd="@+id/end"
 | 
			
		||||
        motion:constraintSetStart="@+id/start">
 | 
			
		||||
        <OnSwipe
 | 
			
		||||
            motion:dragDirection="dragUp"
 | 
			
		||||
            motion:onTouchUp="stop"
 | 
			
		||||
            motion:touchAnchorId="@+id/header"
 | 
			
		||||
            motion:touchAnchorSide="bottom" />
 | 
			
		||||
    </Transition>
 | 
			
		||||
</MotionScene>
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user