Redesign releases screen (#526)
Add download assets implement release layout in adapter update the layout Fixing gravity. Adding layouts for new release items. Co-authored-by: M M Arif <mmarif@swatian.com> Co-authored-by: opyale <opyale@noreply.gitea.io> Reviewed-by: 6543 <6543@noreply.codeberg.org>
This commit is contained in:
		| @@ -10,19 +10,25 @@ import android.view.LayoutInflater; | ||||
| import android.view.View; | ||||
| import android.view.ViewGroup; | ||||
| import android.widget.ImageView; | ||||
| import android.widget.LinearLayout; | ||||
| import android.widget.RelativeLayout; | ||||
| import android.widget.TextView; | ||||
| import com.amulyakhare.textdrawable.TextDrawable; | ||||
| import androidx.annotation.NonNull; | ||||
| import androidx.recyclerview.widget.LinearLayoutManager; | ||||
| import androidx.recyclerview.widget.RecyclerView; | ||||
| import com.vdurmont.emoji.EmojiParser; | ||||
| import org.mian.gitnex.R; | ||||
| import org.mian.gitnex.clients.PicassoService; | ||||
| import org.mian.gitnex.helpers.ClickListener; | ||||
| import org.mian.gitnex.helpers.RoundedTransformation; | ||||
| import org.mian.gitnex.helpers.TimeHelper; | ||||
| import org.mian.gitnex.models.Releases; | ||||
| import org.mian.gitnex.util.TinyDB; | ||||
| import java.util.Collection; | ||||
| import java.util.Collections; | ||||
| import java.util.List; | ||||
| import java.util.Locale; | ||||
| import java.util.Objects; | ||||
| import androidx.annotation.NonNull; | ||||
| import androidx.annotation.Nullable; | ||||
| import androidx.recyclerview.widget.RecyclerView; | ||||
| import io.noties.markwon.AbstractMarkwonPlugin; | ||||
| import io.noties.markwon.Markwon; | ||||
| import io.noties.markwon.core.CorePlugin; | ||||
| @@ -31,7 +37,6 @@ import io.noties.markwon.ext.strikethrough.StrikethroughPlugin; | ||||
| import io.noties.markwon.ext.tables.TablePlugin; | ||||
| import io.noties.markwon.ext.tasklist.TaskListPlugin; | ||||
| import io.noties.markwon.html.HtmlPlugin; | ||||
| import io.noties.markwon.image.AsyncDrawable; | ||||
| import io.noties.markwon.image.DefaultMediaDecoder; | ||||
| import io.noties.markwon.image.ImageItem; | ||||
| import io.noties.markwon.image.ImagesPlugin; | ||||
| @@ -49,25 +54,44 @@ public class ReleasesAdapter extends RecyclerView.Adapter<ReleasesAdapter.Releas | ||||
|     private List<Releases> releasesList; | ||||
|     private Context mCtx; | ||||
|  | ||||
|     static class ReleasesViewHolder extends RecyclerView.ViewHolder { | ||||
| 	static class ReleasesViewHolder extends RecyclerView.ViewHolder { | ||||
|  | ||||
|         private ImageView releaseType; | ||||
|         private TextView releaseTitle; | ||||
|         private TextView releaseDescription; | ||||
|         private TextView releaseDownload; | ||||
|         private TextView releaseZipDownload; | ||||
|         private TextView releaseTarDownload; | ||||
|         private TextView releaseType; | ||||
|         private TextView releaseName; | ||||
|         private ImageView authorAvatar; | ||||
|         private TextView authorName; | ||||
|         private TextView releaseTag; | ||||
|         private TextView releaseCommitSha; | ||||
|         private TextView releaseDate; | ||||
|         private TextView releaseBodyContent; | ||||
|         private LinearLayout downloadFrame; | ||||
|         private RelativeLayout downloads; | ||||
|         private TextView releaseZipDownload; | ||||
| 	    private TextView releaseTarDownload; | ||||
| 	    private ImageView downloadDropdownIcon; | ||||
| 	    private RecyclerView downloadList; | ||||
|  | ||||
|         private ReleasesViewHolder(View itemView) { | ||||
|  | ||||
|             super(itemView); | ||||
|  | ||||
|             releaseType = itemView.findViewById(R.id.releaseType); | ||||
|             releaseTitle = itemView.findViewById(R.id.releaseTitle); | ||||
|             releaseDescription = itemView.findViewById(R.id.releaseDescription); | ||||
|             releaseZipDownload = itemView.findViewById(R.id.releaseZipDownload); | ||||
|             releaseTarDownload = itemView.findViewById(R.id.releaseTarDownload); | ||||
|             releaseTag = itemView.findViewById(R.id.releaseTag); | ||||
| 	        releaseType = itemView.findViewById(R.id.releaseType); | ||||
| 	        releaseName = itemView.findViewById(R.id.releaseName); | ||||
| 	        authorAvatar = itemView.findViewById(R.id.authorAvatar); | ||||
| 	        authorName = itemView.findViewById(R.id.authorName); | ||||
| 	        releaseTag = itemView.findViewById(R.id.releaseTag); | ||||
| 	        releaseCommitSha = itemView.findViewById(R.id.releaseCommitSha); | ||||
| 	        releaseDate = itemView.findViewById(R.id.releaseDate); | ||||
| 	        releaseBodyContent = itemView.findViewById(R.id.releaseBodyContent); | ||||
| 	        downloadFrame = itemView.findViewById(R.id.downloadFrame); | ||||
| 	        downloads = itemView.findViewById(R.id.downloads); | ||||
| 	        releaseZipDownload = itemView.findViewById(R.id.releaseZipDownload); | ||||
| 	        releaseTarDownload = itemView.findViewById(R.id.releaseTarDownload); | ||||
| 	        downloadDropdownIcon = itemView.findViewById(R.id.downloadDropdownIcon); | ||||
| 	        downloadList = itemView.findViewById(R.id.downloadList); | ||||
|  | ||||
| 	        downloadList.setHasFixedSize(true); | ||||
| 	        downloadList.setLayoutManager(new LinearLayoutManager(itemView.getContext())); | ||||
|  | ||||
|         } | ||||
|     } | ||||
| @@ -88,83 +112,74 @@ public class ReleasesAdapter extends RecyclerView.Adapter<ReleasesAdapter.Releas | ||||
|     public void onBindViewHolder(@NonNull ReleasesAdapter.ReleasesViewHolder holder, int position) { | ||||
|  | ||||
|         final TinyDB tinyDb = new TinyDB(mCtx); | ||||
| 	    final String locale = tinyDb.getString("locale"); | ||||
| 	    final String timeFormat = tinyDb.getString("dateFormat"); | ||||
|  | ||||
|         Releases currentItem = releasesList.get(position); | ||||
|  | ||||
|         holder.releaseTitle.setText(currentItem.getName()); | ||||
| 	    holder.releaseName.setText(currentItem.getName()); | ||||
|  | ||||
|         if(!currentItem.getTag_name().equals("")) { | ||||
|             holder.releaseTag.setText(mCtx.getResources().getString(R.string.releaseTag, currentItem.getTag_name())); | ||||
|         } | ||||
|         else { | ||||
|             holder.releaseTag.setVisibility(View.GONE); | ||||
|         } | ||||
| 	    if(currentItem.isPrerelease()) { | ||||
| 		    holder.releaseType.setBackgroundResource(R.drawable.shape_pre_release); | ||||
| 		    holder.releaseType.setText(R.string.releaseTypePre); | ||||
| 	    } | ||||
| 	    else if(currentItem.isDraft()) { | ||||
| 		    holder.releaseType.setVisibility(View.GONE); | ||||
| 	    } | ||||
| 	    else { | ||||
| 		    holder.releaseType.setBackgroundResource(R.drawable.shape_stable_release); | ||||
| 		    holder.releaseType.setText(R.string.releaseTypeStable); | ||||
| 	    } | ||||
|  | ||||
|         if(currentItem.isPrerelease()) { | ||||
|             TextDrawable drawable = TextDrawable.builder() | ||||
|                     .beginConfig() | ||||
|                     //.useFont(Typeface.DEFAULT) | ||||
|                     .textColor(mCtx.getResources().getColor(R.color.white)) | ||||
|                     .fontSize(34) | ||||
|                     .width(260) | ||||
|                     .height(60) | ||||
|                     .endConfig() | ||||
|                     .buildRoundRect(mCtx.getResources().getString(R.string.releaseTypePre), mCtx.getResources().getColor(R.color.releasePre), 8); | ||||
|             holder.releaseType.setImageDrawable(drawable); | ||||
|         } | ||||
|         else { | ||||
|             TextDrawable drawable = TextDrawable.builder() | ||||
|                     .beginConfig() | ||||
|                     //.useFont(Typeface.DEFAULT) | ||||
|                     .textColor(mCtx.getResources().getColor(R.color.white)) | ||||
|                     .fontSize(34) | ||||
|                     .width(260) | ||||
|                     .height(60) | ||||
|                     .endConfig() | ||||
|                     .buildRoundRect(mCtx.getResources().getString(R.string.releaseTypeStable), mCtx.getResources().getColor(R.color.releaseStable), 8); | ||||
|             holder.releaseType.setImageDrawable(drawable); | ||||
|         } | ||||
| 	    if(currentItem.getAuthor().getAvatar_url() != null) { | ||||
| 		    PicassoService.getInstance(mCtx).get().load(currentItem.getAuthor().getAvatar_url()).placeholder(R.drawable.loader_animated).transform(new RoundedTransformation(8, 0)).resize(120, 120).centerCrop().into(holder.authorAvatar); | ||||
| 	    } | ||||
|  | ||||
| 	    holder.authorName.setText(mCtx.getResources().getString(R.string.releasePublishedBy, currentItem.getAuthor().getUsername())); | ||||
|  | ||||
| 	    if(currentItem.getTag_name() != null) { | ||||
| 	    	holder.releaseTag.setText(currentItem.getTag_name()); | ||||
| 	    } | ||||
|  | ||||
| 	    if(currentItem.getPublished_at() != null) { | ||||
| 		    holder.releaseDate.setText(TimeHelper.formatTime(currentItem.getPublished_at(), new Locale(locale), timeFormat, mCtx)); | ||||
| 	    } | ||||
|  | ||||
| 	    if(timeFormat.equals("pretty")) { | ||||
| 		    holder.releaseDate.setOnClickListener(new ClickListener(TimeHelper.customDateFormatForToastDateFormat(currentItem.getPublished_at()), mCtx)); | ||||
| 	    } | ||||
|  | ||||
|         final Markwon markwon = Markwon.builder(Objects.requireNonNull(mCtx)) | ||||
|                 .usePlugin(CorePlugin.create()) | ||||
|                 .usePlugin(ImagesPlugin.create(new ImagesPlugin.ImagesConfigure() { | ||||
|                     @Override | ||||
|                     public void configureImages(@NonNull ImagesPlugin plugin) { | ||||
|                         plugin.addSchemeHandler(new SchemeHandler() { | ||||
|                             @NonNull | ||||
|                             @Override | ||||
|                             public ImageItem handle(@NonNull String raw, @NonNull Uri uri) { | ||||
|                 .usePlugin(ImagesPlugin.create(plugin -> { | ||||
|                     plugin.addSchemeHandler(new SchemeHandler() { | ||||
|                         @NonNull | ||||
|                         @Override | ||||
|                         public ImageItem handle(@NonNull String raw, @NonNull Uri uri) { | ||||
|  | ||||
|                                 final int resourceId = mCtx.getResources().getIdentifier( | ||||
|                                         raw.substring("drawable://".length()), | ||||
|                                         "drawable", | ||||
|                                         mCtx.getPackageName()); | ||||
|                             final int resourceId = mCtx.getResources().getIdentifier( | ||||
|                                     raw.substring("drawable://".length()), | ||||
|                                     "drawable", | ||||
|                                     mCtx.getPackageName()); | ||||
|  | ||||
|                                 final Drawable drawable = mCtx.getDrawable(resourceId); | ||||
|                             final Drawable drawable = mCtx.getDrawable(resourceId); | ||||
|  | ||||
|                                 assert drawable != null; | ||||
|                                 return ImageItem.withResult(drawable); | ||||
|                             } | ||||
|                             assert drawable != null; | ||||
|                             return ImageItem.withResult(drawable); | ||||
|                         } | ||||
|  | ||||
|                             @NonNull | ||||
|                             @Override | ||||
|                             public Collection<String> supportedSchemes() { | ||||
|                                 return Collections.singleton("drawable"); | ||||
|                             } | ||||
|                         }); | ||||
|                         plugin.placeholderProvider(new ImagesPlugin.PlaceholderProvider() { | ||||
|                             @Nullable | ||||
|                             @Override | ||||
|                             public Drawable providePlaceholder(@NonNull AsyncDrawable drawable) { | ||||
|                                 return null; | ||||
|                             } | ||||
|                         }); | ||||
|                         plugin.addMediaDecoder(GifMediaDecoder.create(false)); | ||||
|                         plugin.addMediaDecoder(SvgMediaDecoder.create(mCtx.getResources())); | ||||
|                         plugin.addMediaDecoder(SvgMediaDecoder.create()); | ||||
|                         plugin.defaultMediaDecoder(DefaultMediaDecoder.create(mCtx.getResources())); | ||||
|                         plugin.defaultMediaDecoder(DefaultMediaDecoder.create()); | ||||
|                     } | ||||
|                         @NonNull | ||||
|                         @Override | ||||
|                         public Collection<String> supportedSchemes() { | ||||
|                             return Collections.singleton("drawable"); | ||||
|                         } | ||||
|                     }); | ||||
|                     plugin.placeholderProvider(drawable -> null); | ||||
|                     plugin.addMediaDecoder(GifMediaDecoder.create(false)); | ||||
|                     plugin.addMediaDecoder(SvgMediaDecoder.create(mCtx.getResources())); | ||||
|                     plugin.addMediaDecoder(SvgMediaDecoder.create()); | ||||
|                     plugin.defaultMediaDecoder(DefaultMediaDecoder.create(mCtx.getResources())); | ||||
|                     plugin.defaultMediaDecoder(DefaultMediaDecoder.create()); | ||||
|                 })) | ||||
|                 .usePlugin(new AbstractMarkwonPlugin() { | ||||
|                     @Override | ||||
| @@ -185,12 +200,29 @@ public class ReleasesAdapter extends RecyclerView.Adapter<ReleasesAdapter.Releas | ||||
|         Spanned bodyWithMD = markwon.toMarkdown(EmojiParser.parseToUnicode(currentItem.getBody())); | ||||
|  | ||||
|         if(!currentItem.getBody().equals("")) { | ||||
|             markwon.setParsedMarkdown(holder.releaseDescription, bodyWithMD); | ||||
|             markwon.setParsedMarkdown(holder.releaseBodyContent, bodyWithMD); | ||||
|         } | ||||
|         else { | ||||
|             holder.releaseDescription.setVisibility(View.GONE); | ||||
|             holder.releaseBodyContent.setVisibility(View.GONE); | ||||
|         } | ||||
|  | ||||
| 	    holder.downloadFrame.setOnClickListener(v -> { | ||||
|  | ||||
| 		    if(holder.downloads.getVisibility() == View.GONE) { | ||||
|  | ||||
| 			    holder.downloadDropdownIcon.setImageResource(R.drawable.ic_arrow_down); | ||||
| 			    holder.downloads.setVisibility(View.VISIBLE); | ||||
|  | ||||
| 		    } | ||||
| 		    else { | ||||
|  | ||||
| 			    holder.downloadDropdownIcon.setImageResource(R.drawable.ic_arrow_right); | ||||
| 			    holder.downloads.setVisibility(View.GONE); | ||||
|  | ||||
| 		    } | ||||
|  | ||||
| 	    }); | ||||
|  | ||||
|         holder.releaseZipDownload.setText( | ||||
|                 Html.fromHtml("<a href='" + currentItem.getZipball_url() + "'>" + mCtx.getResources().getString(R.string.zipArchiveDownloadReleasesTab) + "</a> ")); | ||||
|         holder.releaseZipDownload.setMovementMethod(LinkMovementMethod.getInstance()); | ||||
| @@ -199,6 +231,9 @@ public class ReleasesAdapter extends RecyclerView.Adapter<ReleasesAdapter.Releas | ||||
|                 Html.fromHtml("<a href='" + currentItem.getTarball_url() + "'>" + mCtx.getResources().getString(R.string.tarArchiveDownloadReleasesTab) + "</a> ")); | ||||
|         holder.releaseTarDownload.setMovementMethod(LinkMovementMethod.getInstance()); | ||||
|  | ||||
| 	    ReleasesDownloadsAdapter adapter = new ReleasesDownloadsAdapter(currentItem.getAssets()); | ||||
| 	    holder.downloadList.setAdapter(adapter); | ||||
|  | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|   | ||||
| @@ -0,0 +1,68 @@ | ||||
| package org.mian.gitnex.adapters; | ||||
|  | ||||
| import android.text.Html; | ||||
| import android.text.method.LinkMovementMethod; | ||||
| import android.view.LayoutInflater; | ||||
| import android.view.View; | ||||
| import android.view.ViewGroup; | ||||
| import android.widget.TextView; | ||||
| import androidx.annotation.NonNull; | ||||
| import androidx.recyclerview.widget.RecyclerView; | ||||
| import org.mian.gitnex.R; | ||||
| import org.mian.gitnex.models.Releases; | ||||
| import java.util.List; | ||||
|  | ||||
| /** | ||||
|  * Author M M Arif | ||||
|  **/ | ||||
|  | ||||
| public class ReleasesDownloadsAdapter extends RecyclerView.Adapter<ReleasesDownloadsAdapter.ReleasesDownloadsViewHolder> { | ||||
|  | ||||
| 	private List<Releases.assetsObject> releasesDownloadsList; | ||||
|  | ||||
| 	static class ReleasesDownloadsViewHolder extends RecyclerView.ViewHolder { | ||||
|  | ||||
| 		private TextView downloadName; | ||||
|  | ||||
| 		private ReleasesDownloadsViewHolder(View itemView) { | ||||
|  | ||||
| 			super(itemView); | ||||
|  | ||||
| 			downloadName = itemView.findViewById(R.id.downloadName); | ||||
|  | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	ReleasesDownloadsAdapter(List<Releases.assetsObject> releasesDownloadsMain) { | ||||
|  | ||||
| 		this.releasesDownloadsList = releasesDownloadsMain; | ||||
| 	} | ||||
|  | ||||
| 	@NonNull | ||||
| 	@Override | ||||
| 	public ReleasesDownloadsAdapter.ReleasesDownloadsViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { | ||||
| 		View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_releases_downloads, parent, false); | ||||
| 		return new ReleasesDownloadsAdapter.ReleasesDownloadsViewHolder(v); | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public void onBindViewHolder(@NonNull ReleasesDownloadsAdapter.ReleasesDownloadsViewHolder holder, int position) { | ||||
|  | ||||
| 		Releases.assetsObject currentItem = releasesDownloadsList.get(position); | ||||
|  | ||||
| 		if(currentItem.getName() != null) { | ||||
|  | ||||
| 			holder.downloadName.setText( | ||||
| 				Html.fromHtml("<a href='" + currentItem.getBrowser_download_url() + "'>" + currentItem.getName() + "</a> ")); | ||||
| 			holder.downloadName.setMovementMethod(LinkMovementMethod.getInstance()); | ||||
|  | ||||
| 		} | ||||
|  | ||||
| 	} | ||||
|  | ||||
| 	@Override | ||||
| 	public int getItemCount() { | ||||
| 		return releasesDownloadsList.size(); | ||||
| 	} | ||||
|  | ||||
| } | ||||
		Reference in New Issue
	
	Block a user