Merge branch 'no-featured-app' into 'master'
* no-featured-app: cleanup imports fix padding of top item in Latest Tab Remove feature graphic of first app from "Latest" view See merge request fdroid/fdroidclient!807
This commit is contained in:
		
						commit
						80bab5611b
					
				| @ -2,30 +2,22 @@ package org.fdroid.fdroid.views.categories; | |||||||
| 
 | 
 | ||||||
| import android.app.Activity; | import android.app.Activity; | ||||||
| import android.content.Intent; | import android.content.Intent; | ||||||
| import android.graphics.Bitmap; |  | ||||||
| import android.graphics.Color; |  | ||||||
| import android.os.Build; | import android.os.Build; | ||||||
| import android.os.Bundle; | import android.os.Bundle; | ||||||
| import android.support.annotation.IdRes; | import android.support.annotation.IdRes; | ||||||
| import android.support.annotation.NonNull; | import android.support.annotation.NonNull; | ||||||
| import android.support.annotation.Nullable; | import android.support.annotation.Nullable; | ||||||
| import android.support.v4.app.ActivityOptionsCompat; | import android.support.v4.app.ActivityOptionsCompat; | ||||||
| import android.support.v4.content.ContextCompat; |  | ||||||
| import android.support.v4.util.Pair; | import android.support.v4.util.Pair; | ||||||
| import android.support.v7.graphics.Palette; |  | ||||||
| import android.support.v7.widget.RecyclerView; | import android.support.v7.widget.RecyclerView; | ||||||
| import android.text.TextUtils; |  | ||||||
| import android.view.View; | import android.view.View; | ||||||
| import android.widget.ImageView; | import android.widget.ImageView; | ||||||
| import android.widget.TextView; | import android.widget.TextView; | ||||||
| import com.nostra13.universalimageloader.core.ImageLoader; | import com.nostra13.universalimageloader.core.ImageLoader; | ||||||
| import com.nostra13.universalimageloader.core.assist.FailReason; |  | ||||||
| import com.nostra13.universalimageloader.core.listener.ImageLoadingListener; |  | ||||||
| import org.fdroid.fdroid.views.AppDetailsActivity; |  | ||||||
| import org.fdroid.fdroid.R; | import org.fdroid.fdroid.R; | ||||||
| import org.fdroid.fdroid.Utils; | import org.fdroid.fdroid.Utils; | ||||||
| import org.fdroid.fdroid.data.App; | import org.fdroid.fdroid.data.App; | ||||||
| import org.fdroid.fdroid.views.apps.FeatureImage; | import org.fdroid.fdroid.views.AppDetailsActivity; | ||||||
| 
 | 
 | ||||||
| /** | /** | ||||||
|  * The {@link AppCardController} can bind an app to several different layouts, as long as the layout |  * The {@link AppCardController} can bind an app to several different layouts, as long as the layout | ||||||
| @ -33,10 +25,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 +49,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 +62,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 +96,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 +131,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 |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
| } | } | ||||||
|  | |||||||
| @ -11,7 +11,6 @@ import android.support.v7.widget.GridLayoutManager; | |||||||
| import android.support.v7.widget.RecyclerView; | import android.support.v7.widget.RecyclerView; | ||||||
| import android.view.View; | import android.view.View; | ||||||
| import android.view.ViewGroup; | import android.view.ViewGroup; | ||||||
| 
 |  | ||||||
| import org.fdroid.fdroid.BuildConfig; | import org.fdroid.fdroid.BuildConfig; | ||||||
| import org.fdroid.fdroid.R; | import org.fdroid.fdroid.R; | ||||||
| import org.fdroid.fdroid.data.App; | import org.fdroid.fdroid.data.App; | ||||||
| @ -44,16 +43,18 @@ 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; |                 break; | ||||||
|         } else if (viewType == R.id.whats_new_small_tile) { |             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; | ||||||
|             layout = R.layout.app_card_list_item; |             case R.id.whats_new_regular_list: | ||||||
|         } else { |                 layout = R.layout.app_card_list_item; | ||||||
|             throw new IllegalArgumentException("Unknown view type when rendering \"Whats New\": " + viewType); |                 break; | ||||||
|  |             default: | ||||||
|  |                 throw new IllegalArgumentException("Unknown view type when rendering \"Whats New\": " + viewType); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         return new AppCardController(activity, activity.getLayoutInflater().inflate(layout, parent, false)); |         return new AppCardController(activity, activity.getLayoutInflater().inflate(layout, parent, false)); | ||||||
| @ -72,7 +73,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 +146,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 +158,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, verticalPadding, 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
	 Hans-Christoph Steiner
						Hans-Christoph Steiner