parent
							
								
									99591c050c
								
							
						
					
					
						commit
						59fe365ed6
					
				@ -33,10 +33,9 @@ import org.fdroid.fdroid.views.apps.FeatureImage;
 | 
				
			|||||||
 * + {@link R.id#icon} ({@link ImageView}, required)
 | 
					 * + {@link R.id#icon} ({@link ImageView}, required)
 | 
				
			||||||
 * + {@link R.id#summary} ({@link TextView}, required)
 | 
					 * + {@link R.id#summary} ({@link TextView}, required)
 | 
				
			||||||
 * + {@link R.id#new_tag} ({@link TextView}, optional)
 | 
					 * + {@link R.id#new_tag} ({@link TextView}, optional)
 | 
				
			||||||
 * + {@link R.id#featured_image} ({@link ImageView}, optional)
 | 
					 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
public class AppCardController extends RecyclerView.ViewHolder
 | 
					public class AppCardController extends RecyclerView.ViewHolder
 | 
				
			||||||
        implements ImageLoadingListener, View.OnClickListener {
 | 
					        implements View.OnClickListener {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * After this many days, don't consider showing the "New" tag next to an app.
 | 
					     * After this many days, don't consider showing the "New" tag next to an app.
 | 
				
			||||||
@ -58,13 +57,6 @@ public class AppCardController extends RecyclerView.ViewHolder
 | 
				
			|||||||
    @Nullable
 | 
					    @Nullable
 | 
				
			||||||
    private final TextView newTag;
 | 
					    private final TextView newTag;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * Wide and short image for branding the app. If it is not present in the metadata then F-Droid
 | 
					 | 
				
			||||||
     * will draw some abstract art instead.
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    @Nullable
 | 
					 | 
				
			||||||
    private final FeatureImage featuredImage;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    @Nullable
 | 
					    @Nullable
 | 
				
			||||||
    private App currentApp;
 | 
					    private App currentApp;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -78,7 +70,6 @@ public class AppCardController extends RecyclerView.ViewHolder
 | 
				
			|||||||
        icon = (ImageView) findViewAndEnsureNonNull(itemView, R.id.icon);
 | 
					        icon = (ImageView) findViewAndEnsureNonNull(itemView, R.id.icon);
 | 
				
			||||||
        summary = (TextView) findViewAndEnsureNonNull(itemView, R.id.summary);
 | 
					        summary = (TextView) findViewAndEnsureNonNull(itemView, R.id.summary);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        featuredImage = (FeatureImage) itemView.findViewById(R.id.featured_image);
 | 
					 | 
				
			||||||
        newTag = (TextView) itemView.findViewById(R.id.new_tag);
 | 
					        newTag = (TextView) itemView.findViewById(R.id.new_tag);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        itemView.setOnClickListener(this);
 | 
					        itemView.setOnClickListener(this);
 | 
				
			||||||
@ -113,25 +104,7 @@ public class AppCardController extends RecyclerView.ViewHolder
 | 
				
			|||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        ImageLoader.getInstance().displayImage(app.iconUrl, icon, Utils.getRepoAppDisplayImageOptions(), this);
 | 
					        ImageLoader.getInstance().displayImage(app.iconUrl, icon, Utils.getRepoAppDisplayImageOptions());
 | 
				
			||||||
 | 
					 | 
				
			||||||
        if (featuredImage != null) {
 | 
					 | 
				
			||||||
            featuredImage.setColour(ContextCompat.getColor(activity, R.color.fdroid_blue));
 | 
					 | 
				
			||||||
            featuredImage.setImageDrawable(null);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            // Note: We could call the convenience function
 | 
					 | 
				
			||||||
            // loadImageAndDisplay(ImageLoader, DisplayImageOptions, String, String)
 | 
					 | 
				
			||||||
            // which includes a fallback for when currentApp.featureGraphic is empty. However we need
 | 
					 | 
				
			||||||
            // to take care of also loading the icon (regardless of whether there is a featureGraphic
 | 
					 | 
				
			||||||
            // or not for this app) so that we can display the icon to the user. We will use the
 | 
					 | 
				
			||||||
            // load complete listener for the icon to decide whether we need to extract the colour
 | 
					 | 
				
			||||||
            // from that icon and assign to the `FeatureImage` (or whether we should wait for the
 | 
					 | 
				
			||||||
            // feature image to be loaded).
 | 
					 | 
				
			||||||
            if (!TextUtils.isEmpty(app.featureGraphic)) {
 | 
					 | 
				
			||||||
                featuredImage.loadImageAndDisplay(ImageLoader.getInstance(),
 | 
					 | 
				
			||||||
                        Utils.getRepoAppDisplayImageOptions(), app.getFeatureGraphicUrl(activity));
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private boolean isConsideredNew(@NonNull App app) {
 | 
					    private boolean isConsideredNew(@NonNull App app) {
 | 
				
			||||||
@ -166,44 +139,4 @@ public class AppCardController extends RecyclerView.ViewHolder
 | 
				
			|||||||
            activity.startActivity(intent);
 | 
					            activity.startActivity(intent);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					 | 
				
			||||||
    // =============================================================================================
 | 
					 | 
				
			||||||
    //  Icon loader callbacks
 | 
					 | 
				
			||||||
    //
 | 
					 | 
				
			||||||
    //  Most are unused, the main goal is to specify a background colour for the featured image if
 | 
					 | 
				
			||||||
    //  no featured image is specified in the apps metadata. If an image is specified, then it will
 | 
					 | 
				
			||||||
    //  get loaded using the `FeatureImage.loadImageAndDisplay()` method and so we don't need to do
 | 
					 | 
				
			||||||
    //  anything special here.
 | 
					 | 
				
			||||||
    // =============================================================================================
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    @Override
 | 
					 | 
				
			||||||
    public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
 | 
					 | 
				
			||||||
        if (currentApp != null
 | 
					 | 
				
			||||||
                && TextUtils.isEmpty(currentApp.featureGraphic)
 | 
					 | 
				
			||||||
                && featuredImage != null
 | 
					 | 
				
			||||||
                && loadedImage != null) {
 | 
					 | 
				
			||||||
            new Palette.Builder(loadedImage).generate(new Palette.PaletteAsyncListener() {
 | 
					 | 
				
			||||||
                @Override
 | 
					 | 
				
			||||||
                public void onGenerated(@NonNull Palette palette) {
 | 
					 | 
				
			||||||
                    featuredImage.setColorAndAnimateChange(palette.getDominantColor(Color.LTGRAY));
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
            });
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    @Override
 | 
					 | 
				
			||||||
    public void onLoadingStarted(String imageUri, View view) {
 | 
					 | 
				
			||||||
        // Do nothing
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    @Override
 | 
					 | 
				
			||||||
    public void onLoadingCancelled(String imageUri, View view) {
 | 
					 | 
				
			||||||
        // Do nothing
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    @Override
 | 
					 | 
				
			||||||
    public void onLoadingFailed(String imageUri, View view, FailReason failReason) {
 | 
					 | 
				
			||||||
        // Do nothing
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -44,15 +44,17 @@ public class WhatsNewAdapter extends RecyclerView.Adapter<AppCardController> {
 | 
				
			|||||||
    @Override
 | 
					    @Override
 | 
				
			||||||
    public AppCardController onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
 | 
					    public AppCardController onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
 | 
				
			||||||
        int layout;
 | 
					        int layout;
 | 
				
			||||||
        if (viewType == R.id.whats_new_feature) {
 | 
					        switch (viewType) {
 | 
				
			||||||
            layout = R.layout.app_card_featured;
 | 
					            case R.id.whats_new_large_tile:
 | 
				
			||||||
        } else if (viewType == R.id.whats_new_large_tile) {
 | 
					 | 
				
			||||||
                layout = R.layout.app_card_large;
 | 
					                layout = R.layout.app_card_large;
 | 
				
			||||||
        } else if (viewType == R.id.whats_new_small_tile) {
 | 
					                break;
 | 
				
			||||||
 | 
					            case R.id.whats_new_small_tile:
 | 
				
			||||||
                layout = R.layout.app_card_horizontal;
 | 
					                layout = R.layout.app_card_horizontal;
 | 
				
			||||||
        } else if (viewType == R.id.whats_new_regular_list) {
 | 
					                break;
 | 
				
			||||||
 | 
					            case R.id.whats_new_regular_list:
 | 
				
			||||||
                layout = R.layout.app_card_list_item;
 | 
					                layout = R.layout.app_card_list_item;
 | 
				
			||||||
        } else {
 | 
					                break;
 | 
				
			||||||
 | 
					            default:
 | 
				
			||||||
                throw new IllegalArgumentException("Unknown view type when rendering \"Whats New\": " + viewType);
 | 
					                throw new IllegalArgumentException("Unknown view type when rendering \"Whats New\": " + viewType);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -72,7 +74,7 @@ public class WhatsNewAdapter extends RecyclerView.Adapter<AppCardController> {
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (position == 0) {
 | 
					        if (position == 0) {
 | 
				
			||||||
            return R.id.whats_new_feature;
 | 
					            return R.id.whats_new_regular_list;
 | 
				
			||||||
        } else {
 | 
					        } else {
 | 
				
			||||||
            switch (relativePositionInCycle) {
 | 
					            switch (relativePositionInCycle) {
 | 
				
			||||||
                case 1:
 | 
					                case 1:
 | 
				
			||||||
@ -145,11 +147,7 @@ public class WhatsNewAdapter extends RecyclerView.Adapter<AppCardController> {
 | 
				
			|||||||
            int verticalPadding = (int) resources.getDimension(R.dimen.whats_new__padding__app_card__vertical);
 | 
					            int verticalPadding = (int) resources.getDimension(R.dimen.whats_new__padding__app_card__vertical);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            int relativePositionInCycle = position % 5;
 | 
					            int relativePositionInCycle = position % 5;
 | 
				
			||||||
            if (position == 0) {
 | 
					            if (relativePositionInCycle != 0) {
 | 
				
			||||||
                // Don't set any padding for the first item as the FeatureImage behind it needs to butt right
 | 
					 | 
				
			||||||
                // up against the left/top/right of the screen.
 | 
					 | 
				
			||||||
                outRect.set(0, 0, 0, verticalPadding);
 | 
					 | 
				
			||||||
            } else if (relativePositionInCycle != 0) {
 | 
					 | 
				
			||||||
                // The item on the left will have both left and right padding. The item on the right
 | 
					                // The item on the left will have both left and right padding. The item on the right
 | 
				
			||||||
                // will only have padding on the right. This will allow the same amount of padding
 | 
					                // will only have padding on the right. This will allow the same amount of padding
 | 
				
			||||||
                // on the left, centre, and right of the grid, rather than double the padding in the
 | 
					                // on the left, centre, and right of the grid, rather than double the padding in the
 | 
				
			||||||
@ -161,7 +159,7 @@ public class WhatsNewAdapter extends RecyclerView.Adapter<AppCardController> {
 | 
				
			|||||||
                int paddingRight = isLtr ? horizontalPadding : paddingStart;
 | 
					                int paddingRight = isLtr ? horizontalPadding : paddingStart;
 | 
				
			||||||
                outRect.set(paddingLeft, 0, paddingRight, verticalPadding);
 | 
					                outRect.set(paddingLeft, 0, paddingRight, verticalPadding);
 | 
				
			||||||
            } else {
 | 
					            } else {
 | 
				
			||||||
                outRect.set(horizontalPadding, 0, horizontalPadding, verticalPadding);
 | 
					                outRect.set(horizontalPadding, position == 0 ? verticalPadding : 0, horizontalPadding, verticalPadding);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
				
			|||||||
@ -1,87 +0,0 @@
 | 
				
			|||||||
<?xml version="1.0" encoding="utf-8"?>
 | 
					 | 
				
			||||||
<android.support.constraint.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:layout_width="match_parent"
 | 
					 | 
				
			||||||
    android:layout_height="wrap_content"
 | 
					 | 
				
			||||||
    android:paddingBottom="2dp"
 | 
					 | 
				
			||||||
    android:clipToPadding="false">
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    <org.fdroid.fdroid.views.apps.FeatureImage
 | 
					 | 
				
			||||||
        android:id="@+id/featured_image"
 | 
					 | 
				
			||||||
        android:layout_width="0dp"
 | 
					 | 
				
			||||||
        android:layout_height="120dp"
 | 
					 | 
				
			||||||
        tools:src="@color/fdroid_green"
 | 
					 | 
				
			||||||
        android:scaleType="centerCrop"
 | 
					 | 
				
			||||||
        android:fitsSystemWindows="true"
 | 
					 | 
				
			||||||
        app:layout_constraintStart_toStartOf="parent"
 | 
					 | 
				
			||||||
        app:layout_constraintEnd_toEndOf="parent"
 | 
					 | 
				
			||||||
        app:layout_constraintTop_toTopOf="parent" />
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    <android.support.constraint.Guideline
 | 
					 | 
				
			||||||
        android:id="@+id/header_height"
 | 
					 | 
				
			||||||
        android:layout_width="match_parent"
 | 
					 | 
				
			||||||
        android:layout_height="wrap_content"
 | 
					 | 
				
			||||||
        android:orientation="horizontal"
 | 
					 | 
				
			||||||
        app:layout_constraintGuide_begin="80dp" />
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    <android.support.v7.widget.CardView
 | 
					 | 
				
			||||||
        android:layout_width="match_parent"
 | 
					 | 
				
			||||||
        android:layout_height="wrap_content"
 | 
					 | 
				
			||||||
        android:layout_marginLeft="@dimen/whats_new__padding__app_card__horizontal"
 | 
					 | 
				
			||||||
        android:layout_marginStart="@dimen/whats_new__padding__app_card__horizontal"
 | 
					 | 
				
			||||||
        android:layout_marginRight="@dimen/whats_new__padding__app_card__horizontal"
 | 
					 | 
				
			||||||
        android:layout_marginEnd="@dimen/whats_new__padding__app_card__horizontal"
 | 
					 | 
				
			||||||
        app:layout_constraintStart_toStartOf="parent"
 | 
					 | 
				
			||||||
        app:layout_constraintEnd_toEndOf="parent"
 | 
					 | 
				
			||||||
        app:layout_constraintTop_toTopOf="@+id/header_height"
 | 
					 | 
				
			||||||
        android:foreground="?attr/selectableItemBackground"
 | 
					 | 
				
			||||||
        >
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        <android.support.constraint.ConstraintLayout
 | 
					 | 
				
			||||||
            android:layout_width="match_parent"
 | 
					 | 
				
			||||||
            android:layout_height="wrap_content"
 | 
					 | 
				
			||||||
            android:padding="12dp">
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            <!-- Ignore ContentDescription because it is kind of meaningless to have TTS read out "App icon"
 | 
					 | 
				
			||||||
                 when it will inevitably read out the name of the app straight after. -->
 | 
					 | 
				
			||||||
            <ImageView
 | 
					 | 
				
			||||||
                android:id="@+id/icon"
 | 
					 | 
				
			||||||
                android:layout_width="48dp"
 | 
					 | 
				
			||||||
                android:layout_height="48dp"
 | 
					 | 
				
			||||||
                tools:src="@drawable/ic_launcher"
 | 
					 | 
				
			||||||
                android:scaleType="fitCenter"
 | 
					 | 
				
			||||||
                android:transitionName="@string/transition_app_item_icon"
 | 
					 | 
				
			||||||
                app:layout_constraintStart_toStartOf="parent"
 | 
					 | 
				
			||||||
                app:layout_constraintTop_toTopOf="parent"
 | 
					 | 
				
			||||||
                tools:ignore="ContentDescription" />
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            <TextView
 | 
					 | 
				
			||||||
                tools:text="F-Droid An application summary which takes up too much space and must ellipsize, perhaps after wrapping to a new line"
 | 
					 | 
				
			||||||
                android:layout_width="0dp"
 | 
					 | 
				
			||||||
                android:layout_height="wrap_content"
 | 
					 | 
				
			||||||
                android:id="@+id/summary"
 | 
					 | 
				
			||||||
                android:lines="2"
 | 
					 | 
				
			||||||
                android:textSize="14sp"
 | 
					 | 
				
			||||||
                android:ellipsize="end"
 | 
					 | 
				
			||||||
                android:layout_marginLeft="16dp"
 | 
					 | 
				
			||||||
                android:layout_marginStart="16dp"
 | 
					 | 
				
			||||||
                app:layout_constraintStart_toEndOf="@+id/icon"
 | 
					 | 
				
			||||||
                app:layout_constraintEnd_toEndOf="parent"
 | 
					 | 
				
			||||||
                app:layout_constraintTop_toTopOf="parent"  />
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            <include layout="@layout/app_status_new"
 | 
					 | 
				
			||||||
                android:layout_width="wrap_content"
 | 
					 | 
				
			||||||
                android:layout_height="wrap_content"
 | 
					 | 
				
			||||||
                android:id="@+id/new_tag"
 | 
					 | 
				
			||||||
                android:layout_marginLeft="16dp"
 | 
					 | 
				
			||||||
                android:layout_marginStart="16dp"
 | 
					 | 
				
			||||||
                app:layout_constraintTop_toBottomOf="@+id/summary"
 | 
					 | 
				
			||||||
                app:layout_constraintStart_toEndOf="@+id/icon"
 | 
					 | 
				
			||||||
                android:layout_marginTop="8dp" />
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        </android.support.constraint.ConstraintLayout>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    </android.support.v7.widget.CardView>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
</android.support.constraint.ConstraintLayout>
 | 
					 | 
				
			||||||
@ -2,7 +2,6 @@
 | 
				
			|||||||
<resources>
 | 
					<resources>
 | 
				
			||||||
    <item type="id" name="preference_fragment_parent"/>
 | 
					    <item type="id" name="preference_fragment_parent"/>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    <item type="id" name="whats_new_feature"/>
 | 
					 | 
				
			||||||
    <item type="id" name="whats_new_large_tile"/>
 | 
					    <item type="id" name="whats_new_large_tile"/>
 | 
				
			||||||
    <item type="id" name="whats_new_small_tile"/>
 | 
					    <item type="id" name="whats_new_small_tile"/>
 | 
				
			||||||
    <item type="id" name="whats_new_regular_list"/>
 | 
					    <item type="id" name="whats_new_regular_list"/>
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user