mirror of
https://codeberg.org/gitnex/GitNex.git
synced 2024-12-16 15:48:13 +08:00
merge
This commit is contained in:
parent
61a1a4446f
commit
5f402c2c60
@ -1,546 +0,0 @@
|
|||||||
package org.mian.gitnex.activities;
|
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
|
||||||
import androidx.annotation.Nullable;
|
|
||||||
import androidx.appcompat.app.AppCompatActivity;
|
|
||||||
import androidx.appcompat.widget.Toolbar;
|
|
||||||
import androidx.lifecycle.Observer;
|
|
||||||
import androidx.lifecycle.ViewModelProviders;
|
|
||||||
import androidx.recyclerview.widget.DividerItemDecoration;
|
|
||||||
import androidx.recyclerview.widget.LinearLayoutManager;
|
|
||||||
import androidx.recyclerview.widget.RecyclerView;
|
|
||||||
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
|
|
||||||
import io.noties.markwon.AbstractMarkwonPlugin;
|
|
||||||
import io.noties.markwon.Markwon;
|
|
||||||
import io.noties.markwon.core.CorePlugin;
|
|
||||||
import io.noties.markwon.core.MarkwonTheme;
|
|
||||||
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;
|
|
||||||
import io.noties.markwon.image.SchemeHandler;
|
|
||||||
import io.noties.markwon.image.gif.GifMediaDecoder;
|
|
||||||
import io.noties.markwon.image.svg.SvgMediaDecoder;
|
|
||||||
import io.noties.markwon.linkify.LinkifyPlugin;
|
|
||||||
import retrofit2.Call;
|
|
||||||
import retrofit2.Callback;
|
|
||||||
import retrofit2.Response;
|
|
||||||
import android.content.Context;
|
|
||||||
import android.graphics.Color;
|
|
||||||
import android.graphics.Typeface;
|
|
||||||
import android.graphics.drawable.Drawable;
|
|
||||||
import android.net.Uri;
|
|
||||||
import android.os.Bundle;
|
|
||||||
import android.os.Handler;
|
|
||||||
import android.text.Spanned;
|
|
||||||
import android.util.Log;
|
|
||||||
import android.view.Gravity;
|
|
||||||
import android.view.Menu;
|
|
||||||
import android.view.MenuInflater;
|
|
||||||
import android.view.MenuItem;
|
|
||||||
import android.view.View;
|
|
||||||
import android.widget.HorizontalScrollView;
|
|
||||||
import android.widget.ImageView;
|
|
||||||
import android.widget.LinearLayout;
|
|
||||||
import android.widget.RelativeLayout;
|
|
||||||
import android.widget.ScrollView;
|
|
||||||
import android.widget.TextView;
|
|
||||||
import com.amulyakhare.textdrawable.TextDrawable;
|
|
||||||
import com.squareup.picasso.Picasso;
|
|
||||||
import com.vdurmont.emoji.EmojiParser;
|
|
||||||
import org.mian.gitnex.R;
|
|
||||||
import org.mian.gitnex.adapters.IssueCommentsAdapter;
|
|
||||||
import org.mian.gitnex.clients.RetrofitClient;
|
|
||||||
import org.mian.gitnex.fragments.SingleIssueBottomSheetFragment;
|
|
||||||
import org.mian.gitnex.helpers.AlertDialogs;
|
|
||||||
import org.mian.gitnex.helpers.Authorization;
|
|
||||||
import org.mian.gitnex.helpers.TimeHelper;
|
|
||||||
import org.mian.gitnex.helpers.UserMentions;
|
|
||||||
import org.mian.gitnex.models.IssueComments;
|
|
||||||
import org.mian.gitnex.models.Issues;
|
|
||||||
import org.mian.gitnex.helpers.ColorInverter;
|
|
||||||
import org.mian.gitnex.helpers.RoundedTransformation;
|
|
||||||
import org.mian.gitnex.util.TinyDB;
|
|
||||||
import org.mian.gitnex.helpers.ClickListener;
|
|
||||||
import org.mian.gitnex.viewmodels.IssueCommentsViewModel;
|
|
||||||
import org.ocpsoft.prettytime.PrettyTime;
|
|
||||||
import java.text.DateFormat;
|
|
||||||
import java.text.SimpleDateFormat;
|
|
||||||
import java.util.Collection;
|
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Locale;
|
|
||||||
import java.util.Objects;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Author M M Arif
|
|
||||||
*/
|
|
||||||
|
|
||||||
public class IssueDetailActivity extends AppCompatActivity {
|
|
||||||
|
|
||||||
public ImageView closeActivity;
|
|
||||||
private IssueCommentsAdapter adapter;
|
|
||||||
private RecyclerView mRecyclerView;
|
|
||||||
private ImageView assigneeAvatar;
|
|
||||||
private TextView issueTitle;
|
|
||||||
private TextView issueDescription;
|
|
||||||
private TextView issueMilestone;
|
|
||||||
private TextView issueDueDate;
|
|
||||||
private TextView issueCreatedTime;
|
|
||||||
private HorizontalScrollView labelsScrollView;
|
|
||||||
private HorizontalScrollView assigneesScrollView;
|
|
||||||
private ScrollView scrollViewComments;
|
|
||||||
private TextView issueModified;
|
|
||||||
final Context ctx = this;
|
|
||||||
private LinearLayout labelsLayout;
|
|
||||||
private LinearLayout assigneesLayout;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void onCreate(Bundle savedInstanceState) {
|
|
||||||
|
|
||||||
super.onCreate(savedInstanceState);
|
|
||||||
setContentView(R.layout.activity_issue_detail);
|
|
||||||
|
|
||||||
final TinyDB tinyDb = new TinyDB(getApplicationContext());
|
|
||||||
|
|
||||||
final String instanceUrl = tinyDb.getString("instanceUrl");
|
|
||||||
final String loginUid = tinyDb.getString("loginUid");
|
|
||||||
final String instanceToken = "token " + tinyDb.getString(loginUid + "-token");
|
|
||||||
String repoFullName = tinyDb.getString("repoFullName");
|
|
||||||
String[] parts = repoFullName.split("/");
|
|
||||||
final String repoOwner = parts[0];
|
|
||||||
final String repoName = parts[1];
|
|
||||||
final int issueIndex = Integer.parseInt(tinyDb.getString("issueNumber"));
|
|
||||||
|
|
||||||
final SwipeRefreshLayout swipeRefresh = findViewById(R.id.pullToRefresh);
|
|
||||||
|
|
||||||
assigneeAvatar = findViewById(R.id.assigneeAvatar);
|
|
||||||
issueTitle = findViewById(R.id.issueTitle);
|
|
||||||
issueDescription = findViewById(R.id.issueDescription);
|
|
||||||
issueMilestone = findViewById(R.id.issueMilestone);
|
|
||||||
issueDueDate = findViewById(R.id.issueDueDate);
|
|
||||||
issueCreatedTime = findViewById(R.id.issueCreatedTime);
|
|
||||||
labelsScrollView = findViewById(R.id.labelsScrollView);
|
|
||||||
assigneesScrollView = findViewById(R.id.assigneesScrollView);
|
|
||||||
scrollViewComments = findViewById(R.id.scrollViewComments);
|
|
||||||
issueModified = findViewById(R.id.issueModified);
|
|
||||||
labelsLayout = findViewById(R.id.frameLabels);
|
|
||||||
assigneesLayout = findViewById(R.id.frameAssignees);
|
|
||||||
|
|
||||||
Toolbar toolbar = findViewById(R.id.toolbar);
|
|
||||||
setSupportActionBar(toolbar);
|
|
||||||
Objects.requireNonNull(getSupportActionBar()).setTitle(repoName);
|
|
||||||
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
|
|
||||||
|
|
||||||
mRecyclerView = findViewById(R.id.recyclerView);
|
|
||||||
mRecyclerView.setHasFixedSize(true);
|
|
||||||
mRecyclerView.setNestedScrollingEnabled(false);
|
|
||||||
mRecyclerView.setLayoutManager(new LinearLayoutManager(getApplicationContext()));
|
|
||||||
|
|
||||||
DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(mRecyclerView.getContext(),
|
|
||||||
DividerItemDecoration.VERTICAL);
|
|
||||||
mRecyclerView.addItemDecoration(dividerItemDecoration);
|
|
||||||
|
|
||||||
swipeRefresh.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
|
|
||||||
@Override
|
|
||||||
public void onRefresh() {
|
|
||||||
new Handler().postDelayed(new Runnable() {
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
swipeRefresh.setRefreshing(false);
|
|
||||||
IssueCommentsViewModel.loadIssueComments(instanceUrl, Authorization.returnAuthentication(getApplicationContext(), loginUid, instanceToken), repoOwner, repoName, issueIndex);
|
|
||||||
}
|
|
||||||
}, 500);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
getSingleIssue(instanceUrl, instanceToken, repoOwner, repoName, issueIndex, loginUid);
|
|
||||||
fetchDataAsync(instanceUrl, instanceToken, repoOwner, repoName, issueIndex, loginUid);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean onCreateOptionsMenu(Menu menu) {
|
|
||||||
MenuInflater inflater = getMenuInflater();
|
|
||||||
inflater.inflate(R.menu.generic_nav_dotted_menu, menu);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean onOptionsItemSelected(MenuItem item) {
|
|
||||||
|
|
||||||
int id = item.getItemId();
|
|
||||||
|
|
||||||
switch (id) {
|
|
||||||
case android.R.id.home:
|
|
||||||
finish();
|
|
||||||
return true;
|
|
||||||
case R.id.genericMenu:
|
|
||||||
SingleIssueBottomSheetFragment bottomSheet = new SingleIssueBottomSheetFragment();
|
|
||||||
bottomSheet.show(getSupportFragmentManager(), "singleIssueBottomSheet");
|
|
||||||
return true;
|
|
||||||
default:
|
|
||||||
return super.onOptionsItemSelected(item);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onResume() {
|
|
||||||
super.onResume();
|
|
||||||
final TinyDB tinyDb = new TinyDB(getApplicationContext());
|
|
||||||
final String instanceUrl = tinyDb.getString("instanceUrl");
|
|
||||||
final String loginUid = tinyDb.getString("loginUid");
|
|
||||||
String repoFullName = tinyDb.getString("repoFullName");
|
|
||||||
String[] parts = repoFullName.split("/");
|
|
||||||
final String repoOwner = parts[0];
|
|
||||||
final String repoName = parts[1];
|
|
||||||
final String instanceToken = "token " + tinyDb.getString(loginUid + "-token");
|
|
||||||
final int issueIndex = Integer.parseInt(tinyDb.getString("issueNumber"));
|
|
||||||
|
|
||||||
if(tinyDb.getBoolean("commentPosted")) {
|
|
||||||
scrollViewComments.post(new Runnable() {
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
IssueCommentsViewModel.loadIssueComments(instanceUrl, Authorization.returnAuthentication(getApplicationContext(), loginUid, instanceToken), repoOwner, repoName, issueIndex);
|
|
||||||
|
|
||||||
new Handler().postDelayed(new Runnable() {
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
scrollViewComments.fullScroll(ScrollView.FOCUS_DOWN);
|
|
||||||
}
|
|
||||||
}, 1000);
|
|
||||||
|
|
||||||
tinyDb.putBoolean("commentPosted", false);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
if(tinyDb.getBoolean("commentEdited")) {
|
|
||||||
scrollViewComments.post(new Runnable() {
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
IssueCommentsViewModel.loadIssueComments(instanceUrl, Authorization.returnAuthentication(getApplicationContext(), loginUid, instanceToken), repoOwner, repoName, issueIndex);
|
|
||||||
tinyDb.putBoolean("commentEdited", false);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
if(tinyDb.getBoolean("singleIssueUpdate")) {
|
|
||||||
|
|
||||||
new Handler().postDelayed(new Runnable() {
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
assigneesLayout.removeAllViews();
|
|
||||||
labelsLayout.removeAllViews();
|
|
||||||
getSingleIssue(instanceUrl, instanceToken, repoOwner, repoName, issueIndex, loginUid);
|
|
||||||
tinyDb.putBoolean("singleIssueUpdate", false);
|
|
||||||
}
|
|
||||||
}, 500);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
if(tinyDb.getBoolean("issueEdited")) {
|
|
||||||
|
|
||||||
new Handler().postDelayed(new Runnable() {
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
assigneesLayout.removeAllViews();
|
|
||||||
labelsLayout.removeAllViews();
|
|
||||||
getSingleIssue(instanceUrl, instanceToken, repoOwner, repoName, issueIndex, loginUid);
|
|
||||||
tinyDb.putBoolean("issueEdited", false);
|
|
||||||
}
|
|
||||||
}, 500);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
private void fetchDataAsync(String instanceUrl, String instanceToken, String owner, String repo, int index, String loginUid) {
|
|
||||||
|
|
||||||
IssueCommentsViewModel issueCommentsModel = ViewModelProviders.of(this).get(IssueCommentsViewModel.class);
|
|
||||||
|
|
||||||
issueCommentsModel.getIssueCommentList(instanceUrl, Authorization.returnAuthentication(getApplicationContext(), loginUid, instanceToken), owner, repo, index).observe(this, new Observer<List<IssueComments>>() {
|
|
||||||
@Override
|
|
||||||
public void onChanged(@Nullable List<IssueComments> issueCommentsMain) {
|
|
||||||
adapter = new IssueCommentsAdapter(getApplicationContext(), issueCommentsMain);
|
|
||||||
mRecyclerView.setAdapter(adapter);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
private void getSingleIssue(String instanceUrl, String instanceToken, String repoOwner, String repoName, int issueIndex, String loginUid) {
|
|
||||||
|
|
||||||
final TinyDB tinyDb = new TinyDB(getApplicationContext());
|
|
||||||
Call<Issues> call = RetrofitClient
|
|
||||||
.getInstance(instanceUrl)
|
|
||||||
.getApiInterface()
|
|
||||||
.getIssueByIndex(Authorization.returnAuthentication(getApplicationContext(), loginUid, instanceToken), repoOwner, repoName, issueIndex);
|
|
||||||
|
|
||||||
call.enqueue(new Callback<Issues>() {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onResponse(@NonNull Call<Issues> call, @NonNull Response<Issues> response) {
|
|
||||||
|
|
||||||
if (response.isSuccessful()) {
|
|
||||||
if (response.code() == 200) {
|
|
||||||
|
|
||||||
Issues singleIssue = response.body();
|
|
||||||
assert singleIssue != null;
|
|
||||||
|
|
||||||
final Markwon markwon = Markwon.builder(Objects.requireNonNull(getApplicationContext()))
|
|
||||||
.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) {
|
|
||||||
|
|
||||||
final int resourceId = getApplicationContext().getResources().getIdentifier(
|
|
||||||
raw.substring("drawable://".length()),
|
|
||||||
"drawable",
|
|
||||||
getApplicationContext().getPackageName());
|
|
||||||
|
|
||||||
final Drawable drawable = getApplicationContext().getDrawable(resourceId);
|
|
||||||
|
|
||||||
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(getApplicationContext().getResources()));
|
|
||||||
plugin.addMediaDecoder(SvgMediaDecoder.create());
|
|
||||||
plugin.defaultMediaDecoder(DefaultMediaDecoder.create(getApplicationContext().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(getResources().getColor(R.color.lightBlue));
|
|
||||||
}
|
|
||||||
})
|
|
||||||
.usePlugin(TablePlugin.create(getApplicationContext()))
|
|
||||||
.usePlugin(TaskListPlugin.create(getApplicationContext()))
|
|
||||||
.usePlugin(HtmlPlugin.create())
|
|
||||||
.usePlugin(StrikethroughPlugin.create())
|
|
||||||
.usePlugin(LinkifyPlugin.create())
|
|
||||||
.build();
|
|
||||||
|
|
||||||
TinyDB tinyDb = new TinyDB(getApplicationContext());
|
|
||||||
final String locale = tinyDb.getString("locale");
|
|
||||||
final String timeFormat = tinyDb.getString("dateFormat");
|
|
||||||
tinyDb.putString("issueState", singleIssue.getState());
|
|
||||||
tinyDb.putString("issueTitle", singleIssue.getTitle());
|
|
||||||
|
|
||||||
Picasso.get().load(singleIssue.getUser().getAvatar_url()).transform(new RoundedTransformation(100, 0)).resize(200, 200).centerCrop().into(assigneeAvatar);
|
|
||||||
issueTitle.setText(getString(R.string.issueTitleWithId, singleIssue.getNumber(), singleIssue.getTitle()));
|
|
||||||
String cleanIssueDescription = singleIssue.getBody().trim();
|
|
||||||
Spanned bodyWithMD = markwon.toMarkdown(EmojiParser.parseToUnicode(cleanIssueDescription));
|
|
||||||
markwon.setParsedMarkdown(issueDescription, UserMentions.UserMentionsFunc(getApplicationContext(), bodyWithMD, cleanIssueDescription));
|
|
||||||
|
|
||||||
RelativeLayout.LayoutParams paramsDesc = (RelativeLayout.LayoutParams)issueDescription.getLayoutParams();
|
|
||||||
|
|
||||||
LinearLayout.LayoutParams params1 = new LinearLayout.LayoutParams(80, 80);
|
|
||||||
params1.setMargins(15, 0, 0, 0);
|
|
||||||
|
|
||||||
if(singleIssue.getAssignees() != null) {
|
|
||||||
assigneesScrollView.setVisibility(View.VISIBLE);
|
|
||||||
for (int i = 0; i < singleIssue.getAssignees().size(); i++) {
|
|
||||||
|
|
||||||
ImageView assigneesView = new ImageView(getApplicationContext());
|
|
||||||
|
|
||||||
Picasso.get().load(singleIssue.getAssignees().get(i).getAvatar_url()).transform(new RoundedTransformation(100, 0)).resize(80, 80).centerCrop().into(assigneesView);
|
|
||||||
|
|
||||||
assigneesLayout.addView(assigneesView);
|
|
||||||
assigneesView.setLayoutParams(params1);
|
|
||||||
if (!singleIssue.getAssignees().get(i).getFull_name().equals("")) {
|
|
||||||
assigneesView.setOnClickListener(new ClickListener(getString(R.string.assignedTo, singleIssue.getAssignees().get(i).getFull_name()), getApplicationContext()));
|
|
||||||
} else {
|
|
||||||
assigneesView.setOnClickListener(new ClickListener(getString(R.string.assignedTo, singleIssue.getAssignees().get(i).getLogin()), getApplicationContext()));
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
assigneesScrollView.setVisibility(View.GONE);
|
|
||||||
}
|
|
||||||
|
|
||||||
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
|
|
||||||
params.setMargins(0, 0, 15, 0);
|
|
||||||
|
|
||||||
if(singleIssue.getLabels() != null) {
|
|
||||||
labelsScrollView.setVisibility(View.VISIBLE);
|
|
||||||
int width = 33;
|
|
||||||
for (int i = 0; i < singleIssue.getLabels().size(); i++) {
|
|
||||||
|
|
||||||
String labelColor = singleIssue.getLabels().get(i).getColor();
|
|
||||||
String labelName = singleIssue.getLabels().get(i).getName();
|
|
||||||
int color = Color.parseColor("#" + labelColor);
|
|
||||||
|
|
||||||
ImageView labelsView = new ImageView(getApplicationContext());
|
|
||||||
labelsLayout.setOrientation(LinearLayout.HORIZONTAL);
|
|
||||||
labelsLayout.setGravity(Gravity.START | Gravity.TOP);
|
|
||||||
labelsView.setLayoutParams(params);
|
|
||||||
|
|
||||||
TextDrawable drawable = TextDrawable.builder()
|
|
||||||
.beginConfig()
|
|
||||||
.useFont(Typeface.DEFAULT)
|
|
||||||
.textColor(new ColorInverter().getContrastColor(color))
|
|
||||||
.fontSize(36)
|
|
||||||
.width((width * labelName.length()) - ((width / 4) * labelName.length()))
|
|
||||||
.height(60)
|
|
||||||
.endConfig()
|
|
||||||
.buildRoundRect(labelName, color, 8);
|
|
||||||
labelsView.setImageDrawable(drawable);
|
|
||||||
|
|
||||||
labelsLayout.addView(labelsView);
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
labelsScrollView.setVisibility(View.GONE);
|
|
||||||
}
|
|
||||||
|
|
||||||
if(singleIssue.getDue_date() != null) {
|
|
||||||
|
|
||||||
if (timeFormat.equals("normal") || timeFormat.equals("pretty")) {
|
|
||||||
DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd", new Locale(locale));
|
|
||||||
String dueDate = formatter.format(singleIssue.getDue_date());
|
|
||||||
issueDueDate.setText(getString(R.string.dueDate, dueDate));
|
|
||||||
issueDueDate.setOnClickListener(new ClickListener(TimeHelper.customDateFormatForToastDateFormat(singleIssue.getDue_date()), getApplicationContext()));
|
|
||||||
} else if (timeFormat.equals("normal1")) {
|
|
||||||
DateFormat formatter = new SimpleDateFormat("dd-MM-yyyy", new Locale(locale));
|
|
||||||
String dueDate = formatter.format(singleIssue.getDue_date());
|
|
||||||
issueDueDate.setText(getString(R.string.dueDate, dueDate));
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
|
|
||||||
issueDueDate.setVisibility(View.GONE);
|
|
||||||
}
|
|
||||||
|
|
||||||
String edited;
|
|
||||||
|
|
||||||
if(!singleIssue.getUpdated_at().equals(singleIssue.getCreated_at())) {
|
|
||||||
edited = getString(R.string.colorfulBulletSpan) + getString(R.string.modifiedText);
|
|
||||||
issueModified.setVisibility(View.VISIBLE);
|
|
||||||
issueModified.setText(edited);
|
|
||||||
issueModified.setOnClickListener(new ClickListener(TimeHelper.customDateFormatForToastDateFormat(singleIssue.getUpdated_at()), ctx));
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
issueModified.setVisibility(View.INVISIBLE);
|
|
||||||
}
|
|
||||||
|
|
||||||
if((singleIssue.getDue_date() == null && singleIssue.getMilestone() == null) && singleIssue.getAssignees() != null) {
|
|
||||||
paramsDesc.setMargins(0, 35, 0, 0);
|
|
||||||
issueDescription.setLayoutParams(paramsDesc);
|
|
||||||
}
|
|
||||||
else if(singleIssue.getDue_date() == null && singleIssue.getMilestone() == null) {
|
|
||||||
paramsDesc.setMargins(0, 55, 0, 0);
|
|
||||||
issueDescription.setLayoutParams(paramsDesc);
|
|
||||||
}
|
|
||||||
else if(singleIssue.getAssignees() == null) {
|
|
||||||
paramsDesc.setMargins(0, 35, 0, 0);
|
|
||||||
issueDescription.setLayoutParams(paramsDesc);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
paramsDesc.setMargins(0, 15, 0, 0);
|
|
||||||
issueDescription.setLayoutParams(paramsDesc);
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (timeFormat) {
|
|
||||||
case "pretty": {
|
|
||||||
PrettyTime prettyTime = new PrettyTime(new Locale(locale));
|
|
||||||
String createdTime = prettyTime.format(singleIssue.getCreated_at());
|
|
||||||
issueCreatedTime.setText(getString(R.string.createdTime, createdTime));
|
|
||||||
issueCreatedTime.setVisibility(View.VISIBLE);
|
|
||||||
issueCreatedTime.setOnClickListener(new ClickListener(TimeHelper.customDateFormatForToastDateFormat(singleIssue.getCreated_at()), getApplicationContext()));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case "normal": {
|
|
||||||
DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd '" + getResources().getString(R.string.timeAtText) + "' HH:mm", new Locale(locale));
|
|
||||||
String createdTime = formatter.format(singleIssue.getCreated_at());
|
|
||||||
issueCreatedTime.setText(getString(R.string.createdTime, createdTime));
|
|
||||||
issueCreatedTime.setVisibility(View.VISIBLE);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case "normal1": {
|
|
||||||
DateFormat formatter = new SimpleDateFormat("dd-MM-yyyy '" + getResources().getString(R.string.timeAtText) + "' HH:mm", new Locale(locale));
|
|
||||||
String createdTime = formatter.format(singleIssue.getCreated_at());
|
|
||||||
issueCreatedTime.setText(getString(R.string.createdTime, createdTime));
|
|
||||||
issueCreatedTime.setVisibility(View.VISIBLE);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(singleIssue.getMilestone() != null) {
|
|
||||||
issueMilestone.setText(getString(R.string.issueMilestone, singleIssue.getMilestone().getTitle()));
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
issueMilestone.setVisibility(View.GONE);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!singleIssue.getUser().getFull_name().equals("")) {
|
|
||||||
assigneeAvatar.setOnClickListener(new ClickListener(getApplicationContext().getResources().getString(R.string.issueCreator) + singleIssue.getUser().getFull_name(), getApplicationContext()));
|
|
||||||
} else {
|
|
||||||
assigneeAvatar.setOnClickListener(new ClickListener(getApplicationContext().getResources().getString(R.string.issueCreator) + singleIssue.getUser().getLogin(), getApplicationContext()));
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
else if(response.code() == 401) {
|
|
||||||
|
|
||||||
AlertDialogs.authorizationTokenRevokedDialog(ctx, getResources().getString(R.string.alertDialogTokenRevokedTitle),
|
|
||||||
getResources().getString(R.string.alertDialogTokenRevokedMessage),
|
|
||||||
getResources().getString(R.string.alertDialogTokenRevokedCopyNegativeButton),
|
|
||||||
getResources().getString(R.string.alertDialogTokenRevokedCopyPositiveButton));
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onFailure(@NonNull Call<Issues> call, @NonNull Throwable t) {
|
|
||||||
Log.e("onFailure", t.toString());
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
private void initCloseListener() {
|
|
||||||
View.OnClickListener onClickListener = new View.OnClickListener() {
|
|
||||||
@Override
|
|
||||||
public void onClick(View view) {
|
|
||||||
finish();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,414 +0,0 @@
|
|||||||
package org.mian.gitnex.activities;
|
|
||||||
|
|
||||||
import android.content.ActivityNotFoundException;
|
|
||||||
import android.content.Context;
|
|
||||||
import android.content.Intent;
|
|
||||||
import androidx.annotation.NonNull;
|
|
||||||
import com.google.android.material.navigation.NavigationView;
|
|
||||||
import androidx.core.view.GravityCompat;
|
|
||||||
import androidx.drawerlayout.widget.DrawerLayout;
|
|
||||||
import androidx.appcompat.app.ActionBarDrawerToggle;
|
|
||||||
import androidx.appcompat.app.AppCompatActivity;
|
|
||||||
import android.net.Uri;
|
|
||||||
import android.os.Bundle;
|
|
||||||
import android.util.Log;
|
|
||||||
import android.view.MenuItem;
|
|
||||||
import android.view.View;
|
|
||||||
import android.widget.ImageView;
|
|
||||||
import android.widget.TextView;
|
|
||||||
import com.squareup.picasso.NetworkPolicy;
|
|
||||||
import com.squareup.picasso.Picasso;
|
|
||||||
import org.mian.gitnex.R;
|
|
||||||
import org.mian.gitnex.clients.RetrofitClient;
|
|
||||||
import org.mian.gitnex.fragments.AboutFragment;
|
|
||||||
import org.mian.gitnex.fragments.MyRepositoriesFragment;
|
|
||||||
import org.mian.gitnex.fragments.NavSubMenuBottomSheetFragment;
|
|
||||||
import org.mian.gitnex.fragments.OrganizationsFragment;
|
|
||||||
import org.mian.gitnex.fragments.SettingsFragment;
|
|
||||||
import org.mian.gitnex.fragments.StarredRepositoriesFragment;
|
|
||||||
import org.mian.gitnex.helpers.AlertDialogs;
|
|
||||||
import org.mian.gitnex.helpers.Authorization;
|
|
||||||
import org.mian.gitnex.helpers.Toasty;
|
|
||||||
import org.mian.gitnex.models.UserInfo;
|
|
||||||
import org.mian.gitnex.util.AppUtil;
|
|
||||||
import org.mian.gitnex.helpers.RoundedTransformation;
|
|
||||||
import org.mian.gitnex.util.TinyDB;
|
|
||||||
import org.mian.gitnex.fragments.ProfileFragment;
|
|
||||||
import org.mian.gitnex.fragments.RepositoriesFragment;
|
|
||||||
import java.util.Objects;
|
|
||||||
import retrofit2.Call;
|
|
||||||
import retrofit2.Callback;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Author M M Arif
|
|
||||||
*/
|
|
||||||
|
|
||||||
public class MainActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener {
|
|
||||||
|
|
||||||
private DrawerLayout drawer;
|
|
||||||
private TextView userFullName;
|
|
||||||
private TextView userEmail;
|
|
||||||
private ImageView userAvatar;
|
|
||||||
final Context ctx = this;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void onCreate(Bundle savedInstanceState) {
|
|
||||||
|
|
||||||
final TinyDB tinyDb = new TinyDB(getApplicationContext());
|
|
||||||
tinyDb.putBoolean("noConnection", false);
|
|
||||||
//userAvatar = findViewById(R.id.userAvatar);
|
|
||||||
|
|
||||||
final String instanceUrl = tinyDb.getString("instanceUrl");
|
|
||||||
final String loginUid = tinyDb.getString("loginUid");
|
|
||||||
final String instanceToken = "token " + tinyDb.getString(loginUid + "-token");
|
|
||||||
|
|
||||||
if(tinyDb.getString("dateFormat").isEmpty()) {
|
|
||||||
tinyDb.putString("dateFormat", "pretty");
|
|
||||||
}
|
|
||||||
|
|
||||||
if(tinyDb.getString("codeBlockStr").isEmpty()) {
|
|
||||||
tinyDb.putInt("codeBlockColor", getResources().getColor(R.color.colorLightGreen));
|
|
||||||
tinyDb.putInt("codeBlockBackground", getResources().getColor(R.color.black));
|
|
||||||
}
|
|
||||||
|
|
||||||
if(tinyDb.getString("enableCounterIssueBadgeInit").isEmpty()) {
|
|
||||||
tinyDb.putBoolean("enableCounterIssueBadge", true);
|
|
||||||
}
|
|
||||||
|
|
||||||
if(tinyDb.getString("homeScreenStr").isEmpty()) {
|
|
||||||
tinyDb.putInt("homeScreenId", 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
String appLocale = tinyDb.getString("locale");
|
|
||||||
AppUtil.setAppLocale(getResources(), appLocale);
|
|
||||||
|
|
||||||
boolean connToInternet = AppUtil.haveNetworkConnection(getApplicationContext());
|
|
||||||
|
|
||||||
super.onCreate(savedInstanceState);
|
|
||||||
setContentView(R.layout.activity_main);
|
|
||||||
|
|
||||||
if(!tinyDb.getBoolean("loggedInMode")) {
|
|
||||||
logout();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
androidx.appcompat.widget.Toolbar toolbar = findViewById(R.id.toolbar);
|
|
||||||
setSupportActionBar(toolbar);
|
|
||||||
|
|
||||||
drawer = findViewById(R.id.drawer_layout);
|
|
||||||
NavigationView navigationView = findViewById(R.id.nav_view);
|
|
||||||
navigationView.setNavigationItemSelectedListener(this);
|
|
||||||
final View hView = navigationView.getHeaderView(0);
|
|
||||||
|
|
||||||
ImageView navSubMenu = hView.findViewById(R.id.navSubMenu);
|
|
||||||
navSubMenu.setOnClickListener(new View.OnClickListener() {
|
|
||||||
public void onClick(View v) {
|
|
||||||
NavSubMenuBottomSheetFragment bottomSheet = new NavSubMenuBottomSheetFragment();
|
|
||||||
bottomSheet.show(getSupportFragmentManager(), "adminMenuBottomSheet");
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(this, drawer, toolbar,
|
|
||||||
R.string.navigation_drawer_open, R.string.navigation_drawer_close);
|
|
||||||
toggle.getDrawerArrowDrawable().setColor(getResources().getColor(R.color.white));
|
|
||||||
drawer.addDrawerListener(toggle);
|
|
||||||
|
|
||||||
drawer.addDrawerListener(new DrawerLayout.DrawerListener() {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onDrawerSlide(@NonNull View drawerView, float slideOffset) {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onDrawerOpened(@NonNull View drawerView) {
|
|
||||||
|
|
||||||
boolean connToInternet = AppUtil.haveNetworkConnection(getApplicationContext());
|
|
||||||
if(!connToInternet) {
|
|
||||||
|
|
||||||
if(!tinyDb.getBoolean("noConnection")) {
|
|
||||||
Toasty.info(getApplicationContext(), getResources().getString(R.string.checkNetConnection));
|
|
||||||
}
|
|
||||||
|
|
||||||
tinyDb.putBoolean("noConnection", true);
|
|
||||||
|
|
||||||
String userEmailNav = tinyDb.getString("userEmail");
|
|
||||||
String userFullNameNav = tinyDb.getString("userFullname");
|
|
||||||
String userAvatarNav = tinyDb.getString("userAvatar");
|
|
||||||
|
|
||||||
userEmail = hView.findViewById(R.id.userEmail);
|
|
||||||
if (!userEmailNav.equals("")) {
|
|
||||||
userEmail.setText(userEmailNav);
|
|
||||||
}
|
|
||||||
|
|
||||||
userFullName = hView.findViewById(R.id.userFullname);
|
|
||||||
if (!userFullNameNav.equals("")) {
|
|
||||||
userFullName.setText(userFullNameNav);
|
|
||||||
}
|
|
||||||
|
|
||||||
userAvatar = hView.findViewById(R.id.userAvatar);
|
|
||||||
if (!userAvatarNav.equals("")) {
|
|
||||||
Picasso.get().load(userAvatarNav).networkPolicy(NetworkPolicy.OFFLINE).transform(new RoundedTransformation(100, 0)).resize(180, 180).centerCrop().into(userAvatar);
|
|
||||||
}
|
|
||||||
|
|
||||||
} else {
|
|
||||||
|
|
||||||
displayUserInfo(instanceUrl, instanceToken, loginUid);
|
|
||||||
tinyDb.putBoolean("noConnection", false);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onDrawerClosed(@NonNull View drawerView) {
|
|
||||||
// Called when a drawer has settled in a completely closed state.
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onDrawerStateChanged(int newState) {
|
|
||||||
// Called when the drawer motion state changes. The new state will be one of STATE_IDLE, STATE_DRAGGING or STATE_SETTLING.
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
toggle.syncState();
|
|
||||||
|
|
||||||
if(savedInstanceState == null) {
|
|
||||||
if(tinyDb.getInt("homeScreenId") == 0) {
|
|
||||||
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,
|
|
||||||
new MyRepositoriesFragment()).commit();
|
|
||||||
navigationView.setCheckedItem(R.id.nav_home);
|
|
||||||
}
|
|
||||||
else if(tinyDb.getInt("homeScreenId") == 1) {
|
|
||||||
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,
|
|
||||||
new StarredRepositoriesFragment()).commit();
|
|
||||||
navigationView.setCheckedItem(R.id.nav_starred_repos);
|
|
||||||
}
|
|
||||||
else if(tinyDb.getInt("homeScreenId") == 2) {
|
|
||||||
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,
|
|
||||||
new OrganizationsFragment()).commit();
|
|
||||||
navigationView.setCheckedItem(R.id.nav_organizations);
|
|
||||||
}
|
|
||||||
else if(tinyDb.getInt("homeScreenId") == 3) {
|
|
||||||
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,
|
|
||||||
new RepositoriesFragment()).commit();
|
|
||||||
navigationView.setCheckedItem(R.id.nav_repositories);
|
|
||||||
}
|
|
||||||
else if(tinyDb.getInt("homeScreenId") == 4) {
|
|
||||||
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,
|
|
||||||
new ProfileFragment()).commit();
|
|
||||||
navigationView.setCheckedItem(R.id.nav_profile);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,
|
|
||||||
new MyRepositoriesFragment()).commit();
|
|
||||||
navigationView.setCheckedItem(R.id.nav_home);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(!connToInternet) {
|
|
||||||
|
|
||||||
if(!tinyDb.getBoolean("noConnection")) {
|
|
||||||
Toasty.info(getApplicationContext(), getResources().getString(R.string.checkNetConnection));
|
|
||||||
}
|
|
||||||
|
|
||||||
tinyDb.putBoolean("noConnection", true);
|
|
||||||
|
|
||||||
} else {
|
|
||||||
|
|
||||||
displayUserInfo(instanceUrl, instanceToken, loginUid);
|
|
||||||
tinyDb.putBoolean("noConnection", false);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setActionBarTitle (@NonNull String title) {
|
|
||||||
Objects.requireNonNull(getSupportActionBar()).setTitle(title);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onBackPressed() {
|
|
||||||
|
|
||||||
if(drawer.isDrawerOpen(GravityCompat.START)) {
|
|
||||||
drawer.closeDrawer(GravityCompat.START);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
super.onBackPressed();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) {
|
|
||||||
|
|
||||||
switch (menuItem.getItemId()) {
|
|
||||||
case R.id.nav_home:
|
|
||||||
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,
|
|
||||||
new MyRepositoriesFragment()).commit();
|
|
||||||
break;
|
|
||||||
case R.id.nav_organizations:
|
|
||||||
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,
|
|
||||||
new OrganizationsFragment()).commit();
|
|
||||||
break;
|
|
||||||
case R.id.nav_profile:
|
|
||||||
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,
|
|
||||||
new ProfileFragment()).commit();
|
|
||||||
break;
|
|
||||||
case R.id.nav_repositories:
|
|
||||||
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,
|
|
||||||
new RepositoriesFragment()).commit();
|
|
||||||
break;
|
|
||||||
case R.id.nav_settings:
|
|
||||||
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,
|
|
||||||
new SettingsFragment()).commit();
|
|
||||||
break;
|
|
||||||
case R.id.nav_logout:
|
|
||||||
logout();
|
|
||||||
overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);
|
|
||||||
break;
|
|
||||||
case R.id.nav_about:
|
|
||||||
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,
|
|
||||||
new AboutFragment()).commit();
|
|
||||||
break;
|
|
||||||
case R.id.nav_rate_app:
|
|
||||||
rateThisApp();
|
|
||||||
break;
|
|
||||||
case R.id.nav_starred_repos:
|
|
||||||
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,
|
|
||||||
new StarredRepositoriesFragment()).commit();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
drawer.closeDrawer(GravityCompat.START);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void rateThisApp() {
|
|
||||||
try {
|
|
||||||
startActivity(new Intent(Intent.ACTION_VIEW,
|
|
||||||
Uri.parse("market://details?id=" + getPackageName())));
|
|
||||||
} catch (ActivityNotFoundException e) {
|
|
||||||
startActivity(new Intent(Intent.ACTION_VIEW,
|
|
||||||
Uri.parse("https://play.google.com/store/apps/details?id=" + getPackageName())));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void logout() {
|
|
||||||
|
|
||||||
TinyDB tinyDb = new TinyDB(getApplicationContext());
|
|
||||||
tinyDb.putBoolean("loggedInMode", false);
|
|
||||||
tinyDb.remove("basicAuthPassword");
|
|
||||||
tinyDb.putBoolean("basicAuthFlag", false);
|
|
||||||
//tinyDb.clear();
|
|
||||||
finish();
|
|
||||||
startActivity(new Intent(MainActivity.this, LoginActivity.class));
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
private void displayUserInfo(String instanceUrl, String token, String loginUid) {
|
|
||||||
|
|
||||||
final TinyDB tinyDb = new TinyDB(getApplicationContext());
|
|
||||||
|
|
||||||
Call<UserInfo> call = RetrofitClient
|
|
||||||
.getInstance(instanceUrl)
|
|
||||||
.getApiInterface()
|
|
||||||
.getUserInfo(Authorization.returnAuthentication(getApplicationContext(), loginUid, token));
|
|
||||||
|
|
||||||
NavigationView navigationView = findViewById(R.id.nav_view);
|
|
||||||
final View hView = navigationView.getHeaderView(0);
|
|
||||||
|
|
||||||
call.enqueue(new Callback<UserInfo>() {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onResponse(@NonNull Call<UserInfo> call, @NonNull retrofit2.Response<UserInfo> response) {
|
|
||||||
|
|
||||||
UserInfo userDetails = response.body();
|
|
||||||
|
|
||||||
if (response.isSuccessful()) {
|
|
||||||
|
|
||||||
if (response.code() == 200) {
|
|
||||||
|
|
||||||
assert userDetails != null;
|
|
||||||
if(userDetails.getIs_admin() != null) {
|
|
||||||
tinyDb.putBoolean("userIsAdmin", userDetails.getIs_admin());
|
|
||||||
}
|
|
||||||
tinyDb.putString("userLogin", userDetails.getLogin());
|
|
||||||
tinyDb.putInt("userId", userDetails.getId());
|
|
||||||
if(!userDetails.getFullname().equals("")) {
|
|
||||||
tinyDb.putString("userFullname", userDetails.getFullname());
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
tinyDb.putString("userFullname", "...");
|
|
||||||
}
|
|
||||||
|
|
||||||
tinyDb.putString("userEmail", userDetails.getEmail());
|
|
||||||
tinyDb.putString("userAvatar", userDetails.getAvatar());
|
|
||||||
if(userDetails.getLang() != null) {
|
|
||||||
tinyDb.putString("userLang", userDetails.getLang());
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
tinyDb.putString("userLang", "...");
|
|
||||||
}
|
|
||||||
|
|
||||||
userAvatar = hView.findViewById(R.id.userAvatar);
|
|
||||||
if (!Objects.requireNonNull(userDetails).getAvatar().equals("")) {
|
|
||||||
Picasso.get().load(userDetails.getAvatar()).transform(new RoundedTransformation(100, 0)).resize(180, 180).centerCrop().into(userAvatar);
|
|
||||||
} else {
|
|
||||||
userAvatar.setImageResource(R.mipmap.ic_launcher_round);
|
|
||||||
}
|
|
||||||
|
|
||||||
userFullName = hView.findViewById(R.id.userFullname);
|
|
||||||
if (!userDetails.getFullname().equals("")) {
|
|
||||||
userFullName.setText(userDetails.getFullname());
|
|
||||||
} else if (!userDetails.getLogin().equals("")) {
|
|
||||||
userFullName.setText(userDetails.getLogin());
|
|
||||||
} else {
|
|
||||||
userFullName.setText("...");
|
|
||||||
}
|
|
||||||
|
|
||||||
userEmail = hView.findViewById(R.id.userEmail);
|
|
||||||
if (!userDetails.getEmail().equals("")) {
|
|
||||||
userEmail.setText(userDetails.getEmail());
|
|
||||||
} else {
|
|
||||||
userEmail.setText("...");
|
|
||||||
}
|
|
||||||
|
|
||||||
userAvatar.setOnClickListener(new View.OnClickListener() {
|
|
||||||
public void onClick(View v) {
|
|
||||||
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,
|
|
||||||
new ProfileFragment()).commit();
|
|
||||||
drawer.closeDrawers();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
else if(response.code() == 401) {
|
|
||||||
|
|
||||||
AlertDialogs.authorizationTokenRevokedDialog(ctx, getResources().getString(R.string.alertDialogTokenRevokedTitle),
|
|
||||||
getResources().getString(R.string.alertDialogTokenRevokedMessage),
|
|
||||||
getResources().getString(R.string.alertDialogTokenRevokedCopyNegativeButton),
|
|
||||||
getResources().getString(R.string.alertDialogTokenRevokedCopyPositiveButton));
|
|
||||||
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
|
|
||||||
String toastError = getResources().getString(R.string.genericApiStatusError) + String.valueOf(response.code());
|
|
||||||
Toasty.info(getApplicationContext(), toastError);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onFailure(@NonNull Call<UserInfo> call, @NonNull Throwable t) {
|
|
||||||
Log.e("onFailure", t.toString());
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,145 +0,0 @@
|
|||||||
package org.mian.gitnex.adapters;
|
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import android.view.LayoutInflater;
|
|
||||||
import android.view.View;
|
|
||||||
import android.view.ViewGroup;
|
|
||||||
import android.widget.Filter;
|
|
||||||
import android.widget.Filterable;
|
|
||||||
import android.widget.ImageView;
|
|
||||||
import android.widget.TextView;
|
|
||||||
import androidx.annotation.NonNull;
|
|
||||||
import androidx.recyclerview.widget.RecyclerView;
|
|
||||||
import com.amulyakhare.textdrawable.TextDrawable;
|
|
||||||
import com.squareup.picasso.Picasso;
|
|
||||||
import org.mian.gitnex.R;
|
|
||||||
import org.mian.gitnex.helpers.RoundedTransformation;
|
|
||||||
import org.mian.gitnex.models.UserInfo;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Author M M Arif
|
|
||||||
*/
|
|
||||||
|
|
||||||
public class AdminGetUsersAdapter extends RecyclerView.Adapter<AdminGetUsersAdapter.UsersViewHolder> implements Filterable {
|
|
||||||
|
|
||||||
private List<UserInfo> usersList;
|
|
||||||
private Context mCtx;
|
|
||||||
private List<UserInfo> usersListFull;
|
|
||||||
|
|
||||||
static class UsersViewHolder extends RecyclerView.ViewHolder {
|
|
||||||
|
|
||||||
private ImageView userAvatar;
|
|
||||||
private TextView userFullName;
|
|
||||||
private TextView userEmail;
|
|
||||||
private ImageView userRole;
|
|
||||||
private TextView userName;
|
|
||||||
|
|
||||||
private UsersViewHolder(View itemView) {
|
|
||||||
super(itemView);
|
|
||||||
|
|
||||||
userAvatar = itemView.findViewById(R.id.userAvatar);
|
|
||||||
userFullName = itemView.findViewById(R.id.userFullName);
|
|
||||||
userName = itemView.findViewById(R.id.userName);
|
|
||||||
userEmail = itemView.findViewById(R.id.userEmail);
|
|
||||||
userRole = itemView.findViewById(R.id.userRole);
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public AdminGetUsersAdapter(Context mCtx, List<UserInfo> usersListMain) {
|
|
||||||
this.mCtx = mCtx;
|
|
||||||
this.usersList = usersListMain;
|
|
||||||
usersListFull = new ArrayList<>(usersList);
|
|
||||||
}
|
|
||||||
|
|
||||||
@NonNull
|
|
||||||
@Override
|
|
||||||
public AdminGetUsersAdapter.UsersViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
|
|
||||||
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.admin_users_list, parent, false);
|
|
||||||
return new AdminGetUsersAdapter.UsersViewHolder(v);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onBindViewHolder(@NonNull AdminGetUsersAdapter.UsersViewHolder holder, int position) {
|
|
||||||
|
|
||||||
UserInfo currentItem = usersList.get(position);
|
|
||||||
|
|
||||||
if(!currentItem.getFullname().equals("")) {
|
|
||||||
holder.userFullName.setText(currentItem.getFullname());
|
|
||||||
holder.userName.setText(mCtx.getResources().getString(R.string.usernameWithAt, currentItem.getUsername()));
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
holder.userFullName.setText(mCtx.getResources().getString(R.string.usernameWithAt, currentItem.getUsername()));
|
|
||||||
holder.userName.setVisibility(View.GONE);
|
|
||||||
}
|
|
||||||
|
|
||||||
if(!currentItem.getEmail().equals("")) {
|
|
||||||
holder.userEmail.setText(currentItem.getEmail());
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
holder.userEmail.setVisibility(View.GONE);
|
|
||||||
}
|
|
||||||
|
|
||||||
if(currentItem.getIs_admin()) {
|
|
||||||
holder.userRole.setVisibility(View.VISIBLE);
|
|
||||||
TextDrawable drawable = TextDrawable.builder()
|
|
||||||
.beginConfig()
|
|
||||||
.textColor(mCtx.getResources().getColor(R.color.white))
|
|
||||||
.fontSize(44)
|
|
||||||
.width(180)
|
|
||||||
.height(60)
|
|
||||||
.endConfig()
|
|
||||||
.buildRoundRect(mCtx.getResources().getString(R.string.userRoleAdmin).toLowerCase(), mCtx.getResources().getColor(R.color.releasePre), 8);
|
|
||||||
holder.userRole.setImageDrawable(drawable);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
holder.userRole.setVisibility(View.GONE);
|
|
||||||
}
|
|
||||||
|
|
||||||
Picasso.get().load(currentItem.getAvatar()).transform(new RoundedTransformation(100, 0)).resize(140, 140).centerCrop().into(holder.userAvatar);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getItemCount() {
|
|
||||||
return usersList.size();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Filter getFilter() {
|
|
||||||
return usersFilter;
|
|
||||||
}
|
|
||||||
|
|
||||||
private Filter usersFilter = new Filter() {
|
|
||||||
@Override
|
|
||||||
protected FilterResults performFiltering(CharSequence constraint) {
|
|
||||||
List<UserInfo> filteredList = new ArrayList<>();
|
|
||||||
|
|
||||||
if (constraint == null || constraint.length() == 0) {
|
|
||||||
filteredList.addAll(usersListFull);
|
|
||||||
} else {
|
|
||||||
String filterPattern = constraint.toString().toLowerCase().trim();
|
|
||||||
|
|
||||||
for (UserInfo item : usersListFull) {
|
|
||||||
if (item.getEmail().toLowerCase().contains(filterPattern) || item.getFullname().toLowerCase().contains(filterPattern) || item.getUsername().toLowerCase().contains(filterPattern)) {
|
|
||||||
filteredList.add(item);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
FilterResults results = new FilterResults();
|
|
||||||
results.values = filteredList;
|
|
||||||
|
|
||||||
return results;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void publishResults(CharSequence constraint, FilterResults results) {
|
|
||||||
usersList.clear();
|
|
||||||
usersList.addAll((List) results.values);
|
|
||||||
notifyDataSetChanged();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
}
|
|
@ -1,91 +0,0 @@
|
|||||||
package org.mian.gitnex.adapters;
|
|
||||||
|
|
||||||
import android.annotation.SuppressLint;
|
|
||||||
import android.content.Context;
|
|
||||||
import android.view.LayoutInflater;
|
|
||||||
import android.view.View;
|
|
||||||
import android.view.ViewGroup;
|
|
||||||
import android.widget.BaseAdapter;
|
|
||||||
import android.widget.ImageView;
|
|
||||||
import android.widget.TextView;
|
|
||||||
import com.squareup.picasso.Picasso;
|
|
||||||
import org.mian.gitnex.R;
|
|
||||||
import org.mian.gitnex.models.Collaborators;
|
|
||||||
import org.mian.gitnex.helpers.RoundedTransformation;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Author M M Arif
|
|
||||||
*/
|
|
||||||
|
|
||||||
public class CollaboratorsAdapter extends BaseAdapter {
|
|
||||||
|
|
||||||
private List<Collaborators> collaboratorsList;
|
|
||||||
private Context mCtx;
|
|
||||||
|
|
||||||
private class ViewHolder {
|
|
||||||
|
|
||||||
private ImageView collaboratorAvatar;
|
|
||||||
private TextView collaboratorName;
|
|
||||||
|
|
||||||
ViewHolder(View v) {
|
|
||||||
collaboratorAvatar = v.findViewById(R.id.collaboratorAvatar);
|
|
||||||
collaboratorName = v.findViewById(R.id.collaboratorName);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public CollaboratorsAdapter(Context mCtx, List<Collaborators> collaboratorsListMain) {
|
|
||||||
this.mCtx = mCtx;
|
|
||||||
this.collaboratorsList = collaboratorsListMain;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getCount() {
|
|
||||||
return collaboratorsList.size();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Object getItem(int position) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public long getItemId(int position) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
@SuppressLint("InflateParams")
|
|
||||||
@Override
|
|
||||||
public View getView(int position, View finalView, ViewGroup parent) {
|
|
||||||
|
|
||||||
ViewHolder viewHolder = null;
|
|
||||||
|
|
||||||
if (finalView == null) {
|
|
||||||
finalView = LayoutInflater.from(mCtx).inflate(R.layout.collaborators_list, null);
|
|
||||||
viewHolder = new ViewHolder(finalView);
|
|
||||||
finalView.setTag(viewHolder);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
viewHolder = (ViewHolder) finalView.getTag();
|
|
||||||
}
|
|
||||||
|
|
||||||
initData(viewHolder, position);
|
|
||||||
return finalView;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
private void initData(ViewHolder viewHolder, int position) {
|
|
||||||
|
|
||||||
Collaborators currentItem = collaboratorsList.get(position);
|
|
||||||
Picasso.get().load(currentItem.getAvatar_url()).transform(new RoundedTransformation(100, 0)).resize(200, 200).centerCrop().into(viewHolder.collaboratorAvatar);
|
|
||||||
|
|
||||||
if(!currentItem.getFull_name().equals("")) {
|
|
||||||
viewHolder.collaboratorName.setText(currentItem.getFull_name());
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
viewHolder.collaboratorName.setText(currentItem.getLogin());
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,289 +0,0 @@
|
|||||||
package org.mian.gitnex.adapters;
|
|
||||||
|
|
||||||
import android.annotation.SuppressLint;
|
|
||||||
import android.content.Context;
|
|
||||||
import android.content.Intent;
|
|
||||||
import android.graphics.drawable.Drawable;
|
|
||||||
import android.net.Uri;
|
|
||||||
import android.text.Spanned;
|
|
||||||
import android.view.LayoutInflater;
|
|
||||||
import android.view.MenuItem;
|
|
||||||
import android.view.View;
|
|
||||||
import android.view.ViewGroup;
|
|
||||||
import android.widget.ImageView;
|
|
||||||
import android.widget.TextView;
|
|
||||||
import com.squareup.picasso.Picasso;
|
|
||||||
import com.vdurmont.emoji.EmojiParser;
|
|
||||||
import org.mian.gitnex.R;
|
|
||||||
import org.mian.gitnex.activities.ReplyToIssueActivity;
|
|
||||||
import org.mian.gitnex.helpers.TimeHelper;
|
|
||||||
import org.mian.gitnex.models.IssueComments;
|
|
||||||
import org.mian.gitnex.helpers.RoundedTransformation;
|
|
||||||
import org.mian.gitnex.util.TinyDB;
|
|
||||||
import org.mian.gitnex.helpers.ClickListener;
|
|
||||||
import org.ocpsoft.prettytime.PrettyTime;
|
|
||||||
import java.lang.reflect.Field;
|
|
||||||
import java.text.DateFormat;
|
|
||||||
import java.text.SimpleDateFormat;
|
|
||||||
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.appcompat.view.ContextThemeWrapper;
|
|
||||||
import androidx.appcompat.widget.PopupMenu;
|
|
||||||
import androidx.recyclerview.widget.RecyclerView;
|
|
||||||
import io.noties.markwon.AbstractMarkwonPlugin;
|
|
||||||
import io.noties.markwon.Markwon;
|
|
||||||
import io.noties.markwon.core.CorePlugin;
|
|
||||||
import io.noties.markwon.core.MarkwonTheme;
|
|
||||||
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;
|
|
||||||
import io.noties.markwon.image.SchemeHandler;
|
|
||||||
import io.noties.markwon.image.gif.GifMediaDecoder;
|
|
||||||
import io.noties.markwon.image.svg.SvgMediaDecoder;
|
|
||||||
import io.noties.markwon.linkify.LinkifyPlugin;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Author M M Arif
|
|
||||||
*/
|
|
||||||
|
|
||||||
public class IssueCommentsAdapter extends RecyclerView.Adapter<IssueCommentsAdapter.IssueCommentViewHolder> {
|
|
||||||
|
|
||||||
private List<IssueComments> issuesComments;
|
|
||||||
private Context mCtx;
|
|
||||||
|
|
||||||
static class IssueCommentViewHolder extends RecyclerView.ViewHolder {
|
|
||||||
|
|
||||||
private TextView issueNumber;
|
|
||||||
private TextView commendId;
|
|
||||||
private ImageView issueCommenterAvatar;
|
|
||||||
private TextView issueComment;
|
|
||||||
private TextView issueCommentDate;
|
|
||||||
private ImageView commentsOptionsMenu;
|
|
||||||
private TextView commendBodyRaw;
|
|
||||||
private TextView commentModified;
|
|
||||||
|
|
||||||
private IssueCommentViewHolder(View itemView) {
|
|
||||||
super(itemView);
|
|
||||||
|
|
||||||
issueNumber = itemView.findViewById(R.id.issueNumber);
|
|
||||||
commendId = itemView.findViewById(R.id.commendId);
|
|
||||||
issueCommenterAvatar = itemView.findViewById(R.id.issueCommenterAvatar);
|
|
||||||
issueComment = itemView.findViewById(R.id.issueComment);
|
|
||||||
issueCommentDate = itemView.findViewById(R.id.issueCommentDate);
|
|
||||||
commentsOptionsMenu = itemView.findViewById(R.id.commentsOptionsMenu);
|
|
||||||
commendBodyRaw = itemView.findViewById(R.id.commendBodyRaw);
|
|
||||||
commentModified = itemView.findViewById(R.id.commentModified);
|
|
||||||
|
|
||||||
commentsOptionsMenu.setOnClickListener(new View.OnClickListener() {
|
|
||||||
@Override
|
|
||||||
public void onClick(View v) {
|
|
||||||
|
|
||||||
final Context context = v.getContext();
|
|
||||||
Context context_ = new ContextThemeWrapper(context, R.style.popupMenuStyle);
|
|
||||||
|
|
||||||
PopupMenu popupMenu = new PopupMenu(context_, v);
|
|
||||||
popupMenu.inflate(R.menu.issue_comment_menu);
|
|
||||||
|
|
||||||
Object menuHelper;
|
|
||||||
Class[] argTypes;
|
|
||||||
try {
|
|
||||||
|
|
||||||
Field fMenuHelper = PopupMenu.class.getDeclaredField("mPopup");
|
|
||||||
fMenuHelper.setAccessible(true);
|
|
||||||
menuHelper = fMenuHelper.get(popupMenu);
|
|
||||||
argTypes = new Class[] { boolean.class };
|
|
||||||
menuHelper.getClass().getDeclaredMethod("setForceShowIcon",
|
|
||||||
argTypes).invoke(menuHelper, true);
|
|
||||||
|
|
||||||
} catch (Exception e) {
|
|
||||||
|
|
||||||
popupMenu.show();
|
|
||||||
return;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
|
|
||||||
@Override
|
|
||||||
public boolean onMenuItemClick(MenuItem item) {
|
|
||||||
switch (item.getItemId()) {
|
|
||||||
case R.id.commentMenuEdit:
|
|
||||||
|
|
||||||
Intent intent = new Intent(context, ReplyToIssueActivity.class);
|
|
||||||
intent.putExtra("commentId", commendId.getText());
|
|
||||||
intent.putExtra("commentAction", "edit");
|
|
||||||
intent.putExtra("commentBody", commendBodyRaw.getText());
|
|
||||||
context.startActivity(intent);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case R.id.commentMenuDelete:
|
|
||||||
|
|
||||||
break;
|
|
||||||
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
popupMenu.show();
|
|
||||||
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public IssueCommentsAdapter(Context mCtx, List<IssueComments> issuesCommentsMain) {
|
|
||||||
this.mCtx = mCtx;
|
|
||||||
this.issuesComments = issuesCommentsMain;
|
|
||||||
}
|
|
||||||
|
|
||||||
@NonNull
|
|
||||||
@Override
|
|
||||||
public IssueCommentsAdapter.IssueCommentViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
|
|
||||||
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.issue_comments, parent, false);
|
|
||||||
return new IssueCommentsAdapter.IssueCommentViewHolder(v);
|
|
||||||
}
|
|
||||||
|
|
||||||
@SuppressLint("SetTextI18n")
|
|
||||||
@Override
|
|
||||||
public void onBindViewHolder(@NonNull IssueCommentsAdapter.IssueCommentViewHolder holder, int position) {
|
|
||||||
|
|
||||||
final TinyDB tinyDb = new TinyDB(mCtx);
|
|
||||||
final String locale = tinyDb.getString("locale");
|
|
||||||
final String timeFormat = tinyDb.getString("dateFormat");
|
|
||||||
final String loginUid = tinyDb.getString("loginUid");
|
|
||||||
|
|
||||||
IssueComments currentItem = issuesComments.get(position);
|
|
||||||
|
|
||||||
if(!loginUid.equals(currentItem.getUser().getUsername())) {
|
|
||||||
holder.commentsOptionsMenu.setVisibility(View.INVISIBLE);
|
|
||||||
}
|
|
||||||
holder.commendId.setText(String.valueOf(currentItem.getId()));
|
|
||||||
holder.commendBodyRaw.setText(currentItem.getBody());
|
|
||||||
|
|
||||||
if (!currentItem.getUser().getFull_name().equals("")) {
|
|
||||||
holder.issueCommenterAvatar.setOnClickListener(new ClickListener(mCtx.getResources().getString(R.string.issueCommenter) + currentItem.getUser().getFull_name(), mCtx));
|
|
||||||
} else {
|
|
||||||
holder.issueCommenterAvatar.setOnClickListener(new ClickListener(mCtx.getResources().getString(R.string.issueCommenter) + currentItem.getUser().getLogin(), mCtx));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (currentItem.getUser().getAvatar_url() != null) {
|
|
||||||
Picasso.get().load(currentItem.getUser().getAvatar_url()).transform(new RoundedTransformation(100, 0)).resize(200, 200).centerCrop().into(holder.issueCommenterAvatar);
|
|
||||||
} else {
|
|
||||||
Picasso.get().load(currentItem.getUser().getAvatar_url()).transform(new RoundedTransformation(100, 0)).resize(200, 200).centerCrop().into(holder.issueCommenterAvatar);
|
|
||||||
}
|
|
||||||
|
|
||||||
String cleanIssueComments = currentItem.getBody().trim();
|
|
||||||
|
|
||||||
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) {
|
|
||||||
|
|
||||||
final int resourceId = mCtx.getResources().getIdentifier(
|
|
||||||
raw.substring("drawable://".length()),
|
|
||||||
"drawable",
|
|
||||||
mCtx.getPackageName());
|
|
||||||
|
|
||||||
final Drawable drawable = mCtx.getDrawable(resourceId);
|
|
||||||
|
|
||||||
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());
|
|
||||||
}
|
|
||||||
}))
|
|
||||||
.usePlugin(new AbstractMarkwonPlugin() {
|
|
||||||
@Override
|
|
||||||
public void configureTheme(@NonNull MarkwonTheme.Builder builder) {
|
|
||||||
builder
|
|
||||||
.codeTextColor(tinyDb.getInt("codeBlockColor"))
|
|
||||||
.codeBackgroundColor(tinyDb.getInt("codeBlockBackground"))
|
|
||||||
.linkColor(mCtx.getResources().getColor(R.color.lightBlue));
|
|
||||||
}
|
|
||||||
})
|
|
||||||
.usePlugin(TablePlugin.create(mCtx))
|
|
||||||
.usePlugin(TaskListPlugin.create(mCtx))
|
|
||||||
.usePlugin(HtmlPlugin.create())
|
|
||||||
.usePlugin(StrikethroughPlugin.create())
|
|
||||||
.usePlugin(LinkifyPlugin.create())
|
|
||||||
.build();
|
|
||||||
|
|
||||||
Spanned bodyWithMD = markwon.toMarkdown(EmojiParser.parseToUnicode(cleanIssueComments));
|
|
||||||
markwon.setParsedMarkdown(holder.issueComment, bodyWithMD);
|
|
||||||
|
|
||||||
String edited;
|
|
||||||
|
|
||||||
if(!currentItem.getUpdated_at().equals(currentItem.getCreated_at())) {
|
|
||||||
edited = mCtx.getResources().getString(R.string.colorfulBulletSpan) + mCtx.getResources().getString(R.string.modifiedText);
|
|
||||||
holder.commentModified.setVisibility(View.VISIBLE);
|
|
||||||
holder.commentModified.setText(edited);
|
|
||||||
holder.commentModified.setOnClickListener(new ClickListener(TimeHelper.customDateFormatForToastDateFormat(currentItem.getUpdated_at()), mCtx));
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
holder.commentModified.setVisibility(View.INVISIBLE);
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (timeFormat) {
|
|
||||||
case "pretty": {
|
|
||||||
PrettyTime prettyTime = new PrettyTime(new Locale(locale));
|
|
||||||
String createdTime = prettyTime.format(currentItem.getCreated_at());
|
|
||||||
holder.issueCommentDate.setText(createdTime);
|
|
||||||
holder.issueCommentDate.setOnClickListener(new ClickListener(TimeHelper.customDateFormatForToastDateFormat(currentItem.getCreated_at()), mCtx));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case "normal": {
|
|
||||||
DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd '" + mCtx.getResources().getString(R.string.timeAtText) + "' HH:mm", new Locale(locale));
|
|
||||||
String createdTime = formatter.format(currentItem.getCreated_at());
|
|
||||||
holder.issueCommentDate.setText(createdTime);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case "normal1": {
|
|
||||||
DateFormat formatter = new SimpleDateFormat("dd-MM-yyyy '" + mCtx.getResources().getString(R.string.timeAtText) + "' HH:mm", new Locale(locale));
|
|
||||||
String createdTime = formatter.format(currentItem.getCreated_at());
|
|
||||||
holder.issueCommentDate.setText(createdTime);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getItemCount() {
|
|
||||||
return issuesComments.size();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,133 +0,0 @@
|
|||||||
package org.mian.gitnex.adapters;
|
|
||||||
|
|
||||||
import android.annotation.SuppressLint;
|
|
||||||
import android.content.Context;
|
|
||||||
import android.view.LayoutInflater;
|
|
||||||
import android.view.View;
|
|
||||||
import android.view.ViewGroup;
|
|
||||||
import android.widget.BaseAdapter;
|
|
||||||
import android.widget.Filter;
|
|
||||||
import android.widget.Filterable;
|
|
||||||
import android.widget.ImageView;
|
|
||||||
import android.widget.TextView;
|
|
||||||
import com.squareup.picasso.Picasso;
|
|
||||||
import org.mian.gitnex.R;
|
|
||||||
import org.mian.gitnex.helpers.RoundedTransformation;
|
|
||||||
import org.mian.gitnex.models.UserInfo;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Author M M Arif
|
|
||||||
*/
|
|
||||||
|
|
||||||
public class MembersByOrgAdapter extends BaseAdapter implements Filterable {
|
|
||||||
|
|
||||||
private List<UserInfo> membersList;
|
|
||||||
private Context mCtx;
|
|
||||||
private List<UserInfo> membersListFull;
|
|
||||||
|
|
||||||
private class ViewHolder {
|
|
||||||
|
|
||||||
private ImageView memberAvatar;
|
|
||||||
private TextView memberName;
|
|
||||||
|
|
||||||
ViewHolder(View v) {
|
|
||||||
memberAvatar = v.findViewById(R.id.memberAvatar);
|
|
||||||
memberName = v.findViewById(R.id.memberName);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public MembersByOrgAdapter(Context mCtx, List<UserInfo> membersListMain) {
|
|
||||||
this.mCtx = mCtx;
|
|
||||||
this.membersList = membersListMain;
|
|
||||||
membersListFull = new ArrayList<>(membersList);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getCount() {
|
|
||||||
return membersList.size();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Object getItem(int position) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public long getItemId(int position) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
@SuppressLint("InflateParams")
|
|
||||||
@Override
|
|
||||||
public View getView(int position, View finalView, ViewGroup parent) {
|
|
||||||
|
|
||||||
MembersByOrgAdapter.ViewHolder viewHolder = null;
|
|
||||||
|
|
||||||
if (finalView == null) {
|
|
||||||
finalView = LayoutInflater.from(mCtx).inflate(R.layout.members_by_org_list, null);
|
|
||||||
viewHolder = new MembersByOrgAdapter.ViewHolder(finalView);
|
|
||||||
finalView.setTag(viewHolder);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
viewHolder = (MembersByOrgAdapter.ViewHolder) finalView.getTag();
|
|
||||||
}
|
|
||||||
|
|
||||||
initData(viewHolder, position);
|
|
||||||
return finalView;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
private void initData(MembersByOrgAdapter.ViewHolder viewHolder, int position) {
|
|
||||||
|
|
||||||
UserInfo currentItem = membersList.get(position);
|
|
||||||
Picasso.get().load(currentItem.getAvatar()).transform(new RoundedTransformation(100, 0)).resize(200, 200).centerCrop().into(viewHolder.memberAvatar);
|
|
||||||
|
|
||||||
if(!currentItem.getFullname().equals("")) {
|
|
||||||
viewHolder.memberName.setText(currentItem.getFullname());
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
viewHolder.memberName.setText(currentItem.getLogin());
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Filter getFilter() {
|
|
||||||
return membersFilter;
|
|
||||||
}
|
|
||||||
|
|
||||||
private Filter membersFilter = new Filter() {
|
|
||||||
@Override
|
|
||||||
protected FilterResults performFiltering(CharSequence constraint) {
|
|
||||||
List<UserInfo> filteredList = new ArrayList<>();
|
|
||||||
|
|
||||||
if (constraint == null || constraint.length() == 0) {
|
|
||||||
filteredList.addAll(membersListFull);
|
|
||||||
} else {
|
|
||||||
String filterPattern = constraint.toString().toLowerCase().trim();
|
|
||||||
|
|
||||||
for (UserInfo item : membersListFull) {
|
|
||||||
if (item.getFullname().toLowerCase().contains(filterPattern) || item.getLogin().toLowerCase().contains(filterPattern)) {
|
|
||||||
filteredList.add(item);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
FilterResults results = new FilterResults();
|
|
||||||
results.values = filteredList;
|
|
||||||
|
|
||||||
return results;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void publishResults(CharSequence constraint, FilterResults results) {
|
|
||||||
membersList.clear();
|
|
||||||
membersList.addAll((List) results.values);
|
|
||||||
notifyDataSetChanged();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
}
|
|
@ -1,239 +0,0 @@
|
|||||||
package org.mian.gitnex.adapters;
|
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import android.content.Intent;
|
|
||||||
import android.graphics.Typeface;
|
|
||||||
import android.view.LayoutInflater;
|
|
||||||
import android.view.MenuItem;
|
|
||||||
import android.view.View;
|
|
||||||
import android.view.ViewGroup;
|
|
||||||
import android.widget.Filter;
|
|
||||||
import android.widget.Filterable;
|
|
||||||
import android.widget.ImageView;
|
|
||||||
import android.widget.TextView;
|
|
||||||
import com.amulyakhare.textdrawable.TextDrawable;
|
|
||||||
import com.amulyakhare.textdrawable.util.ColorGenerator;
|
|
||||||
import org.mian.gitnex.R;
|
|
||||||
import org.mian.gitnex.activities.OpenRepoInBrowserActivity;
|
|
||||||
import org.mian.gitnex.activities.RepoDetailActivity;
|
|
||||||
import org.mian.gitnex.activities.RepoStargazersActivity;
|
|
||||||
import org.mian.gitnex.activities.RepoWatchersActivity;
|
|
||||||
import org.mian.gitnex.models.UserRepositories;
|
|
||||||
import org.mian.gitnex.util.TinyDB;
|
|
||||||
import java.lang.reflect.Field;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.List;
|
|
||||||
import androidx.annotation.NonNull;
|
|
||||||
import androidx.appcompat.view.ContextThemeWrapper;
|
|
||||||
import androidx.appcompat.widget.PopupMenu;
|
|
||||||
import androidx.recyclerview.widget.RecyclerView;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Author M M Arif
|
|
||||||
*/
|
|
||||||
|
|
||||||
public class MyReposListAdapter extends RecyclerView.Adapter<MyReposListAdapter.MyReposViewHolder> implements Filterable {
|
|
||||||
|
|
||||||
private List<UserRepositories> reposList;
|
|
||||||
private Context mCtx;
|
|
||||||
private List<UserRepositories> reposListFull;
|
|
||||||
|
|
||||||
static class MyReposViewHolder extends RecyclerView.ViewHolder {
|
|
||||||
|
|
||||||
private ImageView imageMy;
|
|
||||||
private TextView mTextView1My;
|
|
||||||
private TextView mTextView2My;
|
|
||||||
private TextView fullNameMy;
|
|
||||||
private ImageView repoPrivatePublicMy;
|
|
||||||
private TextView repoStarsMy;
|
|
||||||
private TextView repoWatchersMy;
|
|
||||||
private TextView repoOpenIssuesCountMy;
|
|
||||||
|
|
||||||
private MyReposViewHolder(View itemView) {
|
|
||||||
super(itemView);
|
|
||||||
mTextView1My = itemView.findViewById(R.id.repoNameMy);
|
|
||||||
mTextView2My = itemView.findViewById(R.id.repoDescriptionMy);
|
|
||||||
imageMy = itemView.findViewById(R.id.imageAvatarMy);
|
|
||||||
fullNameMy = itemView.findViewById(R.id.repoFullNameMy);
|
|
||||||
repoPrivatePublicMy = itemView.findViewById(R.id.imageRepoTypeMy);
|
|
||||||
repoStarsMy = itemView.findViewById(R.id.repoStarsMy);
|
|
||||||
repoWatchersMy = itemView.findViewById(R.id.repoWatchersMy);
|
|
||||||
repoOpenIssuesCountMy = itemView.findViewById(R.id.repoOpenIssuesCountMy);
|
|
||||||
ImageView reposDropdownMenu = itemView.findViewById(R.id.reposDropdownMenu);
|
|
||||||
|
|
||||||
itemView.setOnClickListener(new View.OnClickListener() {
|
|
||||||
@Override
|
|
||||||
public void onClick(View v) {
|
|
||||||
|
|
||||||
Context context = v.getContext();
|
|
||||||
|
|
||||||
Intent intent = new Intent(context, RepoDetailActivity.class);
|
|
||||||
intent.putExtra("repoFullName", fullNameMy.getText().toString());
|
|
||||||
|
|
||||||
TinyDB tinyDb = new TinyDB(context);
|
|
||||||
tinyDb.putString("repoFullName", fullNameMy.getText().toString());
|
|
||||||
tinyDb.putBoolean("resumeIssues", true);
|
|
||||||
context.startActivity(intent);
|
|
||||||
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
reposDropdownMenu.setOnClickListener(new View.OnClickListener() {
|
|
||||||
@Override
|
|
||||||
public void onClick(View v) {
|
|
||||||
|
|
||||||
final Context context = v.getContext();
|
|
||||||
Context context_ = new ContextThemeWrapper(context, R.style.popupMenuStyle);
|
|
||||||
|
|
||||||
PopupMenu popupMenu = new PopupMenu(context_, v);
|
|
||||||
popupMenu.inflate(R.menu.repo_dotted_list_menu);
|
|
||||||
|
|
||||||
Object menuHelper;
|
|
||||||
Class[] argTypes;
|
|
||||||
try {
|
|
||||||
|
|
||||||
Field fMenuHelper = PopupMenu.class.getDeclaredField("mPopup");
|
|
||||||
fMenuHelper.setAccessible(true);
|
|
||||||
menuHelper = fMenuHelper.get(popupMenu);
|
|
||||||
argTypes = new Class[] { boolean.class };
|
|
||||||
menuHelper.getClass().getDeclaredMethod("setForceShowIcon",
|
|
||||||
argTypes).invoke(menuHelper, true);
|
|
||||||
|
|
||||||
} catch (Exception e) {
|
|
||||||
|
|
||||||
popupMenu.show();
|
|
||||||
return;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
|
|
||||||
@Override
|
|
||||||
public boolean onMenuItemClick(MenuItem item) {
|
|
||||||
switch (item.getItemId()) {
|
|
||||||
case R.id.repoStargazers:
|
|
||||||
|
|
||||||
Intent intent = new Intent(context, RepoStargazersActivity.class);
|
|
||||||
intent.putExtra("repoFullNameForStars", fullNameMy.getText());
|
|
||||||
context.startActivity(intent);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case R.id.repoWatchers:
|
|
||||||
|
|
||||||
Intent intentW = new Intent(context, RepoWatchersActivity.class);
|
|
||||||
intentW.putExtra("repoFullNameForWatchers", fullNameMy.getText());
|
|
||||||
context.startActivity(intentW);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case R.id.repoOpenInBrowser:
|
|
||||||
|
|
||||||
Intent intentOpenInBrowser = new Intent(context, OpenRepoInBrowserActivity.class);
|
|
||||||
intentOpenInBrowser.putExtra("repoFullNameBrowser", fullNameMy.getText());
|
|
||||||
context.startActivity(intentOpenInBrowser);
|
|
||||||
break;
|
|
||||||
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
popupMenu.show();
|
|
||||||
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public MyReposListAdapter(Context mCtx, List<UserRepositories> reposListMain) {
|
|
||||||
this.mCtx = mCtx;
|
|
||||||
this.reposList = reposListMain;
|
|
||||||
reposListFull = new ArrayList<>(reposList);
|
|
||||||
}
|
|
||||||
|
|
||||||
@NonNull
|
|
||||||
@Override
|
|
||||||
public MyReposListAdapter.MyReposViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
|
|
||||||
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.my_repos_list, parent, false);
|
|
||||||
return new MyReposListAdapter.MyReposViewHolder(v);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onBindViewHolder(@NonNull MyReposListAdapter.MyReposViewHolder holder, int position) {
|
|
||||||
|
|
||||||
UserRepositories currentItem = reposList.get(position);
|
|
||||||
holder.mTextView2My.setVisibility(View.GONE);
|
|
||||||
|
|
||||||
ColorGenerator generator = ColorGenerator.MATERIAL;
|
|
||||||
int color = generator.getColor(currentItem.getName());
|
|
||||||
String charac = String.valueOf(currentItem.getName().charAt(0));
|
|
||||||
|
|
||||||
TextDrawable drawable = TextDrawable.builder()
|
|
||||||
.beginConfig()
|
|
||||||
.useFont(Typeface.DEFAULT)
|
|
||||||
.fontSize(16)
|
|
||||||
.toUpperCase()
|
|
||||||
.width(28)
|
|
||||||
.height(28)
|
|
||||||
.endConfig()
|
|
||||||
.buildRound(charac, color);
|
|
||||||
|
|
||||||
holder.imageMy.setImageDrawable(drawable);
|
|
||||||
holder.mTextView1My.setText(currentItem.getName());
|
|
||||||
if (!currentItem.getDescription().equals("")) {
|
|
||||||
holder.mTextView2My.setVisibility(View.VISIBLE);
|
|
||||||
holder.mTextView2My.setText(currentItem.getDescription());
|
|
||||||
}
|
|
||||||
holder.fullNameMy.setText(currentItem.getFullname());
|
|
||||||
if(currentItem.getPrivateFlag()) {
|
|
||||||
holder.repoPrivatePublicMy.setImageResource(R.drawable.ic_lock_bold);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
holder.repoPrivatePublicMy.setImageResource(R.drawable.ic_public);
|
|
||||||
}
|
|
||||||
holder.repoStarsMy.setText(currentItem.getStars_count());
|
|
||||||
holder.repoWatchersMy.setText(currentItem.getWatchers_count());
|
|
||||||
holder.repoOpenIssuesCountMy.setText(currentItem.getOpen_issues_count());
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getItemCount() {
|
|
||||||
return reposList.size();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Filter getFilter() {
|
|
||||||
return myReposFilter;
|
|
||||||
}
|
|
||||||
|
|
||||||
private Filter myReposFilter = new Filter() {
|
|
||||||
@Override
|
|
||||||
protected FilterResults performFiltering(CharSequence constraint) {
|
|
||||||
List<UserRepositories> filteredList = new ArrayList<>();
|
|
||||||
|
|
||||||
if (constraint == null || constraint.length() == 0) {
|
|
||||||
filteredList.addAll(reposListFull);
|
|
||||||
} else {
|
|
||||||
String filterPattern = constraint.toString().toLowerCase().trim();
|
|
||||||
|
|
||||||
for (UserRepositories item : reposListFull) {
|
|
||||||
if (item.getFullname().toLowerCase().contains(filterPattern) || item.getDescription().toLowerCase().contains(filterPattern)) {
|
|
||||||
filteredList.add(item);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
FilterResults results = new FilterResults();
|
|
||||||
results.values = filteredList;
|
|
||||||
|
|
||||||
return results;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void publishResults(CharSequence constraint, FilterResults results) {
|
|
||||||
reposList.clear();
|
|
||||||
reposList.addAll((List) results.values);
|
|
||||||
notifyDataSetChanged();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
@ -1,132 +0,0 @@
|
|||||||
package org.mian.gitnex.adapters;
|
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
|
||||||
import androidx.recyclerview.widget.RecyclerView;
|
|
||||||
import android.content.Context;
|
|
||||||
import android.content.Intent;
|
|
||||||
import android.view.LayoutInflater;
|
|
||||||
import android.view.View;
|
|
||||||
import android.view.ViewGroup;
|
|
||||||
import android.widget.Filter;
|
|
||||||
import android.widget.Filterable;
|
|
||||||
import android.widget.ImageView;
|
|
||||||
import android.widget.TextView;
|
|
||||||
import com.squareup.picasso.Picasso;
|
|
||||||
import org.mian.gitnex.R;
|
|
||||||
import org.mian.gitnex.activities.OrgDetailActivity;
|
|
||||||
import org.mian.gitnex.models.UserOrganizations;
|
|
||||||
import org.mian.gitnex.helpers.RoundedTransformation;
|
|
||||||
import org.mian.gitnex.util.TinyDB;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Author M M Arif
|
|
||||||
*/
|
|
||||||
|
|
||||||
public class OrganizationsListAdapter extends RecyclerView.Adapter<OrganizationsListAdapter.OrganizationsViewHolder> implements Filterable {
|
|
||||||
|
|
||||||
private List<UserOrganizations> orgList;
|
|
||||||
private Context mCtx;
|
|
||||||
private List<UserOrganizations> orgListFull;
|
|
||||||
|
|
||||||
static class OrganizationsViewHolder extends RecyclerView.ViewHolder {
|
|
||||||
|
|
||||||
private ImageView image;
|
|
||||||
private TextView mTextView1;
|
|
||||||
private TextView mTextView2;
|
|
||||||
|
|
||||||
private OrganizationsViewHolder(View itemView) {
|
|
||||||
super(itemView);
|
|
||||||
mTextView1 = itemView.findViewById(R.id.orgUsername);
|
|
||||||
mTextView2 = itemView.findViewById(R.id.orgDescription);
|
|
||||||
image = itemView.findViewById(R.id.imageAvatar);
|
|
||||||
|
|
||||||
itemView.setOnClickListener(new View.OnClickListener() {
|
|
||||||
@Override
|
|
||||||
public void onClick(View v) {
|
|
||||||
|
|
||||||
Context context = v.getContext();
|
|
||||||
Intent intent = new Intent(context, OrgDetailActivity.class);
|
|
||||||
intent.putExtra("orgName", mTextView1.getText().toString());
|
|
||||||
|
|
||||||
TinyDB tinyDb = new TinyDB(context);
|
|
||||||
tinyDb.putString("orgName", mTextView1.getText().toString());
|
|
||||||
context.startActivity(intent);
|
|
||||||
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public OrganizationsListAdapter(Context mCtx, List<UserOrganizations> orgsListMain) {
|
|
||||||
this.mCtx = mCtx;
|
|
||||||
this.orgList = orgsListMain;
|
|
||||||
orgListFull = new ArrayList<>(orgList);
|
|
||||||
}
|
|
||||||
|
|
||||||
@NonNull
|
|
||||||
@Override
|
|
||||||
public OrganizationsViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
|
|
||||||
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.organizations_list, parent, false);
|
|
||||||
return new OrganizationsViewHolder(v);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onBindViewHolder(@NonNull OrganizationsViewHolder holder, int position) {
|
|
||||||
|
|
||||||
UserOrganizations currentItem = orgList.get(position);
|
|
||||||
holder.mTextView2.setVisibility(View.GONE);
|
|
||||||
|
|
||||||
Picasso.get().load(currentItem.getAvatar_url()).transform(new RoundedTransformation(100, 0)).resize(200, 200).centerCrop().into(holder.image);
|
|
||||||
holder.mTextView1.setText(currentItem.getUsername());
|
|
||||||
if (!currentItem.getDescription().equals("")) {
|
|
||||||
holder.mTextView2.setVisibility(View.VISIBLE);
|
|
||||||
holder.mTextView2.setText(currentItem.getDescription());
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getItemCount() {
|
|
||||||
return orgList.size();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Filter getFilter() {
|
|
||||||
return orgFilter;
|
|
||||||
}
|
|
||||||
|
|
||||||
private Filter orgFilter = new Filter() {
|
|
||||||
@Override
|
|
||||||
protected FilterResults performFiltering(CharSequence constraint) {
|
|
||||||
List<UserOrganizations> filteredList = new ArrayList<>();
|
|
||||||
|
|
||||||
if (constraint == null || constraint.length() == 0) {
|
|
||||||
filteredList.addAll(orgListFull);
|
|
||||||
} else {
|
|
||||||
String filterPattern = constraint.toString().toLowerCase().trim();
|
|
||||||
|
|
||||||
for (UserOrganizations item : orgListFull) {
|
|
||||||
if (item.getUsername().toLowerCase().contains(filterPattern) || item.getDescription().toLowerCase().contains(filterPattern)) {
|
|
||||||
filteredList.add(item);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
FilterResults results = new FilterResults();
|
|
||||||
results.values = filteredList;
|
|
||||||
|
|
||||||
return results;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void publishResults(CharSequence constraint, FilterResults results) {
|
|
||||||
orgList.clear();
|
|
||||||
orgList.addAll((List) results.values);
|
|
||||||
notifyDataSetChanged();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
}
|
|
@ -1,78 +0,0 @@
|
|||||||
package org.mian.gitnex.adapters;
|
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import android.view.LayoutInflater;
|
|
||||||
import android.view.View;
|
|
||||||
import android.view.ViewGroup;
|
|
||||||
import android.widget.ImageView;
|
|
||||||
import android.widget.TextView;
|
|
||||||
import com.squareup.picasso.Picasso;
|
|
||||||
import org.mian.gitnex.R;
|
|
||||||
import org.mian.gitnex.helpers.RoundedTransformation;
|
|
||||||
import org.mian.gitnex.models.UserInfo;
|
|
||||||
import java.util.List;
|
|
||||||
import androidx.annotation.NonNull;
|
|
||||||
import androidx.recyclerview.widget.RecyclerView;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Author M M Arif
|
|
||||||
*/
|
|
||||||
|
|
||||||
public class ProfileFollowersAdapter extends RecyclerView.Adapter<ProfileFollowersAdapter.FollowersViewHolder> {
|
|
||||||
|
|
||||||
private List<UserInfo> followersList;
|
|
||||||
private Context mCtx;
|
|
||||||
|
|
||||||
static class FollowersViewHolder extends RecyclerView.ViewHolder {
|
|
||||||
|
|
||||||
private ImageView userAvatar;
|
|
||||||
private TextView userFullName;
|
|
||||||
private TextView userName;
|
|
||||||
|
|
||||||
private FollowersViewHolder(View itemView) {
|
|
||||||
super(itemView);
|
|
||||||
|
|
||||||
userAvatar = itemView.findViewById(R.id.userAvatar);
|
|
||||||
userFullName = itemView.findViewById(R.id.userFullName);
|
|
||||||
userName = itemView.findViewById(R.id.userName);
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public ProfileFollowersAdapter(Context mCtx, List<UserInfo> followersListMain) {
|
|
||||||
this.mCtx = mCtx;
|
|
||||||
this.followersList = followersListMain;
|
|
||||||
}
|
|
||||||
|
|
||||||
@NonNull
|
|
||||||
@Override
|
|
||||||
public ProfileFollowersAdapter.FollowersViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
|
|
||||||
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.profile_followers_list, parent, false);
|
|
||||||
return new ProfileFollowersAdapter.FollowersViewHolder(v);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onBindViewHolder(@NonNull ProfileFollowersAdapter.FollowersViewHolder holder, int position) {
|
|
||||||
|
|
||||||
UserInfo currentItem = followersList.get(position);
|
|
||||||
|
|
||||||
if(!currentItem.getFullname().equals("")) {
|
|
||||||
holder.userFullName.setText(currentItem.getFullname());
|
|
||||||
holder.userName.setText(mCtx.getResources().getString(R.string.usernameWithAt, currentItem.getUsername()));
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
holder.userFullName.setText(mCtx.getResources().getString(R.string.usernameWithAt, currentItem.getUsername()));
|
|
||||||
holder.userName.setVisibility(View.GONE);
|
|
||||||
}
|
|
||||||
|
|
||||||
Picasso.get().load(currentItem.getAvatar()).transform(new RoundedTransformation(100, 0)).resize(140, 140).centerCrop().into(holder.userAvatar);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getItemCount() {
|
|
||||||
return followersList.size();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
@ -1,77 +0,0 @@
|
|||||||
package org.mian.gitnex.adapters;
|
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import android.view.LayoutInflater;
|
|
||||||
import android.view.View;
|
|
||||||
import android.view.ViewGroup;
|
|
||||||
import android.widget.ImageView;
|
|
||||||
import android.widget.TextView;
|
|
||||||
import com.squareup.picasso.Picasso;
|
|
||||||
import org.mian.gitnex.R;
|
|
||||||
import org.mian.gitnex.helpers.RoundedTransformation;
|
|
||||||
import org.mian.gitnex.models.UserInfo;
|
|
||||||
import java.util.List;
|
|
||||||
import androidx.annotation.NonNull;
|
|
||||||
import androidx.recyclerview.widget.RecyclerView;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Author M M Arif
|
|
||||||
*/
|
|
||||||
|
|
||||||
public class ProfileFollowingAdapter extends RecyclerView.Adapter<ProfileFollowingAdapter.FollowingViewHolder> {
|
|
||||||
|
|
||||||
private List<UserInfo> followingList;
|
|
||||||
private Context mCtx;
|
|
||||||
|
|
||||||
static class FollowingViewHolder extends RecyclerView.ViewHolder {
|
|
||||||
|
|
||||||
private ImageView userAvatar;
|
|
||||||
private TextView userFullName;
|
|
||||||
private TextView userName;
|
|
||||||
|
|
||||||
private FollowingViewHolder(View itemView) {
|
|
||||||
super(itemView);
|
|
||||||
|
|
||||||
userAvatar = itemView.findViewById(R.id.userAvatar);
|
|
||||||
userFullName = itemView.findViewById(R.id.userFullName);
|
|
||||||
userName = itemView.findViewById(R.id.userName);
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public ProfileFollowingAdapter(Context mCtx, List<UserInfo> followingListMain) {
|
|
||||||
this.mCtx = mCtx;
|
|
||||||
this.followingList = followingListMain;
|
|
||||||
}
|
|
||||||
|
|
||||||
@NonNull
|
|
||||||
@Override
|
|
||||||
public ProfileFollowingAdapter.FollowingViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
|
|
||||||
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.profile_following_list, parent, false);
|
|
||||||
return new ProfileFollowingAdapter.FollowingViewHolder(v);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onBindViewHolder(@NonNull ProfileFollowingAdapter.FollowingViewHolder holder, int position) {
|
|
||||||
|
|
||||||
UserInfo currentItem = followingList.get(position);
|
|
||||||
|
|
||||||
if(!currentItem.getFullname().equals("")) {
|
|
||||||
holder.userFullName.setText(currentItem.getFullname());
|
|
||||||
holder.userName.setText(mCtx.getResources().getString(R.string.usernameWithAt, currentItem.getUsername()));
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
holder.userFullName.setText(mCtx.getResources().getString(R.string.usernameWithAt, currentItem.getUsername()));
|
|
||||||
holder.userName.setVisibility(View.GONE);
|
|
||||||
}
|
|
||||||
|
|
||||||
Picasso.get().load(currentItem.getAvatar()).transform(new RoundedTransformation(100, 0)).resize(140, 140).centerCrop().into(holder.userAvatar);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getItemCount() {
|
|
||||||
return followingList.size();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
@ -1,242 +0,0 @@
|
|||||||
package org.mian.gitnex.adapters;
|
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import android.content.Intent;
|
|
||||||
import android.graphics.Typeface;
|
|
||||||
import androidx.annotation.NonNull;
|
|
||||||
import androidx.appcompat.view.ContextThemeWrapper;
|
|
||||||
import androidx.appcompat.widget.PopupMenu;
|
|
||||||
import androidx.recyclerview.widget.RecyclerView;
|
|
||||||
import android.view.LayoutInflater;
|
|
||||||
import android.view.MenuItem;
|
|
||||||
import android.view.View;
|
|
||||||
import android.view.ViewGroup;
|
|
||||||
import android.widget.Filter;
|
|
||||||
import android.widget.Filterable;
|
|
||||||
import android.widget.ImageView;
|
|
||||||
import android.widget.TextView;
|
|
||||||
import com.amulyakhare.textdrawable.TextDrawable;
|
|
||||||
import com.amulyakhare.textdrawable.util.ColorGenerator;
|
|
||||||
import org.mian.gitnex.R;
|
|
||||||
import org.mian.gitnex.activities.OpenRepoInBrowserActivity;
|
|
||||||
import org.mian.gitnex.activities.RepoDetailActivity;
|
|
||||||
import org.mian.gitnex.activities.RepoStargazersActivity;
|
|
||||||
import org.mian.gitnex.activities.RepoWatchersActivity;
|
|
||||||
import org.mian.gitnex.models.UserRepositories;
|
|
||||||
import org.mian.gitnex.util.TinyDB;
|
|
||||||
import java.lang.reflect.Field;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Author M M Arif
|
|
||||||
*/
|
|
||||||
|
|
||||||
public class ReposListAdapter extends RecyclerView.Adapter<ReposListAdapter.ReposViewHolder> implements Filterable {
|
|
||||||
|
|
||||||
private List<UserRepositories> reposList;
|
|
||||||
private Context mCtx;
|
|
||||||
private List<UserRepositories> reposListFull;
|
|
||||||
|
|
||||||
static class ReposViewHolder extends RecyclerView.ViewHolder {
|
|
||||||
|
|
||||||
private ImageView image;
|
|
||||||
private TextView mTextView1;
|
|
||||||
private TextView mTextView2;
|
|
||||||
private TextView fullName;
|
|
||||||
private ImageView repoPrivatePublic;
|
|
||||||
private TextView repoStars;
|
|
||||||
private TextView repoWatchers;
|
|
||||||
private TextView repoOpenIssuesCount;
|
|
||||||
|
|
||||||
private ReposViewHolder(View itemView) {
|
|
||||||
|
|
||||||
super(itemView);
|
|
||||||
mTextView1 = itemView.findViewById(R.id.repoName);
|
|
||||||
mTextView2 = itemView.findViewById(R.id.repoDescription);
|
|
||||||
image = itemView.findViewById(R.id.imageAvatar);
|
|
||||||
fullName = itemView.findViewById(R.id.repoFullName);
|
|
||||||
repoPrivatePublic = itemView.findViewById(R.id.imageRepoType);
|
|
||||||
repoStars = itemView.findViewById(R.id.repoStars);
|
|
||||||
repoWatchers = itemView.findViewById(R.id.repoWatchers);
|
|
||||||
repoOpenIssuesCount = itemView.findViewById(R.id.repoOpenIssuesCount);
|
|
||||||
ImageView reposDropdownMenu = itemView.findViewById(R.id.reposDropdownMenu);
|
|
||||||
|
|
||||||
itemView.setOnClickListener(new View.OnClickListener() {
|
|
||||||
@Override
|
|
||||||
public void onClick(View v) {
|
|
||||||
|
|
||||||
Context context = v.getContext();
|
|
||||||
TextView repoFullName = v.findViewById(R.id.repoFullName);
|
|
||||||
|
|
||||||
Intent intent = new Intent(context, RepoDetailActivity.class);
|
|
||||||
intent.putExtra("repoFullName", repoFullName.getText().toString());
|
|
||||||
|
|
||||||
TinyDB tinyDb = new TinyDB(context);
|
|
||||||
tinyDb.putString("repoFullName", repoFullName.getText().toString());
|
|
||||||
tinyDb.putBoolean("resumeIssues", true);
|
|
||||||
context.startActivity(intent);
|
|
||||||
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
reposDropdownMenu.setOnClickListener(new View.OnClickListener() {
|
|
||||||
@Override
|
|
||||||
public void onClick(View v) {
|
|
||||||
|
|
||||||
final Context context = v.getContext();
|
|
||||||
Context context_ = new ContextThemeWrapper(context, R.style.popupMenuStyle);
|
|
||||||
|
|
||||||
PopupMenu popupMenu = new PopupMenu(context_, v);
|
|
||||||
popupMenu.inflate(R.menu.repo_dotted_list_menu);
|
|
||||||
|
|
||||||
Object menuHelper;
|
|
||||||
Class[] argTypes;
|
|
||||||
try {
|
|
||||||
|
|
||||||
Field fMenuHelper = PopupMenu.class.getDeclaredField("mPopup");
|
|
||||||
fMenuHelper.setAccessible(true);
|
|
||||||
menuHelper = fMenuHelper.get(popupMenu);
|
|
||||||
argTypes = new Class[] { boolean.class };
|
|
||||||
menuHelper.getClass().getDeclaredMethod("setForceShowIcon",
|
|
||||||
argTypes).invoke(menuHelper, true);
|
|
||||||
|
|
||||||
} catch (Exception e) {
|
|
||||||
|
|
||||||
popupMenu.show();
|
|
||||||
return;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
|
|
||||||
@Override
|
|
||||||
public boolean onMenuItemClick(MenuItem item) {
|
|
||||||
switch (item.getItemId()) {
|
|
||||||
case R.id.repoStargazers:
|
|
||||||
|
|
||||||
Intent intent = new Intent(context, RepoStargazersActivity.class);
|
|
||||||
intent.putExtra("repoFullNameForStars", fullName.getText());
|
|
||||||
context.startActivity(intent);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case R.id.repoWatchers:
|
|
||||||
|
|
||||||
Intent intentW = new Intent(context, RepoWatchersActivity.class);
|
|
||||||
intentW.putExtra("repoFullNameForWatchers", fullName.getText());
|
|
||||||
context.startActivity(intentW);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case R.id.repoOpenInBrowser:
|
|
||||||
|
|
||||||
Intent intentOpenInBrowser = new Intent(context, OpenRepoInBrowserActivity.class);
|
|
||||||
intentOpenInBrowser.putExtra("repoFullNameBrowser", fullName.getText());
|
|
||||||
context.startActivity(intentOpenInBrowser);
|
|
||||||
break;
|
|
||||||
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
popupMenu.show();
|
|
||||||
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public ReposListAdapter(Context mCtx, List<UserRepositories> reposListMain) {
|
|
||||||
this.mCtx = mCtx;
|
|
||||||
this.reposList = reposListMain;
|
|
||||||
reposListFull = new ArrayList<>(reposList);
|
|
||||||
}
|
|
||||||
|
|
||||||
@NonNull
|
|
||||||
@Override
|
|
||||||
public ReposViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
|
|
||||||
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.repos_list, parent, false);
|
|
||||||
return new ReposViewHolder(v);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onBindViewHolder(@NonNull ReposViewHolder holder, int position) {
|
|
||||||
|
|
||||||
UserRepositories currentItem = reposList.get(position);
|
|
||||||
holder.mTextView2.setVisibility(View.GONE);
|
|
||||||
|
|
||||||
ColorGenerator generator = ColorGenerator.MATERIAL;
|
|
||||||
int color = generator.getColor(currentItem.getName());
|
|
||||||
String charac = String.valueOf(currentItem.getName().charAt(0));
|
|
||||||
|
|
||||||
TextDrawable drawable = TextDrawable.builder()
|
|
||||||
.beginConfig()
|
|
||||||
.useFont(Typeface.DEFAULT)
|
|
||||||
.fontSize(16)
|
|
||||||
.toUpperCase()
|
|
||||||
.width(28)
|
|
||||||
.height(28)
|
|
||||||
.endConfig()
|
|
||||||
.buildRound(charac, color);
|
|
||||||
|
|
||||||
holder.image.setImageDrawable(drawable);
|
|
||||||
holder.mTextView1.setText(currentItem.getName());
|
|
||||||
if (!currentItem.getDescription().equals("")) {
|
|
||||||
holder.mTextView2.setVisibility(View.VISIBLE);
|
|
||||||
holder.mTextView2.setText(currentItem.getDescription());
|
|
||||||
}
|
|
||||||
holder.fullName.setText(currentItem.getFullname());
|
|
||||||
if(currentItem.getPrivateFlag()) {
|
|
||||||
holder.repoPrivatePublic.setImageResource(R.drawable.ic_lock_bold);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
holder.repoPrivatePublic.setImageResource(R.drawable.ic_public);
|
|
||||||
}
|
|
||||||
holder.repoStars.setText(currentItem.getStars_count());
|
|
||||||
holder.repoWatchers.setText(currentItem.getWatchers_count());
|
|
||||||
holder.repoOpenIssuesCount.setText(currentItem.getOpen_issues_count());
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getItemCount() {
|
|
||||||
return reposList.size();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Filter getFilter() {
|
|
||||||
return reposFilter;
|
|
||||||
}
|
|
||||||
|
|
||||||
private Filter reposFilter = new Filter() {
|
|
||||||
@Override
|
|
||||||
protected FilterResults performFiltering(CharSequence constraint) {
|
|
||||||
List<UserRepositories> filteredList = new ArrayList<>();
|
|
||||||
|
|
||||||
if (constraint == null || constraint.length() == 0) {
|
|
||||||
filteredList.addAll(reposListFull);
|
|
||||||
} else {
|
|
||||||
String filterPattern = constraint.toString().toLowerCase().trim();
|
|
||||||
|
|
||||||
for (UserRepositories item : reposListFull) {
|
|
||||||
if (item.getFullname().toLowerCase().contains(filterPattern) || item.getDescription().toLowerCase().contains(filterPattern)) {
|
|
||||||
filteredList.add(item);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
FilterResults results = new FilterResults();
|
|
||||||
results.values = filteredList;
|
|
||||||
|
|
||||||
return results;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void publishResults(CharSequence constraint, FilterResults results) {
|
|
||||||
reposList.clear();
|
|
||||||
reposList.addAll((List) results.values);
|
|
||||||
notifyDataSetChanged();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
}
|
|
@ -1,241 +0,0 @@
|
|||||||
package org.mian.gitnex.adapters;
|
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import android.content.Intent;
|
|
||||||
import android.graphics.Typeface;
|
|
||||||
import android.view.LayoutInflater;
|
|
||||||
import android.view.MenuItem;
|
|
||||||
import android.view.View;
|
|
||||||
import android.view.ViewGroup;
|
|
||||||
import android.widget.Filter;
|
|
||||||
import android.widget.Filterable;
|
|
||||||
import android.widget.ImageView;
|
|
||||||
import android.widget.TextView;
|
|
||||||
import com.amulyakhare.textdrawable.TextDrawable;
|
|
||||||
import com.amulyakhare.textdrawable.util.ColorGenerator;
|
|
||||||
import org.mian.gitnex.R;
|
|
||||||
import org.mian.gitnex.activities.OpenRepoInBrowserActivity;
|
|
||||||
import org.mian.gitnex.activities.RepoDetailActivity;
|
|
||||||
import org.mian.gitnex.activities.RepoStargazersActivity;
|
|
||||||
import org.mian.gitnex.activities.RepoWatchersActivity;
|
|
||||||
import org.mian.gitnex.models.UserRepositories;
|
|
||||||
import org.mian.gitnex.util.TinyDB;
|
|
||||||
import java.lang.reflect.Field;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.List;
|
|
||||||
import androidx.annotation.NonNull;
|
|
||||||
import androidx.appcompat.view.ContextThemeWrapper;
|
|
||||||
import androidx.appcompat.widget.PopupMenu;
|
|
||||||
import androidx.recyclerview.widget.RecyclerView;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Author M M Arif
|
|
||||||
*/
|
|
||||||
|
|
||||||
public class RepositoriesByOrgAdapter extends RecyclerView.Adapter<RepositoriesByOrgAdapter.OrgReposViewHolder> implements Filterable {
|
|
||||||
|
|
||||||
private List<UserRepositories> reposList;
|
|
||||||
private Context mCtx;
|
|
||||||
private List<UserRepositories> reposListFull;
|
|
||||||
|
|
||||||
static class OrgReposViewHolder extends RecyclerView.ViewHolder {
|
|
||||||
|
|
||||||
private ImageView image;
|
|
||||||
private TextView mTextView1;
|
|
||||||
private TextView mTextView2;
|
|
||||||
private TextView fullName;
|
|
||||||
private ImageView repoPrivatePublic;
|
|
||||||
private TextView repoStars;
|
|
||||||
private TextView repoWatchers;
|
|
||||||
private TextView repoOpenIssuesCount;
|
|
||||||
|
|
||||||
private OrgReposViewHolder(View itemView) {
|
|
||||||
super(itemView);
|
|
||||||
mTextView1 = itemView.findViewById(R.id.repoName);
|
|
||||||
mTextView2 = itemView.findViewById(R.id.repoDescription);
|
|
||||||
image = itemView.findViewById(R.id.imageAvatar);
|
|
||||||
fullName = itemView.findViewById(R.id.repoFullName);
|
|
||||||
repoPrivatePublic = itemView.findViewById(R.id.imageRepoType);
|
|
||||||
repoStars = itemView.findViewById(R.id.repoStars);
|
|
||||||
repoWatchers = itemView.findViewById(R.id.repoWatchers);
|
|
||||||
repoOpenIssuesCount = itemView.findViewById(R.id.repoOpenIssuesCount);
|
|
||||||
ImageView reposDropdownMenu = itemView.findViewById(R.id.reposDropdownMenu);
|
|
||||||
|
|
||||||
itemView.setOnClickListener(new View.OnClickListener() {
|
|
||||||
@Override
|
|
||||||
public void onClick(View v) {
|
|
||||||
|
|
||||||
Context context = v.getContext();
|
|
||||||
|
|
||||||
Intent intent = new Intent(context, RepoDetailActivity.class);
|
|
||||||
intent.putExtra("repoFullName", fullName.getText().toString());
|
|
||||||
|
|
||||||
TinyDB tinyDb = new TinyDB(context);
|
|
||||||
tinyDb.putString("repoFullName", fullName.getText().toString());
|
|
||||||
tinyDb.putBoolean("resumeIssues", true);
|
|
||||||
context.startActivity(intent);
|
|
||||||
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
reposDropdownMenu.setOnClickListener(new View.OnClickListener() {
|
|
||||||
@Override
|
|
||||||
public void onClick(View v) {
|
|
||||||
|
|
||||||
final Context context = v.getContext();
|
|
||||||
Context context_ = new ContextThemeWrapper(context, R.style.popupMenuStyle);
|
|
||||||
|
|
||||||
PopupMenu popupMenu = new PopupMenu(context_, v);
|
|
||||||
popupMenu.inflate(R.menu.repo_dotted_list_menu);
|
|
||||||
|
|
||||||
Object menuHelper;
|
|
||||||
Class[] argTypes;
|
|
||||||
try {
|
|
||||||
|
|
||||||
Field fMenuHelper = PopupMenu.class.getDeclaredField("mPopup");
|
|
||||||
fMenuHelper.setAccessible(true);
|
|
||||||
menuHelper = fMenuHelper.get(popupMenu);
|
|
||||||
argTypes = new Class[] { boolean.class };
|
|
||||||
menuHelper.getClass().getDeclaredMethod("setForceShowIcon",
|
|
||||||
argTypes).invoke(menuHelper, true);
|
|
||||||
|
|
||||||
} catch (Exception e) {
|
|
||||||
|
|
||||||
popupMenu.show();
|
|
||||||
return;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
|
|
||||||
@Override
|
|
||||||
public boolean onMenuItemClick(MenuItem item) {
|
|
||||||
switch (item.getItemId()) {
|
|
||||||
case R.id.repoStargazers:
|
|
||||||
|
|
||||||
Intent intent = new Intent(context, RepoStargazersActivity.class);
|
|
||||||
intent.putExtra("repoFullNameForStars", fullName.getText());
|
|
||||||
context.startActivity(intent);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case R.id.repoWatchers:
|
|
||||||
|
|
||||||
Intent intentW = new Intent(context, RepoWatchersActivity.class);
|
|
||||||
intentW.putExtra("repoFullNameForWatchers", fullName.getText());
|
|
||||||
context.startActivity(intentW);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case R.id.repoOpenInBrowser:
|
|
||||||
|
|
||||||
Intent intentOpenInBrowser = new Intent(context, OpenRepoInBrowserActivity.class);
|
|
||||||
intentOpenInBrowser.putExtra("repoFullNameBrowser", fullName.getText());
|
|
||||||
context.startActivity(intentOpenInBrowser);
|
|
||||||
break;
|
|
||||||
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
popupMenu.show();
|
|
||||||
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public RepositoriesByOrgAdapter(Context mCtx, List<UserRepositories> reposListMain) {
|
|
||||||
this.mCtx = mCtx;
|
|
||||||
this.reposList = reposListMain;
|
|
||||||
reposListFull = new ArrayList<>(reposList);
|
|
||||||
}
|
|
||||||
|
|
||||||
@NonNull
|
|
||||||
@Override
|
|
||||||
public RepositoriesByOrgAdapter.OrgReposViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
|
|
||||||
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.repositories_by_org_list, parent, false);
|
|
||||||
return new RepositoriesByOrgAdapter.OrgReposViewHolder(v);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onBindViewHolder(@NonNull RepositoriesByOrgAdapter.OrgReposViewHolder holder, int position) {
|
|
||||||
|
|
||||||
UserRepositories currentItem = reposList.get(position);
|
|
||||||
holder.mTextView2.setVisibility(View.GONE);
|
|
||||||
|
|
||||||
ColorGenerator generator = ColorGenerator.MATERIAL;
|
|
||||||
int color = generator.getColor(currentItem.getName());
|
|
||||||
String charac = String.valueOf(currentItem.getName().charAt(0));
|
|
||||||
|
|
||||||
TextDrawable drawable = TextDrawable.builder()
|
|
||||||
.beginConfig()
|
|
||||||
.useFont(Typeface.DEFAULT)
|
|
||||||
.fontSize(16)
|
|
||||||
.toUpperCase()
|
|
||||||
.width(28)
|
|
||||||
.height(28)
|
|
||||||
.endConfig()
|
|
||||||
.buildRound(charac, color);
|
|
||||||
|
|
||||||
holder.image.setImageDrawable(drawable);
|
|
||||||
holder.mTextView1.setText(currentItem.getName());
|
|
||||||
if (!currentItem.getDescription().equals("")) {
|
|
||||||
holder.mTextView2.setVisibility(View.VISIBLE);
|
|
||||||
holder.mTextView2.setText(currentItem.getDescription());
|
|
||||||
}
|
|
||||||
holder.fullName.setText(currentItem.getFullname());
|
|
||||||
if(currentItem.getPrivateFlag()) {
|
|
||||||
holder.repoPrivatePublic.setImageResource(R.drawable.ic_lock_bold);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
holder.repoPrivatePublic.setImageResource(R.drawable.ic_public);
|
|
||||||
}
|
|
||||||
holder.repoStars.setText(currentItem.getStars_count());
|
|
||||||
holder.repoWatchers.setText(currentItem.getWatchers_count());
|
|
||||||
holder.repoOpenIssuesCount.setText(currentItem.getOpen_issues_count());
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getItemCount() {
|
|
||||||
return reposList.size();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Filter getFilter() {
|
|
||||||
return orgReposFilter;
|
|
||||||
}
|
|
||||||
|
|
||||||
private Filter orgReposFilter = new Filter() {
|
|
||||||
@Override
|
|
||||||
protected FilterResults performFiltering(CharSequence constraint) {
|
|
||||||
List<UserRepositories> filteredList = new ArrayList<>();
|
|
||||||
|
|
||||||
if (constraint == null || constraint.length() == 0) {
|
|
||||||
filteredList.addAll(reposListFull);
|
|
||||||
} else {
|
|
||||||
String filterPattern = constraint.toString().toLowerCase().trim();
|
|
||||||
|
|
||||||
for (UserRepositories item : reposListFull) {
|
|
||||||
if (item.getFullname().toLowerCase().contains(filterPattern) || item.getDescription().toLowerCase().contains(filterPattern)) {
|
|
||||||
filteredList.add(item);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
FilterResults results = new FilterResults();
|
|
||||||
results.values = filteredList;
|
|
||||||
|
|
||||||
return results;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void publishResults(CharSequence constraint, FilterResults results) {
|
|
||||||
reposList.clear();
|
|
||||||
reposList.addAll((List) results.values);
|
|
||||||
notifyDataSetChanged();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
}
|
|
@ -1,241 +0,0 @@
|
|||||||
package org.mian.gitnex.adapters;
|
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import android.content.Intent;
|
|
||||||
import android.graphics.Typeface;
|
|
||||||
import android.view.LayoutInflater;
|
|
||||||
import android.view.MenuItem;
|
|
||||||
import android.view.View;
|
|
||||||
import android.view.ViewGroup;
|
|
||||||
import android.widget.Filter;
|
|
||||||
import android.widget.Filterable;
|
|
||||||
import android.widget.ImageView;
|
|
||||||
import android.widget.TextView;
|
|
||||||
import com.amulyakhare.textdrawable.TextDrawable;
|
|
||||||
import com.amulyakhare.textdrawable.util.ColorGenerator;
|
|
||||||
import org.mian.gitnex.R;
|
|
||||||
import org.mian.gitnex.activities.OpenRepoInBrowserActivity;
|
|
||||||
import org.mian.gitnex.activities.RepoDetailActivity;
|
|
||||||
import org.mian.gitnex.activities.RepoStargazersActivity;
|
|
||||||
import org.mian.gitnex.activities.RepoWatchersActivity;
|
|
||||||
import org.mian.gitnex.models.UserRepositories;
|
|
||||||
import org.mian.gitnex.util.TinyDB;
|
|
||||||
import java.lang.reflect.Field;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.List;
|
|
||||||
import androidx.annotation.NonNull;
|
|
||||||
import androidx.appcompat.view.ContextThemeWrapper;
|
|
||||||
import androidx.appcompat.widget.PopupMenu;
|
|
||||||
import androidx.recyclerview.widget.RecyclerView;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Author M M Arif
|
|
||||||
*/
|
|
||||||
|
|
||||||
public class StarredReposListAdapter extends RecyclerView.Adapter<StarredReposListAdapter.StarredReposViewHolder> implements Filterable {
|
|
||||||
|
|
||||||
private List<UserRepositories> reposList;
|
|
||||||
private Context mCtx;
|
|
||||||
private List<UserRepositories> reposListFull;
|
|
||||||
|
|
||||||
static class StarredReposViewHolder extends RecyclerView.ViewHolder {
|
|
||||||
|
|
||||||
private ImageView image;
|
|
||||||
private TextView mTextView1;
|
|
||||||
private TextView mTextView2;
|
|
||||||
private TextView fullName;
|
|
||||||
private ImageView repoPrivatePublic;
|
|
||||||
private TextView repoStars;
|
|
||||||
private TextView repoWatchers;
|
|
||||||
private TextView repoOpenIssuesCount;
|
|
||||||
|
|
||||||
private StarredReposViewHolder(View itemView) {
|
|
||||||
super(itemView);
|
|
||||||
mTextView1 = itemView.findViewById(R.id.repoName);
|
|
||||||
mTextView2 = itemView.findViewById(R.id.repoDescription);
|
|
||||||
image = itemView.findViewById(R.id.imageAvatar);
|
|
||||||
fullName = itemView.findViewById(R.id.repoFullName);
|
|
||||||
repoPrivatePublic = itemView.findViewById(R.id.imageRepoType);
|
|
||||||
repoStars = itemView.findViewById(R.id.repoStars);
|
|
||||||
repoWatchers = itemView.findViewById(R.id.repoWatchers);
|
|
||||||
repoOpenIssuesCount = itemView.findViewById(R.id.repoOpenIssuesCount);
|
|
||||||
ImageView reposDropdownMenu = itemView.findViewById(R.id.reposDropdownMenu);
|
|
||||||
|
|
||||||
itemView.setOnClickListener(new View.OnClickListener() {
|
|
||||||
@Override
|
|
||||||
public void onClick(View v) {
|
|
||||||
|
|
||||||
Context context = v.getContext();
|
|
||||||
|
|
||||||
Intent intent = new Intent(context, RepoDetailActivity.class);
|
|
||||||
intent.putExtra("repoFullName", fullName.getText().toString());
|
|
||||||
|
|
||||||
TinyDB tinyDb = new TinyDB(context);
|
|
||||||
tinyDb.putString("repoFullName", fullName.getText().toString());
|
|
||||||
tinyDb.putBoolean("resumeIssues", true);
|
|
||||||
context.startActivity(intent);
|
|
||||||
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
reposDropdownMenu.setOnClickListener(new View.OnClickListener() {
|
|
||||||
@Override
|
|
||||||
public void onClick(View v) {
|
|
||||||
|
|
||||||
final Context context = v.getContext();
|
|
||||||
Context context_ = new ContextThemeWrapper(context, R.style.popupMenuStyle);
|
|
||||||
|
|
||||||
PopupMenu popupMenu = new PopupMenu(context_, v);
|
|
||||||
popupMenu.inflate(R.menu.repo_dotted_list_menu);
|
|
||||||
|
|
||||||
Object menuHelper;
|
|
||||||
Class[] argTypes;
|
|
||||||
try {
|
|
||||||
|
|
||||||
Field fMenuHelper = PopupMenu.class.getDeclaredField("mPopup");
|
|
||||||
fMenuHelper.setAccessible(true);
|
|
||||||
menuHelper = fMenuHelper.get(popupMenu);
|
|
||||||
argTypes = new Class[] { boolean.class };
|
|
||||||
menuHelper.getClass().getDeclaredMethod("setForceShowIcon",
|
|
||||||
argTypes).invoke(menuHelper, true);
|
|
||||||
|
|
||||||
} catch (Exception e) {
|
|
||||||
|
|
||||||
popupMenu.show();
|
|
||||||
return;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
|
|
||||||
@Override
|
|
||||||
public boolean onMenuItemClick(MenuItem item) {
|
|
||||||
switch (item.getItemId()) {
|
|
||||||
case R.id.repoStargazers:
|
|
||||||
|
|
||||||
Intent intent = new Intent(context, RepoStargazersActivity.class);
|
|
||||||
intent.putExtra("repoFullNameForStars", fullName.getText());
|
|
||||||
context.startActivity(intent);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case R.id.repoWatchers:
|
|
||||||
|
|
||||||
Intent intentW = new Intent(context, RepoWatchersActivity.class);
|
|
||||||
intentW.putExtra("repoFullNameForWatchers", fullName.getText());
|
|
||||||
context.startActivity(intentW);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case R.id.repoOpenInBrowser:
|
|
||||||
|
|
||||||
Intent intentOpenInBrowser = new Intent(context, OpenRepoInBrowserActivity.class);
|
|
||||||
intentOpenInBrowser.putExtra("repoFullNameBrowser", fullName.getText());
|
|
||||||
context.startActivity(intentOpenInBrowser);
|
|
||||||
break;
|
|
||||||
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
popupMenu.show();
|
|
||||||
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public StarredReposListAdapter(Context mCtx, List<UserRepositories> reposListMain) {
|
|
||||||
this.mCtx = mCtx;
|
|
||||||
this.reposList = reposListMain;
|
|
||||||
reposListFull = new ArrayList<>(reposList);
|
|
||||||
}
|
|
||||||
|
|
||||||
@NonNull
|
|
||||||
@Override
|
|
||||||
public StarredReposListAdapter.StarredReposViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
|
|
||||||
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.starred_repos_list, parent, false);
|
|
||||||
return new StarredReposListAdapter.StarredReposViewHolder(v);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onBindViewHolder(@NonNull StarredReposListAdapter.StarredReposViewHolder holder, int position) {
|
|
||||||
|
|
||||||
UserRepositories currentItem = reposList.get(position);
|
|
||||||
holder.mTextView2.setVisibility(View.GONE);
|
|
||||||
|
|
||||||
ColorGenerator generator = ColorGenerator.MATERIAL;
|
|
||||||
int color = generator.getColor(currentItem.getName());
|
|
||||||
String charac = String.valueOf(currentItem.getName().charAt(0));
|
|
||||||
|
|
||||||
TextDrawable drawable = TextDrawable.builder()
|
|
||||||
.beginConfig()
|
|
||||||
.useFont(Typeface.DEFAULT)
|
|
||||||
.fontSize(16)
|
|
||||||
.toUpperCase()
|
|
||||||
.width(28)
|
|
||||||
.height(28)
|
|
||||||
.endConfig()
|
|
||||||
.buildRound(charac, color);
|
|
||||||
|
|
||||||
holder.image.setImageDrawable(drawable);
|
|
||||||
holder.mTextView1.setText(currentItem.getName());
|
|
||||||
if (!currentItem.getDescription().equals("")) {
|
|
||||||
holder.mTextView2.setVisibility(View.VISIBLE);
|
|
||||||
holder.mTextView2.setText(currentItem.getDescription());
|
|
||||||
}
|
|
||||||
holder.fullName.setText(currentItem.getFullname());
|
|
||||||
if(currentItem.getPrivateFlag()) {
|
|
||||||
holder.repoPrivatePublic.setImageResource(R.drawable.ic_lock_bold);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
holder.repoPrivatePublic.setImageResource(R.drawable.ic_public);
|
|
||||||
}
|
|
||||||
holder.repoStars.setText(currentItem.getStars_count());
|
|
||||||
holder.repoWatchers.setText(currentItem.getWatchers_count());
|
|
||||||
holder.repoOpenIssuesCount.setText(currentItem.getOpen_issues_count());
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getItemCount() {
|
|
||||||
return reposList.size();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Filter getFilter() {
|
|
||||||
return starredReposFilter;
|
|
||||||
}
|
|
||||||
|
|
||||||
private Filter starredReposFilter = new Filter() {
|
|
||||||
@Override
|
|
||||||
protected FilterResults performFiltering(CharSequence constraint) {
|
|
||||||
List<UserRepositories> filteredList = new ArrayList<>();
|
|
||||||
|
|
||||||
if (constraint == null || constraint.length() == 0) {
|
|
||||||
filteredList.addAll(reposListFull);
|
|
||||||
} else {
|
|
||||||
String filterPattern = constraint.toString().toLowerCase().trim();
|
|
||||||
|
|
||||||
for (UserRepositories item : reposListFull) {
|
|
||||||
if (item.getFullname().toLowerCase().contains(filterPattern) || item.getDescription().toLowerCase().contains(filterPattern)) {
|
|
||||||
filteredList.add(item);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
FilterResults results = new FilterResults();
|
|
||||||
results.values = filteredList;
|
|
||||||
|
|
||||||
return results;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void publishResults(CharSequence constraint, FilterResults results) {
|
|
||||||
reposList.clear();
|
|
||||||
reposList.addAll((List) results.values);
|
|
||||||
notifyDataSetChanged();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
}
|
|
@ -1,91 +0,0 @@
|
|||||||
package org.mian.gitnex.adapters;
|
|
||||||
|
|
||||||
import android.annotation.SuppressLint;
|
|
||||||
import android.content.Context;
|
|
||||||
import android.view.LayoutInflater;
|
|
||||||
import android.view.View;
|
|
||||||
import android.view.ViewGroup;
|
|
||||||
import android.widget.BaseAdapter;
|
|
||||||
import android.widget.ImageView;
|
|
||||||
import android.widget.TextView;
|
|
||||||
import com.squareup.picasso.Picasso;
|
|
||||||
import org.mian.gitnex.R;
|
|
||||||
import org.mian.gitnex.helpers.RoundedTransformation;
|
|
||||||
import org.mian.gitnex.models.UserInfo;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Author M M Arif
|
|
||||||
*/
|
|
||||||
|
|
||||||
public class TeamMembersByOrgAdapter extends BaseAdapter {
|
|
||||||
|
|
||||||
private List<UserInfo> teamMembersList;
|
|
||||||
private Context mCtx;
|
|
||||||
|
|
||||||
private class ViewHolder {
|
|
||||||
|
|
||||||
private ImageView memberAvatar;
|
|
||||||
private TextView memberName;
|
|
||||||
|
|
||||||
ViewHolder(View v) {
|
|
||||||
memberAvatar = v.findViewById(R.id.memberAvatar);
|
|
||||||
memberName = v.findViewById(R.id.memberName);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public TeamMembersByOrgAdapter(Context mCtx, List<UserInfo> membersListMain) {
|
|
||||||
this.mCtx = mCtx;
|
|
||||||
this.teamMembersList = membersListMain;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getCount() {
|
|
||||||
return teamMembersList.size();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Object getItem(int position) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public long getItemId(int position) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
@SuppressLint("InflateParams")
|
|
||||||
@Override
|
|
||||||
public View getView(int position, View finalView, ViewGroup parent) {
|
|
||||||
|
|
||||||
TeamMembersByOrgAdapter.ViewHolder viewHolder = null;
|
|
||||||
|
|
||||||
if (finalView == null) {
|
|
||||||
finalView = LayoutInflater.from(mCtx).inflate(R.layout.members_by_team_by_org_list, null);
|
|
||||||
viewHolder = new TeamMembersByOrgAdapter.ViewHolder(finalView);
|
|
||||||
finalView.setTag(viewHolder);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
viewHolder = (TeamMembersByOrgAdapter.ViewHolder) finalView.getTag();
|
|
||||||
}
|
|
||||||
|
|
||||||
initData(viewHolder, position);
|
|
||||||
return finalView;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
private void initData(TeamMembersByOrgAdapter.ViewHolder viewHolder, int position) {
|
|
||||||
|
|
||||||
UserInfo currentItem = teamMembersList.get(position);
|
|
||||||
Picasso.get().load(currentItem.getAvatar()).transform(new RoundedTransformation(100, 0)).resize(200, 200).centerCrop().into(viewHolder.memberAvatar);
|
|
||||||
|
|
||||||
if(!currentItem.getFullname().equals("")) {
|
|
||||||
viewHolder.memberName.setText(currentItem.getFullname());
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
viewHolder.memberName.setText(currentItem.getLogin());
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,207 +0,0 @@
|
|||||||
package org.mian.gitnex.adapters;
|
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import android.content.DialogInterface;
|
|
||||||
import android.util.Log;
|
|
||||||
import android.view.LayoutInflater;
|
|
||||||
import android.view.View;
|
|
||||||
import android.view.ViewGroup;
|
|
||||||
import android.widget.ImageView;
|
|
||||||
import android.widget.ListView;
|
|
||||||
import android.widget.TextView;
|
|
||||||
import com.squareup.picasso.Picasso;
|
|
||||||
import org.mian.gitnex.R;
|
|
||||||
import org.mian.gitnex.actions.CollaboratorActions;
|
|
||||||
import org.mian.gitnex.clients.RetrofitClient;
|
|
||||||
import org.mian.gitnex.helpers.AlertDialogs;
|
|
||||||
import org.mian.gitnex.helpers.Authorization;
|
|
||||||
import org.mian.gitnex.helpers.RoundedTransformation;
|
|
||||||
import org.mian.gitnex.models.Collaborators;
|
|
||||||
import org.mian.gitnex.models.UserInfo;
|
|
||||||
import org.mian.gitnex.util.TinyDB;
|
|
||||||
import java.util.List;
|
|
||||||
import androidx.annotation.NonNull;
|
|
||||||
import androidx.appcompat.app.AlertDialog;
|
|
||||||
import androidx.recyclerview.widget.RecyclerView;
|
|
||||||
import retrofit2.Call;
|
|
||||||
import retrofit2.Callback;
|
|
||||||
import retrofit2.Response;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Author M M Arif
|
|
||||||
*/
|
|
||||||
|
|
||||||
public class UserSearchAdapter extends RecyclerView.Adapter<UserSearchAdapter.UserSearchViewHolder> {
|
|
||||||
|
|
||||||
private List<UserInfo> usersSearchList;
|
|
||||||
private Context mCtx;
|
|
||||||
|
|
||||||
public UserSearchAdapter(List<UserInfo> dataList, Context mCtx) {
|
|
||||||
this.mCtx = mCtx;
|
|
||||||
this.usersSearchList = dataList;
|
|
||||||
}
|
|
||||||
|
|
||||||
static class UserSearchViewHolder extends RecyclerView.ViewHolder {
|
|
||||||
|
|
||||||
private ImageView userAvatar;
|
|
||||||
private TextView userFullName;
|
|
||||||
private TextView userName;
|
|
||||||
private TextView userNameMain;
|
|
||||||
private ImageView addCollaboratorButtonAdd;
|
|
||||||
private ImageView addCollaboratorButtonRemove;
|
|
||||||
|
|
||||||
private String[] permissionList = {"Read", "Write", "Admin"};
|
|
||||||
final private int permissionSelectedChoice = 0;
|
|
||||||
|
|
||||||
private UserSearchViewHolder(View itemView) {
|
|
||||||
super(itemView);
|
|
||||||
userAvatar = itemView.findViewById(R.id.userAvatar);
|
|
||||||
userFullName = itemView.findViewById(R.id.userFullName);
|
|
||||||
userName = itemView.findViewById(R.id.userName);
|
|
||||||
userNameMain = itemView.findViewById(R.id.userNameMain);
|
|
||||||
addCollaboratorButtonAdd = itemView.findViewById(R.id.addCollaboratorButtonAdd);
|
|
||||||
addCollaboratorButtonRemove = itemView.findViewById(R.id.addCollaboratorButtonRemove);
|
|
||||||
|
|
||||||
addCollaboratorButtonAdd.setOnClickListener(new View.OnClickListener() {
|
|
||||||
@Override
|
|
||||||
public void onClick(View v) {
|
|
||||||
|
|
||||||
final Context context = v.getContext();
|
|
||||||
|
|
||||||
AlertDialog.Builder pBuilder = new AlertDialog.Builder(context, R.style.confirmDialog);
|
|
||||||
|
|
||||||
pBuilder.setTitle(R.string.newTeamPermission);
|
|
||||||
pBuilder.setSingleChoiceItems(permissionList, permissionSelectedChoice, new DialogInterface.OnClickListener() {
|
|
||||||
@Override
|
|
||||||
public void onClick(DialogInterface dialogInterface, int i) {
|
|
||||||
|
|
||||||
}
|
|
||||||
})
|
|
||||||
.setCancelable(false)
|
|
||||||
.setNegativeButton(R.string.cancelButton, null)
|
|
||||||
.setPositiveButton(R.string.addButton, new DialogInterface.OnClickListener() {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onClick(DialogInterface dialog, int which) {
|
|
||||||
|
|
||||||
ListView lw = ((AlertDialog)dialog).getListView();
|
|
||||||
Object checkedItem = lw.getAdapter().getItem(lw.getCheckedItemPosition());
|
|
||||||
|
|
||||||
CollaboratorActions.addCollaborator(context, String.valueOf(checkedItem).toLowerCase(), userNameMain.getText().toString());
|
|
||||||
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
AlertDialog pDialog = pBuilder.create();
|
|
||||||
pDialog.show();
|
|
||||||
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
addCollaboratorButtonRemove.setOnClickListener(new View.OnClickListener() {
|
|
||||||
@Override
|
|
||||||
public void onClick(View v) {
|
|
||||||
|
|
||||||
Context context = v.getContext();
|
|
||||||
|
|
||||||
AlertDialogs.collaboratorRemoveDialog(context, userNameMain.getText().toString(),
|
|
||||||
context.getResources().getString(R.string.removeCollaboratorTitle),
|
|
||||||
context.getResources().getString(R.string.removeCollaboratorMessage),
|
|
||||||
context.getResources().getString(R.string.removeButton),
|
|
||||||
context.getResources().getString(R.string.cancelButton), "fa");
|
|
||||||
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@NonNull
|
|
||||||
@Override
|
|
||||||
public UserSearchAdapter.UserSearchViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
|
|
||||||
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.collaborators_list_search, parent, false);
|
|
||||||
return new UserSearchAdapter.UserSearchViewHolder(v);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onBindViewHolder(@NonNull final UserSearchAdapter.UserSearchViewHolder holder, int position) {
|
|
||||||
|
|
||||||
final UserInfo currentItem = usersSearchList.get(position);
|
|
||||||
|
|
||||||
holder.userNameMain.setText(currentItem.getUsername());
|
|
||||||
|
|
||||||
if (!currentItem.getFullname().equals("")) {
|
|
||||||
holder.userFullName.setText(currentItem.getFullname());
|
|
||||||
holder.userName.setText(mCtx.getResources().getString(R.string.usernameWithAt, currentItem.getUsername()));
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
holder.userFullName.setText(mCtx.getResources().getString(R.string.usernameWithAt, currentItem.getUsername()));
|
|
||||||
holder.userName.setText(mCtx.getResources().getString(R.string.usernameWithAt, currentItem.getUsername()));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!currentItem.getAvatar().equals("")) {
|
|
||||||
Picasso.get().load(currentItem.getAvatar()).transform(new RoundedTransformation(100, 0)).resize(200, 200).centerCrop().into(holder.userAvatar);
|
|
||||||
}
|
|
||||||
|
|
||||||
if(getItemCount() > 0) {
|
|
||||||
|
|
||||||
TinyDB tinyDb = new TinyDB(mCtx);
|
|
||||||
final String instanceUrl = tinyDb.getString("instanceUrl");
|
|
||||||
final String loginUid = tinyDb.getString("loginUid");
|
|
||||||
String repoFullName = tinyDb.getString("repoFullName");
|
|
||||||
String[] parts = repoFullName.split("/");
|
|
||||||
final String repoOwner = parts[0];
|
|
||||||
final String repoName = parts[1];
|
|
||||||
final String instanceToken = "token " + tinyDb.getString(loginUid + "-token");
|
|
||||||
|
|
||||||
Call<Collaborators> call = RetrofitClient
|
|
||||||
.getInstance(instanceUrl)
|
|
||||||
.getApiInterface()
|
|
||||||
.checkRepoCollaborator(Authorization.returnAuthentication(mCtx, loginUid, instanceToken), repoOwner, repoName, currentItem.getUsername());
|
|
||||||
|
|
||||||
call.enqueue(new Callback<Collaborators>() {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onResponse(@NonNull Call<Collaborators> call, @NonNull Response<Collaborators> response) {
|
|
||||||
|
|
||||||
if(response.code() == 204) {
|
|
||||||
if(!currentItem.getUsername().equals(loginUid) && !currentItem.getUsername().equals(repoOwner)) {
|
|
||||||
holder.addCollaboratorButtonRemove.setVisibility(View.VISIBLE);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
holder.addCollaboratorButtonRemove.setVisibility(View.GONE);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if(response.code() == 404) {
|
|
||||||
if(!currentItem.getUsername().equals(loginUid) && !currentItem.getUsername().equals(repoOwner)) {
|
|
||||||
holder.addCollaboratorButtonAdd.setVisibility(View.VISIBLE);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
holder.addCollaboratorButtonAdd.setVisibility(View.GONE);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
holder.addCollaboratorButtonRemove.setVisibility(View.GONE);
|
|
||||||
holder.addCollaboratorButtonAdd.setVisibility(View.GONE);
|
|
||||||
Log.i("onResponse", String.valueOf(response.code()));
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onFailure(@NonNull Call<Collaborators> call, @NonNull Throwable t) {
|
|
||||||
Log.i("onFailure", t.getMessage());
|
|
||||||
}
|
|
||||||
|
|
||||||
});
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getItemCount() {
|
|
||||||
return usersSearchList.size();
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,146 +0,0 @@
|
|||||||
package org.mian.gitnex.fragments;
|
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import android.net.Uri;
|
|
||||||
import android.os.Bundle;
|
|
||||||
import androidx.annotation.NonNull;
|
|
||||||
import androidx.fragment.app.Fragment;
|
|
||||||
import retrofit2.Call;
|
|
||||||
import retrofit2.Callback;
|
|
||||||
import android.util.Log;
|
|
||||||
import android.view.LayoutInflater;
|
|
||||||
import android.view.View;
|
|
||||||
import android.view.ViewGroup;
|
|
||||||
import android.widget.ImageView;
|
|
||||||
import android.widget.ProgressBar;
|
|
||||||
import android.widget.TextView;
|
|
||||||
import com.squareup.picasso.Picasso;
|
|
||||||
import org.mian.gitnex.R;
|
|
||||||
import org.mian.gitnex.clients.RetrofitClient;
|
|
||||||
import org.mian.gitnex.helpers.Authorization;
|
|
||||||
import org.mian.gitnex.helpers.RoundedTransformation;
|
|
||||||
import org.mian.gitnex.models.Organization;
|
|
||||||
import org.mian.gitnex.util.TinyDB;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Author M M Arif
|
|
||||||
*/
|
|
||||||
|
|
||||||
public class OrganizationInfoFragment extends Fragment {
|
|
||||||
|
|
||||||
private Context ctx = getContext();
|
|
||||||
private ProgressBar mProgressBar;
|
|
||||||
private static String orgNameF = "param1";
|
|
||||||
|
|
||||||
private String orgName;
|
|
||||||
private ImageView orgAvatar;
|
|
||||||
private TextView orgDescInfo;
|
|
||||||
private TextView orgWebsiteInfo;
|
|
||||||
private TextView orgLocationInfo;
|
|
||||||
|
|
||||||
private RepoInfoFragment.OnFragmentInteractionListener mListener;
|
|
||||||
|
|
||||||
public OrganizationInfoFragment() {
|
|
||||||
}
|
|
||||||
|
|
||||||
public static OrganizationInfoFragment newInstance(String param1) {
|
|
||||||
OrganizationInfoFragment fragment = new OrganizationInfoFragment();
|
|
||||||
Bundle args = new Bundle();
|
|
||||||
args.putString(orgNameF, param1);
|
|
||||||
fragment.setArguments(args);
|
|
||||||
return fragment;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onCreate(Bundle savedInstanceState) {
|
|
||||||
super.onCreate(savedInstanceState);
|
|
||||||
if (getArguments() != null) {
|
|
||||||
orgName = getArguments().getString(orgNameF);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
|
|
||||||
Bundle savedInstanceState) {
|
|
||||||
|
|
||||||
View v = inflater.inflate(R.layout.fragment_organization_info, container, false);
|
|
||||||
|
|
||||||
TinyDB tinyDb = new TinyDB(getContext());
|
|
||||||
final String instanceUrl = tinyDb.getString("instanceUrl");
|
|
||||||
final String loginUid = tinyDb.getString("loginUid");
|
|
||||||
final String instanceToken = "token " + tinyDb.getString(loginUid + "-token");
|
|
||||||
|
|
||||||
mProgressBar = v.findViewById(R.id.progress_bar);
|
|
||||||
orgAvatar = v.findViewById(R.id.orgAvatar);
|
|
||||||
TextView orgNameInfo = v.findViewById(R.id.orgNameInfo);
|
|
||||||
orgDescInfo = v.findViewById(R.id.orgDescInfo);
|
|
||||||
orgWebsiteInfo = v.findViewById(R.id.orgWebsiteInfo);
|
|
||||||
orgLocationInfo = v.findViewById(R.id.orgLocationInfo);
|
|
||||||
|
|
||||||
orgNameInfo.setText(orgName);
|
|
||||||
|
|
||||||
getOrgInfo(instanceUrl, Authorization.returnAuthentication(getContext(), loginUid, instanceToken), orgName);
|
|
||||||
|
|
||||||
return v;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
private void getOrgInfo(String instanceUrl, String token, final String owner) {
|
|
||||||
|
|
||||||
Call<Organization> call = RetrofitClient
|
|
||||||
.getInstance(instanceUrl)
|
|
||||||
.getApiInterface()
|
|
||||||
.getOrganization(token, owner);
|
|
||||||
|
|
||||||
call.enqueue(new Callback<Organization>() {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onResponse(@NonNull Call<Organization> call, @NonNull retrofit2.Response<Organization> response) {
|
|
||||||
|
|
||||||
Organization orgInfo = response.body();
|
|
||||||
|
|
||||||
if (response.isSuccessful()) {
|
|
||||||
|
|
||||||
if (response.code() == 200) {
|
|
||||||
|
|
||||||
assert orgInfo != null;
|
|
||||||
Picasso.get().load(orgInfo.getAvatar_url()).transform(new RoundedTransformation(100, 0)).resize(200, 200).centerCrop().into(orgAvatar);
|
|
||||||
orgDescInfo.setText(orgInfo.getDescription());
|
|
||||||
orgWebsiteInfo.setText(orgInfo.getWebsite());
|
|
||||||
orgLocationInfo.setText(orgInfo.getLocation());
|
|
||||||
|
|
||||||
mProgressBar.setVisibility(View.GONE);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
Log.e("onFailure", String.valueOf(response.code()));
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onFailure(@NonNull Call<Organization> call, @NonNull Throwable t) {
|
|
||||||
Log.e("onFailure", t.toString());
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public void onButtonPressed(Uri uri) {
|
|
||||||
if (mListener != null) {
|
|
||||||
mListener.onFragmentInteraction(uri);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onDetach() {
|
|
||||||
super.onDetach();
|
|
||||||
mListener = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public interface OnFragmentInteractionListener {
|
|
||||||
void onFragmentInteraction(Uri uri);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,125 +0,0 @@
|
|||||||
package org.mian.gitnex.fragments;
|
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import android.os.Bundle;
|
|
||||||
import androidx.annotation.NonNull;
|
|
||||||
import androidx.annotation.Nullable;
|
|
||||||
import androidx.fragment.app.Fragment;
|
|
||||||
import androidx.fragment.app.FragmentManager;
|
|
||||||
import androidx.fragment.app.FragmentStatePagerAdapter;
|
|
||||||
import androidx.viewpager.widget.ViewPager;
|
|
||||||
import android.view.LayoutInflater;
|
|
||||||
import android.view.Menu;
|
|
||||||
import android.view.MenuInflater;
|
|
||||||
import android.view.MenuItem;
|
|
||||||
import android.view.View;
|
|
||||||
import android.view.ViewGroup;
|
|
||||||
import android.widget.ImageView;
|
|
||||||
import android.widget.TextView;
|
|
||||||
import com.google.android.material.tabs.TabLayout;
|
|
||||||
import com.squareup.picasso.Picasso;
|
|
||||||
import org.mian.gitnex.R;
|
|
||||||
import org.mian.gitnex.activities.MainActivity;
|
|
||||||
import org.mian.gitnex.helpers.RoundedTransformation;
|
|
||||||
import org.mian.gitnex.util.TinyDB;
|
|
||||||
import java.util.Objects;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Author M M Arif
|
|
||||||
*/
|
|
||||||
|
|
||||||
public class ProfileFragment extends Fragment {
|
|
||||||
|
|
||||||
private Context ctx = getContext();
|
|
||||||
|
|
||||||
@Nullable
|
|
||||||
@Override
|
|
||||||
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
|
|
||||||
|
|
||||||
View v = inflater.inflate(R.layout.fragment_profile, container, false);
|
|
||||||
((MainActivity) Objects.requireNonNull(getActivity())).setActionBarTitle(getResources().getString(R.string.pageTitleProfile));
|
|
||||||
setHasOptionsMenu(true);
|
|
||||||
|
|
||||||
TinyDB tinyDb = new TinyDB(getContext());
|
|
||||||
|
|
||||||
TextView userFullName = v.findViewById(R.id.userFullName);
|
|
||||||
ImageView userAvatar = v.findViewById(R.id.userAvatar);
|
|
||||||
TextView userLogin = v.findViewById(R.id.userLogin);
|
|
||||||
TextView userEmail = v.findViewById(R.id.userEmail);
|
|
||||||
|
|
||||||
userFullName.setText(tinyDb.getString("userFullname"));
|
|
||||||
Picasso.get().load(tinyDb.getString("userAvatar")).transform(new RoundedTransformation(100, 0)).resize(180, 180).centerCrop().into(userAvatar);
|
|
||||||
userLogin.setText(getString(R.string.usernameWithAt, tinyDb.getString("userLogin")));
|
|
||||||
userEmail.setText(tinyDb.getString("userEmail"));
|
|
||||||
|
|
||||||
ProfileFragment.SectionsPagerAdapter mSectionsPagerAdapter = new ProfileFragment.SectionsPagerAdapter(getFragmentManager());
|
|
||||||
|
|
||||||
ViewPager mViewPager = v.findViewById(R.id.container);
|
|
||||||
mViewPager.setAdapter(mSectionsPagerAdapter);
|
|
||||||
|
|
||||||
TabLayout tabLayout = v.findViewById(R.id.tabs);
|
|
||||||
|
|
||||||
mViewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));
|
|
||||||
tabLayout.addOnTabSelectedListener(new TabLayout.ViewPagerOnTabSelectedListener(mViewPager));
|
|
||||||
|
|
||||||
return v;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public class SectionsPagerAdapter extends FragmentStatePagerAdapter {
|
|
||||||
|
|
||||||
SectionsPagerAdapter(FragmentManager fm) {
|
|
||||||
super(fm);
|
|
||||||
}
|
|
||||||
|
|
||||||
@NonNull
|
|
||||||
@Override
|
|
||||||
public Fragment getItem(int position) {
|
|
||||||
|
|
||||||
Fragment fragment = null;
|
|
||||||
switch (position) {
|
|
||||||
case 0: // followers
|
|
||||||
return ProfileFollowersFragment.newInstance("repoOwner", "repoName");
|
|
||||||
case 1: // following
|
|
||||||
return ProfileFollowingFragment.newInstance("repoOwner", "repoName");
|
|
||||||
case 2: // emails
|
|
||||||
return ProfileEmailsFragment.newInstance("repoOwner", "repoName");
|
|
||||||
}
|
|
||||||
return fragment;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getCount() {
|
|
||||||
return 3;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) {
|
|
||||||
menu.clear();
|
|
||||||
Objects.requireNonNull(getActivity()).getMenuInflater().inflate(R.menu.profile_dotted_menu, menu);
|
|
||||||
super.onCreateOptionsMenu(menu, inflater);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
|
|
||||||
|
|
||||||
int id = item.getItemId();
|
|
||||||
|
|
||||||
switch (id) {
|
|
||||||
case android.R.id.home:
|
|
||||||
((MainActivity)ctx).finish();
|
|
||||||
return true;
|
|
||||||
case R.id.profileMenu:
|
|
||||||
ProfileBottomSheetFragment bottomSheet = new ProfileBottomSheetFragment();
|
|
||||||
assert getFragmentManager() != null;
|
|
||||||
bottomSheet.show(getFragmentManager(), "profileBottomSheet");
|
|
||||||
return true;
|
|
||||||
default:
|
|
||||||
return super.onOptionsItemSelected(item);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,206 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<LinearLayout android:layout_width="match_parent"
|
|
||||||
android:layout_height="match_parent"
|
|
||||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
|
||||||
android:orientation="vertical"
|
|
||||||
android:fitsSystemWindows="true"
|
|
||||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
|
||||||
android:background="@color/colorPrimary">
|
|
||||||
|
|
||||||
<com.google.android.material.appbar.AppBarLayout
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:theme="@style/AppTheme.AppBarOverlay" >
|
|
||||||
|
|
||||||
<androidx.appcompat.widget.Toolbar
|
|
||||||
android:id="@+id/toolbar"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="?attr/actionBarSize"
|
|
||||||
android:layout_weight="1"
|
|
||||||
android:background="?attr/colorPrimary"
|
|
||||||
app:popupTheme="@style/AppTheme.PopupOverlay"
|
|
||||||
app:title="@string/app_name" />
|
|
||||||
|
|
||||||
</com.google.android.material.appbar.AppBarLayout>
|
|
||||||
|
|
||||||
<RelativeLayout
|
|
||||||
android:id="@+id/relativeMainLayoutFrame"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="match_parent"
|
|
||||||
android:theme="@style/AppTheme">
|
|
||||||
|
|
||||||
<androidx.swiperefreshlayout.widget.SwipeRefreshLayout
|
|
||||||
android:id="@+id/pullToRefresh"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content">
|
|
||||||
|
|
||||||
<ScrollView
|
|
||||||
android:layout_width="fill_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:id="@+id/scrollViewComments"
|
|
||||||
android:fillViewport="true">
|
|
||||||
|
|
||||||
<RelativeLayout
|
|
||||||
android:id="@+id/relativeLayoutFrame"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:padding="15dp"
|
|
||||||
android:theme="@style/AppTheme">
|
|
||||||
|
|
||||||
<ImageView
|
|
||||||
android:id="@+id/assigneeAvatar"
|
|
||||||
android:layout_width="48dp"
|
|
||||||
android:layout_height="48dp"
|
|
||||||
android:layout_marginEnd="15dp"
|
|
||||||
android:contentDescription="@string/generalImgContentText" />
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/issueTitle"
|
|
||||||
android:layout_toEndOf="@+id/assigneeAvatar"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:gravity="start"
|
|
||||||
android:textColor="@color/white"
|
|
||||||
android:textSize="18sp" />
|
|
||||||
|
|
||||||
<RelativeLayout
|
|
||||||
android:id="@+id/msdueFrame"
|
|
||||||
android:layout_toEndOf="@+id/assigneeAvatar"
|
|
||||||
android:layout_below="@+id/issueTitle"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_marginTop="10dp" >
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/issueDueDate"
|
|
||||||
android:gravity="start"
|
|
||||||
android:layout_alignParentStart="true"
|
|
||||||
android:layout_gravity="start"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:textColor="@color/colorWhite"
|
|
||||||
android:textSize="14sp" />
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:layout_toEndOf="@+id/issueDueDate"
|
|
||||||
android:id="@+id/issueMilestone"
|
|
||||||
android:gravity="end"
|
|
||||||
android:layout_gravity="end"
|
|
||||||
android:layout_alignParentEnd="true"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:textColor="@color/colorWhite"
|
|
||||||
android:textSize="14sp" />
|
|
||||||
|
|
||||||
</RelativeLayout>
|
|
||||||
|
|
||||||
<HorizontalScrollView
|
|
||||||
android:layout_below="@+id/msdueFrame"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:id="@+id/assigneesScrollView"
|
|
||||||
android:layout_alignParentEnd="false"
|
|
||||||
android:foregroundGravity="right"
|
|
||||||
android:scrollbarThumbHorizontal="@android:color/transparent"
|
|
||||||
android:fillViewport="true">
|
|
||||||
|
|
||||||
<LinearLayout
|
|
||||||
android:id="@+id/frameAssignees"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:orientation="horizontal"
|
|
||||||
android:layout_gravity="end"
|
|
||||||
android:gravity="end"
|
|
||||||
android:layout_marginTop="10dp">
|
|
||||||
|
|
||||||
</LinearLayout>
|
|
||||||
</HorizontalScrollView>
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/issueDescription"
|
|
||||||
android:layout_below="@+id/assigneesScrollView"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:gravity="start"
|
|
||||||
android:textColor="@color/colorWhite"
|
|
||||||
android:autoLink="web"
|
|
||||||
android:textColorLink="@color/lightBlue"
|
|
||||||
android:textSize="16sp" />
|
|
||||||
|
|
||||||
<HorizontalScrollView
|
|
||||||
android:layout_below="@+id/issueDescription"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:id="@+id/labelsScrollView"
|
|
||||||
android:layout_alignParentEnd="false"
|
|
||||||
android:foregroundGravity="right"
|
|
||||||
android:scrollbarThumbHorizontal="@android:color/transparent"
|
|
||||||
android:fillViewport="true">
|
|
||||||
|
|
||||||
<LinearLayout
|
|
||||||
android:id="@+id/frameLabels"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:orientation="horizontal"
|
|
||||||
android:layout_marginTop="10dp">
|
|
||||||
|
|
||||||
</LinearLayout>
|
|
||||||
</HorizontalScrollView>
|
|
||||||
|
|
||||||
<RelativeLayout
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:id="@+id/issueTimeFrame"
|
|
||||||
android:layout_below="@+id/labelsScrollView"
|
|
||||||
android:orientation="horizontal"
|
|
||||||
android:layout_marginTop="10dp">
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/issueCreatedTime"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:gravity="start"
|
|
||||||
android:text="@string/createdText"
|
|
||||||
android:visibility="gone"
|
|
||||||
android:textColor="@color/colorWhite"
|
|
||||||
android:textSize="12sp" />
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/issueModified"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:textColor="@color/white"
|
|
||||||
android:layout_toEndOf="@+id/issueCreatedTime"
|
|
||||||
android:textSize="12sp"
|
|
||||||
android:visibility="gone"
|
|
||||||
android:text="@string/modifiedText" />
|
|
||||||
|
|
||||||
</RelativeLayout>
|
|
||||||
|
|
||||||
<View
|
|
||||||
android:layout_below="@id/issueTimeFrame"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="1dp"
|
|
||||||
android:id="@+id/divider"
|
|
||||||
android:layout_marginTop="10dp"
|
|
||||||
android:background="@color/divider" />
|
|
||||||
|
|
||||||
<androidx.recyclerview.widget.RecyclerView
|
|
||||||
android:layout_below="@+id/divider"
|
|
||||||
android:id="@+id/recyclerView"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="match_parent"
|
|
||||||
android:background="@color/colorPrimary"
|
|
||||||
android:padding="4dp"
|
|
||||||
android:scrollbars="vertical"
|
|
||||||
/>
|
|
||||||
|
|
||||||
</RelativeLayout>
|
|
||||||
|
|
||||||
</ScrollView>
|
|
||||||
|
|
||||||
</androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
|
|
||||||
|
|
||||||
</RelativeLayout>
|
|
||||||
|
|
||||||
</LinearLayout>
|
|
@ -1,75 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<RelativeLayout
|
|
||||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:paddingBottom="10dp"
|
|
||||||
android:paddingTop="10dp"
|
|
||||||
android:paddingStart="15dp"
|
|
||||||
android:paddingEnd="15dp"
|
|
||||||
android:background="@color/backgroundColor" >
|
|
||||||
|
|
||||||
<LinearLayout
|
|
||||||
android:id="@+id/userInfoSection"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:orientation="vertical"
|
|
||||||
android:layout_marginEnd="15dp">
|
|
||||||
|
|
||||||
<ImageView
|
|
||||||
android:id="@+id/userAvatar"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_gravity="center"
|
|
||||||
android:contentDescription="@string/generalImgContentText"
|
|
||||||
android:src="@drawable/ic_android" />
|
|
||||||
|
|
||||||
<ImageView
|
|
||||||
android:id="@+id/userRole"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_gravity="center_horizontal"
|
|
||||||
android:scaleType="fitCenter"
|
|
||||||
android:layout_marginTop="5dp"
|
|
||||||
android:contentDescription="@string/userRoleAdmin"
|
|
||||||
android:src="@drawable/ic_android" />
|
|
||||||
|
|
||||||
</LinearLayout>
|
|
||||||
|
|
||||||
<LinearLayout
|
|
||||||
android:id="@+id/userInfo"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_toEndOf="@+id/userInfoSection"
|
|
||||||
android:orientation="vertical">
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/userFullName"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_marginBottom="5dp"
|
|
||||||
android:text="@string/userName"
|
|
||||||
android:textColor="@color/white"
|
|
||||||
android:textSize="16sp" />
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/userName"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_marginBottom="5dp"
|
|
||||||
android:text="@string/userName"
|
|
||||||
android:textColor="@color/white"
|
|
||||||
android:textSize="16sp" />
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/userEmail"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_marginBottom="5dp"
|
|
||||||
android:text="@string/userEmail"
|
|
||||||
android:textColor="@color/white"
|
|
||||||
android:textSize="16sp" />
|
|
||||||
|
|
||||||
</LinearLayout>
|
|
||||||
|
|
||||||
</RelativeLayout>
|
|
@ -1,113 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<LinearLayout
|
|
||||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
|
||||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:background="@color/backgroundColor"
|
|
||||||
android:theme="@style/AppTheme"
|
|
||||||
android:orientation="vertical">
|
|
||||||
|
|
||||||
<RelativeLayout
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:orientation="vertical"
|
|
||||||
android:padding="20dp"
|
|
||||||
android:layout_marginTop="15dp"
|
|
||||||
android:layout_marginBottom="15dp"
|
|
||||||
android:gravity="top"
|
|
||||||
android:id="@+id/aboutFrame" >
|
|
||||||
|
|
||||||
<ImageView
|
|
||||||
android:id="@+id/userAvatar"
|
|
||||||
android:layout_width="80dp"
|
|
||||||
android:layout_height="80dp"
|
|
||||||
android:layout_gravity="start"
|
|
||||||
android:contentDescription="@string/logo"
|
|
||||||
android:src="@mipmap/app_logo_round" />
|
|
||||||
|
|
||||||
<LinearLayout
|
|
||||||
android:id="@+id/infoSection"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_toEndOf="@+id/userAvatar"
|
|
||||||
android:layout_marginStart="20dp"
|
|
||||||
android:orientation="vertical">
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/userFullName"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:text="@string/app_name"
|
|
||||||
android:textIsSelectable="true"
|
|
||||||
android:layout_marginBottom="5dp"
|
|
||||||
android:textSize="18sp"
|
|
||||||
android:textColor="@color/white"
|
|
||||||
android:layout_gravity="start"/>
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/userLogin"
|
|
||||||
android:textIsSelectable="true"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_marginBottom="5dp"
|
|
||||||
android:textSize="16sp"
|
|
||||||
android:layout_gravity="start"
|
|
||||||
android:textColor="@color/white" />
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/userEmail"
|
|
||||||
android:textIsSelectable="true"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_marginBottom="0dp"
|
|
||||||
android:textSize="16sp"
|
|
||||||
android:layout_gravity="start"
|
|
||||||
android:textColor="@color/white" />
|
|
||||||
|
|
||||||
</LinearLayout>
|
|
||||||
|
|
||||||
</RelativeLayout>
|
|
||||||
|
|
||||||
<com.google.android.material.appbar.AppBarLayout
|
|
||||||
android:id="@+id/appbar"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:theme="@style/AppTheme.AppBarOverlay">
|
|
||||||
|
|
||||||
<com.google.android.material.tabs.TabLayout
|
|
||||||
android:id="@+id/tabs"
|
|
||||||
app:tabMode="scrollable"
|
|
||||||
app:tabTextAppearance="@style/customTabLayout"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content">
|
|
||||||
|
|
||||||
<com.google.android.material.tabs.TabItem
|
|
||||||
android:id="@+id/profileTabFollowers"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:text="@string/profileTabFollowers" />
|
|
||||||
|
|
||||||
<com.google.android.material.tabs.TabItem
|
|
||||||
android:id="@+id/profileTabFollowing"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:text="@string/profileTabFollowing" />
|
|
||||||
|
|
||||||
<com.google.android.material.tabs.TabItem
|
|
||||||
android:id="@+id/profileTabEmails"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:text="@string/profileTabEmails" />
|
|
||||||
|
|
||||||
</com.google.android.material.tabs.TabLayout>
|
|
||||||
|
|
||||||
</com.google.android.material.appbar.AppBarLayout>
|
|
||||||
|
|
||||||
<androidx.viewpager.widget.ViewPager
|
|
||||||
android:id="@+id/container"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
app:layout_behavior="@string/appbar_scrolling_view_behavior" />
|
|
||||||
|
|
||||||
</LinearLayout>
|
|
@ -1,106 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
xmlns:tools="http://schemas.android.com/tools"
|
|
||||||
android:orientation="vertical"
|
|
||||||
android:paddingTop="10dp"
|
|
||||||
android:paddingBottom="10dp"
|
|
||||||
android:id="@+id/relativeLayoutMainFrame"
|
|
||||||
tools:context=".activities.RepoDetailActivity"
|
|
||||||
android:theme="@style/AppTheme"
|
|
||||||
android:background="@color/backgroundColor">
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/issueNumber"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:visibility="gone"/>
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/commendId"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:visibility="gone"/>
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/commendBodyRaw"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:visibility="gone"/>
|
|
||||||
|
|
||||||
<ImageView
|
|
||||||
android:id="@+id/issueCommenterAvatar"
|
|
||||||
android:layout_width="48dp"
|
|
||||||
android:layout_height="48dp"
|
|
||||||
android:layout_marginEnd="15dp"
|
|
||||||
android:contentDescription="@string/generalImgContentText"
|
|
||||||
android:src="@drawable/ic_android" />
|
|
||||||
|
|
||||||
<LinearLayout
|
|
||||||
android:id="@+id/sectionComment"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_toEndOf="@+id/issueCommenterAvatar"
|
|
||||||
android:orientation="vertical">
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/issueComment"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:textIsSelectable="true"
|
|
||||||
android:textColor="@color/colorWhite"
|
|
||||||
android:autoLink="web"
|
|
||||||
android:textColorLink="@color/lightBlue"
|
|
||||||
android:textSize="16sp" />
|
|
||||||
|
|
||||||
<LinearLayout
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:id="@+id/commentsDetailMainFrame"
|
|
||||||
android:layout_marginTop="10dp"
|
|
||||||
android:orientation="horizontal">
|
|
||||||
|
|
||||||
<RelativeLayout
|
|
||||||
android:layout_width="0dp"
|
|
||||||
android:layout_weight=".90"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:id="@+id/commentsDetailFrame"
|
|
||||||
android:orientation="horizontal"
|
|
||||||
android:layout_marginTop="3dp">
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/issueCommentDate"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:text="@string/createdText"
|
|
||||||
android:textColor="@color/colorWhite"
|
|
||||||
android:textSize="12sp" />
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/commentModified"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:textColor="@color/white"
|
|
||||||
android:layout_toEndOf="@+id/issueCommentDate"
|
|
||||||
android:textSize="12sp"
|
|
||||||
android:text="@string/modifiedText" />
|
|
||||||
|
|
||||||
</RelativeLayout>
|
|
||||||
|
|
||||||
<ImageView
|
|
||||||
android:id="@+id/commentsOptionsMenu"
|
|
||||||
android:layout_width="0dp"
|
|
||||||
android:layout_weight=".10"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_gravity="end"
|
|
||||||
android:scaleType="fitEnd"
|
|
||||||
android:src="@drawable/ic_dotted_menu_horizontal"
|
|
||||||
android:contentDescription="@string/menuContentDesc" />
|
|
||||||
|
|
||||||
</LinearLayout>
|
|
||||||
|
|
||||||
</LinearLayout>
|
|
||||||
|
|
||||||
</RelativeLayout>
|
|
||||||
|
|
@ -1,143 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:background="@color/backgroundColor" >
|
|
||||||
|
|
||||||
<RelativeLayout
|
|
||||||
xmlns:tools="http://schemas.android.com/tools"
|
|
||||||
android:id="@+id/linearLayoutFrame"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="match_parent"
|
|
||||||
android:layout_alignParentTop="true"
|
|
||||||
android:layout_marginTop="0dp"
|
|
||||||
android:fitsSystemWindows="true"
|
|
||||||
android:orientation="vertical"
|
|
||||||
android:padding="10dp"
|
|
||||||
android:theme="@style/AppTheme"
|
|
||||||
tools:context=".activities.MainActivity">
|
|
||||||
|
|
||||||
<ImageView
|
|
||||||
android:id="@+id/imageAvatarMy"
|
|
||||||
android:layout_width="40dp"
|
|
||||||
android:layout_height="40dp"
|
|
||||||
android:layout_marginEnd="15dp"
|
|
||||||
android:contentDescription="@string/repoContentAvatar"
|
|
||||||
android:src="@drawable/ic_android" />
|
|
||||||
|
|
||||||
<LinearLayout
|
|
||||||
android:id="@+id/infoSection"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_toEndOf="@+id/imageAvatarMy"
|
|
||||||
android:orientation="vertical">
|
|
||||||
|
|
||||||
<LinearLayout
|
|
||||||
android:id="@+id/frameRepoName"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:orientation="horizontal">
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/repoNameMy"
|
|
||||||
android:layout_width="0dp"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_weight=".95"
|
|
||||||
android:layout_marginBottom="5dp"
|
|
||||||
android:text="@string/repoName"
|
|
||||||
android:textColor="@color/white"
|
|
||||||
android:textSize="18sp" />
|
|
||||||
|
|
||||||
<ImageView
|
|
||||||
android:layout_weight=".05"
|
|
||||||
android:id="@+id/imageRepoTypeMy"
|
|
||||||
android:layout_width="10dp"
|
|
||||||
android:layout_height="18dp"
|
|
||||||
android:layout_gravity="end"
|
|
||||||
android:contentDescription="@string/privateAvatar"
|
|
||||||
android:src="@drawable/ic_lock_bold" />
|
|
||||||
|
|
||||||
</LinearLayout>
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/repoFullNameMy"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_marginBottom="5dp"
|
|
||||||
android:text="@string/repoFullname"
|
|
||||||
android:textColor="@color/colorWhite"
|
|
||||||
android:textSize="16sp" />
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/repoDescriptionMy"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_marginBottom="10dp"
|
|
||||||
android:text="@string/repoDescription"
|
|
||||||
android:textColor="@color/colorWhite"
|
|
||||||
android:textSize="16sp"
|
|
||||||
android:visibility="gone" />
|
|
||||||
|
|
||||||
<LinearLayout
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="match_parent"
|
|
||||||
android:layout_marginTop="8dp"
|
|
||||||
android:layout_marginBottom="8dp"
|
|
||||||
android:orientation="horizontal">
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/repoOpenIssuesCountMy"
|
|
||||||
android:layout_width="0dp"
|
|
||||||
android:layout_height="20dp"
|
|
||||||
android:layout_weight=".25"
|
|
||||||
android:drawableStart="@drawable/ic_issue_comments"
|
|
||||||
android:drawablePadding="6dp"
|
|
||||||
android:gravity="center_vertical"
|
|
||||||
android:layout_gravity="center_vertical"
|
|
||||||
android:text="@string/repoWatchers"
|
|
||||||
android:textColor="@color/colorWhite"
|
|
||||||
android:textSize="16sp" />
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/repoStarsMy"
|
|
||||||
android:layout_width="0dp"
|
|
||||||
android:layout_height="20dp"
|
|
||||||
android:layout_weight=".25"
|
|
||||||
android:drawableStart="@drawable/ic_star"
|
|
||||||
android:drawablePadding="6dp"
|
|
||||||
android:gravity="center_vertical"
|
|
||||||
android:layout_gravity="center_vertical"
|
|
||||||
android:text="@string/repoStars"
|
|
||||||
android:textColor="@color/colorWhite"
|
|
||||||
android:textSize="16sp" />
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/repoWatchersMy"
|
|
||||||
android:layout_width="0dp"
|
|
||||||
android:layout_height="20dp"
|
|
||||||
android:layout_weight=".25"
|
|
||||||
android:drawableStart="@drawable/ic_watchers"
|
|
||||||
android:drawablePadding="6dp"
|
|
||||||
android:gravity="center_vertical"
|
|
||||||
android:layout_gravity="center_vertical"
|
|
||||||
android:text="@string/repoWatchers"
|
|
||||||
android:textColor="@color/colorWhite"
|
|
||||||
android:textSize="16sp" />
|
|
||||||
|
|
||||||
<ImageView
|
|
||||||
android:id="@+id/reposDropdownMenu"
|
|
||||||
android:layout_width="0dp"
|
|
||||||
android:layout_weight=".10"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_gravity="end"
|
|
||||||
android:scaleType="fitEnd"
|
|
||||||
android:src="@drawable/ic_dotted_menu_horizontal"
|
|
||||||
android:contentDescription="@string/menuContentDesc" />
|
|
||||||
|
|
||||||
</LinearLayout>
|
|
||||||
|
|
||||||
</LinearLayout>
|
|
||||||
|
|
||||||
</RelativeLayout>
|
|
||||||
|
|
||||||
</RelativeLayout>
|
|
@ -1,73 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
|
||||||
android:orientation="vertical"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="200dp"
|
|
||||||
android:background="@drawable/nav_background"
|
|
||||||
android:gravity="bottom"
|
|
||||||
android:paddingTop="16dp">
|
|
||||||
|
|
||||||
<ImageView
|
|
||||||
android:id="@+id/userAvatar"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:src="@drawable/ic_android"
|
|
||||||
android:maxHeight="24dp"
|
|
||||||
android:maxWidth="24dp"
|
|
||||||
android:layout_marginTop="5dp"
|
|
||||||
android:paddingStart="20dp"
|
|
||||||
android:paddingEnd="5dp"
|
|
||||||
android:contentDescription="@string/app_name"/>
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/userFullname"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:paddingTop="10dp"
|
|
||||||
android:text="@string/app_name"
|
|
||||||
android:textSize="18sp"
|
|
||||||
android:textIsSelectable="true"
|
|
||||||
android:textColor="@color/white"
|
|
||||||
android:paddingStart="20dp"
|
|
||||||
android:paddingEnd="5dp" />
|
|
||||||
|
|
||||||
<LinearLayout
|
|
||||||
android:orientation="horizontal"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_marginTop="5dp">
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/userEmail"
|
|
||||||
android:layout_width="0dp"
|
|
||||||
android:layout_weight="0.85"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:text="@string/appEmail"
|
|
||||||
android:textSize="14sp"
|
|
||||||
android:textIsSelectable="true"
|
|
||||||
android:textColor="@color/white"
|
|
||||||
android:gravity="start"
|
|
||||||
android:layout_gravity="center_vertical"
|
|
||||||
android:paddingStart="20dp"
|
|
||||||
android:paddingEnd="5dp" />
|
|
||||||
|
|
||||||
<ImageView
|
|
||||||
android:id="@+id/navSubMenu"
|
|
||||||
android:layout_width="0dp"
|
|
||||||
android:layout_weight="0.15"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:src="@drawable/ic_dotted_menu"
|
|
||||||
android:layout_gravity="bottom"
|
|
||||||
android:scaleType="fitStart"
|
|
||||||
android:contentDescription="@string/menuContentDesc"/>
|
|
||||||
|
|
||||||
</LinearLayout>
|
|
||||||
|
|
||||||
<View
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="1dp"
|
|
||||||
android:layout_marginTop="16dp"
|
|
||||||
android:background="@color/divider" />
|
|
||||||
|
|
||||||
</LinearLayout>
|
|
||||||
|
|
@ -1,58 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
|
|
||||||
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:background="@color/backgroundColor" >
|
|
||||||
|
|
||||||
<RelativeLayout
|
|
||||||
xmlns:tools="http://schemas.android.com/tools"
|
|
||||||
android:id="@+id/linearLayoutFrame"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="match_parent"
|
|
||||||
android:layout_alignParentTop="true"
|
|
||||||
android:fitsSystemWindows="true"
|
|
||||||
android:orientation="vertical"
|
|
||||||
android:padding="10dp"
|
|
||||||
android:theme="@style/AppTheme"
|
|
||||||
tools:context=".activities.MainActivity">
|
|
||||||
|
|
||||||
<ImageView
|
|
||||||
android:id="@+id/imageAvatar"
|
|
||||||
android:layout_width="40dp"
|
|
||||||
android:layout_height="40dp"
|
|
||||||
android:layout_marginEnd="15dp"
|
|
||||||
android:src="@drawable/ic_android"
|
|
||||||
android:contentDescription="@string/orgContentAvatar"/>
|
|
||||||
|
|
||||||
<LinearLayout
|
|
||||||
android:id="@+id/infoSection"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_toEndOf="@+id/imageAvatar"
|
|
||||||
android:orientation="vertical">
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/orgUsername"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_marginBottom="5dp"
|
|
||||||
android:text="@string/orgName"
|
|
||||||
android:textColor="@color/white"
|
|
||||||
android:textSize="16sp" />
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/orgDescription"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_marginBottom="10dp"
|
|
||||||
android:text="@string/orgDescription"
|
|
||||||
android:textColor="@color/colorWhite"
|
|
||||||
android:textSize="16sp"
|
|
||||||
android:visibility="gone" />
|
|
||||||
|
|
||||||
</LinearLayout>
|
|
||||||
|
|
||||||
</RelativeLayout>
|
|
||||||
|
|
||||||
</RelativeLayout>
|
|
@ -1,46 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:paddingBottom="10dp"
|
|
||||||
android:paddingTop="10dp"
|
|
||||||
android:paddingStart="20dp"
|
|
||||||
android:paddingEnd="20dp"
|
|
||||||
android:background="@color/backgroundColor" >
|
|
||||||
|
|
||||||
<ImageView
|
|
||||||
android:id="@+id/userAvatar"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_marginEnd="15dp"
|
|
||||||
android:contentDescription="@string/generalImgContentText"
|
|
||||||
android:src="@drawable/ic_android" />
|
|
||||||
|
|
||||||
<LinearLayout
|
|
||||||
android:id="@+id/userInfoSection"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_toEndOf="@+id/userAvatar"
|
|
||||||
android:orientation="vertical">
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/userFullName"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_marginBottom="5dp"
|
|
||||||
android:text="@string/userName"
|
|
||||||
android:textColor="@color/white"
|
|
||||||
android:textSize="16sp" />
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/userName"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_marginBottom="5dp"
|
|
||||||
android:text="@string/userName"
|
|
||||||
android:textColor="@color/white"
|
|
||||||
android:textSize="16sp" />
|
|
||||||
|
|
||||||
</LinearLayout>
|
|
||||||
|
|
||||||
</RelativeLayout>
|
|
@ -1,46 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:paddingBottom="10dp"
|
|
||||||
android:paddingTop="10dp"
|
|
||||||
android:paddingStart="20dp"
|
|
||||||
android:paddingEnd="20dp"
|
|
||||||
android:background="@color/backgroundColor" >
|
|
||||||
|
|
||||||
<ImageView
|
|
||||||
android:id="@+id/userAvatar"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_marginEnd="15dp"
|
|
||||||
android:contentDescription="@string/generalImgContentText"
|
|
||||||
android:src="@drawable/ic_android" />
|
|
||||||
|
|
||||||
<LinearLayout
|
|
||||||
android:id="@+id/userInfoSection"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_toEndOf="@+id/userAvatar"
|
|
||||||
android:orientation="vertical">
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/userFullName"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_marginBottom="5dp"
|
|
||||||
android:text="@string/userName"
|
|
||||||
android:textColor="@color/white"
|
|
||||||
android:textSize="16sp" />
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/userName"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_marginBottom="5dp"
|
|
||||||
android:text="@string/userName"
|
|
||||||
android:textColor="@color/white"
|
|
||||||
android:textSize="16sp" />
|
|
||||||
|
|
||||||
</LinearLayout>
|
|
||||||
|
|
||||||
</RelativeLayout>
|
|
@ -1,143 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:background="@color/backgroundColor" >
|
|
||||||
|
|
||||||
<RelativeLayout
|
|
||||||
xmlns:tools="http://schemas.android.com/tools"
|
|
||||||
android:id="@+id/linearLayoutFrame"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="match_parent"
|
|
||||||
android:layout_alignParentTop="true"
|
|
||||||
android:layout_marginTop="0dp"
|
|
||||||
android:fitsSystemWindows="true"
|
|
||||||
android:orientation="vertical"
|
|
||||||
android:layout_margin="10dp"
|
|
||||||
android:theme="@style/AppTheme"
|
|
||||||
tools:context=".activities.MainActivity">
|
|
||||||
|
|
||||||
<ImageView
|
|
||||||
android:id="@+id/imageAvatar"
|
|
||||||
android:layout_width="40dp"
|
|
||||||
android:layout_height="40dp"
|
|
||||||
android:layout_marginEnd="15dp"
|
|
||||||
android:contentDescription="@string/repoContentAvatar"
|
|
||||||
android:src="@drawable/ic_android" />
|
|
||||||
|
|
||||||
<LinearLayout
|
|
||||||
android:id="@+id/infoSection"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_toEndOf="@+id/imageAvatar"
|
|
||||||
android:orientation="vertical">
|
|
||||||
|
|
||||||
<LinearLayout
|
|
||||||
android:id="@+id/frameRepoName"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:orientation="horizontal">
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/repoName"
|
|
||||||
android:layout_width="0dp"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_weight=".95"
|
|
||||||
android:layout_marginBottom="5dp"
|
|
||||||
android:text="@string/repoName"
|
|
||||||
android:textColor="@color/white"
|
|
||||||
android:textSize="18sp" />
|
|
||||||
|
|
||||||
<ImageView
|
|
||||||
android:layout_weight=".05"
|
|
||||||
android:id="@+id/imageRepoType"
|
|
||||||
android:layout_width="10dp"
|
|
||||||
android:layout_height="18dp"
|
|
||||||
android:layout_gravity="end"
|
|
||||||
android:contentDescription="@string/privateAvatar"
|
|
||||||
android:src="@drawable/ic_lock_24dp" />
|
|
||||||
|
|
||||||
</LinearLayout>
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/repoFullName"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_marginBottom="5dp"
|
|
||||||
android:text="@string/repoFullname"
|
|
||||||
android:textColor="@color/colorWhite"
|
|
||||||
android:textSize="16sp" />
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/repoDescription"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_marginBottom="10dp"
|
|
||||||
android:text="@string/repoDescription"
|
|
||||||
android:textColor="@color/colorWhite"
|
|
||||||
android:textSize="16sp"
|
|
||||||
android:visibility="gone" />
|
|
||||||
|
|
||||||
<LinearLayout
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="match_parent"
|
|
||||||
android:layout_marginTop="8dp"
|
|
||||||
android:layout_marginBottom="8dp"
|
|
||||||
android:orientation="horizontal">
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/repoOpenIssuesCount"
|
|
||||||
android:layout_width="0dp"
|
|
||||||
android:layout_height="20dp"
|
|
||||||
android:layout_weight=".25"
|
|
||||||
android:drawableStart="@drawable/ic_issue_comments"
|
|
||||||
android:drawablePadding="6dp"
|
|
||||||
android:gravity="center_vertical"
|
|
||||||
android:layout_gravity="center_vertical"
|
|
||||||
android:text="@string/repoWatchers"
|
|
||||||
android:textColor="@color/colorWhite"
|
|
||||||
android:textSize="14sp" />
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/repoStars"
|
|
||||||
android:layout_width="0dp"
|
|
||||||
android:layout_height="20dp"
|
|
||||||
android:layout_weight=".25"
|
|
||||||
android:drawableStart="@drawable/ic_star"
|
|
||||||
android:drawablePadding="6dp"
|
|
||||||
android:gravity="center_vertical"
|
|
||||||
android:layout_gravity="center_vertical"
|
|
||||||
android:text="@string/repoStars"
|
|
||||||
android:textColor="@color/colorWhite"
|
|
||||||
android:textSize="14sp" />
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/repoWatchers"
|
|
||||||
android:layout_width="0dp"
|
|
||||||
android:layout_height="20dp"
|
|
||||||
android:layout_weight=".25"
|
|
||||||
android:drawableStart="@drawable/ic_watchers"
|
|
||||||
android:drawablePadding="6dp"
|
|
||||||
android:gravity="center_vertical"
|
|
||||||
android:layout_gravity="center_vertical"
|
|
||||||
android:text="@string/repoWatchers"
|
|
||||||
android:textColor="@color/colorWhite"
|
|
||||||
android:textSize="14sp" />
|
|
||||||
|
|
||||||
<ImageView
|
|
||||||
android:id="@+id/reposDropdownMenu"
|
|
||||||
android:layout_width="0dp"
|
|
||||||
android:layout_weight=".10"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_gravity="end"
|
|
||||||
android:scaleType="fitEnd"
|
|
||||||
android:src="@drawable/ic_dotted_menu_horizontal"
|
|
||||||
android:contentDescription="@string/menuContentDesc" />
|
|
||||||
|
|
||||||
</LinearLayout>
|
|
||||||
|
|
||||||
</LinearLayout>
|
|
||||||
|
|
||||||
</RelativeLayout>
|
|
||||||
|
|
||||||
</RelativeLayout>
|
|
@ -1,143 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:background="@color/backgroundColor" >
|
|
||||||
|
|
||||||
<RelativeLayout
|
|
||||||
xmlns:tools="http://schemas.android.com/tools"
|
|
||||||
android:id="@+id/linearLayoutFrame"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="match_parent"
|
|
||||||
android:layout_alignParentTop="true"
|
|
||||||
android:layout_marginTop="0dp"
|
|
||||||
android:fitsSystemWindows="true"
|
|
||||||
android:orientation="vertical"
|
|
||||||
android:layout_margin="10dp"
|
|
||||||
android:theme="@style/AppTheme"
|
|
||||||
tools:context=".activities.MainActivity">
|
|
||||||
|
|
||||||
<ImageView
|
|
||||||
android:id="@+id/imageAvatar"
|
|
||||||
android:layout_width="40dp"
|
|
||||||
android:layout_height="40dp"
|
|
||||||
android:layout_marginEnd="15dp"
|
|
||||||
android:contentDescription="@string/repoContentAvatar"
|
|
||||||
android:src="@drawable/ic_android" />
|
|
||||||
|
|
||||||
<LinearLayout
|
|
||||||
android:id="@+id/infoSection"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_toEndOf="@+id/imageAvatar"
|
|
||||||
android:orientation="vertical">
|
|
||||||
|
|
||||||
<LinearLayout
|
|
||||||
android:id="@+id/frameRepoName"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:orientation="horizontal">
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/repoName"
|
|
||||||
android:layout_width="0dp"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_weight=".95"
|
|
||||||
android:layout_marginBottom="5dp"
|
|
||||||
android:text="@string/repoName"
|
|
||||||
android:textColor="@color/white"
|
|
||||||
android:textSize="18sp" />
|
|
||||||
|
|
||||||
<ImageView
|
|
||||||
android:layout_weight=".05"
|
|
||||||
android:id="@+id/imageRepoType"
|
|
||||||
android:layout_width="10dp"
|
|
||||||
android:layout_height="18dp"
|
|
||||||
android:layout_gravity="end"
|
|
||||||
android:contentDescription="@string/privateAvatar"
|
|
||||||
android:src="@drawable/ic_lock_24dp" />
|
|
||||||
|
|
||||||
</LinearLayout>
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/repoFullName"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_marginBottom="5dp"
|
|
||||||
android:text="@string/repoFullname"
|
|
||||||
android:textColor="@color/colorWhite"
|
|
||||||
android:textSize="16sp" />
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/repoDescription"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_marginBottom="10dp"
|
|
||||||
android:text="@string/repoDescription"
|
|
||||||
android:textColor="@color/colorWhite"
|
|
||||||
android:textSize="16sp"
|
|
||||||
android:visibility="gone" />
|
|
||||||
|
|
||||||
<LinearLayout
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="match_parent"
|
|
||||||
android:layout_marginTop="8dp"
|
|
||||||
android:layout_marginBottom="8dp"
|
|
||||||
android:orientation="horizontal">
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/repoOpenIssuesCount"
|
|
||||||
android:layout_width="0dp"
|
|
||||||
android:layout_height="20dp"
|
|
||||||
android:layout_weight=".25"
|
|
||||||
android:drawableStart="@drawable/ic_issue_comments"
|
|
||||||
android:drawablePadding="6dp"
|
|
||||||
android:gravity="center_vertical"
|
|
||||||
android:layout_gravity="center_vertical"
|
|
||||||
android:text="@string/repoWatchers"
|
|
||||||
android:textColor="@color/colorWhite"
|
|
||||||
android:textSize="14sp" />
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/repoStars"
|
|
||||||
android:layout_width="0dp"
|
|
||||||
android:layout_height="20dp"
|
|
||||||
android:layout_weight=".25"
|
|
||||||
android:drawableStart="@drawable/ic_star"
|
|
||||||
android:drawablePadding="6dp"
|
|
||||||
android:gravity="center_vertical"
|
|
||||||
android:layout_gravity="center_vertical"
|
|
||||||
android:text="@string/repoStars"
|
|
||||||
android:textColor="@color/colorWhite"
|
|
||||||
android:textSize="14sp" />
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/repoWatchers"
|
|
||||||
android:layout_width="0dp"
|
|
||||||
android:layout_height="20dp"
|
|
||||||
android:layout_weight=".25"
|
|
||||||
android:drawableStart="@drawable/ic_watchers"
|
|
||||||
android:drawablePadding="6dp"
|
|
||||||
android:gravity="center_vertical"
|
|
||||||
android:layout_gravity="center_vertical"
|
|
||||||
android:text="@string/repoWatchers"
|
|
||||||
android:textColor="@color/colorWhite"
|
|
||||||
android:textSize="14sp" />
|
|
||||||
|
|
||||||
<ImageView
|
|
||||||
android:id="@+id/reposDropdownMenu"
|
|
||||||
android:layout_width="0dp"
|
|
||||||
android:layout_weight=".10"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_gravity="end"
|
|
||||||
android:scaleType="fitEnd"
|
|
||||||
android:src="@drawable/ic_dotted_menu_horizontal"
|
|
||||||
android:contentDescription="@string/menuContentDesc" />
|
|
||||||
|
|
||||||
</LinearLayout>
|
|
||||||
|
|
||||||
</LinearLayout>
|
|
||||||
|
|
||||||
</RelativeLayout>
|
|
||||||
|
|
||||||
</RelativeLayout>
|
|
@ -1,143 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:background="@color/backgroundColor" >
|
|
||||||
|
|
||||||
<RelativeLayout
|
|
||||||
xmlns:tools="http://schemas.android.com/tools"
|
|
||||||
android:id="@+id/linearLayoutFrame"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="match_parent"
|
|
||||||
android:layout_alignParentTop="true"
|
|
||||||
android:layout_marginTop="0dp"
|
|
||||||
android:fitsSystemWindows="true"
|
|
||||||
android:orientation="vertical"
|
|
||||||
android:padding="10dp"
|
|
||||||
android:theme="@style/AppTheme"
|
|
||||||
tools:context=".activities.MainActivity">
|
|
||||||
|
|
||||||
<ImageView
|
|
||||||
android:id="@+id/imageAvatar"
|
|
||||||
android:layout_width="40dp"
|
|
||||||
android:layout_height="40dp"
|
|
||||||
android:layout_marginEnd="15dp"
|
|
||||||
android:contentDescription="@string/repoContentAvatar"
|
|
||||||
android:src="@drawable/ic_android" />
|
|
||||||
|
|
||||||
<LinearLayout
|
|
||||||
android:id="@+id/infoSection"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_toEndOf="@+id/imageAvatar"
|
|
||||||
android:orientation="vertical">
|
|
||||||
|
|
||||||
<LinearLayout
|
|
||||||
android:id="@+id/frameRepoName"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:orientation="horizontal">
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/repoName"
|
|
||||||
android:layout_width="0dp"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_weight=".95"
|
|
||||||
android:layout_marginBottom="5dp"
|
|
||||||
android:text="@string/repoName"
|
|
||||||
android:textColor="@color/white"
|
|
||||||
android:textSize="18sp" />
|
|
||||||
|
|
||||||
<ImageView
|
|
||||||
android:layout_weight=".05"
|
|
||||||
android:id="@+id/imageRepoType"
|
|
||||||
android:layout_width="10dp"
|
|
||||||
android:layout_height="18dp"
|
|
||||||
android:layout_gravity="end"
|
|
||||||
android:contentDescription="@string/privateAvatar"
|
|
||||||
android:src="@drawable/ic_lock_24dp" />
|
|
||||||
|
|
||||||
</LinearLayout>
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/repoFullName"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_marginBottom="5dp"
|
|
||||||
android:text="@string/repoFullname"
|
|
||||||
android:textColor="@color/colorWhite"
|
|
||||||
android:textSize="16sp" />
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/repoDescription"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_marginBottom="10dp"
|
|
||||||
android:text="@string/repoDescription"
|
|
||||||
android:textColor="@color/colorWhite"
|
|
||||||
android:textSize="16sp"
|
|
||||||
android:visibility="gone" />
|
|
||||||
|
|
||||||
<LinearLayout
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="match_parent"
|
|
||||||
android:layout_marginTop="8dp"
|
|
||||||
android:layout_marginBottom="8dp"
|
|
||||||
android:orientation="horizontal">
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/repoOpenIssuesCount"
|
|
||||||
android:layout_width="0dp"
|
|
||||||
android:layout_height="20dp"
|
|
||||||
android:layout_weight=".25"
|
|
||||||
android:drawableStart="@drawable/ic_issue_comments"
|
|
||||||
android:drawablePadding="6dp"
|
|
||||||
android:gravity="center_vertical"
|
|
||||||
android:layout_gravity="center_vertical"
|
|
||||||
android:text="@string/repoWatchers"
|
|
||||||
android:textColor="@color/colorWhite"
|
|
||||||
android:textSize="14sp" />
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/repoStars"
|
|
||||||
android:layout_width="0dp"
|
|
||||||
android:layout_height="20dp"
|
|
||||||
android:layout_weight=".25"
|
|
||||||
android:drawableStart="@drawable/ic_star"
|
|
||||||
android:drawablePadding="6dp"
|
|
||||||
android:gravity="center_vertical"
|
|
||||||
android:layout_gravity="center_vertical"
|
|
||||||
android:text="@string/repoStars"
|
|
||||||
android:textColor="@color/colorWhite"
|
|
||||||
android:textSize="14sp" />
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/repoWatchers"
|
|
||||||
android:layout_width="0dp"
|
|
||||||
android:layout_height="20dp"
|
|
||||||
android:layout_weight=".25"
|
|
||||||
android:drawableStart="@drawable/ic_watchers"
|
|
||||||
android:drawablePadding="6dp"
|
|
||||||
android:gravity="center_vertical"
|
|
||||||
android:layout_gravity="center_vertical"
|
|
||||||
android:text="@string/repoWatchers"
|
|
||||||
android:textColor="@color/colorWhite"
|
|
||||||
android:textSize="14sp" />
|
|
||||||
|
|
||||||
<ImageView
|
|
||||||
android:id="@+id/reposDropdownMenu"
|
|
||||||
android:layout_width="0dp"
|
|
||||||
android:layout_weight=".10"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_gravity="end"
|
|
||||||
android:scaleType="fitEnd"
|
|
||||||
android:src="@drawable/ic_dotted_menu_horizontal"
|
|
||||||
android:contentDescription="@string/menuContentDesc" />
|
|
||||||
|
|
||||||
</LinearLayout>
|
|
||||||
|
|
||||||
</LinearLayout>
|
|
||||||
|
|
||||||
</RelativeLayout>
|
|
||||||
|
|
||||||
</RelativeLayout>
|
|
Loading…
Reference in New Issue
Block a user