Merge branch '#936-view-screenshots-in-full-screen' into 'master'

See merge request fdroid/fdroidclient!606
This commit is contained in:
Hans-Christoph Steiner 2017-11-09 23:19:16 +01:00
commit 75d3e47572
6 changed files with 209 additions and 6 deletions

View File

@ -201,6 +201,7 @@
android:name="android.support.PARENT_ACTIVITY" android:name="android.support.PARENT_ACTIVITY"
android:value=".views.main.MainActivity" /> android:value=".views.main.MainActivity" />
</activity> </activity>
<activity android:name=".views.ScreenShotsActivity" />
<!-- Note: AppThemeTransparent, this activity shows dialogs only --> <!-- Note: AppThemeTransparent, this activity shows dialogs only -->
<activity <activity
android:name=".privileged.install.InstallExtensionDialogActivity" android:name=".privileged.install.InstallExtensionDialogActivity"

View File

@ -578,7 +578,8 @@ public class AppDetailsRecyclerViewAdapter
public abstract void bindModel(); public abstract void bindModel();
} }
private class ScreenShotsViewHolder extends AppDetailsViewHolder { private class ScreenShotsViewHolder extends AppDetailsViewHolder
implements ScreenShotsRecyclerViewAdapter.Listener {
final RecyclerView recyclerView; final RecyclerView recyclerView;
LinearLayoutManagerSnapHelper snapHelper; LinearLayoutManagerSnapHelper snapHelper;
@ -591,7 +592,7 @@ public class AppDetailsRecyclerViewAdapter
public void bindModel() { public void bindModel() {
LinearLayoutManager lm = new LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false); LinearLayoutManager lm = new LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false);
recyclerView.setLayoutManager(lm); recyclerView.setLayoutManager(lm);
ScreenShotsRecyclerViewAdapter adapter = new ScreenShotsRecyclerViewAdapter(itemView.getContext(), app); ScreenShotsRecyclerViewAdapter adapter = new ScreenShotsRecyclerViewAdapter(itemView.getContext(), app, this);
recyclerView.setAdapter(adapter); recyclerView.setAdapter(adapter);
recyclerView.setHasFixedSize(true); recyclerView.setHasFixedSize(true);
recyclerView.setNestedScrollingEnabled(false); recyclerView.setNestedScrollingEnabled(false);
@ -601,6 +602,11 @@ public class AppDetailsRecyclerViewAdapter
snapHelper = new LinearLayoutManagerSnapHelper(lm); snapHelper = new LinearLayoutManagerSnapHelper(lm);
snapHelper.attachToRecyclerView(recyclerView); snapHelper.attachToRecyclerView(recyclerView);
} }
@Override
public void onScreenshotClick(int position) {
context.startActivity(ScreenShotsActivity.getStartIntent(context, app.packageName, position));
}
} }
private class DonateViewHolder extends AppDetailsViewHolder { private class DonateViewHolder extends AppDetailsViewHolder {

View File

@ -0,0 +1,159 @@
package org.fdroid.fdroid.views;
import android.annotation.TargetApi;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.os.Build;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentStatePagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.assist.ImageScaleType;
import org.fdroid.fdroid.FDroidApp;
import org.fdroid.fdroid.R;
import org.fdroid.fdroid.data.App;
import org.fdroid.fdroid.data.AppProvider;
/**
* Full screen view of an apps screenshots to swipe through.
*/
public class ScreenShotsActivity extends AppCompatActivity {
private static final String EXTRA_PACKAGE_NAME = "EXTRA_PACKAGE_NAME";
private static final String EXTRA_START_POSITION = "EXTRA_START_POSITION";
public static Intent getStartIntent(Context context, String packageName, int startPosition) {
Intent intent = new Intent(context, ScreenShotsActivity.class);
intent.putExtra(EXTRA_PACKAGE_NAME, packageName);
intent.putExtra(EXTRA_START_POSITION, startPosition);
return intent;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
FDroidApp fdroidApp = (FDroidApp) getApplication();
fdroidApp.applyTheme(this);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_screenshots);
String packageName = getIntent().getStringExtra(EXTRA_PACKAGE_NAME);
int startPosition = getIntent().getIntExtra(EXTRA_START_POSITION, 0);
App app = AppProvider.Helper.findHighestPriorityMetadata(getContentResolver(), packageName);
String[] screenshots = app.getAllScreenshots(this);
ViewPager viewPager = (ViewPager) findViewById(R.id.screenshot_view_pager);
ScreenShotPagerAdapter adapter = new ScreenShotPagerAdapter(getSupportFragmentManager(), screenshots);
viewPager.setAdapter(adapter);
viewPager.setCurrentItem(startPosition);
if (Build.VERSION.SDK_INT >= 11) {
// display some nice animation while swiping
viewPager.setPageTransformer(true, new DepthPageTransformer());
}
}
private class ScreenShotPagerAdapter extends FragmentStatePagerAdapter {
private final String[] screenshots;
ScreenShotPagerAdapter(FragmentManager fragmentManager, String[] screenshots) {
super(fragmentManager);
this.screenshots = screenshots;
}
@Override
public Fragment getItem(int position) {
return ScreenShotPageFragment.newInstance(screenshots[position]);
}
@Override
public int getCount() {
return screenshots.length;
}
}
/**
* A single screenshot page.
*/
public static class ScreenShotPageFragment extends Fragment {
private static final String ARG_SCREENSHOT_URL = "ARG_SCREENSHOT_URL";
static ScreenShotPageFragment newInstance(String screenshotUrl) {
ScreenShotPageFragment fragment = new ScreenShotPageFragment();
Bundle args = new Bundle();
args.putString(ARG_SCREENSHOT_URL, screenshotUrl);
fragment.setArguments(args);
return fragment;
}
private String screenshotUrl;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
screenshotUrl = getArguments() != null ? getArguments().getString(ARG_SCREENSHOT_URL) : null;
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,
@Nullable Bundle savedInstanceState) {
DisplayImageOptions displayImageOptions = new DisplayImageOptions.Builder()
.cacheInMemory(true)
.cacheOnDisk(true)
.imageScaleType(ImageScaleType.NONE)
.showImageOnLoading(R.drawable.screenshot_placeholder)
.showImageForEmptyUri(R.drawable.screenshot_placeholder)
.bitmapConfig(Bitmap.Config.RGB_565)
.build();
View rootView = inflater.inflate(R.layout.activity_screenshots_page, container, false);
ImageView screenshotView = (ImageView) rootView.findViewById(R.id.screenshot);
ImageLoader.getInstance().displayImage(screenshotUrl, screenshotView, displayImageOptions);
return rootView;
}
}
@TargetApi(11)
public class DepthPageTransformer implements ViewPager.PageTransformer {
public void transformPage(View view, float position) {
int pageWidth = view.getWidth();
if (position <= 0) {
// use the default slide transition when moving to the left page
view.setAlpha(1);
view.setTranslationX(0);
} else if (position <= 1) {
// fade the page out.
view.setAlpha(1 - position);
// add parallax effect
view.setTranslationX(pageWidth * -position / 2);
} else {
// this page is way off-screen to the right.
view.setAlpha(0);
}
}
}
}

View File

@ -18,9 +18,12 @@ import org.fdroid.fdroid.data.App;
class ScreenShotsRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { class ScreenShotsRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private final String[] screenshots; private final String[] screenshots;
private final DisplayImageOptions displayImageOptions; private final DisplayImageOptions displayImageOptions;
private final Listener listener;
ScreenShotsRecyclerViewAdapter(Context context, App app) { ScreenShotsRecyclerViewAdapter(Context context, App app, Listener listener) {
super(); super();
this.listener = listener;
screenshots = app.getAllScreenshots(context); screenshots = app.getAllScreenshots(context);
displayImageOptions = new DisplayImageOptions.Builder() displayImageOptions = new DisplayImageOptions.Builder()
.cacheInMemory(true) .cacheInMemory(true)
@ -33,8 +36,8 @@ class ScreenShotsRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.V
} }
@Override @Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) {
ScreenShotViewHolder vh = (ScreenShotViewHolder) holder; final ScreenShotViewHolder vh = (ScreenShotViewHolder) holder;
ImageLoader.getInstance().displayImage(screenshots[position], ImageLoader.getInstance().displayImage(screenshots[position],
vh.image, displayImageOptions); vh.image, displayImageOptions);
} }
@ -51,12 +54,26 @@ class ScreenShotsRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.V
return screenshots.length; return screenshots.length;
} }
private class ScreenShotViewHolder extends RecyclerView.ViewHolder { public interface Listener {
/**
* @param position zero based position of the screenshot
* that has been clicked upon
*/
void onScreenshotClick(int position);
}
private class ScreenShotViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
final ImageView image; final ImageView image;
ScreenShotViewHolder(View view) { ScreenShotViewHolder(View view) {
super(view); super(view);
image = (ImageView) view.findViewById(R.id.image); image = (ImageView) view.findViewById(R.id.image);
image.setOnClickListener(this);
}
@Override
public void onClick(View view) {
listener.onScreenshotClick(getAdapterPosition());
} }
@Override @Override

View File

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.view.ViewPager xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/screenshot_view_pager"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="org.fdroid.fdroid.views.ScreenShotsActivity" />

View File

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<ImageView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/screenshot"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:contentDescription="@null"
android:padding="@dimen/layout_horizontal_margin"
tools:src="@drawable/screenshot_placeholder" />