diff --git a/app/src/main/java/org/mian/gitnex/adapters/ReleasesAdapter.java b/app/src/main/java/org/mian/gitnex/adapters/ReleasesAdapter.java index f94b3042..ca553f49 100644 --- a/app/src/main/java/org/mian/gitnex/adapters/ReleasesAdapter.java +++ b/app/src/main/java/org/mian/gitnex/adapters/ReleasesAdapter.java @@ -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 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 { + 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 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 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 { + + 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("" + mCtx.getResources().getString(R.string.zipArchiveDownloadReleasesTab) + " ")); holder.releaseZipDownload.setMovementMethod(LinkMovementMethod.getInstance()); @@ -199,6 +231,9 @@ public class ReleasesAdapter extends RecyclerView.Adapter" + mCtx.getResources().getString(R.string.tarArchiveDownloadReleasesTab) + " ")); holder.releaseTarDownload.setMovementMethod(LinkMovementMethod.getInstance()); + ReleasesDownloadsAdapter adapter = new ReleasesDownloadsAdapter(currentItem.getAssets()); + holder.downloadList.setAdapter(adapter); + } @Override diff --git a/app/src/main/java/org/mian/gitnex/adapters/ReleasesDownloadsAdapter.java b/app/src/main/java/org/mian/gitnex/adapters/ReleasesDownloadsAdapter.java new file mode 100644 index 00000000..543a8ca4 --- /dev/null +++ b/app/src/main/java/org/mian/gitnex/adapters/ReleasesDownloadsAdapter.java @@ -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 { + + private List releasesDownloadsList; + + static class ReleasesDownloadsViewHolder extends RecyclerView.ViewHolder { + + private TextView downloadName; + + private ReleasesDownloadsViewHolder(View itemView) { + + super(itemView); + + downloadName = itemView.findViewById(R.id.downloadName); + + } + } + + ReleasesDownloadsAdapter(List 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("" + currentItem.getName() + " ")); + holder.downloadName.setMovementMethod(LinkMovementMethod.getInstance()); + + } + + } + + @Override + public int getItemCount() { + return releasesDownloadsList.size(); + } + +} diff --git a/app/src/main/res/drawable/ic_arrow_right.xml b/app/src/main/res/drawable/ic_arrow_right.xml new file mode 100644 index 00000000..8c6d19f6 --- /dev/null +++ b/app/src/main/res/drawable/ic_arrow_right.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_code.xml b/app/src/main/res/drawable/ic_code.xml new file mode 100644 index 00000000..7d1e5406 --- /dev/null +++ b/app/src/main/res/drawable/ic_code.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/shape_pre_release.xml b/app/src/main/res/drawable/shape_pre_release.xml new file mode 100644 index 00000000..3181a7f7 --- /dev/null +++ b/app/src/main/res/drawable/shape_pre_release.xml @@ -0,0 +1,14 @@ + + + + + + + + + + diff --git a/app/src/main/res/drawable/shape_stable_release.xml b/app/src/main/res/drawable/shape_stable_release.xml new file mode 100644 index 00000000..20da9d5b --- /dev/null +++ b/app/src/main/res/drawable/shape_stable_release.xml @@ -0,0 +1,14 @@ + + + + + + + + + + diff --git a/app/src/main/res/layout/list_releases.xml b/app/src/main/res/layout/list_releases.xml index 11c8ecf0..9aa50f49 100644 --- a/app/src/main/res/layout/list_releases.xml +++ b/app/src/main/res/layout/list_releases.xml @@ -1,100 +1,259 @@ - + android:orientation="vertical" + android:padding="15dp"> + android:layout_height="match_parent" + android:orientation="vertical"> + android:layout_height="wrap_content" + android:layout_marginBottom="10dp" + android:orientation="horizontal"> + android:textSize="18sp" + android:textStyle="bold" + tools:text="3.0.0-rc1" /> - + android:layout_weight="0" + android:background="@drawable/shape_stable_release" + android:paddingLeft="5dp" + android:paddingRight="5dp" + android:textColor="@color/colorWhite" + android:textSize="14sp" /> - + android:layout_height="match_parent" + android:orientation="horizontal"> - + - + - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/list_releases_downloads.xml b/app/src/main/res/layout/list_releases_downloads.xml new file mode 100644 index 00000000..89b5d92a --- /dev/null +++ b/app/src/main/res/layout/list_releases_downloads.xml @@ -0,0 +1,27 @@ + + + + + + + + diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index f3c5c924..d30caa7d 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -17,8 +17,8 @@ #1d1d1d #1d1d1d #1d1d1d - #eb7121 - #219214 + #f2711c + @color/btnBackground #CC361C #49da39 #009486 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index f8efef0b..44823282 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -216,6 +216,7 @@ Stable No releases found Tag: %1$s + Published by @%1$s Collaborator : %1$s No collaborators found @@ -492,8 +493,8 @@ Watcher Commit - Zip Archive - Tar Archive + Source code (ZIP) + Source code (TAR.GZ) File Name