Improving milestones. (#525)
Removing unused strings. Adding a little bit more space between title and progress bar. Swapping icons. Merge remote-tracking branch 'remotes/main/master' into improve-milestones # Conflicts: # app/src/main/res/layout/list_milestones.xml Minor improvements. Merge branch 'improve-layouts' of https://gitea.com/opyale/GitNex into improve-milestones Merge branch 'improve-layouts' of https://gitea.com/gitnex/GitNex into improve-milestones Moving items. Merge branch 'master' into improve-layouts Merge branch 'master' into improve-layouts Translation and additional formatting. Enhancing editorconfig Formatting and removing unused imports. Removing milestone state. Improving milestones. branches and milestones layout update. Fix milestone infinite pagination loop for lower versions layout updates for issues, pr. Fix pr nullable objects for lower versions improve files layout improve org info and list orgs improve teams list layout by org Fix repo layouts Co-authored-by: M M Arif <mmarif@swatian.com> Reviewed-on: https://gitea.com/gitnex/GitNex/pulls/525 Reviewed-by: M M Arif <mmarif@swatian.com>
This commit is contained in:
parent
4f0091f151
commit
546346ff48
@ -4,6 +4,7 @@ end_of_line = lf
|
|||||||
indent_size = 4
|
indent_size = 4
|
||||||
indent_style = space
|
indent_style = space
|
||||||
insert_final_newline = true
|
insert_final_newline = true
|
||||||
|
trim_trailing_whitespace = true
|
||||||
max_line_length = 150
|
max_line_length = 150
|
||||||
|
|
||||||
[*.java]
|
[*.java]
|
||||||
|
@ -2,7 +2,6 @@ package org.mian.gitnex.adapters;
|
|||||||
|
|
||||||
import android.annotation.SuppressLint;
|
import android.annotation.SuppressLint;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.graphics.Color;
|
|
||||||
import android.graphics.drawable.Drawable;
|
import android.graphics.drawable.Drawable;
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
import android.text.Spanned;
|
import android.text.Spanned;
|
||||||
@ -15,7 +14,6 @@ import android.widget.ProgressBar;
|
|||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import androidx.recyclerview.widget.RecyclerView;
|
import androidx.recyclerview.widget.RecyclerView;
|
||||||
import com.amulyakhare.textdrawable.TextDrawable;
|
|
||||||
import com.google.android.material.bottomsheet.BottomSheetDialog;
|
import com.google.android.material.bottomsheet.BottomSheetDialog;
|
||||||
import com.vdurmont.emoji.EmojiParser;
|
import com.vdurmont.emoji.EmojiParser;
|
||||||
import org.mian.gitnex.R;
|
import org.mian.gitnex.R;
|
||||||
@ -56,369 +54,346 @@ import io.noties.markwon.linkify.LinkifyPlugin;
|
|||||||
|
|
||||||
public class MilestonesAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
|
public class MilestonesAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
|
||||||
|
|
||||||
private Context context;
|
private Context context;
|
||||||
private final int TYPE_LOAD = 0;
|
private final int TYPE_LOAD = 0;
|
||||||
private List<Milestones> dataList;
|
private List<Milestones> dataList;
|
||||||
private OnLoadMoreListener loadMoreListener;
|
private OnLoadMoreListener loadMoreListener;
|
||||||
private boolean isLoading = false;
|
private boolean isLoading = false;
|
||||||
private boolean isMoreDataAvailable = true;
|
private boolean isMoreDataAvailable = true;
|
||||||
private String TAG = StaticGlobalVariables.tagMilestonesAdapter;
|
private String TAG = StaticGlobalVariables.tagMilestonesAdapter;
|
||||||
|
|
||||||
public MilestonesAdapter(Context context, List<Milestones> dataListMain) {
|
public MilestonesAdapter(Context context, List<Milestones> dataListMain) {
|
||||||
|
|
||||||
this.context = context;
|
this.context = context;
|
||||||
this.dataList = dataListMain;
|
this.dataList = dataListMain;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@NonNull
|
@NonNull
|
||||||
@Override
|
@Override
|
||||||
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
|
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
|
||||||
|
|
||||||
LayoutInflater inflater = LayoutInflater.from(context);
|
LayoutInflater inflater = LayoutInflater.from(context);
|
||||||
|
|
||||||
if(viewType == TYPE_LOAD) {
|
if(viewType == TYPE_LOAD) {
|
||||||
return new MilestonesAdapter.DataHolder(inflater.inflate(R.layout.list_milestones, parent, false));
|
return new MilestonesAdapter.DataHolder(inflater.inflate(R.layout.list_milestones, parent, false));
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
return new MilestonesAdapter.LoadHolder(inflater.inflate(R.layout.row_load, parent, false));
|
return new MilestonesAdapter.LoadHolder(inflater.inflate(R.layout.row_load, parent, false));
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
|
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
|
||||||
|
|
||||||
if(position >= getItemCount() - 1 && isMoreDataAvailable && !isLoading && loadMoreListener != null) {
|
if(position >= getItemCount() - 1 && isMoreDataAvailable && !isLoading && loadMoreListener != null) {
|
||||||
|
|
||||||
isLoading = true;
|
isLoading = true;
|
||||||
loadMoreListener.onLoadMore();
|
loadMoreListener.onLoadMore();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if(getItemViewType(position) == TYPE_LOAD) {
|
if(getItemViewType(position) == TYPE_LOAD) {
|
||||||
|
|
||||||
((MilestonesAdapter.DataHolder) holder).bindData(dataList.get(position));
|
((MilestonesAdapter.DataHolder) holder).bindData(dataList.get(position));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
class DataHolder extends RecyclerView.ViewHolder {
|
class DataHolder extends RecyclerView.ViewHolder {
|
||||||
|
|
||||||
private TextView milestoneId;
|
private TextView milestoneId;
|
||||||
private TextView msTitle;
|
private TextView msTitle;
|
||||||
private TextView msDescription;
|
private TextView msDescription;
|
||||||
private TextView msOpenIssues;
|
private TextView msOpenIssues;
|
||||||
private TextView msClosedIssues;
|
private TextView msClosedIssues;
|
||||||
private TextView msDueDate;
|
private TextView msDueDate;
|
||||||
private ImageView msStatus;
|
private ProgressBar msProgress;
|
||||||
private ProgressBar msProgress;
|
private TextView milestoneStatus;
|
||||||
private TextView milestoneStatus;
|
|
||||||
|
|
||||||
DataHolder(View itemView) {
|
DataHolder(View itemView) {
|
||||||
|
|
||||||
super(itemView);
|
super(itemView);
|
||||||
|
|
||||||
milestoneId = itemView.findViewById(R.id.milestoneId);
|
milestoneId = itemView.findViewById(R.id.milestoneId);
|
||||||
msTitle = itemView.findViewById(R.id.milestoneTitle);
|
msTitle = itemView.findViewById(R.id.milestoneTitle);
|
||||||
msStatus = itemView.findViewById(R.id.milestoneState);
|
msDescription = itemView.findViewById(R.id.milestoneDescription);
|
||||||
msDescription = itemView.findViewById(R.id.milestoneDescription);
|
msOpenIssues = itemView.findViewById(R.id.milestoneIssuesOpen);
|
||||||
msOpenIssues = itemView.findViewById(R.id.milestoneIssuesOpen);
|
msClosedIssues = itemView.findViewById(R.id.milestoneIssuesClosed);
|
||||||
msClosedIssues = itemView.findViewById(R.id.milestoneIssuesClosed);
|
msDueDate = itemView.findViewById(R.id.milestoneDueDate);
|
||||||
msDueDate = itemView.findViewById(R.id.milestoneDueDate);
|
msProgress = itemView.findViewById(R.id.milestoneProgress);
|
||||||
msProgress = itemView.findViewById(R.id.milestoneProgress);
|
ImageView milestonesMenu = itemView.findViewById(R.id.milestonesMenu);
|
||||||
ImageView milestonesMenu = itemView.findViewById(R.id.milestonesMenu);
|
milestoneStatus = itemView.findViewById(R.id.milestoneStatus);
|
||||||
milestoneStatus = itemView.findViewById(R.id.milestoneStatus);
|
|
||||||
|
|
||||||
milestonesMenu.setOnClickListener(v -> {
|
milestonesMenu.setOnClickListener(v -> {
|
||||||
|
|
||||||
Context ctx = v.getContext();
|
Context ctx = v.getContext();
|
||||||
int milestoneId_ = Integer.parseInt(milestoneId.getText().toString());
|
int milestoneId_ = Integer.parseInt(milestoneId.getText().toString());
|
||||||
|
|
||||||
@SuppressLint("InflateParams") View view = LayoutInflater.from(ctx).inflate(R.layout.bottom_sheet_milestones_in_list, null);
|
@SuppressLint("InflateParams") View view = LayoutInflater.from(ctx).inflate(R.layout.bottom_sheet_milestones_in_list, null);
|
||||||
|
|
||||||
TextView closeMilestone = view.findViewById(R.id.closeMilestone);
|
TextView closeMilestone = view.findViewById(R.id.closeMilestone);
|
||||||
TextView openMilestone = view.findViewById(R.id.openMilestone);
|
TextView openMilestone = view.findViewById(R.id.openMilestone);
|
||||||
|
|
||||||
BottomSheetDialog dialog = new BottomSheetDialog(ctx);
|
BottomSheetDialog dialog = new BottomSheetDialog(ctx);
|
||||||
dialog.setContentView(view);
|
dialog.setContentView(view);
|
||||||
dialog.show();
|
dialog.show();
|
||||||
|
|
||||||
if(milestoneStatus.getText().toString().equals("open")) {
|
if(milestoneStatus.getText().toString().equals("open")) {
|
||||||
|
|
||||||
closeMilestone.setVisibility(View.VISIBLE);
|
closeMilestone.setVisibility(View.VISIBLE);
|
||||||
openMilestone.setVisibility(View.GONE);
|
openMilestone.setVisibility(View.GONE);
|
||||||
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
|
||||||
closeMilestone.setVisibility(View.GONE);
|
closeMilestone.setVisibility(View.GONE);
|
||||||
openMilestone.setVisibility(View.VISIBLE);
|
openMilestone.setVisibility(View.VISIBLE);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
closeMilestone.setOnClickListener(v12 -> {
|
closeMilestone.setOnClickListener(v12 -> {
|
||||||
|
|
||||||
MilestoneActions.closeMilestone(ctx, milestoneId_);
|
MilestoneActions.closeMilestone(ctx, milestoneId_);
|
||||||
dialog.dismiss();
|
dialog.dismiss();
|
||||||
updateAdapter(getAdapterPosition());
|
updateAdapter(getAdapterPosition());
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
openMilestone.setOnClickListener(v12 -> {
|
openMilestone.setOnClickListener(v12 -> {
|
||||||
|
|
||||||
MilestoneActions.openMilestone(ctx, milestoneId_);
|
MilestoneActions.openMilestone(ctx, milestoneId_);
|
||||||
dialog.dismiss();
|
dialog.dismiss();
|
||||||
updateAdapter(getAdapterPosition());
|
updateAdapter(getAdapterPosition());
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressLint("SetTextI18n")
|
|
||||||
void bindData(Milestones dataModel) {
|
|
||||||
|
|
||||||
final TinyDB tinyDb = new TinyDB(context);
|
|
||||||
final String locale = tinyDb.getString("locale");
|
|
||||||
final String timeFormat = tinyDb.getString("dateFormat");
|
|
||||||
|
|
||||||
milestoneId.setText(String.valueOf(dataModel.getId()));
|
@SuppressLint("SetTextI18n")
|
||||||
milestoneStatus.setText(dataModel.getState());
|
void bindData(Milestones dataModel) {
|
||||||
|
|
||||||
final Markwon markwon = Markwon.builder(Objects.requireNonNull(context))
|
final TinyDB tinyDb = new TinyDB(context);
|
||||||
.usePlugin(CorePlugin.create())
|
final String locale = tinyDb.getString("locale");
|
||||||
.usePlugin(ImagesPlugin.create(plugin -> {
|
final String timeFormat = tinyDb.getString("dateFormat");
|
||||||
plugin.addSchemeHandler(new SchemeHandler() {
|
|
||||||
@NonNull
|
|
||||||
@Override
|
|
||||||
public ImageItem handle(@NonNull String raw, @NonNull Uri uri) {
|
|
||||||
|
|
||||||
final int resourceId = context.getResources().getIdentifier(
|
|
||||||
raw.substring("drawable://".length()),
|
|
||||||
"drawable",
|
|
||||||
context.getPackageName());
|
|
||||||
|
|
||||||
final Drawable drawable = context.getDrawable(resourceId);
|
|
||||||
|
|
||||||
assert drawable != null;
|
|
||||||
return ImageItem.withResult(drawable);
|
|
||||||
}
|
|
||||||
|
|
||||||
@NonNull
|
|
||||||
@Override
|
|
||||||
public Collection<String> supportedSchemes() {
|
|
||||||
return Collections.singleton("drawable");
|
|
||||||
}
|
|
||||||
});
|
|
||||||
plugin.placeholderProvider(drawable -> null);
|
|
||||||
plugin.addMediaDecoder(GifMediaDecoder.create(false));
|
|
||||||
plugin.addMediaDecoder(SvgMediaDecoder.create(context.getResources()));
|
|
||||||
plugin.addMediaDecoder(SvgMediaDecoder.create());
|
|
||||||
plugin.defaultMediaDecoder(DefaultMediaDecoder.create(context.getResources()));
|
|
||||||
plugin.defaultMediaDecoder(DefaultMediaDecoder.create());
|
|
||||||
}))
|
|
||||||
.usePlugin(new AbstractMarkwonPlugin() {
|
|
||||||
@Override
|
|
||||||
public void configureTheme(@NonNull MarkwonTheme.Builder builder) {
|
|
||||||
builder
|
|
||||||
.codeTextColor(tinyDb.getInt("codeBlockColor"))
|
|
||||||
.codeBackgroundColor(tinyDb.getInt("codeBlockBackground"))
|
|
||||||
.linkColor(context.getResources().getColor(R.color.lightBlue));
|
|
||||||
}
|
|
||||||
})
|
|
||||||
.usePlugin(TablePlugin.create(context))
|
|
||||||
.usePlugin(TaskListPlugin.create(context))
|
|
||||||
.usePlugin(HtmlPlugin.create())
|
|
||||||
.usePlugin(StrikethroughPlugin.create())
|
|
||||||
.usePlugin(LinkifyPlugin.create())
|
|
||||||
.build();
|
|
||||||
|
|
||||||
Spanned msTitle_ = markwon.toMarkdown(dataModel.getTitle());
|
|
||||||
markwon.setParsedMarkdown(msTitle, msTitle_);
|
|
||||||
|
|
||||||
if(dataModel.getState().equals("open")) {
|
|
||||||
|
|
||||||
@SuppressLint("ResourceType") int color = Color.parseColor(context.getResources().getString(R.color.releaseStable));
|
|
||||||
TextDrawable drawable = TextDrawable.builder()
|
|
||||||
.beginConfig()
|
|
||||||
//.useFont(Typeface.DEFAULT)
|
|
||||||
.textColor(context.getResources().getColor(R.color.white))
|
|
||||||
.fontSize(30)
|
|
||||||
.toUpperCase()
|
|
||||||
.width(120)
|
|
||||||
.height(60)
|
|
||||||
.endConfig()
|
|
||||||
.buildRoundRect("open", color, 8);
|
|
||||||
|
|
||||||
msStatus.setImageDrawable(drawable);
|
|
||||||
|
|
||||||
}
|
|
||||||
else if(dataModel.getState().equals("closed")) {
|
|
||||||
|
|
||||||
@SuppressLint("ResourceType") int color = Color.parseColor(context.getResources().getString(R.color.colorRed));
|
|
||||||
TextDrawable drawable = TextDrawable.builder()
|
|
||||||
.beginConfig()
|
|
||||||
//.useFont(Typeface.DEFAULT)
|
|
||||||
.textColor(context.getResources().getColor(R.color.white))
|
|
||||||
.fontSize(30)
|
|
||||||
.toUpperCase()
|
|
||||||
.width(140)
|
|
||||||
.height(60)
|
|
||||||
.endConfig()
|
|
||||||
.buildRoundRect("closed", color, 8);
|
|
||||||
|
|
||||||
msStatus.setImageDrawable(drawable);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!dataModel.getDescription().equals("")) {
|
|
||||||
final CharSequence bodyWithMD = markwon.toMarkdown(EmojiParser.parseToUnicode(dataModel.getDescription()));
|
|
||||||
msDescription.setText(bodyWithMD);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
msDescription.setText("");
|
|
||||||
}
|
|
||||||
|
|
||||||
msOpenIssues.setText(String.valueOf(dataModel.getOpen_issues()));
|
|
||||||
msOpenIssues.setOnClickListener(new ClickListener(context.getResources().getString(R.string.milestoneOpenIssues, dataModel.getOpen_issues()), context));
|
|
||||||
|
|
||||||
msClosedIssues.setText(String.valueOf(dataModel.getClosed_issues()));
|
|
||||||
msClosedIssues.setOnClickListener(new ClickListener(context.getResources().getString(R.string.milestoneClosedIssues, dataModel.getClosed_issues()), context));
|
|
||||||
|
|
||||||
if ((dataModel.getOpen_issues() + dataModel.getClosed_issues()) > 0) {
|
|
||||||
|
|
||||||
if (dataModel.getOpen_issues() == 0) {
|
|
||||||
msProgress.setProgress(100);
|
|
||||||
msProgress.setOnClickListener(new ClickListener(context.getResources().getString(R.string.milestoneCompletion, 100), context));
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
int msCompletion = 100 * dataModel.getClosed_issues() / (dataModel.getOpen_issues() + dataModel.getClosed_issues());
|
|
||||||
msProgress.setOnClickListener(new ClickListener(context.getResources().getString(R.string.milestoneCompletion, msCompletion), context));
|
|
||||||
msProgress.setProgress(msCompletion);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
msProgress.setProgress(0);
|
|
||||||
msProgress.setOnClickListener(new ClickListener(context.getResources().getString(R.string.milestoneCompletion, 0), context));
|
|
||||||
}
|
|
||||||
|
|
||||||
if(dataModel.getDue_on() != null) {
|
|
||||||
|
|
||||||
if (timeFormat.equals("normal") || timeFormat.equals("pretty")) {
|
|
||||||
|
|
||||||
DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd", new Locale(locale));
|
|
||||||
Date date = null;
|
|
||||||
try {
|
|
||||||
date = formatter.parse(dataModel.getDue_on());
|
|
||||||
}
|
|
||||||
catch (ParseException e) {
|
|
||||||
Log.e(TAG, e.toString());
|
|
||||||
}
|
|
||||||
assert date != null;
|
|
||||||
String dueDate = formatter.format(date);
|
|
||||||
|
|
||||||
if(date.before(new Date())) {
|
milestoneId.setText(String.valueOf(dataModel.getId()));
|
||||||
msDueDate.setTextColor(context.getResources().getColor(R.color.darkRed));
|
milestoneStatus.setText(dataModel.getState());
|
||||||
}
|
|
||||||
|
|
||||||
msDueDate.setText(dueDate);
|
Markwon markwon = Markwon.builder(Objects.requireNonNull(context)).usePlugin(CorePlugin.create()).usePlugin(ImagesPlugin.create(plugin -> {
|
||||||
msDueDate.setOnClickListener(new ClickListener(TimeHelper.customDateFormatForToast(dataModel.getDue_on()), context));
|
plugin.addSchemeHandler(new SchemeHandler() {
|
||||||
|
|
||||||
}
|
@NonNull
|
||||||
else if (timeFormat.equals("normal1")) {
|
@Override
|
||||||
|
public ImageItem handle(@NonNull String raw, @NonNull Uri uri) {
|
||||||
|
|
||||||
SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-yyyy", new Locale(locale));
|
final int resourceId = context.getResources().getIdentifier(
|
||||||
Date date1 = null;
|
raw.substring("drawable://".length()),
|
||||||
try {
|
"drawable",
|
||||||
date1 = formatter.parse(dataModel.getDue_on());
|
context.getPackageName());
|
||||||
}
|
|
||||||
catch (ParseException e) {
|
|
||||||
Log.e(TAG, e.toString());
|
|
||||||
}
|
|
||||||
assert date1 != null;
|
|
||||||
String dueDate = formatter.format(date1);
|
|
||||||
msDueDate.setText(dueDate);
|
|
||||||
|
|
||||||
}
|
final Drawable drawable = context.getDrawable(resourceId);
|
||||||
|
|
||||||
}
|
assert drawable != null;
|
||||||
else {
|
return ImageItem.withResult(drawable);
|
||||||
msDueDate.setText("");
|
}
|
||||||
}
|
|
||||||
|
|
||||||
}
|
@NonNull
|
||||||
|
@Override
|
||||||
|
public Collection<String> supportedSchemes() {
|
||||||
|
return Collections.singleton("drawable");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
}
|
plugin.placeholderProvider(drawable -> null);
|
||||||
|
plugin.addMediaDecoder(GifMediaDecoder.create(false));
|
||||||
|
plugin.addMediaDecoder(SvgMediaDecoder.create(context.getResources()));
|
||||||
|
plugin.addMediaDecoder(SvgMediaDecoder.create());
|
||||||
|
plugin.defaultMediaDecoder(DefaultMediaDecoder.create(context.getResources()));
|
||||||
|
plugin.defaultMediaDecoder(DefaultMediaDecoder.create());
|
||||||
|
|
||||||
private void updateAdapter(int position) {
|
}))
|
||||||
|
|
||||||
dataList.remove(position);
|
.usePlugin(new AbstractMarkwonPlugin() {
|
||||||
notifyItemRemoved(position);
|
@Override
|
||||||
notifyItemRangeChanged(position, dataList.size());
|
public void configureTheme(@NonNull MarkwonTheme.Builder builder) {
|
||||||
|
builder
|
||||||
|
.codeTextColor(tinyDb.getInt("codeBlockColor"))
|
||||||
|
.codeBackgroundColor(tinyDb.getInt("codeBlockBackground"))
|
||||||
|
.linkColor(context.getResources().getColor(R.color.lightBlue));
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.usePlugin(TablePlugin.create(context))
|
||||||
|
.usePlugin(TaskListPlugin.create(context))
|
||||||
|
.usePlugin(HtmlPlugin.create())
|
||||||
|
.usePlugin(StrikethroughPlugin.create())
|
||||||
|
.usePlugin(LinkifyPlugin.create())
|
||||||
|
.build();
|
||||||
|
|
||||||
}
|
Spanned msTitle_ = markwon.toMarkdown(dataModel.getTitle());
|
||||||
|
markwon.setParsedMarkdown(msTitle, msTitle_);
|
||||||
|
|
||||||
@Override
|
if(!dataModel.getDescription().equals("")) {
|
||||||
public int getItemViewType(int position) {
|
|
||||||
|
|
||||||
if(dataList.get(position).getTitle() != null) {
|
CharSequence bodyWithMD = markwon.toMarkdown(EmojiParser.parseToUnicode(dataModel.getDescription()));
|
||||||
return TYPE_LOAD;
|
msDescription.setText(bodyWithMD);
|
||||||
}
|
|
||||||
else {
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
|
|
||||||
@Override
|
msDescription.setText(context.getString(R.string.milestoneNoDescription));
|
||||||
public int getItemCount() {
|
}
|
||||||
|
|
||||||
return dataList.size();
|
msOpenIssues.setText(context.getString(R.string.milestoneIssueStatusOpen, dataModel.getOpen_issues()));
|
||||||
|
msClosedIssues.setText(context.getString(R.string.milestoneIssueStatusClosed, dataModel.getClosed_issues()));
|
||||||
|
|
||||||
}
|
if((dataModel.getOpen_issues() + dataModel.getClosed_issues()) > 0) {
|
||||||
|
|
||||||
static class LoadHolder extends RecyclerView.ViewHolder {
|
if(dataModel.getOpen_issues() == 0) {
|
||||||
|
|
||||||
LoadHolder(View itemView) {
|
msProgress.setProgress(100);
|
||||||
|
msProgress.setOnClickListener(new ClickListener(context.getResources().getString(R.string.milestoneCompletion, 100), context));
|
||||||
|
|
||||||
super(itemView);
|
}
|
||||||
}
|
else {
|
||||||
|
|
||||||
}
|
int msCompletion = 100 * dataModel.getClosed_issues() / (dataModel.getOpen_issues() + dataModel.getClosed_issues());
|
||||||
|
msProgress.setOnClickListener(new ClickListener(context.getResources().getString(R.string.milestoneCompletion, msCompletion), context));
|
||||||
|
msProgress.setProgress(msCompletion);
|
||||||
|
|
||||||
public void setMoreDataAvailable(boolean moreDataAvailable) {
|
}
|
||||||
|
|
||||||
isMoreDataAvailable = moreDataAvailable;
|
}
|
||||||
|
else {
|
||||||
|
|
||||||
}
|
msProgress.setProgress(0);
|
||||||
|
msProgress.setOnClickListener(new ClickListener(context.getResources().getString(R.string.milestoneCompletion, 0), context));
|
||||||
|
|
||||||
public void notifyDataChanged() {
|
}
|
||||||
|
|
||||||
notifyDataSetChanged();
|
if(dataModel.getDue_on() != null) {
|
||||||
isLoading = false;
|
|
||||||
|
|
||||||
}
|
if(timeFormat.equals("normal") || timeFormat.equals("pretty")) {
|
||||||
|
|
||||||
public interface OnLoadMoreListener {
|
DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd", new Locale(locale));
|
||||||
|
Date date = null;
|
||||||
|
|
||||||
void onLoadMore();
|
try {
|
||||||
|
date = formatter.parse(dataModel.getDue_on());
|
||||||
|
}
|
||||||
|
catch(ParseException e) {
|
||||||
|
Log.e(TAG, e.toString());
|
||||||
|
}
|
||||||
|
|
||||||
}
|
assert date != null;
|
||||||
|
String dueDate = formatter.format(date);
|
||||||
|
|
||||||
public void setLoadMoreListener(OnLoadMoreListener loadMoreListener) {
|
if(date.before(new Date())) {
|
||||||
|
msDueDate.setTextColor(context.getResources().getColor(R.color.darkRed));
|
||||||
|
}
|
||||||
|
|
||||||
this.loadMoreListener = loadMoreListener;
|
msDueDate.setText(dueDate);
|
||||||
|
msDueDate.setOnClickListener(new ClickListener(TimeHelper.customDateFormatForToast(dataModel.getDue_on()), context));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
else if(timeFormat.equals("normal1")) {
|
||||||
|
|
||||||
public void updateList(List<Milestones> list) {
|
SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-yyyy", new Locale(locale));
|
||||||
|
|
||||||
dataList = list;
|
Date date1 = null;
|
||||||
notifyDataSetChanged();
|
|
||||||
}
|
try {
|
||||||
|
date1 = formatter.parse(dataModel.getDue_on());
|
||||||
|
}
|
||||||
|
catch(ParseException e) {
|
||||||
|
Log.e(TAG, e.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
assert date1 != null;
|
||||||
|
String dueDate = formatter.format(date1);
|
||||||
|
msDueDate.setText(dueDate);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
|
||||||
|
msDueDate.setText(context.getString(R.string.milestoneNoDueDate));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private void updateAdapter(int position) {
|
||||||
|
|
||||||
|
dataList.remove(position);
|
||||||
|
notifyItemRemoved(position);
|
||||||
|
notifyItemRangeChanged(position, dataList.size());
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getItemViewType(int position) {
|
||||||
|
|
||||||
|
if(dataList.get(position).getTitle() != null) {
|
||||||
|
return TYPE_LOAD;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getItemCount() {
|
||||||
|
|
||||||
|
return dataList.size();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
static class LoadHolder extends RecyclerView.ViewHolder {
|
||||||
|
|
||||||
|
LoadHolder(View itemView) {
|
||||||
|
|
||||||
|
super(itemView);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setMoreDataAvailable(boolean moreDataAvailable) {
|
||||||
|
|
||||||
|
isMoreDataAvailable = moreDataAvailable;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void notifyDataChanged() {
|
||||||
|
|
||||||
|
notifyDataSetChanged();
|
||||||
|
isLoading = false;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public interface OnLoadMoreListener {
|
||||||
|
|
||||||
|
void onLoadMore();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setLoadMoreListener(OnLoadMoreListener loadMoreListener) {
|
||||||
|
|
||||||
|
this.loadMoreListener = loadMoreListener;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void updateList(List<Milestones> list) {
|
||||||
|
|
||||||
|
dataList = list;
|
||||||
|
notifyDataSetChanged();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -9,8 +9,8 @@
|
|||||||
android:right="1dp"
|
android:right="1dp"
|
||||||
android:left="1dp">
|
android:left="1dp">
|
||||||
<shape>
|
<shape>
|
||||||
<corners android:radius="15dp"/>
|
<corners android:radius="10dp"/>
|
||||||
<solid android:color="@color/divider"/>
|
<solid android:color="?attr/inputBackgroundColor"/>
|
||||||
</shape>
|
</shape>
|
||||||
</item>
|
</item>
|
||||||
|
|
||||||
@ -23,9 +23,9 @@
|
|||||||
|
|
||||||
<scale android:scaleWidth="100%">
|
<scale android:scaleWidth="100%">
|
||||||
<shape>
|
<shape>
|
||||||
<corners android:radius="15dp" />
|
<corners android:radius="10dp" />
|
||||||
</shape>
|
</shape>
|
||||||
</scale>
|
</scale>
|
||||||
</item>
|
</item>
|
||||||
|
|
||||||
</layer-list>
|
</layer-list>
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<RelativeLayout
|
<RelativeLayout
|
||||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
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_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:id="@+id/milestoneFrame"
|
android:id="@+id/milestoneFrame"
|
||||||
@ -14,10 +16,11 @@
|
|||||||
android:id="@+id/milestoneId" />
|
android:id="@+id/milestoneId" />
|
||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
|
android:id="@+id/milestoneStatus"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:visibility="gone"
|
android:visibility="gone"
|
||||||
android:id="@+id/milestoneStatus" />
|
tools:visibility="visible" />
|
||||||
|
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
android:id="@+id/mainFrame"
|
android:id="@+id/mainFrame"
|
||||||
@ -31,115 +34,145 @@
|
|||||||
android:id="@+id/frameTitle"
|
android:id="@+id/frameTitle"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
|
android:gravity="center_vertical"
|
||||||
android:orientation="horizontal">
|
android:orientation="horizontal">
|
||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
android:id="@+id/milestoneTitle"
|
android:id="@+id/milestoneTitle"
|
||||||
android:layout_width="0dp"
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_weight="0"
|
||||||
|
android:textColor="?attr/primaryTextColor"
|
||||||
android:textIsSelectable="true"
|
android:textIsSelectable="true"
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_weight=".80"
|
|
||||||
android:layout_marginBottom="5dp"
|
|
||||||
android:textColor="?attr/primaryTextColor"
|
|
||||||
android:textSize="18sp" />
|
android:textSize="18sp" />
|
||||||
|
|
||||||
<ImageView
|
|
||||||
android:id="@+id/milestoneState"
|
|
||||||
android:layout_width="0dp"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_weight=".15"
|
|
||||||
android:layout_gravity="end"
|
|
||||||
android:gravity="end"
|
|
||||||
android:scaleType="fitEnd"
|
|
||||||
android:contentDescription="@string/pageTitleCreateMilestone"
|
|
||||||
android:layout_marginBottom="5dp" />
|
|
||||||
|
|
||||||
</LinearLayout>
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/milestoneDescription"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:text="@string/repoDescription"
|
|
||||||
android:textIsSelectable="true"
|
|
||||||
android:textColor="?attr/primaryTextColor"
|
|
||||||
android:textSize="14sp" />
|
|
||||||
|
|
||||||
<LinearLayout
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_marginTop="10dp"
|
|
||||||
android:layout_marginBottom="5dp"
|
|
||||||
android:orientation="horizontal">
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/milestoneIssuesClosed"
|
|
||||||
android:layout_width="0dp"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_weight="8"
|
|
||||||
android:text="@string/repoWatchers"
|
|
||||||
android:gravity="start"
|
|
||||||
android:textColor="?attr/primaryTextColor"
|
|
||||||
android:textSize="14sp" />
|
|
||||||
|
|
||||||
<ProgressBar
|
<ProgressBar
|
||||||
android:id="@+id/milestoneProgress"
|
android:id="@+id/milestoneProgress"
|
||||||
style="@style/Widget.AppCompat.ProgressBar.Horizontal"
|
style="@style/Widget.AppCompat.ProgressBar.Horizontal"
|
||||||
android:layout_width="0dp"
|
android:layout_width="0dp"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="10dp"
|
||||||
android:layout_weight="80"
|
android:layout_marginLeft="15dp"
|
||||||
|
android:layout_marginRight="10dp"
|
||||||
|
android:layout_weight="1"
|
||||||
|
android:indeterminate="false"
|
||||||
android:progress="50"
|
android:progress="50"
|
||||||
android:layout_marginTop="2dp"
|
|
||||||
android:progressDrawable="@drawable/progress_bar"
|
android:progressDrawable="@drawable/progress_bar"
|
||||||
android:progressTint="@color/colorLightGreen" />
|
android:progressTint="@color/btnBackground" />
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/milestoneIssuesOpen"
|
|
||||||
android:layout_width="0dp"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_weight="8"
|
|
||||||
android:text="@string/repoStars"
|
|
||||||
android:gravity="end"
|
|
||||||
android:textColor="?attr/primaryTextColor"
|
|
||||||
android:textSize="14sp" />
|
|
||||||
|
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:id="@+id/milestoneDateMenuFrame"
|
android:layout_marginTop="10dp"
|
||||||
android:layout_marginTop="8dp"
|
|
||||||
android:orientation="horizontal">
|
android:orientation="horizontal">
|
||||||
|
|
||||||
<RelativeLayout
|
<LinearLayout
|
||||||
android:layout_width="0dp"
|
android:layout_width="wrap_content"
|
||||||
android:layout_weight=".90"
|
android:layout_height="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_marginRight="15dp"
|
||||||
android:id="@+id/dueDateFrame"
|
android:gravity="center_vertical"
|
||||||
android:orientation="horizontal"
|
android:orientation="horizontal">
|
||||||
android:layout_marginTop="3dp">
|
|
||||||
|
<ImageView
|
||||||
|
android:layout_width="15dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginRight="5dp"
|
||||||
|
android:contentDescription="@string/generalImgContentText"
|
||||||
|
app:srcCompat="@drawable/ic_calendar" />
|
||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
android:id="@+id/milestoneDueDate"
|
android:id="@+id/milestoneDueDate"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:text="@string/dueDate"
|
android:text="@string/dueDate"
|
||||||
android:gravity="start"
|
|
||||||
android:textColor="?attr/primaryTextColor"
|
android:textColor="?attr/primaryTextColor"
|
||||||
android:textSize="12sp" />
|
android:textSize="14sp" />
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:layout_marginRight="15dp"
|
||||||
|
android:gravity="center_vertical"
|
||||||
|
android:orientation="horizontal">
|
||||||
|
|
||||||
|
<ImageView
|
||||||
|
android:layout_width="15dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginRight="5dp"
|
||||||
|
android:contentDescription="@string/generalImgContentText"
|
||||||
|
app:srcCompat="@drawable/ic_issue_open" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/milestoneIssuesOpen"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="@string/repoStars"
|
||||||
|
android:textColor="?attr/primaryTextColor"
|
||||||
|
android:textSize="14sp" />
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:gravity="center_vertical"
|
||||||
|
android:orientation="horizontal">
|
||||||
|
|
||||||
|
<ImageView
|
||||||
|
android:layout_width="15dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginRight="5dp"
|
||||||
|
android:contentDescription="@string/generalImgContentText"
|
||||||
|
app:srcCompat="@drawable/ic_issue_closed" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/milestoneIssuesClosed"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="@string/repoWatchers"
|
||||||
|
android:textColor="?attr/primaryTextColor"
|
||||||
|
android:textSize="14sp" />
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:id="@+id/milestoneDateMenuFrame"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginTop="5dp"
|
||||||
|
android:orientation="horizontal">
|
||||||
|
|
||||||
|
<RelativeLayout
|
||||||
|
android:id="@+id/dueDateFrame"
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginTop="3dp"
|
||||||
|
android:layout_weight=".90"
|
||||||
|
android:orientation="horizontal">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/milestoneDescription"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="@string/repoDescription"
|
||||||
|
android:textColor="?attr/primaryTextColor"
|
||||||
|
android:textIsSelectable="true"
|
||||||
|
android:textSize="14sp"
|
||||||
|
android:visibility="visible" />
|
||||||
|
|
||||||
</RelativeLayout>
|
</RelativeLayout>
|
||||||
|
|
||||||
<ImageView
|
<ImageView
|
||||||
android:id="@+id/milestonesMenu"
|
android:id="@+id/milestonesMenu"
|
||||||
android:layout_width="0dp"
|
android:layout_width="0dp"
|
||||||
android:layout_weight=".10"
|
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_gravity="end"
|
android:layout_gravity="end|bottom"
|
||||||
|
android:layout_weight=".10"
|
||||||
|
android:contentDescription="@string/menuContentDesc"
|
||||||
android:scaleType="fitEnd"
|
android:scaleType="fitEnd"
|
||||||
android:src="@drawable/ic_dotted_menu_horizontal"
|
android:src="@drawable/ic_dotted_menu_horizontal" />
|
||||||
android:contentDescription="@string/menuContentDesc" />
|
|
||||||
|
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
|
@ -18,7 +18,7 @@
|
|||||||
<color name="divider">#1d1d1d</color>
|
<color name="divider">#1d1d1d</color>
|
||||||
<color name="releasePre">#eb7121</color>
|
<color name="releasePre">#eb7121</color>
|
||||||
<color name="releaseStable">#219214</color>
|
<color name="releaseStable">#219214</color>
|
||||||
<color name="colorRed">#eb3718</color>
|
<color name="colorRed">#CC361C</color>
|
||||||
<color name="colorLightGreen">#49da39</color>
|
<color name="colorLightGreen">#49da39</color>
|
||||||
<color name="colorDarkGreen">#009486</color>
|
<color name="colorDarkGreen">#009486</color>
|
||||||
<color name="darkRed">#e74c3c</color>
|
<color name="darkRed">#e74c3c</color>
|
||||||
|
@ -232,8 +232,10 @@
|
|||||||
<string name="milestoneCreated">Milestone created successfully</string>
|
<string name="milestoneCreated">Milestone created successfully</string>
|
||||||
<string name="milestoneCreatedError">Something went wrong, please try again</string>
|
<string name="milestoneCreatedError">Something went wrong, please try again</string>
|
||||||
<string name="milestoneDateEmpty">Please choose due date</string>
|
<string name="milestoneDateEmpty">Please choose due date</string>
|
||||||
<string name="milestoneOpenIssues">Open issues : %1$d</string>
|
<string name="milestoneNoDueDate">No due date</string>
|
||||||
<string name="milestoneClosedIssues">Closed issues : %1$d</string>
|
<string name="milestoneNoDescription">No description</string>
|
||||||
|
<string name="milestoneIssueStatusOpen">%1$d Open</string>
|
||||||
|
<string name="milestoneIssueStatusClosed">%1$d Closed</string>
|
||||||
|
|
||||||
<string name="newIssueSelectAssigneesListTitle">Select Assignees</string>
|
<string name="newIssueSelectAssigneesListTitle">Select Assignees</string>
|
||||||
<string name="newIssueSelectLabelsListTitle">Select Labels</string>
|
<string name="newIssueSelectLabelsListTitle">Select Labels</string>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user