183 lines
6.3 KiB
Java
183 lines
6.3 KiB
Java
|
/* Copyright 2017 Thomas Schneider
|
||
|
*
|
||
|
* This file is a part of Fedilab
|
||
|
*
|
||
|
* This program is free software; you can redistribute it and/or modify it under the terms of the
|
||
|
* GNU General Public License as published by the Free Software Foundation; either version 3 of the
|
||
|
* License, or (at your option) any later version.
|
||
|
*
|
||
|
* Fedilab is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
|
||
|
* the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
|
||
|
* Public License for more details.
|
||
|
*
|
||
|
* You should have received a copy of the GNU General Public License along with Fedilab; if not,
|
||
|
* see <http://www.gnu.org/licenses>. */
|
||
|
package app.fedilab.android.activities;
|
||
|
|
||
|
|
||
|
|
||
|
import android.content.SharedPreferences;
|
||
|
import android.os.Bundle;
|
||
|
import android.util.Log;
|
||
|
import android.view.GestureDetector;
|
||
|
import android.view.MotionEvent;
|
||
|
import android.view.ViewGroup;
|
||
|
import android.widget.RelativeLayout;
|
||
|
|
||
|
import androidx.coordinatorlayout.widget.CoordinatorLayout;
|
||
|
import androidx.fragment.app.Fragment;
|
||
|
import androidx.fragment.app.FragmentManager;
|
||
|
import androidx.fragment.app.FragmentStatePagerAdapter;
|
||
|
import androidx.viewpager.widget.PagerAdapter;
|
||
|
import androidx.viewpager.widget.ViewPager;
|
||
|
|
||
|
|
||
|
import org.jetbrains.annotations.NotNull;
|
||
|
|
||
|
import java.util.ArrayList;
|
||
|
|
||
|
import app.fedilab.android.R;
|
||
|
import app.fedilab.android.client.Entities.Attachment;
|
||
|
import app.fedilab.android.fragments.MediaSliderFragment;
|
||
|
import app.fedilab.android.helper.Helper;
|
||
|
|
||
|
|
||
|
|
||
|
/**
|
||
|
* Created by Thomas on 25/06/2017.
|
||
|
* Media Activity
|
||
|
*/
|
||
|
|
||
|
public class SlideMediaActivity extends BaseActivity {
|
||
|
|
||
|
private ArrayList<Attachment> attachments;
|
||
|
private int mediaPosition;
|
||
|
private ViewPager mPager;
|
||
|
|
||
|
@Override
|
||
|
protected void onCreate(Bundle savedInstanceState) {
|
||
|
SharedPreferences sharedpreferences = getSharedPreferences(Helper.APP_PREFS, MODE_PRIVATE);
|
||
|
int theme = sharedpreferences.getInt(Helper.SET_THEME, Helper.THEME_DARK);
|
||
|
if (theme == Helper.THEME_BLACK)
|
||
|
setTheme(R.style.TransparentBlack);
|
||
|
super.onCreate(savedInstanceState);
|
||
|
setContentView(R.layout.activity_media_pager);
|
||
|
supportPostponeEnterTransition();
|
||
|
supportStartPostponedEnterTransition();
|
||
|
CoordinatorLayout main_container_media = findViewById(R.id.main_container_media);
|
||
|
if (theme == Helper.THEME_LIGHT) {
|
||
|
main_container_media.setBackgroundResource(R.color.mastodonC2);
|
||
|
} else if (theme == Helper.THEME_BLACK) {
|
||
|
main_container_media.setBackgroundResource(R.color.black);
|
||
|
} else if (theme == Helper.THEME_DARK) {
|
||
|
main_container_media.setBackgroundResource(R.color.mastodonC1_);
|
||
|
}
|
||
|
attachments = getIntent().getParcelableArrayListExtra("mediaArray");
|
||
|
if (getIntent().getExtras() != null)
|
||
|
mediaPosition = getIntent().getExtras().getInt("position", 1);
|
||
|
gestureDetector = new GestureDetector(new SwipeDetector());
|
||
|
|
||
|
if (attachments == null || attachments.size() == 0)
|
||
|
finish();
|
||
|
mPager = findViewById(R.id.media_viewpager);
|
||
|
|
||
|
PagerAdapter mPagerAdapter = new ScreenSlidePagerAdapter(getSupportFragmentManager());
|
||
|
mPager.setAdapter(mPagerAdapter);
|
||
|
|
||
|
mPager.setCurrentItem(mediaPosition-1);
|
||
|
|
||
|
}
|
||
|
|
||
|
private MediaSliderFragment mCurrentFragment;
|
||
|
|
||
|
|
||
|
public MediaSliderFragment getCurrentFragment() {
|
||
|
return mCurrentFragment;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Media Pager
|
||
|
*/
|
||
|
private class ScreenSlidePagerAdapter extends FragmentStatePagerAdapter {
|
||
|
|
||
|
ScreenSlidePagerAdapter(FragmentManager fm) {
|
||
|
super(fm);
|
||
|
}
|
||
|
|
||
|
@NotNull
|
||
|
@Override
|
||
|
public Fragment getItem(int position) {
|
||
|
Bundle bundle = new Bundle();
|
||
|
MediaSliderFragment mediaSliderFragment = new MediaSliderFragment();
|
||
|
bundle.putInt("position", position);
|
||
|
Log.v(Helper.TAG,"position: " + position);
|
||
|
Log.v(Helper.TAG,"attachments.get(position): " + attachments.get(position));
|
||
|
bundle.putParcelable("attachment", attachments.get(position));
|
||
|
mediaSliderFragment.setArguments(bundle);
|
||
|
return mediaSliderFragment;
|
||
|
}
|
||
|
|
||
|
@Override
|
||
|
public void setPrimaryItem(@NotNull ViewGroup container, int position, @NotNull Object object) {
|
||
|
if (getCurrentFragment() != object) {
|
||
|
mCurrentFragment = ((MediaSliderFragment) object);
|
||
|
}
|
||
|
super.setPrimaryItem(container, position, object);
|
||
|
}
|
||
|
|
||
|
@Override
|
||
|
public int getCount() {
|
||
|
return attachments.size();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
private static final int SWIPE_MIN_DISTANCE = 120;
|
||
|
private static final int SWIPE_MAX_OFF_PATH = 250;
|
||
|
private static final int SWIPE_THRESHOLD_VELOCITY = 200;
|
||
|
private GestureDetector gestureDetector;
|
||
|
|
||
|
private class SwipeDetector extends GestureDetector.SimpleOnGestureListener {
|
||
|
@Override
|
||
|
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
|
||
|
|
||
|
// Check movement along the Y-axis. If it exceeds SWIPE_MAX_OFF_PATH,
|
||
|
// then dismiss the swipe.
|
||
|
if (Math.abs(e1.getX() - e2.getX()) > SWIPE_MAX_OFF_PATH)
|
||
|
return false;
|
||
|
|
||
|
// Swipe from left to right.
|
||
|
// The swipe needs to exceed a certain distance (SWIPE_MIN_DISTANCE)
|
||
|
// and a certain velocity (SWIPE_THRESHOLD_VELOCITY).
|
||
|
if (e2.getY() - e1.getY() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
|
||
|
if( mCurrentFragment.canSwipe()) {
|
||
|
finish();
|
||
|
return true;
|
||
|
}else{
|
||
|
return false;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return false;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
@Override
|
||
|
public boolean dispatchTouchEvent(MotionEvent ev) {
|
||
|
// TouchEvent dispatcher.
|
||
|
if (gestureDetector != null) {
|
||
|
if (gestureDetector.onTouchEvent(ev))
|
||
|
// If the gestureDetector handles the event, a swipe has been
|
||
|
// executed and no more needs to be done.
|
||
|
return true;
|
||
|
}
|
||
|
return super.dispatchTouchEvent(ev);
|
||
|
}
|
||
|
|
||
|
@Override
|
||
|
public boolean onTouchEvent(MotionEvent event) {
|
||
|
return gestureDetector.onTouchEvent(event);
|
||
|
}
|
||
|
|
||
|
}
|