Merge branch '#936-view-screenshots-in-full-screen' into 'master'
See merge request fdroid/fdroidclient!606
This commit is contained in:
commit
75d3e47572
@ -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"
|
||||||
|
@ -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 {
|
||||||
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -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
|
||||||
|
10
app/src/main/res/layout/activity_screenshots.xml
Normal file
10
app/src/main/res/layout/activity_screenshots.xml
Normal 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" />
|
||||||
|
|
||||||
|
|
10
app/src/main/res/layout/activity_screenshots_page.xml
Normal file
10
app/src/main/res/layout/activity_screenshots_page.xml
Normal 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" />
|
Loading…
x
Reference in New Issue
Block a user